2 // RUN
: llvm-mc
-arm-add-build-attributes
-filetype
=obj
-triple
=thumbv7a-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
=0x10000c | FileCheck
--check-prefix
=CHECK1
%s
7 // RUN
: llvm-objdump
--no-print-imm-hex
-d
%t2
--start-address
=0x200000 --stop-address
=0x200002 | FileCheck
--check-prefix
=CHECK2
%s
8 // RUN
: llvm-objdump
--no-print-imm-hex
-d
%t2
--start-address
=0x300000 --stop-address
=0x300002 | FileCheck
--check-prefix
=CHECK3
%s
9 // RUN
: llvm-objdump
--no-print-imm-hex
-d
%t2
--start-address
=0x400000 --stop-address
=0x400006 | FileCheck
--check-prefix
=CHECK4
%s
10 // RUN
: llvm-objdump
--no-print-imm-hex
-d
%t2
--start-address
=0x1000000 --stop-address
=0x1000036 | FileCheck
--check-prefix
=CHECK5
%s
11 // RUN
: llvm-objdump
--no-print-imm-hex
-d
%t2
--start-address
=0x1100000 --stop-address
=0x1100010 | FileCheck
--check-prefix
=CHECK6
%s
12 // RUN
: llvm-objdump
--no-print-imm-hex
-d
%t2
--start-address
=0x1400004 --stop-address
=0x140000c | FileCheck
--check-prefix
=CHECK7
%s
13 // RUN
: llvm-objdump
--no-print-imm-hex
-d
%t2
--start-address
=0x1e00000 --stop-address
=0x1e00006 | FileCheck
--check-prefix
=CHECK8
%s
14 // RUN
: llvm-objdump
--no-print-imm-hex
-d
%t2
--start-address
=0x2200000 --stop-address
=0x220000a | FileCheck
--check-prefix
=CHECK9
%s
15 // RUN
: llvm-objdump
--no-print-imm-hex
-d
%t2
--start-address
=0x2300000 --stop-address
=0x230000a | FileCheck
--check-prefix
=CHECK10
%s
17 // Test the Range extension Thunks for Thumb when all the code is in
a single
18 // OutputSection. The Thumb unconditional branch b.w
and branch
and link
bl
19 // instructions have
a range of
16Mb. We create
a series of Functions
a
20 // megabyte apart. We expect range extension thunks to
be created when
a
21 // branch is out of range. Thunks will
be reused whenever they are in range
24 // Define
a function aligned on
a megabyte boundary
26 .section .text.\suff\(), "ax", %progbits
30 .type tfunc\suff\(), %function
35 .section .text, "ax", %progbits
39 // tfunc00
and tfunc15 are within
16Mb no Range Thunks expected
42 // tfunc16 is
> 16Mb away
, expect
a Range Thunk to
be generated
, to go into
43 // the first of the pre-created ThunkSections.
45 // CHECK1
: Disassembly of section
.text:
47 // CHECK1-NEXT
: <_start
>:
48 // CHECK1-NEXT
: 100000: f0ff fffe
bl 0x200000 <tfunc00
>
49 // CHECK1-NEXT
: 100004: f3ff d7fc
bl 0x1100000 <tfunc15
>
50 // CHECK1-NEXT
: 100008: f2ff d7fc
bl 0x1000004 <__Thumbv7ABSLongThunk_tfunc16
>
54 // CHECK2-NEXT
: 200000: 4770 bx
lr
57 // CHECK3-NEXT
: 300000: 4770 bx
lr
59 // tfunc28 is
> 16Mb away
, expect
a Range Thunk to
be generated
, to go into
60 // the first of the pre-created ThunkSections.
63 // CHECK4-NEXT
: 400000: 4770 bx
lr
64 // CHECK4-NEXT
: 400002: f000
9001 b.w
0x1000008 <__Thumbv7ABSLongThunk_tfunc28
>
77 // Expect precreated ThunkSection here
78 // CHECK5
: <__Thumbv7ABSLongThunk_tfunc16
>:
79 // CHECK5-NEXT
: 1000004: f1ff bffc b.w
0x1200000 <tfunc16
>
80 // CHECK5
: <__Thumbv7ABSLongThunk_tfunc28
>:
81 // CHECK5-NEXT
: 1000008: f1ff
97fa b.w
0x1e00000 <tfunc28
>
82 // CHECK5
: <__Thumbv7ABSLongThunk_tfunc32
>:
83 // CHECK5-NEXT
: 100000c
: f240
0c01 movw
r12, #1
84 // CHECK5-NEXT
: 1000010: f2c0
2c20 movt
r12, #544
85 // CHECK5-NEXT
: 1000014: 4760 bx
r12
86 // CHECK5
: <__Thumbv7ABSLongThunk_tfunc33
>:
87 // CHECK5-NEXT
: 1000016: f240
0c01 movw
r12, #1
88 // CHECK5-NEXT
: 100001a: f2c0
2c30 movt
r12, #560
89 // CHECK5-NEXT
: 100001e
: 4760 bx
r12
90 // CHECK5
: <__Thumbv7ABSLongThunk_tfunc02
>:
91 // CHECK5-NEXT
: 1000020: f7ff
97ee b.w
0x400000 <tfunc02
>
93 // tfunc00
and tfunc01 are
< 16Mb away
, expect no range extension thunks
96 // tfunc32
and tfunc33 are
> 16Mb away
, expect range extension thunks in the
97 // precreated thunk section
100 // CHECK6
: <tfunc15
>:
101 // CHECK6-NEXT
: 1100000: 4770 bx
lr
102 // CHECK6-NEXT
: 1100002: f4ff d7fd
bl 0x200000 <tfunc00
>
103 // CHECK6-NEXT
: 1100006: f5ff d7fb
bl 0x300000 <tfunc01
>
104 // CHECK6-NEXT
: 110000a: f6ff ffff
bl 0x100000c <__Thumbv7ABSLongThunk_tfunc32
>
105 // CHECK6-NEXT
: 110000e
: f700 f802
bl 0x1000016 <__Thumbv7ABSLongThunk_tfunc33
>
109 // Expect another precreated thunk section here
110 // CHECK7
: <__Thumbv7ABSLongThunk_tfunc15
>:
111 // CHECK7-NEXT
: 1400004: f4ff bffc b.w
0x1100000 <tfunc15
>
112 // CHECK7
: <__Thumbv7ABSLongThunk_tfunc16
>:
113 // CHECK7-NEXT
: 1400008: f5ff bffa b.w
0x1200000 <tfunc16
>
124 // tfunc02 is
> 16Mb away
, expect range extension thunks in precreated thunk
126 // CHECK8
: <tfunc28
>:
127 // CHECK8-NEXT
: 1e00000
: 4770 bx
lr
128 // CHECK8-NEXT
: 1e00002
: f600
900d b.w
0x1000020 <__Thumbv7ABSLongThunk_tfunc02
>
135 // tfunc15
and tfunc16 are
> 16 Mb away expect Thunks in the nearest
136 // precreated thunk section.
139 // CHECK9
: <tfunc32
>:
140 // CHECK9
: 2200000: 4770 bx
lr
141 // CHECK9-NEXT
: 2200002: f5ff d7ff
bl 0x1400004 <__Thumbv7ABSLongThunk_tfunc15
>
142 // CHECK9-NEXT
: 2200006: f5ff d7ff
bl 0x1400008 <__Thumbv7ABSLongThunk_tfunc16
>
147 // CHECK10
: <tfunc33
>:
148 // CHECK10
: 2300000: 4770 bx
lr
149 // CHECK10-NEXT
: 2300002: f4ff d7ff
bl 0x1400004 <__Thumbv7ABSLongThunk_tfunc15
>
150 // CHECK10-NEXT
: 2300006: f4ff d7ff
bl 0x1400008 <__Thumbv7ABSLongThunk_tfunc16
>