From 63fe6d7eae2991f6d1749a413a72c4f26a5a457f Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Fri, 8 Apr 2022 13:22:23 -0400 Subject: [PATCH] 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. --- lld/ELF/Arch/AMDGPU.cpp | 3 ++- lld/ELF/SyntheticSections.cpp | 2 +- lld/test/ELF/amdgpu-elf-flags.s | 15 +++++++++++---- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/lld/ELF/Arch/AMDGPU.cpp b/lld/ELF/Arch/AMDGPU.cpp index c7a6edc..30a9a2d 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>(objectFiles[0])->getObj() .getHeader().e_ident[EI_ABIVERSION]; diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp index 5d9991f..4a07a4c 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 c3c0207..b99e373 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: ] -- 2.7.4