diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -446,6 +446,8 @@ switch (os) { case llvm::Triple::Linux: return new LinuxTargetInfo(Triple, Opts); + case llvm::Triple::ZOS: + return new ZOSTargetInfo(Triple, Opts); default: return new SystemZTargetInfo(Triple, Opts); } diff --git a/clang/lib/Basic/Targets/OSTargets.h b/clang/lib/Basic/Targets/OSTargets.h --- a/clang/lib/Basic/Targets/OSTargets.h +++ b/clang/lib/Basic/Targets/OSTargets.h @@ -721,6 +721,71 @@ bool hasInt128Type() const override { return false; } }; +// z/OS target +template +class LLVM_LIBRARY_VISIBILITY ZOSTargetInfo : public OSTargetInfo { +protected: + void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, + MacroBuilder &Builder) const override { + Builder.defineMacro("_LONG_LONG"); + Builder.defineMacro("_OPEN_DEFAULT"); + Builder.defineMacro("_UNIX03_WITHDRAWN"); + Builder.defineMacro("__370__"); + Builder.defineMacro("__BFP__"); + Builder.defineMacro("__BOOL__"); + Builder.defineMacro("__LONGNAME__"); + Builder.defineMacro("__MVS__"); + Builder.defineMacro("__THW_370__"); + Builder.defineMacro("__THW_BIG_ENDIAN__"); + Builder.defineMacro("__TOS_390__"); + Builder.defineMacro("__TOS_MVS__"); + Builder.defineMacro("__XPLINK__"); + + if (this->PointerWidth == 64) { + Builder.defineMacro("__64BIT__"); + } + + if (Opts.C99) { + Builder.defineMacro("_ISOC99_SOURCE"); + } + + if (Opts.C11 || Opts.GNUMode) { + Builder.defineMacro("__IBM_UTF_LITERAL"); + } + + if (Opts.C11 || (Opts.GNUMode && !Opts.CPlusPlus)) { + Builder.defineMacro("__IBMC_GENERIC"); + } + + if (Opts.CPlusPlus) { + Builder.defineMacro("__DLL__"); + // Macro __wchar_t exposes the definition of wchar_t data type + // in system headers. + Builder.defineMacro("__wchar_t"); + Builder.defineMacro("_XOPEN_SOURCE", "600"); + } + + if (Opts.C11 || Opts.CPlusPlus11 || Opts.GNUMode) { + Builder.defineMacro("__IBMC_NORETURN"); + } + + if (Opts.C11 || (Opts.GNUMode && Opts.CPlusPlus)) { + Builder.defineMacro("__IBM_CHAR16_T__"); + Builder.defineMacro("__IBM_CHAR32_T__"); + Builder.defineMacro("__IBMCPP_UTF_LITERAL__"); + } + + if (Opts.GNUMode) { + Builder.defineMacro("_MI_BUILTIN"); + Builder.defineMacro("_EXT"); + } + } + +public: + ZOSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) + : OSTargetInfo(Triple, Opts) {} +}; + void addWindowsDefines(const llvm::Triple &Triple, const LangOptions &Opts, MacroBuilder &Builder); diff --git a/clang/test/Preprocessor/init.c b/clang/test/Preprocessor/init.c --- a/clang/test/Preprocessor/init.c +++ b/clang/test/Preprocessor/init.c @@ -5630,6 +5630,45 @@ // S390X:#define __s390__ 1 // S390X:#define __s390x__ 1 // +// 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 -E -dM -ffreestanding -triple=s390x-none-zos -fno-signed-char < /dev/null | FileCheck -match-full-lines -check-prefix S390X-ZOS -check-prefix S390X-ZOS-C %s +// RUN: %clang_cc1 -E -dM -std=gnu99 -ffreestanding -triple=s390x-none-zos -fno-signed-char < /dev/null | FileCheck -match-full-lines -check-prefix S390X-ZOS %s +// RUN: %clang_cc1 -E -dM -std=gnu11 -ffreestanding -triple=s390x-none-zos -fno-signed-char < /dev/null | FileCheck -match-full-lines -check-prefix S390X-ZOS %s +// RUN: %clang_cc1 -x c++ -E -dM -ffreestanding -triple=s390x-none-zos -fno-signed-char < /dev/null | FileCheck -match-full-lines -check-prefix S390X-ZOS -check-prefix S390X-ZOS-CXX %s +// RUN: %clang_cc1 -x c -std=c99 -E -dM -ffreestanding -triple=s390x-none-zos -fno-signed-char < /dev/null | FileCheck -match-full-lines -check-prefix S390X-ZOS -check-prefix S390X-ZOS-C99 %s +// RUN: %clang_cc1 -x c++ -std=c++11 -E -dM -ffreestanding -triple=s390x-none-zos -fno-signed-char < /dev/null | FileCheck -match-full-lines -check-prefix S390X-ZOS -check-prefix S390X-ZOS-CXX %s +// RUN: %clang_cc1 -x c++ -std=c++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-CXX %s +// RUN: %clang_cc1 -x c++ -std=gnu++11 -E -dM -ffreestanding -triple=s390x-none-zos -fno-signed-char < /dev/null | FileCheck -match-full-lines -check-prefix S390X-ZOS -check-prefix S390X-ZOS-CXX -check-prefix S390X-ZOS-GXX %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-CXX -check-prefix S390X-ZOS-GXX %s +// +// S390X-ZOS-GXX:#define _EXT 1 +// S390X-ZOS-C99:#define _ISOC99_SOURCE 1 +// S390X-ZOS:#define _LONG_LONG 1 +// S390X-ZOS-GXX:#define _MI_BUILTIN 1 +// S390X-ZOS:#define _OPEN_DEFAULT 1 +// S390X-ZOS:#define _UNIX03_WITHDRAWN 1 +// S390X-ZOS-CXX:#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-CXX:#define __DLL__ 1 +// S390X-ZOS-C:#define __IBMC_GENERIC 1 +// S390X-ZOS-C:#define __IBMC_NORETURN 1 +// S390X-ZOS-C:#define __IBM_UTF_LITERAL 1 +// S390X-ZOS-GXX:#define __IBMCPP_UTF_LITERAL__ 1 +// S390X-ZOS-GXX:#define __IBMC_NORETURN 1 +// S390X-ZOS-GXX:#define __IBM_CHAR16_T__ 1 +// S390X-ZOS-GXX:#define __IBM_CHAR32_T__ 1 +// S390X-ZOS:#define __LONGNAME__ 1 +// S390X-ZOS:#define __MVS__ 1 +// S390X-ZOS:#define __THW_370__ 1 +// S390X-ZOS:#define __THW_BIG_ENDIAN__ 1 +// S390X-ZOS:#define __TOS_390__ 1 +// S390X-ZOS:#define __TOS_MVS__ 1 +// S390X-ZOS:#define __XPLINK__ 1 +// S390X-ZOS-CXX:#define __wchar_t 1 +// // RUN: %clang_cc1 -E -dM -ffreestanding -fgnuc-version=4.2.1 -triple=sparc-none-none < /dev/null | FileCheck -match-full-lines -check-prefix SPARC -check-prefix SPARC-DEFAULT %s // RUN: %clang_cc1 -E -dM -ffreestanding -fgnuc-version=4.2.1 -triple=sparc-rtems-elf < /dev/null | FileCheck -match-full-lines -check-prefix SPARC -check-prefix SPARC-DEFAULT %s // RUN: %clang_cc1 -E -dM -ffreestanding -fgnuc-version=4.2.1 -triple=sparc-none-netbsd < /dev/null | FileCheck -match-full-lines -check-prefix SPARC -check-prefix SPARC-NETOPENBSD %s