The inaccurate #111945 condition fixes a PROVIDE regression (#111478) but introduces another regression: in a DSO link, if a symbol referenced only by bitcode files is defined as PROVIDE_HIDDEN, lld would not set the visibility correctly, leading to an assertion failure in DynamicReloc::getSymIndex (https://reviews.llvm.org/D123985). This is because `(sym->isUsedInRegularObj || sym->exportDynamic)` is initially false (bitcode undef does not set `isUsedInRegularObj`) then true (in `addSymbol`, after LTO compilation). Fix this by making the condition accurate: use a map to track defined symbols. Reviewers: smithp35 Reviewed By: smithp35 Pull Request: https://github.com/llvm/llvm-project/pull/112386
61 lines
1.5 KiB
ArmAsm
61 lines
1.5 KiB
ArmAsm
# REQUIRES: x86
|
|
## Test the GC behavior when the PROVIDE symbol is defined by a relocatable file.
|
|
|
|
# RUN: rm -rf %t && split-file %s %t && cd %t
|
|
# RUN: llvm-mc -filetype=obj -triple=x86_64 a.s -o a.o
|
|
# RUN: llvm-mc -filetype=obj -triple=x86_64 b.s -o b.o
|
|
# RUN: llvm-as c.ll -o c.bc
|
|
# RUN: ld.lld -T a.t --gc-sections a.o b.o -o a
|
|
# RUN: llvm-readelf -s a | FileCheck %s
|
|
|
|
# RUN: ld.lld -T a.t -shared a.o b.o c.bc -o a.so
|
|
# RUN: llvm-readelf -s -r a.so | FileCheck %s --check-prefix=DSO
|
|
|
|
# CHECK: 1: {{.*}} 0 NOTYPE GLOBAL DEFAULT 1 _start
|
|
# CHECK-NEXT:2: {{.*}} 0 NOTYPE WEAK DEFAULT 2 f3
|
|
# CHECK-NOT: {{.}}
|
|
|
|
# DSO: .rela.plt
|
|
# DSO-NOT: f5
|
|
# DSO: Symbol table '.dynsym'
|
|
# DSO-NOT: f5
|
|
# DSO: Symbol table '.symtab'
|
|
# DSO: {{.*}} 0 NOTYPE LOCAL HIDDEN [[#]] f5
|
|
|
|
#--- a.s
|
|
.global _start, f1, f2, bar
|
|
.weak f3
|
|
_start:
|
|
call f3
|
|
|
|
.section .text.f1,"ax"; f1:
|
|
.section .text.f2,"ax"; f2: # referenced by another relocatable file
|
|
.section .text.f3,"ax"; f3: # live
|
|
.section .text.bar,"ax"; bar:
|
|
|
|
.comm comm,4,4
|
|
|
|
#--- b.s
|
|
call f2
|
|
|
|
#--- c.ll
|
|
target triple = "x86_64-unknown-linux-gnu"
|
|
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
|
|
|
declare void @f5()
|
|
|
|
define void @f3() {
|
|
call void @f5()
|
|
ret void
|
|
}
|
|
|
|
#--- a.t
|
|
SECTIONS {
|
|
. = . + SIZEOF_HEADERS;
|
|
PROVIDE(f1 = bar+1);
|
|
PROVIDE(f2 = bar+2);
|
|
PROVIDE(f3 = bar+3);
|
|
PROVIDE(f4 = comm+4);
|
|
PROVIDE_HIDDEN(f5 = bar+5);
|
|
}
|