1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-25 04:02:41 +01:00

[SystemZ][z/OS][Windows] Add new functions that set Text/Binary mode for Stdin and Stdout based on OpenFlags

On Windows, we want to open a file in Binary mode if OF_CRLF bit is not set. On z/OS, we want to open a file in Binary mode if the OF_Text bit is not set.

This patch creates two new functions called ChangeStdinMode and ChangeStdoutMode which will take OpenFlags as an arg to determine which mode to set stdin and stdout to. This will enable patches like https://reviews.llvm.org/D100056 to not affect Windows when setting the OF_Text flag for raw_fd_streams.

Reviewed By: rnk

Differential Revision: https://reviews.llvm.org/D100130
This commit is contained in:
Abhina Sreeskantharajan 2021-04-16 08:06:35 -04:00
parent 8886d90737
commit eda191ef72
5 changed files with 34 additions and 5 deletions

View File

@ -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 <chrono>
#include <system_error>
@ -77,6 +78,12 @@ namespace sys {
ErrorOr<std::string>
findProgramByName(StringRef Name, ArrayRef<StringRef> 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.

View File

@ -512,7 +512,7 @@ ErrorOr<std::unique_ptr<MemoryBuffer>> MemoryBuffer::getSTDIN() {
//
// 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(), "<stdin>");
}

View File

@ -493,6 +493,18 @@ ProcessInfo llvm::sys::Wait(const ProcessInfo &PI, unsigned SecondsToWait,
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();

View File

@ -488,6 +488,18 @@ ProcessInfo sys::Wait(const ProcessInfo &PI, unsigned SecondsToWait,
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)

View File

@ -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;
}