[ThinLTO] Add code comment. NFC
[llvm-complete.git] / test / MC / MachO / darwin-x86_64-diff-relocs.s
blob3a25999c2b8c680f0f6e98978125e73481313d44
1 // RUN: llvm-mc -triple x86_64-apple-darwin10 %s -filetype=obj -o - | llvm-readobj --file-headers -S --sd -r --symbols --macho-segment --macho-dysymtab --macho-indirect-symbols | FileCheck %s
3 .text
5 // FIXME: llvm-mc doesn't handle this in a way we can make compatible with 'as',
6 // currently, because of how we handle assembler variables.
7 //
8 // See <rdar://problem/7763719> improve handling of absolute symbols
10 // _baz = 4
12 _foo:
13 xorl %eax,%eax
14 _g0:
15 xorl %eax,%eax
16 L0:
17 jmp 4
18 // jmp _baz
20 // FIXME: Darwin 'as' for historical reasons widens this jump, but doesn't emit
21 // a relocation. It seems like 'as' widens any jump that is not to a temporary,
22 // which is inherited from the x86_32 behavior, even though x86_64 could do
23 // better.
24 // jmp _g0
26 jmp L0
27 jmp _g1
29 // FIXME: Darwin 'as' gets this wrong as well, even though it could get it right
30 // given the other things we do on x86_64. It is using a short jump here. This
31 // is probably fallout of the hack that exists for x86_32.
32 // jmp L1
34 // FIXME: We don't support this, and would currently get it wrong, it should be a jump to an absolute address.
35 // jmp L0 - _g0
37 // jmp _g1 - _g0
38 // FIXME: Darwin 'as' comes up with 'SIGNED' here instead of 'BRANCH'.
39 // jmp _g1 - L1
40 // FIXME: Darwin 'as' gets this completely wrong. It ends up with a single
41 // branch relocation. Fallout from the other delta hack?
42 // jmp L1 - _g0
44 jmp _g2
45 jmp L2
46 jmp _g3
47 jmp L3
48 // FIXME: Darwin 'as' gets this completely wrong. It ends up with a single
49 // branch relocation. Fallout from the other delta hack?
50 // jmp L2 - _g3
51 // jmp _g3 - _g2
52 // FIXME: Darwin 'as' comes up with 'SIGNED' here instead of 'BRANCH'.
53 // jmp _g3 - L3
54 // FIXME: Darwin 'as' gets this completely wrong. It ends up with a single
55 // branch relocation. Fallout from the other delta hack?
56 // jmp L3 - _g2
58 movl %eax,4(%rip)
59 // movl %eax,_baz(%rip)
60 movl %eax,_g0(%rip)
61 movl %eax,L0(%rip)
62 movl %eax,_g1(%rip)
63 movl %eax,L1(%rip)
65 // FIXME: Darwin 'as' gets most of these wrong, and there is an ambiguity in ATT
66 // syntax in what they should mean in the first place (absolute or
67 // rip-relative address).
68 // movl %eax,L0 - _g0(%rip)
69 // movl %eax,_g1 - _g0(%rip)
70 // movl %eax,_g1 - L1(%rip)
71 // movl %eax,L1 - _g0(%rip)
73 movl %eax,_g2(%rip)
74 movl %eax,L2(%rip)
75 movl %eax,_g3(%rip)
76 movl %eax,L3(%rip)
78 // FIXME: Darwin 'as' gets most of these wrong, and there is an ambiguity in ATT
79 // syntax in what they should mean in the first place (absolute or
80 // rip-relative address).
81 // movl %eax,L2 - _g2(%rip)
82 // movl %eax,_g3 - _g2(%rip)
83 // movl %eax,_g3 - L3(%rip)
84 // movl %eax,L3 - _g2(%rip)
86 _g1:
87 xorl %eax,%eax
88 L1:
89 xorl %eax,%eax
91 .data
92 _g2:
93 xorl %eax,%eax
94 L2:
95 .quad 4
96 // .quad _baz
97 .quad _g2
98 .quad L2
99 .quad _g3
100 .quad L3
101 .quad L2 - _g2
102 .quad _g3 - _g2
103 .quad L3 - _g2
104 .quad L3 - _g3
106 .quad _g0
107 .quad L0
108 .quad _g1
109 .quad L1
110 .quad L0 - _g0
111 .quad _g1 - _g0
112 .quad L1 - _g0
113 .quad L1 - _g1
115 _g3:
116 xorl %eax,%eax
118 xorl %eax,%eax
120 // FIXME: Unfortunately, we do not get these relocations in exactly the same
121 // order as Darwin 'as'. It turns out that 'as' *usually* ends up emitting
122 // them in reverse address order, but sometimes it allocates some
123 // additional relocations late so these end up precede the other entries. I
124 // haven't figured out the exact criteria for this yet.
126 // CHECK: File: <stdin>
127 // CHECK: Format: Mach-O 64-bit x86-64
128 // CHECK: Arch: x86_64
129 // CHECK: AddressSize: 64bit
130 // CHECK: MachHeader {
131 // CHECK: Magic: Magic64 (0xFEEDFACF)
132 // CHECK: CpuType: X86-64 (0x1000007)
133 // CHECK: CpuSubType: CPU_SUBTYPE_X86_64_ALL (0x3)
134 // CHECK: FileType: Relocatable (0x1)
135 // CHECK: NumOfLoadCommands: 4
136 // CHECK: SizeOfLoadCommands: 352
137 // CHECK: Flags [ (0x0)
138 // CHECK: ]
139 // CHECK: Reserved: 0x0
140 // CHECK: }
141 // CHECK: Sections [
142 // CHECK: Section {
143 // CHECK: Index: 0
144 // CHECK: Name: __text (5F 5F 74 65 78 74 00 00 00 00 00 00 00 00 00 00)
145 // CHECK: Segment: __TEXT (5F 5F 54 45 58 54 00 00 00 00 00 00 00 00 00 00)
146 // CHECK: Address: 0x0
147 // CHECK: Size: 0x5E
148 // CHECK: Offset: 384
149 // CHECK: Alignment: 0
150 // CHECK: RelocationOffset: 0x26C
151 // CHECK: RelocationCount: 12
152 // CHECK: Type: Regular (0x0)
153 // CHECK: Attributes [ (0x800004)
154 // CHECK: PureInstructions (0x800000)
155 // CHECK: SomeInstructions (0x4)
156 // CHECK: ]
157 // CHECK: Reserved1: 0x0
158 // CHECK: Reserved2: 0x0
159 // CHECK: Reserved3: 0x0
160 // CHECK: SectionData (
161 // CHECK: 0000: 31C031C0 E9040000 00EBF9E9 00000000 |1.1.............|
162 // CHECK: 0010: E9000000 00E90200 0000E900 000000E9 |................|
163 // CHECK: 0020: 02000000 89050400 00008905 D2FFFFFF |................|
164 // CHECK: 0030: 8905CEFF FFFF8905 00000000 89050200 |................|
165 // CHECK: 0040: 00008905 00000000 89050200 00008905 |................|
166 // CHECK: 0050: 00000000 89050200 000031C0 31C0 |..........1.1.|
167 // CHECK: )
168 // CHECK: }
169 // CHECK: Section {
170 // CHECK: Index: 1
171 // CHECK: Name: __data (5F 5F 64 61 74 61 00 00 00 00 00 00 00 00 00 00)
172 // CHECK: Segment: __DATA (5F 5F 44 41 54 41 00 00 00 00 00 00 00 00 00 00)
173 // CHECK: Address: 0x5E
174 // CHECK: Size: 0x8E
175 // CHECK: Offset: 478
176 // CHECK: Alignment: 0
177 // CHECK: RelocationOffset: 0x2CC
178 // CHECK: RelocationCount: 16
179 // CHECK: Type: Regular (0x0)
180 // CHECK: Attributes [ (0x4)
181 // CHECK: SomeInstructions (0x4)
182 // CHECK: ]
183 // CHECK: Reserved1: 0x0
184 // CHECK: Reserved2: 0x0
185 // CHECK: Reserved3: 0x0
186 // CHECK: SectionData (
187 // CHECK: 0000: 31C00400 00000000 00000000 00000000 |1...............|
188 // CHECK: 0010: 00000200 00000000 00000000 00000000 |................|
189 // CHECK: 0020: 00000200 00000000 00000200 00000000 |................|
190 // CHECK: 0030: 00000000 00000000 00000200 00000000 |................|
191 // CHECK: 0040: 00000200 00000000 00000000 00000000 |................|
192 // CHECK: 0050: 00000200 00000000 00000000 00000000 |................|
193 // CHECK: 0060: 00000200 00000000 00000200 00000000 |................|
194 // CHECK: 0070: 00000000 00000000 00000200 00000000 |................|
195 // CHECK: 0080: 00000200 00000000 000031C0 31C0 |..........1.1.|
196 // CHECK: )
197 // CHECK: }
198 // CHECK: ]
199 // CHECK: Relocations [
200 // CHECK: Section __text {
201 // CHECK: 0x56 1 2 1 X86_64_RELOC_SIGNED 0 _g3
202 // CHECK: 0x50 1 2 1 X86_64_RELOC_SIGNED 0 _g3
203 // CHECK: 0x4A 1 2 1 X86_64_RELOC_SIGNED 0 _g2
204 // CHECK: 0x44 1 2 1 X86_64_RELOC_SIGNED 0 _g2
205 // CHECK: 0x3E 1 2 1 X86_64_RELOC_SIGNED 0 _g1
206 // CHECK: 0x38 1 2 1 X86_64_RELOC_SIGNED 0 _g1
207 // CHECK: 0x20 1 2 1 X86_64_RELOC_BRANCH 0 _g3
208 // CHECK: 0x1B 1 2 1 X86_64_RELOC_BRANCH 0 _g3
209 // CHECK: 0x16 1 2 1 X86_64_RELOC_BRANCH 0 _g2
210 // CHECK: 0x11 1 2 1 X86_64_RELOC_BRANCH 0 _g2
211 // CHECK: 0xC 1 2 1 X86_64_RELOC_BRANCH 0 _g1
212 // CHECK: 0x5 1 2 1 X86_64_RELOC_BRANCH 0 _foo
213 // CHECK: }
214 // CHECK: Section __data {
215 // CHECK: 0x7A 0 3 1 X86_64_RELOC_SUBTRACTOR 0 _g0
216 // CHECK: 0x7A 0 3 1 X86_64_RELOC_UNSIGNED 0 _g1
217 // CHECK: 0x72 0 3 1 X86_64_RELOC_SUBTRACTOR 0 _g0
218 // CHECK: 0x72 0 3 1 X86_64_RELOC_UNSIGNED 0 _g1
219 // CHECK: 0x62 0 3 1 X86_64_RELOC_UNSIGNED 0 _g1
220 // CHECK: 0x5A 0 3 1 X86_64_RELOC_UNSIGNED 0 _g1
221 // CHECK: 0x52 0 3 1 X86_64_RELOC_UNSIGNED 0 _g0
222 // CHECK: 0x4A 0 3 1 X86_64_RELOC_UNSIGNED 0 _g0
223 // CHECK: 0x3A 0 3 1 X86_64_RELOC_SUBTRACTOR 0 _g2
224 // CHECK: 0x3A 0 3 1 X86_64_RELOC_UNSIGNED 0 _g3
225 // CHECK: 0x32 0 3 1 X86_64_RELOC_SUBTRACTOR 0 _g2
226 // CHECK: 0x32 0 3 1 X86_64_RELOC_UNSIGNED 0 _g3
227 // CHECK: 0x22 0 3 1 X86_64_RELOC_UNSIGNED 0 _g3
228 // CHECK: 0x1A 0 3 1 X86_64_RELOC_UNSIGNED 0 _g3
229 // CHECK: 0x12 0 3 1 X86_64_RELOC_UNSIGNED 0 _g2
230 // CHECK: 0xA 0 3 1 X86_64_RELOC_UNSIGNED 0 _g2
231 // CHECK: }
232 // CHECK: ]
233 // CHECK: Symbols [
234 // CHECK: Symbol {
235 // CHECK: Name: _foo (1)
236 // CHECK: Type: Section (0xE)
237 // CHECK: Section: __text (0x1)
238 // CHECK: RefType: UndefinedNonLazy (0x0)
239 // CHECK: Flags [ (0x0)
240 // CHECK: ]
241 // CHECK: Value: 0x0
242 // CHECK: }
243 // CHECK: Symbol {
244 // CHECK: Name: _g0 (18)
245 // CHECK: Type: Section (0xE)
246 // CHECK: Section: __text (0x1)
247 // CHECK: RefType: UndefinedNonLazy (0x0)
248 // CHECK: Flags [ (0x0)
249 // CHECK: ]
250 // CHECK: Value: 0x2
251 // CHECK: }
252 // CHECK: Symbol {
253 // CHECK: Name: _g1 (14)
254 // CHECK: Type: Section (0xE)
255 // CHECK: Section: __text (0x1)
256 // CHECK: RefType: UndefinedNonLazy (0x0)
257 // CHECK: Flags [ (0x0)
258 // CHECK: ]
259 // CHECK: Value: 0x5A
260 // CHECK: }
261 // CHECK: Symbol {
262 // CHECK: Name: _g2 (10)
263 // CHECK: Type: Section (0xE)
264 // CHECK: Section: __data (0x2)
265 // CHECK: RefType: UndefinedNonLazy (0x0)
266 // CHECK: Flags [ (0x0)
267 // CHECK: ]
268 // CHECK: Value: 0x5E
269 // CHECK: }
270 // CHECK: Symbol {
271 // CHECK: Name: _g3 (6)
272 // CHECK: Type: Section (0xE)
273 // CHECK: Section: __data (0x2)
274 // CHECK: RefType: UndefinedNonLazy (0x0)
275 // CHECK: Flags [ (0x0)
276 // CHECK: ]
277 // CHECK: Value: 0xE8
278 // CHECK: }
279 // CHECK: ]
280 // CHECK: Indirect Symbols {
281 // CHECK: Number: 0
282 // CHECK: Symbols [
283 // CHECK: ]
284 // CHECK: }
285 // CHECK: Segment {
286 // CHECK: Cmd: LC_SEGMENT_64
287 // CHECK: Name:
288 // CHECK: Size: 232
289 // CHECK: vmaddr: 0x0
290 // CHECK: vmsize: 0xEC
291 // CHECK: fileoff: 384
292 // CHECK: filesize: 236
293 // CHECK: maxprot: rwx
294 // CHECK: initprot: rwx
295 // CHECK: nsects: 2
296 // CHECK: flags: 0x0
297 // CHECK: }
298 // CHECK: Dysymtab {
299 // CHECK: ilocalsym: 0
300 // CHECK: nlocalsym: 5
301 // CHECK: iextdefsym: 5
302 // CHECK: nextdefsym: 0
303 // CHECK: iundefsym: 5
304 // CHECK: nundefsym: 0
305 // CHECK: tocoff: 0
306 // CHECK: ntoc: 0
307 // CHECK: modtaboff: 0
308 // CHECK: nmodtab: 0
309 // CHECK: extrefsymoff: 0
310 // CHECK: nextrefsyms: 0
311 // CHECK: indirectsymoff: 0
312 // CHECK: nindirectsyms: 0
313 // CHECK: extreloff: 0
314 // CHECK: nextrel: 0
315 // CHECK: locreloff: 0
316 // CHECK: nlocrel: 0
317 // CHECK: }