Skip to content

Commit

Permalink
[HIP] Fix -mllvm option for device lld linker
Browse files Browse the repository at this point in the history
currently clang passes -mllvm options to the device lld linker plugin
when compiling HIP. This is against default clang behavior
which is only passing -mllvm options to linker plugin specified through -Wl
options. This patch lets clang only pass -Xoffload-linker -mllvm= options
to device lld linker plugin.

Fixes: #63604

Reviewed by: Joseph Huber, Matt Arsenault

Differential Revision: https://reviews.llvm.org/D154145
  • Loading branch information
yxsamliu committed Jun 30, 2023
1 parent 40bb302 commit aa964f1
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 18 deletions.
14 changes: 8 additions & 6 deletions clang/lib/Driver/ToolChains/HIPAMD.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -142,11 +142,6 @@ void AMDGCN::Linker::constructLldCommand(Compilation &C, const JobAction &JA,
if (IsThinLTO)
LldArgs.push_back(Args.MakeArgString("-plugin-opt=-force-import-all"));

for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
LldArgs.push_back(
Args.MakeArgString(Twine("-plugin-opt=") + A->getValue(0)));
}

if (C.getDriver().isSaveTempsEnabled())
LldArgs.push_back("-save-temps");

Expand All @@ -165,7 +160,14 @@ void AMDGCN::Linker::constructLldCommand(Compilation &C, const JobAction &JA,
LldArgs.push_back("--whole-archive");

for (auto *Arg : Args.filtered(options::OPT_Xoffload_linker)) {
LldArgs.push_back(Arg->getValue(1));
StringRef ArgVal = Arg->getValue(1);
auto SplitArg = ArgVal.split("-mllvm=");
if (!SplitArg.second.empty()) {
LldArgs.push_back(
Args.MakeArgString(Twine("-plugin-opt=") + SplitArg.second));
} else {
LldArgs.push_back(Args.MakeArgString(ArgVal));
}
Arg->claim();
}

Expand Down
41 changes: 29 additions & 12 deletions clang/test/Driver/hip-toolchain-mllvm.hip
Original file line number Diff line number Diff line change
@@ -1,30 +1,47 @@
// REQUIRES: x86-registered-target
// REQUIRES: amdgpu-registered-target

// Check only -Xoffload-linker -mllvm=* options are passed
// to device lld linker.
// -mllvm options are passed to clang only.

// RUN: %clang -### --target=x86_64-linux-gnu \
// RUN: --cuda-gpu-arch=gfx803 --cuda-gpu-arch=gfx900 \
// RUN: -mllvm -amdgpu-function-calls=0 \
// RUN: -mllvm -unroll-count=10 \
// RUN: -Xoffload-linker -mllvm=-inline-threshold=100 \
// RUN: %s 2>&1 | FileCheck %s

// RUN: %clang -### --target=x86_64-linux-gnu \
// RUN: --cuda-gpu-arch=gfx803 --cuda-gpu-arch=gfx900 \
// RUN: -fgpu-rdc -mllvm -amdgpu-function-calls=0 \
// RUN: %s 2>&1 | FileCheck -check-prefixes=CHECK,RDC %s
// RUN: -mllvm -unroll-count=10 \
// RUN: -Xoffload-linker -mllvm=-inline-threshold=100 \
// RUN: %s 2>&1 | FileCheck -check-prefix=NEG %s

// RUN: %clang -### --target=x86_64-linux-gnu \
// RUN: --cuda-gpu-arch=gfx803 --cuda-gpu-arch=gfx900 \
// RUN: -fgpu-rdc -mllvm -unroll-count=10 \
// RUN: -Xoffload-linker -mllvm=-inline-threshold=100 \
// RUN: %s 2>&1 | FileCheck %s

// RUN: %clang -### --target=x86_64-linux-gnu \
// RUN: --cuda-gpu-arch=gfx803 --cuda-gpu-arch=gfx900 \
// RUN: -fgpu-rdc -mllvm -unroll-count=10 \
// RUN: -Xoffload-linker -mllvm=-inline-threshold=100 \
// RUN: %s 2>&1 | FileCheck -check-prefix=NEG %s

// CHECK: [[CLANG:".*clang.*"]] "-cc1" "-triple" "amdgcn-amd-amdhsa"
// CHECK-SAME: "-aux-triple" "x86_64-unknown-linux-gnu"
// CHECK-SAME: {{.*}} "-target-cpu" "gfx803"
// CHECK-SAME: {{.*}} "-mllvm" "-amdgpu-function-calls=0" {{.*}}

// CHECK-NOT: {{".*opt"}}
// CHECK-NOT: {{".*llc"}}
// RDC: [[LLD:".*lld.*"]] {{.*}} "-plugin-opt=-amdgpu-function-calls=0"
// CHECK-SAME: {{.*}} "-mllvm" "-unroll-count=10" {{.*}}
// CHECK: [[LLD:".*lld.*"]] {{.*}}"-m" "elf64_amdgpu"{{.*}} "-plugin-opt=-inline-threshold=100"

// CHECK: [[CLANG]] "-cc1" "-triple" "amdgcn-amd-amdhsa"
// CHECK-SAME: "-aux-triple" "x86_64-unknown-linux-gnu"
// CHECK-SAME: {{.*}} "-target-cpu" "gfx900"
// CHECK-SAME: {{.*}} "-mllvm" "-amdgpu-function-calls=0" {{.*}}
// CHECK-SAME: {{.*}} "-mllvm" "-unroll-count=10" {{.*}}
// CHECK: [[LLD:".*lld.*"]] {{.*}} "-plugin-opt=-inline-threshold=100"

// CHECK-NOT: {{".*opt"}}
// CHECK-NOT: {{".*llc"}}
// RDC: [[LLD:".*lld.*"]] {{.*}} "-plugin-opt=-amdgpu-function-calls=0"
// NEG-NOT: {{".*opt"}}
// NEG-NOT: {{".*llc"}}
// NEG-NOT: "-plugin-opt=-unroll-count=10"
// NEG-NOT: "-m" "elf_x86_64"{{.*}} "-plugin-opt=-inline-threshold=100"

0 comments on commit aa964f1

Please sign in to comment.