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
-d
%t2
--start-address
=0x100000 --stop-address
=0x10000c | FileCheck
--check-prefix
=CHECK1
%s
7 // RUN
: llvm-objdump
-d
%t2
--start-address
=0x200000 --stop-address
=0x200002 | FileCheck
--check-prefix
=CHECK2
%s
8 // RUN
: llvm-objdump
-d
%t2
--start-address
=0x300000 --stop-address
=0x300002 | FileCheck
--check-prefix
=CHECK3
%s
9 // RUN
: llvm-objdump
-d
%t2
--start-address
=0x400000 --stop-address
=0x400006 | FileCheck
--check-prefix
=CHECK4
%s
10 // RUN
: llvm-objdump
-d
%t2
--start-address
=0x1000000 --stop-address
=0x1000036 | FileCheck
--check-prefix
=CHECK5
%s
11 // RUN
: llvm-objdump
-d
%t2
--start-address
=0x1100000 --stop-address
=0x1100010 | FileCheck
--check-prefix
=CHECK6
%s
12 // RUN
: llvm-objdump
-d
%t2
--start-address
=0x1400004 --stop-address
=0x140000c | FileCheck
--check-prefix
=CHECK7
%s
13 // RUN
: llvm-objdump
-d
%t2
--start-address
=0x1e00000 --stop-address
=0x1e00006 | FileCheck
--check-prefix
=CHECK8
%s
14 // RUN
: llvm-objdump
-d
%t2
--start-address
=0x2200000 --stop-address
=0x220000a | FileCheck
--check-prefix
=CHECK9
%s
15 // RUN
: llvm-objdump
-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: ff
f0 fe ff
bl 0x200000 <tfunc00
>
49 // CHECK1-NEXT
: 100004: ff
f3 fc d7
bl 0x1100000 <tfunc15
>
50 // CHECK1-NEXT
: 100008: ff
f2 fc d7
bl 0x1000004 <__Thumbv7ABSLongThunk_tfunc16
>
54 // CHECK2-NEXT
: 200000: 70 47 bx
lr
57 // CHECK3-NEXT
: 300000: 70 47 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: 70 47 bx
lr
64 // CHECK4-NEXT
: 400002: 00 f0 01 90 b.w
0x1000008 <__Thumbv7ABSLongThunk_tfunc28
>
77 // Expect precreated ThunkSection here
78 // CHECK5
: <__Thumbv7ABSLongThunk_tfunc16
>:
79 // CHECK5-NEXT
: 1000004: ff
f1 fc
bf b.w
0x1200000 <tfunc16
>
80 // CHECK5
: <__Thumbv7ABSLongThunk_tfunc28
>:
81 // CHECK5-NEXT
: 1000008: ff
f1 fa 97 b.w
0x1e00000 <tfunc28
>
82 // CHECK5
: <__Thumbv7ABSLongThunk_tfunc32
>:
83 // CHECK5-NEXT
: 100000c
: 40 f2 01 0c movw
r12, #1
84 // CHECK5-NEXT
: 1000010: c0
f2 20 2c movt
r12, #544
85 // CHECK5-NEXT
: 1000014: 60 47 bx
r12
86 // CHECK5
: <__Thumbv7ABSLongThunk_tfunc33
>:
87 // CHECK5-NEXT
: 1000016: 40 f2 01 0c movw
r12, #1
88 // CHECK5-NEXT
: 100001a: c0
f2 30 2c movt
r12, #560
89 // CHECK5-NEXT
: 100001e
: 60 47 bx
r12
90 // CHECK5
: <__Thumbv7ABSLongThunk_tfunc02
>:
91 // CHECK5-NEXT
: 1000020: ff
f7 ee
97 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: 70 47 bx
lr
102 // CHECK6-NEXT
: 1100002: ff
f4 fd d7
bl 0x200000 <tfunc00
>
103 // CHECK6-NEXT
: 1100006: ff
f5 fb d7
bl 0x300000 <tfunc01
>
104 // CHECK6-NEXT
: 110000a: ff
f6 ff ff
bl 0x100000c <__Thumbv7ABSLongThunk_tfunc32
>
105 // CHECK6-NEXT
: 110000e
: 00 f7 02 f8 bl 0x1000016 <__Thumbv7ABSLongThunk_tfunc33
>
109 // Expect another precreated thunk section here
110 // CHECK7
: <__Thumbv7ABSLongThunk_tfunc15
>:
111 // CHECK7-NEXT
: 1400004: ff
f4 fc
bf b.w
0x1100000 <tfunc15
>
112 // CHECK7
: <__Thumbv7ABSLongThunk_tfunc16
>:
113 // CHECK7-NEXT
: 1400008: ff
f5 fa bf b.w
0x1200000 <tfunc16
>
124 // tfunc02 is
> 16Mb away
, expect range extension thunks in precreated thunk
126 // CHECK8
: <tfunc28
>:
127 // CHECK8-NEXT
: 1e00000
: 70 47 bx
lr
128 // CHECK8-NEXT
: 1e00002
: 00 f6 0d
90 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: 70 47 bx
lr
141 // CHECK9-NEXT
: 2200002: ff
f5 ff d7
bl 0x1400004 <__Thumbv7ABSLongThunk_tfunc15
>
142 // CHECK9-NEXT
: 2200006: ff
f5 ff d7
bl 0x1400008 <__Thumbv7ABSLongThunk_tfunc16
>
147 // CHECK10
: <tfunc33
>:
148 // CHECK10
: 2300000: 70 47 bx
lr
149 // CHECK10-NEXT
: 2300002: ff
f4 ff d7
bl 0x1400004 <__Thumbv7ABSLongThunk_tfunc15
>
150 // CHECK10-NEXT
: 2300006: ff
f4 ff d7
bl 0x1400008 <__Thumbv7ABSLongThunk_tfunc16
>