[lld] 63fe6d7 - lld/AMDGPU: Fix asserts if no object files are involved in link

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Fri Apr 8 11:19:10 PDT 2022


Author: Matt Arsenault
Date: 2022-04-08T14:18:52-04:00
New Revision: 63fe6d7eae2991f6d1749a413a72c4f26a5a457f

URL: https://github.com/llvm/llvm-project/commit/63fe6d7eae2991f6d1749a413a72c4f26a5a457f
DIFF: https://github.com/llvm/llvm-project/commit/63fe6d7eae2991f6d1749a413a72c4f26a5a457f.diff

LOG: lld/AMDGPU: Fix asserts if no object files are involved in link

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.

Added: 
    

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

Removed: 
    


################################################################################
diff  --git a/lld/ELF/Arch/AMDGPU.cpp b/lld/ELF/Arch/AMDGPU.cpp
index c7a6edca6733b..30a9a2d2974a5 100644
--- a/lld/ELF/Arch/AMDGPU.cpp
+++ b/lld/ELF/Arch/AMDGPU.cpp
@@ -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];

diff  --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp
index 5d9991f59bb43..4a07a4c95bdbd 100644
--- a/lld/ELF/SyntheticSections.cpp
+++ b/lld/ELF/SyntheticSections.cpp
@@ -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)

diff  --git a/lld/test/ELF/amdgpu-elf-flags.s b/lld/test/ELF/amdgpu-elf-flags.s
index c3c0207eaf4b6..b99e373bd7ce7 100644
--- a/lld/test/ELF/amdgpu-elf-flags.s
+++ b/lld/test/ELF/amdgpu-elf-flags.s
@@ -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: ]


        


More information about the llvm-commits mailing list