[clang-tidy][modernize-use-starts-ends-with] Fix operator rewriting false negative...
[llvm-project.git] / lld / test / ELF / arm-thumb-range-thunk-os.s
blob3dac7c53e4bf4f3a4d44a3e526a01a9f00f6d299
1 // REQUIRES: arm
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
22 .syntax unified
24 // Define a function aligned on a megabyte boundary
25 .macro FUNCTION suff
26 .section .text.\suff\(), "ax", %progbits
27 .thumb
28 .balign 0x100000
29 .globl tfunc\suff\()
30 .type tfunc\suff\(), %function
31 tfunc\suff\():
32 bx lr
33 .endm
35 .section .text, "ax", %progbits
36 .thumb
37 .globl _start
38 _start:
39 // tfunc00 and tfunc15 are within 16Mb no Range Thunks expected
40 bl tfunc00
41 bl tfunc15
42 // tfunc16 is > 16Mb away, expect a Range Thunk to be generated, to go into
43 // the first of the pre-created ThunkSections.
44 bl tfunc16
45 // CHECK1: Disassembly of section .text:
46 // CHECK1-EMPTY:
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>
52 FUNCTION 00
53 // CHECK2: <tfunc00>:
54 // CHECK2-NEXT: 200000: 4770 bx lr
55 FUNCTION 01
56 // CHECK3: <tfunc01>:
57 // CHECK3-NEXT: 300000: 4770 bx lr
58 FUNCTION 02
59 // tfunc28 is > 16Mb away, expect a Range Thunk to be generated, to go into
60 // the first of the pre-created ThunkSections.
61 b.w tfunc28
62 // CHECK4: <tfunc02>:
63 // CHECK4-NEXT: 400000: 4770 bx lr
64 // CHECK4-NEXT: 400002: f000 9001 b.w 0x1000008 <__Thumbv7ABSLongThunk_tfunc28>
65 FUNCTION 03
66 FUNCTION 04
67 FUNCTION 05
68 FUNCTION 06
69 FUNCTION 07
70 FUNCTION 08
71 FUNCTION 09
72 FUNCTION 10
73 FUNCTION 11
74 FUNCTION 12
75 FUNCTION 13
76 FUNCTION 14
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>
92 FUNCTION 15
93 // tfunc00 and tfunc01 are < 16Mb away, expect no range extension thunks
94 bl tfunc00
95 bl tfunc01
96 // tfunc32 and tfunc33 are > 16Mb away, expect range extension thunks in the
97 // precreated thunk section
98 bl tfunc32
99 bl tfunc33
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>
106 FUNCTION 16
107 FUNCTION 17
108 FUNCTION 18
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>
114 FUNCTION 19
115 FUNCTION 20
116 FUNCTION 21
117 FUNCTION 22
118 FUNCTION 23
119 FUNCTION 24
120 FUNCTION 25
121 FUNCTION 26
122 FUNCTION 27
123 FUNCTION 28
124 // tfunc02 is > 16Mb away, expect range extension thunks in precreated thunk
125 // section
126 // CHECK8: <tfunc28>:
127 // CHECK8-NEXT: 1e00000: 4770 bx lr
128 // CHECK8-NEXT: 1e00002: f600 900d b.w 0x1000020 <__Thumbv7ABSLongThunk_tfunc02>
130 b.w tfunc02
131 FUNCTION 29
132 FUNCTION 30
133 FUNCTION 31
134 FUNCTION 32
135 // tfunc15 and tfunc16 are > 16 Mb away expect Thunks in the nearest
136 // precreated thunk section.
137 bl tfunc15
138 bl tfunc16
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>
144 FUNCTION 33
145 bl tfunc15
146 bl 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>