diff --git a/clang/test/Driver/linker-wrapper.c b/clang/test/Driver/linker-wrapper.c index 342907c1a3390..f165a410c1929 100644 --- a/clang/test/Driver/linker-wrapper.c +++ b/clang/test/Driver/linker-wrapper.c @@ -234,3 +234,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 4bb021eae25a8..2db7b6ac823ec 100644 --- a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp +++ b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp @@ -297,7 +297,8 @@ Expected findProgram(StringRef Name, ArrayRef 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 clang(ArrayRef 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"); @@ -1756,7 +1764,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 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.">;