diff --git a/clang/test/CodeGen/SystemZ/encoding.c b/clang/test/CodeGen/SystemZ/encoding.c new file mode 100644 index 0000000000000..d018a9c37852a --- /dev/null +++ b/clang/test/CodeGen/SystemZ/encoding.c @@ -0,0 +1,9 @@ +// Checks encoding of output file +// This is only required for z/OS. +// +// REQUIRES: system-zos, systemz-registered-target +// RUN: %clang_cc1 -triple s390x-ibm-zos -S %s -o %t.s +// RUN: ls -T %t.s | FileCheck %s + +// CHECK: t IBM-1047 T=on +void foo() { return; } diff --git a/llvm/lib/Support/VirtualOutputBackends.cpp b/llvm/lib/Support/VirtualOutputBackends.cpp index de59b8ab63a53..f9c8f1302e6c5 100644 --- a/llvm/lib/Support/VirtualOutputBackends.cpp +++ b/llvm/lib/Support/VirtualOutputBackends.cpp @@ -254,6 +254,20 @@ static Error createDirectoriesOnDemand(StringRef OutputPath, }); } +static sys::fs::OpenFlags generateFlagsFromConfig(OutputConfig Config) { + sys::fs::OpenFlags OF = sys::fs::OF_None; + if (Config.getTextWithCRLF()) + OF |= sys::fs::OF_TextWithCRLF; + else if (Config.getText()) + OF |= sys::fs::OF_Text; + // Don't pass OF_Append if writting to temporary since OF_Append is + // not Atomic Append + if (Config.getAppend() && !Config.getAtomicWrite()) + OF |= sys::fs::OF_Append; + + return OF; +} + Error OnDiskOutputFile::tryToCreateTemporary(std::optional &FD) { // Create a temporary file. // Insert -%%%%%%%% before the extension (if any), and because some tools @@ -269,8 +283,9 @@ Error OnDiskOutputFile::tryToCreateTemporary(std::optional &FD) { return createDirectoriesOnDemand(OutputPath, Config, [&]() -> Error { int NewFD; SmallString<128> UniquePath; + sys::fs::OpenFlags OF = generateFlagsFromConfig(Config); if (std::error_code EC = - sys::fs::createUniqueFile(ModelPath, NewFD, UniquePath)) + sys::fs::createUniqueFile(ModelPath, NewFD, UniquePath, OF)) return make_error(ModelPath, OutputPath, EC); if (Config.getDiscardOnSignal()) @@ -312,13 +327,7 @@ Error OnDiskOutputFile::initializeFile(std::optional &FD) { // Not using a temporary file. Open the final output file. return createDirectoriesOnDemand(OutputPath, Config, [&]() -> Error { int NewFD; - sys::fs::OpenFlags OF = sys::fs::OF_None; - if (Config.getTextWithCRLF()) - OF |= sys::fs::OF_TextWithCRLF; - else if (Config.getText()) - OF |= sys::fs::OF_Text; - if (Config.getAppend()) - OF |= sys::fs::OF_Append; + sys::fs::OpenFlags OF = generateFlagsFromConfig(Config); if (std::error_code EC = sys::fs::openFileForWrite( OutputPath, NewFD, sys::fs::CD_CreateAlways, OF)) return convertToOutputError(OutputPath, EC);