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