mirror of
https://github.com/intel/llvm.git
synced 2026-01-19 09:31:59 +08:00
[LinkerWrapper] Do not link device code under a relocatable link (#79314)
Summary: A relocatable link through `clang -r` can go through the clang-linker-wrapper if offloading is enabled. This will have the effect of linking the device code and creating the wrapper module. It will then be merged into the final file. This is useful behavior on its own, but is likely not what is expected for a `-r` job. This patch makes the linker wrapper ignore the device code when doing a reloctable link. This has the effect of the linker merging the `.llvm.offloading` sections in the output object. These will then be parsed as normal when the executable is finally created. Even though this doesn't actually perform a reloctable link on the device code itself, it has a similar effect of combining multiple files into a single one.
This commit is contained in:
@@ -171,3 +171,15 @@ __attribute__((visibility("protected"), used)) int x;
|
||||
|
||||
// AMD-TARGET-ID: clang{{.*}} -o {{.*}}.img --target=amdgcn-amd-amdhsa -mcpu=gfx90a:xnack+ -O2 -Wl,--no-undefined {{.*}}.o {{.*}}.o
|
||||
// AMD-TARGET-ID: clang{{.*}} -o {{.*}}.img --target=amdgcn-amd-amdhsa -mcpu=gfx90a:xnack- -O2 -Wl,--no-undefined {{.*}}.o {{.*}}.o
|
||||
|
||||
// RUN: clang-offload-packager -o %t.out \
|
||||
// RUN: --image=file=%t.elf.o,kind=openmp,triple=x86_64-unknown-linux-gnu \
|
||||
// RUN: --image=file=%t.elf.o,kind=openmp,triple=x86_64-unknown-linux-gnu
|
||||
// RUN: %clang -cc1 %s -triple x86_64-unknown-linux-gnu -emit-obj -o %t.o -fembed-offload-object=%t.out
|
||||
// RUN: llvm-ar rcs %t.a %t.o
|
||||
// RUN: clang-linker-wrapper --host-triple=x86_64-unknown-linux-gnu --dry-run \
|
||||
// RUN: --linker-path=/usr/bin/ld.lld -- -r --whole-archive %t.a --no-whole-archive \
|
||||
// RUN: %t.o -o a.out 2>&1 | FileCheck %s --check-prefix=RELOCATABLE-LINK
|
||||
|
||||
// RELOCATABLE-LINK-NOT: clang{{.*}} -o {{.*}}.img --target=x86_64-unknown-linux-gnu
|
||||
// RELOCATABLE-LINK: /usr/bin/ld.lld{{.*}}-r
|
||||
|
||||
@@ -1356,6 +1356,12 @@ Expected<SmallVector<SmallVector<OffloadFile>>>
|
||||
getDeviceInput(const ArgList &Args) {
|
||||
llvm::TimeTraceScope TimeScope("ExtractDeviceCode");
|
||||
|
||||
// If the user is requesting a reloctable link we ignore the device code. The
|
||||
// actual linker will merge the embedded device code sections so they can be
|
||||
// linked when the executable is finally created.
|
||||
if (Args.hasArg(OPT_relocatable))
|
||||
return SmallVector<SmallVector<OffloadFile>>{};
|
||||
|
||||
StringRef Root = Args.getLastArgValue(OPT_sysroot_EQ);
|
||||
SmallVector<StringRef> LibraryPaths;
|
||||
for (const opt::Arg *Arg : Args.filtered(OPT_library_path, OPT_libpath))
|
||||
|
||||
@@ -127,6 +127,9 @@ def version : Flag<["--", "-"], "version">, Flags<[HelpHidden]>, Alias<v>;
|
||||
def whole_archive : Flag<["--", "-"], "whole-archive">, Flags<[HelpHidden]>;
|
||||
def no_whole_archive : Flag<["--", "-"], "no-whole-archive">, Flags<[HelpHidden]>;
|
||||
|
||||
def relocatable : Flag<["--", "-"], "relocatable">, Flags<[HelpHidden]>;
|
||||
def r : Flag<["-"], "r">, Alias<relocatable>, Flags<[HelpHidden]>;
|
||||
|
||||
// link.exe-style linker options.
|
||||
def out : Joined<["/", "-", "/?", "-?"], "out:">, Flags<[HelpHidden]>;
|
||||
def libpath : Joined<["/", "-", "/?", "-?"], "libpath:">, Flags<[HelpHidden]>;
|
||||
|
||||
Reference in New Issue
Block a user