diff --git a/clang/test/Driver/linker-wrapper.c b/clang/test/Driver/linker-wrapper.c index 63d43921be9ac..342907c1a3390 100644 --- a/clang/test/Driver/linker-wrapper.c +++ b/clang/test/Driver/linker-wrapper.c @@ -128,11 +128,12 @@ __attribute__((visibility("protected"), used)) int x; // RUN: %clang -cc1 %s -triple x86_64-unknown-linux-gnu -emit-obj -o %t.o \ // RUN: -fembed-offload-object=%t.out // RUN: clang-linker-wrapper --dry-run --host-triple=x86_64-unknown-linux-gnu \ -// RUN: --linker-path=/usr/bin/ld --device-linker=a --device-linker=nvptx64-nvidia-cuda=b \ +// RUN: --linker-path=/usr/bin/ld --device-linker=foo=bar --device-linker=a \ +// RUN: --device-linker=nvptx64-nvidia-cuda=b \ // RUN: %t.o -o a.out 2>&1 | FileCheck %s --check-prefix=LINKER-ARGS -// LINKER-ARGS: clang{{.*}}--target=amdgcn-amd-amdhsa{{.*}}a -// LINKER-ARGS: clang{{.*}}--target=nvptx64-nvidia-cuda{{.*}}a b +// LINKER-ARGS: clang{{.*}}--target=amdgcn-amd-amdhsa{{.*}}foo=bar{{.*}}a +// LINKER-ARGS: clang{{.*}}--target=nvptx64-nvidia-cuda{{.*}}foo=bar{{.*}}a b // RUN: not clang-linker-wrapper --dry-run --host-triple=x86_64-unknown-linux-gnu -ldummy \ // RUN: --linker-path=/usr/bin/ld --device-linker=a --device-linker=nvptx64-nvidia-cuda=b \ diff --git a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp index 9a38e4fb098f9..4bb021eae25a8 100644 --- a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp +++ b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp @@ -1214,7 +1214,13 @@ DerivedArgList getLinkerArgs(ArrayRef Input, // Forward '-Xoffload-linker' options to the appropriate backend. for (StringRef Arg : Args.getAllArgValues(OPT_device_linker_args_EQ)) { auto [Triple, Value] = Arg.split('='); - if (Value.empty()) + llvm::Triple TT(Triple); + // If this isn't a recognized triple then it's an `arg=value` option. + if (TT.getArch() <= Triple::ArchType::UnknownArch || + TT.getArch() > Triple::ArchType::LastArchType) + DAL.AddJoinedArg(nullptr, Tbl.getOption(OPT_linker_arg_EQ), + Args.MakeArgString(Arg)); + else if (Value.empty()) DAL.AddJoinedArg(nullptr, Tbl.getOption(OPT_linker_arg_EQ), Args.MakeArgString(Triple)); else if (Triple == DAL.getLastArgValue(OPT_triple_EQ))