summaryrefslogtreecommitdiff
path: root/test/elf/consecutive-weak-sym-defs.test
diff options
context:
space:
mode:
Diffstat (limited to 'test/elf/consecutive-weak-sym-defs.test')
-rw-r--r--test/elf/consecutive-weak-sym-defs.test81
1 files changed, 81 insertions, 0 deletions
diff --git a/test/elf/consecutive-weak-sym-defs.test b/test/elf/consecutive-weak-sym-defs.test
new file mode 100644
index 000000000000..095fabb17ab8
--- /dev/null
+++ b/test/elf/consecutive-weak-sym-defs.test
@@ -0,0 +1,81 @@
+#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.
+