1// RUN: llvm-mc -n -triple x86_64-apple-darwin9 %s -filetype=obj -o - | llvm-readobj -r --expand-relocs | FileCheck %s
2
3// These examples are taken from <mach-o/x86_64/reloc.h>.
4
5        .data
6        .long 0
7
8        .text
9_foo:
10        ret
11
12_baz:
13        call _foo
14 	call _foo+4
15 	movq _foo@GOTPCREL(%rip), %rax
16 	pushq _foo@GOTPCREL(%rip)
17 	movl _foo(%rip), %eax
18 	movl _foo+4(%rip), %eax
19 	movb  $0x12, _foo(%rip)
20 	movl  $0x12345678, _foo(%rip)
21 	.quad _foo
22_bar:
23 	.quad _foo+4
24 	.quad _foo - _bar
25 	.quad _foo - _bar + 4
26 	.long _foo - _bar
27 	leaq L1(%rip), %rax
28 	leaq L0(%rip), %rax
29        addl $6,L0(%rip)
30        addw $500,L0(%rip)
31        addl $500,L0(%rip)
32
33_prev:
34        .space 12,0x90
35 	.quad L1
36L0:
37        .quad L0
38L_pc:
39 	.quad _foo - L_pc
40 	.quad _foo - L1
41L1:
42 	.quad L1 - _prev
43
44        .data
45.long	_foobar@GOTPCREL+4
46.long	_foo@GOTPCREL+4
47
48        .section	__DWARF,__debug_frame,regular,debug
49        .quad L1
50        .quad _ext_foo
51
52// Make sure local label which overlaps with non-local one is assigned to the
53// right atom.
54        .text
55_f2:
56L2_0:
57        addl $0, %eax
58L2_1:
59_f3:
60        addl L2_1 - L2_0, %eax
61
62        .data
63L4:
64        .long 0
65        .text
66        movl L4(%rip), %eax
67
68        .section __TEXT,__literal8,8byte_literals
69	.quad 0
70L5:
71	.quad 0
72f6:
73        .quad 0
74L6:
75        .quad 0
76
77        .text
78	movl L5(%rip), %eax
79	movl f6(%rip), %eax
80	movl L6(%rip), %eax
81
82        .data
83        .quad L5
84        .quad f6
85	.quad L6
86
87        .text
88        cmpq $0, _foo@GOTPCREL(%rip)
89
90// CHECK:      Relocations [
91// CHECK-NEXT:   Section __data {
92// CHECK-NEXT:     Relocation {
93// CHECK-NEXT:       Offset: 0x20
94// CHECK-NEXT:       PCRel: 0
95// CHECK-NEXT:       Length: 3
96// CHECK-NEXT:       Extern: 0
97// CHECK-NEXT:       Type: X86_64_RELOC_UNSIGNED (0)
98// CHECK-NEXT:       Symbol: 0x4
99// CHECK-NEXT:       Scattered: 0
100// CHECK-NEXT:     }
101// CHECK-NEXT:     Relocation {
102// CHECK-NEXT:       Offset: 0x18
103// CHECK-NEXT:       PCRel: 0
104// CHECK-NEXT:       Length: 3
105// CHECK-NEXT:       Extern: 1
106// CHECK-NEXT:       Type: X86_64_RELOC_UNSIGNED (0)
107// CHECK-NEXT:       Symbol: f6
108// CHECK-NEXT:       Scattered: 0
109// CHECK-NEXT:     }
110// CHECK-NEXT:     Relocation {
111// CHECK-NEXT:       Offset: 0x10
112// CHECK-NEXT:       PCRel: 0
113// CHECK-NEXT:       Length: 3
114// CHECK-NEXT:       Extern: 0
115// CHECK-NEXT:       Type: X86_64_RELOC_UNSIGNED (0)
116// CHECK-NEXT:       Symbol: 0x4
117// CHECK-NEXT:       Scattered: 0
118// CHECK-NEXT:     }
119// CHECK-NEXT:     Relocation {
120// CHECK-NEXT:       Offset: 0x8
121// CHECK-NEXT:       PCRel: 1
122// CHECK-NEXT:       Length: 2
123// CHECK-NEXT:       Extern: 1
124// CHECK-NEXT:       Type: X86_64_RELOC_GOT (4)
125// CHECK-NEXT:       Symbol: _foo
126// CHECK-NEXT:       Scattered: 0
127// CHECK-NEXT:     }
128// CHECK-NEXT:     Relocation {
129// CHECK-NEXT:       Offset: 0x4
130// CHECK-NEXT:       PCRel: 1
131// CHECK-NEXT:       Length: 2
132// CHECK-NEXT:       Extern: 1
133// CHECK-NEXT:       Type: X86_64_RELOC_GOT (4)
134// CHECK-NEXT:       Symbol: _foobar
135// CHECK-NEXT:       Scattered: 0
136// CHECK-NEXT:     }
137// CHECK-NEXT:   }
138// CHECK-NEXT:   Section __text {
139// CHECK-NEXT:     Relocation {
140// CHECK-NEXT:       Offset: 0xDA
141// CHECK-NEXT:       PCRel: 1
142// CHECK-NEXT:       Length: 2
143// CHECK-NEXT:       Extern: 1
144// CHECK-NEXT:       Type: X86_64_RELOC_GOT (4)
145// CHECK-NEXT:       Symbol: _foo
146// CHECK-NEXT:       Scattered: 0
147// CHECK-NEXT:     }
148// CHECK-NEXT:     Relocation {
149// CHECK-NEXT:       Offset: 0xD3
150// CHECK-NEXT:       PCRel: 1
151// CHECK-NEXT:       Length: 2
152// CHECK-NEXT:       Extern: 0
153// CHECK-NEXT:       Type: X86_64_RELOC_SIGNED (1)
154// CHECK-NEXT:       Symbol: 0x4
155// CHECK-NEXT:       Scattered: 0
156// CHECK-NEXT:     }
157// CHECK-NEXT:     Relocation {
158// CHECK-NEXT:       Offset: 0xCD
159// CHECK-NEXT:       PCRel: 1
160// CHECK-NEXT:       Length: 2
161// CHECK-NEXT:       Extern: 1
162// CHECK-NEXT:       Type: X86_64_RELOC_SIGNED (1)
163// CHECK-NEXT:       Symbol: f6
164// CHECK-NEXT:       Scattered: 0
165// CHECK-NEXT:     }
166// CHECK-NEXT:     Relocation {
167// CHECK-NEXT:       Offset: 0xC7
168// CHECK-NEXT:       PCRel: 1
169// CHECK-NEXT:       Length: 2
170// CHECK-NEXT:       Extern: 0
171// CHECK-NEXT:       Type: X86_64_RELOC_SIGNED (1)
172// CHECK-NEXT:       Symbol: 0x4
173// CHECK-NEXT:       Scattered: 0
174// CHECK-NEXT:     }
175// CHECK-NEXT:     Relocation {
176// CHECK-NEXT:       Offset: 0xC1
177// CHECK-NEXT:       PCRel: 1
178// CHECK-NEXT:       Length: 2
179// CHECK-NEXT:       Extern: 0
180// CHECK-NEXT:       Type: X86_64_RELOC_SIGNED (1)
181// CHECK-NEXT:       Symbol: 0x1
182// CHECK-NEXT:       Scattered: 0
183// CHECK-NEXT:     }
184// CHECK-NEXT:     Relocation {
185// CHECK-NEXT:       Offset: 0xA5
186// CHECK-NEXT:       PCRel: 0
187// CHECK-NEXT:       Length: 3
188// CHECK-NEXT:       Extern: 1
189// CHECK-NEXT:       Type: X86_64_RELOC_SUBTRACTOR (5)
190// CHECK-NEXT:       Symbol: _prev
191// CHECK-NEXT:       Scattered: 0
192// CHECK-NEXT:     }
193// CHECK-NEXT:     Relocation {
194// CHECK-NEXT:       Offset: 0xA5
195// CHECK-NEXT:       PCRel: 0
196// CHECK-NEXT:       Length: 3
197// CHECK-NEXT:       Extern: 1
198// CHECK-NEXT:       Type: X86_64_RELOC_UNSIGNED (0)
199// CHECK-NEXT:       Symbol: _foo
200// CHECK-NEXT:       Scattered: 0
201// CHECK-NEXT:     }
202// CHECK-NEXT:     Relocation {
203// CHECK-NEXT:       Offset: 0x9D
204// CHECK-NEXT:       PCRel: 0
205// CHECK-NEXT:       Length: 3
206// CHECK-NEXT:       Extern: 1
207// CHECK-NEXT:       Type: X86_64_RELOC_SUBTRACTOR (5)
208// CHECK-NEXT:       Symbol: _prev
209// CHECK-NEXT:       Scattered: 0
210// CHECK-NEXT:     }
211// CHECK-NEXT:     Relocation {
212// CHECK-NEXT:       Offset: 0x9D
213// CHECK-NEXT:       PCRel: 0
214// CHECK-NEXT:       Length: 3
215// CHECK-NEXT:       Extern: 1
216// CHECK-NEXT:       Type: X86_64_RELOC_UNSIGNED (0)
217// CHECK-NEXT:       Symbol: _foo
218// CHECK-NEXT:       Scattered: 0
219// CHECK-NEXT:     }
220// CHECK-NEXT:     Relocation {
221// CHECK-NEXT:       Offset: 0x95
222// CHECK-NEXT:       PCRel: 0
223// CHECK-NEXT:       Length: 3
224// CHECK-NEXT:       Extern: 1
225// CHECK-NEXT:       Type: X86_64_RELOC_UNSIGNED (0)
226// CHECK-NEXT:       Symbol: _prev
227// CHECK-NEXT:       Scattered: 0
228// CHECK-NEXT:     }
229// CHECK-NEXT:     Relocation {
230// CHECK-NEXT:       Offset: 0x8D
231// CHECK-NEXT:       PCRel: 0
232// CHECK-NEXT:       Length: 3
233// CHECK-NEXT:       Extern: 1
234// CHECK-NEXT:       Type: X86_64_RELOC_UNSIGNED (0)
235// CHECK-NEXT:       Symbol: _prev
236// CHECK-NEXT:       Scattered: 0
237// CHECK-NEXT:     }
238// CHECK-NEXT:     Relocation {
239// CHECK-NEXT:       Offset: 0x79
240// CHECK-NEXT:       PCRel: 1
241// CHECK-NEXT:       Length: 2
242// CHECK-NEXT:       Extern: 1
243// CHECK-NEXT:       Type: X86_64_RELOC_SIGNED_4 (8)
244// CHECK-NEXT:       Symbol: _prev
245// CHECK-NEXT:       Scattered: 0
246// CHECK-NEXT:     }
247// CHECK-NEXT:     Relocation {
248// CHECK-NEXT:       Offset: 0x71
249// CHECK-NEXT:       PCRel: 1
250// CHECK-NEXT:       Length: 2
251// CHECK-NEXT:       Extern: 1
252// CHECK-NEXT:       Type: X86_64_RELOC_SIGNED_2 (7)
253// CHECK-NEXT:       Symbol: _prev
254// CHECK-NEXT:       Scattered: 0
255// CHECK-NEXT:     }
256// CHECK-NEXT:     Relocation {
257// CHECK-NEXT:       Offset: 0x69
258// CHECK-NEXT:       PCRel: 1
259// CHECK-NEXT:       Length: 2
260// CHECK-NEXT:       Extern: 1
261// CHECK-NEXT:       Type: X86_64_RELOC_SIGNED_1 (6)
262// CHECK-NEXT:       Symbol: _prev
263// CHECK-NEXT:       Scattered: 0
264// CHECK-NEXT:     }
265// CHECK-NEXT:     Relocation {
266// CHECK-NEXT:       Offset: 0x63
267// CHECK-NEXT:       PCRel: 1
268// CHECK-NEXT:       Length: 2
269// CHECK-NEXT:       Extern: 1
270// CHECK-NEXT:       Type: X86_64_RELOC_SIGNED (1)
271// CHECK-NEXT:       Symbol: _prev
272// CHECK-NEXT:       Scattered: 0
273// CHECK-NEXT:     }
274// CHECK-NEXT:     Relocation {
275// CHECK-NEXT:       Offset: 0x5C
276// CHECK-NEXT:       PCRel: 1
277// CHECK-NEXT:       Length: 2
278// CHECK-NEXT:       Extern: 1
279// CHECK-NEXT:       Type: X86_64_RELOC_SIGNED (1)
280// CHECK-NEXT:       Symbol: _prev
281// CHECK-NEXT:       Scattered: 0
282// CHECK-NEXT:     }
283// CHECK-NEXT:     Relocation {
284// CHECK-NEXT:       Offset: 0x55
285// CHECK-NEXT:       PCRel: 0
286// CHECK-NEXT:       Length: 2
287// CHECK-NEXT:       Extern: 1
288// CHECK-NEXT:       Type: X86_64_RELOC_SUBTRACTOR (5)
289// CHECK-NEXT:       Symbol: _bar
290// CHECK-NEXT:       Scattered: 0
291// CHECK-NEXT:     }
292// CHECK-NEXT:     Relocation {
293// CHECK-NEXT:       Offset: 0x55
294// CHECK-NEXT:       PCRel: 0
295// CHECK-NEXT:       Length: 2
296// CHECK-NEXT:       Extern: 1
297// CHECK-NEXT:       Type: X86_64_RELOC_UNSIGNED (0)
298// CHECK-NEXT:       Symbol: _foo
299// CHECK-NEXT:       Scattered: 0
300// CHECK-NEXT:     }
301// CHECK-NEXT:     Relocation {
302// CHECK-NEXT:       Offset: 0x4D
303// CHECK-NEXT:       PCRel: 0
304// CHECK-NEXT:       Length: 3
305// CHECK-NEXT:       Extern: 1
306// CHECK-NEXT:       Type: X86_64_RELOC_SUBTRACTOR (5)
307// CHECK-NEXT:       Symbol: _bar
308// CHECK-NEXT:       Scattered: 0
309// CHECK-NEXT:     }
310// CHECK-NEXT:     Relocation {
311// CHECK-NEXT:       Offset: 0x4D
312// CHECK-NEXT:       PCRel: 0
313// CHECK-NEXT:       Length: 3
314// CHECK-NEXT:       Extern: 1
315// CHECK-NEXT:       Type: X86_64_RELOC_UNSIGNED (0)
316// CHECK-NEXT:       Symbol: _foo
317// CHECK-NEXT:       Scattered: 0
318// CHECK-NEXT:     }
319// CHECK-NEXT:     Relocation {
320// CHECK-NEXT:       Offset: 0x45
321// CHECK-NEXT:       PCRel: 0
322// CHECK-NEXT:       Length: 3
323// CHECK-NEXT:       Extern: 1
324// CHECK-NEXT:       Type: X86_64_RELOC_SUBTRACTOR (5)
325// CHECK-NEXT:       Symbol: _bar
326// CHECK-NEXT:       Scattered: 0
327// CHECK-NEXT:     }
328// CHECK-NEXT:     Relocation {
329// CHECK-NEXT:       Offset: 0x45
330// CHECK-NEXT:       PCRel: 0
331// CHECK-NEXT:       Length: 3
332// CHECK-NEXT:       Extern: 1
333// CHECK-NEXT:       Type: X86_64_RELOC_UNSIGNED (0)
334// CHECK-NEXT:       Symbol: _foo
335// CHECK-NEXT:       Scattered: 0
336// CHECK-NEXT:     }
337// CHECK-NEXT:     Relocation {
338// CHECK-NEXT:       Offset: 0x3D
339// CHECK-NEXT:       PCRel: 0
340// CHECK-NEXT:       Length: 3
341// CHECK-NEXT:       Extern: 1
342// CHECK-NEXT:       Type: X86_64_RELOC_UNSIGNED (0)
343// CHECK-NEXT:       Symbol: _foo
344// CHECK-NEXT:       Scattered: 0
345// CHECK-NEXT:     }
346// CHECK-NEXT:     Relocation {
347// CHECK-NEXT:       Offset: 0x35
348// CHECK-NEXT:       PCRel: 0
349// CHECK-NEXT:       Length: 3
350// CHECK-NEXT:       Extern: 1
351// CHECK-NEXT:       Type: X86_64_RELOC_UNSIGNED (0)
352// CHECK-NEXT:       Symbol: _foo
353// CHECK-NEXT:       Scattered: 0
354// CHECK-NEXT:     }
355// CHECK-NEXT:     Relocation {
356// CHECK-NEXT:       Offset: 0x2D
357// CHECK-NEXT:       PCRel: 1
358// CHECK-NEXT:       Length: 2
359// CHECK-NEXT:       Extern: 1
360// CHECK-NEXT:       Type: X86_64_RELOC_SIGNED_4 (8)
361// CHECK-NEXT:       Symbol: _foo
362// CHECK-NEXT:       Scattered: 0
363// CHECK-NEXT:     }
364// CHECK-NEXT:     Relocation {
365// CHECK-NEXT:       Offset: 0x26
366// CHECK-NEXT:       PCRel: 1
367// CHECK-NEXT:       Length: 2
368// CHECK-NEXT:       Extern: 1
369// CHECK-NEXT:       Type: X86_64_RELOC_SIGNED_1 (6)
370// CHECK-NEXT:       Symbol: _foo
371// CHECK-NEXT:       Scattered: 0
372// CHECK-NEXT:     }
373// CHECK-NEXT:     Relocation {
374// CHECK-NEXT:       Offset: 0x20
375// CHECK-NEXT:       PCRel: 1
376// CHECK-NEXT:       Length: 2
377// CHECK-NEXT:       Extern: 1
378// CHECK-NEXT:       Type: X86_64_RELOC_SIGNED (1)
379// CHECK-NEXT:       Symbol: _foo
380// CHECK-NEXT:       Scattered: 0
381// CHECK-NEXT:     }
382// CHECK-NEXT:     Relocation {
383// CHECK-NEXT:       Offset: 0x1A
384// CHECK-NEXT:       PCRel: 1
385// CHECK-NEXT:       Length: 2
386// CHECK-NEXT:       Extern: 1
387// CHECK-NEXT:       Type: X86_64_RELOC_SIGNED (1)
388// CHECK-NEXT:       Symbol: _foo
389// CHECK-NEXT:       Scattered: 0
390// CHECK-NEXT:     }
391// CHECK-NEXT:     Relocation {
392// CHECK-NEXT:       Offset: 0x14
393// CHECK-NEXT:       PCRel: 1
394// CHECK-NEXT:       Length: 2
395// CHECK-NEXT:       Extern: 1
396// CHECK-NEXT:       Type: X86_64_RELOC_GOT (4)
397// CHECK-NEXT:       Symbol: _foo
398// CHECK-NEXT:       Scattered: 0
399// CHECK-NEXT:     }
400// CHECK-NEXT:     Relocation {
401// CHECK-NEXT:       Offset: 0xE
402// CHECK-NEXT:       PCRel: 1
403// CHECK-NEXT:       Length: 2
404// CHECK-NEXT:       Extern: 1
405// CHECK-NEXT:       Type: X86_64_RELOC_GOT_LOAD (3)
406// CHECK-NEXT:       Symbol: _foo
407// CHECK-NEXT:       Scattered: 0
408// CHECK-NEXT:     }
409// CHECK-NEXT:     Relocation {
410// CHECK-NEXT:       Offset: 0x7
411// CHECK-NEXT:       PCRel: 1
412// CHECK-NEXT:       Length: 2
413// CHECK-NEXT:       Extern: 1
414// CHECK-NEXT:       Type: X86_64_RELOC_BRANCH (2)
415// CHECK-NEXT:       Symbol: _foo
416// CHECK-NEXT:       Scattered: 0
417// CHECK-NEXT:     }
418// CHECK-NEXT:     Relocation {
419// CHECK-NEXT:       Offset: 0x2
420// CHECK-NEXT:       PCRel: 1
421// CHECK-NEXT:       Length: 2
422// CHECK-NEXT:       Extern: 1
423// CHECK-NEXT:       Type: X86_64_RELOC_BRANCH (2)
424// CHECK-NEXT:       Symbol: _foo
425// CHECK-NEXT:       Scattered: 0
426// CHECK-NEXT:     }
427// CHECK-NEXT:   }
428// CHECK-NEXT:   Section __debug_frame {
429// CHECK-NEXT:     Relocation {
430// CHECK-NEXT:       Offset: 0x8
431// CHECK-NEXT:       PCRel: 0
432// CHECK-NEXT:       Length: 3
433// CHECK-NEXT:       Extern: 1
434// CHECK-NEXT:       Type: X86_64_RELOC_UNSIGNED (0)
435// CHECK-NEXT:       Symbol: _ext_foo
436// CHECK-NEXT:       Scattered: 0
437// CHECK-NEXT:     }
438// CHECK-NEXT:     Relocation {
439// CHECK-NEXT:       Offset: 0x0
440// CHECK-NEXT:       PCRel: 0
441// CHECK-NEXT:       Length: 3
442// CHECK-NEXT:       Extern: 0
443// CHECK-NEXT:       Type: X86_64_RELOC_UNSIGNED (0)
444// CHECK-NEXT:       Symbol: 0x2
445// CHECK-NEXT:       Scattered: 0
446// CHECK-NEXT:     }
447// CHECK-NEXT:   }
448// CHECK-NEXT: ]
449