| #Tests that multiple consecutive weak symbol definitions do not confuse the |
| #ELF reader. For example: |
| # |
| # my_weak_func1: |
| # my_weak_func2: |
| # my_weak_func3: |
| # code |
| # |
| #If my_weak_func2 is merged to other definition, this should not disturb the |
| #definition my_weak_func1 to "code". |
| # |
| # |
| #RUN: yaml2obj -format=elf %p/Inputs/consecutive-weak-defs.o.yaml -o=%t1.o |
| #RUN: yaml2obj -format=elf %p/Inputs/main-with-global-def.o.yaml -o=%t2.o |
| #RUN: lld -flavor gnu -target x86_64 %t1.o %t2.o -e=main -o %t1 |
| #RUN: obj2yaml %t1 | FileCheck -check-prefix CHECKLAYOUT %s |
| # |
| # Check that the layout has not been changed: |
| # |
| #CHECKLAYOUT: Name: .text |
| #CHECKLAYOUT-NEXT: Type: |
| #CHECKLAYOUT-NEXT: Flags: |
| #CHECKLAYOUT-NEXT: Address: |
| #CHECKLAYOUT-NEXT: AddressAlign: |
| #CHECKLAYOUT-NEXT: Content: 554889E5E8020000005DC3554889E5B8640000005DC3 |
| # ^~~> my_func ^~~> my_weak_func |
| # |
| # |
| # |
| #Our two input files were produced by the following code: |
| # |
| #Inputs/consecutive-weak-defs.o.yaml (this one is in assembly to allow us to |
| # easily define multiple labels) |
| # |
| # .text |
| # .globl my_func |
| # .type my_func,@function |
| # my_func: |
| # pushq %rbp |
| # movq %rsp, %rbp |
| # callq my_weak_func |
| # popq %rbp |
| # retq |
| # .Ltmp0: |
| # .size my_func, .Ltmp0-my_func |
| # |
| # .text |
| # .weak my_weak_func |
| # .type my_weak_func,@function |
| # .weak my_weak_func2 |
| # .type my_weak_func2,@function |
| # .weak my_weak_func3 |
| # .type my_weak_func3,@function |
| # my_weak_func: |
| # my_weak_func2: |
| # my_weak_func3: |
| # pushq %rbp |
| # movq %rsp, %rbp |
| # movl $100, %eax |
| # popq %rbp |
| # retq |
| # .Ltmp1: |
| # .size my_weak_func, .Ltmp1-my_weak_func |
| # .size my_weak_func2, .Ltmp1-my_weak_func2 |
| # .size my_weak_func3, .Ltmp1-my_weak_func3 |
| # |
| #Inputs/main-with-global-def.o.yaml: |
| # |
| # int my_func(); |
| # |
| # int my_weak_func2() { |
| # return 200; |
| # } |
| # |
| # int main() { |
| # return my_func(); |
| # } |
| # |
| #------------------------------------------------------------------------------- |
| # The net effect is that this program should return 100. |
| |