Author: Michael Francis Date: 2023-03-15T23:26:48Z New Revision: ac1d143b0ef924cf2725bb36537f18ae2c7f9c4f
URL: https://github.com/llvm/llvm-project/commit/ac1d143b0ef924cf2725bb36537f18ae2c7f9c4f DIFF: https://github.com/llvm/llvm-project/commit/ac1d143b0ef924cf2725bb36537f18ae2c7f9c4f.diff LOG: [Clang][AIX][p] Manually Claim -p in front end The current implementation of `-p` does not claim the argument once it is passed. Since it pushes `-pg` directly, it is only ever referred to again when linking. As a result, when compiling with `-S`, the compiler warns that `-p` goes unused even though that is not the case. With this patch, if both `-p` and `-pg` are passed, the argument that is passed second will take precedence. `-p` will still throw an error on unsupported platforms, regardless of precedence. This revision includes a test case, which has been placed in `clang/test/Driver/zos-profiling-error.c`. As a result, `zos-profiling-error.c` has been renamed to `ibm-profiling.c`. This revision also passes `clang/test/Driver/aix-ld.c`. Differential Revision: https://reviews.llvm.org/D145021 Added: clang/test/Driver/ibm-profiling.c Modified: clang/lib/Driver/ToolChains/AIX.cpp clang/lib/Driver/ToolChains/Clang.cpp Removed: clang/test/Driver/zos-profiling-error.c ################################################################################ diff --git a/clang/lib/Driver/ToolChains/AIX.cpp b/clang/lib/Driver/ToolChains/AIX.cpp index 15560e1c81bca..f41fb768fdc06 100644 --- a/clang/lib/Driver/ToolChains/AIX.cpp +++ b/clang/lib/Driver/ToolChains/AIX.cpp @@ -164,14 +164,14 @@ void aix::Linker::ConstructJob(Compilation &C, const JobAction &JA, } auto getCrt0Basename = [&Args, IsArch32Bit] { - // Enable gprofiling when "-pg" is specified. - if (Args.hasArg(options::OPT_pg)) - return IsArch32Bit ? "gcrt0.o" : "gcrt0_64.o"; - // Enable profiling when "-p" is specified. - else if (Args.hasArg(options::OPT_p)) + if (Arg *A = Args.getLastArgNoClaim(options::OPT_p, options::OPT_pg)) { + // Enable gprofiling when "-pg" is specified. + if (A->getOption().matches(options::OPT_pg)) + return IsArch32Bit ? "gcrt0.o" : "gcrt0_64.o"; + // Enable profiling when "-p" is specified. return IsArch32Bit ? "mcrt0.o" : "mcrt0_64.o"; - else - return IsArch32Bit ? "crt0.o" : "crt0_64.o"; + } + return IsArch32Bit ? "crt0.o" : "crt0_64.o"; }; if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles, @@ -271,7 +271,7 @@ void aix::Linker::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back("-lc"); - if (Args.hasArg(options::OPT_p, options::OPT_pg)) { + if (Args.hasArgNoClaim(options::OPT_p, options::OPT_pg)) { CmdArgs.push_back(Args.MakeArgString((llvm::Twine("-L") + D.SysRoot) + "/lib/profiled")); CmdArgs.push_back(Args.MakeArgString((llvm::Twine("-L") + D.SysRoot) + diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 79fcf4526df3e..87862e028636f 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -6322,20 +6322,26 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, << A->getAsString(Args) << TripleStr; } } - if (Arg *A = Args.getLastArgNoClaim(options::OPT_p)) { - if (TC.getTriple().isOSAIX()) { - CmdArgs.push_back("-pg"); - } else if (!TC.getTriple().isOSOpenBSD()) { + + if (Arg *A = Args.getLastArgNoClaim(options::OPT_pg)) { + if (TC.getTriple().isOSzOS()) { D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args) << TripleStr; } } - if (Arg *A = Args.getLastArgNoClaim(options::OPT_pg)) { - if (TC.getTriple().isOSzOS()) { + if (Arg *A = Args.getLastArgNoClaim(options::OPT_p)) { + if (!(TC.getTriple().isOSAIX() || TC.getTriple().isOSOpenBSD())) { D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args) << TripleStr; } } + if (Arg *A = Args.getLastArgNoClaim(options::OPT_p, options::OPT_pg)) { + if (A->getOption().matches(options::OPT_p)) { + A->claim(); + if (TC.getTriple().isOSAIX() && !Args.hasArgNoClaim(options::OPT_pg)) + CmdArgs.push_back("-pg"); + } + } if (Args.getLastArg(options::OPT_fapple_kext) || (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType))) diff --git a/clang/test/Driver/ibm-profiling.c b/clang/test/Driver/ibm-profiling.c new file mode 100644 index 0000000000000..26bc0d7784373 --- /dev/null +++ b/clang/test/Driver/ibm-profiling.c @@ -0,0 +1,27 @@ +// Check that -pg throws an error on z/OS. +// RUN: %clang -### 2>&1 --target=s390x-none-zos -S -pg %s | FileCheck -check-prefix=FAIL-PG-NAME %s +// FAIL-PG-NAME: error: unsupported option '-pg' for target 's390x-none-zos' + +// Check that -p is still used when not linking on AIX. +// RUN: %clang -### 2>&1 --target=powerpc-ibm-aix7.1.0.0 -S -p -S %s \ +// RUN: | FileCheck --check-prefix=CHECK %s +// CHECK-NOT: warning: argument unused during compilation: '-p' + +// Check precedence: -pg is unused when passed first on AIX. +// RUN: %clang -### 2>&1 --target=powerpc-ibm-aix7.1.0.0 --sysroot %S/Inputs/aix_ppc_tree -pg -p %s \ +// RUN: | FileCheck --check-prefix=CHECK2 %s +// CHECK2-NOT: warning: argument unused during compilation: '-p' [-Wunused-command-line-argument] +// CHECK2: "-isysroot" "[[SYSROOT:[^"]+]]" +// CHECK2: "[[SYSROOT]]/usr/lib{{/|\\\\}}mcrt0.o" +// CHECK2: "-L[[SYSROOT]]/lib/profiled" +// CHECK2: "-L[[SYSROOT]]/usr/lib/profiled" + +// Check precedence: -p is unused when passed first on AIX. +// RUN: %clang -### 2>&1 --target=powerpc-ibm-aix7.1.0.0 --sysroot %S/Inputs/aix_ppc_tree -p -pg %s \ +// RUN: | FileCheck --check-prefix=CHECK3 %s +// CHECK3: warning: argument unused during compilation: '-p' [-Wunused-command-line-argument] +// CHECK3: "-isysroot" "[[SYSROOT:[^"]+]]" +// CHECK3: "[[SYSROOT]]/usr/lib{{/|\\\\}}gcrt0.o" +// CHECK3: "-L[[SYSROOT]]/lib/profiled" +// CHECK3: "-L[[SYSROOT]]/usr/lib/profiled" + diff --git a/clang/test/Driver/zos-profiling-error.c b/clang/test/Driver/zos-profiling-error.c deleted file mode 100644 index e969dc31a245a..0000000000000 --- a/clang/test/Driver/zos-profiling-error.c +++ /dev/null @@ -1,2 +0,0 @@ -// RUN: %clang 2>&1 -### --target=s390x-none-zos -pg -S %s | FileCheck -check-prefix=FAIL-PG-NAME %s -// FAIL-PG-NAME: error: unsupported option '-pg' for target 's390x-none-zos' _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits