aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Support/raw_ostream.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Support/raw_ostream.cpp')
-rw-r--r--llvm/lib/Support/raw_ostream.cpp34
1 files changed, 30 insertions, 4 deletions
diff --git a/llvm/lib/Support/raw_ostream.cpp b/llvm/lib/Support/raw_ostream.cpp
index 8f10d136bc38..d4e1c884d125 100644
--- a/llvm/lib/Support/raw_ostream.cpp
+++ b/llvm/lib/Support/raw_ostream.cpp
@@ -574,10 +574,8 @@ static int getFD(StringRef Filename, std::error_code &EC,
// the owner of stdout and may set the "binary" flag globally based on Flags.
if (Filename == "-") {
EC = std::error_code();
- // If user requested binary then put stdout into binary mode if
- // possible.
- if (!(Flags & sys::fs::OF_Text))
- sys::ChangeStdoutToBinary();
+ // Change stdout's text/binary mode based on the Flags.
+ sys::ChangeStdoutMode(Flags);
return STDOUT_FILENO;
}
@@ -989,3 +987,31 @@ void raw_pwrite_stream::anchor() {}
void buffer_ostream::anchor() {}
void buffer_unique_ostream::anchor() {}
+
+Error llvm::writeToOutput(StringRef OutputFileName,
+ std::function<Error(raw_ostream &)> Write) {
+ if (OutputFileName == "-")
+ return Write(outs());
+
+ if (OutputFileName == "/dev/null") {
+ raw_null_ostream Out;
+ return Write(Out);
+ }
+
+ unsigned Mode = sys::fs::all_read | sys::fs::all_write | sys::fs::all_exe;
+ Expected<sys::fs::TempFile> Temp =
+ sys::fs::TempFile::create(OutputFileName + ".temp-stream-%%%%%%", Mode);
+ if (!Temp)
+ return createFileError(OutputFileName, Temp.takeError());
+
+ raw_fd_ostream Out(Temp->FD, false);
+
+ if (Error E = Write(Out)) {
+ if (Error DiscardError = Temp->discard())
+ return joinErrors(std::move(E), std::move(DiscardError));
+ return E;
+ }
+ Out.flush();
+
+ return Temp->keep(OutputFileName);
+}