[memprof] Remove an unused using directive (#117004)
[llvm-project.git] / lld / test / ELF / arm-thunk-multipass.s
blob210d9634624bc4e93ac18937f1cf3261353b7825
1 // REQUIRES: arm
2 // RUN: llvm-mc -arm-add-build-attributes -filetype=obj -triple=armv7a-none-linux-gnueabi %s -o %t
3 // RUN: ld.lld %t -o %t2
4 // The output file is large, most of it zeroes. We dissassemble only the
5 // parts we need to speed up the test and avoid a large output file
6 // RUN: llvm-objdump --no-print-imm-hex -d %t2 --start-address=0x100002 --stop-address=0x10000a | FileCheck --check-prefix=CHECK1 %s
7 // RUN: llvm-objdump --no-print-imm-hex -d %t2 --start-address=0x1000004 --stop-address=0x1000026 | FileCheck --check-prefix=CHECK2 %s
8 // RUN: llvm-objdump --no-print-imm-hex -d %t2 --start-address=0x1100014 --stop-address=0x1100022 | FileCheck --check-prefix=CHECK3 %s
9 // In this test case a branch that is in range and does not need its range
10 // extended can be pushed out of range by another Thunk, necessitating another
11 // pass
13 .macro FUNCTION suff
14 .section .text.\suff\(), "ax", %progbits
15 .thumb
16 .balign 0x100000
17 .globl tfunc\suff\()
18 .type tfunc\suff\(), %function
19 tfunc\suff\():
20 bx lr
21 .endm
23 FUNCTION 00
24 .globl _start
25 _start:
26 bl target
27 b.w arm_target
28 // arm_target is in range but needs an interworking thunk
29 // CHECK1: <_start>:
30 // CHECK1-NEXT: 100002: f300 d006 bl 0x1000012 <__Thumbv7ABSLongThunk_target>
31 // CHECK1-NEXT: 100006: f2ff 97ff b.w 0x1000008 <__Thumbv7ABSLongThunk_arm_target>
32 nop
33 nop
34 nop
35 .globl target2
36 .type target2, %function
37 nop
39 target2:
40 FUNCTION 01
41 FUNCTION 02
42 FUNCTION 03
43 FUNCTION 04
44 FUNCTION 05
45 FUNCTION 06
46 FUNCTION 07
47 FUNCTION 08
48 FUNCTION 09
49 FUNCTION 10
50 FUNCTION 11
51 FUNCTION 12
52 FUNCTION 13
53 FUNCTION 14
54 FUNCTION 15
56 .section .text.16, "ax", %progbits
57 .arm
58 .globl arm_target
59 .type arm_target, %function
60 arm_target:
61 bx lr
62 // CHECK2: 01000004 <arm_target>:
63 // CHECK2: <__Thumbv7ABSLongThunk_arm_target>:
64 // CHECK2-NEXT: 1000008: f240 0c04 movw r12, #4
65 // CHECK2-NEXT: 100000c: f2c0 1c00 movt r12, #256
66 // CHECK2-NEXT: 1000010: 4760 bx r12
67 // CHECK2: <__Thumbv7ABSLongThunk_target>:
68 // CHECK2-NEXT: 1000012: f0ff bfff b.w 0x1100014 <target>
69 // CHECK2: <__Thumbv7ABSLongThunk_target2>:
70 // CHECK2-NEXT: 1000016: f4ff 97fc b.w 0x100012 <target2>
72 .section .text.17, "ax", %progbits
73 // Just enough space so that bl target is in range if no extension thunks are
74 // generated.
76 .space 0x100000 - 6
78 .section .text.18, "ax", %progbits
79 .thumb
80 .globl target
81 .type target, %function
82 // target is at maximum ARM branch range away from caller.
83 target:
84 // Similar case in the backwards direction
85 bl target2
86 nop
87 nop
88 bx lr
89 // CHECK3: <target>:
90 // CHECK3-NEXT: 1100014: f6ff ffff bl 0x1000016 <__Thumbv7ABSLongThunk_target2>
91 // CHECK3-NEXT: 1100018: bf00 nop
92 // CHECK3-NEXT: 110001a: bf00 nop
93 // CHECK3-NEXT: 110001c: 4770 bx lr