1// RUN: llvm-mc -triple=arm64-linux-gnu -o - < %s | FileCheck %s
2// RUN: llvm-mc -triple=arm64-linux-gnu -filetype=obj < %s | llvm-objdump -triple=arm64-linux-gnu - -r | FileCheck %s --check-prefix=CHECK-OBJ
3
4   add x0, x2, #:lo12:sym
5// CHECK: add x0, x2, :lo12:sym
6// CHECK-OBJ: 0 R_AARCH64_ADD_ABS_LO12_NC sym
7
8   add x5, x7, #:dtprel_lo12:sym
9// CHECK: add x5, x7, :dtprel_lo12:sym
10// CHECK-OBJ: 4 R_AARCH64_TLSLD_ADD_DTPREL_LO12 sym
11
12   add x9, x12, #:dtprel_lo12_nc:sym
13// CHECK: add x9, x12, :dtprel_lo12_nc:sym
14// CHECK-OBJ: 8 R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC sym
15
16   add x20, x30, #:tprel_lo12:sym
17// CHECK: add x20, x30, :tprel_lo12:sym
18// CHECK-OBJ: c R_AARCH64_TLSLE_ADD_TPREL_LO12 sym
19
20   add x9, x12, #:tprel_lo12_nc:sym
21// CHECK: add x9, x12, :tprel_lo12_nc:sym
22// CHECK-OBJ: 10 R_AARCH64_TLSLE_ADD_TPREL_LO12_NC sym
23
24   add x5, x0, #:tlsdesc_lo12:sym
25// CHECK: add x5, x0, :tlsdesc_lo12:sym
26// CHECK-OBJ: 14 R_AARCH64_TLSDESC_ADD_LO12_NC sym
27
28        add x0, x2, #:lo12:sym+8
29// CHECK: add x0, x2, :lo12:sym
30// CHECK-OBJ: 18 R_AARCH64_ADD_ABS_LO12_NC sym+8
31
32   add x5, x7, #:dtprel_lo12:sym+1
33// CHECK: add x5, x7, :dtprel_lo12:sym+1
34// CHECK-OBJ: 1c R_AARCH64_TLSLD_ADD_DTPREL_LO12 sym+1
35
36   add x9, x12, #:dtprel_lo12_nc:sym+2
37// CHECK: add x9, x12, :dtprel_lo12_nc:sym+2
38// CHECK-OBJ:20 R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC sym+2
39
40   add x20, x30, #:tprel_lo12:sym+12
41// CHECK: add x20, x30, :tprel_lo12:sym+12
42// CHECK-OBJ: 24 R_AARCH64_TLSLE_ADD_TPREL_LO12 sym+12
43
44   add x9, x12, #:tprel_lo12_nc:sym+54
45// CHECK: add x9, x12, :tprel_lo12_nc:sym+54
46// CHECK-OBJ: 28 R_AARCH64_TLSLE_ADD_TPREL_LO12_NC sym+54
47
48   add x5, x0, #:tlsdesc_lo12:sym+70
49// CHECK: add x5, x0, :tlsdesc_lo12:sym+70
50// CHECK-OBJ: 2c R_AARCH64_TLSDESC_ADD_LO12_NC sym+70
51
52        .hword sym + 4 - .
53// CHECK-OBJ: 30 R_AARCH64_PREL16 sym+4
54        .word sym - . + 8
55// CHECK-OBJ: 32 R_AARCH64_PREL32 sym+8
56        .xword sym-.
57// CHECK-OBJ: 36 R_AARCH64_PREL64 sym{{$}}
58
59        .hword sym
60// CHECK-OBJ: 3e R_AARCH64_ABS16 sym
61        .word sym+1
62// CHECK-OBJ: 40 R_AARCH64_ABS32 sym+1
63        .xword sym+16
64// CHECK-OBJ: 44 R_AARCH64_ABS64 sym+16
65
66   adrp x0, sym
67// CHECK: adrp x0, sym
68// CHECK-OBJ: 4c R_AARCH64_ADR_PREL_PG_HI21 sym
69
70   adrp x15, :got:sym
71// CHECK: adrp x15, :got:sym
72// CHECK-OBJ: 50 R_AARCH64_ADR_GOT_PAGE sym
73
74   adrp x29, :gottprel:sym
75// CHECK: adrp x29, :gottprel:sym
76// CHECK-OBJ: 54 R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 sym
77
78   adrp x2, :tlsdesc:sym
79// CHECK: adrp x2, :tlsdesc:sym
80// CHECK-OBJ: 58 R_AARCH64_TLSDESC_ADR_PAGE sym
81
82   // LLVM is not competent enough to do this relocation because the
83   // page boundary could occur anywhere after linking. A relocation
84   // is needed.
85   adrp x3, trickQuestion
86   .global trickQuestion
87trickQuestion:
88// CHECK: adrp x3, trickQuestion
89// CHECK-OBJ: 5c R_AARCH64_ADR_PREL_PG_HI21 trickQuestion
90
91   ldrb w2, [x3, :lo12:sym]
92   ldrsb w5, [x7, #:lo12:sym]
93   ldrsb x11, [x13, :lo12:sym]
94   ldr b17, [x19, #:lo12:sym]
95// CHECK: ldrb w2, [x3, :lo12:sym]
96// CHECK: ldrsb w5, [x7, :lo12:sym]
97// CHECK: ldrsb x11, [x13, :lo12:sym]
98// CHECK: ldr b17, [x19, :lo12:sym]
99// CHECK-OBJ: R_AARCH64_LDST8_ABS_LO12_NC sym
100// CHECK-OBJ: R_AARCH64_LDST8_ABS_LO12_NC sym
101// CHECK-OBJ: R_AARCH64_LDST8_ABS_LO12_NC sym
102// CHECK-OBJ: R_AARCH64_LDST8_ABS_LO12_NC sym
103
104   ldrb w23, [x29, #:dtprel_lo12_nc:sym]
105   ldrsb w23, [x19, #:dtprel_lo12:sym]
106   ldrsb x17, [x13, :dtprel_lo12_nc:sym]
107   ldr b11, [x7, #:dtprel_lo12:sym]
108// CHECK: ldrb w23, [x29, :dtprel_lo12_nc:sym]
109// CHECK: ldrsb w23, [x19, :dtprel_lo12:sym]
110// CHECK: ldrsb x17, [x13, :dtprel_lo12_nc:sym]
111// CHECK: ldr b11, [x7, :dtprel_lo12:sym]
112// CHECK-OBJ: R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC sym
113// CHECK-OBJ: R_AARCH64_TLSLD_LDST8_DTPREL_LO12 sym
114// CHECK-OBJ: R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC sym
115// CHECK-OBJ: R_AARCH64_TLSLD_LDST8_DTPREL_LO12 sym
116
117   ldrb w1, [x2, :tprel_lo12:sym]
118   ldrsb w3, [x4, #:tprel_lo12_nc:sym]
119   ldrsb x5, [x6, :tprel_lo12:sym]
120   ldr b7, [x8, #:tprel_lo12_nc:sym]
121// CHECK: ldrb w1, [x2, :tprel_lo12:sym]
122// CHECK: ldrsb w3, [x4, :tprel_lo12_nc:sym]
123// CHECK: ldrsb x5, [x6, :tprel_lo12:sym]
124// CHECK: ldr b7, [x8, :tprel_lo12_nc:sym]
125// CHECK-OBJ: R_AARCH64_TLSLE_LDST8_TPREL_LO12 sym
126// CHECK-OBJ: R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC sym
127// CHECK-OBJ: R_AARCH64_TLSLE_LDST8_TPREL_LO12 sym
128// CHECK-OBJ: R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC sym
129
130   ldrh w2, [x3, #:lo12:sym]
131   ldrsh w5, [x7, :lo12:sym]
132   ldrsh x11, [x13, #:lo12:sym]
133   ldr h17, [x19, :lo12:sym]
134// CHECK: ldrh w2, [x3, :lo12:sym]
135// CHECK: ldrsh w5, [x7, :lo12:sym]
136// CHECK: ldrsh x11, [x13, :lo12:sym]
137// CHECK: ldr h17, [x19, :lo12:sym]
138// CHECK-OBJ: R_AARCH64_LDST16_ABS_LO12_NC sym
139// CHECK-OBJ: R_AARCH64_LDST16_ABS_LO12_NC sym
140// CHECK-OBJ: R_AARCH64_LDST16_ABS_LO12_NC sym
141// CHECK-OBJ: R_AARCH64_LDST16_ABS_LO12_NC sym
142
143   ldrh w23, [x29, #:dtprel_lo12_nc:sym]
144   ldrsh w23, [x19, :dtprel_lo12:sym]
145   ldrsh x17, [x13, :dtprel_lo12_nc:sym]
146   ldr h11, [x7, #:dtprel_lo12:sym]
147// CHECK: ldrh w23, [x29, :dtprel_lo12_nc:sym]
148// CHECK: ldrsh w23, [x19, :dtprel_lo12:sym]
149// CHECK: ldrsh x17, [x13, :dtprel_lo12_nc:sym]
150// CHECK: ldr h11, [x7, :dtprel_lo12:sym]
151// CHECK-OBJ: R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC sym
152// CHECK-OBJ: R_AARCH64_TLSLD_LDST16_DTPREL_LO12 sym
153// CHECK-OBJ: R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC sym
154// CHECK-OBJ: R_AARCH64_TLSLD_LDST16_DTPREL_LO12 sym
155
156   ldrh w1, [x2, :tprel_lo12:sym]
157   ldrsh w3, [x4, #:tprel_lo12_nc:sym]
158   ldrsh x5, [x6, :tprel_lo12:sym]
159   ldr h7, [x8, #:tprel_lo12_nc:sym]
160// CHECK: ldrh w1, [x2, :tprel_lo12:sym]
161// CHECK: ldrsh w3, [x4, :tprel_lo12_nc:sym]
162// CHECK: ldrsh x5, [x6, :tprel_lo12:sym]
163// CHECK: ldr h7, [x8, :tprel_lo12_nc:sym]
164// CHECK-OBJ: R_AARCH64_TLSLE_LDST16_TPREL_LO12 sym
165// CHECK-OBJ: R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC sym
166// CHECK-OBJ: R_AARCH64_TLSLE_LDST16_TPREL_LO12 sym
167// CHECK-OBJ: R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC sym
168
169   ldr w1, [x2, #:lo12:sym]
170   ldrsw x3, [x4, #:lo12:sym]
171   ldr s4, [x5, :lo12:sym]
172// CHECK: ldr w1, [x2, :lo12:sym]
173// CHECK: ldrsw x3, [x4, :lo12:sym]
174// CHECK: ldr s4, [x5, :lo12:sym]
175// CHECK-OBJ: R_AARCH64_LDST32_ABS_LO12_NC sym
176// CHECK-OBJ: R_AARCH64_LDST32_ABS_LO12_NC sym
177// CHECK-OBJ: R_AARCH64_LDST32_ABS_LO12_NC sym
178
179   ldr w1, [x2, :dtprel_lo12:sym]
180   ldrsw x3, [x4, #:dtprel_lo12_nc:sym]
181   ldr s4, [x5, #:dtprel_lo12_nc:sym]
182// CHECK: ldr w1, [x2, :dtprel_lo12:sym]
183// CHECK: ldrsw x3, [x4, :dtprel_lo12_nc:sym]
184// CHECK: ldr s4, [x5, :dtprel_lo12_nc:sym]
185// CHECK-OBJ: R_AARCH64_TLSLD_LDST32_DTPREL_LO12 sym
186// CHECK-OBJ: R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC sym
187// CHECK-OBJ: R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC sym
188
189
190   ldr w1, [x2, #:tprel_lo12:sym]
191   ldrsw x3, [x4, :tprel_lo12_nc:sym]
192   ldr s4, [x5, :tprel_lo12_nc:sym]
193// CHECK: ldr w1, [x2, :tprel_lo12:sym]
194// CHECK: ldrsw x3, [x4, :tprel_lo12_nc:sym]
195// CHECK: ldr s4, [x5, :tprel_lo12_nc:sym]
196// CHECK-OBJ: R_AARCH64_TLSLE_LDST32_TPREL_LO12 sym
197// CHECK-OBJ: R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC sym
198// CHECK-OBJ: R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC sym
199
200   ldr x28, [x27, :lo12:sym]
201   ldr d26, [x25, #:lo12:sym]
202// CHECK: ldr x28, [x27, :lo12:sym]
203// CHECK: ldr d26, [x25, :lo12:sym]
204// CHECK-OBJ: R_AARCH64_LDST64_ABS_LO12_NC sym
205// CHECK-OBJ: R_AARCH64_LDST64_ABS_LO12_NC sym
206
207   ldr x24, [x23, #:got_lo12:sym]
208   ldr d22, [x21, :got_lo12:sym]
209// CHECK: ldr x24, [x23, :got_lo12:sym]
210// CHECK: ldr d22, [x21, :got_lo12:sym]
211// CHECK-OBJ: R_AARCH64_LD64_GOT_LO12_NC sym
212// CHECK-OBJ: R_AARCH64_LD64_GOT_LO12_NC sym
213
214   ldr x24, [x23, :dtprel_lo12_nc:sym]
215   ldr d22, [x21, #:dtprel_lo12:sym]
216// CHECK: ldr x24, [x23, :dtprel_lo12_nc:sym]
217// CHECK: ldr d22, [x21, :dtprel_lo12:sym]
218// CHECK-OBJ: R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC sym
219// CHECK-OBJ: R_AARCH64_TLSLD_LDST64_DTPREL_LO12 sym
220
221   ldr x24, [x23, #:tprel_lo12:sym]
222   ldr d22, [x21, :tprel_lo12_nc:sym]
223// CHECK: ldr x24, [x23, :tprel_lo12:sym]
224// CHECK: ldr d22, [x21, :tprel_lo12_nc:sym]
225// CHECK-OBJ: R_AARCH64_TLSLE_LDST64_TPREL_LO12 sym
226// CHECK-OBJ: R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC sym
227
228   ldr x24, [x23, :gottprel_lo12:sym]
229   ldr d22, [x21, #:gottprel_lo12:sym]
230// CHECK: ldr x24, [x23, :gottprel_lo12:sym]
231// CHECK: ldr d22, [x21, :gottprel_lo12:sym]
232// CHECK-OBJ: R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC sym
233// CHECK-OBJ: R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC sym
234
235   ldr x24, [x23, #:tlsdesc_lo12:sym]
236   ldr d22, [x21, :tlsdesc_lo12:sym]
237// CHECK: ldr x24, [x23, :tlsdesc_lo12:sym]
238// CHECK: ldr d22, [x21, :tlsdesc_lo12:sym]
239// CHECK-OBJ: R_AARCH64_TLSDESC_LD64_LO12_NC sym
240// CHECK-OBJ: R_AARCH64_TLSDESC_LD64_LO12_NC sym
241
242   ldr q20, [x19, #:lo12:sym]
243// CHECK: ldr q20, [x19, :lo12:sym]
244// CHECK-OBJ: R_AARCH64_LDST128_ABS_LO12_NC sym
245
246// Since relocated instructions print without a '#', that syntax should
247// certainly be accepted when assembling.
248   add x3, x5, :lo12:imm
249// CHECK: add x3, x5, :lo12:imm
250