https://github.com/jhuber6 updated https://github.com/llvm/llvm-project/pull/100424
>From 800ae50b1e296583d809478b9beb8b8a8cd50eef Mon Sep 17 00:00:00 2001 From: Joseph Huber <hube...@outlook.com> Date: Wed, 24 Jul 2024 11:44:22 -0500 Subject: [PATCH] [LinkerWrapper] Forward `-mllvm` and `--offload-opt` arguments to device Summary: Previously we could parse these internally as they would be used by the embedded LTO job. Now, this LTO is passed to the linker utilities which means these need to be forwarded. So this can now either be done with `--offload-opt` which works in the clang job, or with `-Xoffload-linker` manually. Fixes https://github.com/llvm/llvm-project/issues/100212 --- clang/test/Driver/linker-wrapper-passes.c | 3 --- clang/test/Driver/linker-wrapper.c | 10 ++++++++++ .../clang-linker-wrapper/ClangLinkerWrapper.cpp | 12 ++++++++++-- .../tools/clang-linker-wrapper/LinkerWrapperOpts.td | 2 +- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/clang/test/Driver/linker-wrapper-passes.c b/clang/test/Driver/linker-wrapper-passes.c index fb63ef7970ac7..faa6c082ea177 100644 --- a/clang/test/Driver/linker-wrapper-passes.c +++ b/clang/test/Driver/linker-wrapper-passes.c @@ -4,9 +4,6 @@ // REQUIRES: x86-registered-target // REQUIRES: amdgpu-registered-target -// https://github.com/llvm/llvm-project/issues/100212 -// XFAIL: * - // Setup. // RUN: mkdir -p %t // RUN: %clang -cc1 -emit-llvm-bc -o %t/host-x86_64-unknown-linux-gnu.bc \ diff --git a/clang/test/Driver/linker-wrapper.c b/clang/test/Driver/linker-wrapper.c index 63d43921be9ac..538dc12273b1e 100644 --- a/clang/test/Driver/linker-wrapper.c +++ b/clang/test/Driver/linker-wrapper.c @@ -233,3 +233,13 @@ __attribute__((visibility("protected"), used)) int x; // RUN: | FileCheck %s --check-prefix=OVERRIDE // OVERRIDE-NOT: clang // OVERRIDE: /usr/bin/ld + +// RUN: clang-offload-packager -o %t.out \ +// RUN: --image=file=%t.elf.o,kind=openmp,triple=amdgcn-amd-amdhsa,arch=gfx908 +// RUN: %clang -cc1 %s -triple x86_64-unknown-linux-gnu -emit-obj -o %t.o -fembed-offload-object=%t.out +// RUN: clang-linker-wrapper --host-triple=x86_64-unknown-linux-gnu --dry-run --offload-opt=-pass-remarks=foo \ +// RUN: --linker-path=/usr/bin/ld %t.o -o a.out 2>&1 | FileCheck %s --check-prefix=OFFLOAD-OPT +// RUN: clang-linker-wrapper --host-triple=x86_64-unknown-linux-gnu --dry-run -mllvm -pass-remarks=foo \ +// RUN: --linker-path=/usr/bin/ld %t.o -o a.out 2>&1 | FileCheck %s --check-prefix=OFFLOAD-OPT + +// OFFLOAD-OPT: clang{{.*}}-Wl,--plugin-opt=-pass-remarks=foo diff --git a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp index 9a38e4fb098f9..b6db33502b5f2 100644 --- a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp +++ b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp @@ -297,7 +297,8 @@ Expected<std::string> findProgram(StringRef Name, ArrayRef<StringRef> Paths) { /// supported by the toolchain. bool linkerSupportsLTO(const ArgList &Args) { llvm::Triple Triple(Args.getLastArgValue(OPT_triple_EQ)); - return Triple.isNVPTX() || Triple.isAMDGPU(); + return Triple.isNVPTX() || Triple.isAMDGPU() || + Args.getLastArgValue(OPT_linker_path_EQ).ends_with("ld.lld"); } /// Returns the hashed value for a constant string. @@ -524,6 +525,13 @@ Expected<StringRef> clang(ArrayRef<StringRef> InputFiles, const ArgList &Args) { Args.MakeArgString("-" + OptLevel), }; + // Forward all of the `--offload-opt` and similar options to the device. + if (linkerSupportsLTO(Args)) { + for (auto &Arg : Args.filtered(OPT_offload_opt_eq_minus, OPT_mllvm)) + CmdArgs.push_back( + Args.MakeArgString("-Wl,--plugin-opt=" + StringRef(Arg->getValue()))); + } + if (!Triple.isNVPTX()) CmdArgs.push_back("-Wl,--no-undefined"); @@ -1750,7 +1758,7 @@ int main(int Argc, char **Argv) { for (const opt::Arg *Arg : Args.filtered(OPT_mllvm)) NewArgv.push_back(Arg->getValue()); for (const opt::Arg *Arg : Args.filtered(OPT_offload_opt_eq_minus)) - NewArgv.push_back(Args.MakeArgString(StringRef("-") + Arg->getValue())); + NewArgv.push_back(Arg->getValue()); SmallVector<PassPlugin, 1> PluginList; PassPlugins.setCallback([&](const std::string &PluginPath) { auto Plugin = PassPlugin::Load(PluginPath); diff --git a/clang/tools/clang-linker-wrapper/LinkerWrapperOpts.td b/clang/tools/clang-linker-wrapper/LinkerWrapperOpts.td index 9c27e588fc4f5..a87d5ec8aa9b3 100644 --- a/clang/tools/clang-linker-wrapper/LinkerWrapperOpts.td +++ b/clang/tools/clang-linker-wrapper/LinkerWrapperOpts.td @@ -98,7 +98,7 @@ def mllvm : Separate<["-"], "mllvm">, Flags<[WrapperOnlyOption]>, HelpText<"Arguments passed to LLVM, including Clang invocations, for which " "the '-mllvm' prefix is preserved. Use '-mllvm --help' for a list " "of options.">; -def offload_opt_eq_minus : Joined<["--", "-"], "offload-opt=-">, Flags<[HelpHidden, WrapperOnlyOption]>, +def offload_opt_eq_minus : Joined<["--", "-"], "offload-opt=">, Flags<[HelpHidden, WrapperOnlyOption]>, HelpText<"Options passed to LLVM, not including the Clang invocation. Use " "'--offload-opt=--help' for a list of options.">; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits