File: arm-thumb-range-thunk-os-no-ext.s

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (149 lines) | stat: -rw-r--r-- 6,487 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
// REQUIRES: arm
// RUN: llvm-mc -arm-add-build-attributes -filetype=obj -triple=thumbv4t-none-linux-gnueabi %s -o %t.o
// RUN: ld.lld %t.o -o %t2
/// The output file is large, most of it zeroes. We dissassemble only the
/// parts we need to speed up the test and avoid a large output file.
// RUN: llvm-objdump --no-show-raw-insn -d %t2 --start-address=0x100000 --stop-address=0x10000c | FileCheck --check-prefix=CHECK1 %s
// RUN: llvm-objdump --no-show-raw-insn -d %t2 --start-address=0x200000 --stop-address=0x200002 | FileCheck --check-prefix=CHECK2 %s
// RUN: llvm-objdump --no-show-raw-insn -d %t2 --start-address=0x300000 --stop-address=0x300002 | FileCheck --check-prefix=CHECK3 %s
// RUN: llvm-objdump --no-show-raw-insn -d %t2 --start-address=0x400000 --stop-address=0x400028 | FileCheck --check-prefix=CHECK4 %s
// RUN: llvm-objdump --no-show-raw-insn -d %t2 --start-address=0x700000 --stop-address=0x700014 | FileCheck --check-prefix=CHECK5 %s
// RUN: llvm-objdump --no-show-raw-insn -d %t2 --start-address=0x800000 --stop-address=0x800004 | FileCheck --check-prefix=CHECK6 %s
// RUN: llvm-objdump --no-show-raw-insn -d %t2 --start-address=0x900000 --stop-address=0x900004 | FileCheck --check-prefix=CHECK7 %s
// RUN: llvm-objdump --no-show-raw-insn -d %t2 --start-address=0xa00000 --stop-address=0xa00018 | FileCheck --check-prefix=CHECK8 %s
// RUN: llvm-objdump --no-show-raw-insn -d %t2 --start-address=0xb00000 --stop-address=0xb00004 | FileCheck --check-prefix=CHECK9 %s

/// Test the Range extension Thunks for Thumb when all the code is in a single
/// OutputSection. The Thumb BL instruction has a range of 4Mb. We create a
/// series of functions a megabyte apart. We expect range extension thunks to be
/// created when a branch is out of range. Thunks will be reused whenever they
/// are in range.
.syntax unified

/// Define a function aligned on a megabyte boundary.
.macro FUNCTION suff
  .section .text.\suff\(), "ax", %progbits
  .thumb
  .balign 0x100000
  .globl tfunc\suff\()
  .type  tfunc\suff\(), %function
  tfunc\suff\():
  bx lr
.endm

.section .text, "ax", %progbits
.thumb
.globl _start
_start:
  /// tfunc00 and tfunc03 are within 4MB, so no Range Thunks expected.
  bl tfunc00
  bl tfunc03
  /// tfunc04 is > 4MB away, expect a Range Thunk to be generated, to go into
  /// the first of the pre-created ThunkSections.
  bl tfunc04

// CHECK1-LABEL: <_start>:
// CHECK1-NEXT:   100000:       bl      0x200000 <tfunc00>      @ imm = #0xffffc
// CHECK1-NEXT:                 bl      0x500000 <tfunc03>      @ imm = #0x3ffff8
// CHECK1-NEXT:                 bl      0x400008 <__Thumbv4ABSLongThunk_tfunc04> @ imm = #0x2ffffc

FUNCTION 00
// CHECK2-LABEL: <tfunc00>:
// CHECK2-NEXT:   200000:       bx      lr

FUNCTION 01
// CHECK3-LABEL: <tfunc01>:
// CHECK3-NEXT:   300000:       bx      lr

FUNCTION 02
  bl tfunc07
  /// The thunks should not generate a v7-style short thunk.
