1// RUN: llvm-mc -target-abi=ilp32 -triple=arm64-linux-gnu -o - < %s | \
2// RUN:   FileCheck %s
3// RUN: llvm-mc -target-abi=ilp32 -triple=arm64-linux-gnu -show-encoding \
4// RUN:    -o - < %s | FileCheck --check-prefix=CHECK-ENCODING %s
5// RUN: llvm-mc -target-abi=ilp32 -triple=arm64-linux-gnu -filetype=obj < %s | \
6// RUN:   llvm-objdump -triple=arm64-linux-gnu - -r | \
7// RUN:   FileCheck %s --check-prefix=CHECK-OBJ-ILP32
8
9   add x0, x2, #:lo12:sym
10// CHECK: add x0, x2, :lo12:sym
11// CHECK-OBJ-ILP32: 0 R_AARCH64_P32_ADD_ABS_LO12_NC sym
12
13   add x5, x7, #:dtprel_lo12:sym
14// CHECK: add x5, x7, :dtprel_lo12:sym
15// CHECK-OBJ-ILP32: 4 R_AARCH64_P32_TLSLD_ADD_DTPREL_LO12 sym
16
17   add x9, x12, #:dtprel_lo12_nc:sym
18// CHECK: add x9, x12, :dtprel_lo12_nc:sym
19// CHECK-OBJ-ILP32: 8 R_AARCH64_P32_TLSLD_ADD_DTPREL_LO12_NC sym
20
21   add x20, x30, #:tprel_lo12:sym
22// CHECK: add x20, x30, :tprel_lo12:sym
23// CHECK-OBJ-ILP32: c R_AARCH64_P32_TLSLE_ADD_TPREL_LO12 sym
24
25   add x9, x12, #:tprel_lo12_nc:sym
26// CHECK: add x9, x12, :tprel_lo12_nc:sym
27// CHECK-OBJ-ILP32: 10 R_AARCH64_P32_TLSLE_ADD_TPREL_LO12_NC sym
28
29   add x5, x0, #:tlsdesc_lo12:sym
30// CHECK: add x5, x0, :tlsdesc_lo12:sym
31// CHECK-OBJ-ILP32: 14 R_AARCH64_P32_TLSDESC_ADD_LO12 sym
32
33        add x0, x2, #:lo12:sym+8
34// CHECK: add x0, x2, :lo12:sym
35// CHECK-OBJ-ILP32: 18 R_AARCH64_P32_ADD_ABS_LO12_NC sym+8
36
37   add x5, x7, #:dtprel_lo12:sym+1
38// CHECK: add x5, x7, :dtprel_lo12:sym+1
39// CHECK-OBJ-ILP32: 1c R_AARCH64_P32_TLSLD_ADD_DTPREL_LO12 sym+1
40
41   add x9, x12, #:dtprel_lo12_nc:sym+2
42// CHECK: add x9, x12, :dtprel_lo12_nc:sym+2
43// CHECK-OBJ-ILP32:20 R_AARCH64_P32_TLSLD_ADD_DTPREL_LO12_NC sym+2
44
45   add x20, x30, #:tprel_lo12:sym+12
46// CHECK: add x20, x30, :tprel_lo12:sym+12
47// CHECK-OBJ-ILP32: 24 R_AARCH64_P32_TLSLE_ADD_TPREL_LO12 sym+12
48
49   add x9, x12, #:tprel_lo12_nc:sym+54
50// CHECK: add x9, x12, :tprel_lo12_nc:sym+54
51// CHECK-OBJ-ILP32: 28 R_AARCH64_P32_TLSLE_ADD_TPREL_LO12_NC sym+54
52
53   add x5, x0, #:tlsdesc_lo12:sym+70
54// CHECK: add x5, x0, :tlsdesc_lo12:sym+70
55// CHECK-OBJ-ILP32: 2c R_AARCH64_P32_TLSDESC_ADD_LO12 sym+70
56
57        .hword sym + 4 - .
58// CHECK-OBJ-ILP32: 30 R_AARCH64_P32_PREL16 sym+4
59        .word sym - . + 8
60// CHECK-OBJ-ILP32: 32 R_AARCH64_P32_PREL32 sym+8
61
62        .hword sym
63// CHECK-OBJ-ILP32: 36 R_AARCH64_P32_ABS16 sym
64        .word sym+1
65// CHECK-OBJ-ILP32: 38 R_AARCH64_P32_ABS32 sym+1
66
67   adrp x0, sym
68// CHECK: adrp x0, sym
69// CHECK-OBJ-ILP32: 3c R_AARCH64_P32_ADR_PREL_PG_HI21 sym
70
71   adrp x15, :got:sym
72// CHECK: adrp x15, :got:sym
73// CHECK-OBJ-ILP32: 40 R_AARCH64_P32_ADR_GOT_PAGE sym
74
75   adrp x29, :gottprel:sym
76// CHECK: adrp x29, :gottprel:sym
77// CHECK-OBJ-ILP32: 44 R_AARCH64_P32_TLSIE_ADR_GOTTPREL_PAGE21 sym
78
79   adrp x2, :tlsdesc:sym
80// CHECK: adrp x2, :tlsdesc:sym
81// CHECK-OBJ-ILP32: 48 R_AARCH64_P32_TLSDESC_ADR_PAGE21 sym
82
83   // LLVM is not competent enough to do this relocation because the
84   // page boundary could occur anywhere after linking. A relocation
85   // is needed.
86   adrp x3, trickQuestion
87   .global trickQuestion
88trickQuestion:
89// CHECK: adrp x3, trickQuestion
90// CHECK-OBJ-ILP32: 4c R_AARCH64_P32_ADR_PREL_PG_HI21 trickQuestion
91
92   ldrb w2, [x3, :lo12:sym]
93   ldrsb w5, [x7, #:lo12:sym]
94   ldrsb x11, [x13, :lo12:sym]
95   ldr b17, [x19, #:lo12:sym]
96// CHECK: ldrb w2, [x3, :lo12:sym]
97// CHECK: ldrsb w5, [x7, :lo12:sym]
98// CHECK: ldrsb x11, [x13, :lo12:sym]
99// CHECK: ldr b17, [x19, :lo12:sym]
100// CHECK-OBJ-ILP32: R_AARCH64_P32_LDST8_ABS_LO12_NC sym
101// CHECK-OBJ-ILP32: R_AARCH64_P32_LDST8_ABS_LO12_NC sym
102// CHECK-OBJ-ILP32: R_AARCH64_P32_LDST8_ABS_LO12_NC sym
103// CHECK-OBJ-ILP32: R_AARCH64_P32_LDST8_ABS_LO12_NC sym
104
105   ldrb w23, [x29, #:dtprel_lo12_nc:sym]
106   ldrsb w23, [x19, #:dtprel_lo12:sym]
107   ldrsb x17, [x13, :dtprel_lo12_nc:sym]
108   ldr b11, [x7, #:dtprel_lo12:sym]
109// CHECK: ldrb w23, [x29, :dtprel_lo12_nc:sym]
110// CHECK: ldrsb w23, [x19, :dtprel_lo12:sym]
111// CHECK: ldrsb x17, [x13, :dtprel_lo12_nc:sym]
112// CHECK: ldr b11, [x7, :dtprel_lo12:sym]
113// CHECK-OBJ-ILP32: R_AARCH64_P32_TLSLD_LDST8_DTPREL_LO12_NC sym
114// CHECK-OBJ-ILP32: R_AARCH64_P32_TLSLD_LDST8_DTPREL_LO12 sym
115// CHECK-OBJ-ILP32: R_AARCH64_P32_TLSLD_LDST8_DTPREL_LO12_NC sym
116// CHECK-OBJ-ILP32: R_AARCH64_P32_TLSLD_LDST8_DTPREL_LO12 sym
117
118   ldrb w1, [x2, :tprel_lo12:sym]
119   ldrsb w3, [x4, #:tprel_lo12_nc:sym]
120   ldrsb x5, [x6, :tprel_lo12:sym]
121   ldr b7, [x8, #:tprel_lo12_nc:sym]
122// CHECK: ldrb w1, [x2, :tprel_lo12:sym]
123// CHECK: ldrsb w3, [x4, :tprel_lo12_nc:sym]
124// CHECK: ldrsb x5, [x6, :tprel_lo12:sym]
125// CHECK: ldr b7, [x8, :tprel_lo12_nc:sym]
126// CHECK-OBJ-ILP32: R_AARCH64_P32_TLSLE_LDST8_TPREL_LO12 sym
127// CHECK-OBJ-ILP32: R_AARCH64_P32_TLSLE_LDST8_TPREL_LO12_NC sym
128// CHECK-OBJ-ILP32: R_AARCH64_P32_TLSLE_LDST8_TPREL_LO12 sym
129// CHECK-OBJ-ILP32: R_AARCH64_P32_TLSLE_LDST8_TPREL_LO12_NC sym
130
131   ldrh w2, [x3, #:lo12:sym]
132   ldrsh w5, [x7, :lo12:sym]
133   ldrsh x11, [x13, #:lo12:sym]
134   ldr h17, [x19, :lo12:sym]
135// CHECK: ldrh w2, [x3, :lo12:sym]
136// CHECK: ldrsh w5, [x7, :lo12:sym]
137// CHECK: ldrsh x11, [x13, :lo12:sym]
138// CHECK: ldr h17, [x19, :lo12:sym]
139// CHECK-OBJ-ILP32: R_AARCH64_P32_LDST16_ABS_LO12_NC sym
140// CHECK-OBJ-ILP32: R_AARCH64_P32_LDST16_ABS_LO12_NC sym
141// CHECK-OBJ-ILP32: R_AARCH64_P32_LDST16_ABS_LO12_NC sym
142// CHECK-OBJ-ILP32: R_AARCH64_P32_LDST16_ABS_LO12_NC sym
143
144   ldrh w23, [x29, #:dtprel_lo12_nc:sym]
145   ldrsh w23, [x19, :dtprel_lo12:sym]
146   ldrsh x17, [x13, :dtprel_lo12_nc:sym]
147   ldr h11, [x7, #:dtprel_lo12:sym]
148// CHECK: ldrh w23, [x29, :dtprel_lo12_nc:sym]
149// CHECK: ldrsh w23, [x19, :dtprel_lo12:sym]
150// CHECK: ldrsh x17, [x13, :dtprel_lo12_nc:sym]
151// CHECK: ldr h11, [x7, :dtprel_lo12:sym]
152// CHECK-OBJ-ILP32: R_AARCH64_P32_TLSLD_LDST16_DTPREL_LO12_NC sym
153// CHECK-OBJ-ILP32: R_AARCH64_P32_TLSLD_LDST16_DTPREL_LO12 sym
154// CHECK-OBJ-ILP32: R_AARCH64_P32_TLSLD_LDST16_DTPREL_LO12_NC sym
155// CHECK-OBJ-ILP32: R_AARCH64_P32_TLSLD_LDST16_DTPREL_LO12 sym
156
157   ldrh w1, [x2, :tprel_lo12:sym]
158   ldrsh w3, [x4, #:tprel_lo12_nc:sym]
159   ldrsh x5, [x6, :tprel_lo12:sym]
160   ldr h7, [x8, #:tprel_lo12_nc:sym]
161// CHECK: ldrh w1, [x2, :tprel_lo12:sym]
162// CHECK: ldrsh w3, [x4, :tprel_lo12_nc:sym]
163// CHECK: ldrsh x5, [x6, :tprel_lo12:sym]
164// CHECK: ldr h7, [x8, :tprel_lo12_nc:sym]
165// CHECK-OBJ-ILP32: R_AARCH64_P32_TLSLE_LDST16_TPREL_LO12 sym
166// CHECK-OBJ-ILP32: R_AARCH64_P32_TLSLE_LDST16_TPREL_LO12_NC sym
167// CHECK-OBJ-ILP32: R_AARCH64_P32_TLSLE_LDST16_TPREL_LO12 sym
168// CHECK-OBJ-ILP32: R_AARCH64_P32_TLSLE_LDST16_TPREL_LO12_NC sym
169
170   ldr w1, [x2, #:lo12:sym]
171   ldrsw x3, [x4, #:lo12:sym]
172   ldr s4, [x5, :lo12:sym]
173// CHECK: ldr w1, [x2, :lo12:sym]
174// CHECK: ldrsw x3, [x4, :lo12:sym]
175// CHECK: ldr s4, [x5, :lo12:sym]
176// CHECK-OBJ-ILP32: R_AARCH64_P32_LDST32_ABS_LO12_NC sym
177// CHECK-OBJ-ILP32: R_AARCH64_P32_LDST32_ABS_LO12_NC sym
178// CHECK-OBJ-ILP32: R_AARCH64_P32_LDST32_ABS_LO12_NC sym
179
180   ldr w1, [x2, :dtprel_lo12:sym]
181   ldrsw x3, [x4, #:dtprel_lo12_nc:sym]
182   ldr s4, [x5, #:dtprel_lo12_nc:sym]
183// CHECK: ldr w1, [x2, :dtprel_lo12:sym]
184// CHECK: ldrsw x3, [x4, :dtprel_lo12_nc:sym]
185// CHECK: ldr s4, [x5, :dtprel_lo12_nc:sym]
186// CHECK-OBJ-ILP32: R_AARCH64_P32_TLSLD_LDST32_DTPREL_LO12 sym
187// CHECK-OBJ-ILP32: R_AARCH64_P32_TLSLD_LDST32_DTPREL_LO12_NC sym
188// CHECK-OBJ-ILP32: R_AARCH64_P32_TLSLD_LDST32_DTPREL_LO12_NC sym
189
190
191   ldr w1, [x2, #:tprel_lo12:sym]
192   ldrsw x3, [x4, :tprel_lo12_nc:sym]
193   ldr s4, [x5, :tprel_lo12_nc:sym]
194// CHECK: ldr w1, [x2, :tprel_lo12:sym]
195// CHECK: ldrsw x3, [x4, :tprel_lo12_nc:sym]
196// CHECK: ldr s4, [x5, :tprel_lo12_nc:sym]
197// CHECK-OBJ-ILP32: R_AARCH64_P32_TLSLE_LDST32_TPREL_LO12 sym
198// CHECK-OBJ-ILP32: R_AARCH64_P32_TLSLE_LDST32_TPREL_LO12_NC sym
199// CHECK-OBJ-ILP32: R_AARCH64_P32_TLSLE_LDST32_TPREL_LO12_NC sym
200
201   ldr x28, [x27, :lo12:sym]
202   ldr d26, [x25, :lo12:sym]
203// CHECK: ldr x28, [x27, :lo12:sym]
204// CHECK: ldr d26, [x25, :lo12:sym]
205// CHECK-OBJ-ILP32: R_AARCH64_P32_LDST64_ABS_LO12_NC sym
206// CHECK-OBJ-ILP32: R_AARCH64_P32_LDST64_ABS_LO12_NC sym
207
208   ldr w24, [x23, :got_lo12:sym]
209   ldr s22, [x21, :got_lo12:sym]
210// CHECK: ldr w24, [x23, :got_lo12:sym]
211// CHECK: ldr s22, [x21, :got_lo12:sym]
212// CHECK-OBJ-ILP32: R_AARCH64_P32_LD32_GOT_LO12_NC sym
213// CHECK-OBJ-ILP32: R_AARCH64_P32_LD32_GOT_LO12_NC sym
214
215   ldr x24, [x23, :dtprel_lo12_nc:sym]
216   ldr d22, [x21, :dtprel_lo12:sym]
217// CHECK: ldr x24, [x23, :dtprel_lo12_nc:sym]
218// CHECK: ldr d22, [x21, :dtprel_lo12:sym]
219// CHECK-OBJ-ILP32: R_AARCH64_P32_TLSLD_LDST64_DTPREL_LO12_NC sym
220// CHECK-OBJ-ILP32: R_AARCH64_P32_TLSLD_LDST64_DTPREL_LO12 sym
221
222   ldr q24, [x23, :dtprel_lo12_nc:sym]
223   ldr q22, [x21, :dtprel_lo12:sym]
224// CHECK: ldr q24, [x23, :dtprel_lo12_nc:sym]
225// CHECK: ldr q22, [x21, :dtprel_lo12:sym]
226// CHECK-OBJ-ILP32: R_AARCH64_P32_TLSLD_LDST128_DTPREL_LO12_NC sym
227// CHECK-OBJ-ILP32: R_AARCH64_P32_TLSLD_LDST128_DTPREL_LO12 sym
228
229   ldr x24, [x23, :tprel_lo12:sym]
230   ldr d22, [x21, :tprel_lo12_nc:sym]
231// CHECK: ldr x24, [x23, :tprel_lo12:sym]
232// CHECK: ldr d22, [x21, :tprel_lo12_nc:sym]
233// CHECK-OBJ-ILP32: R_AARCH64_P32_TLSLE_LDST64_TPREL_LO12 sym
234// CHECK-OBJ-ILP32: R_AARCH64_P32_TLSLE_LDST64_TPREL_LO12_NC sym
235
236   ldr q24, [x23, :tprel_lo12:sym]
237   ldr q22, [x21, :tprel_lo12_nc:sym]
238// CHECK: ldr q24, [x23, :tprel_lo12:sym]
239// CHECK: ldr q22, [x21, :tprel_lo12_nc:sym]
240// CHECK-OBJ-ILP32: R_AARCH64_P32_TLSLE_LDST128_TPREL_LO12 sym
241// CHECK-OBJ-ILP32: R_AARCH64_P32_TLSLE_LDST128_TPREL_LO12_NC sym
242
243   ldr w24, [x23, :gottprel_lo12:sym]
244   ldr s22, [x21, :gottprel_lo12:sym]
245
246   ldr w24, [x23, :tlsdesc_lo12:sym]
247   ldr s22, [x21, :tlsdesc_lo12:sym]
248// CHECK: ldr w24, [x23, :tlsdesc_lo12:sym]
249// CHECK: ldr s22, [x21, :tlsdesc_lo12:sym]
250// CHECK-OBJ-ILP32: R_AARCH64_P32_TLSDESC_LD32_LO12 sym
251// CHECK-OBJ-ILP32: R_AARCH64_P32_TLSDESC_LD32_LO12 sym
252
253   ldr q20, [x19, #:lo12:sym]
254// CHECK: ldr q20, [x19, :lo12:sym]
255// CHECK-OBJ-ILP32: R_AARCH64_P32_LDST128_ABS_LO12_NC sym
256// check encoding here, since encoding test doesn't belong with TLS encoding
257// tests, as it isn't a TLS relocation.
258// CHECK-ENCODING: ldr q20, [x19, :lo12:sym] // encoding: [0x74,0bAAAAAA10,0b11AAAAAA,0x3d]
259// CHECK-ENCODING-NEXT:  0, value: :lo12:sym, kind: fixup_aarch64_ldst_imm12_scale16
260
261// Since relocated instructions print without a '#', that syntax should
262// certainly be accepted when assembling.
263   add x3, x5, :lo12:imm
264// CHECK: add x3, x5, :lo12:imm
265