1// REQUIRES: arm
2// RUN: llvm-mc -filetype=obj -triple=armv7a-unknown-linux-gnueabi %s -o %t
3// RUN: ld.lld %t -o %t2
4// RUN: llvm-objdump -d %t2 --triple=armv7a-unknown-linux-gnueabi --no-show-raw-insn | FileCheck %s
5// RUN: llvm-mc -filetype=obj -triple=thumbv7a-unknown-linux-gnueabi %s -o %t3
6// RUN: ld.lld %t3 -o %t4
7// RUN: llvm-objdump -d %t4 --triple=thumbv7a-unknown-linux-gnueabi --no-show-raw-insn | FileCheck %s
8
9/// Test the following relocation pairs:
10///  * R_ARM_MOVW_ABS_NC and R_ARM_MOVT_ABS
11///  * R_ARM_MOVW_PREL_NC and R_ARM_MOVT_PREL
12///  * R_ARM_MOVW_BREL_NC and R_ARM_MOVT_BREL
13///
14///  * R_ARM_THM_MOVW_ABS_NC and R_ARM_THM_MOVT_ABS
15///  * R_ARM_THM_MOVW_PREL_NC and R_ARM_THM_MOVT_PREL
16///  * R_ARM_THM_MOVW_BREL_NC and R_ARM_THM_MOVT_BREL
17
18 .syntax unified
19 .globl _start
20 .align 12
21_start:
22 .section .R_ARM_MOVW_ABS_NC, "ax",%progbits
23 .align 8
24 movw r0, :lower16:label
25 movw r1, :lower16:label1
26 movw r2, :lower16:label2 + 4
27 movw r3, :lower16:label3
28 movw r4, :lower16:label3 + 4
29// CHECK-LABEL: Disassembly of section .R_ARM_MOVW_ABS_NC
30// CHECK-EMPTY:
31// CHECK: 21000: movw    r0, #0
32// CHECK:        movw    r1, #4
33// CHECK:        movw    r2, #12
34// CHECK:        movw    r3, #65532
35/// :lower16:label3 + 4 = :lower16:0x30000 = 0
36// CHECK:        movw    r4, #0
37
38 .section .R_ARM_MOVT_ABS, "ax",%progbits
39 .align 8
40 movt r0, :upper16:label
41 movt r1, :upper16:label1
42 movt r2, :upper16:label2 + 4
43 movt r3, :upper16:label3
44 movt r4, :upper16:label3 + 4
45// CHECK-LABEL: Disassembly of section .R_ARM_MOVT_ABS
46// CHECK-EMPTY:
47// CHECK: 21100: movt    r0, #4
48// CHECK:        movt    r1, #4
49// CHECK:        movt    r2, #4
50// CHECK:        movt    r3, #4
51/// :upper16:label3 + 4 = :upper16:0x30000 = 3
52// CHECK:        movt    r4, #5
53
54.section .R_ARM_MOVW_PREL_NC, "ax",%progbits
55.align 8
56 movw r0, :lower16:label - .
57 movw r1, :lower16:label1 - .
58 movw r2, :lower16:label2 + 4 - .
59 movw r3, :lower16:label3 - .
60 movw r4, :lower16:label3 + 0x2214 - .
61// CHECK-LABEL: Disassembly of section .R_ARM_MOVW_PREL_NC
62// CHECK-EMPTY:
63/// :lower16:label - . = 56832
64// CHECK: 21200: movw    r0, #60928
65/// :lower16:label1 - . = 56832
66// CHECK:        movw    r1, #60928
67/// :lower16:label2 - . + 4 = 60932
68// CHECK:        movw    r2, #60932
69/// :lower16:label3 - . = 60912
70// CHECK:        movw    r3, #60912
71/// :lower16:label3 - . + 0x2214 = :lower16:0x20000 = 4096
72// CHECK:        movw    r4, #4096
73
74.section .R_ARM_MOVT_PREL, "ax",%progbits
75.align 8
76 movt r0, :upper16:label - .
77 movt r1, :upper16:label1 - .
78 movt r2, :upper16:label2 + 0x4 - .
79 movt r3, :upper16:label3 - .
80 movt r4, :upper16:label3 + 0x2314 - .
81// CHECK-LABEL: Disassembly of section .R_ARM_MOVT_PREL
82// CHECK-EMPTY:
83/// :upper16:label - . = :upper16:0xdd00  = 1
84// CHECK: 21300: movt    r0, #1
85/// :upper16:label1 - . = :upper16:0xdd00 = 1
86// CHECK:        movt    r1, #1
87/// :upper16:label2 - . + 4 = :upper16:0xdd04 = 1
88// CHECK:        movt    r2, #1
89/// :upper16:label3 - . = :upper16:0x1dcf0 = 2
90// CHECK:        movt    r3, #2
91/// :upper16:label3 - . + 0x2314 = :upper16:0x20000 = 3
92// CHECK:        movt    r4, #3
93
94.section .R_ARM_MOVW_BREL_NC, "ax",%progbits
95.align 8
96 movw r0, :lower16:label(sbrel)
97 movw r1, :lower16:label1(sbrel)
98 movw r2, :lower16:label2(sbrel)
99 movw r3, :lower16:label3(sbrel)
100 movw r4, :lower16:label3.4(sbrel)
101// CHECK-LABEL: Disassembly of section .R_ARM_MOVW_BREL_NC
102// CHECK-EMPTY:
103// SB = .destination
104/// :lower16:label - SB = 0
105// CHECK: 21400: movw    r0, #0
106/// :lower16:label1 - SB = 4
107// CHECK:        movw    r1, #4
108/// :lower16:label2 - SB = 8
109// CHECK:        movw    r2, #8
110/// :lower16:label3 - SB = 0xfffc
111// CHECK:        movw    r3, #65532
112/// :lower16:label3.4 - SB = :lower16:0x10000 = 0
113// CHECK:        movw    r4, #0
114
115.section .R_ARM_MOVT_BREL, "ax",%progbits
116.align 8
117 movt r0, :upper16:label(sbrel)
118 movt r1, :upper16:label1(sbrel)
119 movt r2, :upper16:label2(sbrel)
120 movt r3, :upper16:label3(sbrel)
121 movt r4, :upper16:label3.4(sbrel)
122// CHECK-LABEL: Disassembly of section .R_ARM_MOVT_BREL
123// CHECK-EMPTY:
124// SB = .destination
125/// :upper16:label - SB = 0
126// CHECK: 21500: movt    r0, #0
127/// :upper16:label1 - SB = 0
128// CHECK:        movt    r1, #0
129/// :upper16:label2 - SB = 0
130// CHECK:        movt    r2, #0
131/// :upper16:label3 - SB = 0
132// CHECK:        movt    r3, #0
133/// :upper16:label3.4 - SB = :upper16:0x10000 = 1
134// CHECK:        movt    r4, #1
135
136.section .R_ARM_THM_MOVW_ABS_NC, "ax",%progbits
137.align 8
138 movw r0, :lower16:label
139 movw r1, :lower16:label1
140 movw r2, :lower16:label2 + 4
141 movw r3, :lower16:label3
142 movw r4, :lower16:label3 + 4
143// CHECK-LABEL: Disassembly of section .R_ARM_THM_MOVW_ABS_NC
144// CHECK-EMPTY:
145// CHECK: 21600: movw    r0, #0
146// CHECK:        movw    r1, #4
147// CHECK:        movw    r2, #12
148// CHECK:        movw    r3, #65532
149// CHECK:        movw    r4, #0
150
151.section .R_ARM_THM_MOVT_ABS, "ax",%progbits
152.align 8
153 movt r0, :upper16:label
154 movt r1, :upper16:label1
155 movt r2, :upper16:label2 + 4
156 movt r3, :upper16:label3
157 movt r4, :upper16:label3 + 4
158// CHECK-LABEL: Disassembly of section .R_ARM_THM_MOVT_ABS
159// CHECK-EMPTY:
160// CHECK: 21700: movt    r0, #4
161// CHECK:        movt    r1, #4
162// CHECK:        movt    r2, #4
163// CHECK:        movt    r3, #4
164// CHECK:        movt    r4, #5
165
166.section .R_ARM_THM_MOVW_PREL_NC, "ax",%progbits
167.align 8
168 movw r0, :lower16:label - .
169 movw r1, :lower16:label1 - .
170 movw r2, :lower16:label2 + 4 - .
171 movw r3, :lower16:label3 - .
172 movw r4, :lower16:label3 + 0x2814 - .
173// CHECK-LABEL: Disassembly of section .R_ARM_THM_MOVW_PREL_NC
174// CHECK-EMPTY:
175/// :lower16:label - . = 59392
176// CHECK: 21800: movw    r0, #59392
177/// :lower16:label1 - . = 59392
178// CHECK:        movw    r1, #59392
179/// :lower16:label2 - . + 4 = 59396
180// CHECK:        movw    r2, #59396
181/// :lower16:label3 - . = 59376
182// CHECK:        movw    r3, #59376
183/// :lower16:label3 - . + 0x2814 = 0x20000
184// CHECK:        movw    r4, #4096
185
186.section .R_ARM_THM_MOVT_PREL, "ax",%progbits
187.align 8
188 movt r0, :upper16:label - .
189 movt r1, :upper16:label1 - .
190 movt r2, :upper16:label2 + 0x4 - .
191 movt r3, :upper16:label3 - .
192 movt r4, :upper16:label3 + 0x2914 - .
193// CHECK-LABEL: Disassembly of section .R_ARM_THM_MOVT_PREL
194// CHECK-EMPTY:
195/// :upper16:label - . = :upper16:0xd700  = 1
196// CHECK: 21900: movt    r0, #1
197/// :upper16:label1 - . = :upper16:0xd700 = 1
198// CHECK:        movt    r1, #1
199/// :upper16:label2 - . + 4 = :upper16:0xd704 = 1
200// CHECK:        movt    r2, #1
201/// :upper16:label3 - . = :upper16:0x1d6f0 = 2
202// CHECK:        movt    r3, #2
203/// :upper16:label3 - . + 0x2914 = :upper16:0x20000 = 3
204// CHECK:        movt    r4, #3
205
206.section .R_ARM_THM_MOVW_BREL_NC, "ax",%progbits
207.align 8
208 movw r0, :lower16:label(sbrel)
209 movw r1, :lower16:label1(sbrel)
210 movw r2, :lower16:label2(sbrel)
211 movw r3, :lower16:label3(sbrel)
212 movw r4, :lower16:label3.4(sbrel)
213// CHECK-LABEL: Disassembly of section .R_ARM_THM_MOVW_BREL_NC
214// CHECK-EMPTY:
215// SB = .destination
216/// :lower16:label - SB = 0
217// CHECK: 21a00: movw    r0, #0
218/// :lower16:label1 - SB = 4
219// CHECK:        movw    r1, #4
220/// :lower16:label2 - SB = 8
221// CHECK:        movw    r2, #8
222/// :lower16:label3 - SB = 0xfffc
223// CHECK:        movw    r3, #65532
224/// :lower16:label3.4 - SB = :lower16:0x10000 = 0
225// CHECK:        movw    r4, #0
226
227.section .R_ARM_THM_MOVT_BREL, "ax",%progbits
228.align 8
229 movt r0, :upper16:label(sbrel)
230 movt r1, :upper16:label1(sbrel)
231 movt r2, :upper16:label2(sbrel)
232 movt r3, :upper16:label3(sbrel)
233 movt r4, :upper16:label3.4(sbrel)
234// CHECK-LABEL: Disassembly of section .R_ARM_THM_MOVT_BREL
235// CHECK-EMPTY:
236/// SB = .destination
237/// :upper16:label - SB = 0
238// CHECK: 21b00: movt    r0, #0
239/// :upper16:label1 - SB = 0
240// CHECK:        movt    r1, #0
241/// :upper16:label2 - SB = 0
242// CHECK:        movt    r2, #0
243/// :upper16:label3 - SB = 0
244// CHECK:        movt    r3, #0
245/// :upper16:label3.4 - SB = :upper16:0x10000 = 1
246// CHECK:        movt    r4, #1
247
248 .section .destination, "aw",%progbits
249 .balign 65536
250/// 0x20000
251label:
252 .word 0
253/// 0x20004
254label1:
255 .word 1
256/// 0x20008
257label2:
258 .word 2
259/// Test label3 is immediately below 2^16 alignment boundary
260 .space 65536 - 16
261/// 0x2fffc
262label3:
263 .word 3
264/// label3 + 4 is on a 2^16 alignment boundary
265label3.4:
266 .word 4
267