https://github.com/perry-ca updated https://github.com/llvm/llvm-project/pull/111182
>From 360bab981d8ec36e17aa4fbadbb4feef42c5d135 Mon Sep 17 00:00:00 2001 From: Sean Perry <pe...@ca.ibm.com> Date: Fri, 4 Oct 2024 10:09:32 -0500 Subject: [PATCH 1/2] Add z/OS customization file --- clang/include/clang/Driver/Driver.h | 5 +++ clang/lib/Driver/Driver.cpp | 33 +++++++++++++++++++ clang/test/Driver/Inputs/config-zos/clang.cfg | 1 + clang/test/Driver/Inputs/config-zos/def.cfg | 1 + .../test/Driver/Inputs/config-zos/tst/def.cfg | 1 + clang/test/Driver/config-zos.c | 17 ++++++++++ clang/test/Driver/config-zos1.c | 23 +++++++++++++ 7 files changed, 81 insertions(+) create mode 100644 clang/test/Driver/Inputs/config-zos/clang.cfg create mode 100644 clang/test/Driver/Inputs/config-zos/def.cfg create mode 100644 clang/test/Driver/Inputs/config-zos/tst/def.cfg create mode 100644 clang/test/Driver/config-zos.c create mode 100644 clang/test/Driver/config-zos1.c diff --git a/clang/include/clang/Driver/Driver.h b/clang/include/clang/Driver/Driver.h index 9177d56718ee77..5466659044ba22 100644 --- a/clang/include/clang/Driver/Driver.h +++ b/clang/include/clang/Driver/Driver.h @@ -738,6 +738,11 @@ class Driver { /// \returns true if error occurred. bool loadDefaultConfigFiles(llvm::cl::ExpansionContext &ExpCtx); + /// Tries to load options from customization file. + /// + /// \returns true if error occurred. + bool loadZOSCustomizationFile(llvm::cl::ExpansionContext &); + /// Read options from the specified file. /// /// \param [in] FileName File to read. diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index e9bf60d5e2ee46..dcf01cc2c29ee8 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -998,6 +998,34 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, // } +bool Driver::loadZOSCustomizationFile(llvm::cl::ExpansionContext &ExpCtx) { + if (IsCLMode() || IsDXCMode() || IsFlangMode()) + return false; + + SmallString<128> CustomizationFile; + StringRef PathLIBEnv = StringRef(getenv("CLANG_CONFIG_PATH")).trim(); + // If the env var is a directory then append "/clang.cfg" and treat + // that as the config file. Otherwise treat the env var as the + // config file. + if (!PathLIBEnv.empty()) { + llvm::sys::path::append(CustomizationFile, PathLIBEnv); + if (llvm::sys::fs::is_directory(PathLIBEnv)) + llvm::sys::path::append(CustomizationFile, "/clang.cfg"); + if (llvm::sys::fs::is_regular_file(CustomizationFile)) + return readConfigFile(CustomizationFile, ExpCtx); + Diag(diag::err_drv_config_file_not_found) << CustomizationFile; + return true; + } + + SmallString<128> BaseDir(llvm::sys::path::parent_path(Dir)); + llvm::sys::path::append(CustomizationFile, BaseDir + "/etc/clang.cfg"); + if (llvm::sys::fs::is_regular_file(CustomizationFile)) + return readConfigFile(CustomizationFile, ExpCtx); + + // If no customization file, just return + return false; +} + static void appendOneArg(InputArgList &Args, const Arg *Opt, const Arg *BaseArg) { // The args for config files or /clang: flags belong to different InputArgList @@ -1179,6 +1207,11 @@ bool Driver::loadDefaultConfigFiles(llvm::cl::ExpansionContext &ExpCtx) { assert(!Triple.empty()); } + // On z/OS, start by loading the customization file before loading + // the usual default config file(s). + if (llvm::Triple(Triple).isOSzOS() && loadZOSCustomizationFile(ExpCtx)) + return true; + // Search for config files in the following order: // 1. <triple>-<mode>.cfg using real driver mode // (e.g. i386-pc-linux-gnu-clang++.cfg). diff --git a/clang/test/Driver/Inputs/config-zos/clang.cfg b/clang/test/Driver/Inputs/config-zos/clang.cfg new file mode 100644 index 00000000000000..43a5dbfaa61826 --- /dev/null +++ b/clang/test/Driver/Inputs/config-zos/clang.cfg @@ -0,0 +1 @@ +-DABC=123 diff --git a/clang/test/Driver/Inputs/config-zos/def.cfg b/clang/test/Driver/Inputs/config-zos/def.cfg new file mode 100644 index 00000000000000..156f9c85fb4f2e --- /dev/null +++ b/clang/test/Driver/Inputs/config-zos/def.cfg @@ -0,0 +1 @@ +-DDEF=456 diff --git a/clang/test/Driver/Inputs/config-zos/tst/def.cfg b/clang/test/Driver/Inputs/config-zos/tst/def.cfg new file mode 100644 index 00000000000000..156f9c85fb4f2e --- /dev/null +++ b/clang/test/Driver/Inputs/config-zos/tst/def.cfg @@ -0,0 +1 @@ +-DDEF=456 diff --git a/clang/test/Driver/config-zos.c b/clang/test/Driver/config-zos.c new file mode 100644 index 00000000000000..8de02ec101b914 --- /dev/null +++ b/clang/test/Driver/config-zos.c @@ -0,0 +1,17 @@ +// REQUIRES: shell +// REQUIRES: systemz-registered-target + +// RUN: unset CLANG_NO_DEFAULT_CONFIG +// RUN: rm -rf %t && mkdir %t + +// RUN: mkdir -p %t/testbin +// RUN: mkdir -p %t/etc +// RUN: ln -s %clang %t/testbin/clang +// RUN: echo "-DXYZ=789" >%t/etc/clang.cfg +// RUN: %t/testbin/clang --target=s390x-ibm-zos -c -### -no-canonical-prefixes %s 2>&1 | FileCheck -DDIR=%t %s +// RUN: %t/testbin/clang --target=s390x-ibm-zos -c -### -no-canonical-prefixes --no-default-config %s 2>&1 | FileCheck -check-prefix=NOCONFIG %s +// +// CHECK: Configuration file: [[DIR]]/etc/clang.cfg +// CHECK: "-D" "XYZ=789" +// NOCONFIG-NOT: Configuration file: {{.*}}/etc/clang.cfg +// NOCONFIG-NOT: "-D" "XYZ=789" diff --git a/clang/test/Driver/config-zos1.c b/clang/test/Driver/config-zos1.c new file mode 100644 index 00000000000000..5b1012d00736c7 --- /dev/null +++ b/clang/test/Driver/config-zos1.c @@ -0,0 +1,23 @@ +// REQUIRES: shell +// REQUIRES: systemz-registered-target + +// RUN: unset CLANG_NO_DEFAULT_CONFIG + +// RUN: export CLANG_CONFIG_PATH=%S/Inputs/config-zos +// RUN: %clang --target=s390x-ibm-zos -c -### %s 2>&1 | FileCheck %s +// CHECK: Configuration file: {{.*}}/Inputs/config-zos/clang.cfg +// CHECK: "-D" "ABC=123" + +// RUN: export CLANG_CONFIG_PATH=%S/Inputs/config-zos/def.cfg +// RUN: %clang --target=s390x-ibm-zos -c -### %s 2>&1 | FileCheck %s -check-prefix=CHECK-DEF +// CHECK-DEF: Configuration file: {{.*}}/Inputs/config-zos/def.cfg +// CHECK-DEF: "-D" "DEF=456" + +// RUN: export CLANG_CONFIG_PATH=%S/Inputs/config-zos/Garbage +// RUN: not %clang --target=s390x-ibm-zos -c -### %s 2>&1 | FileCheck %s -check-prefix=CHECK-ERR +// CHECK-ERR: error: configuration file '{{.*}}/Inputs/config-zos/Garbage' cannot be found + +// The directory exists but no clang.cfg in it +// RUN: export CLANG_CONFIG_PATH=%S/Inputs/config-zos/tst +// RUN: not %clang --target=s390x-ibm-zos -c -### %s 2>&1 | FileCheck %s -check-prefix=CHECK-ERRDIR +// CHECK-ERRDIR: error: configuration file '{{.*}}/Inputs/config-zos/tst/clang.cfg' cannot be found >From e82916b9ae6ca66b6a64ed4c0b9913cdd40f0959 Mon Sep 17 00:00:00 2001 From: Sean Perry <pe...@ca.ibm.com> Date: Mon, 7 Oct 2024 10:31:42 -0500 Subject: [PATCH 2/2] Use the real triple to check if os is z/OS --- clang/lib/Driver/Driver.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index dcf01cc2c29ee8..bf5c4a7297a80f 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -1200,16 +1200,16 @@ bool Driver::loadDefaultConfigFiles(llvm::cl::ExpansionContext &ExpCtx) { } // Otherwise, use the real triple as used by the driver. + llvm::Triple RealTriple = + computeTargetTriple(*this, TargetTriple, *CLOptions); if (Triple.empty()) { - llvm::Triple RealTriple = - computeTargetTriple(*this, TargetTriple, *CLOptions); Triple = RealTriple.str(); assert(!Triple.empty()); } // On z/OS, start by loading the customization file before loading // the usual default config file(s). - if (llvm::Triple(Triple).isOSzOS() && loadZOSCustomizationFile(ExpCtx)) + if (RealTriple.isOSzOS() && loadZOSCustomizationFile(ExpCtx)) return true; // Search for config files in the following order: _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits