xref: /netbsd-src/external/gpl3/binutils/dist/ld/pdb.h (revision cb63e24e8d6aae7ddac1859a9015f48b1d8bd90e)
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