Skip to content

Commit af611a0

Browse files
authored
[LinkerWrapper] Fix -Xoffload-linker a=b in offloading (#100270)
Summary: We have the `-Xoffload-linker=triple=arg` syntax that split the argument meant only for a single toolchain. However this borke if it was an `a=b` type argument. Make it only treat it like a triple if it's a valid triple.
1 parent 8c20d71 commit af611a0

File tree

2 files changed

+11
-4
lines changed

2 files changed

+11
-4
lines changed

clang/test/Driver/linker-wrapper.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,11 +128,12 @@ __attribute__((visibility("protected"), used)) int x;
128128
// RUN: %clang -cc1 %s -triple x86_64-unknown-linux-gnu -emit-obj -o %t.o \
129129
// RUN: -fembed-offload-object=%t.out
130130
// RUN: clang-linker-wrapper --dry-run --host-triple=x86_64-unknown-linux-gnu \
131-
// RUN: --linker-path=/usr/bin/ld --device-linker=a --device-linker=nvptx64-nvidia-cuda=b \
131+
// RUN: --linker-path=/usr/bin/ld --device-linker=foo=bar --device-linker=a \
132+
// RUN: --device-linker=nvptx64-nvidia-cuda=b \
132133
// RUN: %t.o -o a.out 2>&1 | FileCheck %s --check-prefix=LINKER-ARGS
133134

134-
// LINKER-ARGS: clang{{.*}}--target=amdgcn-amd-amdhsa{{.*}}a
135-
// LINKER-ARGS: clang{{.*}}--target=nvptx64-nvidia-cuda{{.*}}a b
135+
// LINKER-ARGS: clang{{.*}}--target=amdgcn-amd-amdhsa{{.*}}foo=bar{{.*}}a
136+
// LINKER-ARGS: clang{{.*}}--target=nvptx64-nvidia-cuda{{.*}}foo=bar{{.*}}a b
136137

137138
// RUN: not clang-linker-wrapper --dry-run --host-triple=x86_64-unknown-linux-gnu -ldummy \
138139
// RUN: --linker-path=/usr/bin/ld --device-linker=a --device-linker=nvptx64-nvidia-cuda=b \

clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1214,7 +1214,13 @@ DerivedArgList getLinkerArgs(ArrayRef<OffloadFile> Input,
12141214
// Forward '-Xoffload-linker' options to the appropriate backend.
12151215
for (StringRef Arg : Args.getAllArgValues(OPT_device_linker_args_EQ)) {
12161216
auto [Triple, Value] = Arg.split('=');
1217-
if (Value.empty())
1217+
llvm::Triple TT(Triple);
1218+
// If this isn't a recognized triple then it's an `arg=value` option.
1219+
if (TT.getArch() <= Triple::ArchType::UnknownArch ||
1220+
TT.getArch() > Triple::ArchType::LastArchType)
1221+
DAL.AddJoinedArg(nullptr, Tbl.getOption(OPT_linker_arg_EQ),
1222+
Args.MakeArgString(Arg));
1223+
else if (Value.empty())
12181224
DAL.AddJoinedArg(nullptr, Tbl.getOption(OPT_linker_arg_EQ),
12191225
Args.MakeArgString(Triple));
12201226
else if (Triple == DAL.getLastArgValue(OPT_triple_EQ))

0 commit comments

Comments
 (0)