1 /* pdb.h - header file for generating PDB CodeView debugging files. 2 Copyright (C) 2022-2024 Free Software Foundation, Inc. 3 4 This file is part of the GNU Binutils. 5 6 This program is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 3 of the License, or 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with this program; if not, write to the Free Software 18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 19 MA 02110-1301, USA. */ 20 21 /* Header files referred to below can be found in Microsoft's PDB 22 repository: https://github.com/microsoft/microsoft-pdb. */ 23 24 #ifndef PDB_H 25 #define PDB_H 26 27 #include "sysdep.h" 28 #include "bfd.h" 29 #include <stdbool.h> 30 #include <stddef.h> 31 32 #define LF_VTSHAPE 0x000a 33 #define LF_MODIFIER 0x1001 34 #define LF_POINTER 0x1002 35 #define LF_PROCEDURE 0x1008 36 #define LF_MFUNCTION 0x1009 37 #define LF_ARGLIST 0x1201 38 #define LF_FIELDLIST 0x1203 39 #define LF_BITFIELD 0x1205 40 #define LF_METHODLIST 0x1206 41 #define LF_BCLASS 0x1400 42 #define LF_VBCLASS 0x1401 43 #define LF_IVBCLASS 0x1402 44 #define LF_INDEX 0x1404 45 #define LF_VFUNCTAB 0x1409 46 #define LF_ENUMERATE 0x1502 47 #define LF_ARRAY 0x1503 48 #define LF_CLASS 0x1504 49 #define LF_STRUCTURE 0x1505 50 #define LF_UNION 0x1506 51 #define LF_ENUM 0x1507 52 #define LF_MEMBER 0x150d 53 #define LF_STMEMBER 0x150e 54 #define LF_METHOD 0x150f 55 #define LF_NESTTYPE 0x1510 56 #define LF_ONEMETHOD 0x1511 57 #define LF_VFTABLE 0x151d 58 #define LF_FUNC_ID 0x1601 59 #define LF_MFUNC_ID 0x1602 60 #define LF_BUILDINFO 0x1603 61 #define LF_SUBSTR_LIST 0x1604 62 #define LF_STRING_ID 0x1605 63 #define LF_UDT_SRC_LINE 0x1606 64 #define LF_UDT_MOD_SRC_LINE 0x1607 65 66 #define LF_CHAR 0x8000 67 #define LF_SHORT 0x8001 68 #define LF_USHORT 0x8002 69 #define LF_LONG 0x8003 70 #define LF_ULONG 0x8004 71 #define LF_QUADWORD 0x8009 72 #define LF_UQUADWORD 0x800a 73 74 #define S_END 0x0006 75 #define S_FRAMEPROC 0x1012 76 #define S_OBJNAME 0x1101 77 #define S_THUNK32 0x1102 78 #define S_BLOCK32 0x1103 79 #define S_LABEL32 0x1105 80 #define S_REGISTER 0x1106 81 #define S_CONSTANT 0x1107 82 #define S_UDT 0x1108 83 #define S_BPREL32 0x110b 84 #define S_LDATA32 0x110c 85 #define S_GDATA32 0x110d 86 #define S_PUB32 0x110e 87 #define S_LPROC32 0x110f 88 #define S_GPROC32 0x1110 89 #define S_REGREL32 0x1111 90 #define S_LTHREAD32 0x1112 91 #define S_GTHREAD32 0x1113 92 #define S_UNAMESPACE 0x1124 93 #define S_PROCREF 0x1125 94 #define S_LPROCREF 0x1127 95 #define S_FRAMECOOKIE 0x113a 96 #define S_COMPILE3 0x113c 97 #define S_ENVBLOCK 0x113d 98 #define S_LOCAL 0x113e 99 #define S_DEFRANGE_REGISTER 0x1141 100 #define S_DEFRANGE_FRAMEPOINTER_REL 0x1142 101 #define S_DEFRANGE_SUBFIELD_REGISTER 0x1143 102 #define S_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE 0x1144 103 #define S_DEFRANGE_REGISTER_REL 0x1145 104 #define S_LPROC32_ID 0x1146 105 #define S_GPROC32_ID 0x1147 106 #define S_BUILDINFO 0x114c 107 #define S_INLINESITE 0x114d 108 #define S_INLINESITE_END 0x114e 109 #define S_PROC_ID_END 0x114f 110 #define S_HEAPALLOCSITE 0x115e 111 112 /* PDBStream70 in pdb1.h */ 113 struct pdb_stream_70 114 { 115 uint32_t version; 116 uint32_t signature; 117 uint32_t age; 118 uint8_t guid[16]; 119 }; 120 121 #define PDB_STREAM_VERSION_VC70 20000404 122 #define PDB_STREAM_VERSION_VC140 20140508 123 124 /* HDR in tpi.h */ 125 struct pdb_tpi_stream_header 126 { 127 uint32_t version; 128 uint32_t header_size; 129 uint32_t type_index_begin; 130 uint32_t type_index_end; 131 uint32_t type_record_bytes; 132 uint16_t hash_stream_index; 133 uint16_t hash_aux_stream_index; 134 uint32_t hash_key_size; 135 uint32_t num_hash_buckets; 136 uint32_t hash_value_buffer_offset; 137 uint32_t hash_value_buffer_length; 138 uint32_t index_offset_buffer_offset; 139 uint32_t index_offset_buffer_length; 140 uint32_t hash_adj_buffer_offset; 141 uint32_t hash_adj_buffer_length; 142 }; 143 144 #define TPI_STREAM_VERSION_80 20040203 145 146 #define TPI_FIRST_INDEX 0x1000 147 #define NUM_TPI_HASH_BUCKETS 0x3ffff 148 149 #define NUM_GLOBALS_HASH_BUCKETS 4096 150 151 /* NewDBIHdr in dbi.h */ 152 struct pdb_dbi_stream_header 153 { 154 uint32_t version_signature; 155 uint32_t version_header; 156 uint32_t age; 157 uint16_t global_stream_index; 158 uint16_t build_number; 159 uint16_t public_stream_index; 160 uint16_t pdb_dll_version; 161 uint16_t sym_record_stream; 162 uint16_t pdb_dll_rbld; 163 uint32_t mod_info_size; 164 uint32_t section_contribution_size; 165 uint32_t section_map_size; 166 uint32_t source_info_size; 167 uint32_t type_server_map_size; 168 uint32_t mfc_type_server_index; 169 uint32_t optional_dbg_header_size; 170 uint32_t ec_substream_size; 171 uint16_t flags; 172 uint16_t machine; 173 uint32_t padding; 174 }; 175 176 #define DBI_STREAM_VERSION_70 19990903 177 178 /* PSGSIHDR in gsi.h */ 179 struct publics_header 180 { 181 uint32_t sym_hash_size; 182 uint32_t addr_map_size; 183 uint32_t num_thunks; 184 uint32_t thunks_size; 185 uint32_t thunk_table; 186 uint32_t thunk_table_offset; 187 uint32_t num_sects; 188 }; 189 190 /* GSIHashHdr in gsi.h */ 191 struct globals_hash_header 192 { 193 uint32_t signature; 194 uint32_t version; 195 uint32_t entries_size; 196 uint32_t buckets_size; 197 }; 198 199 /* HRFile in gsi.h */ 200 struct hash_record 201 { 202 uint32_t offset; 203 uint32_t reference; 204 }; 205 206 #define GLOBALS_HASH_SIGNATURE 0xffffffff 207 #define GLOBALS_HASH_VERSION_70 0xf12f091a 208 209 /* PUBSYM32 in cvinfo.h */ 210 struct pubsym 211 { 212 uint16_t record_length; 213 uint16_t record_type; 214 uint32_t flags; 215 uint32_t offset; 216 uint16_t section; 217 /* followed by null-terminated string */ 218 } ATTRIBUTE_PACKED; 219 220 /* see bitset CV_PUBSYMFLAGS in cvinfo.h */ 221 #define PUBSYM_FUNCTION 0x2 222 223 struct optional_dbg_header 224 { 225 uint16_t fpo_stream; 226 uint16_t exception_stream; 227 uint16_t fixup_stream; 228 uint16_t omap_to_src_stream; 229 uint16_t omap_from_src_stream; 230 uint16_t section_header_stream; 231 uint16_t token_map_stream; 232 uint16_t xdata_stream; 233 uint16_t pdata_stream; 234 uint16_t new_fpo_stream; 235 uint16_t orig_section_header_stream; 236 }; 237 238 #define CV_SIGNATURE_C13 4 239 240 #define DEBUG_S_SYMBOLS 0xf1 241 #define DEBUG_S_LINES 0xf2 242 #define DEBUG_S_STRINGTABLE 0xf3 243 #define DEBUG_S_FILECHKSMS 0xf4 244 245 #define STRING_TABLE_SIGNATURE 0xeffeeffe 246 #define STRING_TABLE_VERSION 1 247 248 /* VHdr in nmt.h */ 249 struct string_table_header 250 { 251 uint32_t signature; 252 uint32_t version; 253 }; 254 255 #define SECTION_CONTRIB_VERSION_60 0xf12eba2d 256 257 /* SC in dbicommon.h */ 258 struct section_contribution 259 { 260 uint16_t section; 261 uint16_t padding1; 262 uint32_t offset; 263 uint32_t size; 264 uint32_t characteristics; 265 uint16_t module_index; 266 uint16_t padding2; 267 uint32_t data_crc; 268 uint32_t reloc_crc; 269 }; 270 271 /* MODI_60_Persist in dbi.h */ 272 struct module_info 273 { 274 uint32_t unused1; 275 struct section_contribution sc; 276 uint16_t flags; 277 uint16_t module_sym_stream; 278 uint32_t sym_byte_size; 279 uint32_t c11_byte_size; 280 uint32_t c13_byte_size; 281 uint16_t source_file_count; 282 uint16_t padding; 283 uint32_t unused2; 284 uint32_t source_file_name_index; 285 uint32_t pdb_file_path_name_index; 286 }; 287 288 /* filedata in dumpsym7.cpp */ 289 struct file_checksum 290 { 291 uint32_t file_id; 292 uint8_t checksum_length; 293 uint8_t checksum_type; 294 } ATTRIBUTE_PACKED; 295 296 /* lfModifier in cvinfo.h */ 297 struct lf_modifier 298 { 299 uint16_t size; 300 uint16_t kind; 301 uint32_t base_type; 302 uint16_t modifier; 303 uint16_t padding; 304 } ATTRIBUTE_PACKED; 305 306 /* lfPointer in cvinfo.h */ 307 struct lf_pointer 308 { 309 uint16_t size; 310 uint16_t kind; 311 uint32_t base_type; 312 uint32_t attributes; 313 } ATTRIBUTE_PACKED; 314 315 /* lfArgList in cvinfo.h (used for both LF_ARGLIST and LF_SUBSTR_LIST) */ 316 struct lf_arglist 317 { 318 uint16_t size; 319 uint16_t kind; 320 uint32_t num_entries; 321 uint32_t args[]; 322 } ATTRIBUTE_PACKED; 323 324 /* lfProc in cvinfo.h */ 325 struct lf_procedure 326 { 327 uint16_t size; 328 uint16_t kind; 329 uint32_t return_type; 330 uint8_t calling_convention; 331 uint8_t attributes; 332 uint16_t num_parameters; 333 uint32_t arglist; 334 } ATTRIBUTE_PACKED; 335 336 /* lfMFunc in cvinfo.h */ 337 struct lf_mfunction 338 { 339 uint16_t size; 340 uint16_t kind; 341 uint32_t return_type; 342 uint32_t containing_class_type; 343 uint32_t this_type; 344 uint8_t calling_convention; 345 uint8_t attributes; 346 uint16_t num_parameters; 347 uint32_t arglist; 348 int32_t this_adjustment; 349 } ATTRIBUTE_PACKED; 350 351 /* lfArray in cvinfo.h */ 352 struct lf_array 353 { 354 uint16_t size; 355 uint16_t kind; 356 uint32_t element_type; 357 uint32_t index_type; 358 uint16_t length_in_bytes; 359 char name[]; 360 } ATTRIBUTE_PACKED; 361 362 /* lfBitfield in cvinfo.h */ 363 struct lf_bitfield 364 { 365 uint16_t size; 366 uint16_t kind; 367 uint32_t base_type; 368 uint8_t length; 369 uint8_t position; 370 } ATTRIBUTE_PACKED; 371 372 /* lfMember in cvinfo.h */ 373 struct lf_member 374 { 375 uint16_t kind; 376 uint16_t attributes; 377 uint32_t type; 378 uint16_t offset; 379 char name[]; 380 } ATTRIBUTE_PACKED; 381 382 /* from bitfield structure CV_prop_t in cvinfo.h */ 383 #define CV_PROP_FORWARD_REF 0x80 384 #define CV_PROP_SCOPED 0x100 385 #define CV_PROP_HAS_UNIQUE_NAME 0x200 386 387 /* lfClass in cvinfo.h */ 388 struct lf_class 389 { 390 uint16_t size; 391 uint16_t kind; 392 uint16_t num_members; 393 uint16_t properties; 394 uint32_t field_list; 395 uint32_t derived_from; 396 uint32_t vshape; 397 uint16_t length; 398 char name[]; 399 } ATTRIBUTE_PACKED; 400 401 /* lfUnion in cvinfo.h */ 402 struct lf_union 403 { 404 uint16_t size; 405 uint16_t kind; 406 uint16_t num_members; 407 uint16_t properties; 408 uint32_t field_list; 409 uint16_t length; 410 char name[]; 411 } ATTRIBUTE_PACKED; 412 413 /* lfEnumerate in cvinfo.h */ 414 struct lf_enumerate 415 { 416 uint16_t kind; 417 uint16_t attributes; 418 uint16_t value; 419 /* then actual value if value >= 0x8000 */ 420 char name[]; 421 } ATTRIBUTE_PACKED; 422 423 /* lfEnum in cvinfo.h */ 424 struct lf_enum 425 { 426 uint16_t size; 427 uint16_t kind; 428 uint16_t num_elements; 429 uint16_t properties; 430 uint32_t underlying_type; 431 uint32_t field_list; 432 char name[]; 433 } ATTRIBUTE_PACKED; 434 435 /* lfIndex in cvinfo.h */ 436 struct lf_index 437 { 438 uint16_t kind; 439 uint16_t padding; 440 uint32_t index; 441 } ATTRIBUTE_PACKED; 442 443 /* lfOneMethod in cvinfo.h */ 444 struct lf_onemethod 445 { 446 uint16_t kind; 447 uint16_t method_attribute; 448 uint32_t method_type; 449 char name[]; 450 } ATTRIBUTE_PACKED; 451 452 /* mlMethod in cvinfo.h */ 453 struct lf_methodlist_entry 454 { 455 uint16_t method_attribute; 456 uint16_t padding; 457 uint32_t method_type; 458 } ATTRIBUTE_PACKED; 459 460 /* lfMethodList in cvinfo.h */ 461 struct lf_methodlist 462 { 463 uint16_t size; 464 uint16_t kind; 465 struct lf_methodlist_entry entries[]; 466 } ATTRIBUTE_PACKED; 467 468 /* lfMethod in cvinfo.h */ 469 struct lf_method 470 { 471 uint16_t kind; 472 uint16_t count; 473 uint32_t method_list; 474 char name[]; 475 } ATTRIBUTE_PACKED; 476 477 /* lfBClass in cvinfo.h */ 478 struct lf_bclass 479 { 480 uint16_t kind; 481 uint16_t attributes; 482 uint32_t base_class_type; 483 uint16_t offset; 484 } ATTRIBUTE_PACKED; 485 486 /* lfVFuncTab in cvinfo.h */ 487 struct lf_vfunctab 488 { 489 uint16_t kind; 490 uint16_t padding; 491 uint32_t type; 492 } ATTRIBUTE_PACKED; 493 494 /* lfVBClass in cvinfo.h */ 495 struct lf_vbclass 496 { 497 uint16_t kind; 498 uint16_t attributes; 499 uint32_t base_class_type; 500 uint32_t virtual_base_pointer_type; 501 uint16_t virtual_base_pointer_offset; 502 uint16_t virtual_base_vbtable_offset; 503 } ATTRIBUTE_PACKED; 504 505 /* lfSTMember in cvinfo.h */ 506 struct lf_static_member 507 { 508 uint16_t kind; 509 uint16_t attributes; 510 uint32_t type; 511 char name[]; 512 } ATTRIBUTE_PACKED; 513 514 /* lfNestType in cvinfo.h */ 515 struct lf_nest_type 516 { 517 uint16_t kind; 518 uint16_t padding; 519 uint32_t type; 520 char name[]; 521 } ATTRIBUTE_PACKED; 522 523 /* lfStringId in cvinfo.h */ 524 struct lf_string_id 525 { 526 uint16_t size; 527 uint16_t kind; 528 uint32_t substring; 529 char string[]; 530 } ATTRIBUTE_PACKED; 531 532 /* lfBuildInfo in cvinfo.h */ 533 struct lf_build_info 534 { 535 uint16_t size; 536 uint16_t kind; 537 uint16_t count; 538 uint32_t strings[]; 539 } ATTRIBUTE_PACKED; 540 541 /* lfFuncId in cvinfo.h */ 542 struct lf_func_id 543 { 544 uint16_t size; 545 uint16_t kind; 546 uint32_t parent_scope; 547 uint32_t function_type; 548 char name[]; 549 } ATTRIBUTE_PACKED; 550 551 /* lfMFuncId in cvinfo.h */ 552 struct lf_mfunc_id 553 { 554 uint16_t size; 555 uint16_t kind; 556 uint32_t parent_type; 557 uint32_t function_type; 558 char name[]; 559 } ATTRIBUTE_PACKED; 560 561 /* lfUdtSrcLine in cvinfo.h */ 562 struct lf_udt_src_line 563 { 564 uint16_t size; 565 uint16_t kind; 566 uint32_t type; 567 uint32_t source_file_type; 568 uint32_t line_no; 569 } ATTRIBUTE_PACKED; 570 571 /* lfUdtModSrcLine in cvinfo.h */ 572 struct lf_udt_mod_src_line 573 { 574 uint16_t size; 575 uint16_t kind; 576 uint32_t type; 577 uint32_t source_file_string; 578 uint32_t line_no; 579 uint16_t module_no; 580 } ATTRIBUTE_PACKED; 581 582 /* lfVftable in cvinfo.h */ 583 struct lf_vftable 584 { 585 uint16_t size; 586 uint16_t kind; 587 uint32_t type; 588 uint32_t base_vftable; 589 uint32_t offset; 590 uint32_t names_len; 591 char names[]; 592 } ATTRIBUTE_PACKED; 593 594 /* DATASYM32 in cvinfo.h */ 595 struct datasym 596 { 597 uint16_t size; 598 uint16_t kind; 599 uint32_t type; 600 uint32_t offset; 601 uint16_t section; 602 char name[]; 603 } ATTRIBUTE_PACKED; 604 605 /* PROCSYM32 in cvinfo.h */ 606 struct procsym 607 { 608 uint16_t size; 609 uint16_t kind; 610 uint32_t parent; 611 uint32_t end; 612 uint32_t next; 613 uint32_t proc_len; 614 uint32_t debug_start; 615 uint32_t debug_end; 616 uint32_t type; 617 uint32_t offset; 618 uint16_t section; 619 uint8_t flags; 620 char name[]; 621 } ATTRIBUTE_PACKED; 622 623 /* REFSYM2 in cvinfo.h */ 624 struct refsym 625 { 626 uint16_t size; 627 uint16_t kind; 628 uint32_t sum_name; 629 uint32_t symbol_offset; 630 uint16_t mod; 631 char name[]; 632 } ATTRIBUTE_PACKED; 633 634 /* UDTSYM in cvinfo.h */ 635 struct udtsym 636 { 637 uint16_t size; 638 uint16_t kind; 639 uint32_t type; 640 char name[]; 641 } ATTRIBUTE_PACKED; 642 643 /* CONSTSYM in cvinfo.h */ 644 struct constsym 645 { 646 uint16_t size; 647 uint16_t kind; 648 uint32_t type; 649 uint16_t value; 650 /* then actual value if value >= 0x8000 */ 651 char name[]; 652 } ATTRIBUTE_PACKED; 653 654 /* BUILDINFOSYM in cvinfo.h */ 655 struct buildinfosym 656 { 657 uint16_t size; 658 uint16_t kind; 659 uint32_t type; 660 } ATTRIBUTE_PACKED; 661 662 /* BLOCKSYM32 in cvinfo.h */ 663 struct blocksym 664 { 665 uint16_t size; 666 uint16_t kind; 667 uint32_t parent; 668 uint32_t end; 669 uint32_t len; 670 uint32_t offset; 671 uint16_t section; 672 char name[]; 673 } ATTRIBUTE_PACKED; 674 675 /* BPRELSYM32 in cvinfo.h */ 676 struct bprelsym 677 { 678 uint16_t size; 679 uint16_t kind; 680 uint32_t bp_offset; 681 uint32_t type; 682 char name[]; 683 } ATTRIBUTE_PACKED; 684 685 /* REGSYM in cvinfo.h */ 686 struct regsym 687 { 688 uint16_t size; 689 uint16_t kind; 690 uint32_t type; 691 uint16_t reg; 692 char name[]; 693 } ATTRIBUTE_PACKED; 694 695 /* REGREL32 in cvinfo.h */ 696 struct regrel 697 { 698 uint16_t size; 699 uint16_t kind; 700 uint32_t offset; 701 uint32_t type; 702 uint16_t reg; 703 char name[]; 704 } ATTRIBUTE_PACKED; 705 706 /* LOCALSYM in cvinfo.h */ 707 struct localsym 708 { 709 uint16_t size; 710 uint16_t kind; 711 uint32_t type; 712 uint16_t flags; 713 char name[]; 714 } ATTRIBUTE_PACKED; 715 716 /* CV_LVAR_ADDR_RANGE in cvinfo.h */ 717 struct lvar_addr_range 718 { 719 uint32_t offset; 720 uint16_t section; 721 uint16_t length; 722 } ATTRIBUTE_PACKED; 723 724 /* CV_LVAR_ADDR_GAP in cvinfo.h */ 725 struct lvar_addr_gap { 726 uint16_t offset; 727 uint16_t length; 728 } ATTRIBUTE_PACKED; 729 730 /* DEFRANGESYMREGISTERREL in cvinfo.h */ 731 struct defrange_register_rel 732 { 733 uint16_t size; 734 uint16_t kind; 735 uint16_t reg; 736 uint16_t offset_parent; 737 uint32_t offset_register; 738 struct lvar_addr_range range; 739 struct lvar_addr_gap gaps[]; 740 } ATTRIBUTE_PACKED; 741 742 /* DEFRANGESYMFRAMEPOINTERREL in cvinfo.h */ 743 struct defrange_framepointer_rel 744 { 745 uint16_t size; 746 uint16_t kind; 747 uint32_t offset; 748 struct lvar_addr_range range; 749 struct lvar_addr_gap gaps[]; 750 } ATTRIBUTE_PACKED; 751 752 /* DEFRANGESYMSUBFIELDREGISTER in cvinfo.h */ 753 struct defrange_subfield_register 754 { 755 uint16_t size; 756 uint16_t kind; 757 uint16_t reg; 758 uint16_t attributes; 759 uint32_t offset_parent; 760 struct lvar_addr_range range; 761 struct lvar_addr_gap gaps[]; 762 } ATTRIBUTE_PACKED; 763 764 /* DEFRANGESYMREGISTER in cvinfo.h */ 765 struct defrange_register 766 { 767 uint16_t size; 768 uint16_t kind; 769 uint16_t reg; 770 uint16_t attributes; 771 struct lvar_addr_range range; 772 struct lvar_addr_gap gaps[]; 773 } ATTRIBUTE_PACKED; 774 775 /* INLINESITESYM in cvinfo.h */ 776 struct inline_site 777 { 778 uint16_t size; 779 uint16_t kind; 780 uint32_t parent; 781 uint32_t end; 782 uint32_t inlinee; 783 uint8_t binary_annotations[]; 784 } ATTRIBUTE_PACKED; 785 786 /* THUNKSYM32 in cvinfo.h */ 787 struct thunk 788 { 789 uint16_t size; 790 uint16_t kind; 791 uint32_t parent; 792 uint32_t end; 793 uint32_t next; 794 uint32_t offset; 795 uint16_t section; 796 uint16_t length; 797 uint8_t thunk_type; 798 char name[]; 799 } ATTRIBUTE_PACKED; 800 801 /* HEAPALLOCSITE in cvinfo.h */ 802 struct heap_alloc_site 803 { 804 uint16_t size; 805 uint16_t kind; 806 uint32_t offset; 807 uint16_t section; 808 uint16_t length; 809 uint32_t type; 810 } ATTRIBUTE_PACKED; 811 812 /* OBJNAMESYM in cvinfo.h */ 813 struct objname 814 { 815 uint16_t size; 816 uint16_t kind; 817 uint32_t signature; 818 char name[]; 819 } ATTRIBUTE_PACKED; 820 821 #define CV_CFL_80386 0x03 822 #define CV_CFL_X64 0xD0 823 #define CV_CFL_ARM64 0xF6 824 825 #define CV_CFL_LINK 0x07 826 827 /* COMPILESYM3 in cvinfo.h */ 828 struct compile3 829 { 830 uint16_t size; 831 uint16_t kind; 832 uint32_t flags; 833 uint16_t machine; 834 uint16_t frontend_major; 835 uint16_t frontend_minor; 836 uint16_t frontend_build; 837 uint16_t frontend_qfe; 838 uint16_t backend_major; 839 uint16_t backend_minor; 840 uint16_t backend_build; 841 uint16_t backend_qfe; 842 char compiler[]; 843 } ATTRIBUTE_PACKED; 844 845 /* ENVBLOCKSYM in cvinfo.h */ 846 struct envblock 847 { 848 uint16_t size; 849 uint16_t kind; 850 uint8_t flags; 851 char strings[]; 852 } ATTRIBUTE_PACKED; 853 854 extern bool create_pdb_file (bfd *, const char *, const unsigned char *); 855 856 #endif 857