opengl32: Skip debug callback messages called from native thread.
[wine.git] / include / wine / mscvpdb.h
blob29dd83e73b9d545685c89de4938ef463592afa8a
1 /*
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:
45 * -------------------
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
61 * supported my MS.
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
76 * length prefixed)
77 * The different flavors can coexist in the same file (is this really
78 * true ??)
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
87 * disk because:
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.
98 #include "pshpack1.h"
100 /* ======================================== *
101 * Internal types
102 * ======================================== */
104 struct p_string
106 unsigned char namelen;
107 char name[1];
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;
131 cv_property_t;
133 /* ======================================== *
134 * Type information
135 * ======================================== */
137 union codeview_type
139 struct
141 unsigned short int len;
142 unsigned short int id;
143 } generic;
145 /* types found in TPI stream (#2) */
146 struct
148 unsigned short int len;
149 unsigned short int id;
150 short int attribute;
151 cv_typ16_t type;
152 } modifier_v1;
154 struct
156 unsigned short int len;
157 unsigned short int id;
158 cv_typ_t type;
159 short int attribute;
160 } modifier_v2;
162 struct
164 unsigned short int len;
165 unsigned short int id;
166 short int attribute;
167 short int datatype;
168 struct p_string p_name;
169 } pointer_v1;
171 struct
173 unsigned short int len;
174 unsigned short int id;
175 cv_typ_t datatype;
176 unsigned int attribute;
177 struct p_string p_name;
178 } pointer_v2;
180 struct
182 unsigned short int len;
183 unsigned short int id;
184 cv_typ16_t elemtype;
185 cv_typ16_t idxtype;
186 unsigned short int arrlen; /* numeric leaf */
187 #if 0
188 struct p_string p_name;
189 #endif
190 } array_v1;
192 struct
194 unsigned short int len;
195 unsigned short int id;
196 cv_typ_t elemtype;
197 cv_typ_t idxtype;
198 unsigned short int arrlen; /* numeric leaf */
199 #if 0
200 struct p_string p_name;
201 #endif
202 } array_v2;
204 struct
206 unsigned short int len;
207 unsigned short int id;
208 cv_typ_t elemtype;
209 cv_typ_t idxtype;
210 unsigned short int arrlen; /* numeric leaf */
211 #if 0
212 char name[1];
213 #endif
214 } array_v3;
216 struct
218 unsigned short int len;
219 unsigned short int id;
220 short int n_element;
221 cv_typ16_t fieldlist;
222 cv_property_t property;
223 cv_typ16_t derived;
224 cv_typ16_t vshape;
225 unsigned short int structlen; /* numeric leaf */
226 #if 0
227 struct p_string p_name;
228 #endif
229 } struct_v1;
231 struct
233 unsigned short int len;
234 unsigned short int id;
235 short int n_element;
236 cv_property_t property;
237 cv_typ_t fieldlist;
238 cv_typ_t derived;
239 cv_typ_t vshape;
240 unsigned short int structlen; /* numeric leaf */
241 #if 0
242 struct p_string p_name;
243 #endif
244 } struct_v2;
246 struct
248 unsigned short int len;
249 unsigned short int id;
250 short int n_element;
251 cv_property_t property;
252 cv_typ_t fieldlist;
253 cv_typ_t derived;
254 cv_typ_t vshape;
255 unsigned short int structlen; /* numeric leaf */
256 #if 0
257 char name[1];
258 #endif
259 } struct_v3;
261 struct
263 unsigned short int len;
264 unsigned short int id;
265 short int count;
266 cv_typ16_t fieldlist;
267 cv_property_t property;
268 unsigned short int un_len; /* numeric leaf */
269 #if 0
270 struct p_string p_name;
271 #endif
272 } union_v1;
274 struct
276 unsigned short int len;
277 unsigned short int id;
278 short int count;
279 cv_property_t property;
280 cv_typ_t fieldlist;
281 unsigned short int un_len; /* numeric leaf */
282 #if 0
283 struct p_string p_name;
284 #endif
285 } union_v2;
287 struct
289 unsigned short int len;
290 unsigned short int id;
291 short int count;
292 cv_property_t property;
293 cv_typ_t fieldlist;
294 unsigned short int un_len; /* numeric leaf */
295 #if 0
296 char name[1];
297 #endif
298 } union_v3;
300 struct
302 unsigned short int len;
303 unsigned short int id;
304 short int count;
305 cv_typ16_t type;
306 cv_typ16_t fieldlist;
307 cv_property_t property;
308 struct p_string p_name;
309 } enumeration_v1;
311 struct
313 unsigned short int len;
314 unsigned short int id;
315 short int count;
316 cv_property_t property;
317 cv_typ_t type;
318 cv_typ_t fieldlist;
319 struct p_string p_name;
320 } enumeration_v2;
322 struct
324 unsigned short int len;
325 unsigned short int id;
326 short int count;
327 cv_property_t property;
328 cv_typ_t type;
329 cv_typ_t fieldlist;
330 char name[1];
331 } enumeration_v3;
333 struct
335 unsigned short int len;
336 unsigned short int id;
337 cv_typ16_t rvtype;
338 unsigned char callconv;
339 unsigned char funcattr;
340 unsigned short int params;
341 cv_typ16_t arglist;
342 } procedure_v1;
344 struct
346 unsigned short int len;
347 unsigned short int id;
348 cv_typ_t rvtype;
349 unsigned char callconv;
350 unsigned char funcattr;
351 unsigned short int params;
352 cv_typ_t arglist;
353 } procedure_v2;
355 struct
357 unsigned short int len;
358 unsigned short int id;
359 cv_typ16_t rvtype;
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;
365 cv_typ16_t arglist;
366 unsigned int this_adjust;
367 } mfunction_v1;
369 struct
371 unsigned short int len;
372 unsigned short int id;
373 cv_typ_t rvtype;
374 cv_typ_t class_type;
375 cv_typ_t this_type;
376 unsigned char callconv;
377 unsigned char funcattr;
378 unsigned short params;
379 cv_typ_t arglist;
380 unsigned int this_adjust;
381 } mfunction_v2;
383 /* types found in IPI stream (#4) */
384 struct
386 unsigned short int len;
387 unsigned short int id; /* LF_FUNC_ID */
388 cv_itemid_t scopeId;
389 cv_typ_t type;
390 char name[1];
391 } func_id_v3;
393 struct
395 unsigned short int len;
396 unsigned short int id; /* LF_MFUNC_ID */
397 cv_typ_t parentType;
398 cv_typ_t type;
399 char name[1];
400 } mfunc_id_v3;
402 struct
404 unsigned short int len;
405 unsigned short int id; /* LF_STRING_ID */
406 cv_itemid_t strid;
407 char name[1];
408 } string_id_v3;
410 struct
412 unsigned short int len;
413 unsigned short int id; /* LF_UDT_SRC_LINE */
414 cv_typ_t type;
415 cv_itemid_t src;
416 unsigned int line;
417 } udt_src_line_v3;
419 struct
421 unsigned short int len;
422 unsigned short int id; /* LF_UDT_MOD_SRC_LINE */
423 cv_typ_t type;
424 cv_itemid_t src;
425 unsigned int line;
426 unsigned short imod;
427 } udt_mod_src_line_v3;
429 struct
431 unsigned short int len;
432 unsigned short int id; /* LF_BUILDINFO */
433 unsigned short count;
434 cv_itemid_t arg[1];
435 } buildinfo_v3;
439 union codeview_reftype
441 struct
443 unsigned short int len;
444 unsigned short int id;
445 } generic;
447 struct
449 unsigned short int len;
450 unsigned short int id;
451 unsigned char list[1];
452 } fieldlist;
454 struct
456 unsigned short int len;
457 unsigned short int id;
458 unsigned char nbits;
459 unsigned char bitoff;
460 cv_typ16_t type;
461 } bitfield_v1;
463 struct
465 unsigned short int len;
466 unsigned short int id;
467 cv_typ_t type;
468 unsigned char nbits;
469 unsigned char bitoff;
470 } bitfield_v2;
472 struct
474 unsigned short int len;
475 unsigned short int id;
476 unsigned short num;
477 cv_typ16_t args[1];
478 } arglist_v1;
480 struct
482 unsigned short int len;
483 unsigned short int id;
484 unsigned num;
485 cv_typ_t args[1];
486 } arglist_v2;
488 struct
490 unsigned short int len;
491 unsigned short int id;
492 unsigned short num;
493 cv_typ16_t drvdcls[1];
494 } derived_v1;
496 struct
498 unsigned short int len;
499 unsigned short int id;
500 unsigned num;
501 cv_typ_t drvdcls[1];
502 } derived_v2;
504 struct
506 unsigned short int len;
507 unsigned short int id;
508 cv_typ_t type;
509 cv_typ_t baseVftable;
510 unsigned offsetInObjectLayout;
511 unsigned cbstr;
512 char names[1]; /* array of len 0-terminated strings (size of cbstr in char:s) */
513 } vftable_v3;
516 union codeview_fieldtype
518 struct
520 unsigned short int id;
521 } generic;
523 struct
525 unsigned short int id;
526 cv_typ16_t type;
527 short int attribute;
528 unsigned short int offset; /* numeric leaf */
529 } bclass_v1;
531 struct
533 unsigned short int id;
534 short int attribute;
535 cv_typ_t type;
536 unsigned short int offset; /* numeric leaf */
537 } bclass_v2;
539 struct
541 unsigned short int id;
542 cv_typ16_t btype;
543 cv_typ16_t vbtype;
544 short int attribute;
545 unsigned short int vbpoff; /* numeric leaf */
546 #if 0
547 unsigned short int vboff; /* numeric leaf */
548 #endif
549 } vbclass_v1;
551 struct
553 unsigned short int id;
554 short int attribute;
555 cv_typ_t btype;
556 cv_typ_t vbtype;
557 unsigned short int vbpoff; /* numeric leaf */
558 #if 0
559 unsigned short int vboff; /* numeric leaf */
560 #endif
561 } vbclass_v2;
563 struct
565 unsigned short int id;
566 short int attribute;
567 unsigned short int value; /* numeric leaf */
568 #if 0
569 struct p_string p_name;
570 #endif
571 } enumerate_v1;
573 struct
575 unsigned short int id;
576 short int attribute;
577 unsigned short int value; /* numeric leaf */
578 #if 0
579 char name[1];
580 #endif
581 } enumerate_v3;
583 struct
585 unsigned short int id;
586 cv_typ16_t type;
587 struct p_string p_name;
588 } friendfcn_v1;
590 struct
592 unsigned short int id;
593 short int _pad0;
594 cv_typ_t type;
595 struct p_string p_name;
596 } friendfcn_v2;
598 struct
600 unsigned short int id;
601 short int _pad0;
602 cv_typ_t type;
603 char name[1];
604 } friendfcn_v3;
606 struct
608 unsigned short int id;
609 cv_typ16_t type;
610 short int attribute;
611 unsigned short int offset; /* numeric leaf */
612 #if 0
613 struct p_string p_name;
614 #endif
615 } member_v1;
617 struct
619 unsigned short int id;
620 short int attribute;
621 cv_typ_t type;
622 unsigned short int offset; /* numeric leaf */
623 #if 0
624 struct p_string p_name;
625 #endif
626 } member_v2;
628 struct
630 unsigned short int id;
631 short int attribute;
632 cv_typ_t type;
633 unsigned short int offset; /* numeric leaf */
634 #if 0
635 char name[1];
636 #endif
638 member_v3;
640 struct
642 unsigned short int id;
643 cv_typ16_t type;
644 short int attribute;
645 struct p_string p_name;
646 } stmember_v1;
648 struct
650 unsigned short int id;
651 short int attribute;
652 cv_typ_t type;
653 struct p_string p_name;
654 } stmember_v2;
656 struct
658 unsigned short int id;
659 short int attribute;
660 cv_typ_t type;
661 char name[1];
662 } stmember_v3;
664 struct
666 unsigned short int id;
667 short int count;
668 cv_typ16_t mlist;
669 struct p_string p_name;
670 } method_v1;
672 struct
674 unsigned short int id;
675 short int count;
676 cv_typ_t mlist;
677 struct p_string p_name;
678 } method_v2;
680 struct
682 unsigned short int id;
683 short int count;
684 cv_typ_t mlist;
685 char name[1];
686 } method_v3;
688 struct
690 unsigned short int id;
691 cv_typ16_t type;
692 struct p_string p_name;
693 } nesttype_v1;
695 struct
697 unsigned short int id;
698 short int _pad0;
699 cv_typ_t type;
700 struct p_string p_name;
701 } nesttype_v2;
703 struct
705 unsigned short int id;
706 short int _pad0;
707 cv_typ_t type;
708 char name[1];
709 } nesttype_v3;
711 struct
713 unsigned short int id;
714 cv_typ16_t type;
715 } vfunctab_v1;
717 struct
719 unsigned short int id;
720 short int _pad0;
721 cv_typ_t type;
722 } vfunctab_v2;
724 struct
726 unsigned short int id;
727 cv_typ16_t type;
728 } friendcls_v1;
730 struct
732 unsigned short int id;
733 short int _pad0;
734 cv_typ_t type;
735 } friendcls_v2;
737 struct
739 unsigned short int id;
740 short int attribute;
741 cv_typ16_t type;
742 struct p_string p_name;
743 } onemethod_v1;
745 struct
747 unsigned short int id;
748 short int attribute;
749 cv_typ_t type;
750 struct p_string p_name;
751 } onemethod_v2;
753 struct
755 unsigned short int id;
756 short int attribute;
757 cv_typ_t type;
758 char name[1];
759 } onemethod_v3;
761 struct
763 unsigned short int id;
764 short int attribute;
765 cv_typ16_t type;
766 unsigned int vtab_offset;
767 struct p_string p_name;
768 } onemethod_virt_v1;
770 struct
772 unsigned short int id;
773 short int attribute;
774 cv_typ_t type;
775 unsigned int vtab_offset;
776 struct p_string p_name;
777 } onemethod_virt_v2;
779 struct
781 unsigned short int id;
782 short int attribute;
783 cv_typ_t type;
784 unsigned int vtab_offset;
785 char name[1];
786 } onemethod_virt_v3;
788 struct
790 unsigned short int id;
791 cv_typ16_t type;
792 unsigned int offset;
793 } vfuncoff_v1;
795 struct
797 unsigned short int id;
798 short int _pad0;
799 cv_typ_t type;
800 unsigned int offset;
801 } vfuncoff_v2;
803 struct
805 unsigned short int id;
806 short int attribute;
807 cv_typ16_t type;
808 struct p_string p_name;
809 } nesttypeex_v1;
811 struct
813 unsigned short int id;
814 short int attribute;
815 cv_typ_t type;
816 struct p_string p_name;
817 } nesttypeex_v2;
819 struct
821 unsigned short int id;
822 short int attribute;
823 cv_typ_t type;
824 struct p_string p_name;
825 } membermodify_v2;
827 struct
829 unsigned short int id;
830 cv_typ16_t ref;
831 } index_v1;
833 struct
835 unsigned short int id;
836 short int _pad0;
837 cv_typ_t ref;
838 } index_v2;
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
847 * that are not used.
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 |
863 where
864 <type> is one of the following types:
865 0x00 Special
866 0x01 Signed integral value
867 0x02 Unsigned integral value
868 0x03 Boolean
869 0x04 Real
870 0x05 Complex
871 0x06 Special2
872 0x07 Real int value
873 0x08 Reserved
874 0x09 Reserved
875 0x0a Reserved
876 0x0b Reserved
877 0x0c Reserved
878 0x0d Reserved
879 0x0e Reserved
880 0x0f Reserved for debugger expression evaluator
882 <size> is an enumerated value for each of the types.
883 Type = special
884 0x00 No type
885 0x01 Absolute symbol
886 0x02 Segment
887 0x03 Void
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
893 0x00 1 byte
894 0x01 2 byte
895 0x02 4 byte
896 0x03 8 byte
897 0x04 Reserved
898 0x05 Reserved
899 0x06 Reserved
900 0x07 Reserved
901 Type = real and complex
902 0x00 32 bit
903 0x01 64 bit
904 0x02 80 bit
905 0x03 128 bit
906 0x04 48 bit
907 0x05 Reserved
908 0x06 Reserved
909 0x07 Reserved
910 Type = special2
911 0x00 Bit
912 0x01 Pascal CHAR
913 Type = Real int
914 0x00 Char
915 0x01 Wide character
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
925 0x01 Near pointer
926 0x02 Far pointer
927 0x03 Huge pointer
928 0x04 32-bit near pointer
929 0x05 32-bit far pointer
930 0x06 64-bit near pointer
931 0x07 Reserved
934 /* basic types */
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
1275 /* Field lists */
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;
1370 struct cv_addr_gap
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
1396 struct
1398 unsigned short int len;
1399 unsigned short int id;
1400 } generic;
1402 struct
1404 unsigned short int len;
1405 unsigned short int id;
1406 unsigned int offset;
1407 unsigned short segment;
1408 cv_typ16_t symtype;
1409 struct p_string p_name;
1410 } data_v1;
1412 struct
1414 unsigned short int len;
1415 unsigned short int id;
1416 cv_typ_t symtype;
1417 unsigned int offset;
1418 unsigned short segment;
1419 struct p_string p_name;
1420 } data_v2;
1422 struct
1424 unsigned short int len;
1425 unsigned short int id;
1426 cv_typ_t symtype;
1427 unsigned int offset;
1428 unsigned short segment;
1429 char name[1];
1430 } data_v3;
1432 struct
1434 unsigned short int len;
1435 unsigned short int id;
1436 unsigned int pparent;
1437 unsigned int pend;
1438 unsigned int next;
1439 unsigned int offset;
1440 unsigned short segment;
1441 unsigned short thunk_len;
1442 unsigned char thtype;
1443 struct p_string p_name;
1444 } thunk_v1;
1446 struct
1448 unsigned short int len;
1449 unsigned short int id;
1450 unsigned int pparent;
1451 unsigned int pend;
1452 unsigned int next;
1453 unsigned int offset;
1454 unsigned short segment;
1455 unsigned short thunk_len;
1456 unsigned char thtype;
1457 char name[1];
1458 } thunk_v3;
1460 struct
1462 unsigned short int len;
1463 unsigned short int id;
1464 unsigned int pparent;
1465 unsigned int pend;
1466 unsigned int next;
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;
1475 } proc_v1;
1477 struct
1479 unsigned short int len;
1480 unsigned short int id;
1481 unsigned int pparent;
1482 unsigned int pend;
1483 unsigned int next;
1484 unsigned int proc_len;
1485 unsigned int debug_start;
1486 unsigned int debug_end;
1487 cv_typ_t proctype;
1488 unsigned int offset;
1489 unsigned short segment;
1490 unsigned char flags;
1491 struct p_string p_name;
1492 } proc_v2;
1494 struct
1496 unsigned short int len;
1497 unsigned short int id;
1498 unsigned int pparent;
1499 unsigned int pend;
1500 unsigned int next;
1501 unsigned int proc_len;
1502 unsigned int debug_start;
1503 unsigned int debug_end;
1504 cv_typ_t proctype;
1505 unsigned int offset;
1506 unsigned short segment;
1507 unsigned char flags;
1508 char name[1];
1509 } proc_v3;
1511 struct
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;
1519 } public_v1;
1521 struct
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;
1529 } public_v2;
1531 struct
1533 unsigned short int len;
1534 unsigned short int id;
1535 unsigned int pubsymflags;
1536 unsigned int offset;
1537 unsigned short segment;
1538 char name[1];
1539 } public_v3;
1541 struct
1543 unsigned short int len;
1544 unsigned short int id; /* Always S_BPREL32_16t */
1545 unsigned int offset; /* Stack offset relative to BP */
1546 cv_typ16_t symtype;
1547 struct p_string p_name;
1548 } stack_v1;
1550 struct
1552 unsigned short int len;
1553 unsigned short int id; /* Always S_BPREL32_ST */
1554 unsigned int offset; /* Stack offset relative to EBP */
1555 cv_typ_t symtype;
1556 struct p_string p_name;
1557 } stack_v2;
1559 struct
1561 unsigned short int len;
1562 unsigned short int id; /* Always S_BPREL32 */
1563 int offset; /* Stack offset relative to BP */
1564 cv_typ_t symtype;
1565 char name[1];
1566 } stack_v3;
1568 struct
1570 unsigned short int len;
1571 unsigned short int id; /* Always S_BPREL32 */
1572 int offset; /* Stack offset relative to BP */
1573 cv_typ_t symtype;
1574 unsigned short reg;
1575 char name[1];
1576 } regrel_v3;
1578 struct
1580 unsigned short int len;
1581 unsigned short int id; /* Always S_REGISTER */
1582 cv_typ16_t type;
1583 unsigned short reg;
1584 struct p_string p_name;
1585 /* don't handle register tracking */
1586 } register_v1;
1588 struct
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 */
1593 unsigned short reg;
1594 struct p_string p_name;
1595 /* don't handle register tracking */
1596 } register_v2;
1598 struct
1600 unsigned short int len;
1601 unsigned short int id; /* Always S_REGISTER */
1602 cv_typ_t type; /* check whether type & reg are correct */
1603 unsigned short reg;
1604 char name[1];
1605 /* don't handle register tracking */
1606 } register_v3;
1608 struct
1610 unsigned short int len;
1611 unsigned short int id;
1612 unsigned int parent;
1613 unsigned int end;
1614 unsigned int length;
1615 unsigned int offset;
1616 unsigned short segment;
1617 struct p_string p_name;
1618 } block_v1;
1620 struct
1622 unsigned short int len;
1623 unsigned short int id;
1624 unsigned int parent;
1625 unsigned int end;
1626 unsigned int length;
1627 unsigned int offset;
1628 unsigned short segment;
1629 char name[1];
1630 } block_v3;
1632 struct
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;
1642 } trampoline_v3;
1644 struct
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;
1652 } label_v1;
1654 struct
1656 unsigned short int len;
1657 unsigned short int id;
1658 unsigned int offset;
1659 unsigned short segment;
1660 unsigned char flags;
1661 char name[1];
1662 } label_v3;
1664 struct
1666 unsigned short int len;
1667 unsigned short int id;
1668 cv_typ16_t type;
1669 unsigned short cvalue; /* numeric leaf */
1670 #if 0
1671 struct p_string p_name;
1672 #endif
1673 } constant_v1;
1675 struct
1677 unsigned short int len;
1678 unsigned short int id;
1679 cv_typ_t type;
1680 unsigned short cvalue; /* numeric leaf */
1681 #if 0
1682 struct p_string p_name;
1683 #endif
1684 } constant_v2;
1686 struct
1688 unsigned short int len;
1689 unsigned short int id;
1690 cv_typ_t type;
1691 unsigned short cvalue;
1692 #if 0
1693 char name[1];
1694 #endif
1695 } constant_v3;
1697 struct
1699 unsigned short int len;
1700 unsigned short int id;
1701 cv_typ16_t type;
1702 struct p_string p_name;
1703 } udt_v1;
1705 struct
1707 unsigned short int len;
1708 unsigned short int id;
1709 cv_typ_t type;
1710 struct p_string p_name;
1711 } udt_v2;
1713 struct
1715 unsigned short int len;
1716 unsigned short int id;
1717 cv_typ_t type;
1718 char name[1];
1719 } udt_v3;
1721 struct
1723 unsigned short int len;
1724 unsigned short int id;
1725 unsigned signature;
1726 struct p_string p_name;
1727 } objname_v1;
1729 struct
1731 unsigned short int len;
1732 unsigned short int id;
1733 unsigned signature;
1734 char name[1];
1735 } objname_v3;
1737 struct
1739 unsigned short int len;
1740 unsigned short int id;
1741 unsigned char machine;
1742 struct
1744 unsigned char language : 8;
1745 unsigned char _dome : 8; /* other missing fields */
1746 unsigned char pad : 8;
1747 } flags;
1748 struct p_string p_name;
1749 } compile_v1;
1751 struct
1753 unsigned short int len;
1754 unsigned short int id;
1755 struct {
1756 unsigned int iLanguage : 8;
1757 unsigned int _dome : 9; /* other missing fields */
1758 unsigned int pad : 15;
1759 } flags;
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;
1768 } compile2_v2;
1770 struct
1772 unsigned short int len;
1773 unsigned short int id;
1774 struct {
1775 unsigned int iLanguage : 8;
1776 unsigned int _dome : 9; /* other missing fields */
1777 unsigned int pad : 15;
1778 } flags;
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;
1786 char name[1];
1787 } compile2_v3;
1789 struct
1791 unsigned short int len;
1792 unsigned short int id;
1793 struct {
1794 unsigned int iLanguage : 8;
1795 unsigned int _dome : 12; /* other missing fields */
1796 unsigned int pad : 12;
1797 } flags;
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;
1807 char name[1];
1808 } compile3_v3;
1810 struct
1812 unsigned short int len;
1813 unsigned short int id;
1814 unsigned int offset;
1815 unsigned short segment;
1816 cv_typ16_t symtype;
1817 struct p_string p_name;
1818 } thread_v1;
1820 struct
1822 unsigned short int len;
1823 unsigned short int id;
1824 cv_typ_t symtype;
1825 unsigned int offset;
1826 unsigned short segment;
1827 struct p_string p_name;
1828 } thread_v2;
1830 struct
1832 unsigned short int len;
1833 unsigned short int id;
1834 cv_typ_t symtype;
1835 unsigned int offset;
1836 unsigned short segment;
1837 char name[1];
1838 } thread_v3;
1840 struct
1842 unsigned short int len;
1843 unsigned short int id;
1844 unsigned int sumName;
1845 unsigned int ibSym;
1846 unsigned short imod;
1847 char name[1];
1848 } refsym2_v3;
1850 struct
1852 unsigned short int len;
1853 unsigned short int id;
1854 unsigned int offset;
1855 unsigned short segment;
1856 } ssearch_v1;
1858 struct
1860 unsigned short int len;
1861 unsigned short int id;
1862 unsigned int offset;
1863 unsigned int unknown;
1864 } security_cookie_v3;
1866 struct
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 */
1876 unsigned int flags;
1877 } frame_info_v2;
1879 struct
1881 unsigned short int len;
1882 unsigned short int id;
1883 unsigned int offset;
1884 unsigned short sect_idx;
1885 unsigned short inst_len;
1886 cv_typ_t index;
1887 } heap_alloc_site_v3;
1889 struct
1891 unsigned short int len;
1892 unsigned short int id;
1893 cv_typ_t symtype;
1894 struct cv_local_varflag varflags;
1895 char name[1];
1896 } local_v3;
1898 struct
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];
1905 } defrange_v3;
1907 struct
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;
1917 struct
1919 unsigned short int len;
1920 unsigned short int id;
1921 unsigned short reg;
1922 unsigned short attr;
1923 struct cv_addr_range range;
1924 struct cv_addr_gap gaps[0];
1925 } defrange_register_v3;
1927 struct
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;
1936 struct
1938 unsigned short int len;
1939 unsigned short int id;
1940 int offFramePointer;
1941 } defrange_frameptr_relfullscope_v3;
1943 struct
1945 unsigned short int len;
1946 unsigned short int id;
1947 unsigned short reg;
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;
1955 struct
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;
1963 int offBasePointer;
1964 struct cv_addr_range range;
1965 struct cv_addr_gap gaps[0];
1966 } defrange_registerrel_v3;
1968 struct
1970 unsigned short int len;
1971 unsigned short int id;
1972 cv_itemid_t itemid;
1973 } build_info_v3;
1975 struct
1977 unsigned short int len;
1978 unsigned short int id;
1979 unsigned int pParent;
1980 unsigned int pEnd;
1981 cv_itemid_t inlinee;
1982 unsigned char binaryAnnotations[0];
1983 } inline_site_v3;
1985 struct
1987 unsigned short int len;
1988 unsigned short int typ;
1989 unsigned int off;
1990 unsigned short sect;
1991 unsigned short _pad0;
1992 cv_typ_t typind;
1993 } callsiteinfo_v3;
1995 struct
1997 unsigned short int len;
1998 unsigned short int id;
1999 unsigned int pParent;
2000 unsigned int pEnd;
2001 cv_itemid_t inlinee;
2002 unsigned int invocations;
2003 unsigned char binaryAnnotations[0];
2004 } inline_site2_v3;
2006 struct
2008 unsigned short int len;
2009 unsigned short int id;
2010 unsigned int count;
2011 cv_typ_t funcs[0]; /* array of cuntions, count entries */
2012 #if 0
2013 unsigned int invocations[0]; /* array of count entries, paires with funcs */
2014 #endif
2015 } function_list_v3;
2017 struct
2019 unsigned short int len;
2020 unsigned short int id;
2021 cv_typ_t typind;
2022 unsigned int modOffset;
2023 struct cv_local_varflag varflags;
2024 char name[1];
2025 } file_static_v3;
2027 struct
2029 unsigned short int len;
2030 unsigned short int id;
2031 struct p_string pname;
2032 } unamespace_v2;
2034 struct
2036 unsigned short int len;
2037 unsigned short int id;
2038 char name[1];
2039 } unamespace_v3;
2041 struct
2043 unsigned short int len;
2044 unsigned short int id;
2045 unsigned int pParent;
2046 unsigned int pEnd;
2047 unsigned int length;
2048 unsigned int scf; /* CV_SEPCODEFLAGS */
2049 unsigned int off;
2050 unsigned int offParent;
2051 unsigned short int sect;
2052 unsigned short int sectParent;
2053 } sepcode_v3;
2055 struct
2057 unsigned short int len;
2058 unsigned short int id;
2059 unsigned int off;
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) */
2063 } annotation_v3;
2065 struct
2067 unsigned short int len;
2068 unsigned short int id;
2069 unsigned int invocations;
2070 __int64 dynCount;
2071 unsigned numInstrs;
2072 unsigned staInstLive;
2073 } pogoinfo_v3;
2076 enum BinaryAnnotationOpcode
2078 BA_OP_Invalid,
2079 BA_OP_CodeOffset,
2080 BA_OP_ChangeCodeOffsetBase,
2081 BA_OP_ChangeCodeOffset,
2082 BA_OP_ChangeCodeLength,
2083 BA_OP_ChangeFile,
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,
2261 DEBUG_S_LINES,
2262 DEBUG_S_STRINGTABLE,
2263 DEBUG_S_FILECHKSMS,
2264 DEBUG_S_FRAMEDATA,
2265 DEBUG_S_INLINEELINES,
2266 DEBUG_S_CROSSSCOPEIMPORTS,
2267 DEBUG_S_CROSSSCOPEEXPORTS,
2269 DEBUG_S_IL_LINES,
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;
2280 unsigned cbLen;
2283 struct CV_DebugSLinesHeader_t
2285 unsigned offCon;
2286 unsigned short segCon;
2287 unsigned short flags;
2288 unsigned cbCon;
2291 struct CV_DebugSLinesFileBlockHeader_t
2293 unsigned offFile;
2294 unsigned nLines;
2295 unsigned cbBlock;
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
2305 struct CV_Line_t
2307 unsigned offset;
2308 unsigned linenumStart:24;
2309 unsigned deltaLineEnd:7;
2310 unsigned fStatement:1;
2313 struct CV_Column_t
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;
2347 #ifdef __WINESRC__
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
2361 unsigned short seg;
2362 unsigned short num_lines;
2363 unsigned int offsets[1]; /* in fact num_lines */
2364 /* unsigned short linenos[]; */
2367 struct startend
2369 unsigned int start;
2370 unsigned int end;
2373 /* ======================================== *
2374 * PDB file information
2375 * ======================================== */
2378 struct PDB_JG_STREAM
2380 unsigned int size;
2381 unsigned int unknown;
2384 struct PDB_JG_HEADER
2386 char ident[40];
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
2397 char signature[32];
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;
2406 struct PDB_JG_TOC
2408 unsigned int num_streams;
2409 struct PDB_JG_STREAM streams[1];
2412 struct PDB_DS_TOC
2414 unsigned int num_streams;
2415 unsigned int stream_size[1];
2418 struct PDB_JG_ROOT
2420 unsigned int Version;
2421 unsigned int TimeDateStamp;
2422 unsigned int Age;
2423 unsigned int cbNames;
2424 char names[1];
2427 struct PDB_DS_ROOT
2429 unsigned int Version;
2430 unsigned int TimeDateStamp;
2431 unsigned int Age;
2432 GUID guid;
2433 unsigned int cbNames;
2434 char names[1];
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;
2444 unsigned short pad;
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;
2455 unsigned short pad;
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;
2471 unsigned int size;
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;
2482 unsigned int size;
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;
2501 char filename[1];
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];
2516 char filename[1];
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;
2531 unsigned int Age;
2532 char filename[1];
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;
2540 unsigned short pad;
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;
2551 unsigned int age;
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;
2571 typedef struct
2573 unsigned short FPO;
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;
2581 typedef struct
2583 unsigned short FPO;
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
2598 unsigned int start;
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
2609 unsigned int flags;
2610 } PDB_FPO_DATA;
2612 typedef struct _PDB_STRING_TABLE
2614 unsigned int magic;
2615 unsigned int hash_version;
2616 unsigned int length;
2618 PDB_STRING_TABLE;
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).
2629 typedef struct
2631 unsigned signature;
2632 unsigned version;
2633 unsigned hash_records_size;
2634 unsigned unknown;
2635 } DBI_HASH_HEADER;
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
2642 typedef struct
2644 unsigned offset;
2645 unsigned unknown;
2646 } DBI_HASH_RECORD;
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)
2654 typedef struct
2656 unsigned hash_size;
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
2694 char Signature[4];
2695 int filepos;
2696 } OMFSignature;
2698 typedef struct OMFSignatureRSDS
2700 char Signature[4];
2701 GUID guid;
2702 unsigned int age;
2703 char name[1];
2704 } OMFSignatureRSDS;
2706 typedef struct _CODEVIEW_PDB_DATA
2708 char Signature[4];
2709 int filepos;
2710 unsigned int timestamp;
2711 unsigned int age;
2712 char name[1];
2713 } CODEVIEW_PDB_DATA, *PCODEVIEW_PDB_DATA;
2715 typedef struct OMFDirHeader
2717 unsigned short cbDirHeader;
2718 unsigned short cbDirEntry;
2719 unsigned int cDir;
2720 unsigned int lfoNextDir;
2721 unsigned int flags;
2722 } OMFDirHeader;
2724 typedef struct OMFDirEntry
2726 unsigned short SubSection;
2727 unsigned short iMod;
2728 unsigned int lfo;
2729 unsigned int cb;
2730 } OMFDirEntry;
2732 /* sstModule subsection */
2734 typedef struct OMFSegDesc
2736 unsigned short Seg;
2737 unsigned short pad;
2738 unsigned int Off;
2739 unsigned int cbSeg;
2740 } OMFSegDesc;
2742 typedef struct OMFModule
2744 unsigned short ovlNumber;
2745 unsigned short iLib;
2746 unsigned short cSeg;
2747 char Style[2];
2749 OMFSegDesc SegInfo[cSeg];
2750 p_string Name;
2752 } OMFModule;
2754 typedef struct OMFGlobalTypes
2756 unsigned int flags;
2757 unsigned int cTypes;
2759 unsigned int offset[cTypes];
2760 types_record[];
2762 } OMFGlobalTypes;
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;
2774 } OMFSymHash;
2776 /* sstSegMap section */
2778 typedef struct OMFSegMapDesc
2780 unsigned short flags;
2781 unsigned short ovl;
2782 unsigned short group;
2783 unsigned short frame;
2784 unsigned short iSegName;
2785 unsigned short iClassName;
2786 unsigned int offset;
2787 unsigned int cbSeg;
2788 } OMFSegMapDesc;
2790 typedef struct OMFSegMap
2792 unsigned short cSeg;
2793 unsigned short cSegLog;
2794 /* OMFSegMapDesc rgDesc[0];*/
2795 } OMFSegMap;
2798 /* sstSrcModule section */
2800 typedef struct OMFSourceLine
2802 unsigned short Seg;
2803 unsigned short cLnOff;
2804 unsigned int offset[1];
2805 unsigned short lineNbr[1];
2806 } OMFSourceLine;
2808 typedef struct OMFSourceFile
2810 unsigned short cSeg;
2811 unsigned short reserved;
2812 unsigned int baseSrcLn[1];
2813 unsigned short cFName;
2814 char Name;
2815 } OMFSourceFile;
2817 typedef struct OMFSourceModule
2819 unsigned short cFile;
2820 unsigned short cSeg;
2821 unsigned int baseSrcFile[1];
2822 } OMFSourceModule;