2 // RUN
: llvm-mc
-arm-add-build-attributes
-filetype
=obj
-triple
=thumbv7a-none-linux-gnueabi
%s
-o
%t.o
3 // RUN
: ld.lld
%t.o
-o
%t
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
-d
%t --print-imm-hex
--start-address
=0x80000 --stop-address
=0x80010 | FileCheck
--check-prefix
=CHECK1
%s
7 // RUN
: llvm-objdump
-d
%t --print-imm-hex
--start-address
=0x100000 --stop-address
=0x100008 | FileCheck
--check-prefix
=CHECK2
%s
8 // RUN
: llvm-objdump
-d
%t --print-imm-hex
--start-address
=0x180000 --stop-address
=0x18000a | FileCheck
--check-prefix
=CHECK3
%s
9 // RUN
: llvm-objdump
-d
%t --print-imm-hex
--start-address
=0x500004 --stop-address
=0x500008 | FileCheck
--check-prefix
=CHECK4
%s
10 // RUN
: llvm-objdump
-d
%t --print-imm-hex
--start-address
=0x580000 --stop-address
=0x580006 | FileCheck
--check-prefix
=CHECK5
%s
11 // RUN
: llvm-objdump
-d
%t --print-imm-hex
--start-address
=0x1000004 --stop-address
=0x100000c | FileCheck
--check-prefix
=CHECK6
%s
12 // RUN
: llvm-objdump
-d
%t --print-imm-hex
--start-address
=0x1100000 --stop-address
=0x1100006 | FileCheck
--check-prefix
=CHECK7
%s
13 // Test Range extension Thunks for the Thumb conditional branch instruction.
14 // This instruction only has
a range of
1Mb whereas all the other Thumb wide
15 // Branch instructions have
16Mb range. We still place our pre-created Thunk
16 // Sections at
16Mb intervals as conditional branches to
a target defined
17 // in
a different section are rare.
19 // Define
a function aligned on
a half megabyte boundary
21 .section .text.\suff\(), "ax", %progbits
25 .type tfunc\suff\(), %function
33 // Long Range Thunk needed for
16Mb range branch
, can reach pre-created Thunk
36 // CHECK1
: Disassembly of section
.text:
38 // CHECK1-NEXT
: <tfunc00
>:
39 // CHECK1-NEXT
: 80000: 4770 bx
lr
40 // CHECK1-NEXT
: 80002: f37f d7ff
bl 0x1000004 <__Thumbv7ABSLongThunk_tfunc33
>
41 // CHECK1
: <__Thumbv7ABSLongThunk_tfunc05
>:
42 // CHECK1-NEXT
: 80008: f27f bffa b.w
0x300000 <tfunc05
>
43 // CHECK1
: <__Thumbv7ABSLongThunk_tfunc00
>:
44 // CHECK1-NEXT
: 8000c
: f7ff bff8 b.w
0x80000 <tfunc00
>
46 // tfunc02 is within range of tfunc02
48 // tfunc05 is out of range
, and we can
't reach the pre-created Thunk Section
52 // CHECK2-NEXT: 100000: 4770 bx lr
53 // CHECK2-NEXT: 100002: f03f a7fd beq.w 0x180000 <tfunc02>
54 // CHECK2-NEXT: 100006: f47f a7ff bne.w 0x80008 <__Thumbv7ABSLongThunk_tfunc05>
56 // We can reach the Thunk Section created for bne.w tfunc05
59 // CHECK3: 180000: 4770 bx lr
60 // CHECK3-NEXT: 180002: f440 8001 bne.w 0x80008 <__Thumbv7ABSLongThunk_tfunc05>
61 // CHECK3-NEXT: 180006: f400 8001 beq.w 0x8000c <__Thumbv7ABSLongThunk_tfunc00>
69 // CHECK4: <__Thumbv7ABSLongThunk_tfunc03>:
70 // CHECK4-NEXT: 500004: f4ff bffc b.w 0x200000 <tfunc03>
72 // We can't reach any Thunk Section
, create
a new one
75 // CHECK5-NEXT
: 580000: 4770 bx
lr
76 // CHECK5-NEXT
: 580002: f43f a7ff beq.w
0x500004 <__Thumbv7ABSLongThunk_tfunc03
>
98 // CHECK6
: <__Thumbv7ABSLongThunk_tfunc33
>:
99 // CHECK6-NEXT
: 1000004: f0ff bffc b.w
0x1100000 <tfunc33
>
100 // CHECK6
: <__Thumbv7ABSLongThunk_tfunc00
>:
101 // CHECK6-NEXT
: 1000008: f47f
97fa b.w
0x80000 <tfunc00
>
104 // We should
be able to reach an existing ThunkSection.
106 // CHECK7
: <tfunc33
>:
107 // CHECK7-NEXT
: 1100000: 4770 bx
lr
108 // CHECK7-NEXT
: 1100002: f700 b801 b.w
0x1000008 <__Thumbv7ABSLongThunk_tfunc00
>