aboutsummaryrefslogtreecommitdiff
path: root/test/ELF/ppc64-long-branch.s
diff options
context:
space:
mode:
Diffstat (limited to 'test/ELF/ppc64-long-branch.s')
-rw-r--r--test/ELF/ppc64-long-branch.s121
1 files changed, 121 insertions, 0 deletions
diff --git a/test/ELF/ppc64-long-branch.s b/test/ELF/ppc64-long-branch.s
new file mode 100644
index 000000000000..db662d926df0
--- /dev/null
+++ b/test/ELF/ppc64-long-branch.s
@@ -0,0 +1,121 @@
+# REQUIRES: ppc
+
+# RUN: llvm-mc -filetype=obj -triple=powerpc64le-unknown-linux %s -o %t.o
+# RUN: llvm-mc -filetype=obj -triple=powerpc64le-unknown-linux %p/Inputs/ppc64-func-global-entry.s -o %t2.o
+# RUN: ld.lld -shared %t2.o -o %t3.so
+# RUN: ld.lld --no-toc-optimize %t.o %t3.so -o %t
+# RUN: llvm-objdump -d -start-address=0x10010000 -stop-address=0x10010018 %t | FileCheck %s -check-prefix=CALLEE_DUMP
+# RUN: llvm-objdump -d -start-address=0x12010020 -stop-address=0x12010084 %t | FileCheck %s -check-prefix=CALLER_DUMP
+# RUN: llvm-objdump -D -start-address=0x12020008 -stop-address=0x12020010 %t | FileCheck %s -check-prefix=BRANCH_LT_LE
+# RUN: llvm-readelf --sections %t | FileCheck %s -check-prefix=SECTIONS
+
+# RUN: llvm-mc -filetype=obj -triple=powerpc64-unknown-linux %s -o %t.o
+# RUN: llvm-mc -filetype=obj -triple=powerpc64-unknown-linux %p/Inputs/ppc64-func-global-entry.s -o %t2.o
+# RUN: ld.lld -shared %t2.o -o %t3.so
+# RUN: ld.lld --no-toc-optimize %t.o %t3.so -o %t
+# RUN: llvm-objdump -d -start-address=0x10010000 -stop-address=0x10010018 %t | FileCheck %s -check-prefix=CALLEE_DUMP
+# RUN: llvm-objdump -d -start-address=0x12010020 -stop-address=0x12010084 %t | FileCheck %s -check-prefix=CALLER_DUMP
+# RUN: llvm-objdump -D -start-address=0x12020008 -stop-address=0x12020010 %t | FileCheck %s -check-prefix=BRANCH_LT_BE
+# RUN: llvm-readelf --sections %t | FileCheck %s -check-prefix=SECTIONS
+
+ .text
+ .abiversion 2
+ .protected callee
+ .globl callee
+ .p2align 4
+ .type callee,@function
+callee:
+.Lfunc_gep0:
+ addis 2, 12, .TOC.-.Lfunc_gep0@ha
+ addi 2, 2, .TOC.-.Lfunc_gep0@l
+.Lfunc_lep0:
+ .localentry callee, .Lfunc_lep0-.Lfunc_gep0
+ addis 4, 2, .LC0@toc@ha
+ ld 4, .LC0@toc@l(4)
+ lwz 3, 0(4)
+ blr
+
+ .space 0x2000000
+
+ .protected _start
+ .global _start
+ .p2align 4
+ .type _start,@function
+_start:
+.Lfunc_begin1:
+.Lfunc_gep1:
+ addis 2, 12, .TOC.-.Lfunc_gep1@ha
+ addi 2, 2, .TOC.-.Lfunc_gep1@l
+.Lfunc_lep1:
+ .localentry _start, .Lfunc_lep1-.Lfunc_gep1
+ mflr 0
+ std 0, 16(1)
+ stdu 1, -32(1)
+ bl callee
+ bl foo_external_diff
+ nop
+ addi 1, 1, 32
+ ld 0, 16(1)
+ mtlr 0
+
+ addis 4, 2, .LC1@toc@ha
+ ld 4, .LC1@toc@l(4)
+ lwz 4, 0(4)
+ add 3, 3, 4
+ blr
+
+
+ .section .toc,"aw",@progbits
+.LC0:
+ .tc a[TC],a
+.LC1:
+ .tc b[TC],b
+
+
+ .data
+ .type a,@object
+ .globl a
+ .p2align 2
+a:
+ .long 11
+ .size a, 4
+
+ .type b,@object
+ .global b
+ .p2align 2
+b:
+ .long 33
+ .size b, 4
+
+# Verify address of the callee
+# CALLEE_DUMP: callee:
+# CALLEE_DUMP: 10010000: {{.*}} addis 2, 12, 515
+# CALLEE_DUMP: 10010004: {{.*}} addi 2, 2, -32544
+# CALLEE_DUMP: 10010008: {{.*}} addis 4, 2, 0
+
+# Verify the address of _start, and the call to the long-branch thunk.
+# CALLER_DUMP: _start:
+# CALLER_DUMP: 12010020: {{.*}} addis 2, 12, 3
+# CALLER_DUMP: 12010038: {{.*}} bl .+56
+
+# Verify the thunks contents: TOC-pointer + offset = .branch_lt[0]
+# 0x120380e8 + (-2 << 16 + 32552) = 0x12020008
+# CALLER_DUMP: __long_branch_callee:
+# CALLER_DUMP: 12010060: {{.*}} addis 12, 2, -2
+# CALLER_DUMP: 12010064: {{.*}} ld 12, 32552(12)
+# CALLER_DUMP: 12010068: {{.*}} mtctr 12
+# CALLER_DUMP: 1201006c: {{.*}} bctr
+
+# BRANCH_LT_LE: Disassembly of section .branch_lt:
+# BRANCH_LT_LE-NEXT: .branch_lt:
+# BRANCH_LT_LE-NEXT: 12020008: 08 00 01 10
+# BRANCH_LT_LE-NEXT: 1202000c: 00 00 00 00
+
+# BRANCH_LT_BE: Disassembly of section .branch_lt:
+# BRANCH_LT_BE-NEXT: .branch_lt:
+# BRANCH_LT_BE-NEXT: 12020008: 00 00 00 00
+# BRANCH_LT_BE-NEXT: 1202000c: 10 01 00 08
+
+# [Nr] Name Type Address Off Size
+# SECTIONS: [ 9] .branch_lt PROGBITS 0000000012020008 2020008 000008
+# SECTIONS: [11] .got PROGBITS 00000000120300e0 20300e0 000008