diff --git a/clang/lib/Driver/ToolChains/AIX.cpp b/clang/lib/Driver/ToolChains/AIX.cpp --- a/clang/lib/Driver/ToolChains/AIX.cpp +++ b/clang/lib/Driver/ToolChains/AIX.cpp @@ -164,13 +164,15 @@ } auto getCrt0Basename = [&Args, IsArch32Bit] { - // Enable gprofiling when "-pg" is specified. - if (Args.hasArg(options::OPT_pg)) + Arg *A = Args.getLastArgNoClaim(options::OPT_p, options::OPT_pg); + if (A->getOption().matches(options::OPT_pg)) + // Enable gprofiling when "-pg" is specified. return IsArch32Bit ? "gcrt0.o" : "gcrt0_64.o"; // Enable profiling when "-p" is specified. - else if (Args.hasArg(options::OPT_p)) + else if (A->getOption().matches(options::OPT_p)) { + A->claim(); return IsArch32Bit ? "mcrt0.o" : "mcrt0_64.o"; - else + } else return IsArch32Bit ? "crt0.o" : "crt0_64.o"; }; @@ -271,7 +273,7 @@ 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 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -6324,18 +6324,23 @@ << 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()) { - 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()) { - 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_pg)) { + if (TC.getTriple().isOSzOS()) { + D.Diag(diag::err_drv_unsupported_opt_for_target) + << A->getAsString(Args) << TripleStr; + } + } else if (A->getOption().matches(options::OPT_p)) { + A->claim(); + if (TC.getTriple().isOSAIX()) { + if (!Args.hasArgNoClaim(options::OPT_pg)) { + A->claim(); + CmdArgs.push_back("-pg"); + } + } else if (!TC.getTriple().isOSOpenBSD()) { + D.Diag(diag::err_drv_unsupported_opt_for_target) + << A->getAsString(Args) << TripleStr; + } } } diff --git a/clang/test/Driver/ibm-profiling.c b/clang/test/Driver/ibm-profiling.c new file mode 100644 --- /dev/null +++ b/clang/test/Driver/ibm-profiling.c @@ -0,0 +1,34 @@ +// RUN: %clang -### 2>&1 \ +// RUN: --target=s390x-none-zos \ +// RUN: -S \ +// RUN: -pg \ +// RUN: %s \ +// RUN: | FileCheck -check-prefix=FAIL-PG-NAME %s +// FAIL-PG-NAME: error: unsupported option '-pg' for target 's390x-none-zos' + +// Check presecedence: -pg is unused when passed first. +// RUN: %clang -### 2>&1 \ +// RUN: --target=powerpc-ibm-aix7.1.0.0 \ +// RUN: -pg \ +// RUN: -p \ +// RUN: %s \ +// RUN: | FileCheck --check-prefix=UNUSED %s +// UNUSED-NOT: warning: argument unused during compilation: '-p' + +// Check presecedence: -p is unused when past first. +// RUN: %clang -### 2>&1 \ +// RUN: --target=powerpc-ibm-aix7.1.0.0 \ +// RUN: -p \ +// RUN: -pg \ +// RUN: %s \ +// RUN: | FileCheck --check-prefix=UNUSED %s +// UNUSED: warning: argument unused during compilation: '-p' + +// Check that -p is still used when not linking on AIX. +// RUN: %clang -### 2>&1 \ +// RUN: --target=powerpc-ibm-aix7.1.0.0 \ +// RUN: -p \ +// RUN: -S \ +// RUN: %s \ +// RUN: | FileCheck --check-prefix=UNUSED %s +// UNUSED-NOT: warning: argument unused during compilation: '-p' diff --git a/clang/test/Driver/zos-profiling-error.c b/clang/test/Driver/zos-profiling-error.c deleted file mode 100644 --- 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'