blob: 095fabb17ab86408787a322b5b3dd0519bb26d06 [file] [log] [blame]
#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.