xref: /llvm-project/lld/test/ELF/arm-bl-v4t.s (revision 9ea44c6894270546d6d88ef0d3abcf1e1876acae)
1// REQUIRES: arm
2// RUN: rm -rf %t && split-file %s %t
3// RUN: llvm-mc -arm-add-build-attributes -filetype=obj -triple=armv4t-none-linux-gnueabi %t/a.s -o %t/a.o
4// RUN: ld.lld %t/a.o --script %t/far.lds -o %t/a-far
5// RUN: llvm-objdump --no-print-imm-hex -d --no-show-raw-insn --triple=armv4t-none-linux-gnueabi %t/a-far | FileCheck %s --check-prefixes=FAR
6// RUN: ld.lld %t/a.o --script %t/near.lds -o %t/a-near
7// RUN: llvm-objdump --no-print-imm-hex -d --no-show-raw-insn --triple=armv4t-none-linux-gnueabi %t/a-near | FileCheck %s --check-prefixes=NEAR
8// RUN: ld.lld %t/a.o -pie --script %t/far.lds -o %t/a-far-pie
9// RUN: llvm-objdump --no-print-imm-hex -d --no-show-raw-insn --triple=armv4t-none-linux-gnueabi %t/a-far-pie | FileCheck %s --check-prefixes=FAR-PIE
10// RUN: ld.lld %t/a.o -pie --script %t/near.lds -o %t/a-near-pie
11// RUN: llvm-objdump --no-print-imm-hex -d --no-show-raw-insn --triple=armv4t-none-linux-gnueabi %t/a-near-pie | FileCheck %s --check-prefixes=NEAR
12
13// RUN: llvm-mc -arm-add-build-attributes -filetype=obj -triple=armv4teb-none-linux-gnueabi %t/a.s -o %t/a.o
14// RUN: ld.lld %t/a.o --script %t/far.lds -o %t/a-far
15// RUN: llvm-objdump --no-print-imm-hex -d --no-show-raw-insn --triple=armv4teb-none-linux-gnueabi %t/a-far | FileCheck %s --check-prefixes=FAR-EB
16// RUN: ld.lld %t/a.o --script %t/near.lds -o %t/a-near
17// RUN: llvm-objdump --no-print-imm-hex -d --no-show-raw-insn --triple=armv4teb-none-linux-gnueabi %t/a-near | FileCheck %s --check-prefixes=NEAR
18// RUN: ld.lld %t/a.o -pie --script %t/far.lds -o %t/a-far-pie
19// RUN: llvm-objdump --no-print-imm-hex -d --no-show-raw-insn --triple=armv4teb-none-linux-gnueabi %t/a-far-pie | FileCheck %s --check-prefixes=FAR-EB-PIE
20// RUN: ld.lld %t/a.o -pie --script %t/near.lds -o %t/a-near-pie
21// RUN: llvm-objdump --no-print-imm-hex -d --no-show-raw-insn --triple=armv4teb-none-linux-gnueabi %t/a-near-pie | FileCheck %s --check-prefixes=NEAR
22
23/// On Armv4T there is no blx instruction so long branch/exchange looks slightly
24/// different.
25
26#--- a.s
27 .text
28 .syntax unified
29 .cpu    arm7tdmi
30
31 .section .low, "ax", %progbits
32 .arm
33 .globl _start
34 .type   _start,%function
35 .p2align       2
36_start:
37  bl target
38  bx lr
39
40 .thumb
41 .globl thumb_start
42 .type  thumb_start,%function
43 .p2align       2
44thumb_start:
45  bl thumb_target
46  bx lr
47
48// FAR-LABEL: <_start>:
49// FAR-NEXT:   1000000:      	bl	0x1000010 <__ARMv5LongLdrPcThunk_target> @ imm = #8
50// FAR-NEXT:                	bx	lr
51// FAR-EMPTY:
52// FAR-LABEL: <thumb_start>:
53// FAR-NEXT:   1000008:      	bl	0x1000018 <__Thumbv4ABSLongThunk_thumb_target> @ imm = #12
54// FAR-NEXT:                	bx	lr
55// FAR-NEXT:                	bmi	0xffffba                @ imm = #-88
56// FAR-EMPTY:
57// FAR-NEXT:  <__ARMv5LongLdrPcThunk_target>:
58// FAR-NEXT:   1000010:      	ldr	pc, [pc, #-4]           @ 0x1000014 <__ARMv5LongLdrPcThunk_target+0x4>
59// FAR-NEXT:   1000014: 00 00 00 06  	.word	0x06000000
60// FAR-EMPTY:
61// FAR-NEXT:  <__Thumbv4ABSLongThunk_thumb_target>:
62// FAR-NEXT:   1000018:      	bx	pc
63// FAR-NEXT:                	b	0x1000018 <__Thumbv4ABSLongThunk_thumb_target> @ imm = #-6
64// FAR-NEXT:   100001c:      	ldr	r12, [pc]               @ 0x1000024 <__Thumbv4ABSLongThunk_thumb_target+0xc>
65// FAR-NEXT:                	bx	r12
66// FAR-NEXT:   1000024: 05 00 00 06  	.word	0x06000005
67
68// FAR-EB-LABEL: <_start>:
69// FAR-EB-NEXT:   1000000:      	bl	0x1000010 <__ARMv5LongLdrPcThunk_target> @ imm = #8
70// FAR-EB-NEXT:                	bx	lr
71// FAR-EB-EMPTY:
72// FAR-EB-LABEL: <thumb_start>:
73// FAR-EB-NEXT:   1000008:      	bl	0x1000018 <__Thumbv4ABSLongThunk_thumb_target> @ imm = #12
74// FAR-EB-NEXT:                	bx	lr
75// FAR-EB-NEXT:                	bmi	0xffffba                @ imm = #-88
76// FAR-EB-EMPTY:
77// FAR-EB-NEXT:  <__ARMv5LongLdrPcThunk_target>:
78// FAR-EB-NEXT:   1000010:      	ldr	pc, [pc, #-4]           @ 0x1000014 <__ARMv5LongLdrPcThunk_target+0x4>
79// FAR-EB-NEXT:   1000014: 06 00 00 00  	.word	0x06000000
80// FAR-EB-EMPTY:
81// FAR-EB-NEXT:  <__Thumbv4ABSLongThunk_thumb_target>:
82// FAR-EB-NEXT:   1000018:      	bx	pc
83// FAR-EB-NEXT:                	b	0x1000018 <__Thumbv4ABSLongThunk_thumb_target> @ imm = #-6
84// FAR-EB-NEXT:   100001c:      	ldr	r12, [pc]               @ 0x1000024 <__Thumbv4ABSLongThunk_thumb_target+0xc>
85// FAR-EB-NEXT:                	bx	r12
86// FAR-EB-NEXT:   1000024: 06 00 00 05  	.word	0x06000005
87
88// FAR-PIE-LABEL: <_start>:
89// FAR-PIE-NEXT:   1000000:      	bl	0x1000010 <__ARMv4PILongThunk_target> @ imm = #8
90// FAR-PIE-NEXT:                	bx	lr
91// FAR-PIE-EMPTY:
92// FAR-PIE-NEXT:  <thumb_start>:
93// FAR-PIE-NEXT:   1000008:      	bl	0x100001c <__Thumbv4PILongThunk_thumb_target> @ imm = #16
94// FAR-PIE-NEXT:                	bx	lr
95// FAR-PIE-NEXT:                	bmi	0xffffba                @ imm = #-88
96// FAR-PIE-EMPTY:
97// FAR-PIE-NEXT:  <__ARMv4PILongThunk_target>:
98// FAR-PIE-NEXT:   1000010:      	ldr	r12, [pc]               @ 0x1000018 <__ARMv4PILongThunk_target+0x8>
99// FAR-PIE-NEXT:                	add	pc, pc, r12
100// FAR-PIE-NEXT:   1000018: e4 ff ff 04  	.word	0x04ffffe4
101// FAR-PIE-EMPTY:
102// FAR-PIE-NEXT:  <__Thumbv4PILongThunk_thumb_target>:
103// FAR-PIE-NEXT:   100001c:      	bx	pc
104// FAR-PIE-NEXT:                	b	0x100001c <__Thumbv4PILongThunk_thumb_target> @ imm = #-6
105// FAR-PIE-NEXT:   1000020:      	ldr	r12, [pc, #4]           @ 0x100002c <__Thumbv4PILongThunk_thumb_target+0x10>
106// FAR-PIE-NEXT:                	add	r12, pc, r12
107// FAR-PIE-NEXT:                	bx	r12
108// FAR-PIE-NEXT:   100002c: d9 ff ff 04  	.word	0x04ffffd9
109
110// FAR-EB-PIE-LABEL: <_start>:
111// FAR-EB-PIE-NEXT:   1000000:      	bl	0x1000010 <__ARMv4PILongThunk_target> @ imm = #8
112// FAR-EB-PIE-NEXT:                	bx	lr
113// FAR-EB-PIE-EMPTY:
114// FAR-EB-PIE-NEXT:  <thumb_start>:
115// FAR-EB-PIE-NEXT:   1000008:      	bl	0x100001c <__Thumbv4PILongThunk_thumb_target> @ imm = #16
116// FAR-EB-PIE-NEXT:                	bx	lr
117// FAR-EB-PIE-NEXT:                	bmi	0xffffba                @ imm = #-88
118// FAR-EB-PIE-EMPTY:
119// FAR-EB-PIE-NEXT:  <__ARMv4PILongThunk_target>:
120// FAR-EB-PIE-NEXT:   1000010:      	ldr	r12, [pc]               @ 0x1000018 <__ARMv4PILongThunk_target+0x8>
121// FAR-EB-PIE-NEXT:                	add	pc, pc, r12
122// FAR-EB-PIE-NEXT:   1000018: 04 ff ff e4  	.word	0x04ffffe4
123// FAR-EB-PIE-EMPTY:
124// FAR-EB-PIE-NEXT:  <__Thumbv4PILongThunk_thumb_target>:
125// FAR-EB-PIE-NEXT:   100001c:      	bx	pc
126// FAR-EB-PIE-NEXT:                	b	0x100001c <__Thumbv4PILongThunk_thumb_target> @ imm = #-6
127// FAR-EB-PIE-NEXT:   1000020:      	ldr	r12, [pc, #4]           @ 0x100002c <__Thumbv4PILongThunk_thumb_target+0x10>
128// FAR-EB-PIE-NEXT:                	add	r12, pc, r12
129// FAR-EB-PIE-NEXT:                	bx	r12
130// FAR-EB-PIE-NEXT:   100002c: 04 ff ff d9  	.word	0x04ffffd9
131
132// NEAR-LABEL: <_start>:
133// NEAR-NEXT:  1000000:      	bl	0x1000010 <target> @ imm = #8
134// NEAR-NEXT:               	bx	lr
135// NEAR-EMPTY:
136// NEAR-LABEL: <thumb_start>:
137// NEAR-NEXT:  1000008:      	bl	0x1000014 <thumb_target> @ imm = #8
138// NEAR-NEXT:               	bx	lr
139
140.section .high, "ax", %progbits
141 .arm
142 .globl target
143 .type target,%function
144target:
145  bx lr
146
147.thumb
148 .globl thumb_target
149 .type thumb_target,%function
150thumb_target:
151  bx lr
152
153// FAR-LABEL: <target>:
154// FAR-NEXT:   6000000:      	bx	lr
155// FAR-EMPTY:
156// FAR-LABEL: <thumb_target>:
157// FAR-NEXT:   6000004:      	bx	lr
158
159// FAR-PIE-LABEL: <target>:
160// FAR-PIE-NEXT:   6000000:     bx	lr
161// FAR-PIE-EMPTY:
162// FAR-PIE-LABEL: <thumb_target>:
163// FAR-PIE-NEXT:   6000004:     bx	lr
164
165// NEAR-LABEL: <target>:
166// NEAR-LABEL:  1000010:      	bx	lr
167// NEAR-EMPTY:
168// NEAR-NEXT: <thumb_target>:
169// NEAR-NEXT:  1000014:      	bx	lr
170
171
172#--- far.lds
173SECTIONS {
174  . = SIZEOF_HEADERS;
175  .low 0x01000000 : { *(.low) }
176  .high 0x06000000 : { *(.high) }
177}
178
179#--- near.lds
180SECTIONS {
181  . = SIZEOF_HEADERS;
182  .all 0x01000000 : { *(.low) *(.high) }
183}
184