Home | History | Annotate | Line # | Download | only in ld
      1 /* pdb.h - header file for generating PDB CodeView debugging files.
      2    Copyright (C) 2022-2026 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 #define DEBUG_S_INLINEELINES		0xf6
    245 
    246 #define STRING_TABLE_SIGNATURE		0xeffeeffe
    247 #define STRING_TABLE_VERSION		1
    248 
    249 #define CV_INLINEE_SOURCE_LINE_SIGNATURE	0
    250 
    251 /* VHdr in nmt.h */
    252 struct string_table_header
    253 {
    254   uint32_t signature;
    255   uint32_t version;
    256 };
    257 
    258 #define SECTION_CONTRIB_VERSION_60	0xf12eba2d
    259 
    260 /* SC in dbicommon.h */
    261 struct section_contribution
    262 {
    263   uint16_t section;
    264   uint16_t padding1;
    265   uint32_t offset;
    266   uint32_t size;
    267   uint32_t characteristics;
    268   uint16_t module_index;
    269   uint16_t padding2;
    270   uint32_t data_crc;
    271   uint32_t reloc_crc;
    272 };
    273 
    274 /* MODI_60_Persist in dbi.h */
    275 struct module_info
    276 {
    277   uint32_t unused1;
    278   struct section_contribution sc;
    279   uint16_t flags;
    280   uint16_t module_sym_stream;
    281   uint32_t sym_byte_size;
    282   uint32_t c11_byte_size;
    283   uint32_t c13_byte_size;
    284   uint16_t source_file_count;
    285   uint16_t padding;
    286   uint32_t unused2;
    287   uint32_t source_file_name_index;
    288   uint32_t pdb_file_path_name_index;
    289 };
    290 
    291 /* filedata in dumpsym7.cpp */
    292 struct file_checksum
    293 {
    294   uint32_t file_id;
    295   uint8_t checksum_length;
    296   uint8_t checksum_type;
    297 } ATTRIBUTE_PACKED;
    298 
    299 /* lfModifier in cvinfo.h */
    300 struct lf_modifier
    301 {
    302   uint16_t size;
    303   uint16_t kind;
    304   uint32_t base_type;
    305   uint16_t modifier;
    306   uint16_t padding;
    307 } ATTRIBUTE_PACKED;
    308 
    309 /* enum CV_ptrmode_e in cvinfo.h, shifted by 5 for the lfPointerAttr bitfield */
    310 #define CV_PTR_MODE_MASK	0xe0
    311 #define CV_PTR_MODE_PMEM	0x40
    312 #define CV_PTR_MODE_PMFUNC	0x60
    313 
    314 /* lfPointer in cvinfo.h */
    315 struct lf_pointer
    316 {
    317   uint16_t size;
    318   uint16_t kind;
    319   uint32_t base_type;
    320   uint32_t attributes;
    321   /* following only if CV_PTR_MODE_PMEM or CV_PTR_MODE_PMFUNC in attributes */
    322   uint32_t containing_class;
    323   uint16_t ptr_to_mem_type;
    324   uint16_t padding;
    325 } ATTRIBUTE_PACKED;
    326 
    327 /* lfArgList in cvinfo.h (used for both LF_ARGLIST and LF_SUBSTR_LIST) */
    328 struct lf_arglist
    329 {
    330   uint16_t size;
    331   uint16_t kind;
    332   uint32_t num_entries;
    333   uint32_t args[];
    334 } ATTRIBUTE_PACKED;
    335 
    336 /* lfProc in cvinfo.h */
    337 struct lf_procedure
    338 {
    339   uint16_t size;
    340   uint16_t kind;
    341   uint32_t return_type;
    342   uint8_t calling_convention;
    343   uint8_t attributes;
    344   uint16_t num_parameters;
    345   uint32_t arglist;
    346 } ATTRIBUTE_PACKED;
    347 
    348 /* lfMFunc in cvinfo.h */
    349 struct lf_mfunction
    350 {
    351   uint16_t size;
    352   uint16_t kind;
    353   uint32_t return_type;
    354   uint32_t containing_class_type;
    355   uint32_t this_type;
    356   uint8_t calling_convention;
    357   uint8_t attributes;
    358   uint16_t num_parameters;
    359   uint32_t arglist;
    360   int32_t this_adjustment;
    361 } ATTRIBUTE_PACKED;
    362 
    363 /* lfArray in cvinfo.h */
    364 struct lf_array
    365 {
    366   uint16_t size;
    367   uint16_t kind;
    368   uint32_t element_type;
    369   uint32_t index_type;
    370   uint16_t length_in_bytes;
    371   char name[];
    372 } ATTRIBUTE_PACKED;
    373 
    374 /* lfBitfield in cvinfo.h */
    375 struct lf_bitfield
    376 {
    377   uint16_t size;
    378   uint16_t kind;
    379   uint32_t base_type;
    380   uint8_t length;
    381   uint8_t position;
    382 } ATTRIBUTE_PACKED;
    383 
    384 /* lfMember in cvinfo.h */
    385 struct lf_member
    386 {
    387   uint16_t kind;
    388   uint16_t attributes;
    389   uint32_t type;
    390   uint16_t offset;
    391   char name[];
    392 } ATTRIBUTE_PACKED;
    393 
    394 /* from bitfield structure CV_prop_t in cvinfo.h */
    395 #define CV_PROP_FORWARD_REF	0x80
    396 #define CV_PROP_SCOPED		0x100
    397 #define CV_PROP_HAS_UNIQUE_NAME	0x200
    398 
    399 /* lfClass in cvinfo.h */
    400 struct lf_class
    401 {
    402   uint16_t size;
    403   uint16_t kind;
    404   uint16_t num_members;
    405   uint16_t properties;
    406   uint32_t field_list;
    407   uint32_t derived_from;
    408   uint32_t vshape;
    409   uint16_t length;
    410   char name[];
    411 } ATTRIBUTE_PACKED;
    412 
    413 /* lfUnion in cvinfo.h */
    414 struct lf_union
    415 {
    416   uint16_t size;
    417   uint16_t kind;
    418   uint16_t num_members;
    419   uint16_t properties;
    420   uint32_t field_list;
    421   uint16_t length;
    422   char name[];
    423 } ATTRIBUTE_PACKED;
    424 
    425 /* lfEnumerate in cvinfo.h */
    426 struct lf_enumerate
    427 {
    428   uint16_t kind;
    429   uint16_t attributes;
    430   uint16_t value;
    431   /* then actual value if value >= 0x8000 */
    432   char name[];
    433 } ATTRIBUTE_PACKED;
    434 
    435 /* lfEnum in cvinfo.h */
    436 struct lf_enum
    437 {
    438   uint16_t size;
    439   uint16_t kind;
    440   uint16_t num_elements;
    441   uint16_t properties;
    442   uint32_t underlying_type;
    443   uint32_t field_list;
    444   char name[];
    445 } ATTRIBUTE_PACKED;
    446 
    447 /* lfIndex in cvinfo.h */
    448 struct lf_index
    449 {
    450   uint16_t kind;
    451   uint16_t padding;
    452   uint32_t index;
    453 } ATTRIBUTE_PACKED;
    454 
    455 /* lfOneMethod in cvinfo.h */
    456 struct lf_onemethod
    457 {
    458   uint16_t kind;
    459   uint16_t method_attribute;
    460   uint32_t method_type;
    461   char name[];
    462 } ATTRIBUTE_PACKED;
    463 
    464 /* mlMethod in cvinfo.h */
    465 struct lf_methodlist_entry
    466 {
    467   uint16_t method_attribute;
    468   uint16_t padding;
    469   uint32_t method_type;
    470 } ATTRIBUTE_PACKED;
    471 
    472 /* lfMethodList in cvinfo.h */
    473 struct lf_methodlist
    474 {
    475   uint16_t size;
    476   uint16_t kind;
    477   struct lf_methodlist_entry entries[];
    478 } ATTRIBUTE_PACKED;
    479 
    480 /* lfMethod in cvinfo.h */
    481 struct lf_method
    482 {
    483   uint16_t kind;
    484   uint16_t count;
    485   uint32_t method_list;
    486   char name[];
    487 } ATTRIBUTE_PACKED;
    488 
    489 /* lfBClass in cvinfo.h */
    490 struct lf_bclass
    491 {
    492   uint16_t kind;
    493   uint16_t attributes;
    494   uint32_t base_class_type;
    495   uint16_t offset;
    496 } ATTRIBUTE_PACKED;
    497 
    498 /* lfVFuncTab in cvinfo.h */
    499 struct lf_vfunctab
    500 {
    501   uint16_t kind;
    502   uint16_t padding;
    503   uint32_t type;
    504 } ATTRIBUTE_PACKED;
    505 
    506 /* lfVBClass in cvinfo.h */
    507 struct lf_vbclass
    508 {
    509   uint16_t kind;
    510   uint16_t attributes;
    511   uint32_t base_class_type;
    512   uint32_t virtual_base_pointer_type;
    513   uint16_t virtual_base_pointer_offset;
    514   uint16_t virtual_base_vbtable_offset;
    515 } ATTRIBUTE_PACKED;
    516 
    517 /* lfSTMember in cvinfo.h */
    518 struct lf_static_member
    519 {
    520   uint16_t kind;
    521   uint16_t attributes;
    522   uint32_t type;
    523   char name[];
    524 } ATTRIBUTE_PACKED;
    525 
    526 /* lfNestType in cvinfo.h */
    527 struct lf_nest_type
    528 {
    529   uint16_t kind;
    530   uint16_t padding;
    531   uint32_t type;
    532   char name[];
    533 } ATTRIBUTE_PACKED;
    534 
    535 /* lfStringId in cvinfo.h */
    536 struct lf_string_id
    537 {
    538   uint16_t size;
    539   uint16_t kind;
    540   uint32_t substring;
    541   char string[];
    542 } ATTRIBUTE_PACKED;
    543 
    544 /* lfBuildInfo in cvinfo.h */
    545 struct lf_build_info
    546 {
    547   uint16_t size;
    548   uint16_t kind;
    549   uint16_t count;
    550   uint32_t strings[];
    551 } ATTRIBUTE_PACKED;
    552 
    553 /* lfFuncId in cvinfo.h */
    554 struct lf_func_id
    555 {
    556   uint16_t size;
    557   uint16_t kind;
    558   uint32_t parent_scope;
    559   uint32_t function_type;
    560   char name[];
    561 } ATTRIBUTE_PACKED;
    562 
    563 /* lfMFuncId in cvinfo.h */
    564 struct lf_mfunc_id
    565 {
    566   uint16_t size;
    567   uint16_t kind;
    568   uint32_t parent_type;
    569   uint32_t function_type;
    570   char name[];
    571 } ATTRIBUTE_PACKED;
    572 
    573 /* lfUdtSrcLine in cvinfo.h */
    574 struct lf_udt_src_line
    575 {
    576   uint16_t size;
    577   uint16_t kind;
    578   uint32_t type;
    579   uint32_t source_file_type;
    580   uint32_t line_no;
    581 } ATTRIBUTE_PACKED;
    582 
    583 /* lfUdtModSrcLine in cvinfo.h */
    584 struct lf_udt_mod_src_line
    585 {
    586   uint16_t size;
    587   uint16_t kind;
    588   uint32_t type;
    589   uint32_t source_file_string;
    590   uint32_t line_no;
    591   uint16_t module_no;
    592 } ATTRIBUTE_PACKED;
    593 
    594 /* lfVftable in cvinfo.h */
    595 struct lf_vftable
    596 {
    597   uint16_t size;
    598   uint16_t kind;
    599   uint32_t type;
    600   uint32_t base_vftable;
    601   uint32_t offset;
    602   uint32_t names_len;
    603   char names[];
    604 } ATTRIBUTE_PACKED;
    605 
    606 /* DATASYM32 in cvinfo.h */
    607 struct datasym
    608 {
    609   uint16_t size;
    610   uint16_t kind;
    611   uint32_t type;
    612   uint32_t offset;
    613   uint16_t section;
    614   char name[];
    615 } ATTRIBUTE_PACKED;
    616 
    617 /* PROCSYM32 in cvinfo.h */
    618 struct procsym
    619 {
    620   uint16_t size;
    621   uint16_t kind;
    622   uint32_t parent;
    623   uint32_t end;
    624   uint32_t next;
    625   uint32_t proc_len;
    626   uint32_t debug_start;
    627   uint32_t debug_end;
    628   uint32_t type;
    629   uint32_t offset;
    630   uint16_t section;
    631   uint8_t flags;
    632   char name[];
    633 } ATTRIBUTE_PACKED;
    634 
    635 /* REFSYM2 in cvinfo.h */
    636 struct refsym
    637 {
    638   uint16_t size;
    639   uint16_t kind;
    640   uint32_t sum_name;
    641   uint32_t symbol_offset;
    642   uint16_t mod;
    643   char name[];
    644 } ATTRIBUTE_PACKED;
    645 
    646 /* UDTSYM in cvinfo.h */
    647 struct udtsym
    648 {
    649   uint16_t size;
    650   uint16_t kind;
    651   uint32_t type;
    652   char name[];
    653 } ATTRIBUTE_PACKED;
    654 
    655 /* CONSTSYM in cvinfo.h */
    656 struct constsym
    657 {
    658   uint16_t size;
    659   uint16_t kind;
    660   uint32_t type;
    661   uint16_t value;
    662   /* then actual value if value >= 0x8000 */
    663   char name[];
    664 } ATTRIBUTE_PACKED;
    665 
    666 /* BUILDINFOSYM in cvinfo.h */
    667 struct buildinfosym
    668 {
    669   uint16_t size;
    670   uint16_t kind;
    671   uint32_t type;
    672 } ATTRIBUTE_PACKED;
    673 
    674 /* BLOCKSYM32 in cvinfo.h */
    675 struct blocksym
    676 {
    677   uint16_t size;
    678   uint16_t kind;
    679   uint32_t parent;
    680   uint32_t end;
    681   uint32_t len;
    682   uint32_t offset;
    683   uint16_t section;
    684   char name[];
    685 } ATTRIBUTE_PACKED;
    686 
    687 /* BPRELSYM32 in cvinfo.h */
    688 struct bprelsym
    689 {
    690   uint16_t size;
    691   uint16_t kind;
    692   uint32_t bp_offset;
    693   uint32_t type;
    694   char name[];
    695 } ATTRIBUTE_PACKED;
    696 
    697 /* REGSYM in cvinfo.h */
    698 struct regsym
    699 {
    700   uint16_t size;
    701   uint16_t kind;
    702   uint32_t type;
    703   uint16_t reg;
    704   char name[];
    705 } ATTRIBUTE_PACKED;
    706 
    707 /* REGREL32 in cvinfo.h */
    708 struct regrel
    709 {
    710   uint16_t size;
    711   uint16_t kind;
    712   uint32_t offset;
    713   uint32_t type;
    714   uint16_t reg;
    715   char name[];
    716 } ATTRIBUTE_PACKED;
    717 
    718 /* LOCALSYM in cvinfo.h */
    719 struct localsym
    720 {
    721   uint16_t size;
    722   uint16_t kind;
    723   uint32_t type;
    724   uint16_t flags;
    725   char name[];
    726 } ATTRIBUTE_PACKED;
    727 
    728 /* CV_LVAR_ADDR_RANGE in cvinfo.h */
    729 struct lvar_addr_range
    730 {
    731   uint32_t offset;
    732   uint16_t section;
    733   uint16_t length;
    734 } ATTRIBUTE_PACKED;
    735 
    736 /* CV_LVAR_ADDR_GAP in cvinfo.h */
    737 struct lvar_addr_gap {
    738   uint16_t offset;
    739   uint16_t length;
    740 } ATTRIBUTE_PACKED;
    741 
    742 /* DEFRANGESYMREGISTERREL in cvinfo.h */
    743 struct defrange_register_rel
    744 {
    745   uint16_t size;
    746   uint16_t kind;
    747   uint16_t reg;
    748   uint16_t offset_parent;
    749   uint32_t offset_register;
    750   struct lvar_addr_range range;
    751   struct lvar_addr_gap gaps[];
    752 } ATTRIBUTE_PACKED;
    753 
    754 /* DEFRANGESYMFRAMEPOINTERREL in cvinfo.h */
    755 struct defrange_framepointer_rel
    756 {
    757   uint16_t size;
    758   uint16_t kind;
    759   uint32_t offset;
    760   struct lvar_addr_range range;
    761   struct lvar_addr_gap gaps[];
    762 } ATTRIBUTE_PACKED;
    763 
    764 /* DEFRANGESYMSUBFIELDREGISTER in cvinfo.h */
    765 struct defrange_subfield_register
    766 {
    767   uint16_t size;
    768   uint16_t kind;
    769   uint16_t reg;
    770   uint16_t attributes;
    771   uint32_t offset_parent;
    772   struct lvar_addr_range range;
    773   struct lvar_addr_gap gaps[];
    774 } ATTRIBUTE_PACKED;
    775 
    776 /* DEFRANGESYMREGISTER in cvinfo.h */
    777 struct defrange_register
    778 {
    779   uint16_t size;
    780   uint16_t kind;
    781   uint16_t reg;
    782   uint16_t attributes;
    783   struct lvar_addr_range range;
    784   struct lvar_addr_gap gaps[];
    785 } ATTRIBUTE_PACKED;
    786 
    787 /* INLINESITESYM in cvinfo.h */
    788 struct inline_site
    789 {
    790   uint16_t size;
    791   uint16_t kind;
    792   uint32_t parent;
    793   uint32_t end;
    794   uint32_t inlinee;
    795   uint8_t binary_annotations[];
    796 } ATTRIBUTE_PACKED;
    797 
    798 /* THUNKSYM32 in cvinfo.h */
    799 struct thunk
    800 {
    801   uint16_t size;
    802   uint16_t kind;
    803   uint32_t parent;
    804   uint32_t end;
    805   uint32_t next;
    806   uint32_t offset;
    807   uint16_t section;
    808   uint16_t length;
    809   uint8_t thunk_type;
    810   char name[];
    811 } ATTRIBUTE_PACKED;
    812 
    813 /* HEAPALLOCSITE in cvinfo.h */
    814 struct heap_alloc_site
    815 {
    816   uint16_t size;
    817   uint16_t kind;
    818   uint32_t offset;
    819   uint16_t section;
    820   uint16_t length;
    821   uint32_t type;
    822 } ATTRIBUTE_PACKED;
    823 
    824 /* OBJNAMESYM in cvinfo.h */
    825 struct objname
    826 {
    827   uint16_t size;
    828   uint16_t kind;
    829   uint32_t signature;
    830   char name[];
    831 } ATTRIBUTE_PACKED;
    832 
    833 #define CV_CFL_80386			0x03
    834 #define CV_CFL_X64			0xD0
    835 #define CV_CFL_ARM64			0xF6
    836 
    837 #define CV_CFL_LINK			0x07
    838 
    839 /* COMPILESYM3 in cvinfo.h */
    840 struct compile3
    841 {
    842   uint16_t size;
    843   uint16_t kind;
    844   uint32_t flags;
    845   uint16_t machine;
    846   uint16_t frontend_major;
    847   uint16_t frontend_minor;
    848   uint16_t frontend_build;
    849   uint16_t frontend_qfe;
    850   uint16_t backend_major;
    851   uint16_t backend_minor;
    852   uint16_t backend_build;
    853   uint16_t backend_qfe;
    854   char compiler[];
    855 } ATTRIBUTE_PACKED;
    856 
    857 /* ENVBLOCKSYM in cvinfo.h */
    858 struct envblock
    859 {
    860   uint16_t size;
    861   uint16_t kind;
    862   uint8_t flags;
    863   char strings[];
    864 } ATTRIBUTE_PACKED;
    865 
    866 extern bool create_pdb_file (bfd *, const char *, const unsigned char *);
    867 
    868 #endif
    869