1 | //===-- SymbolTest.cpp ----------------------------------------------------===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #include "Plugins/ObjectFile/Mach-O/ObjectFileMachO.h" |
10 | #include "Plugins/SymbolFile/DWARF/SymbolFileDWARF.h" |
11 | #include "Plugins/TypeSystem/Clang/TypeSystemClang.h" |
12 | #include "TestingSupport/SubsystemRAII.h" |
13 | #include "TestingSupport/TestUtilities.h" |
14 | |
15 | #include "lldb/Core/DataFileCache.h" |
16 | #include "lldb/Core/Module.h" |
17 | #include "lldb/Host/FileSystem.h" |
18 | #include "lldb/Host/HostInfo.h" |
19 | #include "lldb/Symbol/Symbol.h" |
20 | #include "lldb/Symbol/Symtab.h" |
21 | #include "lldb/Utility/DataEncoder.h" |
22 | #include "lldb/Utility/DataExtractor.h" |
23 | |
24 | #include <memory> |
25 | |
26 | #include "gtest/gtest.h" |
27 | |
28 | using namespace lldb; |
29 | using namespace lldb_private; |
30 | using namespace lldb_private::plugin::dwarf; |
31 | |
32 | class SymtabTest : public testing::Test { |
33 | SubsystemRAII<FileSystem, HostInfo, ObjectFileMachO, SymbolFileDWARF, |
34 | TypeSystemClang> |
35 | subsystem; |
36 | }; |
37 | |
38 | static void EncodeDecode(const Symtab &object, ByteOrder byte_order) { |
39 | const uint8_t addr_size = 8; |
40 | DataEncoder file(byte_order, addr_size); |
41 | |
42 | object.Encode(encoder&: file); |
43 | llvm::ArrayRef<uint8_t> bytes = file.GetData(); |
44 | DataExtractor data(bytes.data(), bytes.size(), byte_order, addr_size); |
45 | Symtab decoded_object(object.GetObjectFile()); |
46 | offset_t data_offset = 0; |
47 | bool uuid_mismatch = false; |
48 | decoded_object.Decode(data, offset_ptr: &data_offset, uuid_mismatch); |
49 | ASSERT_EQ(object.GetNumSymbols(), decoded_object.GetNumSymbols()); |
50 | for (size_t i = 0; i < object.GetNumSymbols(); ++i) |
51 | EXPECT_EQ(*object.SymbolAtIndex(i), *decoded_object.SymbolAtIndex(i)); |
52 | } |
53 | |
54 | static void EncodeDecode(const Symtab &object) { |
55 | EncodeDecode(object, byte_order: eByteOrderLittle); |
56 | EncodeDecode(object, byte_order: eByteOrderBig); |
57 | } |
58 | |
59 | TEST_F(SymtabTest, EncodeDecodeSymtab) { |
60 | |
61 | auto ExpectedFile = TestFile::fromYaml(Yaml: R"( |
62 | --- !mach-o |
63 | FileHeader: |
64 | magic: 0xFEEDFACF |
65 | cputype: 0x100000C |
66 | cpusubtype: 0x0 |
67 | filetype: 0x2 |
68 | ncmds: 17 |
69 | sizeofcmds: 792 |
70 | flags: 0x200085 |
71 | reserved: 0x0 |
72 | LoadCommands: |
73 | - cmd: LC_SEGMENT_64 |
74 | cmdsize: 72 |
75 | segname: __PAGEZERO |
76 | vmaddr: 0 |
77 | vmsize: 4294967296 |
78 | fileoff: 0 |
79 | filesize: 0 |
80 | maxprot: 0 |
81 | initprot: 0 |
82 | nsects: 0 |
83 | flags: 0 |
84 | - cmd: LC_SEGMENT_64 |
85 | cmdsize: 232 |
86 | segname: __TEXT |
87 | vmaddr: 4294967296 |
88 | vmsize: 16384 |
89 | fileoff: 0 |
90 | filesize: 16384 |
91 | maxprot: 5 |
92 | initprot: 5 |
93 | nsects: 2 |
94 | flags: 0 |
95 | Sections: |
96 | - sectname: __text |
97 | segname: __TEXT |
98 | addr: 0x100003F94 |
99 | size: 36 |
100 | offset: 0x3F94 |
101 | align: 2 |
102 | reloff: 0x0 |
103 | nreloc: 0 |
104 | flags: 0x80000400 |
105 | reserved1: 0x0 |
106 | reserved2: 0x0 |
107 | reserved3: 0x0 |
108 | content: FF8300D1E80300AA00008052FF1F00B9E81B00B9E10B00F9E20700F9FF830091C0035FD6 |
109 | - sectname: __unwind_info |
110 | segname: __TEXT |
111 | addr: 0x100003FB8 |
112 | size: 72 |
113 | offset: 0x3FB8 |
114 | align: 2 |
115 | reloff: 0x0 |
116 | nreloc: 0 |
117 | flags: 0x0 |
118 | reserved1: 0x0 |
119 | reserved2: 0x0 |
120 | reserved3: 0x0 |
121 | content: 010000001C000000000000001C000000000000001C00000002000000943F00003400000034000000B93F00000000000034000000030000000C000100100001000000000000200002 |
122 | - cmd: LC_SEGMENT_64 |
123 | cmdsize: 72 |
124 | segname: __LINKEDIT |
125 | vmaddr: 4294983680 |
126 | vmsize: 16384 |
127 | fileoff: 16384 |
128 | filesize: 674 |
129 | maxprot: 1 |
130 | initprot: 1 |
131 | nsects: 0 |
132 | flags: 0 |
133 | - cmd: LC_DYLD_CHAINED_FIXUPS |
134 | cmdsize: 16 |
135 | dataoff: 16384 |
136 | datasize: 56 |
137 | - cmd: LC_DYLD_EXPORTS_TRIE |
138 | cmdsize: 16 |
139 | dataoff: 16440 |
140 | datasize: 48 |
141 | - cmd: LC_SYMTAB |
142 | cmdsize: 24 |
143 | symoff: 16496 |
144 | nsyms: 10 |
145 | stroff: 16656 |
146 | strsize: 128 |
147 | - cmd: LC_DYSYMTAB |
148 | cmdsize: 80 |
149 | ilocalsym: 0 |
150 | nlocalsym: 8 |
151 | iextdefsym: 8 |
152 | nextdefsym: 2 |
153 | iundefsym: 10 |
154 | nundefsym: 0 |
155 | tocoff: 0 |
156 | ntoc: 0 |
157 | modtaboff: 0 |
158 | nmodtab: 0 |
159 | extrefsymoff: 0 |
160 | nextrefsyms: 0 |
161 | indirectsymoff: 0 |
162 | nindirectsyms: 0 |
163 | extreloff: 0 |
164 | nextrel: 0 |
165 | locreloff: 0 |
166 | nlocrel: 0 |
167 | - cmd: LC_LOAD_DYLINKER |
168 | cmdsize: 32 |
169 | name: 12 |
170 | Content: '/usr/lib/dyld' |
171 | ZeroPadBytes: 7 |
172 | - cmd: LC_UUID |
173 | cmdsize: 24 |
174 | uuid: 1EECD2B8-16EA-3FEC-AB3C-F46139DBD0E2 |
175 | - cmd: LC_BUILD_VERSION |
176 | cmdsize: 32 |
177 | platform: 1 |
178 | minos: 786432 |
179 | sdk: 786432 |
180 | ntools: 1 |
181 | Tools: |
182 | - tool: 3 |
183 | version: 46596096 |
184 | - cmd: LC_SOURCE_VERSION |
185 | cmdsize: 16 |
186 | version: 0 |
187 | - cmd: LC_MAIN |
188 | cmdsize: 24 |
189 | entryoff: 16276 |
190 | stacksize: 0 |
191 | - cmd: LC_LOAD_DYLIB |
192 | cmdsize: 48 |
193 | dylib: |
194 | name: 24 |
195 | timestamp: 2 |
196 | current_version: 78643968 |
197 | compatibility_version: 65536 |
198 | Content: '/usr/lib/libc++.1.dylib' |
199 | ZeroPadBytes: 1 |
200 | - cmd: LC_LOAD_DYLIB |
201 | cmdsize: 56 |
202 | dylib: |
203 | name: 24 |
204 | timestamp: 2 |
205 | current_version: 85917696 |
206 | compatibility_version: 65536 |
207 | Content: '/usr/lib/libSystem.B.dylib' |
208 | ZeroPadBytes: 6 |
209 | - cmd: LC_FUNCTION_STARTS |
210 | cmdsize: 16 |
211 | dataoff: 16488 |
212 | datasize: 8 |
213 | - cmd: LC_DATA_IN_CODE |
214 | cmdsize: 16 |
215 | dataoff: 16496 |
216 | datasize: 0 |
217 | - cmd: LC_CODE_SIGNATURE |
218 | cmdsize: 16 |
219 | dataoff: 16784 |
220 | datasize: 274 |
221 | LinkEditData: |
222 | NameList: |
223 | - n_strx: 28 |
224 | n_type: 0x64 |
225 | n_sect: 0 |
226 | n_desc: 0 |
227 | n_value: 0 |
228 | - n_strx: 64 |
229 | n_type: 0x64 |
230 | n_sect: 0 |
231 | n_desc: 0 |
232 | n_value: 0 |
233 | - n_strx: 73 |
234 | n_type: 0x66 |
235 | n_sect: 0 |
236 | n_desc: 1 |
237 | n_value: 1639532873 |
238 | - n_strx: 1 |
239 | n_type: 0x2E |
240 | n_sect: 1 |
241 | n_desc: 0 |
242 | n_value: 4294983572 |
243 | - n_strx: 115 |
244 | n_type: 0x24 |
245 | n_sect: 1 |
246 | n_desc: 0 |
247 | n_value: 4294983572 |
248 | - n_strx: 1 |
249 | n_type: 0x24 |
250 | n_sect: 0 |
251 | n_desc: 0 |
252 | n_value: 36 |
253 | - n_strx: 1 |
254 | n_type: 0x4E |
255 | n_sect: 1 |
256 | n_desc: 0 |
257 | n_value: 36 |
258 | - n_strx: 1 |
259 | n_type: 0x64 |
260 | n_sect: 1 |
261 | n_desc: 0 |
262 | n_value: 0 |
263 | - n_strx: 2 |
264 | n_type: 0xF |
265 | n_sect: 1 |
266 | n_desc: 16 |
267 | n_value: 4294967296 |
268 | - n_strx: 22 |
269 | n_type: 0xF |
270 | n_sect: 1 |
271 | n_desc: 0 |
272 | n_value: 4294983572 |
273 | StringTable: |
274 | - ' ' |
275 | - __mh_execute_header |
276 | - _main |
277 | - '/Users/gclayton/Documents/src/args/' |
278 | - main.cpp |
279 | - '/Users/gclayton/Documents/src/args/main.o' |
280 | - _main |
281 | - '' |
282 | - '' |
283 | - '' |
284 | - '' |
285 | - '' |
286 | - '' |
287 | - '' |
288 | ... |
289 | )" ); |
290 | |
291 | ASSERT_THAT_EXPECTED(ExpectedFile, llvm::Succeeded()); |
292 | auto module_sp = std::make_shared<Module>(args: ExpectedFile->moduleSpec()); |
293 | ObjectFile *objfile = module_sp->GetObjectFile(); |
294 | ASSERT_NE(objfile, nullptr); |
295 | |
296 | // Test encoding and decoding an empty symbol table. |
297 | Symtab symtab(objfile); |
298 | symtab.PreloadSymbols(); |
299 | EncodeDecode(object: symtab); |
300 | |
301 | // Now encode and decode an actual symbol table from our yaml. |
302 | Symtab *module_symtab = module_sp->GetSymtab(); |
303 | ASSERT_NE(module_symtab, nullptr); |
304 | module_symtab->PreloadSymbols(); |
305 | EncodeDecode(object: *module_symtab); |
306 | } |
307 | |
308 | TEST_F(SymtabTest, TestDecodeCStringMaps) { |
309 | // Symbol tables save out the symbols, but they also save out the symbol table |
310 | // name indexes. These name indexes are a map of sorted ConstString + T pairs |
311 | // and when they are decoded from a file, they are no longer sorted since |
312 | // ConstString objects can be sorted by "const char *" and the order in which |
313 | // these strings are created won't be the same in a new process. We need to |
314 | // ensure these name lookups happen correctly when we load the name indexes, |
315 | // so this test loads a symbol table from a cache file from |
316 | // "lldb/unittests/Symbol/Inputs/indexnames-symtab-cache" and make sure we |
317 | // can correctly lookup each of the names in the symbol table. |
318 | auto ExpectedFile = TestFile::fromYaml(Yaml: R"( |
319 | --- !mach-o |
320 | FileHeader: |
321 | magic: 0xFEEDFACF |
322 | cputype: 0x100000C |
323 | cpusubtype: 0x0 |
324 | filetype: 0x2 |
325 | ncmds: 16 |
326 | sizeofcmds: 744 |
327 | flags: 0x200085 |
328 | reserved: 0x0 |
329 | LoadCommands: |
330 | - cmd: LC_SEGMENT_64 |
331 | cmdsize: 72 |
332 | segname: __PAGEZERO |
333 | vmaddr: 0 |
334 | vmsize: 4294967296 |
335 | fileoff: 0 |
336 | filesize: 0 |
337 | maxprot: 0 |
338 | initprot: 0 |
339 | nsects: 0 |
340 | flags: 0 |
341 | - cmd: LC_SEGMENT_64 |
342 | cmdsize: 232 |
343 | segname: __TEXT |
344 | vmaddr: 4294967296 |
345 | vmsize: 16384 |
346 | fileoff: 0 |
347 | filesize: 16384 |
348 | maxprot: 5 |
349 | initprot: 5 |
350 | nsects: 2 |
351 | flags: 0 |
352 | Sections: |
353 | - sectname: __text |
354 | segname: __TEXT |
355 | addr: 0x100003F64 |
356 | size: 76 |
357 | offset: 0x3F64 |
358 | align: 2 |
359 | reloff: 0x0 |
360 | nreloc: 0 |
361 | flags: 0x80000400 |
362 | reserved1: 0x0 |
363 | reserved2: 0x0 |
364 | reserved3: 0x0 |
365 | content: 80018052C0035FD6E0028052C0035FD640048052C0035FD6FF8300D1FD7B01A9FD43009108008052E80B00B9BFC31FB8F4FFFF97F5FFFF97F6FFFF97E00B40B9FD7B41A9FF830091C0035FD6 |
366 | - sectname: __unwind_info |
367 | segname: __TEXT |
368 | addr: 0x100003FB0 |
369 | size: 80 |
370 | offset: 0x3FB0 |
371 | align: 2 |
372 | reloff: 0x0 |
373 | nreloc: 0 |
374 | flags: 0x0 |
375 | reserved1: 0x0 |
376 | reserved2: 0x0 |
377 | reserved3: 0x0 |
378 | content: 010000001C000000000000001C000000000000001C00000002000000643F00003400000034000000B13F00000000000034000000030000000C0002001400020000000001180000000000000400000002 |
379 | - cmd: LC_SEGMENT_64 |
380 | cmdsize: 72 |
381 | segname: __LINKEDIT |
382 | vmaddr: 4294983680 |
383 | vmsize: 16384 |
384 | fileoff: 16384 |
385 | filesize: 994 |
386 | maxprot: 1 |
387 | initprot: 1 |
388 | nsects: 0 |
389 | flags: 0 |
390 | - cmd: LC_DYLD_CHAINED_FIXUPS |
391 | cmdsize: 16 |
392 | dataoff: 16384 |
393 | datasize: 56 |
394 | - cmd: LC_DYLD_EXPORTS_TRIE |
395 | cmdsize: 16 |
396 | dataoff: 16440 |
397 | datasize: 80 |
398 | - cmd: LC_SYMTAB |
399 | cmdsize: 24 |
400 | symoff: 16528 |
401 | nsyms: 25 |
402 | stroff: 16928 |
403 | strsize: 176 |
404 | - cmd: LC_DYSYMTAB |
405 | cmdsize: 80 |
406 | ilocalsym: 0 |
407 | nlocalsym: 20 |
408 | iextdefsym: 20 |
409 | nextdefsym: 5 |
410 | iundefsym: 25 |
411 | nundefsym: 0 |
412 | tocoff: 0 |
413 | ntoc: 0 |
414 | modtaboff: 0 |
415 | nmodtab: 0 |
416 | extrefsymoff: 0 |
417 | nextrefsyms: 0 |
418 | indirectsymoff: 0 |
419 | nindirectsyms: 0 |
420 | extreloff: 0 |
421 | nextrel: 0 |
422 | locreloff: 0 |
423 | nlocrel: 0 |
424 | - cmd: LC_LOAD_DYLINKER |
425 | cmdsize: 32 |
426 | name: 12 |
427 | Content: '/usr/lib/dyld' |
428 | ZeroPadBytes: 7 |
429 | - cmd: LC_UUID |
430 | cmdsize: 24 |
431 | uuid: 3E94866E-0D1A-39BD-975B-64E8F1FDBAAE |
432 | - cmd: LC_BUILD_VERSION |
433 | cmdsize: 32 |
434 | platform: 1 |
435 | minos: 786432 |
436 | sdk: 787200 |
437 | ntools: 1 |
438 | Tools: |
439 | - tool: 3 |
440 | version: 49938432 |
441 | - cmd: LC_SOURCE_VERSION |
442 | cmdsize: 16 |
443 | version: 0 |
444 | - cmd: LC_MAIN |
445 | cmdsize: 24 |
446 | entryoff: 16252 |
447 | stacksize: 0 |
448 | - cmd: LC_LOAD_DYLIB |
449 | cmdsize: 56 |
450 | dylib: |
451 | name: 24 |
452 | timestamp: 2 |
453 | current_version: 85943299 |
454 | compatibility_version: 65536 |
455 | Content: '/usr/lib/libSystem.B.dylib' |
456 | ZeroPadBytes: 6 |
457 | - cmd: LC_FUNCTION_STARTS |
458 | cmdsize: 16 |
459 | dataoff: 16520 |
460 | datasize: 8 |
461 | - cmd: LC_DATA_IN_CODE |
462 | cmdsize: 16 |
463 | dataoff: 16528 |
464 | datasize: 0 |
465 | - cmd: LC_CODE_SIGNATURE |
466 | cmdsize: 16 |
467 | dataoff: 17104 |
468 | datasize: 274 |
469 | LinkEditData: |
470 | NameList: |
471 | - n_strx: 43 |
472 | n_type: 0x64 |
473 | n_sect: 0 |
474 | n_desc: 0 |
475 | n_value: 0 |
476 | - n_strx: 91 |
477 | n_type: 0x64 |
478 | n_sect: 0 |
479 | n_desc: 0 |
480 | n_value: 0 |
481 | - n_strx: 98 |
482 | n_type: 0x66 |
483 | n_sect: 0 |
484 | n_desc: 1 |
485 | n_value: 1651098491 |
486 | - n_strx: 1 |
487 | n_type: 0x2E |
488 | n_sect: 1 |
489 | n_desc: 0 |
490 | n_value: 4294983524 |
491 | - n_strx: 152 |
492 | n_type: 0x24 |
493 | n_sect: 1 |
494 | n_desc: 0 |
495 | n_value: 4294983524 |
496 | - n_strx: 1 |
497 | n_type: 0x24 |
498 | n_sect: 0 |
499 | n_desc: 0 |
500 | n_value: 8 |
501 | - n_strx: 1 |
502 | n_type: 0x4E |
503 | n_sect: 1 |
504 | n_desc: 0 |
505 | n_value: 8 |
506 | - n_strx: 1 |
507 | n_type: 0x2E |
508 | n_sect: 1 |
509 | n_desc: 0 |
510 | n_value: 4294983532 |
511 | - n_strx: 157 |
512 | n_type: 0x24 |
513 | n_sect: 1 |
514 | n_desc: 0 |
515 | n_value: 4294983532 |
516 | - n_strx: 1 |
517 | n_type: 0x24 |
518 | n_sect: 0 |
519 | n_desc: 0 |
520 | n_value: 8 |
521 | - n_strx: 1 |
522 | n_type: 0x4E |
523 | n_sect: 1 |
524 | n_desc: 0 |
525 | n_value: 8 |
526 | - n_strx: 1 |
527 | n_type: 0x2E |
528 | n_sect: 1 |
529 | n_desc: 0 |
530 | n_value: 4294983540 |
531 | - n_strx: 162 |
532 | n_type: 0x24 |
533 | n_sect: 1 |
534 | n_desc: 0 |
535 | n_value: 4294983540 |
536 | - n_strx: 1 |
537 | n_type: 0x24 |
538 | n_sect: 0 |
539 | n_desc: 0 |
540 | n_value: 8 |
541 | - n_strx: 1 |
542 | n_type: 0x4E |
543 | n_sect: 1 |
544 | n_desc: 0 |
545 | n_value: 8 |
546 | - n_strx: 1 |
547 | n_type: 0x2E |
548 | n_sect: 1 |
549 | n_desc: 0 |
550 | n_value: 4294983548 |
551 | - n_strx: 167 |
552 | n_type: 0x24 |
553 | n_sect: 1 |
554 | n_desc: 0 |
555 | n_value: 4294983548 |
556 | - n_strx: 1 |
557 | n_type: 0x24 |
558 | n_sect: 0 |
559 | n_desc: 0 |
560 | n_value: 52 |
561 | - n_strx: 1 |
562 | n_type: 0x4E |
563 | n_sect: 1 |
564 | n_desc: 0 |
565 | n_value: 52 |
566 | - n_strx: 1 |
567 | n_type: 0x64 |
568 | n_sect: 1 |
569 | n_desc: 0 |
570 | n_value: 0 |
571 | - n_strx: 2 |
572 | n_type: 0xF |
573 | n_sect: 1 |
574 | n_desc: 16 |
575 | n_value: 4294967296 |
576 | - n_strx: 22 |
577 | n_type: 0xF |
578 | n_sect: 1 |
579 | n_desc: 0 |
580 | n_value: 4294983532 |
581 | - n_strx: 27 |
582 | n_type: 0xF |
583 | n_sect: 1 |
584 | n_desc: 0 |
585 | n_value: 4294983540 |
586 | - n_strx: 32 |
587 | n_type: 0xF |
588 | n_sect: 1 |
589 | n_desc: 0 |
590 | n_value: 4294983524 |
591 | - n_strx: 37 |
592 | n_type: 0xF |
593 | n_sect: 1 |
594 | n_desc: 0 |
595 | n_value: 4294983548 |
596 | StringTable: |
597 | - ' ' |
598 | - __mh_execute_header |
599 | - _bar |
600 | - _baz |
601 | - _foo |
602 | - _main |
603 | - '/Users/gclayton/Documents/objfiles/index-names/' |
604 | - main.c |
605 | - '/Users/gclayton/Documents/objfiles/index-names/main.o' |
606 | - _foo |
607 | - _bar |
608 | - _baz |
609 | - _main |
610 | - '' |
611 | - '' |
612 | - '' |
613 | FunctionStarts: [ 0x3F64, 0x3F6C, 0x3F74, 0x3F7C ] |
614 | ... |
615 | )" ); |
616 | // This data was taken from a hex dump of the object file from the above yaml |
617 | // and hexdumped so we can load the cache data in this test. |
618 | const uint8_t symtab_cache_bytes[] = { |
619 | 0x01, 0x10, 0x3e, 0x94, 0x86, 0x6e, 0x0d, 0x1a, |
620 | 0x39, 0xbd, 0x97, 0x5b, 0x64, 0xe8, 0xf1, 0xfd, |
621 | 0xba, 0xae, 0xff, 0x53, 0x54, 0x41, 0x42, 0x91, |
622 | 0x00, 0x00, 0x00, 0x00, 0x2f, 0x55, 0x73, 0x65, |
623 | 0x72, 0x73, 0x2f, 0x67, 0x63, 0x6c, 0x61, 0x79, |
624 | 0x74, 0x6f, 0x6e, 0x2f, 0x44, 0x6f, 0x63, 0x75, |
625 | 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6f, 0x62, |
626 | 0x6a, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2f, 0x69, |
627 | 0x6e, 0x64, 0x65, 0x78, 0x2d, 0x6e, 0x61, 0x6d, |
628 | 0x65, 0x73, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, |
629 | 0x63, 0x00, 0x2f, 0x55, 0x73, 0x65, 0x72, 0x73, |
630 | 0x2f, 0x67, 0x63, 0x6c, 0x61, 0x79, 0x74, 0x6f, |
631 | 0x6e, 0x2f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, |
632 | 0x6e, 0x74, 0x73, 0x2f, 0x6f, 0x62, 0x6a, 0x66, |
633 | 0x69, 0x6c, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x64, |
634 | 0x65, 0x78, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x73, |
635 | 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x6f, 0x00, |
636 | 0x66, 0x6f, 0x6f, 0x00, 0x62, 0x61, 0x72, 0x00, |
637 | 0x62, 0x61, 0x7a, 0x00, 0x6d, 0x61, 0x69, 0x6e, |
638 | 0x00, 0x5f, 0x6d, 0x68, 0x5f, 0x65, 0x78, 0x65, |
639 | 0x63, 0x75, 0x74, 0x65, 0x5f, 0x68, 0x65, 0x61, |
640 | 0x64, 0x65, 0x72, 0x00, 0x53, 0x59, 0x4d, 0x42, |
641 | 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, |
642 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x2a, |
643 | 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
644 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, |
645 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
646 | 0x64, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, |
647 | 0x0a, 0x20, 0x01, 0x37, 0x00, 0x00, 0x00, 0x00, |
648 | 0x7b, 0xc3, 0x69, 0x62, 0x00, 0x00, 0x00, 0x00, |
649 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
650 | 0x01, 0x00, 0x66, 0x00, 0x04, 0x00, 0x00, 0x00, |
651 | 0x00, 0x00, 0x02, 0x32, 0x01, 0x6d, 0x00, 0x00, |
652 | 0x00, 0x01, 0x64, 0x3f, 0x00, 0x00, 0x01, 0x00, |
653 | 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, |
654 | 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x08, 0x00, |
655 | 0x00, 0x00, 0x00, 0x00, 0x02, 0x32, 0x01, 0x71, |
656 | 0x00, 0x00, 0x00, 0x01, 0x6c, 0x3f, 0x00, 0x00, |
657 | 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, |
658 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, |
659 | 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x32, |
660 | 0x01, 0x75, 0x00, 0x00, 0x00, 0x01, 0x74, 0x3f, |
661 | 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, |
662 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
663 | 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, |
664 | 0x02, 0x32, 0x01, 0x79, 0x00, 0x00, 0x00, 0x01, |
665 | 0x7c, 0x3f, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, |
666 | 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
667 | 0x00, 0x00, 0x0f, 0x00, 0x14, 0x00, 0x00, 0x00, |
668 | 0x00, 0x00, 0x04, 0x12, 0x02, 0x7e, 0x00, 0x00, |
669 | 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, |
670 | 0x00, 0x00, 0x64, 0x3f, 0x00, 0x00, 0x00, 0x00, |
671 | 0x00, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x01, 0x00, |
672 | 0x43, 0x4d, 0x41, 0x50, 0x07, 0x00, 0x00, 0x00, |
673 | 0x6d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, |
674 | 0x75, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, |
675 | 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
676 | 0x79, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, |
677 | 0x37, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, |
678 | 0x71, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, |
679 | 0x7e, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00 |
680 | }; |
681 | |
682 | ASSERT_THAT_EXPECTED(ExpectedFile, llvm::Succeeded()); |
683 | auto module_sp = std::make_shared<Module>(args: ExpectedFile->moduleSpec()); |
684 | ObjectFile *objfile = module_sp->GetObjectFile(); |
685 | ASSERT_NE(objfile, nullptr); |
686 | |
687 | // Test encoding and decoding an empty symbol table. |
688 | DataExtractor data(symtab_cache_bytes, sizeof(symtab_cache_bytes), |
689 | eByteOrderLittle, 8); |
690 | Symtab symtab(objfile); |
691 | offset_t data_offset = 0; |
692 | bool uuid_mismatch = false; // Gets set to true if signature doesn't match. |
693 | const bool success = symtab.Decode(data, offset_ptr: &data_offset, uuid_mismatch); |
694 | ASSERT_EQ(success, true); |
695 | ASSERT_EQ(uuid_mismatch, false); |
696 | |
697 | // Now make sure that name lookup works for all symbols. This indicates that |
698 | // the Symtab::NameToIndexMap was decoded correctly and works as expected. |
699 | Symbol *symbol = nullptr; |
700 | symbol = symtab.FindFirstSymbolWithNameAndType(name: ConstString("main" ), |
701 | symbol_type: eSymbolTypeCode, |
702 | symbol_debug_type: Symtab::eDebugAny, |
703 | symbol_visibility: Symtab::eVisibilityAny); |
704 | ASSERT_NE(symbol, nullptr); |
705 | symbol = symtab.FindFirstSymbolWithNameAndType(name: ConstString("foo" ), |
706 | symbol_type: eSymbolTypeCode, |
707 | symbol_debug_type: Symtab::eDebugAny, |
708 | symbol_visibility: Symtab::eVisibilityAny); |
709 | ASSERT_NE(symbol, nullptr); |
710 | symbol = symtab.FindFirstSymbolWithNameAndType(name: ConstString("bar" ), |
711 | symbol_type: eSymbolTypeCode, |
712 | symbol_debug_type: Symtab::eDebugAny, |
713 | symbol_visibility: Symtab::eVisibilityAny); |
714 | ASSERT_NE(symbol, nullptr); |
715 | symbol = symtab.FindFirstSymbolWithNameAndType(name: ConstString("baz" ), |
716 | symbol_type: eSymbolTypeCode, |
717 | symbol_debug_type: Symtab::eDebugAny, |
718 | symbol_visibility: Symtab::eVisibilityAny); |
719 | ASSERT_NE(symbol, nullptr); |
720 | } |
721 | |