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
=0x100000 --stop-address
=0x10001c --triple
=armv7a-linux-gnueabihf | FileCheck
--check-prefix
=CHECK1
%s
7 // RUN
: llvm-objdump
--no-print-imm-hex
-d
%t2
--start-address
=0x200000 --stop-address
=0x20000a | FileCheck
--check-prefix
=CHECK2
%s
8 // RUN
: llvm-objdump
--no-print-imm-hex
-d
%t2
--start-address
=0x1000004 --stop-address
=0x1000010 --triple
=armv7a-linux-gnueabihf | FileCheck
--check-prefix
=CHECK3
%s
9 // RUN
: llvm-objdump
--no-print-imm-hex
-d
%t2
--start-address
=0x1000010 --stop-address
=0x100001a | FileCheck
--check-prefix
=CHECK4
%s
10 // RUN
: llvm-objdump
--no-print-imm-hex
-d
%t2
--start-address
=0x1f00004 --stop-address
=0x1f0000e | FileCheck
--check-prefix
=CHECK5
%s
11 // RUN
: llvm-objdump
--no-print-imm-hex
-d
%t2
--start-address
=0x2200000 --stop-address
=0x2200006 | FileCheck
--check-prefix
=CHECK6
%s
12 // RUN
: llvm-objdump
--no-print-imm-hex
-d
%t2
--start-address
=0x2300000 --stop-address
=0x2300008 --triple
=armv7a-linux-gnueabihf | FileCheck
--check-prefix
=CHECK7
%s
13 // RUN
: llvm-objdump
--no-print-imm-hex
-d
%t2
--start-address
=0x2e00004 --stop-address
=0x2e00010 --triple
=armv7a-linux-gnueabihf | FileCheck
--check-prefix
=CHECK8
%s
14 // RUN
: llvm-objdump
--no-print-imm-hex
-d
%t2
--start-address
=0x3300004 --stop-address
=0x3300010 | FileCheck
--check-prefix
=CHECK9
%s
15 // RUN
: llvm-objdump
--no-print-imm-hex
-d
%t2
--start-address
=0x4100000 --stop-address
=0x410000c --triple
=armv7a-linux-gnueabihf | FileCheck
--check-prefix
=CHECK10
%s
16 // RUN
: llvm-objdump
--no-print-imm-hex
-d
%t2
--start-address
=0x4200000 --stop-address
=0x4200008 | FileCheck
--check-prefix
=CHECK11
%s
18 // Test the Range extension Thunks for ARM
and Thumb when all the code is in
a
19 // single OutputSection. The ARM branches
and branch
and link instructions
20 // have
a range of
32Mb
, the Thumb unconditional branch
and
21 // branch
and link instructions have
. We create a series of Functions a
22 // megabyte apart. We expect range extension thunks to
be created when
a
23 // branch is out of range. Thunks will
be reused whenever they are in range
26 // Define
a function aligned on
a megabyte boundary
27 .macro ARMFUNCTION suff
28 .section .text.\suff\(), "ax", %progbits
32 .type afunc\suff\(), %function
37 // Define
a function aligned on
a megabyte boundary
38 .macro THUMBFUNCTION suff
39 .section .text.\suff\(), "ax", %progbits
43 .type tfunc\suff\(), %function
48 .section .text, "ax", %progbits
54 // Expect ARM
bl to
be in range
(can use blx to change state
)
56 // ARM
b and beq are in range but need Thunk to change state to Thumb
59 // afunc32 is out of range of ARM branch
and branch
and link
64 // CHECK1-NEXT
: 100000: e12fff1e bx
lr
65 // CHECK1-NEXT
: 100004: fa7bfffd blx
0x2000000 <tfunc31
>
66 // CHECK1-NEXT
: 100008: ea3bfffd
b 0x1000004 <__ARMv7ABSLongThunk_tfunc31
>
67 // CHECK1-NEXT
: 10000c
: 0a3bfffc
beq 0x1000004 <__ARMv7ABSLongThunk_tfunc31
>
68 // CHECK1-NEXT
: 100010: eb7ffffa
bl 0x2100000 <afunc32
>
69 // CHECK1-NEXT
: 100014: ea7ffff9
b 0x2100000 <afunc32
>
70 // CHECK1-NEXT
: 100018: 1a7ffff8
bne 0x2100000 <afunc32
>
72 // Expect Thumb
bl to
be in range
(can use blx to change state
)
74 // In range but need thunk to change state to Thumb
77 // CHECK2-NEXT
: 200000: 4770 bx
lr
78 // CHECK2-NEXT
: 200002: f0ff c7fe blx
0xf00000 <afunc14
>
79 // CHECK2-NEXT
: 200006: f200
9003 b.w
0x1000010 <__Thumbv7ABSLongThunk_afunc14
>
94 // CHECK3
: <__ARMv7ABSLongThunk_tfunc31
>:
95 // CHECK3-NEXT
: 1000004: e300c001 movw
r12, #1
96 // CHECK3-NEXT
: 1000008: e340c200 movt
r12, #512
97 // CHECK3-NEXT
: 100000c
: e12fff1c bx
r12
98 // CHECK4
: <__Thumbv7ABSLongThunk_afunc14
>:
99 // CHECK4-NEXT
: 1000010: f240
0c00 movw
r12, #0
100 // CHECK4-NEXT
: 1000014: f2c0
0cf0 movt
r12, #240
101 // CHECK4-NEXT
: 1000018: 4760 bx
r12
118 // Expect precreated Thunk Section here
119 // CHECK5
: <__Thumbv7ABSLongThunk_afunc00
>:
120 // CHECK5-NEXT
: 1f00004
: f240
0c00 movw
r12, #0
121 // CHECK5-NEXT
: 1f00008
: f2c0
0c10 movt
r12, #16
122 // CHECK5-NEXT
: 1f0000c
: 4760 bx
r12
126 // Out of range
, can only reach closest Thunk Section
128 // CHECK6
: <tfunc33
>:
129 // CHECK6-NEXT
: 2200000: 4770 bx
lr
130 // CHECK6-NEXT
: 2200002: f4ff ffff
bl 0x1f00004 <__Thumbv7ABSLongThunk_afunc00
>
132 // Out of range
, can reach earlier Thunk Section
133 // CHECK7
: <afunc34
>:
134 // CHECK7-NEXT
: 2300000: e12fff1e bx
lr
135 // CHECK7-NEXT
: 2300004: faeffffe blx
0x1f00004 <__Thumbv7ABSLongThunk_afunc00
>
148 // Expect precreated Thunk Section here
149 // CHECK8
: <__ARMv7ABSLongThunk_tfunc35
>:
150 // CHECK8-NEXT
: 2e00004
: e300c001 movw
r12, #1
151 // CHECK8-NEXT
: 2e00008
: e340c240 movt
r12, #576
152 // CHECK8-NEXT
: 2e0000c
: e12fff1c bx
r12
158 // Expect precreated Thunk Section here
159 // CHECK9
: <__Thumbv7ABSLongThunk_afunc34
>:
160 // CHECK9-NEXT
: 3300004: f240
0c00 movw
r12, #0
161 // CHECK9-NEXT
: 3300008: f2c0
2c30 movt
r12, #560
162 // CHECK9-NEXT
: 330000c
: 4760 bx
r12
163 // CHECK9
: <__Thumbv7ABSLongThunk_tfunc35
>:
164 // CHECK9-NEXT
: 330000e
: f4ff
97f7 b.w
0x2400000 <tfunc35
>
179 // afunc34 is in range
, as is tfunc35 but
a branch needs
a state change Thunk
182 // CHECK10
: <afunc64
>:
183 // CHECK10-NEXT
: 4100000: e12fff1e bx
lr
184 // CHECK10-NEXT
: 4100004: eb87fffd
bl 0x2300000 <afunc34
>
185 // CHECK10-NEXT
: 4100008: eab3fffd
b 0x2e00004 <__ARMv7ABSLongThunk_tfunc35
>
187 // afunc34
and tfunc35 are both out of range
190 // CHECK11
: <tfunc65
>:
191 // CHECK11
: 4200000: 4770 bx
lr
192 // CHECK11-NEXT
: 4200002: f4ff d7ff
bl 0x3300004 <__Thumbv7ABSLongThunk_afunc34
>
193 // CHECK11-NEXT
: 4200006: f500 d002
bl 0x330000e <__Thumbv7ABSLongThunk_tfunc35
>