2 * MS debug information definitions.
4 * Copyright (C) 1996 Eric Youngdale
5 * Copyright (C) 1999-2000 Ulrich Weigand
6 * Copyright (C) 2004 Eric Pouech
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 /* MS has stored all its debug information in a set of structures
24 * which has been rather consistent across the years (ie you can grasp
25 * some continuity, and not so many drastic changes).
27 * A bit of history on the various formats
28 * MSVC 1.0 PDB v1 (new format for debug info)
29 * MSVC 2.0 Inclusion in link of debug info (PDB v2)
30 * MSVC 5.0 Types are 24 bits (instead of 16 for <= 4.x)
31 * MSVC x.0 PDB (change in internal streams layout)
33 * .DBG Contains COFF, FPO and Codeview info
34 * .PDB New format for debug info (information is
35 * derived from Codeview information)
36 * VCx0.PDB x major MSVC number, stores types, while
37 * <project>.PDB stores symbols.
39 * Debug information can either be found in the debug section of a PE
40 * module (in something close to a .DBG file), or the debug section
41 * can actually refer to an external file, which can be in turn,
42 * either a .DBG or .PDB file.
44 * Regarding PDB files:
46 * They are implemented as a set of internal streams (as a small file
47 * system). The file is split into blocks, an internal stream is made of a set
48 * of blocks, that can be non continuous. The table of contents gives the set of
49 * blocks for a given stream.
50 * Some internal streams are accessed through numbers. For example,
51 * #1 is the ROOT (basic information on the file)
52 * #2 is the Symbol information (global symbols, local variables...)
53 * #3 is the Type internal stream (each the symbols can have type
54 * information associated with it).
56 * Over the years, three formats existed for the PDB:
57 * - ?? was rather linked to 16 bit code (our support shall be rather bad)
58 * - JG: it's the signature embedded in the file header. This format has been
59 * used in MSVC 2.0 => 5.0.
60 * - DS: it's the signature embedded in the file header. It's the current format
63 * Types internal stream (aka TPI)
64 * ---------------------
65 * Types (from the Type internal stream) have existed in three flavors (note
66 * that those flavors came as historical evolution, but there isn't a one to one
67 * link between types evolution and PDB formats' evolutions:
68 * - the first flavor (suffixed by V1 in mscvpdb.h), where the types
69 * and subtypes are 16 bit entities; and where strings are in Pascal
70 * format (first char is their length and are not 0 terminated)
71 * - the second flavor (suffixed by V2) differs from first flavor with
72 * types and subtypes as 32 bit entities. This forced some
73 * reordering of fields in some types
74 * - the third flavor (suffixed by V3) differs from second flavor with
75 * strings stored as C strings (ie are 0 terminated, instead of
77 * The different flavors can coexist in the same file (is this really
80 * For the evolution of types, the need of the second flavor was the
81 * number of types to be defined (limited to 0xFFFF, including the C
82 * basic types); the need of the third flavor is the increase of
83 * symbol size (to be greater than 256), which was likely needed for
84 * complex C++ types (nested + templates).
86 * It's somehow difficult to represent the layout of those types on
88 * - some integral values are stored as numeric leaf, which size is
89 * variable depending on its value
91 * Symbols internal stream
92 * -----------------------
93 * Here also we find three flavors (that we've suffixed with _V1, _V2
94 * and _V3) even if their evolution is closer to the evolution of
95 * types, they are not completely linked together.
100 /* ======================================== *
102 * ======================================== */
106 unsigned char namelen
;
110 typedef unsigned short cv_typ16_t
;
111 typedef unsigned int cv_typ_t
;
112 typedef cv_typ_t cv_itemid_t
;
114 typedef struct cv_property_t
116 unsigned short is_packed
: 1;
117 unsigned short has_ctor
: 1;
118 unsigned short has_overloaded_operator
: 1;
119 unsigned short is_nested
: 1;
120 unsigned short has_nested
: 1;
121 unsigned short has_overloaded_assign
: 1;
122 unsigned short has_operator_cast
: 1;
123 unsigned short is_forward_defn
: 1;
124 unsigned short is_scoped
: 1;
125 unsigned short has_decorated_name
: 1; /* follows name field */
126 unsigned short is_sealed
: 1; /* not usage as base class */
127 unsigned short hfa
: 2;
128 unsigned short is_intrinsic
: 1;
129 unsigned short mocom
: 2;
133 /* ======================================== *
135 * ======================================== */
141 unsigned short int len
;
142 unsigned short int id
;
145 /* types found in TPI stream (#2) */
148 unsigned short int len
;
149 unsigned short int id
;
156 unsigned short int len
;
157 unsigned short int id
;
164 unsigned short int len
;
165 unsigned short int id
;
168 struct p_string p_name
;
173 unsigned short int len
;
174 unsigned short int id
;
176 unsigned int attribute
;
177 struct p_string p_name
;
182 unsigned short int len
;
183 unsigned short int id
;
186 unsigned short int arrlen
; /* numeric leaf */
188 struct p_string p_name
;
194 unsigned short int len
;
195 unsigned short int id
;
198 unsigned short int arrlen
; /* numeric leaf */
200 struct p_string p_name
;
206 unsigned short int len
;
207 unsigned short int id
;
210 unsigned short int arrlen
; /* numeric leaf */
218 unsigned short int len
;
219 unsigned short int id
;
221 cv_typ16_t fieldlist
;
222 cv_property_t property
;
225 unsigned short int structlen
; /* numeric leaf */
227 struct p_string p_name
;
233 unsigned short int len
;
234 unsigned short int id
;
236 cv_property_t property
;
240 unsigned short int structlen
; /* numeric leaf */
242 struct p_string p_name
;
248 unsigned short int len
;
249 unsigned short int id
;
251 cv_property_t property
;
255 unsigned short int structlen
; /* numeric leaf */
263 unsigned short int len
;
264 unsigned short int id
;
266 cv_typ16_t fieldlist
;
267 cv_property_t property
;
268 unsigned short int un_len
; /* numeric leaf */
270 struct p_string p_name
;
276 unsigned short int len
;
277 unsigned short int id
;
279 cv_property_t property
;
281 unsigned short int un_len
; /* numeric leaf */
283 struct p_string p_name
;
289 unsigned short int len
;
290 unsigned short int id
;
292 cv_property_t property
;
294 unsigned short int un_len
; /* numeric leaf */
302 unsigned short int len
;
303 unsigned short int id
;
306 cv_typ16_t fieldlist
;
307 cv_property_t property
;
308 struct p_string p_name
;
313 unsigned short int len
;
314 unsigned short int id
;
316 cv_property_t property
;
319 struct p_string p_name
;
324 unsigned short int len
;
325 unsigned short int id
;
327 cv_property_t property
;
335 unsigned short int len
;
336 unsigned short int id
;
338 unsigned char callconv
;
339 unsigned char funcattr
;
340 unsigned short int params
;
346 unsigned short int len
;
347 unsigned short int id
;
349 unsigned char callconv
;
350 unsigned char funcattr
;
351 unsigned short int params
;
357 unsigned short int len
;
358 unsigned short int id
;
360 cv_typ16_t class_type
;
361 cv_typ16_t this_type
;
362 unsigned char callconv
;
363 unsigned char funcattr
;
364 unsigned short int params
;
366 unsigned int this_adjust
;
371 unsigned short int len
;
372 unsigned short int id
;
376 unsigned char callconv
;
377 unsigned char funcattr
;
378 unsigned short params
;
380 unsigned int this_adjust
;
383 /* types found in IPI stream (#4) */
386 unsigned short int len
;
387 unsigned short int id
; /* LF_FUNC_ID */
395 unsigned short int len
;
396 unsigned short int id
; /* LF_MFUNC_ID */
404 unsigned short int len
;
405 unsigned short int id
; /* LF_STRING_ID */
412 unsigned short int len
;
413 unsigned short int id
; /* LF_UDT_SRC_LINE */
421 unsigned short int len
;
422 unsigned short int id
; /* LF_UDT_MOD_SRC_LINE */
427 } udt_mod_src_line_v3
;
431 unsigned short int len
;
432 unsigned short int id
; /* LF_BUILDINFO */
433 unsigned short count
;
439 union codeview_reftype
443 unsigned short int len
;
444 unsigned short int id
;
449 unsigned short int len
;
450 unsigned short int id
;
451 unsigned char list
[1];
456 unsigned short int len
;
457 unsigned short int id
;
459 unsigned char bitoff
;
465 unsigned short int len
;
466 unsigned short int id
;
469 unsigned char bitoff
;
474 unsigned short int len
;
475 unsigned short int id
;
482 unsigned short int len
;
483 unsigned short int id
;
490 unsigned short int len
;
491 unsigned short int id
;
493 cv_typ16_t drvdcls
[1];
498 unsigned short int len
;
499 unsigned short int id
;
506 unsigned short int len
;
507 unsigned short int id
;
509 cv_typ_t baseVftable
;
510 unsigned offsetInObjectLayout
;
512 char names
[1]; /* array of len 0-terminated strings (size of cbstr in char:s) */
516 union codeview_fieldtype
520 unsigned short int id
;
525 unsigned short int id
;
528 unsigned short int offset
; /* numeric leaf */
533 unsigned short int id
;
536 unsigned short int offset
; /* numeric leaf */
541 unsigned short int id
;
545 unsigned short int vbpoff
; /* numeric leaf */
547 unsigned short int vboff
; /* numeric leaf */
553 unsigned short int id
;
557 unsigned short int vbpoff
; /* numeric leaf */
559 unsigned short int vboff
; /* numeric leaf */
565 unsigned short int id
;
567 unsigned short int value
; /* numeric leaf */
569 struct p_string p_name
;
575 unsigned short int id
;
577 unsigned short int value
; /* numeric leaf */
585 unsigned short int id
;
587 struct p_string p_name
;
592 unsigned short int id
;
595 struct p_string p_name
;
600 unsigned short int id
;
608 unsigned short int id
;
611 unsigned short int offset
; /* numeric leaf */
613 struct p_string p_name
;
619 unsigned short int id
;
622 unsigned short int offset
; /* numeric leaf */
624 struct p_string p_name
;
630 unsigned short int id
;
633 unsigned short int offset
; /* numeric leaf */
642 unsigned short int id
;
645 struct p_string p_name
;
650 unsigned short int id
;
653 struct p_string p_name
;
658 unsigned short int id
;
666 unsigned short int id
;
669 struct p_string p_name
;
674 unsigned short int id
;
677 struct p_string p_name
;
682 unsigned short int id
;
690 unsigned short int id
;
692 struct p_string p_name
;
697 unsigned short int id
;
700 struct p_string p_name
;
705 unsigned short int id
;
713 unsigned short int id
;
719 unsigned short int id
;
726 unsigned short int id
;
732 unsigned short int id
;
739 unsigned short int id
;
742 struct p_string p_name
;
747 unsigned short int id
;
750 struct p_string p_name
;
755 unsigned short int id
;
763 unsigned short int id
;
766 unsigned int vtab_offset
;
767 struct p_string p_name
;
772 unsigned short int id
;
775 unsigned int vtab_offset
;
776 struct p_string p_name
;
781 unsigned short int id
;
784 unsigned int vtab_offset
;
790 unsigned short int id
;
797 unsigned short int id
;
805 unsigned short int id
;
808 struct p_string p_name
;
813 unsigned short int id
;
816 struct p_string p_name
;
821 unsigned short int id
;
824 struct p_string p_name
;
829 unsigned short int id
;
835 unsigned short int id
;
843 * This covers the basic datatypes that VC++ seems to be using these days.
844 * 32 bit mode only. There are additional numbers for the pointers in 16
845 * bit mode. There are many other types listed in the documents, but these
846 * are apparently not used by the compiler, or represent pointer types
849 * Official MS documentation says that type (< 0x4000, so 12 bits) is made of:
850 * +----------+------+------+----------+------+
851 * | 11 | 10-8 | 7-4 | 3 | 2-0 |
852 * +----------+------+------+----------+------+
853 * | reserved | mode | type | reserved | size |
854 * +----------+------+------+----------+------+
855 * In recent PDB files, type 8 exists, and is seen as an HRESULT... So we've
856 * added this basic type... as if bit 3 had been integrated into the size field
859 /* the type number of a built-in type is a 16-bit value specified in the following format:
860 bit # | 11 | 10-8 | 7-4 | 3 | 2-0 |
861 field | reserved | mode | type | reserved | size |
864 <type> is one of the following types:
866 0x01 Signed integral value
867 0x02 Unsigned integral value
880 0x0f Reserved for debugger expression evaluator
882 <size> is an enumerated value for each of the types.
888 0x04 Basic 8-byte currency value
889 0x05 Near Basic string
890 0x06 Far Basic string
891 0x07 Untranslated type from previous Microsoft symbol formats
892 Type = signed/unsigned integral and Boolean values
901 Type = real and complex
916 0x02 2-byte signed integer
917 0x03 2-byte unsigned integer
918 0x04 4-byte signed integer
919 0x05 4-byte unsigned integer
920 0x06 8-byte signed integer
921 0x07 8-byte unsigned integer
923 <mode> is the pointer mode:
924 0x00 Direct; not a pointer
928 0x04 32-bit near pointer
929 0x05 32-bit far pointer
930 0x06 64-bit near pointer
935 #define T_NOTYPE 0x0000 /* Notype */
936 #define T_ABS 0x0001 /* Abs */
937 #define T_SEGMENT 0x0002 /* segment type */
938 #define T_VOID 0x0003 /* Void */
939 #define T_CURRENCY 0x0004 /* basic 8-byte currency value */
940 #define T_NBASICSTR 0x0005 /* near basic string */
941 #define T_FBASICSTR 0x0006 /* far basic string */
942 #define T_NOTTRANS 0x0007 /* untranslated type record from MS symbol format */
943 #define T_HRESULT 0x0008 /* HRESULT - or error code ??? */
944 #define T_CHAR 0x0010 /* signed char */
945 #define T_SHORT 0x0011 /* short */
946 #define T_LONG 0x0012 /* long */
947 #define T_QUAD 0x0013 /* long long */
948 #define T_UCHAR 0x0020 /* unsigned char */
949 #define T_USHORT 0x0021 /* unsigned short */
950 #define T_ULONG 0x0022 /* unsigned long */
951 #define T_UQUAD 0x0023 /* unsigned long long */
952 #define T_BOOL08 0x0030 /* 8-bit boolean */
953 #define T_BOOL16 0x0031 /* 16-bit boolean */
954 #define T_BOOL32 0x0032 /* 32-bit boolean */
955 #define T_BOOL64 0x0033 /* 64-bit boolean */
956 #define T_REAL32 0x0040 /* float */
957 #define T_REAL64 0x0041 /* double */
958 #define T_REAL80 0x0042 /* 80-bit real */
959 #define T_REAL128 0x0043 /* 128-bit real */
960 #define T_REAL48 0x0044 /* 48-bit real */
961 #define T_CPLX32 0x0050 /* 32-bit complex number */
962 #define T_CPLX64 0x0051 /* 64-bit complex number */
963 #define T_CPLX80 0x0052 /* 80-bit complex number */
964 #define T_CPLX128 0x0053 /* 128-bit complex number */
965 #define T_BIT 0x0060 /* bit */
966 #define T_PASCHAR 0x0061 /* pascal CHAR */
967 #define T_RCHAR 0x0070 /* real char */
968 #define T_WCHAR 0x0071 /* wide char */
969 #define T_INT2 0x0072 /* real 16-bit signed int */
970 #define T_UINT2 0x0073 /* real 16-bit unsigned int */
971 #define T_INT4 0x0074 /* int */
972 #define T_UINT4 0x0075 /* unsigned int */
973 #define T_INT8 0x0076 /* 64-bit signed int */
974 #define T_UINT8 0x0077 /* 64-bit unsigned int */
975 #define T_CHAR16 0x007a /* 16-bit unicode char */
976 #define T_CHAR32 0x007b /* 32-bit unicode char */
977 #define T_CHAR8 0x007c /* 8-bit unicode char (C++ 20) */
979 /* near pointers to basic types */
980 #define T_PVOID 0x0103 /* near pointer to void */
981 #define T_PCHAR 0x0110 /* Near pointer to 8-bit signed */
982 #define T_PSHORT 0x0111 /* Near pointer to 16-bit signed */
983 #define T_PLONG 0x0112 /* Near pointer to 32-bit signed */
984 #define T_PQUAD 0x0113 /* Near pointer to 64-bit signed */
985 #define T_PUCHAR 0x0120 /* Near pointer to 8-bit unsigned */
986 #define T_PUSHORT 0x0121 /* Near pointer to 16-bit unsigned */
987 #define T_PULONG 0x0122 /* Near pointer to 32-bit unsigned */
988 #define T_PUQUAD 0x0123 /* Near pointer to 64-bit unsigned */
989 #define T_PBOOL08 0x0130 /* Near pointer to 8-bit Boolean */
990 #define T_PBOOL16 0x0131 /* Near pointer to 16-bit Boolean */
991 #define T_PBOOL32 0x0132 /* Near pointer to 32-bit Boolean */
992 #define T_PBOOL64 0x0133 /* Near pointer to 64-bit Boolean */
993 #define T_PREAL32 0x0140 /* Near pointer to 32-bit real */
994 #define T_PREAL64 0x0141 /* Near pointer to 64-bit real */
995 #define T_PREAL80 0x0142 /* Near pointer to 80-bit real */
996 #define T_PREAL128 0x0143 /* Near pointer to 128-bit real */
997 #define T_PREAL48 0x0144 /* Near pointer to 48-bit real */
998 #define T_PCPLX32 0x0150 /* Near pointer to 32-bit complex */
999 #define T_PCPLX64 0x0151 /* Near pointer to 64-bit complex */
1000 #define T_PCPLX80 0x0152 /* Near pointer to 80-bit complex */
1001 #define T_PCPLX128 0x0153 /* Near pointer to 128-bit complex */
1002 #define T_PRCHAR 0x0170 /* Near pointer to a real char */
1003 #define T_PWCHAR 0x0171 /* Near pointer to a wide char */
1004 #define T_PINT2 0x0172 /* Near pointer to 16-bit signed int */
1005 #define T_PUINT2 0x0173 /* Near pointer to 16-bit unsigned int */
1006 #define T_PINT4 0x0174 /* Near pointer to 32-bit signed int */
1007 #define T_PUINT4 0x0175 /* Near pointer to 32-bit unsigned int */
1008 #define T_PINT8 0x0176 /* Near pointer to 64-bit signed int */
1009 #define T_PUINT8 0x0177 /* Near pointer to 64-bit unsigned int */
1010 #define T_PCHAR16 0x017a /* Near pointer to 16-bit unicode char */
1011 #define T_PCHAR32 0x017b /* Near pointer to 32-bit unicode char */
1012 #define T_PCHAR8 0x017c /* Near pointer to 8-bit unicode char */
1014 /* far pointers to basic types */
1015 #define T_PFVOID 0x0203 /* Far pointer to void */
1016 #define T_PFCHAR 0x0210 /* Far pointer to 8-bit signed */
1017 #define T_PFSHORT 0x0211 /* Far pointer to 16-bit signed */
1018 #define T_PFLONG 0x0212 /* Far pointer to 32-bit signed */
1019 #define T_PFQUAD 0x0213 /* Far pointer to 64-bit signed */
1020 #define T_PFUCHAR 0x0220 /* Far pointer to 8-bit unsigned */
1021 #define T_PFUSHORT 0x0221 /* Far pointer to 16-bit unsigned */
1022 #define T_PFULONG 0x0222 /* Far pointer to 32-bit unsigned */
1023 #define T_PFUQUAD 0x0223 /* Far pointer to 64-bit unsigned */
1024 #define T_PFBOOL08 0x0230 /* Far pointer to 8-bit Boolean */
1025 #define T_PFBOOL16 0x0231 /* Far pointer to 16-bit Boolean */
1026 #define T_PFBOOL32 0x0232 /* Far pointer to 32-bit Boolean */
1027 #define T_PFBOOL64 0x0233 /* Far pointer to 64-bit Boolean */
1028 #define T_PFREAL32 0x0240 /* Far pointer to 32-bit real */
1029 #define T_PFREAL64 0x0241 /* Far pointer to 64-bit real */
1030 #define T_PFREAL80 0x0242 /* Far pointer to 80-bit real */
1031 #define T_PFREAL128 0x0243 /* Far pointer to 128-bit real */
1032 #define T_PFREAL48 0x0244 /* Far pointer to 48-bit real */
1033 #define T_PFCPLX32 0x0250 /* Far pointer to 32-bit complex */
1034 #define T_PFCPLX64 0x0251 /* Far pointer to 64-bit complex */
1035 #define T_PFCPLX80 0x0252 /* Far pointer to 80-bit complex */
1036 #define T_PFCPLX128 0x0253 /* Far pointer to 128-bit complex */
1037 #define T_PFRCHAR 0x0270 /* Far pointer to a real char */
1038 #define T_PFWCHAR 0x0271 /* Far pointer to a wide char */
1039 #define T_PFINT2 0x0272 /* Far pointer to 16-bit signed int */
1040 #define T_PFUINT2 0x0273 /* Far pointer to 16-bit unsigned int */
1041 #define T_PFINT4 0x0274 /* Far pointer to 32-bit signed int */
1042 #define T_PFUINT4 0x0275 /* Far pointer to 32-bit unsigned int */
1043 #define T_PFINT8 0x0276 /* Far pointer to 64-bit signed int */
1044 #define T_PFUINT8 0x0277 /* Far pointer to 64-bit unsigned int */
1045 #define T_PFCHAR16 0x027a /* Far pointer to 16-bit unicode char */
1046 #define T_PFCHAR32 0x027b /* Far pointer to 32-bit unicode char */
1047 #define T_PFCHAR8 0x027c /* Far pointer to 8-bit unicode char */
1049 /* huge pointers to basic types */
1050 #define T_PHVOID 0x0303 /* Huge pointer to void */
1051 #define T_PHCHAR 0x0310 /* Huge pointer to 8-bit signed */
1052 #define T_PHSHORT 0x0311 /* Huge pointer to 16-bit signed */
1053 #define T_PHLONG 0x0312 /* Huge pointer to 32-bit signed */
1054 #define T_PHQUAD 0x0313 /* Huge pointer to 64-bit signed */
1055 #define T_PHUCHAR 0x0320 /* Huge pointer to 8-bit unsigned */
1056 #define T_PHUSHORT 0x0321 /* Huge pointer to 16-bit unsigned */
1057 #define T_PHULONG 0x0322 /* Huge pointer to 32-bit unsigned */
1058 #define T_PHUQUAD 0x0323 /* Huge pointer to 64-bit unsigned */
1059 #define T_PHBOOL08 0x0330 /* Huge pointer to 8-bit Boolean */
1060 #define T_PHBOOL16 0x0331 /* Huge pointer to 16-bit Boolean */
1061 #define T_PHBOOL32 0x0332 /* Huge pointer to 32-bit Boolean */
1062 #define T_PHBOOL64 0x0333 /* Huge pointer to 64-bit Boolean */
1063 #define T_PHREAL32 0x0340 /* Huge pointer to 32-bit real */
1064 #define T_PHREAL64 0x0341 /* Huge pointer to 64-bit real */
1065 #define T_PHREAL80 0x0342 /* Huge pointer to 80-bit real */
1066 #define T_PHREAL128 0x0343 /* Huge pointer to 128-bit real */
1067 #define T_PHREAL48 0x0344 /* Huge pointer to 48-bit real */
1068 #define T_PHCPLX32 0x0350 /* Huge pointer to 32-bit complex */
1069 #define T_PHCPLX64 0x0351 /* Huge pointer to 64-bit complex */
1070 #define T_PHCPLX80 0x0352 /* Huge pointer to 80-bit complex */
1071 #define T_PHCPLX128 0x0353 /* Huge pointer to 128-bit real */
1072 #define T_PHRCHAR 0x0370 /* Huge pointer to a real char */
1073 #define T_PHWCHAR 0x0371 /* Huge pointer to a wide char */
1074 #define T_PHINT2 0x0372 /* Huge pointer to 16-bit signed int */
1075 #define T_PHUINT2 0x0373 /* Huge pointer to 16-bit unsigned int */
1076 #define T_PHINT4 0x0374 /* Huge pointer to 32-bit signed int */
1077 #define T_PHUINT4 0x0375 /* Huge pointer to 32-bit unsigned int */
1078 #define T_PHINT8 0x0376 /* Huge pointer to 64-bit signed int */
1079 #define T_PHUINT8 0x0377 /* Huge pointer to 64-bit unsigned int */
1080 #define T_PHCHAR16 0x037a /* Huge pointer to 16-bit unicode char */
1081 #define T_PHCHAR32 0x037b /* Huge pointer to 32-bit unicode char */
1082 #define T_PHCHAR8 0x037c /* Huge pointer to 8-bit unicode char */
1084 /* 32-bit near pointers to basic types */
1085 #define T_32PVOID 0x0403 /* 32-bit near pointer to void */
1086 #define T_32PHRESULT 0x0408 /* 16:32 near pointer to HRESULT - or error code ??? */
1087 #define T_32PCHAR 0x0410 /* 16:32 near pointer to 8-bit signed */
1088 #define T_32PSHORT 0x0411 /* 16:32 near pointer to 16-bit signed */
1089 #define T_32PLONG 0x0412 /* 16:32 near pointer to 32-bit signed */
1090 #define T_32PQUAD 0x0413 /* 16:32 near pointer to 64-bit signed */
1091 #define T_32PUCHAR 0x0420 /* 16:32 near pointer to 8-bit unsigned */
1092 #define T_32PUSHORT 0x0421 /* 16:32 near pointer to 16-bit unsigned */
1093 #define T_32PULONG 0x0422 /* 16:32 near pointer to 32-bit unsigned */
1094 #define T_32PUQUAD 0x0423 /* 16:32 near pointer to 64-bit unsigned */
1095 #define T_32PBOOL08 0x0430 /* 16:32 near pointer to 8-bit Boolean */
1096 #define T_32PBOOL16 0x0431 /* 16:32 near pointer to 16-bit Boolean */
1097 #define T_32PBOOL32 0x0432 /* 16:32 near pointer to 32-bit Boolean */
1098 #define T_32PBOOL64 0x0433 /* 16:32 near pointer to 64-bit Boolean */
1099 #define T_32PREAL32 0x0440 /* 16:32 near pointer to 32-bit real */
1100 #define T_32PREAL64 0x0441 /* 16:32 near pointer to 64-bit real */
1101 #define T_32PREAL80 0x0442 /* 16:32 near pointer to 80-bit real */
1102 #define T_32PREAL128 0x0443 /* 16:32 near pointer to 128-bit real */
1103 #define T_32PREAL48 0x0444 /* 16:32 near pointer to 48-bit real */
1104 #define T_32PCPLX32 0x0450 /* 16:32 near pointer to 32-bit complex */
1105 #define T_32PCPLX64 0x0451 /* 16:32 near pointer to 64-bit complex */
1106 #define T_32PCPLX80 0x0452 /* 16:32 near pointer to 80-bit complex */
1107 #define T_32PCPLX128 0x0453 /* 16:32 near pointer to 128-bit complex */
1108 #define T_32PRCHAR 0x0470 /* 16:32 near pointer to a real char */
1109 #define T_32PWCHAR 0x0471 /* 16:32 near pointer to a wide char */
1110 #define T_32PINT2 0x0472 /* 16:32 near pointer to 16-bit signed int */
1111 #define T_32PUINT2 0x0473 /* 16:32 near pointer to 16-bit unsigned int */
1112 #define T_32PINT4 0x0474 /* 16:32 near pointer to 32-bit signed int */
1113 #define T_32PUINT4 0x0475 /* 16:32 near pointer to 32-bit unsigned int */
1114 #define T_32PINT8 0x0476 /* 16:32 near pointer to 64-bit signed int */
1115 #define T_32PUINT8 0x0477 /* 16:32 near pointer to 64-bit unsigned int */
1116 #define T_32PCHAR16 0x047a /* 16:32 near pointer to 16-bit unicode char */
1117 #define T_32PCHAR32 0x047b /* 16:32 near pointer to 32-bit unicode char */
1118 #define T_32PCHAR8 0x047c /* 16:32 near pointer to 8-bit unicode char */
1120 /* 32-bit far pointers to basic types */
1121 #define T_32PFVOID 0x0503 /* 32-bit far pointer to void */
1122 #define T_32PFHRESULT 0x0508 /* 16:32 far pointer to HRESULT - or error code ??? */
1123 #define T_32PFCHAR 0x0510 /* 16:32 far pointer to 8-bit signed */
1124 #define T_32PFSHORT 0x0511 /* 16:32 far pointer to 16-bit signed */
1125 #define T_32PFLONG 0x0512 /* 16:32 far pointer to 32-bit signed */
1126 #define T_32PFQUAD 0x0513 /* 16:32 far pointer to 64-bit signed */
1127 #define T_32PFUCHAR 0x0520 /* 16:32 far pointer to 8-bit unsigned */
1128 #define T_32PFUSHORT 0x0521 /* 16:32 far pointer to 16-bit unsigned */
1129 #define T_32PFULONG 0x0522 /* 16:32 far pointer to 32-bit unsigned */
1130 #define T_32PFUQUAD 0x0523 /* 16:32 far pointer to 64-bit unsigned */
1131 #define T_32PFBOOL08 0x0530 /* 16:32 far pointer to 8-bit Boolean */
1132 #define T_32PFBOOL16 0x0531 /* 16:32 far pointer to 16-bit Boolean */
1133 #define T_32PFBOOL32 0x0532 /* 16:32 far pointer to 32-bit Boolean */
1134 #define T_32PFBOOL64 0x0533 /* 16:32 far pointer to 64-bit Boolean */
1135 #define T_32PFREAL32 0x0540 /* 16:32 far pointer to 32-bit real */
1136 #define T_32PFREAL64 0x0541 /* 16:32 far pointer to 64-bit real */
1137 #define T_32PFREAL80 0x0542 /* 16:32 far pointer to 80-bit real */
1138 #define T_32PFREAL128 0x0543 /* 16:32 far pointer to 128-bit real */
1139 #define T_32PFREAL48 0x0544 /* 16:32 far pointer to 48-bit real */
1140 #define T_32PFCPLX32 0x0550 /* 16:32 far pointer to 32-bit complex */
1141 #define T_32PFCPLX64 0x0551 /* 16:32 far pointer to 64-bit complex */
1142 #define T_32PFCPLX80 0x0552 /* 16:32 far pointer to 80-bit complex */
1143 #define T_32PFCPLX128 0x0553 /* 16:32 far pointer to 128-bit complex */
1144 #define T_32PFRCHAR 0x0570 /* 16:32 far pointer to a real char */
1145 #define T_32PFWCHAR 0x0571 /* 16:32 far pointer to a wide char */
1146 #define T_32PFINT2 0x0572 /* 16:32 far pointer to 16-bit signed int */
1147 #define T_32PFUINT2 0x0573 /* 16:32 far pointer to 16-bit unsigned int */
1148 #define T_32PFINT4 0x0574 /* 16:32 far pointer to 32-bit signed int */
1149 #define T_32PFUINT4 0x0575 /* 16:32 far pointer to 32-bit unsigned int */
1150 #define T_32PFINT8 0x0576 /* 16:32 far pointer to 64-bit signed int */
1151 #define T_32PFUINT8 0x0577 /* 16:32 far pointer to 64-bit unsigned int */
1152 #define T_32PFCHAR16 0x057a /* 16:32 far pointer to 16-bit unicode char */
1153 #define T_32PFCHAR32 0x057b /* 16:32 far pointer to 32-bit unicode char */
1154 #define T_32PFCHAR8 0x057c /* 16:32 far pointer to 8-bit unicode char */
1156 /* 64-bit near pointers to basic types */
1157 #define T_64PVOID 0x0603 /* 64-bit near pointer to void */
1158 #define T_64PHRESULT 0x0608 /* 64 near pointer to HRESULT - or error code ??? */
1159 #define T_64PCHAR 0x0610 /* 64 near pointer to 8-bit signed */
1160 #define T_64PSHORT 0x0611 /* 64 near pointer to 16-bit signed */
1161 #define T_64PLONG 0x0612 /* 64 near pointer to 32-bit signed */
1162 #define T_64PQUAD 0x0613 /* 64 near pointer to 64-bit signed */
1163 #define T_64PUCHAR 0x0620 /* 64 near pointer to 8-bit unsigned */
1164 #define T_64PUSHORT 0x0621 /* 64 near pointer to 16-bit unsigned */
1165 #define T_64PULONG 0x0622 /* 64 near pointer to 32-bit unsigned */
1166 #define T_64PUQUAD 0x0623 /* 64 near pointer to 64-bit unsigned */
1167 #define T_64PBOOL08 0x0630 /* 64 near pointer to 8-bit Boolean */
1168 #define T_64PBOOL16 0x0631 /* 64 near pointer to 16-bit Boolean */
1169 #define T_64PBOOL32 0x0632 /* 64 near pointer to 32-bit Boolean */
1170 #define T_64PBOOL64 0x0633 /* 64 near pointer to 64-bit Boolean */
1171 #define T_64PREAL32 0x0640 /* 64 near pointer to 32-bit real */
1172 #define T_64PREAL64 0x0641 /* 64 near pointer to 64-bit real */
1173 #define T_64PREAL80 0x0642 /* 64 near pointer to 80-bit real */
1174 #define T_64PREAL128 0x0643 /* 64 near pointer to 128-bit real */
1175 #define T_64PREAL48 0x0644 /* 64 near pointer to 48-bit real */
1176 #define T_64PCPLX32 0x0650 /* 64 near pointer to 32-bit complex */
1177 #define T_64PCPLX64 0x0651 /* 64 near pointer to 64-bit complex */
1178 #define T_64PCPLX80 0x0652 /* 64 near pointer to 80-bit complex */
1179 #define T_64PCPLX128 0x0653 /* 64 near pointer to 128-bit complex */
1180 #define T_64PRCHAR 0x0670 /* 64 near pointer to a real char */
1181 #define T_64PWCHAR 0x0671 /* 64 near pointer to a wide char */
1182 #define T_64PINT2 0x0672 /* 64 near pointer to 16-bit signed int */
1183 #define T_64PUINT2 0x0673 /* 64 near pointer to 16-bit unsigned int */
1184 #define T_64PINT4 0x0674 /* 64 near pointer to 32-bit signed int */
1185 #define T_64PUINT4 0x0675 /* 64 near pointer to 32-bit unsigned int */
1186 #define T_64PINT8 0x0676 /* 64 near pointer to 64-bit signed int */
1187 #define T_64PUINT8 0x0677 /* 64 near pointer to 64-bit unsigned int */
1188 #define T_64PCHAR16 0x067a /* 64 near pointer to 16-bit unicode char */
1189 #define T_64PCHAR32 0x067b /* 64 near pointer to 32-bit unicode char */
1190 #define T_64PCHAR8 0x067c /* 64 near pointer to 8-bit unicode char */
1192 /* counts, bit masks, and shift values needed to access various parts of the built-in type numbers */
1193 #define T_FIRSTDEFINABLETYPE 0x1000 /* first type index that's not predefined */
1194 #define T_MAXPREDEFINEDTYPE 0x0680 /* maximum type index for all built-in types */
1195 #define T_MAXBASICTYPE 0x0080 /* maximum type index all non-pointer built-in types */
1196 #define T_BASICTYPE_MASK 0x00ff /* mask of bits that can potentially identify a non-pointer basic type */
1197 #define T_BASICTYPE_SHIFT 8 /* shift count to push out the basic type bits from a type number */
1198 #define T_MODE_MASK 0x0700 /* type mode mask (ptr/non-ptr) */
1199 #define T_SIZE_MASK 0x0007 /* type size mask (depends on 'type' value) */
1200 #define T_TYPE_MASK 0x00f0 /* type type mask (data treatment mode) */
1202 /* bit patterns for the <mode> portion of a built-in type number */
1203 #define T_NEARPTR_BITS 0x0100
1204 #define T_FARPTR_BITS 0x0200
1205 #define T_HUGEPTR_BITS 0x0300
1206 #define T_NEAR32PTR_BITS 0x0400
1207 #define T_FAR32PTR_BITS 0x0500
1208 #define T_NEAR64PTR_BITS 0x0600
1210 #define LF_MODIFIER_V1 0x0001
1211 #define LF_POINTER_V1 0x0002
1212 #define LF_ARRAY_V1 0x0003
1213 #define LF_CLASS_V1 0x0004
1214 #define LF_STRUCTURE_V1 0x0005
1215 #define LF_UNION_V1 0x0006
1216 #define LF_ENUM_V1 0x0007
1217 #define LF_PROCEDURE_V1 0x0008
1218 #define LF_MFUNCTION_V1 0x0009
1219 #define LF_VTSHAPE_V1 0x000a
1220 #define LF_COBOL0_V1 0x000b
1221 #define LF_COBOL1_V1 0x000c
1222 #define LF_BARRAY_V1 0x000d
1223 #define LF_LABEL_V1 0x000e
1224 #define LF_NULL_V1 0x000f
1225 #define LF_NOTTRAN_V1 0x0010
1226 #define LF_DIMARRAY_V1 0x0011
1227 #define LF_VFTPATH_V1 0x0012
1228 #define LF_PRECOMP_V1 0x0013
1229 #define LF_ENDPRECOMP_V1 0x0014
1230 #define LF_OEM_V1 0x0015
1231 #define LF_TYPESERVER_V1 0x0016
1233 #define LF_MODIFIER_V2 0x1001 /* variants with new 32-bit type indices (V2) */
1234 #define LF_POINTER_V2 0x1002
1235 #define LF_ARRAY_V2 0x1003
1236 #define LF_CLASS_V2 0x1004
1237 #define LF_STRUCTURE_V2 0x1005
1238 #define LF_UNION_V2 0x1006
1239 #define LF_ENUM_V2 0x1007
1240 #define LF_PROCEDURE_V2 0x1008
1241 #define LF_MFUNCTION_V2 0x1009
1242 #define LF_COBOL0_V2 0x100a
1243 #define LF_BARRAY_V2 0x100b
1244 #define LF_DIMARRAY_V2 0x100c
1245 #define LF_VFTPATH_V2 0x100d
1246 #define LF_PRECOMP_V2 0x100e
1247 #define LF_OEM_V2 0x100f
1249 #define LF_SKIP_V1 0x0200
1250 #define LF_ARGLIST_V1 0x0201
1251 #define LF_DEFARG_V1 0x0202
1252 #define LF_LIST_V1 0x0203
1253 #define LF_FIELDLIST_V1 0x0204
1254 #define LF_DERIVED_V1 0x0205
1255 #define LF_BITFIELD_V1 0x0206
1256 #define LF_METHODLIST_V1 0x0207
1257 #define LF_DIMCONU_V1 0x0208
1258 #define LF_DIMCONLU_V1 0x0209
1259 #define LF_DIMVARU_V1 0x020a
1260 #define LF_DIMVARLU_V1 0x020b
1261 #define LF_REFSYM_V1 0x020c
1263 #define LF_SKIP_V2 0x1200 /* variants with new 32-bit type indices (V2) */
1264 #define LF_ARGLIST_V2 0x1201
1265 #define LF_DEFARG_V2 0x1202
1266 #define LF_FIELDLIST_V2 0x1203
1267 #define LF_DERIVED_V2 0x1204
1268 #define LF_BITFIELD_V2 0x1205
1269 #define LF_METHODLIST_V2 0x1206
1270 #define LF_DIMCONU_V2 0x1207
1271 #define LF_DIMCONLU_V2 0x1208
1272 #define LF_DIMVARU_V2 0x1209
1273 #define LF_DIMVARLU_V2 0x120a
1276 #define LF_BCLASS_V1 0x0400
1277 #define LF_VBCLASS_V1 0x0401
1278 #define LF_IVBCLASS_V1 0x0402
1279 #define LF_ENUMERATE_V1 0x0403
1280 #define LF_FRIENDFCN_V1 0x0404
1281 #define LF_INDEX_V1 0x0405
1282 #define LF_MEMBER_V1 0x0406
1283 #define LF_STMEMBER_V1 0x0407
1284 #define LF_METHOD_V1 0x0408
1285 #define LF_NESTTYPE_V1 0x0409
1286 #define LF_VFUNCTAB_V1 0x040a
1287 #define LF_FRIENDCLS_V1 0x040b
1288 #define LF_ONEMETHOD_V1 0x040c
1289 #define LF_VFUNCOFF_V1 0x040d
1290 #define LF_NESTTYPEEX_V1 0x040e
1291 #define LF_MEMBERMODIFY_V1 0x040f
1293 #define LF_BCLASS_V2 0x1400 /* variants with new 32-bit type indices (V2) */
1294 #define LF_VBCLASS_V2 0x1401
1295 #define LF_IVBCLASS_V2 0x1402
1296 #define LF_FRIENDFCN_V2 0x1403
1297 #define LF_INDEX_V2 0x1404
1298 #define LF_MEMBER_V2 0x1405
1299 #define LF_STMEMBER_V2 0x1406
1300 #define LF_METHOD_V2 0x1407
1301 #define LF_NESTTYPE_V2 0x1408
1302 #define LF_VFUNCTAB_V2 0x1409
1303 #define LF_FRIENDCLS_V2 0x140a
1304 #define LF_ONEMETHOD_V2 0x140b
1305 #define LF_VFUNCOFF_V2 0x140c
1306 #define LF_NESTTYPEEX_V2 0x140d
1308 #define LF_ENUMERATE_V3 0x1502
1309 #define LF_ARRAY_V3 0x1503
1310 #define LF_CLASS_V3 0x1504
1311 #define LF_STRUCTURE_V3 0x1505
1312 #define LF_UNION_V3 0x1506
1313 #define LF_ENUM_V3 0x1507
1314 #define LF_FRIENDFCN_V3 0x150c
1315 #define LF_MEMBER_V3 0x150d
1316 #define LF_STMEMBER_V3 0x150e
1317 #define LF_METHOD_V3 0x150f
1318 #define LF_NESTTYPE_V3 0x1510
1319 #define LF_ONEMETHOD_V3 0x1511
1320 #define LF_VFTABLE_V3 0x151d
1322 /* leaves found in second type type (aka IPI)
1323 * for simplicity, stored in the same union as other TPI leaves
1325 #define LF_FUNC_ID 0x1601
1326 #define LF_MFUNC_ID 0x1602
1327 #define LF_BUILDINFO 0x1603
1328 #define LF_SUBSTR_LIST 0x1604
1329 #define LF_STRING_ID 0x1605
1330 #define LF_UDT_SRC_LINE 0x1606
1331 #define LF_UDT_MOD_SRC_LINE 0x1607
1333 #define LF_NUMERIC 0x8000 /* numeric leaf types */
1334 #define LF_CHAR 0x8000
1335 #define LF_SHORT 0x8001
1336 #define LF_USHORT 0x8002
1337 #define LF_LONG 0x8003
1338 #define LF_ULONG 0x8004
1339 #define LF_REAL32 0x8005
1340 #define LF_REAL64 0x8006
1341 #define LF_REAL80 0x8007
1342 #define LF_REAL128 0x8008
1343 #define LF_QUADWORD 0x8009
1344 #define LF_UQUADWORD 0x800a
1345 #define LF_REAL48 0x800b
1346 #define LF_COMPLEX32 0x800c
1347 #define LF_COMPLEX64 0x800d
1348 #define LF_COMPLEX80 0x800e
1349 #define LF_COMPLEX128 0x800f
1350 #define LF_VARSTRING 0x8010
1352 /* symtype e.g. for public_vx.symtype */
1353 #define SYMTYPE_NONE 0x0000
1354 #define SYMTYPE_CODE 0x0001
1355 #define SYMTYPE_FUNCTION 0x0002
1356 #define SYMTYPE_MANAGED 0x0004
1357 #define SYMTYPE_MSIL 0x0008
1359 /* ======================================== *
1360 * Symbol information
1361 * ======================================== */
1363 struct cv_addr_range
1365 unsigned int offStart
;
1366 unsigned short isectStart
;
1367 unsigned short cbRange
;
1372 unsigned short gapStartOffset
;
1373 unsigned short cbRange
;
1376 struct cv_local_varflag
1378 unsigned short is_param
: 1;
1379 unsigned short address_taken
: 1;
1380 unsigned short from_compiler
: 1; /* generated by compiler */
1381 unsigned short is_aggregate
: 1; /* split in several variables by compiler */
1382 unsigned short from_aggregate
: 1; /* marks a temporary from an aggregate */
1383 unsigned short is_aliased
: 1;
1384 unsigned short from_alias
: 1;
1385 unsigned short is_return_value
: 1;
1386 unsigned short optimized_out
: 1;
1387 unsigned short enreg_global
: 1; /* global variable accessed from register */
1388 unsigned short enreg_static
: 1;
1390 unsigned short unused
: 5;
1394 union codeview_symbol
1398 unsigned short int len
;
1399 unsigned short int id
;
1404 unsigned short int len
;
1405 unsigned short int id
;
1406 unsigned int offset
;
1407 unsigned short segment
;
1409 struct p_string p_name
;
1414 unsigned short int len
;
1415 unsigned short int id
;
1417 unsigned int offset
;
1418 unsigned short segment
;
1419 struct p_string p_name
;
1424 unsigned short int len
;
1425 unsigned short int id
;
1427 unsigned int offset
;
1428 unsigned short segment
;
1434 unsigned short int len
;
1435 unsigned short int id
;
1436 unsigned int pparent
;
1439 unsigned int offset
;
1440 unsigned short segment
;
1441 unsigned short thunk_len
;
1442 unsigned char thtype
;
1443 struct p_string p_name
;
1448 unsigned short int len
;
1449 unsigned short int id
;
1450 unsigned int pparent
;
1453 unsigned int offset
;
1454 unsigned short segment
;
1455 unsigned short thunk_len
;
1456 unsigned char thtype
;
1462 unsigned short int len
;
1463 unsigned short int id
;
1464 unsigned int pparent
;
1467 unsigned int proc_len
;
1468 unsigned int debug_start
;
1469 unsigned int debug_end
;
1470 unsigned int offset
;
1471 unsigned short segment
;
1472 cv_typ16_t proctype
;
1473 unsigned char flags
;
1474 struct p_string p_name
;
1479 unsigned short int len
;
1480 unsigned short int id
;
1481 unsigned int pparent
;
1484 unsigned int proc_len
;
1485 unsigned int debug_start
;
1486 unsigned int debug_end
;
1488 unsigned int offset
;
1489 unsigned short segment
;
1490 unsigned char flags
;
1491 struct p_string p_name
;
1496 unsigned short int len
;
1497 unsigned short int id
;
1498 unsigned int pparent
;
1501 unsigned int proc_len
;
1502 unsigned int debug_start
;
1503 unsigned int debug_end
;
1505 unsigned int offset
;
1506 unsigned short segment
;
1507 unsigned char flags
;
1513 unsigned short int len
;
1514 unsigned short int id
;
1515 unsigned int offset
;
1516 unsigned short segment
;
1517 unsigned short pubsymflags
;
1518 struct p_string p_name
;
1523 unsigned short int len
;
1524 unsigned short int id
;
1525 unsigned int pubsymflags
;
1526 unsigned int offset
;
1527 unsigned short segment
;
1528 struct p_string p_name
;
1533 unsigned short int len
;
1534 unsigned short int id
;
1535 unsigned int pubsymflags
;
1536 unsigned int offset
;
1537 unsigned short segment
;
1543 unsigned short int len
;
1544 unsigned short int id
; /* Always S_BPREL32_16t */
1545 unsigned int offset
; /* Stack offset relative to BP */
1547 struct p_string p_name
;
1552 unsigned short int len
;
1553 unsigned short int id
; /* Always S_BPREL32_ST */
1554 unsigned int offset
; /* Stack offset relative to EBP */
1556 struct p_string p_name
;
1561 unsigned short int len
;
1562 unsigned short int id
; /* Always S_BPREL32 */
1563 int offset
; /* Stack offset relative to BP */
1570 unsigned short int len
;
1571 unsigned short int id
; /* Always S_BPREL32 */
1572 int offset
; /* Stack offset relative to BP */
1580 unsigned short int len
;
1581 unsigned short int id
; /* Always S_REGISTER */
1584 struct p_string p_name
;
1585 /* don't handle register tracking */
1590 unsigned short int len
;
1591 unsigned short int id
; /* Always S_REGISTER_ST */
1592 cv_typ_t type
; /* check whether type & reg are correct */
1594 struct p_string p_name
;
1595 /* don't handle register tracking */
1600 unsigned short int len
;
1601 unsigned short int id
; /* Always S_REGISTER */
1602 cv_typ_t type
; /* check whether type & reg are correct */
1605 /* don't handle register tracking */
1610 unsigned short int len
;
1611 unsigned short int id
;
1612 unsigned int parent
;
1614 unsigned int length
;
1615 unsigned int offset
;
1616 unsigned short segment
;
1617 struct p_string p_name
;
1622 unsigned short int len
;
1623 unsigned short int id
;
1624 unsigned int parent
;
1626 unsigned int length
;
1627 unsigned int offset
;
1628 unsigned short segment
;
1634 unsigned short int len
;
1635 unsigned short int id
;
1636 unsigned short trampType
; /* 0: incremental, 1: branchisland */
1637 unsigned short cbThunk
;
1638 unsigned int offThunk
;
1639 unsigned int offTarget
;
1640 unsigned short sectThunk
;
1641 unsigned short sectTarget
;
1646 unsigned short int len
;
1647 unsigned short int id
;
1648 unsigned int offset
;
1649 unsigned short segment
;
1650 unsigned char flags
;
1651 struct p_string p_name
;
1656 unsigned short int len
;
1657 unsigned short int id
;
1658 unsigned int offset
;
1659 unsigned short segment
;
1660 unsigned char flags
;
1666 unsigned short int len
;
1667 unsigned short int id
;
1669 unsigned short cvalue
; /* numeric leaf */
1671 struct p_string p_name
;
1677 unsigned short int len
;
1678 unsigned short int id
;
1680 unsigned short cvalue
; /* numeric leaf */
1682 struct p_string p_name
;
1688 unsigned short int len
;
1689 unsigned short int id
;
1691 unsigned short cvalue
;
1699 unsigned short int len
;
1700 unsigned short int id
;
1702 struct p_string p_name
;
1707 unsigned short int len
;
1708 unsigned short int id
;
1710 struct p_string p_name
;
1715 unsigned short int len
;
1716 unsigned short int id
;
1723 unsigned short int len
;
1724 unsigned short int id
;
1726 struct p_string p_name
;
1731 unsigned short int len
;
1732 unsigned short int id
;
1739 unsigned short int len
;
1740 unsigned short int id
;
1741 unsigned char machine
;
1744 unsigned char language
: 8;
1745 unsigned char _dome
: 8; /* other missing fields */
1746 unsigned char pad
: 8;
1748 struct p_string p_name
;
1753 unsigned short int len
;
1754 unsigned short int id
;
1756 unsigned int iLanguage
: 8;
1757 unsigned int _dome
: 9; /* other missing fields */
1758 unsigned int pad
: 15;
1760 unsigned short machine
;
1761 unsigned short fe_major
;
1762 unsigned short fe_minor
;
1763 unsigned short fe_build
;
1764 unsigned short be_major
;
1765 unsigned short be_minor
;
1766 unsigned short be_build
;
1767 struct p_string p_name
;
1772 unsigned short int len
;
1773 unsigned short int id
;
1775 unsigned int iLanguage
: 8;
1776 unsigned int _dome
: 9; /* other missing fields */
1777 unsigned int pad
: 15;
1779 unsigned short machine
;
1780 unsigned short fe_major
;
1781 unsigned short fe_minor
;
1782 unsigned short fe_build
;
1783 unsigned short be_major
;
1784 unsigned short be_minor
;
1785 unsigned short be_build
;
1791 unsigned short int len
;
1792 unsigned short int id
;
1794 unsigned int iLanguage
: 8;
1795 unsigned int _dome
: 12; /* other missing fields */
1796 unsigned int pad
: 12;
1798 unsigned short machine
;
1799 unsigned short fe_major
;
1800 unsigned short fe_minor
;
1801 unsigned short fe_build
;
1802 unsigned short fe_qfe
;
1803 unsigned short be_major
;
1804 unsigned short be_minor
;
1805 unsigned short be_build
;
1806 unsigned short be_qfe
;
1812 unsigned short int len
;
1813 unsigned short int id
;
1814 unsigned int offset
;
1815 unsigned short segment
;
1817 struct p_string p_name
;
1822 unsigned short int len
;
1823 unsigned short int id
;
1825 unsigned int offset
;
1826 unsigned short segment
;
1827 struct p_string p_name
;
1832 unsigned short int len
;
1833 unsigned short int id
;
1835 unsigned int offset
;
1836 unsigned short segment
;
1842 unsigned short int len
;
1843 unsigned short int id
;
1844 unsigned int sumName
;
1846 unsigned short imod
;
1852 unsigned short int len
;
1853 unsigned short int id
;
1854 unsigned int offset
;
1855 unsigned short segment
;
1860 unsigned short int len
;
1861 unsigned short int id
;
1862 unsigned int offset
;
1863 unsigned int unknown
;
1864 } security_cookie_v3
;
1868 unsigned short int len
;
1869 unsigned short int id
;
1870 unsigned int sz_frame
; /* size of frame */
1871 unsigned int unknown2
;
1872 unsigned int unknown3
;
1873 unsigned int sz_saved_regs
; /* size of saved registers from callee */
1874 unsigned int eh_offset
; /* offset for exception handler */
1875 unsigned short eh_sect
; /* section for exception handler */
1881 unsigned short int len
;
1882 unsigned short int id
;
1883 unsigned int offset
;
1884 unsigned short sect_idx
;
1885 unsigned short inst_len
;
1887 } heap_alloc_site_v3
;
1891 unsigned short int len
;
1892 unsigned short int id
;
1894 struct cv_local_varflag varflags
;
1900 unsigned short int len
;
1901 unsigned short int id
;
1902 unsigned int program
;
1903 struct cv_addr_range range
;
1904 struct cv_addr_gap gaps
[0];
1909 unsigned short int len
;
1910 unsigned short int id
;
1911 unsigned int program
;
1912 unsigned int offParent
;
1913 struct cv_addr_range range
;
1914 struct cv_addr_gap gaps
[0];
1915 } defrange_subfield_v3
;
1919 unsigned short int len
;
1920 unsigned short int id
;
1922 unsigned short attr
;
1923 struct cv_addr_range range
;
1924 struct cv_addr_gap gaps
[0];
1925 } defrange_register_v3
;
1929 unsigned short int len
;
1930 unsigned short int id
;
1931 int offFramePointer
;
1932 struct cv_addr_range range
;
1933 struct cv_addr_gap gaps
[0];
1934 } defrange_frameptrrel_v3
;
1938 unsigned short int len
;
1939 unsigned short int id
;
1940 int offFramePointer
;
1941 } defrange_frameptr_relfullscope_v3
;
1945 unsigned short int len
;
1946 unsigned short int id
;
1948 unsigned short attr
;
1949 unsigned int offParent
: 12;
1950 unsigned int padding
: 20;
1951 struct cv_addr_range range
;
1952 struct cv_addr_gap gaps
[0];
1953 } defrange_subfield_register_v3
;
1957 unsigned short int len
;
1958 unsigned short int id
;
1959 unsigned short baseReg
;
1960 unsigned short spilledUdtMember
: 1;
1961 unsigned short padding
: 3;
1962 unsigned short offsetParent
: 12;
1964 struct cv_addr_range range
;
1965 struct cv_addr_gap gaps
[0];
1966 } defrange_registerrel_v3
;
1970 unsigned short int len
;
1971 unsigned short int id
;
1977 unsigned short int len
;
1978 unsigned short int id
;
1979 unsigned int pParent
;
1981 cv_itemid_t inlinee
;
1982 unsigned char binaryAnnotations
[0];
1987 unsigned short int len
;
1988 unsigned short int typ
;
1990 unsigned short sect
;
1991 unsigned short _pad0
;
1997 unsigned short int len
;
1998 unsigned short int id
;
1999 unsigned int pParent
;
2001 cv_itemid_t inlinee
;
2002 unsigned int invocations
;
2003 unsigned char binaryAnnotations
[0];
2008 unsigned short int len
;
2009 unsigned short int id
;
2011 cv_typ_t funcs
[0]; /* array of cuntions, count entries */
2013 unsigned int invocations
[0]; /* array of count entries, paires with funcs */
2019 unsigned short int len
;
2020 unsigned short int id
;
2022 unsigned int modOffset
;
2023 struct cv_local_varflag varflags
;
2029 unsigned short int len
;
2030 unsigned short int id
;
2031 struct p_string pname
;
2036 unsigned short int len
;
2037 unsigned short int id
;
2043 unsigned short int len
;
2044 unsigned short int id
;
2045 unsigned int pParent
;
2047 unsigned int length
;
2048 unsigned int scf
; /* CV_SEPCODEFLAGS */
2050 unsigned int offParent
;
2051 unsigned short int sect
;
2052 unsigned short int sectParent
;
2057 unsigned short int len
;
2058 unsigned short int id
;
2060 unsigned short int seg
;
2061 unsigned short int csz
; /* number of bytes in following array */
2062 char rgsz
[1]; /* array of null terminated strings (bounded by csz) */
2067 unsigned short int len
;
2068 unsigned short int id
;
2069 unsigned int invocations
;
2072 unsigned staInstLive
;
2076 enum BinaryAnnotationOpcode
2080 BA_OP_ChangeCodeOffsetBase
,
2081 BA_OP_ChangeCodeOffset
,
2082 BA_OP_ChangeCodeLength
,
2084 BA_OP_ChangeLineOffset
,
2085 BA_OP_ChangeLineEndDelta
,
2086 BA_OP_ChangeRangeKind
,
2087 BA_OP_ChangeColumnStart
,
2088 BA_OP_ChangeColumnEndDelta
,
2089 BA_OP_ChangeCodeOffsetAndLineOffset
,
2090 BA_OP_ChangeCodeLengthAndCodeOffset
,
2091 BA_OP_ChangeColumnEnd
,
2094 #define S_COMPILE 0x0001
2095 #define S_REGISTER_16t 0x0002
2096 #define S_CONSTANT_16t 0x0003
2097 #define S_UDT_16t 0x0004
2098 #define S_SSEARCH 0x0005
2099 #define S_END 0x0006
2100 #define S_SKIP 0x0007
2101 #define S_CVRESERVE 0x0008
2102 #define S_OBJNAME_ST 0x0009
2103 #define S_ENDARG 0x000a
2104 #define S_COBOLUDT_16t 0x000b
2105 #define S_MANYREG_16t 0x000c
2106 #define S_RETURN 0x000d
2107 #define S_ENTRYTHIS 0x000e
2109 #define S_BPREL32_16t 0x0200
2110 #define S_LDATA32_16t 0x0201
2111 #define S_GDATA32_16t 0x0202
2112 #define S_PUB32_16t 0x0203
2113 #define S_LPROC32_16t 0x0204
2114 #define S_GPROC32_16t 0x0205
2115 #define S_THUNK32_ST 0x0206
2116 #define S_BLOCK32_ST 0x0207
2117 #define S_WITH32_ST 0x0208
2118 #define S_LABEL32_ST 0x0209
2119 #define S_CEXMODEL32 0x020a
2120 #define S_VFTABLE32_16t 0x020b
2121 #define S_REGREL32_16t 0x020c
2122 #define S_LTHREAD32_16t 0x020d
2123 #define S_GTHREAD32_16t 0x020e
2125 #define S_PROCREF_ST 0x0400
2126 #define S_DATAREF_ST 0x0401
2127 #define S_ALIGN 0x0402
2128 #define S_LPROCREF_ST 0x0403
2130 #define S_REGISTER_ST 0x1001 /* Variants with new 32-bit type indices */
2131 #define S_CONSTANT_ST 0x1002
2132 #define S_UDT_ST 0x1003
2133 #define S_COBOLUDT_ST 0x1004
2134 #define S_MANYREG_ST 0x1005
2135 #define S_BPREL32_ST 0x1006
2136 #define S_LDATA32_ST 0x1007
2137 #define S_GDATA32_ST 0x1008
2138 #define S_PUB32_ST 0x1009
2139 #define S_LPROC32_ST 0x100a
2140 #define S_GPROC32_ST 0x100b
2141 #define S_VFTABLE32 0x100c
2142 #define S_REGREL32_ST 0x100d
2143 #define S_LTHREAD32_ST 0x100e
2144 #define S_GTHREAD32_ST 0x100f
2145 #define S_FRAMEPROC 0x1012
2146 #define S_COMPILE2_ST 0x1013
2147 #define S_ANNOTATION 0x1019
2148 #define S_UNAMESPACE_ST 0x1029
2150 #define S_OBJNAME 0x1101
2151 #define S_THUNK32 0x1102
2152 #define S_BLOCK32 0x1103
2153 #define S_WITH32 0x1104
2154 #define S_LABEL32 0x1105
2155 #define S_REGISTER 0x1106
2156 #define S_CONSTANT 0x1107
2157 #define S_UDT 0x1108
2158 #define S_COBOLUDT 0x1109
2159 #define S_MANYREG 0x110A
2160 #define S_BPREL32 0x110B
2161 #define S_LDATA32 0x110C
2162 #define S_GDATA32 0x110D
2163 #define S_PUB32 0x110E
2164 #define S_LPROC32 0x110F
2165 #define S_GPROC32 0x1110
2166 #define S_REGREL32 0x1111
2167 #define S_LTHREAD32 0x1112
2168 #define S_GTHREAD32 0x1113
2169 #define S_LPROCMIPS 0x1114
2170 #define S_GPROCMIPS 0x1115
2171 #define S_COMPILE2 0x1116 /* compiler command line options and build information */
2172 #define S_MANYREG2 0x1117
2173 #define S_LPROCIA64 0x1118
2174 #define S_GPROCIA64 0x1119
2175 #define S_LOCALSLOT 0x111A
2176 #define S_PARAMSLOT 0x111B
2177 #define S_LMANDATA 0x111C
2178 #define S_GMANDATA 0x111D
2179 #define S_MANFRAMEREL 0x111E
2180 #define S_MANREGISTER 0x111F
2181 #define S_MANSLOT 0x1120
2182 #define S_MANMANYREG 0x1121
2183 #define S_MANREGREL 0x1122
2184 #define S_MANMANYREG2 0x1123
2185 #define S_UNAMESPACE 0x1124
2186 #define S_PROCREF 0x1125 /* didn't get the difference between the two */
2187 #define S_DATAREF 0x1126
2188 #define S_LPROCREF 0x1127
2189 #define S_ANNOTATIONREF 0x1128
2190 #define S_TOKENREF 0x1129
2191 #define S_GMANPROC 0x112A
2192 #define S_LMANPROC 0x112B
2193 #define S_TRAMPOLINE 0x112C
2194 #define S_MANCONSTANT 0x112D
2195 #define S_ATTR_FRAMEREL 0x112E
2196 #define S_ATTR_REGISTER 0x112F
2197 #define S_ATTR_REGREL 0x1130
2198 #define S_ATTR_MANYREG 0x1131
2199 #define S_SEPCODE 0x1132
2200 #define S_LOCAL_2005 0x1133
2201 #define S_DEFRANGE_2005 0x1134
2202 #define S_DEFRANGE2_2005 0x1135
2203 #define S_SECTION 0x1136
2204 #define S_COFFGROUP 0x1137
2205 #define S_EXPORT 0x1138
2206 #define S_CALLSITEINFO 0x1139
2207 #define S_FRAMECOOKIE 0x113A
2208 #define S_DISCARDED 0x113B
2209 #define S_COMPILE3 0x113C
2210 #define S_ENVBLOCK 0x113D
2212 #define S_LOCAL 0x113E
2213 #define S_DEFRANGE 0x113F
2214 #define S_DEFRANGE_SUBFIELD 0x1140
2215 #define S_DEFRANGE_REGISTER 0x1141
2216 #define S_DEFRANGE_FRAMEPOINTER_REL 0x1142
2217 #define S_DEFRANGE_SUBFIELD_REGISTER 0x1143
2218 #define S_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE 0x1144
2219 #define S_DEFRANGE_REGISTER_REL 0x1145
2220 #define S_LPROC32_ID 0x1146
2221 #define S_GPROC32_ID 0x1147
2222 #define S_LPROCMIPS_ID 0x1148
2223 #define S_GPROCMIPS_ID 0x1149
2224 #define S_LPROCIA64_ID 0x114A
2225 #define S_GPROCIA64_ID 0x114B
2226 #define S_BUILDINFO 0x114C
2227 #define S_INLINESITE 0x114D
2228 #define S_INLINESITE_END 0x114E
2229 #define S_PROC_ID_END 0x114F
2230 #define S_DEFRANGE_HLSL 0x1150
2231 #define S_GDATA_HLSL 0x1151
2232 #define S_LDATA_HLSL 0x1152
2234 #define S_FILESTATIC 0x1153
2235 #define S_ARMSWITCHTABLE 0x1159
2236 #define S_CALLEES 0x115A
2237 #define S_CALLERS 0x115B
2238 #define S_POGODATA 0x115C
2239 #define S_INLINESITE2 0x115D
2240 #define S_HEAPALLOCSITE 0x115E
2241 #define S_MOD_TYPEREF 0x115F
2242 #define S_REF_MINIPDB 0x1160
2243 #define S_PDBMAP 0x1161
2244 #define S_GDATA_HLSL32 0x1162
2245 #define S_LDATA_HLSL32 0x1163
2246 #define S_GDATA_HLSL32_EX 0x1164
2247 #define S_LDATA_HLSL32_EX 0x1165
2249 /* not documented yet on MS CV github repo, but that's how LLVM calls it */
2250 #define S_INLINEES 0x1168
2252 /* ======================================== *
2253 * Line number information
2254 * ======================================== */
2256 enum DEBUG_S_SUBSECTION_TYPE
2258 DEBUG_S_IGNORE
= 0x80000000, /* bit flag: when set, ignore whole subsection content */
2260 DEBUG_S_SYMBOLS
= 0xf1,
2262 DEBUG_S_STRINGTABLE
,
2265 DEBUG_S_INLINEELINES
,
2266 DEBUG_S_CROSSSCOPEIMPORTS
,
2267 DEBUG_S_CROSSSCOPEEXPORTS
,
2270 DEBUG_S_FUNC_MDTOKEN_MAP
,
2271 DEBUG_S_TYPE_MDTOKEN_MAP
,
2272 DEBUG_S_MERGED_ASSEMBLYINPUT
,
2274 DEBUG_S_COFF_SYMBOL_RVA
,
2277 struct CV_DebugSSubsectionHeader_t
2279 enum DEBUG_S_SUBSECTION_TYPE type
;
2283 struct CV_DebugSLinesHeader_t
2286 unsigned short segCon
;
2287 unsigned short flags
;
2291 struct CV_DebugSLinesFileBlockHeader_t
2296 /* followed by two variable length arrays
2297 * CV_Line_t lines[nLines];
2298 * ^ columns present when CV_DebugSLinesHeader_t.flags has CV_LINES_HAVE_COLUMNS set
2299 * CV_Column_t columns[nLines];
2303 #define CV_LINES_HAVE_COLUMNS 0x0001
2308 unsigned linenumStart
:24;
2309 unsigned deltaLineEnd
:7;
2310 unsigned fStatement
:1;
2315 unsigned short offColumnStart
;
2316 unsigned short offColumnEnd
;
2319 struct CV_Checksum_t
/* this one is not defined in microsoft pdb information */
2321 unsigned strOffset
; /* offset in string table for filename */
2322 unsigned char size
; /* size of checksum */
2323 unsigned char method
; /* method used to compute check sum */
2324 unsigned char checksum
[0]; /* (size) bytes */
2325 /* result is padded on 4-byte boundary */
2328 #define CV_INLINEE_SOURCE_LINE_SIGNATURE 0x0
2329 #define CV_INLINEE_SOURCE_LINE_SIGNATURE_EX 0x1
2331 typedef struct CV_InlineeSourceLine_t
2333 cv_itemid_t inlinee
; /* function id */
2334 unsigned fileId
; /* offset in DEBUG_S_FILECHKSMS */
2335 unsigned sourceLineNum
; /* first line number */
2336 } InlineeSourceLine
;
2338 typedef struct CV_InlineeSourceLineEx_t
2340 cv_itemid_t inlinee
; /* function id */
2341 unsigned fileId
; /* offset in DEBUG_S_FILECHKSMS */
2342 unsigned sourceLineNum
; /* first line number */
2343 unsigned int countOfExtraFiles
;
2344 unsigned extraFileId
[0];
2345 } InlineeSourceLineEx
;
2348 /* those are Wine only helpers */
2349 /* align ptr on sz boundary; sz must be a power of 2 */
2350 #define CV_ALIGN(ptr, sz) ((const void*)(((DWORD_PTR)(ptr) + ((sz) - 1)) & ~((sz) - 1)))
2351 /* move after (ptr) record */
2352 #define CV_RECORD_AFTER(ptr) ((const void*)((ptr) + 1))
2353 /* move after (ptr) record and a gap of sz bytes */
2354 #define CV_RECORD_GAP(ptr, sz) ((const void*)((const char*)((ptr) + 1) + (sz)))
2355 /* test whether ptr record is within limit boundary */
2356 #define CV_IS_INSIDE(ptr, limit) (CV_RECORD_AFTER(ptr) <= (const void*)(limit))
2357 #endif /* __WINESRC__ */
2359 struct codeview_linetab_block
2362 unsigned short num_lines
;
2363 unsigned int offsets
[1]; /* in fact num_lines */
2364 /* unsigned short linenos[]; */
2373 /* ======================================== *
2374 * PDB file information
2375 * ======================================== */
2378 struct PDB_JG_STREAM
2381 unsigned int unknown
;
2384 struct PDB_JG_HEADER
2387 unsigned int signature
;
2388 unsigned int block_size
;
2389 unsigned short free_list_block
;
2390 unsigned short total_alloc
;
2391 struct PDB_JG_STREAM toc
;
2392 unsigned short toc_block
[1];
2395 struct PDB_DS_HEADER
2398 unsigned int block_size
;
2399 unsigned int free_list_block
;
2400 unsigned int num_blocks
;
2401 unsigned int toc_size
;
2402 unsigned int unknown2
;
2403 unsigned int toc_block
;
2408 unsigned int num_streams
;
2409 struct PDB_JG_STREAM streams
[1];
2414 unsigned int num_streams
;
2415 unsigned int stream_size
[1];
2420 unsigned int Version
;
2421 unsigned int TimeDateStamp
;
2423 unsigned int cbNames
;
2429 unsigned int Version
;
2430 unsigned int TimeDateStamp
;
2433 unsigned int cbNames
;
2437 typedef struct _PDB_TYPES_OLD
2439 unsigned int version
;
2440 unsigned short first_index
;
2441 unsigned short last_index
;
2442 unsigned int type_size
;
2443 unsigned short hash_stream
;
2445 } PDB_TYPES_OLD
, *PPDB_TYPES_OLD
;
2447 typedef struct _PDB_TYPES
2449 unsigned int version
;
2450 unsigned int type_offset
;
2451 unsigned int first_index
;
2452 unsigned int last_index
;
2453 unsigned int type_size
;
2454 unsigned short hash_stream
;
2456 unsigned int hash_value_size
;
2457 unsigned int hash_num_buckets
;
2458 unsigned int hash_offset
;
2459 unsigned int hash_size
;
2460 unsigned int search_offset
;
2461 unsigned int search_size
;
2462 unsigned int type_remap_offset
;
2463 unsigned int type_remap_size
;
2464 } PDB_TYPES
, *PPDB_TYPES
;
2466 typedef struct _PDB_SYMBOL_RANGE
2468 unsigned short segment
;
2469 unsigned short pad1
;
2470 unsigned int offset
;
2472 unsigned int characteristics
;
2473 unsigned short index
;
2474 unsigned short pad2
;
2475 } PDB_SYMBOL_RANGE
, *PPDB_SYMBOL_RANGE
;
2477 typedef struct _PDB_SYMBOL_RANGE_EX
2479 unsigned short segment
;
2480 unsigned short pad1
;
2481 unsigned int offset
;
2483 unsigned int characteristics
;
2484 unsigned short index
;
2485 unsigned short pad2
;
2486 unsigned int timestamp
;
2487 unsigned int unknown
;
2488 } PDB_SYMBOL_RANGE_EX
, *PPDB_SYMBOL_RANGE_EX
;
2490 typedef struct _PDB_SYMBOL_FILE
2492 unsigned int unknown1
;
2493 PDB_SYMBOL_RANGE range
;
2494 unsigned short flag
;
2495 unsigned short stream
;
2496 unsigned int symbol_size
;
2497 unsigned int lineno_size
;
2498 unsigned int lineno2_size
;
2499 unsigned int nSrcFiles
;
2500 unsigned int attribute
;
2502 } PDB_SYMBOL_FILE
, *PPDB_SYMBOL_FILE
;
2504 typedef struct _PDB_SYMBOL_FILE_EX
2506 unsigned int unknown1
;
2507 PDB_SYMBOL_RANGE_EX range
;
2508 unsigned short flag
;
2509 unsigned short stream
;
2510 unsigned int symbol_size
;
2511 unsigned int lineno_size
;
2512 unsigned int lineno2_size
;
2513 unsigned int nSrcFiles
;
2514 unsigned int attribute
;
2515 unsigned int reserved
[2];
2517 } PDB_SYMBOL_FILE_EX
, *PPDB_SYMBOL_FILE_EX
;
2519 typedef struct _PDB_SYMBOL_SOURCE
2521 unsigned short nModules
;
2522 unsigned short nSrcFiles
;
2523 unsigned short table
[1];
2524 } PDB_SYMBOL_SOURCE
, *PPDB_SYMBOL_SOURCE
;
2526 typedef struct _PDB_SYMBOL_IMPORT
2528 unsigned int unknown1
;
2529 unsigned int unknown2
;
2530 unsigned int TimeDateStamp
;
2533 } PDB_SYMBOL_IMPORT
, *PPDB_SYMBOL_IMPORT
;
2535 typedef struct _PDB_SYMBOLS_OLD
2537 unsigned short global_hash_stream
;
2538 unsigned short public_stream
;
2539 unsigned short gsym_stream
;
2541 unsigned int module_size
;
2542 unsigned int sectcontrib_size
;
2543 unsigned int segmap_size
;
2544 unsigned int srcmodule_size
;
2545 } PDB_SYMBOLS_OLD
, *PPDB_SYMBOLS_OLD
;
2547 typedef struct _PDB_SYMBOLS
2549 unsigned int signature
;
2550 unsigned int version
;
2552 unsigned short global_hash_stream
;
2553 unsigned short flags
;
2554 unsigned short public_stream
;
2555 unsigned short bldVer
;
2556 unsigned short gsym_stream
;
2557 unsigned short rbldVer
;
2558 unsigned int module_size
;
2559 unsigned int sectcontrib_size
;
2560 unsigned int segmap_size
;
2561 unsigned int srcmodule_size
;
2562 unsigned int pdbimport_size
;
2563 unsigned int resvd0
;
2564 unsigned int stream_index_size
;
2565 unsigned int unknown2_size
;
2566 unsigned short resvd3
;
2567 unsigned short machine
;
2568 unsigned int resvd4
;
2569 } PDB_SYMBOLS
, *PPDB_SYMBOLS
;
2574 unsigned short unk0
;
2575 unsigned short unk1
;
2576 unsigned short unk2
;
2577 unsigned short unk3
;
2578 unsigned short sections_stream
;
2579 } PDB_STREAM_INDEXES_OLD
;
2584 unsigned short unk0
;
2585 unsigned short unk1
;
2586 unsigned short unk2
;
2587 unsigned short unk3
;
2588 unsigned short sections_stream
;
2589 unsigned short unk4
;
2590 unsigned short unk5
;
2591 unsigned short unk6
;
2592 unsigned short FPO_EXT
;
2593 unsigned short unk7
;
2594 } PDB_STREAM_INDEXES
;
2596 typedef struct _PDB_FPO_DATA
2599 unsigned int func_size
;
2600 unsigned int locals_size
;
2601 unsigned int params_size
;
2602 unsigned int maxstack_size
;
2603 unsigned int str_offset
;
2604 unsigned short prolog_size
;
2605 unsigned short savedregs_size
;
2606 #define PDB_FPO_DFL_SEH 0x00000001
2607 #define PDB_FPO_DFL_EH 0x00000002
2608 #define PDB_FPO_DFL_IN_BLOCK 0x00000004
2612 typedef struct _PDB_STRING_TABLE
2615 unsigned int hash_version
;
2616 unsigned int length
;
2619 /* This header is followed by:
2620 * - a series (of bytes hdr.length) of 0-terminated strings
2621 * - a serialized hash table
2624 /* Header for hash tables inside DBI (aka symbols) stream.
2625 * - The global hash stream contains only the hash table.
2626 * - The public stream contains the same layout for its hash table
2627 * (but other information as well).
2633 unsigned hash_records_size
;
2636 /* This header is followed by:
2637 * - DBI_HASH_RECORDS (on hdr:hash_records_size bytes)
2638 * - a bitmap of DBI_MAX_HASH + 1 entries (on DBI_BITMAP_HASH_SIZE bytes)
2639 * - a table (one entry per present bit in bitmap) as index into hdr:num_records
2648 #define DBI_MAX_HASH 4096
2649 #define DBI_BITMAP_HASH_SIZE ((DBI_MAX_HASH / (8 * sizeof(unsigned)) + 1) * sizeof(unsigned))
2651 /* Header for public stream (from DBI / SYMBOLS stream)
2652 * Followed by a hash table (cf DBI_HASH_HEADER and the following bits)
2657 unsigned address_map_size
;
2658 unsigned num_thunks
;
2659 unsigned thunk_size
;
2660 unsigned short section_thunk_table
;
2661 unsigned short _pad0
;
2662 unsigned offset_thunk_table
;
2663 unsigned num_sections
;
2664 } DBI_PUBLIC_HEADER
;
2666 #include "poppack.h"
2668 /* ===================================================
2669 * The old CodeView stuff (for NB09 and NB11)
2670 * =================================================== */
2672 #define sstModule 0x120
2673 #define sstTypes 0x121
2674 #define sstPublic 0x122
2675 #define sstPublicSym 0x123
2676 #define sstSymbols 0x124
2677 #define sstAlignSym 0x125
2678 #define sstSrcLnSeg 0x126
2679 #define sstSrcModule 0x127
2680 #define sstLibraries 0x128
2681 #define sstGlobalSym 0x129
2682 #define sstGlobalPub 0x12a
2683 #define sstGlobalTypes 0x12b
2684 #define sstMPC 0x12c
2685 #define sstSegMap 0x12d
2686 #define sstSegName 0x12e
2687 #define sstPreComp 0x12f
2688 #define sstFileIndex 0x133
2689 #define sstStaticSym 0x134
2691 /* overall structure information */
2692 typedef struct OMFSignature
2698 typedef struct OMFSignatureRSDS
2706 typedef struct _CODEVIEW_PDB_DATA
2710 unsigned int timestamp
;
2713 } CODEVIEW_PDB_DATA
, *PCODEVIEW_PDB_DATA
;
2715 typedef struct OMFDirHeader
2717 unsigned short cbDirHeader
;
2718 unsigned short cbDirEntry
;
2720 unsigned int lfoNextDir
;
2724 typedef struct OMFDirEntry
2726 unsigned short SubSection
;
2727 unsigned short iMod
;
2732 /* sstModule subsection */
2734 typedef struct OMFSegDesc
2742 typedef struct OMFModule
2744 unsigned short ovlNumber
;
2745 unsigned short iLib
;
2746 unsigned short cSeg
;
2749 OMFSegDesc SegInfo[cSeg];
2754 typedef struct OMFGlobalTypes
2757 unsigned int cTypes
;
2759 unsigned int offset[cTypes];
2764 /* sstGlobalPub section */
2766 /* Header for symbol table */
2767 typedef struct OMFSymHash
2769 unsigned short symhash
;
2770 unsigned short addrhash
;
2771 unsigned int cbSymbol
;
2772 unsigned int cbHSym
;
2773 unsigned int cbHAddr
;
2776 /* sstSegMap section */
2778 typedef struct OMFSegMapDesc
2780 unsigned short flags
;
2782 unsigned short group
;
2783 unsigned short frame
;
2784 unsigned short iSegName
;
2785 unsigned short iClassName
;
2786 unsigned int offset
;
2790 typedef struct OMFSegMap
2792 unsigned short cSeg
;
2793 unsigned short cSegLog
;
2794 /* OMFSegMapDesc rgDesc[0];*/
2798 /* sstSrcModule section */
2800 typedef struct OMFSourceLine
2803 unsigned short cLnOff
;
2804 unsigned int offset
[1];
2805 unsigned short lineNbr
[1];
2808 typedef struct OMFSourceFile
2810 unsigned short cSeg
;
2811 unsigned short reserved
;
2812 unsigned int baseSrcLn
[1];
2813 unsigned short cFName
;
2817 typedef struct OMFSourceModule
2819 unsigned short cFile
;
2820 unsigned short cSeg
;
2821 unsigned int baseSrcFile
[1];