diff --git a/lld/test/ELF/merge-sym-gc.s b/lld/test/ELF/merge-sym-gc.s new file mode 100644 --- /dev/null +++ b/lld/test/ELF/merge-sym-gc.s @@ -0,0 +1,50 @@ +# REQUIRES: x86 +## Show how symbols in GCed mergeable pieces behave. + +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o +# RUN: ld.lld --gc-sections %t.o -o %t.elf +# RUN: llvm-readelf %t.elf --sections --syms | FileCheck %s + +.section .merge1,"aM",@progbits,4 +a1: ## Unreferenced. In first fragment, kept by a2 reference. + .short 1 +a2: ## Referenced. + .short 1 +b1: ## Unreferenced. Discarded as second fragment is unreferenced. + .short 1 +b2: ## Unreferenced. Discarded as second fragment is unreferenced. + .short 1 +c1: ## Referenced. + .short 1 +c2: ## Unreferenced. In third fragment, kept by c1 reference. + .short 1 +c3: ## Unreferenced. In third fragment (due to being at end of section). + ## Kept by c1 reference. + +.section .merge2,"aM",@progbits,4 +d: + .long 2 + .long 2 +e: ## Unreferenced. Discarded, since at end of unreferenced piece at end + ## of section. + +.data +.global _start +_start: + .quad a2 + .quad c1 + .quad d + +# CHECK: .merge1 PROGBITS [[# %x, ADDR1:]] +# CHECK: .merge2 PROGBITS [[# %x, ADDR2:]] + +# CHECK: Symbol table '.symtab' contains 8 entries: +# CHECK-NEXT: Num: Value {{.*}} Ndx Name +# CHECK-NEXT: 0: {{.*}} UND{{ *$}} +# CHECK-NEXT: 1: {{0*}}[[#ADDR1]] {{.*}} a1 +# CHECK-NEXT: 2: {{0*}}[[#ADDR1+2]] {{.*}} a2 +# CHECK-NEXT: 3: {{0*}}[[#ADDR1]] {{.*}} c1 +# CHECK-NEXT: 4: {{0*}}[[#ADDR1+2]] {{.*}} c2 +# CHECK-NEXT: 5: {{0*}}[[#ADDR1+4]] {{.*}} c2 +# CHECK-NEXT: 6: {{0*}}[[#ADDR2]] {{.*}} d +# CHECK-NEXT: 7: {{.*}} _start diff --git a/lld/test/ELF/merge-sym.s b/lld/test/ELF/merge-sym.s --- a/lld/test/ELF/merge-sym.s +++ b/lld/test/ELF/merge-sym.s @@ -1,21 +1,21 @@ // REQUIRES: x86 // RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o // RUN: ld.lld %t.o -o %t.so -shared -// RUN: llvm-readobj --symbols -S %t.so | FileCheck %s +// RUN: llvm-readelf --symbols -S %t.so | FileCheck %s .section .rodata.cst4,"aM",@progbits,4 .short 0 foo: .short 42 + .short 0 +bar: + .short 42 -// CHECK: Name: .rodata -// CHECK-NEXT: Type: SHT_PROGBITS -// CHECK-NEXT: Flags [ -// CHECK-NEXT: SHF_ALLOC -// CHECK-NEXT: SHF_MERGE -// CHECK-NEXT: ] -// CHECK-NEXT: Address: 0x20D +// CHECK: Name Type Address Off Size ES Flg +// CHECK: .rodata SHT_PROGBITS [[#%x, ADDR:]] [[#%x]] [[#%x]] 04 AM{{ }} -// CHECK: Name: foo -// CHECK-NEXT: Value: 0x20F +// CHECK: Symbol table '.symtab' contains {{.*}} entries: +// CHECK-NEXT: Num: Value Size Type Bind Vis Ndx Name +// CHECK-DAG: {{.*}}: {{0*}}[[#ADDR]] {{.+}} {{.+}} {{.+}} {{.+}} {{.+}} foo +// CHECK-DAG: {{.*}}: {{0*}}[[#ADDR]] {{.+}} {{.+}} {{.+}} {{.+}} {{.+}} bar