lld/AMDGPU: Fix asserts if no object files are involved in link
authorMatt Arsenault <Matthew.Arsenault@amd.com>
Fri, 8 Apr 2022 17:22:23 +0000 (13:22 -0400)
committerMatt Arsenault <Matthew.Arsenault@amd.com>
Fri, 8 Apr 2022 18:18:52 +0000 (14:18 -0400)
Fixes issue 47690. The reproduction steps produced a shared object
from clang directly, and then fed the shared object back into
lld. With no regular object files, this assert was hit. I'm not sure
if we need to or should be looking for equivalent fields in shared
objects.

lld/ELF/Arch/AMDGPU.cpp
lld/ELF/SyntheticSections.cpp
lld/test/ELF/amdgpu-elf-flags.s

index c7a6edc..30a9a2d 100644 (file)
@@ -105,7 +105,8 @@ uint32_t AMDGPU::calcEFlagsV4() const {
 }
 
 uint32_t AMDGPU::calcEFlags() const {
-  assert(!objectFiles.empty());
+  if (objectFiles.empty())
+    return 0;
 
   uint8_t abiVersion = cast<ObjFile<ELF64LE>>(objectFiles[0])->getObj()
       .getHeader().e_ident[EI_ABIVERSION];
index 5d9991f..4a07a4c 100644 (file)
@@ -3712,7 +3712,7 @@ static uint8_t getAbiVersion() {
     return 0;
   }
 
-  if (config->emachine == EM_AMDGPU) {
+  if (config->emachine == EM_AMDGPU && !objectFiles.empty()) {
     uint8_t ver = objectFiles[0]->abiVersion;
     for (InputFile *file : makeArrayRef(objectFiles).slice(1))
       if (file->abiVersion != ver)
index c3c0207..b99e373 100644 (file)
@@ -2,8 +2,15 @@
 # RUN: llvm-mc -triple amdgcn-amd-amdhsa -mcpu=gfx803 --amdhsa-code-object-version=2 -filetype=obj %S/Inputs/amdgpu-kernel-0.s -o %t-0.o
 # RUN: llvm-mc -triple amdgcn-amd-amdhsa -mcpu=gfx803 --amdhsa-code-object-version=2 -filetype=obj %S/Inputs/amdgpu-kernel-1.s -o %t-1.o
 # RUN: ld.lld -shared %t-0.o %t-1.o -o %t.so
-# RUN: llvm-readobj --file-headers %t.so | FileCheck %s
+# RUN: llvm-readobj --file-headers %t.so | FileCheck --check-prefix=FIRSTLINK %s
 
-# CHECK: Flags [
-# CHECK:   EF_AMDGPU_MACH_AMDGCN_GFX803 (0x2A)
-# CHECK: ]
+## Try to link again where there are no object file inputs, only a shared library. Issue 47690
+# RUN: ld.lld -shared %t.so -o - | llvm-readobj -h - | FileCheck --check-prefix=SECONDLINK %s
+
+
+# FIRSTLINK:      Flags [
+# FIRSTLINK-NEXT:   EF_AMDGPU_MACH_AMDGCN_GFX803 (0x2A)
+# FIRSTLINK-NEXT: ]
+
+# SECONDLINK:      Flags [ (0x0)
+# SECONDLINK-NEXT: ]