blob: 0ad787dafbd9e50bbe1f3a895d2bb0b1d3f1d8aa [file] [log] [blame]
Nick Kledzik30332b12013-10-08 00:43:34 +00001//===- lld/unittest/MachOTests/MachONormalizedFileYAMLTests.cpp -----------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "gtest/gtest.h"
11
12#include "llvm/Support/MachO.h"
13
14#include "../../lib/ReaderWriter/MachO/MachONormalizedFile.h"
15
16#include <assert.h>
17#include <vector>
18
19using llvm::StringRef;
20using llvm::MemoryBuffer;
21using llvm::ErrorOr;
22using lld::mach_o::normalized::NormalizedFile;
23using lld::mach_o::normalized::Symbol;
24using lld::mach_o::normalized::Section;
25using lld::mach_o::normalized::Relocation;
26
27
28static std::unique_ptr<NormalizedFile> fromYAML(StringRef str) {
29 std::unique_ptr<MemoryBuffer> mb(MemoryBuffer::getMemBuffer(str));
Rui Ueyama7c13c442014-01-13 23:21:33 +000030 ErrorOr<std::unique_ptr<NormalizedFile>> r
Nick Kledzik30332b12013-10-08 00:43:34 +000031 = lld::mach_o::normalized::readYaml(mb);
32 EXPECT_FALSE(!r);
33 return std::move(*r);
34}
35
36static void toYAML(const NormalizedFile &f, std::string &out) {
37 llvm::raw_string_ostream ostr(out);
38 llvm::error_code ec = lld::mach_o::normalized::writeYaml(f, ostr);
39 EXPECT_TRUE(!ec);
40}
41
42
43// ppc is no longer supported, but it is here to test endianness handling.
44TEST(ObjectFileYAML, empty_ppc) {
45 std::unique_ptr<NormalizedFile> f = fromYAML(
46 "---\n"
47 "arch: ppc\n"
Nick Kledzik360a1432014-01-08 01:38:07 +000048 "file-type: MH_OBJECT\n"
Nick Kledzik30332b12013-10-08 00:43:34 +000049 "flags: [ MH_SUBSECTIONS_VIA_SYMBOLS ]\n"
50 "...\n");
51 EXPECT_EQ(f->arch, lld::MachOLinkingContext::arch_ppc);
52 EXPECT_EQ(f->fileType, llvm::MachO::MH_OBJECT);
53 EXPECT_EQ((int)(f->flags), llvm::MachO::MH_SUBSECTIONS_VIA_SYMBOLS);
54 EXPECT_TRUE(f->sections.empty());
55 EXPECT_TRUE(f->localSymbols.empty());
56 EXPECT_TRUE(f->globalSymbols.empty());
57 EXPECT_TRUE(f->undefinedSymbols.empty());
58}
59
60TEST(ObjectFileYAML, empty_x86_64) {
61 std::unique_ptr<NormalizedFile> f = fromYAML(
62 "---\n"
63 "arch: x86_64\n"
Nick Kledzik360a1432014-01-08 01:38:07 +000064 "file-type: MH_OBJECT\n"
Nick Kledzik30332b12013-10-08 00:43:34 +000065 "flags: [ MH_SUBSECTIONS_VIA_SYMBOLS ]\n"
66 "...\n");
67 EXPECT_EQ(f->arch, lld::MachOLinkingContext::arch_x86_64);
68 EXPECT_EQ(f->fileType, llvm::MachO::MH_OBJECT);
69 EXPECT_EQ((int)(f->flags), llvm::MachO::MH_SUBSECTIONS_VIA_SYMBOLS);
70 EXPECT_TRUE(f->sections.empty());
71 EXPECT_TRUE(f->localSymbols.empty());
72 EXPECT_TRUE(f->globalSymbols.empty());
73 EXPECT_TRUE(f->undefinedSymbols.empty());
74}
75
76TEST(ObjectFileYAML, empty_x86) {
77 std::unique_ptr<NormalizedFile> f = fromYAML(
78 "---\n"
79 "arch: x86\n"
Nick Kledzik360a1432014-01-08 01:38:07 +000080 "file-type: MH_OBJECT\n"
Nick Kledzik30332b12013-10-08 00:43:34 +000081 "flags: [ MH_SUBSECTIONS_VIA_SYMBOLS ]\n"
82 "...\n");
83 EXPECT_EQ(f->arch, lld::MachOLinkingContext::arch_x86);
84 EXPECT_EQ(f->fileType, llvm::MachO::MH_OBJECT);
85 EXPECT_EQ((int)(f->flags), llvm::MachO::MH_SUBSECTIONS_VIA_SYMBOLS);
86 EXPECT_TRUE(f->sections.empty());
87 EXPECT_TRUE(f->localSymbols.empty());
88 EXPECT_TRUE(f->globalSymbols.empty());
89 EXPECT_TRUE(f->undefinedSymbols.empty());
90}
91
92TEST(ObjectFileYAML, empty_armv6) {
93 std::unique_ptr<NormalizedFile> f = fromYAML(
94 "---\n"
95 "arch: armv6\n"
Nick Kledzik360a1432014-01-08 01:38:07 +000096 "file-type: MH_OBJECT\n"
Nick Kledzik30332b12013-10-08 00:43:34 +000097 "flags: [ MH_SUBSECTIONS_VIA_SYMBOLS ]\n"
98 "...\n");
99 EXPECT_EQ(f->arch, lld::MachOLinkingContext::arch_armv6);
100 EXPECT_EQ(f->fileType, llvm::MachO::MH_OBJECT);
101 EXPECT_EQ((int)(f->flags), llvm::MachO::MH_SUBSECTIONS_VIA_SYMBOLS);
102 EXPECT_TRUE(f->sections.empty());
103 EXPECT_TRUE(f->localSymbols.empty());
104 EXPECT_TRUE(f->globalSymbols.empty());
105 EXPECT_TRUE(f->undefinedSymbols.empty());
106}
107
108TEST(ObjectFileYAML, empty_armv7) {
109 std::unique_ptr<NormalizedFile> f = fromYAML(
110 "---\n"
111 "arch: armv7\n"
Nick Kledzik360a1432014-01-08 01:38:07 +0000112 "file-type: MH_OBJECT\n"
Nick Kledzik30332b12013-10-08 00:43:34 +0000113 "flags: [ MH_SUBSECTIONS_VIA_SYMBOLS ]\n"
114 "...\n");
115 EXPECT_EQ(f->arch, lld::MachOLinkingContext::arch_armv7);
116 EXPECT_EQ(f->fileType, llvm::MachO::MH_OBJECT);
117 EXPECT_EQ((int)(f->flags), llvm::MachO::MH_SUBSECTIONS_VIA_SYMBOLS);
118 EXPECT_TRUE(f->sections.empty());
119 EXPECT_TRUE(f->localSymbols.empty());
120 EXPECT_TRUE(f->globalSymbols.empty());
121 EXPECT_TRUE(f->undefinedSymbols.empty());
122}
123
124TEST(ObjectFileYAML, empty_armv7s) {
125 std::unique_ptr<NormalizedFile> f = fromYAML(
126 "---\n"
127 "arch: armv7s\n"
Nick Kledzik360a1432014-01-08 01:38:07 +0000128 "file-type: MH_OBJECT\n"
Nick Kledzik30332b12013-10-08 00:43:34 +0000129 "flags: [ MH_SUBSECTIONS_VIA_SYMBOLS ]\n"
130 "...\n");
131 EXPECT_EQ(f->arch, lld::MachOLinkingContext::arch_armv7s);
132 EXPECT_EQ(f->fileType, llvm::MachO::MH_OBJECT);
133 EXPECT_EQ((int)(f->flags), llvm::MachO::MH_SUBSECTIONS_VIA_SYMBOLS);
134 EXPECT_TRUE(f->sections.empty());
135 EXPECT_TRUE(f->localSymbols.empty());
136 EXPECT_TRUE(f->globalSymbols.empty());
137 EXPECT_TRUE(f->undefinedSymbols.empty());
138}
139
140
141TEST(ObjectFileYAML, roundTrip) {
Rui Ueyama7c13c442014-01-13 23:21:33 +0000142 std::string intermediate;
Nick Kledzik30332b12013-10-08 00:43:34 +0000143 {
144 NormalizedFile f;
145 f.arch = lld::MachOLinkingContext::arch_x86_64;
146 f.fileType = llvm::MachO::MH_OBJECT;
147 f.flags = llvm::MachO::MH_SUBSECTIONS_VIA_SYMBOLS;
148 f.os = lld::MachOLinkingContext::OS::macOSX;
149 toYAML(f, intermediate);
150 }
151 {
152 std::unique_ptr<NormalizedFile> f2 = fromYAML(intermediate);
153 EXPECT_EQ(f2->arch, lld::MachOLinkingContext::arch_x86_64);
154 EXPECT_EQ((int)(f2->fileType), llvm::MachO::MH_OBJECT);
155 EXPECT_EQ((int)(f2->flags), llvm::MachO::MH_SUBSECTIONS_VIA_SYMBOLS);
156 EXPECT_TRUE(f2->sections.empty());
157 EXPECT_TRUE(f2->localSymbols.empty());
158 EXPECT_TRUE(f2->globalSymbols.empty());
159 EXPECT_TRUE(f2->undefinedSymbols.empty());
160 }
161}
162
163
164TEST(ObjectFileYAML, oneSymbol) {
165 std::unique_ptr<NormalizedFile> f = fromYAML(
166 "---\n"
167 "arch: x86_64\n"
Nick Kledzik360a1432014-01-08 01:38:07 +0000168 "file-type: MH_OBJECT\n"
Nick Kledzik30332b12013-10-08 00:43:34 +0000169 "global-symbols:\n"
170 " - name: _main\n"
171 " type: N_SECT\n"
172 " scope: [ N_EXT ]\n"
173 " sect: 1\n"
174 " desc: [ ]\n"
175 " value: 0x100\n"
176 "...\n");
177 EXPECT_EQ(f->arch, lld::MachOLinkingContext::arch_x86_64);
178 EXPECT_EQ(f->fileType, llvm::MachO::MH_OBJECT);
179 EXPECT_TRUE(f->sections.empty());
180 EXPECT_TRUE(f->localSymbols.empty());
181 EXPECT_TRUE(f->undefinedSymbols.empty());
182 EXPECT_EQ(f->globalSymbols.size(), 1UL);
183 const Symbol& sym = f->globalSymbols[0];
184 EXPECT_TRUE(sym.name.equals("_main"));
185 EXPECT_EQ((int)(sym.type), llvm::MachO::N_SECT);
186 EXPECT_EQ((int)(sym.scope), llvm::MachO::N_EXT);
187 EXPECT_EQ(sym.sect, 1);
188 EXPECT_EQ((int)(sym.desc), 0);
189 EXPECT_EQ((uint64_t)sym.value, 0x100ULL);
190}
191
192
193TEST(ObjectFileYAML, oneSection) {
194 std::unique_ptr<NormalizedFile> f = fromYAML(
195 "---\n"
196 "arch: x86_64\n"
Nick Kledzik360a1432014-01-08 01:38:07 +0000197 "file-type: MH_OBJECT\n"
Nick Kledzik30332b12013-10-08 00:43:34 +0000198 "sections:\n"
199 " - segment: __TEXT\n"
200 " section: __text\n"
201 " type: S_REGULAR\n"
202 " attributes: [ S_ATTR_PURE_INSTRUCTIONS ]\n"
203 " alignment: 1\n"
204 " address: 0x12345678\n"
205 " content: [ 0x90, 0x90 ]\n"
206 "...\n");
207 EXPECT_EQ(f->arch, lld::MachOLinkingContext::arch_x86_64);
208 EXPECT_EQ(f->fileType, llvm::MachO::MH_OBJECT);
209 EXPECT_TRUE(f->localSymbols.empty());
210 EXPECT_TRUE(f->globalSymbols.empty());
211 EXPECT_TRUE(f->undefinedSymbols.empty());
212 EXPECT_EQ(f->sections.size(), 1UL);
213 const Section& sect = f->sections[0];
214 EXPECT_TRUE(sect.segmentName.equals("__TEXT"));
215 EXPECT_TRUE(sect.sectionName.equals("__text"));
216 EXPECT_EQ((uint32_t)(sect.type), (uint32_t)(llvm::MachO::S_REGULAR));
Rui Ueyama7c13c442014-01-13 23:21:33 +0000217 EXPECT_EQ((uint32_t)(sect.attributes),
Nick Kledzik30332b12013-10-08 00:43:34 +0000218 (uint32_t)(llvm::MachO::S_ATTR_PURE_INSTRUCTIONS));
219 EXPECT_EQ(sect.alignment, 1U);
Nick Kledzik7e28e752013-10-08 01:12:35 +0000220 EXPECT_EQ((uint64_t)sect.address, 0x12345678ULL);
Nick Kledzik30332b12013-10-08 00:43:34 +0000221 EXPECT_EQ(sect.content.size(), 2UL);
222 EXPECT_EQ((int)(sect.content[0]), 0x90);
223 EXPECT_EQ((int)(sect.content[1]), 0x90);
224}
225
226
227TEST(ObjectFileYAML, hello_x86_64) {
228 std::unique_ptr<NormalizedFile> f = fromYAML(
229 "---\n"
230 "arch: x86_64\n"
Nick Kledzik360a1432014-01-08 01:38:07 +0000231 "file-type: MH_OBJECT\n"
Nick Kledzik30332b12013-10-08 00:43:34 +0000232 "flags: [ MH_SUBSECTIONS_VIA_SYMBOLS ]\n"
233 "sections:\n"
234 " - segment: __TEXT\n"
235 " section: __text\n"
236 " type: S_REGULAR\n"
237 " attributes: [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS]\n"
238 " alignment: 0\n"
239 " address: 0x0000\n"
240 " content: [ 0x55, 0x48, 0x89, 0xe5, 0x48, 0x8d, 0x3d, 0x00,\n"
241 " 0x00, 0x00, 0x00, 0x30, 0xc0, 0xe8, 0x00, 0x00,\n"
242 " 0x00, 0x00, 0x31, 0xc0, 0x5d, 0xc3 ]\n"
243 " relocations:\n"
244 " - offset: 0x0e\n"
245 " type: X86_64_RELOC_BRANCH\n"
246 " length: 2\n"
247 " pc-rel: true\n"
248 " extern: true\n"
249 " symbol: 2\n"
250 " - offset: 0x07\n"
251 " type: X86_64_RELOC_SIGNED\n"
252 " length: 2\n"
253 " pc-rel: true\n"
254 " extern: true\n"
255 " symbol: 1\n"
256 " - segment: __TEXT\n"
257 " section: __cstring\n"
258 " type: S_CSTRING_LITERALS\n"
259 " attributes: [ ]\n"
260 " alignment: 0\n"
261 " address: 0x0016\n"
262 " content: [ 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x0a, 0x00 ]\n"
263 "global-symbols:\n"
264 " - name: _main\n"
265 " type: N_SECT\n"
266 " scope: [ N_EXT ]\n"
267 " sect: 1\n"
268 " value: 0x0\n"
269 "local-symbols:\n"
270 " - name: L_.str\n"
271 " type: N_SECT\n"
272 " scope: [ ]\n"
273 " sect: 2\n"
274 " value: 0x16\n"
275 "undefined-symbols:\n"
276 " - name: _printf\n"
277 " type: N_UNDF\n"
278 " value: 0x0\n"
279 "...\n");
280 EXPECT_EQ(f->arch, lld::MachOLinkingContext::arch_x86_64);
281 EXPECT_EQ(f->fileType, llvm::MachO::MH_OBJECT);
282 EXPECT_EQ((int)(f->flags), llvm::MachO::MH_SUBSECTIONS_VIA_SYMBOLS);
283 EXPECT_EQ(f->sections.size(), 2UL);
Rui Ueyama7c13c442014-01-13 23:21:33 +0000284
Nick Kledzik30332b12013-10-08 00:43:34 +0000285 const Section& sect1 = f->sections[0];
286 EXPECT_TRUE(sect1.segmentName.equals("__TEXT"));
287 EXPECT_TRUE(sect1.sectionName.equals("__text"));
288 EXPECT_EQ((uint32_t)(sect1.type), (uint32_t)(llvm::MachO::S_REGULAR));
Rui Ueyama7c13c442014-01-13 23:21:33 +0000289 EXPECT_EQ((uint32_t)(sect1.attributes),
290 (uint32_t)(llvm::MachO::S_ATTR_PURE_INSTRUCTIONS
Nick Kledzik30332b12013-10-08 00:43:34 +0000291 | llvm::MachO::S_ATTR_SOME_INSTRUCTIONS));
292 EXPECT_EQ(sect1.alignment, 0U);
Nick Kledzik58070022013-10-08 01:27:03 +0000293 EXPECT_EQ((uint64_t)sect1.address, 0x0ULL);
Nick Kledzik30332b12013-10-08 00:43:34 +0000294 EXPECT_EQ(sect1.content.size(), 22UL);
295 EXPECT_EQ((int)(sect1.content[0]), 0x55);
296 EXPECT_EQ((int)(sect1.content[1]), 0x48);
297 EXPECT_EQ(sect1.relocations.size(), 2UL);
298 const Relocation& reloc1 = sect1.relocations[0];
299 EXPECT_EQ(reloc1.offset, 0x0eU);
300 EXPECT_FALSE(reloc1.scattered);
301 EXPECT_EQ((int)reloc1.type, (int)llvm::MachO::X86_64_RELOC_BRANCH);
302 EXPECT_EQ(reloc1.length, 2);
303 EXPECT_TRUE(reloc1.pcRel);
304 EXPECT_TRUE(reloc1.isExtern);
305 EXPECT_EQ(reloc1.symbol, 2U);
306 EXPECT_EQ((int)(reloc1.value), 0);
307 const Relocation& reloc2 = sect1.relocations[1];
308 EXPECT_EQ(reloc2.offset, 0x07U);
309 EXPECT_FALSE(reloc2.scattered);
310 EXPECT_EQ((int)reloc2.type, (int)llvm::MachO::X86_64_RELOC_SIGNED);
311 EXPECT_EQ(reloc2.length, 2);
312 EXPECT_TRUE(reloc2.pcRel);
313 EXPECT_TRUE(reloc2.isExtern);
314 EXPECT_EQ(reloc2.symbol, 1U);
315 EXPECT_EQ((int)(reloc2.value), 0);
Rui Ueyama7c13c442014-01-13 23:21:33 +0000316
Nick Kledzik30332b12013-10-08 00:43:34 +0000317 const Section& sect2 = f->sections[1];
318 EXPECT_TRUE(sect2.segmentName.equals("__TEXT"));
319 EXPECT_TRUE(sect2.sectionName.equals("__cstring"));
320 EXPECT_EQ((uint32_t)(sect2.type), (uint32_t)(llvm::MachO::S_CSTRING_LITERALS));
321 EXPECT_EQ((uint32_t)(sect2.attributes), 0U);
322 EXPECT_EQ(sect2.alignment, 0U);
Nick Kledzik58070022013-10-08 01:27:03 +0000323 EXPECT_EQ((uint64_t)sect2.address, 0x016ULL);
Nick Kledzik30332b12013-10-08 00:43:34 +0000324 EXPECT_EQ(sect2.content.size(), 7UL);
325 EXPECT_EQ((int)(sect2.content[0]), 0x68);
326 EXPECT_EQ((int)(sect2.content[1]), 0x65);
327 EXPECT_EQ((int)(sect2.content[2]), 0x6c);
Rui Ueyama7c13c442014-01-13 23:21:33 +0000328
Nick Kledzik30332b12013-10-08 00:43:34 +0000329 EXPECT_EQ(f->globalSymbols.size(), 1UL);
330 const Symbol& sym1 = f->globalSymbols[0];
331 EXPECT_TRUE(sym1.name.equals("_main"));
332 EXPECT_EQ((int)(sym1.type), llvm::MachO::N_SECT);
333 EXPECT_EQ((int)(sym1.scope), llvm::MachO::N_EXT);
334 EXPECT_EQ(sym1.sect, 1);
335 EXPECT_EQ((int)(sym1.desc), 0);
336 EXPECT_EQ((uint64_t)sym1.value, 0x0ULL);
337 EXPECT_EQ(f->localSymbols.size(), 1UL);
338 const Symbol& sym2 = f->localSymbols[0];
339 EXPECT_TRUE(sym2.name.equals("L_.str"));
340 EXPECT_EQ((int)(sym2.type), llvm::MachO::N_SECT);
341 EXPECT_EQ((int)(sym2.scope), 0);
342 EXPECT_EQ(sym2.sect, 2);
343 EXPECT_EQ((int)(sym2.desc), 0);
344 EXPECT_EQ((uint64_t)sym2.value, 0x16ULL);
345 EXPECT_EQ(f->undefinedSymbols.size(), 1UL);
346 const Symbol& sym3 = f->undefinedSymbols[0];
347 EXPECT_TRUE(sym3.name.equals("_printf"));
348 EXPECT_EQ((int)(sym3.type), llvm::MachO::N_UNDF);
349 EXPECT_EQ((int)(sym3.scope), 0);
350 EXPECT_EQ(sym3.sect, 0);
351 EXPECT_EQ((int)(sym3.desc), 0);
352 EXPECT_EQ((uint64_t)sym3.value, 0x0ULL);
353}
354
355
356TEST(ObjectFileYAML, hello_x86) {
357 std::unique_ptr<NormalizedFile> f = fromYAML(
358 "---\n"
359 "arch: x86\n"
Nick Kledzik360a1432014-01-08 01:38:07 +0000360 "file-type: MH_OBJECT\n"
Nick Kledzik30332b12013-10-08 00:43:34 +0000361 "flags: [ MH_SUBSECTIONS_VIA_SYMBOLS ]\n"
362 "sections:\n"
363 " - segment: __TEXT\n"
364 " section: __text\n"
365 " type: S_REGULAR\n"
366 " attributes: [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS]\n"
367 " alignment: 0\n"
368 " address: 0x0000\n"
369 " content: [ 0x55, 0x89, 0xe5, 0x83, 0xec, 0x08, 0xe8, 0x00,\n"
370 " 0x00, 0x00, 0x00, 0x58, 0x8d, 0x80, 0x16, 0x00,\n"
371 " 0x00, 0x00, 0x89, 0x04, 0x24, 0xe8, 0xe6, 0xff,\n"
372 " 0xff, 0xff, 0x31, 0xc0, 0x83, 0xc4, 0x08, 0x5d,\n"
373 " 0xc3 ]\n"
374 " relocations:\n"
375 " - offset: 0x16\n"
376 " type: GENERIC_RELOC_VANILLA\n"
377 " length: 2\n"
378 " pc-rel: true\n"
379 " extern: true\n"
380 " symbol: 1\n"
381 " - offset: 0x0e\n"
382 " scattered: true\n"
383 " type: GENERIC_RELOC_LOCAL_SECTDIFF\n"
384 " length: 2\n"
385 " pc-rel: false\n"
386 " value: 0x21\n"
387 " - offset: 0x0\n"
388 " scattered: true\n"
389 " type: GENERIC_RELOC_PAIR\n"
390 " length: 2\n"
391 " pc-rel: false\n"
392 " value: 0xb\n"
393 " - segment: __TEXT\n"
394 " section: __cstring\n"
395 " type: S_CSTRING_LITERALS\n"
396 " attributes: [ ]\n"
397 " alignment: 0\n"
398 " address: 0x0021\n"
399 " content: [ 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x0a, 0x00 ]\n"
400 "global-symbols:\n"
401 " - name: _main\n"
402 " type: N_SECT\n"
403 " scope: [ N_EXT ]\n"
404 " sect: 1\n"
405 " value: 0x0\n"
406 "undefined-symbols:\n"
407 " - name: _printf\n"
408 " type: N_UNDF\n"
409 " value: 0x0\n"
410 "...\n");
411 EXPECT_EQ(f->arch, lld::MachOLinkingContext::arch_x86);
412 EXPECT_EQ(f->fileType, llvm::MachO::MH_OBJECT);
413 EXPECT_EQ((int)(f->flags), llvm::MachO::MH_SUBSECTIONS_VIA_SYMBOLS);
414 EXPECT_EQ(f->sections.size(), 2UL);
Rui Ueyama7c13c442014-01-13 23:21:33 +0000415
Nick Kledzik30332b12013-10-08 00:43:34 +0000416 const Section& sect1 = f->sections[0];
417 EXPECT_TRUE(sect1.segmentName.equals("__TEXT"));
418 EXPECT_TRUE(sect1.sectionName.equals("__text"));
419 EXPECT_EQ((uint32_t)(sect1.type), (uint32_t)(llvm::MachO::S_REGULAR));
Rui Ueyama7c13c442014-01-13 23:21:33 +0000420 EXPECT_EQ((uint32_t)(sect1.attributes),
421 (uint32_t)(llvm::MachO::S_ATTR_PURE_INSTRUCTIONS
Nick Kledzik30332b12013-10-08 00:43:34 +0000422 | llvm::MachO::S_ATTR_SOME_INSTRUCTIONS));
423 EXPECT_EQ(sect1.alignment, 0U);
Nick Kledzik58070022013-10-08 01:27:03 +0000424 EXPECT_EQ((uint64_t)sect1.address, 0x0ULL);
Nick Kledzik30332b12013-10-08 00:43:34 +0000425 EXPECT_EQ(sect1.content.size(), 33UL);
426 EXPECT_EQ((int)(sect1.content[0]), 0x55);
427 EXPECT_EQ((int)(sect1.content[1]), 0x89);
428 EXPECT_EQ(sect1.relocations.size(), 3UL);
429 const Relocation& reloc1 = sect1.relocations[0];
430 EXPECT_EQ(reloc1.offset, 0x16U);
431 EXPECT_FALSE(reloc1.scattered);
432 EXPECT_EQ((int)reloc1.type, (int)llvm::MachO::GENERIC_RELOC_VANILLA);
433 EXPECT_EQ(reloc1.length, 2);
434 EXPECT_TRUE(reloc1.pcRel);
435 EXPECT_TRUE(reloc1.isExtern);
436 EXPECT_EQ(reloc1.symbol, 1U);
437 EXPECT_EQ((int)(reloc1.value), 0);
438 const Relocation& reloc2 = sect1.relocations[1];
439 EXPECT_EQ(reloc2.offset, 0x0eU);
440 EXPECT_TRUE(reloc2.scattered);
441 EXPECT_EQ((int)reloc2.type, (int)llvm::MachO::GENERIC_RELOC_LOCAL_SECTDIFF);
442 EXPECT_EQ(reloc2.length, 2);
443 EXPECT_FALSE(reloc2.pcRel);
444 EXPECT_EQ(reloc2.symbol, 0U);
445 EXPECT_EQ((int)(reloc2.value), 0x21);
446 const Relocation& reloc3 = sect1.relocations[2];
447 EXPECT_EQ(reloc3.offset, 0U);
448 EXPECT_TRUE(reloc3.scattered);
449 EXPECT_EQ((int)reloc3.type, (int)llvm::MachO::GENERIC_RELOC_PAIR);
450 EXPECT_EQ(reloc3.length, 2);
451 EXPECT_FALSE(reloc3.pcRel);
452 EXPECT_EQ(reloc3.symbol, 0U);
453 EXPECT_EQ((int)(reloc3.value), 0xb);
Rui Ueyama7c13c442014-01-13 23:21:33 +0000454
Nick Kledzik30332b12013-10-08 00:43:34 +0000455 const Section& sect2 = f->sections[1];
456 EXPECT_TRUE(sect2.segmentName.equals("__TEXT"));
457 EXPECT_TRUE(sect2.sectionName.equals("__cstring"));
458 EXPECT_EQ((uint32_t)(sect2.type), (uint32_t)(llvm::MachO::S_CSTRING_LITERALS));
459 EXPECT_EQ((uint32_t)(sect2.attributes), 0U);
460 EXPECT_EQ(sect2.alignment, 0U);
Nick Kledzik58070022013-10-08 01:27:03 +0000461 EXPECT_EQ((uint64_t)sect2.address, 0x021ULL);
Nick Kledzik30332b12013-10-08 00:43:34 +0000462 EXPECT_EQ(sect2.content.size(), 7UL);
463 EXPECT_EQ((int)(sect2.content[0]), 0x68);
464 EXPECT_EQ((int)(sect2.content[1]), 0x65);
465 EXPECT_EQ((int)(sect2.content[2]), 0x6c);
Rui Ueyama7c13c442014-01-13 23:21:33 +0000466
Nick Kledzik30332b12013-10-08 00:43:34 +0000467 EXPECT_EQ(f->globalSymbols.size(), 1UL);
468 const Symbol& sym1 = f->globalSymbols[0];
469 EXPECT_TRUE(sym1.name.equals("_main"));
470 EXPECT_EQ((int)(sym1.type), llvm::MachO::N_SECT);
471 EXPECT_EQ((int)(sym1.scope), llvm::MachO::N_EXT);
472 EXPECT_EQ(sym1.sect, 1);
473 EXPECT_EQ((int)(sym1.desc), 0);
474 EXPECT_EQ((uint64_t)sym1.value, 0x0ULL);
475 EXPECT_EQ(f->undefinedSymbols.size(), 1UL);
476 const Symbol& sym2 = f->undefinedSymbols[0];
477 EXPECT_TRUE(sym2.name.equals("_printf"));
478 EXPECT_EQ((int)(sym2.type), llvm::MachO::N_UNDF);
479 EXPECT_EQ((int)(sym2.scope), 0);
480 EXPECT_EQ(sym2.sect, 0);
481 EXPECT_EQ((int)(sym2.desc), 0);
482 EXPECT_EQ((uint64_t)sym2.value, 0x0ULL);
483}
484
485TEST(ObjectFileYAML, hello_armv6) {
486 std::unique_ptr<NormalizedFile> f = fromYAML(
487 "---\n"
488 "arch: armv6\n"
Nick Kledzik360a1432014-01-08 01:38:07 +0000489 "file-type: MH_OBJECT\n"
Nick Kledzik30332b12013-10-08 00:43:34 +0000490 "flags: [ MH_SUBSECTIONS_VIA_SYMBOLS ]\n"
491 "sections:\n"
492 " - segment: __TEXT\n"
493 " section: __text\n"
494 " type: S_REGULAR\n"
495 " attributes: [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS]\n"
496 " alignment: 2\n"
497 " address: 0x0000\n"
498 " content: [ 0x80, 0x40, 0x2d, 0xe9, 0x10, 0x00, 0x9f, 0xe5,\n"
499 " 0x0d, 0x70, 0xa0, 0xe1, 0x00, 0x00, 0x8f, 0xe0,\n"
500 " 0xfa, 0xff, 0xff, 0xeb, 0x00, 0x00, 0xa0, 0xe3,\n"
501 " 0x80, 0x80, 0xbd, 0xe8, 0x0c, 0x00, 0x00, 0x00 ]\n"
502 " relocations:\n"
503 " - offset: 0x1c\n"
504 " scattered: true\n"
505 " type: ARM_RELOC_SECTDIFF\n"
506 " length: 2\n"
507 " pc-rel: false\n"
508 " value: 0x20\n"
509 " - offset: 0x0\n"
510 " scattered: true\n"
511 " type: ARM_RELOC_PAIR\n"
512 " length: 2\n"
513 " pc-rel: false\n"
514 " value: 0xc\n"
515 " - offset: 0x10\n"
516 " type: ARM_RELOC_BR24\n"
517 " length: 2\n"
518 " pc-rel: true\n"
519 " extern: true\n"
520 " symbol: 1\n"
521 " - segment: __TEXT\n"
522 " section: __cstring\n"
523 " type: S_CSTRING_LITERALS\n"
524 " attributes: [ ]\n"
525 " alignment: 0\n"
526 " address: 0x0020\n"
527 " content: [ 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x0a, 0x00 ]\n"
528 "global-symbols:\n"
529 " - name: _main\n"
530 " type: N_SECT\n"
531 " scope: [ N_EXT ]\n"
532 " sect: 1\n"
533 " value: 0x0\n"
534 "undefined-symbols:\n"
535 " - name: _printf\n"
536 " type: N_UNDF\n"
537 " value: 0x0\n"
538 "...\n");
539 EXPECT_EQ(f->arch, lld::MachOLinkingContext::arch_armv6);
540 EXPECT_EQ(f->fileType, llvm::MachO::MH_OBJECT);
541 EXPECT_EQ((int)(f->flags), llvm::MachO::MH_SUBSECTIONS_VIA_SYMBOLS);
542 EXPECT_EQ(f->sections.size(), 2UL);
Rui Ueyama7c13c442014-01-13 23:21:33 +0000543
Nick Kledzik30332b12013-10-08 00:43:34 +0000544 const Section& sect1 = f->sections[0];
545 EXPECT_TRUE(sect1.segmentName.equals("__TEXT"));
546 EXPECT_TRUE(sect1.sectionName.equals("__text"));
547 EXPECT_EQ((uint32_t)(sect1.type), (uint32_t)(llvm::MachO::S_REGULAR));
Rui Ueyama7c13c442014-01-13 23:21:33 +0000548 EXPECT_EQ((uint32_t)(sect1.attributes),
549 (uint32_t)(llvm::MachO::S_ATTR_PURE_INSTRUCTIONS
Nick Kledzik30332b12013-10-08 00:43:34 +0000550 | llvm::MachO::S_ATTR_SOME_INSTRUCTIONS));
551 EXPECT_EQ(sect1.alignment, 2U);
Nick Kledzik58070022013-10-08 01:27:03 +0000552 EXPECT_EQ((uint64_t)sect1.address, 0x0ULL);
Nick Kledzik30332b12013-10-08 00:43:34 +0000553 EXPECT_EQ(sect1.content.size(), 32UL);
554 EXPECT_EQ((int)(sect1.content[0]), 0x80);
555 EXPECT_EQ((int)(sect1.content[1]), 0x40);
556 EXPECT_EQ(sect1.relocations.size(), 3UL);
557 const Relocation& reloc1 = sect1.relocations[0];
558 EXPECT_EQ(reloc1.offset, 0x1cU);
559 EXPECT_TRUE(reloc1.scattered);
560 EXPECT_EQ((int)reloc1.type, (int)llvm::MachO::ARM_RELOC_SECTDIFF);
561 EXPECT_EQ(reloc1.length, 2);
562 EXPECT_FALSE(reloc1.pcRel);
563 EXPECT_EQ(reloc1.symbol, 0U);
564 EXPECT_EQ((int)(reloc1.value), 0x20);
565 const Relocation& reloc2 = sect1.relocations[1];
566 EXPECT_EQ(reloc2.offset, 0x0U);
567 EXPECT_TRUE(reloc2.scattered);
568 EXPECT_EQ((int)reloc2.type, (int)llvm::MachO::ARM_RELOC_PAIR);
569 EXPECT_EQ(reloc2.length, 2);
570 EXPECT_FALSE(reloc2.pcRel);
571 EXPECT_EQ(reloc2.symbol, 0U);
572 EXPECT_EQ((int)(reloc2.value), 0xc);
573 const Relocation& reloc3 = sect1.relocations[2];
574 EXPECT_EQ(reloc3.offset, 0x10U);
575 EXPECT_FALSE(reloc3.scattered);
576 EXPECT_EQ((int)reloc3.type, (int)llvm::MachO::ARM_RELOC_BR24);
577 EXPECT_EQ(reloc3.length, 2);
578 EXPECT_TRUE(reloc3.pcRel);
579 EXPECT_TRUE(reloc3.isExtern);
580 EXPECT_EQ(reloc3.symbol, 1U);
581 EXPECT_EQ((int)(reloc3.value), 0);
Rui Ueyama7c13c442014-01-13 23:21:33 +0000582
Nick Kledzik30332b12013-10-08 00:43:34 +0000583 const Section& sect2 = f->sections[1];
584 EXPECT_TRUE(sect2.segmentName.equals("__TEXT"));
585 EXPECT_TRUE(sect2.sectionName.equals("__cstring"));
586 EXPECT_EQ((uint32_t)(sect2.type), (uint32_t)(llvm::MachO::S_CSTRING_LITERALS));
587 EXPECT_EQ((uint32_t)(sect2.attributes), 0U);
588 EXPECT_EQ(sect2.alignment, 0U);
Nick Kledzik58070022013-10-08 01:27:03 +0000589 EXPECT_EQ((uint64_t)sect2.address, 0x020ULL);
Nick Kledzik30332b12013-10-08 00:43:34 +0000590 EXPECT_EQ(sect2.content.size(), 7UL);
591 EXPECT_EQ((int)(sect2.content[0]), 0x68);
592 EXPECT_EQ((int)(sect2.content[1]), 0x65);
593 EXPECT_EQ((int)(sect2.content[2]), 0x6c);
Rui Ueyama7c13c442014-01-13 23:21:33 +0000594
Nick Kledzik30332b12013-10-08 00:43:34 +0000595 EXPECT_EQ(f->globalSymbols.size(), 1UL);
596 const Symbol& sym1 = f->globalSymbols[0];
597 EXPECT_TRUE(sym1.name.equals("_main"));
598 EXPECT_EQ((int)(sym1.type), llvm::MachO::N_SECT);
599 EXPECT_EQ((int)(sym1.scope), llvm::MachO::N_EXT);
600 EXPECT_EQ(sym1.sect, 1);
601 EXPECT_EQ((int)(sym1.desc), 0);
602 EXPECT_EQ((uint64_t)sym1.value, 0x0ULL);
603 EXPECT_EQ(f->undefinedSymbols.size(), 1UL);
604 const Symbol& sym2 = f->undefinedSymbols[0];
605 EXPECT_TRUE(sym2.name.equals("_printf"));
606 EXPECT_EQ((int)(sym2.type), llvm::MachO::N_UNDF);
607 EXPECT_EQ((int)(sym2.scope), 0);
608 EXPECT_EQ(sym2.sect, 0);
609 EXPECT_EQ((int)(sym2.desc), 0);
610 EXPECT_EQ((uint64_t)sym2.value, 0x0ULL);
611}
612
613
614
615TEST(ObjectFileYAML, hello_armv7) {
616 std::unique_ptr<NormalizedFile> f = fromYAML(
617 "---\n"
618 "arch: armv7\n"
Nick Kledzik360a1432014-01-08 01:38:07 +0000619 "file-type: MH_OBJECT\n"
Nick Kledzik30332b12013-10-08 00:43:34 +0000620 "flags: [ MH_SUBSECTIONS_VIA_SYMBOLS ]\n"
621 "sections:\n"
622 " - segment: __TEXT\n"
623 " section: __text\n"
624 " type: S_REGULAR\n"
625 " attributes: [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS]\n"
626 " alignment: 1\n"
627 " address: 0x0000\n"
628 " content: [ 0x80, 0xb5, 0x40, 0xf2, 0x06, 0x00, 0x6f, 0x46,\n"
629 " 0xc0, 0xf2, 0x00, 0x00, 0x78, 0x44, 0xff, 0xf7,\n"
630 " 0xf8, 0xef, 0x00, 0x20, 0x80, 0xbd ]\n"
631 " relocations:\n"
632 " - offset: 0x0e\n"
633 " type: ARM_THUMB_RELOC_BR22\n"
634 " length: 2\n"
635 " pc-rel: true\n"
636 " extern: true\n"
637 " symbol: 1\n"
638 " - offset: 0x08\n"
639 " scattered: true\n"
640 " type: ARM_RELOC_HALF_SECTDIFF\n"
641 " length: 3\n"
642 " pc-rel: false\n"
643 " value: 0x16\n"
644 " - offset: 0x06\n"
645 " scattered: true\n"
646 " type: ARM_RELOC_PAIR\n"
647 " length: 3\n"
648 " pc-rel: false\n"
649 " value: 0xc\n"
650 " - offset: 0x02\n"
651 " scattered: true\n"
652 " type: ARM_RELOC_HALF_SECTDIFF\n"
653 " length: 2\n"
654 " pc-rel: false\n"
655 " value: 0x16\n"
656 " - offset: 0x0\n"
657 " scattered: true\n"
658 " type: ARM_RELOC_PAIR\n"
659 " length: 2\n"
660 " pc-rel: false\n"
661 " value: 0xc\n"
662 " - segment: __TEXT\n"
663 " section: __cstring\n"
664 " type: S_CSTRING_LITERALS\n"
665 " attributes: [ ]\n"
666 " alignment: 0\n"
667 " address: 0x0016\n"
668 " content: [ 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x0a, 0x00 ]\n"
669 "global-symbols:\n"
670 " - name: _main\n"
671 " type: N_SECT\n"
672 " scope: [ N_EXT ]\n"
673 " sect: 1\n"
674 " desc: [ N_ARM_THUMB_DEF ]\n"
675 " value: 0x0\n"
676 "undefined-symbols:\n"
677 " - name: _printf\n"
678 " type: N_UNDF\n"
679 " value: 0x0\n"
680 "...\n");
681 EXPECT_EQ(f->arch, lld::MachOLinkingContext::arch_armv7);
682 EXPECT_EQ(f->fileType, llvm::MachO::MH_OBJECT);
683 EXPECT_EQ((int)(f->flags), llvm::MachO::MH_SUBSECTIONS_VIA_SYMBOLS);
684 EXPECT_EQ(f->sections.size(), 2UL);
Rui Ueyama7c13c442014-01-13 23:21:33 +0000685
Nick Kledzik30332b12013-10-08 00:43:34 +0000686 const Section& sect1 = f->sections[0];
687 EXPECT_TRUE(sect1.segmentName.equals("__TEXT"));
688 EXPECT_TRUE(sect1.sectionName.equals("__text"));
689 EXPECT_EQ((uint32_t)(sect1.type), (uint32_t)(llvm::MachO::S_REGULAR));
Rui Ueyama7c13c442014-01-13 23:21:33 +0000690 EXPECT_EQ((uint32_t)(sect1.attributes),
691 (uint32_t)(llvm::MachO::S_ATTR_PURE_INSTRUCTIONS
Nick Kledzik30332b12013-10-08 00:43:34 +0000692 | llvm::MachO::S_ATTR_SOME_INSTRUCTIONS));
693 EXPECT_EQ(sect1.alignment, 1U);
Nick Kledzik58070022013-10-08 01:27:03 +0000694 EXPECT_EQ((uint64_t)sect1.address, 0x0ULL);
Nick Kledzik30332b12013-10-08 00:43:34 +0000695 EXPECT_EQ(sect1.content.size(), 22UL);
696 EXPECT_EQ((int)(sect1.content[0]), 0x80);
697 EXPECT_EQ((int)(sect1.content[1]), 0xb5);
698 EXPECT_EQ(sect1.relocations.size(), 5UL);
699 const Relocation& reloc1 = sect1.relocations[0];
700 EXPECT_EQ(reloc1.offset, 0x0eU);
701 EXPECT_FALSE(reloc1.scattered);
702 EXPECT_EQ((int)reloc1.type, (int)llvm::MachO::ARM_THUMB_RELOC_BR22);
703 EXPECT_EQ(reloc1.length, 2);
704 EXPECT_TRUE(reloc1.pcRel);
705 EXPECT_TRUE(reloc1.isExtern);
706 EXPECT_EQ(reloc1.symbol, 1U);
707 EXPECT_EQ((int)(reloc1.value), 0);
708 const Relocation& reloc2 = sect1.relocations[1];
709 EXPECT_EQ(reloc2.offset, 0x8U);
710 EXPECT_TRUE(reloc2.scattered);
711 EXPECT_EQ((int)reloc2.type, (int)llvm::MachO::ARM_RELOC_HALF_SECTDIFF);
712 EXPECT_EQ(reloc2.length, 3);
713 EXPECT_FALSE(reloc2.pcRel);
714 EXPECT_EQ(reloc2.symbol, 0U);
715 EXPECT_EQ((int)(reloc2.value), 0x16);
716 const Relocation& reloc3 = sect1.relocations[2];
717 EXPECT_EQ(reloc3.offset, 0x6U);
718 EXPECT_TRUE(reloc3.scattered);
719 EXPECT_EQ((int)reloc3.type, (int)llvm::MachO::ARM_RELOC_PAIR);
720 EXPECT_EQ(reloc3.length, 3);
721 EXPECT_FALSE(reloc3.pcRel);
722 EXPECT_EQ(reloc3.symbol, 0U);
723 EXPECT_EQ((int)(reloc3.value), 0xc);
724 const Relocation& reloc4 = sect1.relocations[3];
725 EXPECT_EQ(reloc4.offset, 0x2U);
726 EXPECT_TRUE(reloc4.scattered);
727 EXPECT_EQ((int)reloc4.type, (int)llvm::MachO::ARM_RELOC_HALF_SECTDIFF);
728 EXPECT_EQ(reloc4.length, 2);
729 EXPECT_FALSE(reloc4.pcRel);
730 EXPECT_EQ(reloc4.symbol, 0U);
731 EXPECT_EQ((int)(reloc4.value), 0x16);
732 const Relocation& reloc5 = sect1.relocations[4];
733 EXPECT_EQ(reloc5.offset, 0x0U);
734 EXPECT_TRUE(reloc5.scattered);
735 EXPECT_EQ((int)reloc5.type, (int)llvm::MachO::ARM_RELOC_PAIR);
736 EXPECT_EQ(reloc5.length, 2);
737 EXPECT_FALSE(reloc5.pcRel);
738 EXPECT_EQ(reloc5.symbol, 0U);
739 EXPECT_EQ((int)(reloc5.value), 0xc);
740
741 const Section& sect2 = f->sections[1];
742 EXPECT_TRUE(sect2.segmentName.equals("__TEXT"));
743 EXPECT_TRUE(sect2.sectionName.equals("__cstring"));
744 EXPECT_EQ((uint32_t)(sect2.type), (uint32_t)(llvm::MachO::S_CSTRING_LITERALS));
745 EXPECT_EQ((uint32_t)(sect2.attributes), 0U);
746 EXPECT_EQ(sect2.alignment, 0U);
Nick Kledzik58070022013-10-08 01:27:03 +0000747 EXPECT_EQ((uint64_t)sect2.address, 0x016ULL);
Nick Kledzik30332b12013-10-08 00:43:34 +0000748 EXPECT_EQ(sect2.content.size(), 7UL);
749 EXPECT_EQ((int)(sect2.content[0]), 0x68);
750 EXPECT_EQ((int)(sect2.content[1]), 0x65);
751 EXPECT_EQ((int)(sect2.content[2]), 0x6c);
Rui Ueyama7c13c442014-01-13 23:21:33 +0000752
Nick Kledzik30332b12013-10-08 00:43:34 +0000753 EXPECT_EQ(f->globalSymbols.size(), 1UL);
754 const Symbol& sym1 = f->globalSymbols[0];
755 EXPECT_TRUE(sym1.name.equals("_main"));
756 EXPECT_EQ((int)(sym1.type), llvm::MachO::N_SECT);
757 EXPECT_EQ((int)(sym1.scope), llvm::MachO::N_EXT);
758 EXPECT_EQ(sym1.sect, 1);
759 EXPECT_EQ((int)(sym1.desc), (int)(llvm::MachO::N_ARM_THUMB_DEF));
760 EXPECT_EQ((uint64_t)sym1.value, 0x0ULL);
761 EXPECT_EQ(f->undefinedSymbols.size(), 1UL);
762 const Symbol& sym2 = f->undefinedSymbols[0];
763 EXPECT_TRUE(sym2.name.equals("_printf"));
764 EXPECT_EQ((int)(sym2.type), llvm::MachO::N_UNDF);
765 EXPECT_EQ((int)(sym2.scope), 0);
766 EXPECT_EQ(sym2.sect, 0);
767 EXPECT_EQ((int)(sym2.desc), 0);
768 EXPECT_EQ((uint64_t)sym2.value, 0x0ULL);
769}