]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/ELF/arm-thumb-condbranch-thunk.s
Vendor import of lld trunk r338150:
[FreeBSD/FreeBSD.git] / test / ELF / arm-thumb-condbranch-thunk.s
1 // REQUIRES: arm
2 // RUN: llvm-mc -filetype=obj -triple=thumbv7a-none-linux-gnueabi %s -o %t
3 // RUN: ld.lld %t -o %t2 2>&1
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=524288 -stop-address=524316 -triple=thumbv7a-linux-gnueabihf | FileCheck -check-prefix=CHECK1 %s
7 // RUN: llvm-objdump -d %t2 -start-address=1048576 -stop-address=1048584 -triple=thumbv7a-linux-gnueabihf | FileCheck -check-prefix=CHECK2 %s
8 // RUN: llvm-objdump -d %t2 -start-address=1572864 -stop-address=1572872 -triple=thumbv7a-linux-gnueabihf | FileCheck -check-prefix=CHECK3 %s
9 // RUN: llvm-objdump -d %t2 -start-address=5242884 -stop-address=5242894 -triple=thumbv7a-linux-gnueabihf | FileCheck -check-prefix=CHECK4 %s
10 // RUN: llvm-objdump -d %t2 -start-address=5767168 -stop-address=5767174 -triple=thumbv7a-linux-gnueabihf | FileCheck -check-prefix=CHECK5 %s
11 // RUN: llvm-objdump -d %t2 -start-address=16777220 -stop-address=16777240 -triple=thumbv7a-linux-gnueabihf | FileCheck -check-prefix=CHECK6 %s
12 // RUN: llvm-objdump -d %t2 -start-address=17825792 -stop-address=17825798 -triple=thumbv7a-linux-gnueabihf | 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.
18  .syntax unified
19 // Define a function aligned on a half megabyte boundary
20  .macro FUNCTION suff
21  .section .text.\suff\(), "ax", %progbits
22  .thumb
23  .balign 0x80000
24  .globl tfunc\suff\()
25  .type  tfunc\suff\(), %function
26 tfunc\suff\():
27  bx lr
28  .endm
29
30  .globl _start
31 _start:
32  FUNCTION 00
33 // Long Range Thunk needed for 16Mb range branch, can reach pre-created Thunk
34 // Section
35  bl tfunc33
36 // CHECK1: Disassembly of section .text:
37 // CHECK1-NEXT: tfunc00:
38 // CHECK1-NEXT:    80000:       70 47   bx      lr
39 // CHECK1-NEXT:    80002:       7f f3 ff d7     bl      #16252926
40 // CHECK1: __Thumbv7ABSLongThunk_tfunc05:
41 // CHECK1-NEXT:    80008:       7f f2 fa bf     b.w     #2621428 <tfunc05>
42 // CHECK1: __Thumbv7ABSLongThunk_tfunc00:
43 // CHECK1-NEXT:    8000c:       ff f7 f8 bf     b.w     #-16 <tfunc00>
44  FUNCTION 01
45 // tfunc02 is within range of tfunc02
46  beq.w tfunc02
47 // tfunc05 is out of range, and we can't reach the pre-created Thunk Section
48 // create a new one.
49  bne.w tfunc05
50 // CHECK2:  tfunc01:
51 // CHECK2-NEXT:   100000:       70 47   bx      lr
52 // CHECK2-NEXT:   100002:       3f f0 fd a7     beq.w   #524282 <tfunc02>
53 // CHECK2-NEXT:   100006:       7f f4 ff a7     bne.w   #-524290 <__Thumbv7ABSLongThunk_tfunc05>
54  FUNCTION 02
55 // We can reach the Thunk Section created for bne.w tfunc05
56  bne.w tfunc05
57  beq.w tfunc00
58 // CHECK3:   180000:       70 47   bx      lr
59 // CHECK3-NEXT:   180002:       40 f4 01 80     bne.w   #-1048574 <__Thumbv7ABSLongThunk_tfunc05>
60 // CHECK3-NEXT:   180006:       00 f4 01 80     beq.w   #-1048574 <__Thumbv7ABSLongThunk_tfunc00>
61  FUNCTION 03
62  FUNCTION 04
63  FUNCTION 05
64  FUNCTION 06
65  FUNCTION 07
66  FUNCTION 08
67  FUNCTION 09
68 // CHECK4:  __Thumbv7ABSLongThunk_tfunc03:
69 // CHECK4-NEXT:   500004:       ff f4 fc bf     b.w     #-3145736 <tfunc03>
70  FUNCTION 10
71 // We can't reach any Thunk Section, create a new one
72  beq.w tfunc03
73 // CHECK5: tfunc10:
74 // CHECK5-NEXT:   580000:       70 47   bx      lr
75 // CHECK5-NEXT:   580002:       3f f4 ff a7     beq.w   #-524290 <__Thumbv7ABSLongThunk_tfunc03>
76  FUNCTION 11
77  FUNCTION 12
78  FUNCTION 13
79  FUNCTION 14
80  FUNCTION 15
81  FUNCTION 16
82  FUNCTION 17
83  FUNCTION 18
84  FUNCTION 19
85  FUNCTION 20
86  FUNCTION 21
87  FUNCTION 22
88  FUNCTION 23
89  FUNCTION 24
90  FUNCTION 25
91  FUNCTION 26
92  FUNCTION 27
93  FUNCTION 28
94  FUNCTION 29
95  FUNCTION 30
96  FUNCTION 31
97 // CHECK6:  __Thumbv7ABSLongThunk_tfunc33:
98 // CHECK6-NEXT:  1000004:       ff f0 fc bf     b.w     #1048568 <tfunc33>
99 // CHECK6: __Thumbv7ABSLongThunk_tfunc00:
100 // CHECK6-NEXT:  1000008:       7f f4 fa 97     b.w     #-16252940 <tfunc00>
101  FUNCTION 32
102  FUNCTION 33
103  // We should be able to reach an existing ThunkSection.
104  b.w tfunc00
105 // CHECK7: tfunc33:
106 // CHECK7-NEXT:  1100000:       70 47   bx      lr
107 // CHECK7-NEXT:  1100002:       00 f7 01 b8     b.w     #-1048574 <__Thumbv7ABSLongThunk_tfunc00>