| # 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); |
| } |