// CHECK4-LABEL: <tfunc02>:
// CHECK4-NEXT:   400000:       bx      lr
// CHECK4-NEXT:                 bl      0x400018 <__Thumbv4ABSLongThunk_tfunc07> @ imm = #0x12
// CHECK4-NEXT:                 bmi     0x3fffb2 <tfunc01+0xfffb2> @ imm = #-0x58
// CHECK4-EMPTY:
// CHECK4-NEXT:  <__Thumbv4ABSLongThunk_tfunc04>:
// CHECK4-NEXT:   400008:      	bx      pc
// CHECK4-NEXT:                 b       0x400008 <__Thumbv4ABSLongThunk_tfunc04> @ imm = #-0x6
// CHECK4-EMPTY:
// CHECK4-NEXT: <$a>:
// CHECK4-NEXT:  40000c:        ldr	    r12, [pc]               @ 0x400014 <__Thumbv4ABSLongThunk_tfunc04+0xc>
// CHECK4-NEXT:                 bx	    r12
// CHECK4-EMPTY:
// CHECK4-NEXT:  <$d>:
// CHECK4-NEXT:   400014: 01 00 60 00  	.word	0x00600001
// CHECK4-EMPTY:
// CHECK4-NEXT:  <__Thumbv4ABSLongThunk_tfunc07>:
// CHECK4-NEXT:   400018:      	bx	    pc
// CHECK4-NEXT:             	b	    0x400018 <__Thumbv4ABSLongThunk_tfunc07> @ imm = #-0x6
// CHECK4-EMPTY:
// CHECK4-NEXT:  <$a>:
// CHECK4-NEXT:   40001c:      	ldr	r12, [pc]                   @ 0x400024 <__Thumbv4ABSLongThunk_tfunc07+0xc>
// CHECK4-NEXT:             	bx	r12
// CHECK4-EMPTY:
// CHECK4-NEXT:  <$d>:
// CHECK4-NEXT:   400024: 01 00 90 00  	.word	0x00900001

FUNCTION 03
FUNCTION 04
FUNCTION 05
// CHECK5-LABEL: <tfunc05>:
// CHECK5-NEXT:   700000:      	bx	lr
// CHECK5-NEXT:             	bmi	0x6fffae <tfunc04+0xfffae> @ imm = #-0x58
// CHECK5-EMPTY:
// CHECK5-NEXT:  <__Thumbv4ABSLongThunk_tfunc03>:
// CHECK5-NEXT:   700004:      	bx	pc
// CHECK5-NEXT:             	b	0x700004 <__Thumbv4ABSLongThunk_tfunc03> @ imm = #-0x6
// CHECK5-EMPTY:
// CHECK5-NEXT:  <$a>:
// CHECK5-NEXT:   700008:      	ldr	r12, [pc]               @ 0x700010 <__Thumbv4ABSLongThunk_tfunc03+0xc>
// CHECK5-NEXT:             	bx	r12
// CHECK5-EMPTY:
// CHECK5-NEXT:  <$d>:
// CHECK5-NEXT:   700010: 01 00 50 00  	.word	0x00500001

FUNCTION 06
  /// The backwards branch is within range, so no range extension necessary.
  bl tfunc04
// CHECK6-LABEL: <tfunc06>:
// CHECK6-NEXT:   800000:      	bx	lr
// CHECK6-NEXT:  	            bl	0x600000 <tfunc04>      @ imm = #-0x200006

FUNCTION 07
  /// The backwards branch is out of range.
  bl tfunc03
// CHECK7-LABEL: <tfunc07>:
// CHECK7-NEXT:   900000:      	bx	lr
// CHECK7-NEXT:               	bl	0x700004 <__Thumbv4ABSLongThunk_tfunc03> @ imm = #-0x200002

FUNCTION 08
  /// 2nd backwards branch outside of range to same fn. Should share thunk with
  /// previous call.
  bl tfunc03
// CHECK8-LABEL: <tfunc08>:
// CHECK8-NEXT:   a00000:      	bx	lr
// CHECK8-NEXT:             	bl	0x700004 <__Thumbv4ABSLongThunk_tfunc03> @ imm = #-0x300002
// CHECK8-NEXT:             	bmi	0x9fffb2 <tfunc07+0xfffb2> @ imm = #-0x58
// CHECK8-EMPTY:
// CHECK8-NEXT:  <__Thumbv4ABSLongThunk_tfunc03>:
// CHECK8-NEXT:   a00008:      	bx	pc
// CHECK8-NEXT:   a0000a:      	b	0xa00008 <__Thumbv4ABSLongThunk_tfunc03> @ imm = #-0x6
// CHECK8-EMPTY:
// CHECK8-NEXT:  <$a>:
// CHECK8-NEXT:   a0000c:      	ldr	r12, [pc]               @ 0xa00014 <__Thumbv4ABSLongThunk_tfunc03+0xc>
// CHECK8-NEXT:   a00010:      	bx	r12
// CHECK8-EMPTY:
// CHECK8-NEXT:  <$d>:
// CHECK8-NEXT:   a00014: 01 00 50 00  	.word	0x00500001

FUNCTION 09
  /// This call is out of range of ThunkSection at 0700004.
  /// These 3 calls to tfunc03 could have used the same thunk (section), but
  /// we are not that sophisticated.
  bl tfunc03
// CHECK9-LABEL: <tfunc09>:
// CHECK9-NEXT:   b00000:      	bx	lr
// CHECK9-NEXT:      	        bl	0xa00008 <__Thumbv4ABSLongThunk_tfunc03> @ imm = #-0xffffe
FUNCTION 10
FUNCTION 11