diff --git a/llvm/include/llvm/Support/Program.h b/llvm/include/llvm/Support/Program.h --- a/llvm/include/llvm/Support/Program.h +++ b/llvm/include/llvm/Support/Program.h @@ -19,6 +19,7 @@ #include "llvm/ADT/StringRef.h" #include "llvm/Config/llvm-config.h" #include "llvm/Support/ErrorOr.h" +#include "llvm/Support/FileSystem.h" #include #include @@ -77,6 +78,12 @@ ErrorOr findProgramByName(StringRef Name, ArrayRef Paths = {}); + // These functions change the specified standard stream (stdin or stdout) mode + // based on the Flags. They return errc::success if the specified stream was + // changed. Otherwise, a platform dependent error is returned. + std::error_code ChangeStdinMode(fs::OpenFlags Flags); + std::error_code ChangeStdoutMode(fs::OpenFlags Flags); + // These functions change the specified standard stream (stdin or stdout) to // binary mode. They return errc::success if the specified stream // was changed. Otherwise a platform dependent error is returned. diff --git a/llvm/lib/Support/MemoryBuffer.cpp b/llvm/lib/Support/MemoryBuffer.cpp --- a/llvm/lib/Support/MemoryBuffer.cpp +++ b/llvm/lib/Support/MemoryBuffer.cpp @@ -512,7 +512,7 @@ // // FIXME: That isn't necessarily true, we should try to mmap stdin and // fallback if it fails. - sys::ChangeStdinToBinary(); + sys::ChangeStdinMode(sys::fs::OF_Text); return getMemoryBufferForStream(sys::fs::getStdinHandle(), ""); } diff --git a/llvm/lib/Support/Unix/Program.inc b/llvm/lib/Support/Unix/Program.inc --- a/llvm/lib/Support/Unix/Program.inc +++ b/llvm/lib/Support/Unix/Program.inc @@ -493,6 +493,18 @@ return WaitResult; } +std::error_code llvm::sys::ChangeStdinMode(fs::OpenFlags Flags){ + if (!(Flags & fs::OF_Text)) + return ChangeStdinToBinary(); + return std::error_code(); +} + +std::error_code llvm::sys::ChangeStdoutMode(fs::OpenFlags Flags){ + if (!(Flags & fs::OF_Text)) + return ChangeStdoutToBinary(); + return std::error_code(); +} + std::error_code llvm::sys::ChangeStdinToBinary() { // Do nothing, as Unix doesn't differentiate between text and binary. return std::error_code(); diff --git a/llvm/lib/Support/Windows/Program.inc b/llvm/lib/Support/Windows/Program.inc --- a/llvm/lib/Support/Windows/Program.inc +++ b/llvm/lib/Support/Windows/Program.inc @@ -488,6 +488,18 @@ return WaitResult; } +std::error_code llvm::sys::ChangeStdinMode(sys::fs::OpenFlags Flags){ + if (!(Flags & fs::OF_CRLF)) + return ChangeStdinToBinary(); + return std::error_code(); +} + +std::error_code llvm::sys::ChangeStdoutMode(sys::fs::OpenFlags Flags){ + if (!(Flags & fs::OF_CRLF)) + return ChangeStdoutToBinary(); + return std::error_code(); +} + std::error_code sys::ChangeStdinToBinary() { int result = _setmode(_fileno(stdin), _O_BINARY); if (result == -1) diff --git a/llvm/lib/Support/raw_ostream.cpp b/llvm/lib/Support/raw_ostream.cpp --- a/llvm/lib/Support/raw_ostream.cpp +++ b/llvm/lib/Support/raw_ostream.cpp @@ -574,10 +574,8 @@ // 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; }