[HIP] Fix lld failure when devie object is empty
When -fgpu-rdc is used for linking relocatable objects, clang driver launches clang-offload-bundler to extract a device relocatable object from each input relocatable object file and passes the extracted files to lld. The input relocatable object file could either come from HIP program or C++ program. The relocatable object file from C++ program does not contain device relocatable objects, therefore clang-offload-bundler extracts an empty file and passes it to lld. lld treates empty file as linker script. When there is no object input file to lld, lld will emit error: target emulation unknown: -m or at least one .o file required This patch adds "elf64_amdgpu" to lld so that lld always know the target no matter whether there are object input files or not. Reviewed by: Artem Belevich, Fangrui Song Differential Revision: https://reviews.llvm.org/D138221
This commit is contained in:
parent
1ac6956b52
commit
056ebadf5c
|
@ -108,7 +108,12 @@ void AMDGCN::Linker::constructLldCommand(Compilation &C, const JobAction &JA,
|
|||
const llvm::opt::ArgList &Args) const {
|
||||
// Construct lld command.
|
||||
// The output from ld.lld is an HSA code object file.
|
||||
ArgStringList LldArgs{"-flavor", "gnu", "--no-undefined", "-shared",
|
||||
ArgStringList LldArgs{"-flavor",
|
||||
"gnu",
|
||||
"-m",
|
||||
"elf64_amdgpu",
|
||||
"--no-undefined",
|
||||
"-shared",
|
||||
"-plugin-opt=-amdgpu-internalize-symbols"};
|
||||
|
||||
auto &TC = getToolChain();
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
// CHECK-SAME: "-target-cpu" "gfx803"
|
||||
// CHECK-SAME: {{.*}} "-o" [[OBJ_DEV_A_803:".*o"]] "-x" "hip"
|
||||
|
||||
// CHECK: [[LLD: ".*lld.*"]] "-flavor" "gnu" "--no-undefined" "-shared"
|
||||
// CHECK: [[LLD: ".*lld.*"]] "-flavor" "gnu" "-m" "elf64_amdgpu" "--no-undefined" "-shared"
|
||||
// CHECK-SAME: "-o" "[[IMG_DEV_A_803:.*out]]" [[OBJ_DEV_A_803]]
|
||||
|
||||
// CHECK: [[CLANG:".*clang.*"]] "-cc1"{{.*}} "-triple" "amdgcn-amd-amdhsa"
|
||||
|
@ -21,7 +21,7 @@
|
|||
// CHECK-SAME: "-target-cpu" "gfx900"
|
||||
// CHECK-SAME: {{.*}} "-o" [[OBJ_DEV_A_900:".*o"]] "-x" "hip"
|
||||
|
||||
// CHECK: [[LLD]] "-flavor" "gnu" "--no-undefined" "-shared"
|
||||
// CHECK: [[LLD]] "-flavor" "gnu" "-m" "elf64_amdgpu" "--no-undefined" "-shared"
|
||||
// CHECK-SAME: "-o" "[[IMG_DEV_A_900:.*out]]" [[OBJ_DEV_A_900]]
|
||||
|
||||
// CHECK: [[BUNDLER:".*clang-offload-bundler"]] "-type=o"
|
||||
|
|
|
@ -59,7 +59,7 @@
|
|||
// CHECK-NOT: {{".*opt"}}
|
||||
// CHECK-NOT: {{".*llc"}}
|
||||
|
||||
// CHECK: [[LLD: ".*lld.*"]] "-flavor" "gnu" "--no-undefined" "-shared"
|
||||
// CHECK: [[LLD: ".*lld.*"]] "-flavor" "gnu" "-m" "elf64_amdgpu" "--no-undefined" "-shared"
|
||||
// CHECK-SAME: "-o" "[[IMG_DEV_A_803:.*out]]" [[OBJ_DEV_A_803]]
|
||||
|
||||
//
|
||||
|
@ -82,7 +82,7 @@
|
|||
// CHECK-NOT: {{".*opt"}}
|
||||
// CHECK-NOT: {{".*llc"}}
|
||||
|
||||
// CHECK: [[LLD]] "-flavor" "gnu" "--no-undefined" "-shared"
|
||||
// CHECK: [[LLD]] "-flavor" "gnu" "-m" "elf64_amdgpu" "--no-undefined" "-shared"
|
||||
// CHECK-SAME: "-o" "[[IMG_DEV_A_900:.*out]]" [[OBJ_DEV_A_900]]
|
||||
|
||||
//
|
||||
|
@ -122,7 +122,7 @@
|
|||
// CHECK-NOT: {{".*opt"}}
|
||||
// CHECK-NOT: {{".*llc"}}
|
||||
|
||||
// CHECK: [[LLD]] "-flavor" "gnu" "--no-undefined" "-shared"
|
||||
// CHECK: [[LLD]] "-flavor" "gnu" "-m" "elf64_amdgpu" "--no-undefined" "-shared"
|
||||
// CHECK-SAME: "-o" "[[IMG_DEV_B_803:.*out]]" [[OBJ_DEV_B_803]]
|
||||
|
||||
//
|
||||
|
@ -145,7 +145,7 @@
|
|||
// CHECK-NOT: {{".*opt"}}
|
||||
// CHECK-NOT: {{".*llc"}}
|
||||
|
||||
// CHECK: [[LLD]] "-flavor" "gnu" "--no-undefined" "-shared"
|
||||
// CHECK: [[LLD]] "-flavor" "gnu" "-m" "elf64_amdgpu" "--no-undefined" "-shared"
|
||||
// CHECK-SAME: "-o" "[[IMG_DEV_B_900:.*out]]" [[OBJ_DEV_B_900]]
|
||||
|
||||
//
|
||||
|
|
|
@ -176,12 +176,15 @@ static std::tuple<ELFKind, uint16_t, uint8_t> parseEmulation(StringRef emul) {
|
|||
.Case("elf_iamcu", {ELF32LEKind, EM_IAMCU})
|
||||
.Case("elf64_sparc", {ELF64BEKind, EM_SPARCV9})
|
||||
.Case("msp430elf", {ELF32LEKind, EM_MSP430})
|
||||
.Case("elf64_amdgpu", {ELF64LEKind, EM_AMDGPU})
|
||||
.Default({ELFNoneKind, EM_NONE});
|
||||
|
||||
if (ret.first == ELFNoneKind)
|
||||
error("unknown emulation: " + emul);
|
||||
if (ret.second == EM_MSP430)
|
||||
osabi = ELFOSABI_STANDALONE;
|
||||
else if (ret.second == EM_AMDGPU)
|
||||
osabi = ELFOSABI_AMDGPU_HSA;
|
||||
return std::make_tuple(ret.first, ret.second, osabi);
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,36 @@
|
|||
# REQUIRES: amdgpu
|
||||
|
||||
# RUN: llvm-mc -filetype=obj -triple=amdgcn-amd-amdhsa %s -o %t.o
|
||||
# RUN: ld.lld %t.o -o %t
|
||||
# RUN: llvm-readobj --file-headers %t | FileCheck %s
|
||||
# RUN: ld.lld -m elf64_amdgpu %t.o -o %t
|
||||
# RUN: llvm-readobj --file-headers %t | FileCheck %s
|
||||
|
||||
# CHECK: ElfHeader {
|
||||
# CHECK-NEXT: Ident {
|
||||
# CHECK-NEXT: Magic: (7F 45 4C 46)
|
||||
# CHECK-NEXT: Class: 64-bit (0x2)
|
||||
# CHECK-NEXT: DataEncoding: LittleEndian (0x1)
|
||||
# CHECK-NEXT: FileVersion: 1
|
||||
# CHECK-NEXT: OS/ABI: AMDGPU_HSA (0x40)
|
||||
# CHECK-NEXT: ABIVersion: 2
|
||||
# CHECK-NEXT: Unused: (00 00 00 00 00 00 00)
|
||||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT: Type: Executable (0x2)
|
||||
# CHECK-NEXT: Machine: EM_AMDGPU (0xE0)
|
||||
# CHECK-NEXT: Version: 1
|
||||
# CHECK-NEXT: Entry:
|
||||
# CHECK-NEXT: ProgramHeaderOffset: 0x40
|
||||
# CHECK-NEXT: SectionHeaderOffset:
|
||||
# CHECK-NEXT: Flags [ (0x0)
|
||||
# CHECK-NEXT: ]
|
||||
# CHECK-NEXT: HeaderSize: 64
|
||||
# CHECK-NEXT: ProgramHeaderEntrySize: 56
|
||||
# CHECK-NEXT: ProgramHeaderCount:
|
||||
# CHECK-NEXT: SectionHeaderEntrySize: 64
|
||||
# CHECK-NEXT: SectionHeaderCount:
|
||||
# CHECK-NEXT: StringTableSectionIndex:
|
||||
# CHECK-NEXT: }
|
||||
|
||||
.globl _start
|
||||
_start:
|
Loading…
Reference in New Issue