[PATCH] D152207: [HIP] Instruct lld to go through all archives
Siu Chi Chan via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Jun 8 10:23:29 PDT 2023
scchan updated this revision to Diff 529667.
scchan added a comment.
rebased
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D152207/new/
https://reviews.llvm.org/D152207
Files:
clang/lib/Driver/ToolChains/HIPAMD.cpp
clang/test/Driver/hip-toolchain-rdc-separate.hip
clang/test/Driver/hip-toolchain-rdc-static-lib.hip
Index: clang/test/Driver/hip-toolchain-rdc-static-lib.hip
===================================================================
--- clang/test/Driver/hip-toolchain-rdc-static-lib.hip
+++ clang/test/Driver/hip-toolchain-rdc-static-lib.hip
@@ -80,7 +80,9 @@
// CHECK-NOT: ".*llc"
// CHECK: [[LLD]] {{.*}} "-plugin-opt=-amdgpu-internalize-symbols"
// CHECK-SAME: "-plugin-opt=mcpu=gfx900"
+// CHECK-SAME: "--whole-archive"
// CHECK-SAME: "-o" "[[IMG_DEV2:.*out]]" [[A_BC2]] [[B_BC2]]
+// CHECK-SAME: "--no-whole-archive"
// combine images generated into hip fat binary object
// CHECK: [[BUNDLER:".*clang-offload-bundler"]] "-type=o"
Index: clang/test/Driver/hip-toolchain-rdc-separate.hip
===================================================================
--- clang/test/Driver/hip-toolchain-rdc-separate.hip
+++ clang/test/Driver/hip-toolchain-rdc-separate.hip
@@ -126,18 +126,22 @@
// LINK-NOT: ".*llc"
// LINK: {{".*lld.*"}} {{.*}} "-plugin-opt=-amdgpu-internalize-symbols"
// LINK-SAME: "-plugin-opt=mcpu=gfx803"
+// LINK-SAME: "--whole-archive"
// LLD-TMP-SAME: "-o" "[[IMG_DEV1:.*.out]]"
// LLD-FIN-SAME: "-o" "[[IMG_DEV1:a.out-.*gfx803]]"
// LINK-SAME "[[A_BC1]]" "[[B_BC1]]"
+// LINK-SAME: "--no-whole-archive"
// LINK-NOT: "*.llvm-link"
// LINK-NOT: ".*opt"
// LINK-NOT: ".*llc"
// LINK: {{".*lld.*"}} {{.*}} "-plugin-opt=-amdgpu-internalize-symbols"
// LINK-SAME: "-plugin-opt=mcpu=gfx900"
+// LINK-SAME: "--whole-archive"
// LLD-TMP-SAME: "-o" "[[IMG_DEV2:.*.out]]"
// LLD-FIN-SAME: "-o" "[[IMG_DEV1:a.out-.*gfx900]]"
// LINK-SAME "[[A_BC2]]" "[[B_BC2]]"
+// LINK-SAME: "--no-whole-archive"
// LINK-BUNDLE: [[BUNDLER:".*clang-offload-bundler"]] "-type=o"
// LINK-BUNDLE-SAME: "-targets={{.*}},hipv4-amdgcn-amd-amdhsa--gfx803,hipv4-amdgcn-amd-amdhsa--gfx900"
Index: clang/lib/Driver/ToolChains/HIPAMD.cpp
===================================================================
--- clang/lib/Driver/ToolChains/HIPAMD.cpp
+++ clang/lib/Driver/ToolChains/HIPAMD.cpp
@@ -152,6 +152,18 @@
addLinkerCompressDebugSectionsOption(TC, Args, LldArgs);
+ // Given that host and device linking happen in separate processes, the device
+ // linker doesn't always have the visibility as to which device symbols are
+ // needed by a program, especially for the device symbol dependencies that are
+ // introduced through the host symbol resolution.
+ // For example: host_A() (A.obj) --> host_B(B.obj) --> device_kernel_B()
+ // (B.obj) In this case, the device linker doesn't know that A.obj actually
+ // depends on the kernel functions in B.obj. When linking to static device
+ // library, the device linker may drop some of the device global symbols if
+ // they aren't referenced. As a workaround, we are adding to the
+ // --whole-archive flag such that all global symbols would be linked in.
+ LldArgs.push_back("--whole-archive");
+
for (auto *Arg : Args.filtered(options::OPT_Xoffload_linker)) {
LldArgs.push_back(Arg->getValue(1));
Arg->claim();
@@ -169,6 +181,8 @@
/*IsBitCodeSDL=*/true,
/*PostClangLink=*/false);
+ LldArgs.push_back("--no-whole-archive");
+
const char *Lld = Args.MakeArgString(getToolChain().GetProgramPath("lld"));
C.addCommand(std::make_unique<Command>(JA, *this, ResponseFileSupport::None(),
Lld, LldArgs, Inputs, Output));
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D152207.529667.patch
Type: text/x-patch
Size: 3416 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230608/5e05e8a0/attachment.bin>
More information about the cfe-commits
mailing list