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 files (as a small file
47 * system). The file is split into blocks, an internal file is made
48 * of a set of blocks. Internal files are accessed through
49 * numbers. For example,
50 * 1/ is the ROOT (basic information on the file)
51 * 2/ is the Symbol information (global symbols, local variables...)
52 * 3/ is the Type internal file (each the symbols can have type
53 * information associated with it).
55 * Over the years, three formats existed for the PDB:
56 * - ?? was rather linked to 16 bit code (our support shall be rather
58 * - JG: it's the signature embedded in the file header. This format
59 * has been used in MSVC 2.0 => 5.0.
60 * - DS: it's the signature embedded in the file header. It's the
61 * current format supported my MS.
63 * Types internal stream
64 * ---------------------
65 * Types (from the Type internal file) have existed in three flavors
66 * (note that those flavors came as historical evolution, but there
67 * isn't a one to one link between types evolution and PDB formats'
69 * - the first flavor (suffixed by V1 in this file), where the types
70 * and subtypes are 16 bit entities; and where strings are in Pascal
71 * format (first char is their length and are not 0 terminated)
72 * - the second flavor (suffixed by V2) differs from first flavor with
73 * types and subtypes as 32 bit entities. This forced some
74 * reordering of fields in some types
75 * - the third flavor (suffixed by V3) differs from second flavor with
76 * strings stored as C strings (ie are 0 terminated, instead of
78 * The different flavors can coexist in the same file (is this really
81 * For the evolution of types, the need of the second flavor was the
82 * number of types to be defined (limited to 0xFFFF, including the C
83 * basic types); the need of the third flavor is the increase of
84 * symbol size (to be greater than 256), which was likely needed for
85 * complex C++ types (nested + templates).
87 * It's somehow difficult to represent the layout of those types on
89 * - some integral values are stored as numeric leaf, which size is
90 * variable depending on its value
92 * Symbols internal stream
93 * -----------------------
94 * Here also we find three flavors (that we've suffixed with _V1, _V2
95 * and _V3) even if their evolution is closer to the evolution of
96 * types, they are not completely linked together.
101 #include "pshpack1.h"
103 /* ======================================== *
105 * ======================================== */
109 unsigned char namelen
;
117 unsigned short int len
;
123 unsigned short int len
;
131 unsigned short int len
;
139 unsigned short int len
;
143 struct p_string p_name
;
148 unsigned short int len
;
150 unsigned int datatype
;
151 unsigned int attribute
;
152 struct p_string p_name
;
157 unsigned short int len
;
161 unsigned short int arrlen
; /* numeric leaf */
163 struct p_string p_name
;
169 unsigned short int len
;
171 unsigned int elemtype
;
172 unsigned int idxtype
;
173 unsigned short int arrlen
; /* numeric leaf */
175 struct p_string p_name
;
181 unsigned short int len
;
183 unsigned int elemtype
;
184 unsigned int idxtype
;
185 unsigned short int arrlen
; /* numeric leaf */
193 unsigned short int len
;
200 unsigned short int structlen
; /* numeric leaf */
202 struct p_string p_name
;
208 unsigned short int len
;
212 unsigned int fieldlist
;
213 unsigned int derived
;
215 unsigned short int structlen
; /* numeric leaf */
217 struct p_string p_name
;
223 unsigned short int len
;
227 unsigned int fieldlist
;
228 unsigned int derived
;
230 unsigned short int structlen
; /* numeric leaf */
238 unsigned short int len
;
243 unsigned short int un_len
; /* numeric leaf */
245 struct p_string p_name
;
251 unsigned short int len
;
255 unsigned int fieldlist
;
256 unsigned short int un_len
; /* numeric leaf */
258 struct p_string p_name
;
264 unsigned short int len
;
268 unsigned int fieldlist
;
269 unsigned short int un_len
; /* numeric leaf */
277 unsigned short int len
;
283 struct p_string p_name
;
288 unsigned short int len
;
293 unsigned int fieldlist
;
294 struct p_string p_name
;
299 unsigned short int len
;
304 unsigned int fieldlist
;
310 unsigned short int len
;
312 unsigned short int rvtype
;
314 unsigned char reserved
;
315 unsigned short int params
;
316 unsigned short int arglist
;
321 unsigned short int len
;
325 unsigned char reserved
;
326 unsigned short int params
;
327 unsigned int arglist
;
332 unsigned short int len
;
334 unsigned short int rvtype
;
335 unsigned short int class_type
;
336 unsigned short int this_type
;
338 unsigned char reserved
;
339 unsigned short int params
;
340 unsigned short int arglist
;
341 unsigned int this_adjust
;
346 unsigned short int len
;
349 unsigned int class_type
;
352 unsigned char reserved
;
353 unsigned short params
;
354 unsigned int arglist
;
355 unsigned int this_adjust
;
359 union codeview_reftype
363 unsigned short int len
;
369 unsigned short int len
;
371 unsigned char list
[1];
376 unsigned short int len
;
379 unsigned char bitoff
;
385 unsigned short int len
;
389 unsigned char bitoff
;
394 unsigned short int len
;
397 unsigned short args
[1];
402 unsigned short int len
;
410 unsigned short int len
;
413 unsigned short drvdcls
[1];
418 unsigned short int len
;
425 union codeview_fieldtype
437 unsigned short int offset
; /* numeric leaf */
445 unsigned short int offset
; /* numeric leaf */
454 unsigned short int vbpoff
; /* numeric leaf */
456 unsigned short int vboff
; /* numeric leaf */
466 unsigned short int vbpoff
; /* numeric leaf */
468 unsigned short int vboff
; /* numeric leaf */
476 unsigned short int value
; /* numeric leaf */
478 struct p_string p_name
;
486 unsigned short int value
; /* numeric leaf */
496 struct p_string p_name
;
504 struct p_string p_name
;
512 unsigned short int offset
; /* numeric leaf */
514 struct p_string p_name
;
523 unsigned short int offset
; /* numeric leaf */
525 struct p_string p_name
;
534 unsigned short int offset
; /* numeric leaf */
536 unsigned char name
[1];
546 struct p_string p_name
;
554 struct p_string p_name
;
570 struct p_string p_name
;
578 struct p_string p_name
;
593 struct p_string p_name
;
601 struct p_string p_name
;
643 struct p_string p_name
;
651 struct p_string p_name
;
667 unsigned int vtab_offset
;
668 struct p_string p_name
;
676 unsigned int vtab_offset
;
677 struct p_string p_name
;
685 unsigned int vtab_offset
;
709 struct p_string p_name
;
717 struct p_string p_name
;
725 struct p_string p_name
;
744 * This covers the basic datatypes that VC++ seems to be using these days.
745 * 32 bit mode only. There are additional numbers for the pointers in 16
746 * bit mode. There are many other types listed in the documents, but these
747 * are apparently not used by the compiler, or represent pointer types
750 * Official MS documentation says that type (< 0x4000, so 12 bits) is made of:
751 * +----------+------+------+----------+------+
752 * | 11 | 10-8 | 7-4 | 3 | 2-0 |
753 * +----------+------+------+----------+------+
754 * | reserved | mode | type | reserved | size |
755 * +----------+------+------+----------+------+
756 * In recent PDB files, type 8 exists, and is seen as an HRESULT... So we've
757 * added this basic type... as if bit 3 had been integrated into the size field
760 /* the type number of a built-in type is a 16-bit value specified in the following format:
761 bit # | 11 | 10-8 | 7-4 | 3 | 2-0 |
762 field | reserved | mode | type | reserved | size |
765 <type> is one of the following types:
767 0x01 Signed integral value
768 0x02 Unsigned integral value
781 0x0f Reserved for debugger expression evaluator
783 <size> is an enumerated value for each of the types.
789 0x04 Basic 8-byte currency value
790 0x05 Near Basic string
791 0x06 Far Basic string
792 0x07 Untranslated type from previous Microsoft symbol formats
793 Type = signed/unsigned integral and Boolean values
802 Type = real and complex
817 0x02 2-byte signed integer
818 0x03 2-byte unsigned integer
819 0x04 4-byte signed integer
820 0x05 4-byte unsigned integer
821 0x06 8-byte signed integer
822 0x07 8-byte unsigned integer
824 <mode> is the pointer mode:
825 0x00 Direct; not a pointer
829 0x04 32-bit near pointer
830 0x05 32-bit far pointer
831 0x06 64-bit near pointer
836 #define T_NOTYPE 0x0000 /* Notype */
837 #define T_ABS 0x0001 /* Abs */
838 #define T_SEGMENT 0x0002 /* segment type */
839 #define T_VOID 0x0003 /* Void */
840 #define T_CURRENCY 0x0004 /* basic 8-byte currency value */
841 #define T_NBASICSTR 0x0005 /* near basic string */
842 #define T_FBASICSTR 0x0006 /* far basic string */
843 #define T_NOTTRANS 0x0007 /* untranslated type record from MS symbol format */
844 #define T_HRESULT 0x0008 /* HRESULT - or error code ??? */
845 #define T_CHAR 0x0010 /* signed char */
846 #define T_SHORT 0x0011 /* short */
847 #define T_LONG 0x0012 /* long */
848 #define T_QUAD 0x0013 /* long long */
849 #define T_UCHAR 0x0020 /* unsigned char */
850 #define T_USHORT 0x0021 /* unsigned short */
851 #define T_ULONG 0x0022 /* unsigned long */
852 #define T_UQUAD 0x0023 /* unsigned long long */
853 #define T_BOOL08 0x0030 /* 8-bit boolean */
854 #define T_BOOL16 0x0031 /* 16-bit boolean */
855 #define T_BOOL32 0x0032 /* 32-bit boolean */
856 #define T_BOOL64 0x0033 /* 64-bit boolean */
857 #define T_REAL32 0x0040 /* float */
858 #define T_REAL64 0x0041 /* double */
859 #define T_REAL80 0x0042 /* 80-bit real */
860 #define T_REAL128 0x0043 /* 128-bit real */
861 #define T_REAL48 0x0044 /* 48-bit real */
862 #define T_CPLX32 0x0050 /* 32-bit complex number */
863 #define T_CPLX64 0x0051 /* 64-bit complex number */
864 #define T_CPLX80 0x0052 /* 80-bit complex number */
865 #define T_CPLX128 0x0053 /* 128-bit complex number */
866 #define T_BIT 0x0060 /* bit */
867 #define T_PASCHAR 0x0061 /* pascal CHAR */
868 #define T_RCHAR 0x0070 /* real char */
869 #define T_WCHAR 0x0071 /* wide char */
870 #define T_INT2 0x0072 /* real 16-bit signed int */
871 #define T_UINT2 0x0073 /* real 16-bit unsigned int */
872 #define T_INT4 0x0074 /* int */
873 #define T_UINT4 0x0075 /* unsigned int */
874 #define T_INT8 0x0076 /* 64-bit signed int */
875 #define T_UINT8 0x0077 /* 64-bit unsigned int */
876 #define T_CHAR16 0x007a /* 16-bit unicode char */
877 #define T_CHAR32 0x007b /* 32-bit unicode char */
879 /* near pointers to basic types */
880 #define T_PVOID 0x0103 /* near pointer to void */
881 #define T_PCHAR 0x0110 /* Near pointer to 8-bit signed */
882 #define T_PSHORT 0x0111 /* Near pointer to 16-bit signed */
883 #define T_PLONG 0x0112 /* Near pointer to 32-bit signed */
884 #define T_PQUAD 0x0113 /* Near pointer to 64-bit signed */
885 #define T_PUCHAR 0x0120 /* Near pointer to 8-bit unsigned */
886 #define T_PUSHORT 0x0121 /* Near pointer to 16-bit unsigned */
887 #define T_PULONG 0x0122 /* Near pointer to 32-bit unsigned */
888 #define T_PUQUAD 0x0123 /* Near pointer to 64-bit unsigned */
889 #define T_PBOOL08 0x0130 /* Near pointer to 8-bit Boolean */
890 #define T_PBOOL16 0x0131 /* Near pointer to 16-bit Boolean */
891 #define T_PBOOL32 0x0132 /* Near pointer to 32-bit Boolean */
892 #define T_PBOOL64 0x0133 /* Near pointer to 64-bit Boolean */
893 #define T_PREAL32 0x0140 /* Near pointer to 32-bit real */
894 #define T_PREAL64 0x0141 /* Near pointer to 64-bit real */
895 #define T_PREAL80 0x0142 /* Near pointer to 80-bit real */
896 #define T_PREAL128 0x0143 /* Near pointer to 128-bit real */
897 #define T_PREAL48 0x0144 /* Near pointer to 48-bit real */
898 #define T_PCPLX32 0x0150 /* Near pointer to 32-bit complex */
899 #define T_PCPLX64 0x0151 /* Near pointer to 64-bit complex */
900 #define T_PCPLX80 0x0152 /* Near pointer to 80-bit complex */
901 #define T_PCPLX128 0x0153 /* Near pointer to 128-bit complex */
902 #define T_PRCHAR 0x0170 /* Near pointer to a real char */
903 #define T_PWCHAR 0x0171 /* Near pointer to a wide char */
904 #define T_PINT2 0x0172 /* Near pointer to 16-bit signed int */
905 #define T_PUINT2 0x0173 /* Near pointer to 16-bit unsigned int */
906 #define T_PINT4 0x0174 /* Near pointer to 32-bit signed int */
907 #define T_PUINT4 0x0175 /* Near pointer to 32-bit unsigned int */
908 #define T_PINT8 0x0176 /* Near pointer to 64-bit signed int */
909 #define T_PUINT8 0x0177 /* Near pointer to 64-bit unsigned int */
910 #define T_PCHAR16 0x017a /* Near pointer to 16-bit unicode char */
911 #define T_PCHAR32 0x017b /* Near pointer to 32-bit unicode char */
913 /* far pointers to basic types */
914 #define T_PFVOID 0x0203 /* Far pointer to void */
915 #define T_PFCHAR 0x0210 /* Far pointer to 8-bit signed */
916 #define T_PFSHORT 0x0211 /* Far pointer to 16-bit signed */
917 #define T_PFLONG 0x0212 /* Far pointer to 32-bit signed */
918 #define T_PFQUAD 0x0213 /* Far pointer to 64-bit signed */
919 #define T_PFUCHAR 0x0220 /* Far pointer to 8-bit unsigned */
920 #define T_PFUSHORT 0x0221 /* Far pointer to 16-bit unsigned */
921 #define T_PFULONG 0x0222 /* Far pointer to 32-bit unsigned */
922 #define T_PFUQUAD 0x0223 /* Far pointer to 64-bit unsigned */
923 #define T_PFBOOL08 0x0230 /* Far pointer to 8-bit Boolean */
924 #define T_PFBOOL16 0x0231 /* Far pointer to 16-bit Boolean */
925 #define T_PFBOOL32 0x0232 /* Far pointer to 32-bit Boolean */
926 #define T_PFBOOL64 0x0233 /* Far pointer to 64-bit Boolean */
927 #define T_PFREAL32 0x0240 /* Far pointer to 32-bit real */
928 #define T_PFREAL64 0x0241 /* Far pointer to 64-bit real */
929 #define T_PFREAL80 0x0242 /* Far pointer to 80-bit real */
930 #define T_PFREAL128 0x0243 /* Far pointer to 128-bit real */
931 #define T_PFREAL48 0x0244 /* Far pointer to 48-bit real */
932 #define T_PFCPLX32 0x0250 /* Far pointer to 32-bit complex */
933 #define T_PFCPLX64 0x0251 /* Far pointer to 64-bit complex */
934 #define T_PFCPLX80 0x0252 /* Far pointer to 80-bit complex */
935 #define T_PFCPLX128 0x0253 /* Far pointer to 128-bit complex */
936 #define T_PFRCHAR 0x0270 /* Far pointer to a real char */
937 #define T_PFWCHAR 0x0271 /* Far pointer to a wide char */
938 #define T_PFINT2 0x0272 /* Far pointer to 16-bit signed int */
939 #define T_PFUINT2 0x0273 /* Far pointer to 16-bit unsigned int */
940 #define T_PFINT4 0x0274 /* Far pointer to 32-bit signed int */
941 #define T_PFUINT4 0x0275 /* Far pointer to 32-bit unsigned int */
942 #define T_PFINT8 0x0276 /* Far pointer to 64-bit signed int */
943 #define T_PFUINT8 0x0277 /* Far pointer to 64-bit unsigned int */
944 #define T_PFCHAR16 0x027a /* Far pointer to 16-bit unicode char */
945 #define T_PFCHAR32 0x027b /* Far pointer to 32-bit unicode char */
947 /* huge pointers to basic types */
948 #define T_PHVOID 0x0303 /* Huge pointer to void */
949 #define T_PHCHAR 0x0310 /* Huge pointer to 8-bit signed */
950 #define T_PHSHORT 0x0311 /* Huge pointer to 16-bit signed */
951 #define T_PHLONG 0x0312 /* Huge pointer to 32-bit signed */
952 #define T_PHQUAD 0x0313 /* Huge pointer to 64-bit signed */
953 #define T_PHUCHAR 0x0320 /* Huge pointer to 8-bit unsigned */
954 #define T_PHUSHORT 0x0321 /* Huge pointer to 16-bit unsigned */
955 #define T_PHULONG 0x0322 /* Huge pointer to 32-bit unsigned */
956 #define T_PHUQUAD 0x0323 /* Huge pointer to 64-bit unsigned */
957 #define T_PHBOOL08 0x0330 /* Huge pointer to 8-bit Boolean */
958 #define T_PHBOOL16 0x0331 /* Huge pointer to 16-bit Boolean */
959 #define T_PHBOOL32 0x0332 /* Huge pointer to 32-bit Boolean */
960 #define T_PHBOOL64 0x0333 /* Huge pointer to 64-bit Boolean */
961 #define T_PHREAL32 0x0340 /* Huge pointer to 32-bit real */
962 #define T_PHREAL64 0x0341 /* Huge pointer to 64-bit real */
963 #define T_PHREAL80 0x0342 /* Huge pointer to 80-bit real */
964 #define T_PHREAL128 0x0343 /* Huge pointer to 128-bit real */
965 #define T_PHREAL48 0x0344 /* Huge pointer to 48-bit real */
966 #define T_PHCPLX32 0x0350 /* Huge pointer to 32-bit complex */
967 #define T_PHCPLX64 0x0351 /* Huge pointer to 64-bit complex */
968 #define T_PHCPLX80 0x0352 /* Huge pointer to 80-bit complex */
969 #define T_PHCPLX128 0x0353 /* Huge pointer to 128-bit real */
970 #define T_PHRCHAR 0x0370 /* Huge pointer to a real char */
971 #define T_PHWCHAR 0x0371 /* Huge pointer to a wide char */
972 #define T_PHINT2 0x0372 /* Huge pointer to 16-bit signed int */
973 #define T_PHUINT2 0x0373 /* Huge pointer to 16-bit unsigned int */
974 #define T_PHINT4 0x0374 /* Huge pointer to 32-bit signed int */
975 #define T_PHUINT4 0x0375 /* Huge pointer to 32-bit unsigned int */
976 #define T_PHINT8 0x0376 /* Huge pointer to 64-bit signed int */
977 #define T_PHUINT8 0x0377 /* Huge pointer to 64-bit unsigned int */
978 #define T_PHCHAR16 0x037a /* Huge pointer to 16-bit unicode char */
979 #define T_PHCHAR32 0x037b /* Huge pointer to 32-bit unicode char */
981 /* 32-bit near pointers to basic types */
982 #define T_32PVOID 0x0403 /* 32-bit near pointer to void */
983 #define T_32PHRESULT 0x0408 /* 16:32 near pointer to HRESULT - or error code ??? */
984 #define T_32PCHAR 0x0410 /* 16:32 near pointer to 8-bit signed */
985 #define T_32PSHORT 0x0411 /* 16:32 near pointer to 16-bit signed */
986 #define T_32PLONG 0x0412 /* 16:32 near pointer to 32-bit signed */
987 #define T_32PQUAD 0x0413 /* 16:32 near pointer to 64-bit signed */
988 #define T_32PUCHAR 0x0420 /* 16:32 near pointer to 8-bit unsigned */
989 #define T_32PUSHORT 0x0421 /* 16:32 near pointer to 16-bit unsigned */
990 #define T_32PULONG 0x0422 /* 16:32 near pointer to 32-bit unsigned */
991 #define T_32PUQUAD 0x0423 /* 16:32 near pointer to 64-bit unsigned */
992 #define T_32PBOOL08 0x0430 /* 16:32 near pointer to 8-bit Boolean */
993 #define T_32PBOOL16 0x0431 /* 16:32 near pointer to 16-bit Boolean */
994 #define T_32PBOOL32 0x0432 /* 16:32 near pointer to 32-bit Boolean */
995 #define T_32PBOOL64 0x0433 /* 16:32 near pointer to 64-bit Boolean */
996 #define T_32PREAL32 0x0440 /* 16:32 near pointer to 32-bit real */
997 #define T_32PREAL64 0x0441 /* 16:32 near pointer to 64-bit real */
998 #define T_32PREAL80 0x0442 /* 16:32 near pointer to 80-bit real */
999 #define T_32PREAL128 0x0443 /* 16:32 near pointer to 128-bit real */
1000 #define T_32PREAL48 0x0444 /* 16:32 near pointer to 48-bit real */
1001 #define T_32PCPLX32 0x0450 /* 16:32 near pointer to 32-bit complex */
1002 #define T_32PCPLX64 0x0451 /* 16:32 near pointer to 64-bit complex */
1003 #define T_32PCPLX80 0x0452 /* 16:32 near pointer to 80-bit complex */
1004 #define T_32PCPLX128 0x0453 /* 16:32 near pointer to 128-bit complex */
1005 #define T_32PRCHAR 0x0470 /* 16:32 near pointer to a real char */
1006 #define T_32PWCHAR 0x0471 /* 16:32 near pointer to a wide char */
1007 #define T_32PINT2 0x0472 /* 16:32 near pointer to 16-bit signed int */
1008 #define T_32PUINT2 0x0473 /* 16:32 near pointer to 16-bit unsigned int */
1009 #define T_32PINT4 0x0474 /* 16:32 near pointer to 32-bit signed int */
1010 #define T_32PUINT4 0x0475 /* 16:32 near pointer to 32-bit unsigned int */
1011 #define T_32PINT8 0x0476 /* 16:32 near pointer to 64-bit signed int */
1012 #define T_32PUINT8 0x0477 /* 16:32 near pointer to 64-bit unsigned int */
1013 #define T_32PCHAR16 0x047a /* 16:32 near pointer to 16-bit unicode char */
1014 #define T_32PCHAR32 0x047b /* 16:32 near pointer to 32-bit unicode char */
1016 /* 32-bit far pointers to basic types */
1017 #define T_32PFVOID 0x0503 /* 32-bit far pointer to void */
1018 #define T_32PFHRESULT 0x0508 /* 16:32 far pointer to HRESULT - or error code ??? */
1019 #define T_32PFCHAR 0x0510 /* 16:32 far pointer to 8-bit signed */
1020 #define T_32PFSHORT 0x0511 /* 16:32 far pointer to 16-bit signed */
1021 #define T_32PFLONG 0x0512 /* 16:32 far pointer to 32-bit signed */
1022 #define T_32PFQUAD 0x0513 /* 16:32 far pointer to 64-bit signed */
1023 #define T_32PFUCHAR 0x0520 /* 16:32 far pointer to 8-bit unsigned */
1024 #define T_32PFUSHORT 0x0521 /* 16:32 far pointer to 16-bit unsigned */
1025 #define T_32PFULONG 0x0522 /* 16:32 far pointer to 32-bit unsigned */
1026 #define T_32PFUQUAD 0x0523 /* 16:32 far pointer to 64-bit unsigned */
1027 #define T_32PFBOOL08 0x0530 /* 16:32 far pointer to 8-bit Boolean */
1028 #define T_32PFBOOL16 0x0531 /* 16:32 far pointer to 16-bit Boolean */
1029 #define T_32PFBOOL32 0x0532 /* 16:32 far pointer to 32-bit Boolean */
1030 #define T_32PFBOOL64 0x0533 /* 16:32 far pointer to 64-bit Boolean */
1031 #define T_32PFREAL32 0x0540 /* 16:32 far pointer to 32-bit real */
1032 #define T_32PFREAL64 0x0541 /* 16:32 far pointer to 64-bit real */
1033 #define T_32PFREAL80 0x0542 /* 16:32 far pointer to 80-bit real */
1034 #define T_32PFREAL128 0x0543 /* 16:32 far pointer to 128-bit real */
1035 #define T_32PFREAL48 0x0544 /* 16:32 far pointer to 48-bit real */
1036 #define T_32PFCPLX32 0x0550 /* 16:32 far pointer to 32-bit complex */
1037 #define T_32PFCPLX64 0x0551 /* 16:32 far pointer to 64-bit complex */
1038 #define T_32PFCPLX80 0x0552 /* 16:32 far pointer to 80-bit complex */
1039 #define T_32PFCPLX128 0x0553 /* 16:32 far pointer to 128-bit complex */
1040 #define T_32PFRCHAR 0x0570 /* 16:32 far pointer to a real char */
1041 #define T_32PFWCHAR 0x0571 /* 16:32 far pointer to a wide char */
1042 #define T_32PFINT2 0x0572 /* 16:32 far pointer to 16-bit signed int */
1043 #define T_32PFUINT2 0x0573 /* 16:32 far pointer to 16-bit unsigned int */
1044 #define T_32PFINT4 0x0574 /* 16:32 far pointer to 32-bit signed int */
1045 #define T_32PFUINT4 0x0575 /* 16:32 far pointer to 32-bit unsigned int */
1046 #define T_32PFINT8 0x0576 /* 16:32 far pointer to 64-bit signed int */
1047 #define T_32PFUINT8 0x0577 /* 16:32 far pointer to 64-bit unsigned int */
1048 #define T_32PFCHAR16 0x057a /* 16:32 far pointer to 16-bit unicode char */
1049 #define T_32PFCHAR32 0x057b /* 16:32 far pointer to 32-bit unicode char */
1051 /* 64-bit near pointers to basic types */
1052 #define T_64PVOID 0x0603 /* 64-bit near pointer to void */
1053 #define T_64PHRESULT 0x0608 /* 64 near pointer to HRESULT - or error code ??? */
1054 #define T_64PCHAR 0x0610 /* 64 near pointer to 8-bit signed */
1055 #define T_64PSHORT 0x0611 /* 64 near pointer to 16-bit signed */
1056 #define T_64PLONG 0x0612 /* 64 near pointer to 32-bit signed */
1057 #define T_64PQUAD 0x0613 /* 64 near pointer to 64-bit signed */
1058 #define T_64PUCHAR 0x0620 /* 64 near pointer to 8-bit unsigned */
1059 #define T_64PUSHORT 0x0621 /* 64 near pointer to 16-bit unsigned */
1060 #define T_64PULONG 0x0622 /* 64 near pointer to 32-bit unsigned */
1061 #define T_64PUQUAD 0x0623 /* 64 near pointer to 64-bit unsigned */
1062 #define T_64PBOOL08 0x0630 /* 64 near pointer to 8-bit Boolean */
1063 #define T_64PBOOL16 0x0631 /* 64 near pointer to 16-bit Boolean */
1064 #define T_64PBOOL32 0x0632 /* 64 near pointer to 32-bit Boolean */
1065 #define T_64PBOOL64 0x0633 /* 64 near pointer to 64-bit Boolean */
1066 #define T_64PREAL32 0x0640 /* 64 near pointer to 32-bit real */
1067 #define T_64PREAL64 0x0641 /* 64 near pointer to 64-bit real */
1068 #define T_64PREAL80 0x0642 /* 64 near pointer to 80-bit real */
1069 #define T_64PREAL128 0x0643 /* 64 near pointer to 128-bit real */
1070 #define T_64PREAL48 0x0644 /* 64 near pointer to 48-bit real */
1071 #define T_64PCPLX32 0x0650 /* 64 near pointer to 32-bit complex */
1072 #define T_64PCPLX64 0x0651 /* 64 near pointer to 64-bit complex */
1073 #define T_64PCPLX80 0x0652 /* 64 near pointer to 80-bit complex */
1074 #define T_64PCPLX128 0x0653 /* 64 near pointer to 128-bit complex */
1075 #define T_64PRCHAR 0x0670 /* 64 near pointer to a real char */
1076 #define T_64PWCHAR 0x0671 /* 64 near pointer to a wide char */
1077 #define T_64PINT2 0x0672 /* 64 near pointer to 16-bit signed int */
1078 #define T_64PUINT2 0x0673 /* 64 near pointer to 16-bit unsigned int */
1079 #define T_64PINT4 0x0674 /* 64 near pointer to 32-bit signed int */
1080 #define T_64PUINT4 0x0675 /* 64 near pointer to 32-bit unsigned int */
1081 #define T_64PINT8 0x0676 /* 64 near pointer to 64-bit signed int */
1082 #define T_64PUINT8 0x0677 /* 64 near pointer to 64-bit unsigned int */
1083 #define T_64PCHAR16 0x067a /* 64 near pointer to 16-bit unicode char */
1084 #define T_64PCHAR32 0x067b /* 64 near pointer to 32-bit unicode char */
1086 /* counts, bit masks, and shift values needed to access various parts of the built-in type numbers */
1087 #define T_MAXPREDEFINEDTYPE 0x0580 /* maximum type index for all built-in types */
1088 #define T_MAXBASICTYPE 0x0080 /* maximum type index all non-pointer built-in types */
1089 #define T_BASICTYPE_MASK 0x00ff /* mask of bits that can potentially identify a non-pointer basic type */
1090 #define T_BASICTYPE_SHIFT 8 /* shift count to push out the basic type bits from a type number */
1091 #define T_MODE_MASK 0x0700 /* type mode mask (ptr/non-ptr) */
1092 #define T_SIZE_MASK 0x0007 /* type size mask (depends on 'type' value) */
1093 #define T_TYPE_MASK 0x00f0 /* type type mask (data treatment mode) */
1095 /* bit patterns for the <mode> portion of a built-in type number */
1096 #define T_NEARPTR_BITS 0x0100
1097 #define T_FARPTR_BITS 0x0200
1098 #define T_HUGEPTR_BITS 0x0300
1099 #define T_NEAR32PTR_BITS 0x0400
1100 #define T_FAR32PTR_BITS 0x0500
1101 #define T_NEAR64PTR_BITS 0x0600
1103 #define LF_MODIFIER_V1 0x0001
1104 #define LF_POINTER_V1 0x0002
1105 #define LF_ARRAY_V1 0x0003
1106 #define LF_CLASS_V1 0x0004
1107 #define LF_STRUCTURE_V1 0x0005
1108 #define LF_UNION_V1 0x0006
1109 #define LF_ENUM_V1 0x0007
1110 #define LF_PROCEDURE_V1 0x0008
1111 #define LF_MFUNCTION_V1 0x0009
1112 #define LF_VTSHAPE_V1 0x000a
1113 #define LF_COBOL0_V1 0x000b
1114 #define LF_COBOL1_V1 0x000c
1115 #define LF_BARRAY_V1 0x000d
1116 #define LF_LABEL_V1 0x000e
1117 #define LF_NULL_V1 0x000f
1118 #define LF_NOTTRAN_V1 0x0010
1119 #define LF_DIMARRAY_V1 0x0011
1120 #define LF_VFTPATH_V1 0x0012
1121 #define LF_PRECOMP_V1 0x0013
1122 #define LF_ENDPRECOMP_V1 0x0014
1123 #define LF_OEM_V1 0x0015
1124 #define LF_TYPESERVER_V1 0x0016
1126 #define LF_MODIFIER_V2 0x1001 /* variants with new 32-bit type indices (V2) */
1127 #define LF_POINTER_V2 0x1002
1128 #define LF_ARRAY_V2 0x1003
1129 #define LF_CLASS_V2 0x1004
1130 #define LF_STRUCTURE_V2 0x1005
1131 #define LF_UNION_V2 0x1006
1132 #define LF_ENUM_V2 0x1007
1133 #define LF_PROCEDURE_V2 0x1008
1134 #define LF_MFUNCTION_V2 0x1009
1135 #define LF_COBOL0_V2 0x100a
1136 #define LF_BARRAY_V2 0x100b
1137 #define LF_DIMARRAY_V2 0x100c
1138 #define LF_VFTPATH_V2 0x100d
1139 #define LF_PRECOMP_V2 0x100e
1140 #define LF_OEM_V2 0x100f
1142 #define LF_SKIP_V1 0x0200
1143 #define LF_ARGLIST_V1 0x0201
1144 #define LF_DEFARG_V1 0x0202
1145 #define LF_LIST_V1 0x0203
1146 #define LF_FIELDLIST_V1 0x0204
1147 #define LF_DERIVED_V1 0x0205
1148 #define LF_BITFIELD_V1 0x0206
1149 #define LF_METHODLIST_V1 0x0207
1150 #define LF_DIMCONU_V1 0x0208
1151 #define LF_DIMCONLU_V1 0x0209
1152 #define LF_DIMVARU_V1 0x020a
1153 #define LF_DIMVARLU_V1 0x020b
1154 #define LF_REFSYM_V1 0x020c
1156 #define LF_SKIP_V2 0x1200 /* variants with new 32-bit type indices (V2) */
1157 #define LF_ARGLIST_V2 0x1201
1158 #define LF_DEFARG_V2 0x1202
1159 #define LF_FIELDLIST_V2 0x1203
1160 #define LF_DERIVED_V2 0x1204
1161 #define LF_BITFIELD_V2 0x1205
1162 #define LF_METHODLIST_V2 0x1206
1163 #define LF_DIMCONU_V2 0x1207
1164 #define LF_DIMCONLU_V2 0x1208
1165 #define LF_DIMVARU_V2 0x1209
1166 #define LF_DIMVARLU_V2 0x120a
1169 #define LF_BCLASS_V1 0x0400
1170 #define LF_VBCLASS_V1 0x0401
1171 #define LF_IVBCLASS_V1 0x0402
1172 #define LF_ENUMERATE_V1 0x0403
1173 #define LF_FRIENDFCN_V1 0x0404
1174 #define LF_INDEX_V1 0x0405
1175 #define LF_MEMBER_V1 0x0406
1176 #define LF_STMEMBER_V1 0x0407
1177 #define LF_METHOD_V1 0x0408
1178 #define LF_NESTTYPE_V1 0x0409
1179 #define LF_VFUNCTAB_V1 0x040a
1180 #define LF_FRIENDCLS_V1 0x040b
1181 #define LF_ONEMETHOD_V1 0x040c
1182 #define LF_VFUNCOFF_V1 0x040d
1183 #define LF_NESTTYPEEX_V1 0x040e
1184 #define LF_MEMBERMODIFY_V1 0x040f
1186 #define LF_BCLASS_V2 0x1400 /* variants with new 32-bit type indices (V2) */
1187 #define LF_VBCLASS_V2 0x1401
1188 #define LF_IVBCLASS_V2 0x1402
1189 #define LF_FRIENDFCN_V2 0x1403
1190 #define LF_INDEX_V2 0x1404
1191 #define LF_MEMBER_V2 0x1405
1192 #define LF_STMEMBER_V2 0x1406
1193 #define LF_METHOD_V2 0x1407
1194 #define LF_NESTTYPE_V2 0x1408
1195 #define LF_VFUNCTAB_V2 0x1409
1196 #define LF_FRIENDCLS_V2 0x140a
1197 #define LF_ONEMETHOD_V2 0x140b
1198 #define LF_VFUNCOFF_V2 0x140c
1199 #define LF_NESTTYPEEX_V2 0x140d
1201 #define LF_ENUMERATE_V3 0x1502
1202 #define LF_ARRAY_V3 0x1503
1203 #define LF_CLASS_V3 0x1504
1204 #define LF_STRUCTURE_V3 0x1505
1205 #define LF_UNION_V3 0x1506
1206 #define LF_ENUM_V3 0x1507
1207 #define LF_MEMBER_V3 0x150d
1208 #define LF_STMEMBER_V3 0x150e
1209 #define LF_METHOD_V3 0x150f
1210 #define LF_NESTTYPE_V3 0x1510
1211 #define LF_ONEMETHOD_V3 0x1511
1213 #define LF_NUMERIC 0x8000 /* numeric leaf types */
1214 #define LF_CHAR 0x8000
1215 #define LF_SHORT 0x8001
1216 #define LF_USHORT 0x8002
1217 #define LF_LONG 0x8003
1218 #define LF_ULONG 0x8004
1219 #define LF_REAL32 0x8005
1220 #define LF_REAL64 0x8006
1221 #define LF_REAL80 0x8007
1222 #define LF_REAL128 0x8008
1223 #define LF_QUADWORD 0x8009
1224 #define LF_UQUADWORD 0x800a
1225 #define LF_REAL48 0x800b
1226 #define LF_COMPLEX32 0x800c
1227 #define LF_COMPLEX64 0x800d
1228 #define LF_COMPLEX80 0x800e
1229 #define LF_COMPLEX128 0x800f
1230 #define LF_VARSTRING 0x8010
1232 /* ======================================== *
1233 * Symbol information
1234 * ======================================== */
1236 union codeview_symbol
1248 unsigned int offset
;
1249 unsigned short segment
;
1250 unsigned short symtype
;
1251 struct p_string p_name
;
1258 unsigned int symtype
;
1259 unsigned int offset
;
1260 unsigned short segment
;
1261 struct p_string p_name
;
1268 unsigned int symtype
;
1269 unsigned int offset
;
1270 unsigned short segment
;
1278 unsigned int pparent
;
1281 unsigned int offset
;
1282 unsigned short segment
;
1283 unsigned short thunk_len
;
1284 unsigned char thtype
;
1285 struct p_string p_name
;
1292 unsigned int pparent
;
1295 unsigned int offset
;
1296 unsigned short segment
;
1297 unsigned short thunk_len
;
1298 unsigned char thtype
;
1306 unsigned int pparent
;
1309 unsigned int proc_len
;
1310 unsigned int debug_start
;
1311 unsigned int debug_end
;
1312 unsigned int offset
;
1313 unsigned short segment
;
1314 unsigned short proctype
;
1315 unsigned char flags
;
1316 struct p_string p_name
;
1323 unsigned int pparent
;
1326 unsigned int proc_len
;
1327 unsigned int debug_start
;
1328 unsigned int debug_end
;
1329 unsigned int proctype
;
1330 unsigned int offset
;
1331 unsigned short segment
;
1332 unsigned char flags
;
1333 struct p_string p_name
;
1340 unsigned int pparent
;
1343 unsigned int proc_len
;
1344 unsigned int debug_start
;
1345 unsigned int debug_end
;
1346 unsigned int proctype
;
1347 unsigned int offset
;
1348 unsigned short segment
;
1349 unsigned char flags
;
1357 unsigned int offset
;
1358 unsigned short segment
;
1359 unsigned short symtype
;
1360 struct p_string p_name
;
1367 unsigned int symtype
;
1368 unsigned int offset
;
1369 unsigned short segment
;
1370 struct p_string p_name
;
1377 unsigned int symtype
;
1378 unsigned int offset
;
1379 unsigned short segment
;
1385 short int len
; /* Total length of this entry */
1386 short int id
; /* Always S_BPREL_V1 */
1387 unsigned int offset
; /* Stack offset relative to BP */
1388 unsigned short symtype
;
1389 struct p_string p_name
;
1394 short int len
; /* Total length of this entry */
1395 short int id
; /* Always S_BPREL_V2 */
1396 unsigned int offset
; /* Stack offset relative to EBP */
1397 unsigned int symtype
;
1398 struct p_string p_name
;
1403 short int len
; /* Total length of this entry */
1404 short int id
; /* Always S_BPREL_V3 */
1405 int offset
; /* Stack offset relative to BP */
1406 unsigned int symtype
;
1412 short int len
; /* Total length of this entry */
1413 short int id
; /* Always S_BPREL_V3 */
1414 int offset
; /* Stack offset relative to BP */
1415 unsigned int symtype
;
1422 short int len
; /* Total length of this entry */
1423 short int id
; /* Always S_REGISTER */
1424 unsigned short type
;
1426 struct p_string p_name
;
1427 /* don't handle register tracking */
1432 short int len
; /* Total length of this entry */
1433 short int id
; /* Always S_REGISTER_V2 */
1434 unsigned int type
; /* check whether type & reg are correct */
1436 struct p_string p_name
;
1437 /* don't handle register tracking */
1442 short int len
; /* Total length of this entry */
1443 short int id
; /* Always S_REGISTER_V3 */
1444 unsigned int type
; /* check whether type & reg are correct */
1447 /* don't handle register tracking */
1454 unsigned int parent
;
1456 unsigned int length
;
1457 unsigned int offset
;
1458 unsigned short segment
;
1459 struct p_string p_name
;
1466 unsigned int parent
;
1468 unsigned int length
;
1469 unsigned int offset
;
1470 unsigned short segment
;
1478 unsigned int offset
;
1479 unsigned short segment
;
1480 unsigned char flags
;
1481 struct p_string p_name
;
1488 unsigned int offset
;
1489 unsigned short segment
;
1490 unsigned char flags
;
1498 unsigned short type
;
1499 unsigned short cvalue
; /* numeric leaf */
1501 struct p_string p_name
;
1510 unsigned short cvalue
; /* numeric leaf */
1512 struct p_string p_name
;
1521 unsigned short cvalue
;
1531 unsigned short type
;
1532 struct p_string p_name
;
1540 struct p_string p_name
;
1556 struct p_string p_name
;
1563 unsigned int unknown
;
1564 struct p_string p_name
;
1571 unsigned unknown1
[4];
1572 unsigned short unknown2
;
1573 struct p_string p_name
;
1580 unsigned int unknown
;
1588 unsigned int offset
;
1589 unsigned short segment
;
1590 unsigned short symtype
;
1591 struct p_string p_name
;
1598 unsigned int symtype
;
1599 unsigned int offset
;
1600 unsigned short segment
;
1601 struct p_string p_name
;
1608 unsigned int symtype
;
1609 unsigned int offset
;
1610 unsigned short segment
;
1618 unsigned int offset
;
1619 unsigned short segment
;
1626 unsigned int offset
;
1627 unsigned int unknown
;
1628 } security_cookie_v3
;
1634 unsigned int sz_frame
; /* size of frame */
1635 unsigned int unknown2
;
1636 unsigned int unknown3
;
1637 unsigned int sz_saved_regs
; /* size of saved registers from callee */
1638 unsigned int eh_offset
; /* offset for exception handler */
1639 unsigned short eh_sect
; /* section for exception handler */
1644 #define S_COMPILAND_V1 0x0001
1645 #define S_REGISTER_V1 0x0002
1646 #define S_CONSTANT_V1 0x0003
1647 #define S_UDT_V1 0x0004
1648 #define S_SSEARCH_V1 0x0005
1649 #define S_END_V1 0x0006
1650 #define S_SKIP_V1 0x0007
1651 #define S_CVRESERVE_V1 0x0008
1652 #define S_OBJNAME_V1 0x0009
1653 #define S_ENDARG_V1 0x000a
1654 #define S_COBOLUDT_V1 0x000b
1655 #define S_MANYREG_V1 0x000c
1656 #define S_RETURN_V1 0x000d
1657 #define S_ENTRYTHIS_V1 0x000e
1659 #define S_BPREL_V1 0x0200
1660 #define S_LDATA_V1 0x0201
1661 #define S_GDATA_V1 0x0202
1662 #define S_PUB_V1 0x0203
1663 #define S_LPROC_V1 0x0204
1664 #define S_GPROC_V1 0x0205
1665 #define S_THUNK_V1 0x0206
1666 #define S_BLOCK_V1 0x0207
1667 #define S_WITH_V1 0x0208
1668 #define S_LABEL_V1 0x0209
1669 #define S_CEXMODEL_V1 0x020a
1670 #define S_VFTPATH_V1 0x020b
1671 #define S_REGREL_V1 0x020c
1672 #define S_LTHREAD_V1 0x020d
1673 #define S_GTHREAD_V1 0x020e
1675 #define S_PROCREF_V1 0x0400
1676 #define S_DATAREF_V1 0x0401
1677 #define S_ALIGN_V1 0x0402
1678 #define S_LPROCREF_V1 0x0403
1680 #define S_REGISTER_V2 0x1001 /* Variants with new 32-bit type indices */
1681 #define S_CONSTANT_V2 0x1002
1682 #define S_UDT_V2 0x1003
1683 #define S_COBOLUDT_V2 0x1004
1684 #define S_MANYREG_V2 0x1005
1685 #define S_BPREL_V2 0x1006
1686 #define S_LDATA_V2 0x1007
1687 #define S_GDATA_V2 0x1008
1688 #define S_PUB_V2 0x1009
1689 #define S_LPROC_V2 0x100a
1690 #define S_GPROC_V2 0x100b
1691 #define S_VFTTABLE_V2 0x100c
1692 #define S_REGREL_V2 0x100d
1693 #define S_LTHREAD_V2 0x100e
1694 #define S_GTHREAD_V2 0x100f
1695 #define S_FRAMEINFO_V2 0x1012
1696 #define S_COMPILAND_V2 0x1013
1698 #define S_COMPILAND_V3 0x1101
1699 #define S_THUNK_V3 0x1102
1700 #define S_BLOCK_V3 0x1103
1701 #define S_WITH_V3 0x1104
1702 #define S_LABEL_V3 0x1105
1703 #define S_REGISTER_V3 0x1106
1704 #define S_CONSTANT_V3 0x1107
1705 #define S_UDT_V3 0x1108
1706 #define S_COBOLUDT_V3 0x1109
1707 #define S_MANYREG_V3 0x110A
1708 #define S_BPREL_V3 0x110B
1709 #define S_LDATA_V3 0x110C
1710 #define S_GDATA_V3 0x110D
1711 #define S_PUB_V3 0x110E
1712 #define S_LPROC_V3 0x110F
1713 #define S_GPROC_V3 0x1110
1714 #define S_REGREL_V3 0x1111
1715 #define S_LTHREAD_V3 0x1112
1716 #define S_GTHREAD_V3 0x1113
1717 #define S_LPROCMIPS 0x1114
1718 #define S_GPROCMIPS 0x1115
1719 #define S_MSTOOL_V3 0x1116 /* compiler command line options and build information */
1720 #define S_MANYREG2 0x1117
1721 #define S_LPROCIA64 0x1118
1722 #define S_GPROCIA64 0x1119
1723 #define S_LOCALSLOT 0x111A
1724 #define S_PARAMSLOT 0x111B
1725 #define S_LMANDATA 0x111C
1726 #define S_GMANDATA 0x111D
1727 #define S_MANFRAMEREL 0x111E
1728 #define S_MANREGISTER 0x111F
1729 #define S_MANSLOT 0x1120
1730 #define S_MANMANYREG 0x1121
1731 #define S_MANREGREL 0x1122
1732 #define S_MANMANYREG2 0x1123
1733 #define S_UNAMESPACE 0x1124
1734 #define S_PUB_FUNC1_V3 0x1125 /* didn't get the difference between the two */
1735 #define S_DATAREF_V3 0x1126
1736 #define S_PUB_FUNC2_V3 0x1127
1737 #define S_ANNOTATIONREF 0x1128
1738 #define S_TOKENREF 0x1129
1739 #define S_GMANPROC 0x112A
1740 #define S_LMANPROC 0x112B
1741 #define S_TRAMPOLINE 0x112C
1742 #define S_MANCONSTANT 0x112D
1743 #define S_ATTR_FRAMEREL 0x112E
1744 #define S_ATTR_REGISTER 0x112F
1745 #define S_ATTR_REGREL 0x1130
1746 #define S_ATTR_MANYREG 0x1131
1747 #define S_SEPCODE 0x1132
1748 #define S_LOCAL_2005 0x1133
1749 #define S_DEFRANGE_2005 0x1134
1750 #define S_DEFRANGE2_2005 0x1135
1751 #define S_SECTINFO_V3 0x1136
1752 #define S_SUBSECTINFO_V3 0x1137
1753 #define S_ENTRYPOINT_V3 0x1138
1754 #define S_CALLSITEINFO 0x1139
1755 #define S_SECUCOOKIE_V3 0x113A
1756 #define S_DISCARDED 0x113B
1757 #define S_MSTOOLINFO_V3 0x113C
1758 #define S_MSTOOLENV_V3 0x113D
1760 #define S_LOCAL_VS2013 0x113E
1761 #define S_DEFRANGE_VS2013 0x113F
1762 #define S_DEFRANGE_SUBFIELD 0x1140
1763 #define S_DEFRANGE_REGISTER 0x1141
1764 #define S_DEFRANGE_FRAMEPOINTER_REL 0x1142
1765 #define S_DEFRANGE_SUBFIELD_REGISTER 0x1143
1766 #define S_FPOFF_VS2013 0x1144
1767 #define S_DEFRANGE_REGISTER_REL 0x1145
1768 #define S_LPROC32_VS2013 0x1146
1769 #define S_GPROC32_VS2013 0x1147
1770 #define S_LPROCMIPS_ID 0x1148
1771 #define S_GPROCMIPS_ID 0x1149
1772 #define S_LPROCIA64_ID 0x114A
1773 #define S_GPROCIA64_ID 0x114B
1774 #define S_BUILDINFO 0x114C
1775 #define S_INLINESITE 0x114D
1776 #define S_INLINESITE_END 0x114E
1777 #define S_PROC_ID_END 0x114F
1778 #define S_DEFRANGE_HLSL 0x1150
1779 #define S_GDATA_HLSL 0x1151
1780 #define S_LDATA_HLSL 0x1152
1782 #define S_FILESTATIC 0x1153
1783 #define S_ARMSWITCHTABLE 0x1159
1784 #define S_CALLEES 0x115A
1785 #define S_CALLERS 0x115B
1786 #define S_POGODATA 0x115C
1787 #define S_INLINESITE2 0x115D
1788 #define S_HEAPALLOCSITE 0x115E
1789 #define S_MOD_TYPEREF 0x115F
1790 #define S_REF_MINIPDB 0x1160
1791 #define S_PDBMAP 0x1161
1792 #define S_GDATA_HLSL32 0x1162
1793 #define S_LDATA_HLSL32 0x1163
1794 #define S_GDATA_HLSL32_EX 0x1164
1795 #define S_LDATA_HLSL32_EX 0x1165
1797 /* ======================================== *
1798 * Line number information
1799 * ======================================== */
1801 struct codeview_linetab_block
1804 unsigned short num_lines
;
1805 unsigned int offsets
[1]; /* in fact num_lines */
1806 /* unsigned short linenos[]; */
1815 #define LT2_LINES_BLOCK 0x000000f2
1816 #define LT2_FILES_BLOCK 0x000000f4
1818 /* there's a new line tab structure from MS Studio 2005 and after
1819 * it's made of a list of codeview_linetab2 blocks.
1820 * We've only seen (so far) list with a single LT2_FILES_BLOCK and several
1821 * LT2_LINES_BLOCK. The LT2_FILES block has been encountered either as first
1822 * or last block of the list.
1823 * A LT2_FILES contains one or several codeview_linetab2_file:s
1826 struct codeview_linetab2
1829 DWORD size_of_block
;
1832 static inline const struct codeview_linetab2
* codeview_linetab2_next_block(const struct codeview_linetab2
* lt2
)
1834 return (const struct codeview_linetab2
*)((const char*)(lt2
+ 1) + lt2
->size_of_block
);
1837 struct codeview_linetab2_file
1839 DWORD offset
; /* offset in string table for filename */
1840 WORD unk
; /* always 0x0110... type of following information ??? */
1841 BYTE md5
[16]; /* MD5 signature of file (signature on file's content or name ???) */
1842 WORD pad0
; /* always 0 */
1845 struct codeview_lt2blk_files
1847 struct codeview_linetab2 lt2
; /* LT2_FILES */
1848 struct codeview_linetab2_file file
[1];
1851 struct codeview_lt2blk_lines
1853 struct codeview_linetab2 lt2
; /* LT2_LINE_BLOCK */
1854 DWORD start
; /* start address of function with line numbers */
1855 DWORD seg
; /* segment of function with line numbers */
1856 DWORD size
; /* size of function with line numbers */
1857 DWORD file_offset
; /* offset for accessing corresponding codeview_linetab2_file */
1858 DWORD nlines
; /* number of lines in this block */
1859 DWORD size_lines
; /* number of bytes following for line number information */
1861 DWORD offset
; /* offset (from <seg>:<start>) for line number */
1862 DWORD lineno
; /* the line number (OR:ed with 0x80000000 why ???) */
1863 } l
[1]; /* actually array of <nlines> */
1866 /* ======================================== *
1867 * PDB file information
1868 * ======================================== */
1877 struct PDB_JG_HEADER
1884 struct PDB_FILE toc
;
1888 struct PDB_DS_HEADER
1902 struct PDB_FILE file
[1];
1914 DWORD TimeDateStamp
;
1923 DWORD TimeDateStamp
;
1930 typedef struct _PDB_TYPES_OLD
1938 } PDB_TYPES_OLD
, *PPDB_TYPES_OLD
;
1940 typedef struct _PDB_TYPES
1953 DWORD search_offset
;
1955 DWORD unknown_offset
;
1957 } PDB_TYPES
, *PPDB_TYPES
;
1959 typedef struct _PDB_SYMBOL_RANGE
1965 DWORD characteristics
;
1968 } PDB_SYMBOL_RANGE
, *PPDB_SYMBOL_RANGE
;
1970 typedef struct _PDB_SYMBOL_RANGE_EX
1976 DWORD characteristics
;
1981 } PDB_SYMBOL_RANGE_EX
, *PPDB_SYMBOL_RANGE_EX
;
1983 typedef struct _PDB_SYMBOL_FILE
1986 PDB_SYMBOL_RANGE range
;
1995 } PDB_SYMBOL_FILE
, *PPDB_SYMBOL_FILE
;
1997 typedef struct _PDB_SYMBOL_FILE_EX
2000 PDB_SYMBOL_RANGE_EX range
;
2010 } PDB_SYMBOL_FILE_EX
, *PPDB_SYMBOL_FILE_EX
;
2012 typedef struct _PDB_SYMBOL_SOURCE
2017 } PDB_SYMBOL_SOURCE
, *PPDB_SYMBOL_SOURCE
;
2019 typedef struct _PDB_SYMBOL_IMPORT
2023 DWORD TimeDateStamp
;
2026 } PDB_SYMBOL_IMPORT
, *PPDB_SYMBOL_IMPORT
;
2028 typedef struct _PDB_SYMBOLS_OLD
2037 DWORD srcmodule_size
;
2038 } PDB_SYMBOLS_OLD
, *PPDB_SYMBOLS_OLD
;
2040 typedef struct _PDB_SYMBOLS
2052 DWORD srcmodule_size
;
2053 DWORD pdbimport_size
;
2055 DWORD stream_index_size
;
2056 DWORD unknown2_size
;
2060 } PDB_SYMBOLS
, *PPDB_SYMBOLS
;
2070 } PDB_STREAM_INDEXES_OLD
;
2085 } PDB_STREAM_INDEXES
;
2087 typedef struct _PDB_FPO_DATA
2093 DWORD maxstack_size
;
2096 WORD savedregs_size
;
2097 #define PDB_FPO_DFL_SEH 0x00000001
2098 #define PDB_FPO_DFL_EH 0x00000002
2099 #define PDB_FPO_DFL_IN_BLOCK 0x00000004
2103 #include "poppack.h"
2105 /* ----------------------------------------------
2106 * Information used for parsing
2107 * ---------------------------------------------- */
2115 struct msc_debug_info
2117 struct module
* module
;
2119 const IMAGE_SECTION_HEADER
* sectp
;
2121 const OMAP_DATA
* omapp
;
2126 extern BOOL
coff_process_info(const struct msc_debug_info
* msc_dbg
);
2128 /* ===================================================
2129 * The old CodeView stuff (for NB09 and NB11)
2130 * =================================================== */
2132 #define sstModule 0x120
2133 #define sstTypes 0x121
2134 #define sstPublic 0x122
2135 #define sstPublicSym 0x123
2136 #define sstSymbols 0x124
2137 #define sstAlignSym 0x125
2138 #define sstSrcLnSeg 0x126
2139 #define sstSrcModule 0x127
2140 #define sstLibraries 0x128
2141 #define sstGlobalSym 0x129
2142 #define sstGlobalPub 0x12a
2143 #define sstGlobalTypes 0x12b
2144 #define sstMPC 0x12c
2145 #define sstSegMap 0x12d
2146 #define sstSegName 0x12e
2147 #define sstPreComp 0x12f
2148 #define sstFileIndex 0x133
2149 #define sstStaticSym 0x134
2151 /* overall structure information */
2152 typedef struct OMFSignature
2158 typedef struct OMFSignatureRSDS
2166 typedef struct _CODEVIEW_PDB_DATA
2173 } CODEVIEW_PDB_DATA
, *PCODEVIEW_PDB_DATA
;
2175 typedef struct OMFDirHeader
2184 typedef struct OMFDirEntry
2192 /* sstModule subsection */
2194 typedef struct OMFSegDesc
2202 typedef struct OMFModule
2209 OMFSegDesc SegInfo[cSeg];
2214 typedef struct OMFGlobalTypes
2219 DWORD offset[cTypes];
2224 /* sstGlobalPub section */
2226 /* Header for symbol table */
2227 typedef struct OMFSymHash
2229 unsigned short symhash
;
2230 unsigned short addrhash
;
2231 unsigned long cbSymbol
;
2232 unsigned long cbHSym
;
2233 unsigned long cbHAddr
;
2236 /* sstSegMap section */
2238 typedef struct OMFSegMapDesc
2240 unsigned short flags
;
2242 unsigned short group
;
2243 unsigned short frame
;
2244 unsigned short iSegName
;
2245 unsigned short iClassName
;
2246 unsigned long offset
;
2247 unsigned long cbSeg
;
2250 typedef struct OMFSegMap
2252 unsigned short cSeg
;
2253 unsigned short cSegLog
;
2254 /* OMFSegMapDesc rgDesc[0];*/
2258 /* sstSrcModule section */
2260 typedef struct OMFSourceLine
2263 unsigned short cLnOff
;
2264 unsigned long offset
[1];
2265 unsigned short lineNbr
[1];
2268 typedef struct OMFSourceFile
2270 unsigned short cSeg
;
2271 unsigned short reserved
;
2272 unsigned long baseSrcLn
[1];
2273 unsigned short cFName
;
2277 typedef struct OMFSourceModule
2279 unsigned short cFile
;
2280 unsigned short cSeg
;
2281 unsigned long baseSrcFile
[1];