Index: clang/include/clang/Driver/Options.td =================================================================== --- clang/include/clang/Driver/Options.td +++ clang/include/clang/Driver/Options.td @@ -3704,6 +3704,8 @@ MarshallingInfoInt, "4096">; def mstack_arg_probe : Flag<["-"], "mstack-arg-probe">, Group, HelpText<"Enable stack probes">; +def mzos_sys_include_EQ : Joined<["-"], "mzos-sys-include=">, Flags<[NoXarchOption]>, MetaVarName<"">, + HelpText<"Path to system headers on z/OS">; def mno_stack_arg_probe : Flag<["-"], "mno-stack-arg-probe">, Group, Flags<[CC1Option]>, HelpText<"Disable stack probes which are enabled by default">, MarshallingInfoFlag>; Index: clang/lib/Basic/Targets/OSTargets.h =================================================================== --- clang/lib/Basic/Targets/OSTargets.h +++ clang/lib/Basic/Targets/OSTargets.h @@ -771,13 +771,11 @@ MacroBuilder &Builder) const override { // FIXME: _LONG_LONG should not be defined under -std=c89. Builder.defineMacro("_LONG_LONG"); - Builder.defineMacro("_OPEN_DEFAULT"); - // _UNIX03_WITHDRAWN is required to build libcxx. - Builder.defineMacro("_UNIX03_WITHDRAWN"); Builder.defineMacro("__370__"); Builder.defineMacro("__BFP__"); // FIXME: __BOOL__ should not be defined under -std=c89. Builder.defineMacro("__BOOL__"); + Builder.defineMacro("__COMPILER_VER__","0x50000000"); Builder.defineMacro("__LONGNAME__"); Builder.defineMacro("__MVS__"); Builder.defineMacro("__THW_370__"); @@ -789,17 +787,6 @@ if (this->PointerWidth == 64) Builder.defineMacro("__64BIT__"); - if (Opts.CPlusPlus) { - Builder.defineMacro("__DLL__"); - // _XOPEN_SOURCE=600 is required to build libcxx. - Builder.defineMacro("_XOPEN_SOURCE", "600"); - } - - if (Opts.GNUMode) { - Builder.defineMacro("_MI_BUILTIN"); - Builder.defineMacro("_EXT"); - } - if (Opts.CPlusPlus && Opts.WChar) { // Macro __wchar_t is defined so that the wchar_t data // type is not declared as a typedef in system headers. @@ -818,6 +805,7 @@ this->UseZeroLengthBitfieldAlignment = true; this->UseLeadingZeroLengthBitfield = false; this->ZeroLengthBitfieldBoundary = 32; + this->TheCXXABI.set(TargetCXXABI::XL); } bool areDefaultedSMFStillPOD(const LangOptions &) const override { Index: clang/lib/Basic/Targets/SystemZ.h =================================================================== --- clang/lib/Basic/Targets/SystemZ.h +++ clang/lib/Basic/Targets/SystemZ.h @@ -36,7 +36,6 @@ HasTransactionalExecution(false), HasVector(false), SoftFloat(false) { IntMaxType = SignedLong; Int64Type = SignedLong; - TLSSupported = true; IntWidth = IntAlign = 32; LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64; Int128Align = 64; @@ -47,16 +46,20 @@ DefaultAlignForAttributeAligned = 64; MinGlobalAlign = 16; if (Triple.isOSzOS()) { + TLSSupported = false; // All vector types are default aligned on an 8-byte boundary, even if the // vector facility is not available. That is different from Linux. MaxVectorAlign = 64; - // Compared to Linux/ELF, the data layout differs only in that name - // mangling is GOFF. - resetDataLayout( - "E-m:l-i1:8:16-i8:8:16-i64:64-f128:64-v128:64-a:8:16-n32:64"); - } else + // Compared to Linux/ELF, the data layout differs only in some details: + // - name mangling is GOFF. + + resetDataLayout("E-m:l-i1:8:16-i8:8:16-i64:64-f128:64-v128:64-" + "a:8:16-n32:64"); + } else { + TLSSupported = true; resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64" "-v128:64-a:8:16-n32:64"); + } MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64; HasStrictFP = true; } Index: clang/lib/Driver/ToolChains/Clang.cpp =================================================================== --- clang/lib/Driver/ToolChains/Clang.cpp +++ clang/lib/Driver/ToolChains/Clang.cpp @@ -3924,7 +3924,8 @@ else CmdArgs.push_back("-fsigned-wchar"); } - } + } else if (T.isOSzOS()) + CmdArgs.push_back("-fno-signed-wchar"); } static void RenderObjCOptions(const ToolChain &TC, const Driver &D, @@ -5147,6 +5148,37 @@ Twine(std::min(Value, 65536u)))); } + if (Triple.isOSzOS()) { + // On z/OS some of the system header feature macros need to + // be defined to enable most cross platform projects to build + // successfully. Ths include the libc++ library. A + // complicating factor is that users can define these + // macros to the same or different values. We need to add + // the definition for these macros to the compilation command + // if the user hasn't already defined them. + + auto findMacroDefinition = [&](const std::string &Macro) { + auto MacroDefs = Args.getAllArgValues(options::OPT_D); + return std::find_if(MacroDefs.begin(), MacroDefs.end(), + [&](const std::string &M) { + return M == Macro || + M.find(Macro + '=') != std::string::npos; + }) != MacroDefs.end(); + }; + + // _UNIX03_WITHDRAWN is required for libcxx & porting. + if (!findMacroDefinition("_UNIX03_WITHDRAWN")) + CmdArgs.push_back("-D_UNIX03_WITHDRAWN"); + // _OPEN_DEFAULT is required for XL compat + if (!findMacroDefinition("_OPEN_DEFAULT")) + CmdArgs.push_back("-D_OPEN_DEFAULT"); + if (D.CCCIsCXX() || types::isCXX(Input.getType())) { + // _XOPEN_SOURCE=600 is required for libcxx. + if (!findMacroDefinition("_XOPEN_SOURCE")) + CmdArgs.push_back("-D_XOPEN_SOURCE=600"); + } + } + llvm::Reloc::Model RelocationModel; unsigned PICLevel; bool IsPIE; Index: clang/lib/Driver/ToolChains/ZOS.h =================================================================== --- clang/lib/Driver/ToolChains/ZOS.h +++ clang/lib/Driver/ToolChains/ZOS.h @@ -30,7 +30,19 @@ bool IsIntegratedAssemblerDefault() const override { return true; } + void TryAddIncludeFromPath(llvm::SmallString<128> Path, + const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const; + void + AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const override; + + void AddClangCXXStdlibIncludeArgs( + const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const override; + unsigned GetDefaultDwarfVersion() const override { return 4; } + CXXStdlibType GetDefaultCXXStdlibType() const override; void addClangTargetOptions( const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, Index: clang/lib/Driver/ToolChains/ZOS.cpp =================================================================== --- clang/lib/Driver/ToolChains/ZOS.cpp +++ clang/lib/Driver/ToolChains/ZOS.cpp @@ -11,17 +11,26 @@ #include "clang/Driver/Compilation.h" #include "clang/Driver/Options.h" #include "llvm/Option/ArgList.h" +#include "llvm/Support/FileSystem.h" +#include "llvm/Support/VirtualFileSystem.h" +#include "llvm/Support/WithColor.h" +using namespace clang; using namespace clang::driver; using namespace clang::driver::toolchains; +using namespace llvm; using namespace llvm::opt; -using namespace clang; +using namespace llvm::sys; ZOS::ZOS(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) : ToolChain(D, Triple, Args) {} ZOS::~ZOS() {} +ToolChain::CXXStdlibType ZOS::GetDefaultCXXStdlibType() const { + return ToolChain::CST_Libcxx; +} + void ZOS::addClangTargetOptions(const ArgList &DriverArgs, ArgStringList &CC1Args, Action::OffloadKind DeviceOffloadKind) const { @@ -31,3 +40,97 @@ options::OPT_fno_aligned_allocation)) CC1Args.push_back("-faligned-alloc-unavailable"); } + +void ZOS::AddClangSystemIncludeArgs(const ArgList &DriverArgs, + ArgStringList &CC1Args) const { + if (DriverArgs.hasArg(options::OPT_nostdinc)) + return; + + const Driver &D = getDriver(); + + // resolve ResourceDir + std::string ResourceDir(D.ResourceDir); + + // zos_wrappers must take highest precedence + + // - /lib/clang//include/zos_wrappers + if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) { + SmallString<128> P(ResourceDir); + path::append(P, "include", "zos_wrappers"); + addSystemInclude(DriverArgs, CC1Args, P.str()); + + // - /lib/clang//include + SmallString<128> P2(ResourceDir); + path::append(P2, "include"); + addSystemInclude(DriverArgs, CC1Args, P2.str()); + } + + // - /usr/include + if (Arg *SysIncludeArg = + DriverArgs.getLastArg(options::OPT_mzos_sys_include_EQ)) { + StringRef SysInclude = SysIncludeArg->getValue(); + + // fall back to the default include path + if (!SysInclude.empty()) { + + // -mzos-sys-include opton can have colon separated + // list of paths, so we need to parse the value. + StringRef PathLE(SysInclude); + size_t Colon = PathLE.find(':'); + if (Colon == StringRef::npos) { + addSystemInclude(DriverArgs, CC1Args, PathLE.str()); + return; + } + + while (Colon != StringRef::npos) { + SmallString<128> P = PathLE.substr(0, Colon); + addSystemInclude(DriverArgs, CC1Args, P.str()); + PathLE = PathLE.substr(Colon + 1); + Colon = PathLE.find(':'); + } + if (PathLE.size()) + addSystemInclude(DriverArgs, CC1Args, PathLE.str()); + + return; + } + } + + addSystemInclude(DriverArgs, CC1Args, "/usr/include"); +} + +void ZOS::TryAddIncludeFromPath(llvm::SmallString<128> Path, + const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const { + if (!getVFS().exists(Path)) { + if (DriverArgs.hasArg(options::OPT_v)) + WithColor::warning(errs(), "Clang") + << "ignoring nonexistent directory \"" << Path << "\"\n"; + if (!DriverArgs.hasArg(options::OPT__HASH_HASH_HASH)) + return; + } + addSystemInclude(DriverArgs, CC1Args, Path); +} + +void ZOS::AddClangCXXStdlibIncludeArgs( + const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const { + if (DriverArgs.hasArg(options::OPT_nostdinc) || + DriverArgs.hasArg(options::OPT_nostdincxx) || + DriverArgs.hasArg(options::OPT_nostdlibinc)) + return; + + switch (GetCXXStdlibType(DriverArgs)) { + case ToolChain::CST_Libcxx: { + // /bin/../include/c++/v1 + llvm::SmallString<128> InstallBin = + llvm::StringRef(getDriver().getInstalledDir()); + llvm::sys::path::append(InstallBin, "..", "include", "c++", "v1"); + TryAddIncludeFromPath(InstallBin, DriverArgs, CC1Args); + break; + } + case ToolChain::CST_Libstdcxx: + llvm::report_fatal_error( + "picking up libstdc++ headers is unimplemented on z/OS"); + break; + } +} Index: clang/test/Driver/zos-comp-cxx.cpp =================================================================== --- /dev/null +++ clang/test/Driver/zos-comp-cxx.cpp @@ -0,0 +1,100 @@ +// Tests that the z/OS toolchain adds system includes to its search path. + +// RUN: %clangxx -c -### %s 2>&1 \ +// RUN: --target=s390x-ibm-zos \ +// RUN: | FileCheck %s + +// CHECK: "-D_UNIX03_WITHDRAWN" +// CHECK: "-D_OPEN_DEFAULT" +// CHECK: "-D_XOPEN_SOURCE=600" +// CHECK: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]" +// CHECK: "-internal-isystem" "{{.*}}/bin/../include/c++/v1" +// CHECK: "-internal-isystem" "[[RESOURCE_DIR]]{{(/|\\\\)}}include{{(/|\\\\)}}zos_wrappers" +// CHECK: "-internal-isystem" "[[RESOURCE_DIR]]{{(/|\\\\)}}include" +// CHECK: "-internal-isystem" "/usr/include" +// CHECK: "-fshort-enums" +// CHECK: "-fno-signed-char" +// CHECK: "-fno-signed-wchar" + +// RUN: %clangxx -c -### -mzos-sys-include=/ABC/DEF %s 2>&1 \ +// RUN: --target=s390x-ibm-zos \ +// RUN: | FileCheck --check-prefixes=CHECK2 %s + +// CHECK2: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]" +// CHECK2: "-internal-isystem" "{{.*}}/bin/../include/c++/v1" +// CHECK2: "-internal-isystem" "[[RESOURCE_DIR]]{{(/|\\\\)}}include{{(/|\\\\)}}zos_wrappers" +// CHECK2: "-internal-isystem" "[[RESOURCE_DIR]]{{(/|\\\\)}}include" +// CHECK2: "-internal-isystem" "/ABC/DEF" +// CHECK2-NOT: "-internal-isystem" "/usr/include" +// CHECK2: "-fshort-enums" +// CHECK2: "-fno-signed-char" +// CHECK2: "-fno-signed-wchar" + +// RUN: %clangxx -c -### -nostdinc %s 2>&1 \ +// RUN: --target=s390x-ibm-zos \ +// RUN: | FileCheck --check-prefixes=CHECK3 %s + +// CHECK3: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]" +// CHECK3-NOT: "-internal-isystem" "{{.*}}/bin/../include/c++/v1" +// CHECK3-NOT: "-internal-isystem" "[[RESOURCE_DIR]]{{(/|\\\\)}}include{{(/|\\\\)}}zos_wrappers" +// CHECK3-NOT: "-internal-isystem" "[[RESOURCE_DIR]]{{(/|\\\\)}}include" +// CHECK3-NOT: "-internal-isystem" "/usr/include" +// CHECK3: "-fshort-enums" +// CHECK3: "-fno-signed-char" +// CHECK3: "-fno-signed-wchar" + +// RUN: %clangxx -c -### -nostdinc++ %s 2>&1 \ +// RUN: --target=s390x-ibm-zos \ +// RUN: | FileCheck --check-prefixes=CHECK4 %s + +// CHECK4: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]" +// CHECK4-NOT: "-internal-isystem" "{{.*}}/bin/../include/c++/v1" +// CHECK4: "-internal-isystem" "[[RESOURCE_DIR]]{{(/|\\\\)}}include{{(/|\\\\)}}zos_wrappers" +// CHECK4: "-internal-isystem" "[[RESOURCE_DIR]]{{(/|\\\\)}}include" +// CHECK4: "-internal-isystem" "/usr/include" +// CHECK4: "-fshort-enums" +// CHECK4: "-fno-signed-char" +// CHECK4: "-fno-signed-wchar" + +// RUN: %clangxx -c -### -nostdlibinc %s 2>&1 \ +// RUN: --target=s390x-ibm-zos \ +// RUN: | FileCheck --check-prefixes=CHECK5 %s + +// CHECK5: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]" +// CHECK5-NOT: "-internal-isystem" "{{.*}}/bin/../include/c++/v1" +// CHECK5: "-internal-isystem" "[[RESOURCE_DIR]]{{(/|\\\\)}}include{{(/|\\\\)}}zos_wrappers" +// CHECK5: "-internal-isystem" "[[RESOURCE_DIR]]{{(/|\\\\)}}include" +// CHECK5: "-internal-isystem" "/usr/include" +// CHECK5: "-fshort-enums" +// CHECK5: "-fno-signed-char" +// CHECK5: "-fno-signed-wchar" + +// RUN: %clangxx -c -### -nobuiltininc %s 2>&1 \ +// RUN: --target=s390x-ibm-zos \ +// RUN: | FileCheck --check-prefixes=CHECK6 %s + +// CHECK6: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]" +// CHECK6: "-internal-isystem" "{{.*}}/bin/../include/c++/v1" +// CHECK6-NOT: "-internal-isystem" "[[RESOURCE_DIR]]{{(/|\\\\)}}include{{(/|\\\\)}}zos_wrappers" +// CHECK6-NOT: "-internal-isystem" "[[RESOURCE_DIR]]{{(/|\\\\)}}include" +// CHECK6: "-internal-isystem" "/usr/include" +// CHECK6: "-fshort-enums" +// CHECK6: "-fno-signed-char" +// CHECK6: "-fno-signed-wchar" + +// RUN: %clangxx -c -### -D_XOPEN_SOURCE=700 %s 2>&1 \ +// RUN: --target=s390x-ibm-zos \ +// RUN: | FileCheck --check-prefixes=CHECK7 %s + +// CHECK7: "-D_UNIX03_WITHDRAWN" +// CHECK7: "-D_OPEN_DEFAULT" +// CHECK7-NOT: "-D_XOPEN_SOURCE=600" +// CHECK7: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]" +// CHECK7: "-D" "_XOPEN_SOURCE=700" +// CHECK7: "-internal-isystem" "{{.*}}/bin/../include/c++/v1" +// CHECK7: "-internal-isystem" "[[RESOURCE_DIR]]{{(/|\\\\)}}include{{(/|\\\\)}}zos_wrappers" +// CHECK7: "-internal-isystem" "[[RESOURCE_DIR]]{{(/|\\\\)}}include" +// CHECK7: "-internal-isystem" "/usr/include" +// CHECK7: "-fshort-enums" +// CHECK7: "-fno-signed-char" +// CHECK7: "-fno-signed-wchar" Index: clang/test/Driver/zos-comp.c =================================================================== --- /dev/null +++ clang/test/Driver/zos-comp.c @@ -0,0 +1,76 @@ +// Tests that the z/OS toolchain adds system includes to its search path. + +// RUN: %clang -c -### %s 2>&1 \ +// RUN: --target=s390x-ibm-zos \ +// RUN: | FileCheck %s + +// CHECK: "-D_UNIX03_WITHDRAWN" +// CHECK: "-D_OPEN_DEFAULT" +// CHECK: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]" +// CHECK: "-internal-isystem" "[[RESOURCE_DIR]]{{(/|\\\\)}}include{{(/|\\\\)}}zos_wrappers" +// CHECK: "-internal-isystem" "[[RESOURCE_DIR]]{{(/|\\\\)}}include" +// CHECK: "-internal-isystem" "/usr/include" +// CHECK: "-fshort-enums" +// CHECK: "-fno-signed-char" +// CHECK: "-fno-signed-wchar" + +// RUN: %clang -c -### -mzos-sys-include=/ABC/DEF %s 2>&1 \ +// RUN: --target=s390x-ibm-zos \ +// RUN: | FileCheck --check-prefixes=CHECK2 %s + +// CHECK2: "-D_UNIX03_WITHDRAWN" +// CHECK2: "-D_OPEN_DEFAULT" +// CHECK2: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]" +// CHECK2: "-internal-isystem" "[[RESOURCE_DIR]]{{(/|\\\\)}}include{{(/|\\\\)}}zos_wrappers" +// CHECK2: "-internal-isystem" "[[RESOURCE_DIR]]{{(/|\\\\)}}include" +// CHECK2: "-internal-isystem" "/ABC/DEF" +// CHECK2-NOT: "-internal-isystem" "/usr/include" +// CHECK2: "-fshort-enums" +// CHECK2: "-fno-signed-char" +// CHECK2: "-fno-signed-wchar" + +// RUN: %clang -c -### -mzos-sys-include=/ABC/DEF:/ghi/jkl %s 2>&1 \ +// RUN: --target=s390x-ibm-zos \ +// RUN: | FileCheck --check-prefixes=CHECK3 %s + +// CHECK3: "-D_UNIX03_WITHDRAWN" +// CHECK3: "-D_OPEN_DEFAULT" +// CHECK3: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]" +// CHECK3: "-internal-isystem" "[[RESOURCE_DIR]]{{(/|\\\\)}}include{{(/|\\\\)}}zos_wrappers" +// CHECK3: "-internal-isystem" "[[RESOURCE_DIR]]{{(/|\\\\)}}include" +// CHECK3: "-internal-isystem" "/ABC/DEF" +// CHECK3: "-internal-isystem" "/ghi/jkl" +// CHECK3-NOT: "-internal-isystem" "/usr/include" +// CHECK3: "-fshort-enums" +// CHECK3: "-fno-signed-char" +// CHECK3: "-fno-signed-wchar" + +// RUN: %clang -c -### -nostdinc %s 2>&1 \ +// RUN: --target=s390x-ibm-zos \ +// RUN: | FileCheck --check-prefixes=CHECK4 %s + +// CHECK4: "-D_UNIX03_WITHDRAWN" +// CHECK4: "-D_OPEN_DEFAULT" +// CHECK4: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]" +// CHECK4-NOT: "-internal-isystem" "[[RESOURCE_DIR]]{{(/|\\\\)}}include{{(/|\\\\)}}zos_wrappers" +// CHECK4-NOT: "-internal-isystem" "[[RESOURCE_DIR]]{{(/|\\\\)}}include" +// CHECK4-NOT: "-internal-isystem" "/usr/include" +// CHECK4: "-fshort-enums" +// CHECK4: "-fno-signed-char" +// CHECK4: "-fno-signed-wchar" + + +// RUN: %clang -c -### -nobuiltininc %s 2>&1 \ +// RUN: --target=s390x-ibm-zos \ +// RUN: | FileCheck --check-prefixes=CHECK5 %s + +// CHECK5: "-D_UNIX03_WITHDRAWN" +// CHECK5: "-D_OPEN_DEFAULT" +// CHECK5: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]" +// CHECK5-NOT: "-internal-isystem" "[[RESOURCE_DIR]]{{(/|\\\\)}}include{{(/|\\\\)}}zos_wrappers" +// CHECK5-NOT: "-internal-isystem" "[[RESOURCE_DIR]]{{(/|\\\\)}}include" +// CHECK5: "-internal-isystem" "/usr/include" +// CHECK5: "-fshort-enums" +// CHECK5: "-fno-signed-char" +// CHECK5: "-fno-signed-wchar" + Index: clang/test/Driver/zos-driver-defaults.c =================================================================== --- clang/test/Driver/zos-driver-defaults.c +++ clang/test/Driver/zos-driver-defaults.c @@ -1,8 +1,21 @@ -// RUN: %clang -### --target=s390x-none-zos -fsyntax-only %s 2>&1 | FileCheck --check-prefix=CHECK-SHORT-ENUMS %s +// RUN: %clang -### --target=s390x-none-zos -fsyntax-only %s 2>&1 | FileCheck --check-prefixes=CHECK-C-MACRO,CHECK-SHORT-ENUMS %s +// RUN: %clang -### --target=s390x-none-zos -fsyntax-only %s 2>&1 | FileCheck --check-prefix=CHECK-ZOS-INCLUDES %s // RUN: %clang -### --target=s390x-none-zos -fno-short-enums -fsyntax-only %s 2>&1 | FileCheck %s +// RUN: %clangxx -### --target=s390x-none-zos -fsyntax-only %s 2>&1 | FileCheck --check-prefixes=CHECK-C-MACRO,CHECK-CXX-MACRO %s +// RUN: %clang -### --target=s390x-none-zos -x c++ -fsyntax-only %s 2>&1 | FileCheck --check-prefixes=CHECK-C-MACRO,CHECK-CXX-MACRO %s + +//CHECK-C-MACRO: -D_UNIX03_WITHDRAWN +//CHECK-C-MACRO: -D_OPEN_DEFAULT + +//CHECK-CXX-MACRO: -D_XOPEN_SOURCE=600 +//CHECK-USER-CXX-MACRO-NOT: -D_XOPEN_SOURCE=600 +//CHECK-USER-CXX-MACRO: "-D" "_XOPEN_SOURCE=700" //CHECK-SHORT-ENUMS: -fshort-enums //CHECK-SHORT-ENUMS: -fno-signed-char +//CHECK-ZOS-INCLUDES: clang{{.*}} "-cc1" "-triple" "s390x-none-zos" +//CHECK-ZOS-INCLUDES-SAME: "-internal-isystem" {{".+/lib/clang/.+/include/zos_wrappers"}} "-internal-isystem" {{".+/lib/clang/.+/include"}} + //CHECK-NOT: -fshort-enums //CHECK: -fno-signed-char Index: clang/test/Preprocessor/init-s390x.c =================================================================== --- clang/test/Preprocessor/init-s390x.c +++ clang/test/Preprocessor/init-s390x.c @@ -183,17 +183,12 @@ // RUN: %clang_cc1 -E -dM -ffreestanding -triple=s390x-none-zos -fno-signed-char < /dev/null | FileCheck -match-full-lines -check-prefix S390X-ZOS %s // RUN: %clang_cc1 -x c++ -std=gnu++14 -E -dM -ffreestanding -triple=s390x-none-zos -fno-signed-char < /dev/null | FileCheck -match-full-lines -check-prefix S390X-ZOS -check-prefix S390X-ZOS-GNUXX %s -// S390X-ZOS-GNUXX: #define _EXT 1 // S390X-ZOS: #define _LONG_LONG 1 -// S390X-ZOS-GNUXX: #define _MI_BUILTIN 1 -// S390X-ZOS: #define _OPEN_DEFAULT 1 -// S390X-ZOS: #define _UNIX03_WITHDRAWN 1 -// S390X-ZOS-GNUXX: #define _XOPEN_SOURCE 600 // S390X-ZOS: #define __370__ 1 // S390X-ZOS: #define __64BIT__ 1 // S390X-ZOS: #define __BFP__ 1 // S390X-ZOS: #define __BOOL__ 1 -// S390X-ZOS-GNUXX: #define __DLL__ 1 +// S390X-ZOS: #define __COMPILER_VER__ 0x50000000 // S390X-ZOS: #define __LONGNAME__ 1 // S390X-ZOS: #define __MVS__ 1 // S390X-ZOS: #define __THW_370__ 1