avicap32: Use the Unix call helpers.
[wine.git] / include / wine / mscvpdb.h
blob90adc3ee465e8dbce8190ce47a4ff84e6023816a
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 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
57 * bad)
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'
68 * evolutions:
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
77 * length prefixed)
78 * The different flavors can coexist in the same file (is this really
79 * true ??)
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
88 * disk because:
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.
99 #include "pshpack1.h"
101 /* ======================================== *
102 * Internal types
103 * ======================================== */
105 struct p_string
107 unsigned char namelen;
108 char name[1];
111 typedef unsigned short cv_typ16_t;
112 typedef unsigned int cv_typ_t;
113 typedef cv_typ_t cv_itemid_t;
115 typedef struct cv_property_t
117 unsigned short is_packed : 1;
118 unsigned short has_ctor : 1;
119 unsigned short has_overloaded_operator : 1;
120 unsigned short is_nested : 1;
121 unsigned short has_nested : 1;
122 unsigned short has_overloaded_assign : 1;
123 unsigned short has_operator_cast : 1;
124 unsigned short is_forward_defn : 1;
125 unsigned short is_scoped : 1;
126 unsigned short has_decorated_name : 1; /* follows name field */
127 unsigned short is_sealed : 1; /* not usage as base class */
128 unsigned short hfa : 2;
129 unsigned short is_intrinsic : 1;
130 unsigned short mocom : 2;
132 cv_property_t;
134 /* ======================================== *
135 * Type information
136 * ======================================== */
138 union codeview_type
140 struct
142 unsigned short int len;
143 unsigned short int id;
144 } generic;
146 /* types found in TPI stream (#2) */
147 struct
149 unsigned short int len;
150 unsigned short int id;
151 short int attribute;
152 cv_typ16_t type;
153 } modifier_v1;
155 struct
157 unsigned short int len;
158 unsigned short int id;
159 cv_typ_t type;
160 short int attribute;
161 } modifier_v2;
163 struct
165 unsigned short int len;
166 unsigned short int id;
167 short int attribute;
168 short int datatype;
169 struct p_string p_name;
170 } pointer_v1;
172 struct
174 unsigned short int len;
175 unsigned short int id;
176 cv_typ_t datatype;
177 unsigned int attribute;
178 struct p_string p_name;
179 } pointer_v2;
181 struct
183 unsigned short int len;
184 unsigned short int id;
185 cv_typ16_t elemtype;
186 cv_typ16_t idxtype;
187 unsigned short int arrlen; /* numeric leaf */
188 #if 0
189 struct p_string p_name;
190 #endif
191 } array_v1;
193 struct
195 unsigned short int len;
196 unsigned short int id;
197 cv_typ_t elemtype;
198 cv_typ_t idxtype;
199 unsigned short int arrlen; /* numeric leaf */
200 #if 0
201 struct p_string p_name;
202 #endif
203 } array_v2;
205 struct
207 unsigned short int len;
208 unsigned short int id;
209 cv_typ_t elemtype;
210 cv_typ_t idxtype;
211 unsigned short int arrlen; /* numeric leaf */
212 #if 0
213 char name[1];
214 #endif
215 } array_v3;
217 struct
219 unsigned short int len;
220 unsigned short int id;
221 short int n_element;
222 cv_typ16_t fieldlist;
223 cv_property_t property;
224 cv_typ16_t derived;
225 cv_typ16_t vshape;
226 unsigned short int structlen; /* numeric leaf */
227 #if 0
228 struct p_string p_name;
229 #endif
230 } struct_v1;
232 struct
234 unsigned short int len;
235 unsigned short int id;
236 short int n_element;
237 cv_property_t property;
238 cv_typ_t fieldlist;
239 cv_typ_t derived;
240 cv_typ_t vshape;
241 unsigned short int structlen; /* numeric leaf */
242 #if 0
243 struct p_string p_name;
244 #endif
245 } struct_v2;
247 struct
249 unsigned short int len;
250 unsigned short int id;
251 short int n_element;
252 cv_property_t property;
253 cv_typ_t fieldlist;
254 cv_typ_t derived;
255 cv_typ_t vshape;
256 unsigned short int structlen; /* numeric leaf */
257 #if 0
258 char name[1];
259 #endif
260 } struct_v3;
262 struct
264 unsigned short int len;
265 unsigned short int id;
266 short int count;
267 cv_typ16_t fieldlist;
268 cv_property_t property;
269 unsigned short int un_len; /* numeric leaf */
270 #if 0
271 struct p_string p_name;
272 #endif
273 } union_v1;
275 struct
277 unsigned short int len;
278 unsigned short int id;
279 short int count;
280 cv_property_t property;
281 cv_typ_t fieldlist;
282 unsigned short int un_len; /* numeric leaf */
283 #if 0
284 struct p_string p_name;
285 #endif
286 } union_v2;
288 struct
290 unsigned short int len;
291 unsigned short int id;
292 short int count;
293 cv_property_t property;
294 cv_typ_t fieldlist;
295 unsigned short int un_len; /* numeric leaf */
296 #if 0
297 char name[1];
298 #endif
299 } union_v3;
301 struct
303 unsigned short int len;
304 unsigned short int id;
305 short int count;
306 cv_typ16_t type;
307 cv_typ16_t fieldlist;
308 cv_property_t property;
309 struct p_string p_name;
310 } enumeration_v1;
312 struct
314 unsigned short int len;
315 unsigned short int id;
316 short int count;
317 cv_property_t property;
318 cv_typ_t type;
319 cv_typ_t fieldlist;
320 struct p_string p_name;
321 } enumeration_v2;
323 struct
325 unsigned short int len;
326 unsigned short int id;
327 short int count;
328 cv_property_t property;
329 cv_typ_t type;
330 cv_typ_t fieldlist;
331 char name[1];
332 } enumeration_v3;
334 struct
336 unsigned short int len;
337 unsigned short int id;
338 cv_typ16_t rvtype;
339 unsigned char callconv;
340 unsigned char funcattr;
341 unsigned short int params;
342 cv_typ16_t arglist;
343 } procedure_v1;
345 struct
347 unsigned short int len;
348 unsigned short int id;
349 cv_typ_t rvtype;
350 unsigned char callconv;
351 unsigned char funcattr;
352 unsigned short int params;
353 cv_typ_t arglist;
354 } procedure_v2;
356 struct
358 unsigned short int len;
359 unsigned short int id;
360 cv_typ16_t rvtype;
361 cv_typ16_t class_type;
362 cv_typ16_t this_type;
363 unsigned char callconv;
364 unsigned char funcattr;
365 unsigned short int params;
366 cv_typ16_t arglist;
367 unsigned int this_adjust;
368 } mfunction_v1;
370 struct
372 unsigned short int len;
373 unsigned short int id;
374 cv_typ_t rvtype;
375 cv_typ_t class_type;
376 cv_typ_t this_type;
377 unsigned char callconv;
378 unsigned char funcattr;
379 unsigned short params;
380 cv_typ_t arglist;
381 unsigned int this_adjust;
382 } mfunction_v2;
384 /* types found in IPI stream (#4) */
385 struct
387 unsigned short int len;
388 unsigned short int id; /* LF_FUNC_ID */
389 cv_itemid_t scopeId;
390 cv_typ_t type;
391 char name[1];
392 } func_id_v3;
394 struct
396 unsigned short int len;
397 unsigned short int id; /* LF_MFUNC_ID */
398 cv_typ_t parentType;
399 cv_typ_t type;
400 char name[1];
401 } mfunc_id_v3;
403 struct
405 unsigned short int len;
406 unsigned short int id; /* LF_STRING_ID */
407 cv_itemid_t strid;
408 char name[1];
409 } string_id_v3;
411 struct
413 unsigned short int len;
414 unsigned short int id; /* LF_UDT_SRC_LINE */
415 cv_typ_t type;
416 cv_itemid_t src;
417 unsigned int line;
418 } udt_src_line_v3;
420 struct
422 unsigned short int len;
423 unsigned short int id; /* LF_UDT_MOD_SRC_LINE */
424 cv_typ_t type;
425 cv_itemid_t src;
426 unsigned int line;
427 unsigned short imod;
428 } udt_mod_src_line_v3;
430 struct
432 unsigned short int len;
433 unsigned short int id; /* LF_BUILDINFO */
434 unsigned short count;
435 cv_itemid_t arg[1];
436 } buildinfo_v3;
440 union codeview_reftype
442 struct
444 unsigned short int len;
445 unsigned short int id;
446 } generic;
448 struct
450 unsigned short int len;
451 unsigned short int id;
452 unsigned char list[1];
453 } fieldlist;
455 struct
457 unsigned short int len;
458 unsigned short int id;
459 unsigned char nbits;
460 unsigned char bitoff;
461 cv_typ16_t type;
462 } bitfield_v1;
464 struct
466 unsigned short int len;
467 unsigned short int id;
468 cv_typ_t type;
469 unsigned char nbits;
470 unsigned char bitoff;
471 } bitfield_v2;
473 struct
475 unsigned short int len;
476 unsigned short int id;
477 unsigned short num;
478 cv_typ16_t args[1];
479 } arglist_v1;
481 struct
483 unsigned short int len;
484 unsigned short int id;
485 unsigned num;
486 cv_typ_t args[1];
487 } arglist_v2;
489 struct
491 unsigned short int len;
492 unsigned short int id;
493 unsigned short num;
494 cv_typ16_t drvdcls[1];
495 } derived_v1;
497 struct
499 unsigned short int len;
500 unsigned short int id;
501 unsigned num;
502 cv_typ_t drvdcls[1];
503 } derived_v2;
505 struct
507 unsigned short int len;
508 unsigned short int id;
509 cv_typ_t type;
510 cv_typ_t baseVftable;
511 unsigned offsetInObjectLayout;
512 unsigned cbstr;
513 char names[1]; /* array of len 0-terminated strings (size of cbstr in char:s) */
514 } vftable_v3;
517 union codeview_fieldtype
519 struct
521 unsigned short int id;
522 } generic;
524 struct
526 unsigned short int id;
527 cv_typ16_t type;
528 short int attribute;
529 unsigned short int offset; /* numeric leaf */
530 } bclass_v1;
532 struct
534 unsigned short int id;
535 short int attribute;
536 cv_typ_t type;
537 unsigned short int offset; /* numeric leaf */
538 } bclass_v2;
540 struct
542 unsigned short int id;
543 cv_typ16_t btype;
544 cv_typ16_t vbtype;
545 short int attribute;
546 unsigned short int vbpoff; /* numeric leaf */
547 #if 0
548 unsigned short int vboff; /* numeric leaf */
549 #endif
550 } vbclass_v1;
552 struct
554 unsigned short int id;
555 short int attribute;
556 cv_typ_t btype;
557 cv_typ_t vbtype;
558 unsigned short int vbpoff; /* numeric leaf */
559 #if 0
560 unsigned short int vboff; /* numeric leaf */
561 #endif
562 } vbclass_v2;
564 struct
566 unsigned short int id;
567 short int attribute;
568 unsigned short int value; /* numeric leaf */
569 #if 0
570 struct p_string p_name;
571 #endif
572 } enumerate_v1;
574 struct
576 unsigned short int id;
577 short int attribute;
578 unsigned short int value; /* numeric leaf */
579 #if 0
580 char name[1];
581 #endif
582 } enumerate_v3;
584 struct
586 unsigned short int id;
587 cv_typ16_t type;
588 struct p_string p_name;
589 } friendfcn_v1;
591 struct
593 unsigned short int id;
594 short int _pad0;
595 cv_typ_t type;
596 struct p_string p_name;
597 } friendfcn_v2;
599 struct
601 unsigned short int id;
602 short int _pad0;
603 cv_typ_t type;
604 char name[1];
605 } friendfcn_v3;
607 struct
609 unsigned short int id;
610 cv_typ16_t type;
611 short int attribute;
612 unsigned short int offset; /* numeric leaf */
613 #if 0
614 struct p_string p_name;
615 #endif
616 } member_v1;
618 struct
620 unsigned short int id;
621 short int attribute;
622 cv_typ_t type;
623 unsigned short int offset; /* numeric leaf */
624 #if 0
625 struct p_string p_name;
626 #endif
627 } member_v2;
629 struct
631 unsigned short int id;
632 short int attribute;
633 cv_typ_t type;
634 unsigned short int offset; /* numeric leaf */
635 #if 0
636 char name[1];
637 #endif
639 member_v3;
641 struct
643 unsigned short int id;
644 cv_typ16_t type;
645 short int attribute;
646 struct p_string p_name;
647 } stmember_v1;
649 struct
651 unsigned short int id;
652 short int attribute;
653 cv_typ_t type;
654 struct p_string p_name;
655 } stmember_v2;
657 struct
659 unsigned short int id;
660 short int attribute;
661 cv_typ_t type;
662 char name[1];
663 } stmember_v3;
665 struct
667 unsigned short int id;
668 short int count;
669 cv_typ16_t mlist;
670 struct p_string p_name;
671 } method_v1;
673 struct
675 unsigned short int id;
676 short int count;
677 cv_typ_t mlist;
678 struct p_string p_name;
679 } method_v2;
681 struct
683 unsigned short int id;
684 short int count;
685 cv_typ_t mlist;
686 char name[1];
687 } method_v3;
689 struct
691 unsigned short int id;
692 cv_typ16_t type;
693 struct p_string p_name;
694 } nesttype_v1;
696 struct
698 unsigned short int id;
699 short int _pad0;
700 cv_typ_t type;
701 struct p_string p_name;
702 } nesttype_v2;
704 struct
706 unsigned short int id;
707 short int _pad0;
708 cv_typ_t type;
709 char name[1];
710 } nesttype_v3;
712 struct
714 unsigned short int id;
715 cv_typ16_t type;
716 } vfunctab_v1;
718 struct
720 unsigned short int id;
721 short int _pad0;
722 cv_typ_t type;
723 } vfunctab_v2;
725 struct
727 unsigned short int id;
728 cv_typ16_t type;
729 } friendcls_v1;
731 struct
733 unsigned short int id;
734 short int _pad0;
735 cv_typ_t type;
736 } friendcls_v2;
738 struct
740 unsigned short int id;
741 short int attribute;
742 cv_typ16_t type;
743 struct p_string p_name;
744 } onemethod_v1;
746 struct
748 unsigned short int id;
749 short int attribute;
750 cv_typ_t type;
751 struct p_string p_name;
752 } onemethod_v2;
754 struct
756 unsigned short int id;
757 short int attribute;
758 cv_typ_t type;
759 char name[1];
760 } onemethod_v3;
762 struct
764 unsigned short int id;
765 short int attribute;
766 cv_typ16_t type;
767 unsigned int vtab_offset;
768 struct p_string p_name;
769 } onemethod_virt_v1;
771 struct
773 unsigned short int id;
774 short int attribute;
775 cv_typ_t type;
776 unsigned int vtab_offset;
777 struct p_string p_name;
778 } onemethod_virt_v2;
780 struct
782 unsigned short int id;
783 short int attribute;
784 cv_typ_t type;
785 unsigned int vtab_offset;
786 char name[1];
787 } onemethod_virt_v3;
789 struct
791 unsigned short int id;
792 cv_typ16_t type;
793 unsigned int offset;
794 } vfuncoff_v1;
796 struct
798 unsigned short int id;
799 short int _pad0;
800 cv_typ_t type;
801 unsigned int offset;
802 } vfuncoff_v2;
804 struct
806 unsigned short int id;
807 short int attribute;
808 cv_typ16_t type;
809 struct p_string p_name;
810 } nesttypeex_v1;
812 struct
814 unsigned short int id;
815 short int attribute;
816 cv_typ_t type;
817 struct p_string p_name;
818 } nesttypeex_v2;
820 struct
822 unsigned short int id;
823 short int attribute;
824 cv_typ_t type;
825 struct p_string p_name;
826 } membermodify_v2;
828 struct
830 unsigned short int id;
831 cv_typ16_t ref;
832 } index_v1;
834 struct
836 unsigned short int id;
837 short int _pad0;
838 cv_typ_t ref;
839 } index_v2;
844 * This covers the basic datatypes that VC++ seems to be using these days.
845 * 32 bit mode only. There are additional numbers for the pointers in 16
846 * bit mode. There are many other types listed in the documents, but these
847 * are apparently not used by the compiler, or represent pointer types
848 * that are not used.
850 * Official MS documentation says that type (< 0x4000, so 12 bits) is made of:
851 * +----------+------+------+----------+------+
852 * | 11 | 10-8 | 7-4 | 3 | 2-0 |
853 * +----------+------+------+----------+------+
854 * | reserved | mode | type | reserved | size |
855 * +----------+------+------+----------+------+
856 * In recent PDB files, type 8 exists, and is seen as an HRESULT... So we've
857 * added this basic type... as if bit 3 had been integrated into the size field
860 /* the type number of a built-in type is a 16-bit value specified in the following format:
861 bit # | 11 | 10-8 | 7-4 | 3 | 2-0 |
862 field | reserved | mode | type | reserved | size |
864 where
865 <type> is one of the following types:
866 0x00 Special
867 0x01 Signed integral value
868 0x02 Unsigned integral value
869 0x03 Boolean
870 0x04 Real
871 0x05 Complex
872 0x06 Special2
873 0x07 Real int value
874 0x08 Reserved
875 0x09 Reserved
876 0x0a Reserved
877 0x0b Reserved
878 0x0c Reserved
879 0x0d Reserved
880 0x0e Reserved
881 0x0f Reserved for debugger expression evaluator
883 <size> is an enumerated value for each of the types.
884 Type = special
885 0x00 No type
886 0x01 Absolute symbol
887 0x02 Segment
888 0x03 Void
889 0x04 Basic 8-byte currency value
890 0x05 Near Basic string
891 0x06 Far Basic string
892 0x07 Untranslated type from previous Microsoft symbol formats
893 Type = signed/unsigned integral and Boolean values
894 0x00 1 byte
895 0x01 2 byte
896 0x02 4 byte
897 0x03 8 byte
898 0x04 Reserved
899 0x05 Reserved
900 0x06 Reserved
901 0x07 Reserved
902 Type = real and complex
903 0x00 32 bit
904 0x01 64 bit
905 0x02 80 bit
906 0x03 128 bit
907 0x04 48 bit
908 0x05 Reserved
909 0x06 Reserved
910 0x07 Reserved
911 Type = special2
912 0x00 Bit
913 0x01 Pascal CHAR
914 Type = Real int
915 0x00 Char
916 0x01 Wide character
917 0x02 2-byte signed integer
918 0x03 2-byte unsigned integer
919 0x04 4-byte signed integer
920 0x05 4-byte unsigned integer
921 0x06 8-byte signed integer
922 0x07 8-byte unsigned integer
924 <mode> is the pointer mode:
925 0x00 Direct; not a pointer
926 0x01 Near pointer
927 0x02 Far pointer
928 0x03 Huge pointer
929 0x04 32-bit near pointer
930 0x05 32-bit far pointer
931 0x06 64-bit near pointer
932 0x07 Reserved
935 /* basic types */
936 #define T_NOTYPE 0x0000 /* Notype */
937 #define T_ABS 0x0001 /* Abs */
938 #define T_SEGMENT 0x0002 /* segment type */
939 #define T_VOID 0x0003 /* Void */
940 #define T_CURRENCY 0x0004 /* basic 8-byte currency value */
941 #define T_NBASICSTR 0x0005 /* near basic string */
942 #define T_FBASICSTR 0x0006 /* far basic string */
943 #define T_NOTTRANS 0x0007 /* untranslated type record from MS symbol format */
944 #define T_HRESULT 0x0008 /* HRESULT - or error code ??? */
945 #define T_CHAR 0x0010 /* signed char */
946 #define T_SHORT 0x0011 /* short */
947 #define T_LONG 0x0012 /* long */
948 #define T_QUAD 0x0013 /* long long */
949 #define T_UCHAR 0x0020 /* unsigned char */
950 #define T_USHORT 0x0021 /* unsigned short */
951 #define T_ULONG 0x0022 /* unsigned long */
952 #define T_UQUAD 0x0023 /* unsigned long long */
953 #define T_BOOL08 0x0030 /* 8-bit boolean */
954 #define T_BOOL16 0x0031 /* 16-bit boolean */
955 #define T_BOOL32 0x0032 /* 32-bit boolean */
956 #define T_BOOL64 0x0033 /* 64-bit boolean */
957 #define T_REAL32 0x0040 /* float */
958 #define T_REAL64 0x0041 /* double */
959 #define T_REAL80 0x0042 /* 80-bit real */
960 #define T_REAL128 0x0043 /* 128-bit real */
961 #define T_REAL48 0x0044 /* 48-bit real */
962 #define T_CPLX32 0x0050 /* 32-bit complex number */
963 #define T_CPLX64 0x0051 /* 64-bit complex number */
964 #define T_CPLX80 0x0052 /* 80-bit complex number */
965 #define T_CPLX128 0x0053 /* 128-bit complex number */
966 #define T_BIT 0x0060 /* bit */
967 #define T_PASCHAR 0x0061 /* pascal CHAR */
968 #define T_RCHAR 0x0070 /* real char */
969 #define T_WCHAR 0x0071 /* wide char */
970 #define T_INT2 0x0072 /* real 16-bit signed int */
971 #define T_UINT2 0x0073 /* real 16-bit unsigned int */
972 #define T_INT4 0x0074 /* int */
973 #define T_UINT4 0x0075 /* unsigned int */
974 #define T_INT8 0x0076 /* 64-bit signed int */
975 #define T_UINT8 0x0077 /* 64-bit unsigned int */
976 #define T_CHAR16 0x007a /* 16-bit unicode char */
977 #define T_CHAR32 0x007b /* 32-bit unicode char */
978 #define T_CHAR8 0x007c /* 8-bit unicode char (C++ 20) */
980 /* near pointers to basic types */
981 #define T_PVOID 0x0103 /* near pointer to void */
982 #define T_PCHAR 0x0110 /* Near pointer to 8-bit signed */
983 #define T_PSHORT 0x0111 /* Near pointer to 16-bit signed */
984 #define T_PLONG 0x0112 /* Near pointer to 32-bit signed */
985 #define T_PQUAD 0x0113 /* Near pointer to 64-bit signed */
986 #define T_PUCHAR 0x0120 /* Near pointer to 8-bit unsigned */
987 #define T_PUSHORT 0x0121 /* Near pointer to 16-bit unsigned */
988 #define T_PULONG 0x0122 /* Near pointer to 32-bit unsigned */
989 #define T_PUQUAD 0x0123 /* Near pointer to 64-bit unsigned */
990 #define T_PBOOL08 0x0130 /* Near pointer to 8-bit Boolean */
991 #define T_PBOOL16 0x0131 /* Near pointer to 16-bit Boolean */
992 #define T_PBOOL32 0x0132 /* Near pointer to 32-bit Boolean */
993 #define T_PBOOL64 0x0133 /* Near pointer to 64-bit Boolean */
994 #define T_PREAL32 0x0140 /* Near pointer to 32-bit real */
995 #define T_PREAL64 0x0141 /* Near pointer to 64-bit real */
996 #define T_PREAL80 0x0142 /* Near pointer to 80-bit real */
997 #define T_PREAL128 0x0143 /* Near pointer to 128-bit real */
998 #define T_PREAL48 0x0144 /* Near pointer to 48-bit real */
999 #define T_PCPLX32 0x0150 /* Near pointer to 32-bit complex */
1000 #define T_PCPLX64 0x0151 /* Near pointer to 64-bit complex */
1001 #define T_PCPLX80 0x0152 /* Near pointer to 80-bit complex */
1002 #define T_PCPLX128 0x0153 /* Near pointer to 128-bit complex */
1003 #define T_PRCHAR 0x0170 /* Near pointer to a real char */
1004 #define T_PWCHAR 0x0171 /* Near pointer to a wide char */
1005 #define T_PINT2 0x0172 /* Near pointer to 16-bit signed int */
1006 #define T_PUINT2 0x0173 /* Near pointer to 16-bit unsigned int */
1007 #define T_PINT4 0x0174 /* Near pointer to 32-bit signed int */
1008 #define T_PUINT4 0x0175 /* Near pointer to 32-bit unsigned int */
1009 #define T_PINT8 0x0176 /* Near pointer to 64-bit signed int */
1010 #define T_PUINT8 0x0177 /* Near pointer to 64-bit unsigned int */
1011 #define T_PCHAR16 0x017a /* Near pointer to 16-bit unicode char */
1012 #define T_PCHAR32 0x017b /* Near pointer to 32-bit unicode char */
1013 #define T_PCHAR8 0x017c /* Near pointer to 8-bit unicode char */
1015 /* far pointers to basic types */
1016 #define T_PFVOID 0x0203 /* Far pointer to void */
1017 #define T_PFCHAR 0x0210 /* Far pointer to 8-bit signed */
1018 #define T_PFSHORT 0x0211 /* Far pointer to 16-bit signed */
1019 #define T_PFLONG 0x0212 /* Far pointer to 32-bit signed */
1020 #define T_PFQUAD 0x0213 /* Far pointer to 64-bit signed */
1021 #define T_PFUCHAR 0x0220 /* Far pointer to 8-bit unsigned */
1022 #define T_PFUSHORT 0x0221 /* Far pointer to 16-bit unsigned */
1023 #define T_PFULONG 0x0222 /* Far pointer to 32-bit unsigned */
1024 #define T_PFUQUAD 0x0223 /* Far pointer to 64-bit unsigned */
1025 #define T_PFBOOL08 0x0230 /* Far pointer to 8-bit Boolean */
1026 #define T_PFBOOL16 0x0231 /* Far pointer to 16-bit Boolean */
1027 #define T_PFBOOL32 0x0232 /* Far pointer to 32-bit Boolean */
1028 #define T_PFBOOL64 0x0233 /* Far pointer to 64-bit Boolean */
1029 #define T_PFREAL32 0x0240 /* Far pointer to 32-bit real */
1030 #define T_PFREAL64 0x0241 /* Far pointer to 64-bit real */
1031 #define T_PFREAL80 0x0242 /* Far pointer to 80-bit real */
1032 #define T_PFREAL128 0x0243 /* Far pointer to 128-bit real */
1033 #define T_PFREAL48 0x0244 /* Far pointer to 48-bit real */
1034 #define T_PFCPLX32 0x0250 /* Far pointer to 32-bit complex */
1035 #define T_PFCPLX64 0x0251 /* Far pointer to 64-bit complex */
1036 #define T_PFCPLX80 0x0252 /* Far pointer to 80-bit complex */
1037 #define T_PFCPLX128 0x0253 /* Far pointer to 128-bit complex */
1038 #define T_PFRCHAR 0x0270 /* Far pointer to a real char */
1039 #define T_PFWCHAR 0x0271 /* Far pointer to a wide char */
1040 #define T_PFINT2 0x0272 /* Far pointer to 16-bit signed int */
1041 #define T_PFUINT2 0x0273 /* Far pointer to 16-bit unsigned int */
1042 #define T_PFINT4 0x0274 /* Far pointer to 32-bit signed int */
1043 #define T_PFUINT4 0x0275 /* Far pointer to 32-bit unsigned int */
1044 #define T_PFINT8 0x0276 /* Far pointer to 64-bit signed int */
1045 #define T_PFUINT8 0x0277 /* Far pointer to 64-bit unsigned int */
1046 #define T_PFCHAR16 0x027a /* Far pointer to 16-bit unicode char */
1047 #define T_PFCHAR32 0x027b /* Far pointer to 32-bit unicode char */
1048 #define T_PFCHAR8 0x027c /* Far pointer to 8-bit unicode char */
1050 /* huge pointers to basic types */
1051 #define T_PHVOID 0x0303 /* Huge pointer to void */
1052 #define T_PHCHAR 0x0310 /* Huge pointer to 8-bit signed */
1053 #define T_PHSHORT 0x0311 /* Huge pointer to 16-bit signed */
1054 #define T_PHLONG 0x0312 /* Huge pointer to 32-bit signed */
1055 #define T_PHQUAD 0x0313 /* Huge pointer to 64-bit signed */
1056 #define T_PHUCHAR 0x0320 /* Huge pointer to 8-bit unsigned */
1057 #define T_PHUSHORT 0x0321 /* Huge pointer to 16-bit unsigned */
1058 #define T_PHULONG 0x0322 /* Huge pointer to 32-bit unsigned */
1059 #define T_PHUQUAD 0x0323 /* Huge pointer to 64-bit unsigned */
1060 #define T_PHBOOL08 0x0330 /* Huge pointer to 8-bit Boolean */
1061 #define T_PHBOOL16 0x0331 /* Huge pointer to 16-bit Boolean */
1062 #define T_PHBOOL32 0x0332 /* Huge pointer to 32-bit Boolean */
1063 #define T_PHBOOL64 0x0333 /* Huge pointer to 64-bit Boolean */
1064 #define T_PHREAL32 0x0340 /* Huge pointer to 32-bit real */
1065 #define T_PHREAL64 0x0341 /* Huge pointer to 64-bit real */
1066 #define T_PHREAL80 0x0342 /* Huge pointer to 80-bit real */
1067 #define T_PHREAL128 0x0343 /* Huge pointer to 128-bit real */
1068 #define T_PHREAL48 0x0344 /* Huge pointer to 48-bit real */
1069 #define T_PHCPLX32 0x0350 /* Huge pointer to 32-bit complex */
1070 #define T_PHCPLX64 0x0351 /* Huge pointer to 64-bit complex */
1071 #define T_PHCPLX80 0x0352 /* Huge pointer to 80-bit complex */
1072 #define T_PHCPLX128 0x0353 /* Huge pointer to 128-bit real */
1073 #define T_PHRCHAR 0x0370 /* Huge pointer to a real char */
1074 #define T_PHWCHAR 0x0371 /* Huge pointer to a wide char */
1075 #define T_PHINT2 0x0372 /* Huge pointer to 16-bit signed int */
1076 #define T_PHUINT2 0x0373 /* Huge pointer to 16-bit unsigned int */
1077 #define T_PHINT4 0x0374 /* Huge pointer to 32-bit signed int */
1078 #define T_PHUINT4 0x0375 /* Huge pointer to 32-bit unsigned int */
1079 #define T_PHINT8 0x0376 /* Huge pointer to 64-bit signed int */
1080 #define T_PHUINT8 0x0377 /* Huge pointer to 64-bit unsigned int */
1081 #define T_PHCHAR16 0x037a /* Huge pointer to 16-bit unicode char */
1082 #define T_PHCHAR32 0x037b /* Huge pointer to 32-bit unicode char */
1083 #define T_PHCHAR8 0x037c /* Huge pointer to 8-bit unicode char */
1085 /* 32-bit near pointers to basic types */
1086 #define T_32PVOID 0x0403 /* 32-bit near pointer to void */
1087 #define T_32PHRESULT 0x0408 /* 16:32 near pointer to HRESULT - or error code ??? */
1088 #define T_32PCHAR 0x0410 /* 16:32 near pointer to 8-bit signed */
1089 #define T_32PSHORT 0x0411 /* 16:32 near pointer to 16-bit signed */
1090 #define T_32PLONG 0x0412 /* 16:32 near pointer to 32-bit signed */
1091 #define T_32PQUAD 0x0413 /* 16:32 near pointer to 64-bit signed */
1092 #define T_32PUCHAR 0x0420 /* 16:32 near pointer to 8-bit unsigned */
1093 #define T_32PUSHORT 0x0421 /* 16:32 near pointer to 16-bit unsigned */
1094 #define T_32PULONG 0x0422 /* 16:32 near pointer to 32-bit unsigned */
1095 #define T_32PUQUAD 0x0423 /* 16:32 near pointer to 64-bit unsigned */
1096 #define T_32PBOOL08 0x0430 /* 16:32 near pointer to 8-bit Boolean */
1097 #define T_32PBOOL16 0x0431 /* 16:32 near pointer to 16-bit Boolean */
1098 #define T_32PBOOL32 0x0432 /* 16:32 near pointer to 32-bit Boolean */
1099 #define T_32PBOOL64 0x0433 /* 16:32 near pointer to 64-bit Boolean */
1100 #define T_32PREAL32 0x0440 /* 16:32 near pointer to 32-bit real */
1101 #define T_32PREAL64 0x0441 /* 16:32 near pointer to 64-bit real */
1102 #define T_32PREAL80 0x0442 /* 16:32 near pointer to 80-bit real */
1103 #define T_32PREAL128 0x0443 /* 16:32 near pointer to 128-bit real */
1104 #define T_32PREAL48 0x0444 /* 16:32 near pointer to 48-bit real */
1105 #define T_32PCPLX32 0x0450 /* 16:32 near pointer to 32-bit complex */
1106 #define T_32PCPLX64 0x0451 /* 16:32 near pointer to 64-bit complex */
1107 #define T_32PCPLX80 0x0452 /* 16:32 near pointer to 80-bit complex */
1108 #define T_32PCPLX128 0x0453 /* 16:32 near pointer to 128-bit complex */
1109 #define T_32PRCHAR 0x0470 /* 16:32 near pointer to a real char */
1110 #define T_32PWCHAR 0x0471 /* 16:32 near pointer to a wide char */
1111 #define T_32PINT2 0x0472 /* 16:32 near pointer to 16-bit signed int */
1112 #define T_32PUINT2 0x0473 /* 16:32 near pointer to 16-bit unsigned int */
1113 #define T_32PINT4 0x0474 /* 16:32 near pointer to 32-bit signed int */
1114 #define T_32PUINT4 0x0475 /* 16:32 near pointer to 32-bit unsigned int */
1115 #define T_32PINT8 0x0476 /* 16:32 near pointer to 64-bit signed int */
1116 #define T_32PUINT8 0x0477 /* 16:32 near pointer to 64-bit unsigned int */
1117 #define T_32PCHAR16 0x047a /* 16:32 near pointer to 16-bit unicode char */
1118 #define T_32PCHAR32 0x047b /* 16:32 near pointer to 32-bit unicode char */
1119 #define T_32PCHAR8 0x047c /* 16:32 near pointer to 8-bit unicode char */
1121 /* 32-bit far pointers to basic types */
1122 #define T_32PFVOID 0x0503 /* 32-bit far pointer to void */
1123 #define T_32PFHRESULT 0x0508 /* 16:32 far pointer to HRESULT - or error code ??? */
1124 #define T_32PFCHAR 0x0510 /* 16:32 far pointer to 8-bit signed */
1125 #define T_32PFSHORT 0x0511 /* 16:32 far pointer to 16-bit signed */
1126 #define T_32PFLONG 0x0512 /* 16:32 far pointer to 32-bit signed */
1127 #define T_32PFQUAD 0x0513 /* 16:32 far pointer to 64-bit signed */
1128 #define T_32PFUCHAR 0x0520 /* 16:32 far pointer to 8-bit unsigned */
1129 #define T_32PFUSHORT 0x0521 /* 16:32 far pointer to 16-bit unsigned */
1130 #define T_32PFULONG 0x0522 /* 16:32 far pointer to 32-bit unsigned */
1131 #define T_32PFUQUAD 0x0523 /* 16:32 far pointer to 64-bit unsigned */
1132 #define T_32PFBOOL08 0x0530 /* 16:32 far pointer to 8-bit Boolean */
1133 #define T_32PFBOOL16 0x0531 /* 16:32 far pointer to 16-bit Boolean */
1134 #define T_32PFBOOL32 0x0532 /* 16:32 far pointer to 32-bit Boolean */
1135 #define T_32PFBOOL64 0x0533 /* 16:32 far pointer to 64-bit Boolean */
1136 #define T_32PFREAL32 0x0540 /* 16:32 far pointer to 32-bit real */
1137 #define T_32PFREAL64 0x0541 /* 16:32 far pointer to 64-bit real */
1138 #define T_32PFREAL80 0x0542 /* 16:32 far pointer to 80-bit real */
1139 #define T_32PFREAL128 0x0543 /* 16:32 far pointer to 128-bit real */
1140 #define T_32PFREAL48 0x0544 /* 16:32 far pointer to 48-bit real */
1141 #define T_32PFCPLX32 0x0550 /* 16:32 far pointer to 32-bit complex */
1142 #define T_32PFCPLX64 0x0551 /* 16:32 far pointer to 64-bit complex */
1143 #define T_32PFCPLX80 0x0552 /* 16:32 far pointer to 80-bit complex */
1144 #define T_32PFCPLX128 0x0553 /* 16:32 far pointer to 128-bit complex */
1145 #define T_32PFRCHAR 0x0570 /* 16:32 far pointer to a real char */
1146 #define T_32PFWCHAR 0x0571 /* 16:32 far pointer to a wide char */
1147 #define T_32PFINT2 0x0572 /* 16:32 far pointer to 16-bit signed int */
1148 #define T_32PFUINT2 0x0573 /* 16:32 far pointer to 16-bit unsigned int */
1149 #define T_32PFINT4 0x0574 /* 16:32 far pointer to 32-bit signed int */
1150 #define T_32PFUINT4 0x0575 /* 16:32 far pointer to 32-bit unsigned int */
1151 #define T_32PFINT8 0x0576 /* 16:32 far pointer to 64-bit signed int */
1152 #define T_32PFUINT8 0x0577 /* 16:32 far pointer to 64-bit unsigned int */
1153 #define T_32PFCHAR16 0x057a /* 16:32 far pointer to 16-bit unicode char */
1154 #define T_32PFCHAR32 0x057b /* 16:32 far pointer to 32-bit unicode char */
1155 #define T_32PFCHAR8 0x057c /* 16:32 far pointer to 8-bit unicode char */
1157 /* 64-bit near pointers to basic types */
1158 #define T_64PVOID 0x0603 /* 64-bit near pointer to void */
1159 #define T_64PHRESULT 0x0608 /* 64 near pointer to HRESULT - or error code ??? */
1160 #define T_64PCHAR 0x0610 /* 64 near pointer to 8-bit signed */
1161 #define T_64PSHORT 0x0611 /* 64 near pointer to 16-bit signed */
1162 #define T_64PLONG 0x0612 /* 64 near pointer to 32-bit signed */
1163 #define T_64PQUAD 0x0613 /* 64 near pointer to 64-bit signed */
1164 #define T_64PUCHAR 0x0620 /* 64 near pointer to 8-bit unsigned */
1165 #define T_64PUSHORT 0x0621 /* 64 near pointer to 16-bit unsigned */
1166 #define T_64PULONG 0x0622 /* 64 near pointer to 32-bit unsigned */
1167 #define T_64PUQUAD 0x0623 /* 64 near pointer to 64-bit unsigned */
1168 #define T_64PBOOL08 0x0630 /* 64 near pointer to 8-bit Boolean */
1169 #define T_64PBOOL16 0x0631 /* 64 near pointer to 16-bit Boolean */
1170 #define T_64PBOOL32 0x0632 /* 64 near pointer to 32-bit Boolean */
1171 #define T_64PBOOL64 0x0633 /* 64 near pointer to 64-bit Boolean */
1172 #define T_64PREAL32 0x0640 /* 64 near pointer to 32-bit real */
1173 #define T_64PREAL64 0x0641 /* 64 near pointer to 64-bit real */
1174 #define T_64PREAL80 0x0642 /* 64 near pointer to 80-bit real */
1175 #define T_64PREAL128 0x0643 /* 64 near pointer to 128-bit real */
1176 #define T_64PREAL48 0x0644 /* 64 near pointer to 48-bit real */
1177 #define T_64PCPLX32 0x0650 /* 64 near pointer to 32-bit complex */
1178 #define T_64PCPLX64 0x0651 /* 64 near pointer to 64-bit complex */
1179 #define T_64PCPLX80 0x0652 /* 64 near pointer to 80-bit complex */
1180 #define T_64PCPLX128 0x0653 /* 64 near pointer to 128-bit complex */
1181 #define T_64PRCHAR 0x0670 /* 64 near pointer to a real char */
1182 #define T_64PWCHAR 0x0671 /* 64 near pointer to a wide char */
1183 #define T_64PINT2 0x0672 /* 64 near pointer to 16-bit signed int */
1184 #define T_64PUINT2 0x0673 /* 64 near pointer to 16-bit unsigned int */
1185 #define T_64PINT4 0x0674 /* 64 near pointer to 32-bit signed int */
1186 #define T_64PUINT4 0x0675 /* 64 near pointer to 32-bit unsigned int */
1187 #define T_64PINT8 0x0676 /* 64 near pointer to 64-bit signed int */
1188 #define T_64PUINT8 0x0677 /* 64 near pointer to 64-bit unsigned int */
1189 #define T_64PCHAR16 0x067a /* 64 near pointer to 16-bit unicode char */
1190 #define T_64PCHAR32 0x067b /* 64 near pointer to 32-bit unicode char */
1191 #define T_64PCHAR8 0x067c /* 64 near pointer to 8-bit unicode char */
1193 /* counts, bit masks, and shift values needed to access various parts of the built-in type numbers */
1194 #define T_FIRSTDEFINABLETYPE 0x1000 /* first type index that's not predefined */
1195 #define T_MAXPREDEFINEDTYPE 0x0680 /* maximum type index for all built-in types */
1196 #define T_MAXBASICTYPE 0x0080 /* maximum type index all non-pointer built-in types */
1197 #define T_BASICTYPE_MASK 0x00ff /* mask of bits that can potentially identify a non-pointer basic type */
1198 #define T_BASICTYPE_SHIFT 8 /* shift count to push out the basic type bits from a type number */
1199 #define T_MODE_MASK 0x0700 /* type mode mask (ptr/non-ptr) */
1200 #define T_SIZE_MASK 0x0007 /* type size mask (depends on 'type' value) */
1201 #define T_TYPE_MASK 0x00f0 /* type type mask (data treatment mode) */
1203 /* bit patterns for the <mode> portion of a built-in type number */
1204 #define T_NEARPTR_BITS 0x0100
1205 #define T_FARPTR_BITS 0x0200
1206 #define T_HUGEPTR_BITS 0x0300
1207 #define T_NEAR32PTR_BITS 0x0400
1208 #define T_FAR32PTR_BITS 0x0500
1209 #define T_NEAR64PTR_BITS 0x0600
1211 #define LF_MODIFIER_V1 0x0001
1212 #define LF_POINTER_V1 0x0002
1213 #define LF_ARRAY_V1 0x0003
1214 #define LF_CLASS_V1 0x0004
1215 #define LF_STRUCTURE_V1 0x0005
1216 #define LF_UNION_V1 0x0006
1217 #define LF_ENUM_V1 0x0007
1218 #define LF_PROCEDURE_V1 0x0008
1219 #define LF_MFUNCTION_V1 0x0009
1220 #define LF_VTSHAPE_V1 0x000a
1221 #define LF_COBOL0_V1 0x000b
1222 #define LF_COBOL1_V1 0x000c
1223 #define LF_BARRAY_V1 0x000d
1224 #define LF_LABEL_V1 0x000e
1225 #define LF_NULL_V1 0x000f
1226 #define LF_NOTTRAN_V1 0x0010
1227 #define LF_DIMARRAY_V1 0x0011
1228 #define LF_VFTPATH_V1 0x0012
1229 #define LF_PRECOMP_V1 0x0013
1230 #define LF_ENDPRECOMP_V1 0x0014
1231 #define LF_OEM_V1 0x0015
1232 #define LF_TYPESERVER_V1 0x0016
1234 #define LF_MODIFIER_V2 0x1001 /* variants with new 32-bit type indices (V2) */
1235 #define LF_POINTER_V2 0x1002
1236 #define LF_ARRAY_V2 0x1003
1237 #define LF_CLASS_V2 0x1004
1238 #define LF_STRUCTURE_V2 0x1005
1239 #define LF_UNION_V2 0x1006
1240 #define LF_ENUM_V2 0x1007
1241 #define LF_PROCEDURE_V2 0x1008
1242 #define LF_MFUNCTION_V2 0x1009
1243 #define LF_COBOL0_V2 0x100a
1244 #define LF_BARRAY_V2 0x100b
1245 #define LF_DIMARRAY_V2 0x100c
1246 #define LF_VFTPATH_V2 0x100d
1247 #define LF_PRECOMP_V2 0x100e
1248 #define LF_OEM_V2 0x100f
1250 #define LF_SKIP_V1 0x0200
1251 #define LF_ARGLIST_V1 0x0201
1252 #define LF_DEFARG_V1 0x0202
1253 #define LF_LIST_V1 0x0203
1254 #define LF_FIELDLIST_V1 0x0204
1255 #define LF_DERIVED_V1 0x0205
1256 #define LF_BITFIELD_V1 0x0206
1257 #define LF_METHODLIST_V1 0x0207
1258 #define LF_DIMCONU_V1 0x0208
1259 #define LF_DIMCONLU_V1 0x0209
1260 #define LF_DIMVARU_V1 0x020a
1261 #define LF_DIMVARLU_V1 0x020b
1262 #define LF_REFSYM_V1 0x020c
1264 #define LF_SKIP_V2 0x1200 /* variants with new 32-bit type indices (V2) */
1265 #define LF_ARGLIST_V2 0x1201
1266 #define LF_DEFARG_V2 0x1202
1267 #define LF_FIELDLIST_V2 0x1203
1268 #define LF_DERIVED_V2 0x1204
1269 #define LF_BITFIELD_V2 0x1205
1270 #define LF_METHODLIST_V2 0x1206
1271 #define LF_DIMCONU_V2 0x1207
1272 #define LF_DIMCONLU_V2 0x1208
1273 #define LF_DIMVARU_V2 0x1209
1274 #define LF_DIMVARLU_V2 0x120a
1276 /* Field lists */
1277 #define LF_BCLASS_V1 0x0400
1278 #define LF_VBCLASS_V1 0x0401
1279 #define LF_IVBCLASS_V1 0x0402
1280 #define LF_ENUMERATE_V1 0x0403
1281 #define LF_FRIENDFCN_V1 0x0404
1282 #define LF_INDEX_V1 0x0405
1283 #define LF_MEMBER_V1 0x0406
1284 #define LF_STMEMBER_V1 0x0407
1285 #define LF_METHOD_V1 0x0408
1286 #define LF_NESTTYPE_V1 0x0409
1287 #define LF_VFUNCTAB_V1 0x040a
1288 #define LF_FRIENDCLS_V1 0x040b
1289 #define LF_ONEMETHOD_V1 0x040c
1290 #define LF_VFUNCOFF_V1 0x040d
1291 #define LF_NESTTYPEEX_V1 0x040e
1292 #define LF_MEMBERMODIFY_V1 0x040f
1294 #define LF_BCLASS_V2 0x1400 /* variants with new 32-bit type indices (V2) */
1295 #define LF_VBCLASS_V2 0x1401
1296 #define LF_IVBCLASS_V2 0x1402
1297 #define LF_FRIENDFCN_V2 0x1403
1298 #define LF_INDEX_V2 0x1404
1299 #define LF_MEMBER_V2 0x1405
1300 #define LF_STMEMBER_V2 0x1406
1301 #define LF_METHOD_V2 0x1407
1302 #define LF_NESTTYPE_V2 0x1408
1303 #define LF_VFUNCTAB_V2 0x1409
1304 #define LF_FRIENDCLS_V2 0x140a
1305 #define LF_ONEMETHOD_V2 0x140b
1306 #define LF_VFUNCOFF_V2 0x140c
1307 #define LF_NESTTYPEEX_V2 0x140d
1309 #define LF_ENUMERATE_V3 0x1502
1310 #define LF_ARRAY_V3 0x1503
1311 #define LF_CLASS_V3 0x1504
1312 #define LF_STRUCTURE_V3 0x1505
1313 #define LF_UNION_V3 0x1506
1314 #define LF_ENUM_V3 0x1507
1315 #define LF_FRIENDFCN_V3 0x150c
1316 #define LF_MEMBER_V3 0x150d
1317 #define LF_STMEMBER_V3 0x150e
1318 #define LF_METHOD_V3 0x150f
1319 #define LF_NESTTYPE_V3 0x1510
1320 #define LF_ONEMETHOD_V3 0x1511
1321 #define LF_VFTABLE_V3 0x151d
1323 /* leaves found in second type type (aka IPI)
1324 * for simplicity, stored in the same union as other TPI leaves
1326 #define LF_FUNC_ID 0x1601
1327 #define LF_MFUNC_ID 0x1602
1328 #define LF_BUILDINFO 0x1603
1329 #define LF_SUBSTR_LIST 0x1604
1330 #define LF_STRING_ID 0x1605
1331 #define LF_UDT_SRC_LINE 0x1606
1332 #define LF_UDT_MOD_SRC_LINE 0x1607
1334 #define LF_NUMERIC 0x8000 /* numeric leaf types */
1335 #define LF_CHAR 0x8000
1336 #define LF_SHORT 0x8001
1337 #define LF_USHORT 0x8002
1338 #define LF_LONG 0x8003
1339 #define LF_ULONG 0x8004
1340 #define LF_REAL32 0x8005
1341 #define LF_REAL64 0x8006
1342 #define LF_REAL80 0x8007
1343 #define LF_REAL128 0x8008
1344 #define LF_QUADWORD 0x8009
1345 #define LF_UQUADWORD 0x800a
1346 #define LF_REAL48 0x800b
1347 #define LF_COMPLEX32 0x800c
1348 #define LF_COMPLEX64 0x800d
1349 #define LF_COMPLEX80 0x800e
1350 #define LF_COMPLEX128 0x800f
1351 #define LF_VARSTRING 0x8010
1353 /* symtype e.g. for public_vx.symtype */
1354 #define SYMTYPE_NONE 0x0000
1355 #define SYMTYPE_CODE 0x0001
1356 #define SYMTYPE_FUNCTION 0x0002
1357 #define SYMTYPE_MANAGED 0x0004
1358 #define SYMTYPE_MSIL 0x0008
1360 /* ======================================== *
1361 * Symbol information
1362 * ======================================== */
1364 struct cv_addr_range
1366 unsigned int offStart;
1367 unsigned short isectStart;
1368 unsigned short cbRange;
1371 struct cv_addr_gap
1373 unsigned short gapStartOffset;
1374 unsigned short cbRange;
1377 struct cv_local_varflag
1379 unsigned short is_param : 1;
1380 unsigned short address_taken : 1;
1381 unsigned short from_compiler : 1; /* generated by compiler */
1382 unsigned short is_aggregate : 1; /* split in several variables by compiler */
1383 unsigned short from_aggregate : 1; /* marks a temporary from an aggregate */
1384 unsigned short is_aliased : 1;
1385 unsigned short from_alias : 1;
1386 unsigned short is_return_value : 1;
1387 unsigned short optimized_out : 1;
1388 unsigned short enreg_global : 1; /* global variable accessed from register */
1389 unsigned short enreg_static : 1;
1391 unsigned short unused : 5;
1395 union codeview_symbol
1397 struct
1399 unsigned short int len;
1400 unsigned short int id;
1401 } generic;
1403 struct
1405 unsigned short int len;
1406 unsigned short int id;
1407 unsigned int offset;
1408 unsigned short segment;
1409 cv_typ16_t symtype;
1410 struct p_string p_name;
1411 } data_v1;
1413 struct
1415 unsigned short int len;
1416 unsigned short int id;
1417 cv_typ_t symtype;
1418 unsigned int offset;
1419 unsigned short segment;
1420 struct p_string p_name;
1421 } data_v2;
1423 struct
1425 unsigned short int len;
1426 unsigned short int id;
1427 cv_typ_t symtype;
1428 unsigned int offset;
1429 unsigned short segment;
1430 char name[1];
1431 } data_v3;
1433 struct
1435 unsigned short int len;
1436 unsigned short int id;
1437 unsigned int pparent;
1438 unsigned int pend;
1439 unsigned int next;
1440 unsigned int offset;
1441 unsigned short segment;
1442 unsigned short thunk_len;
1443 unsigned char thtype;
1444 struct p_string p_name;
1445 } thunk_v1;
1447 struct
1449 unsigned short int len;
1450 unsigned short int id;
1451 unsigned int pparent;
1452 unsigned int pend;
1453 unsigned int next;
1454 unsigned int offset;
1455 unsigned short segment;
1456 unsigned short thunk_len;
1457 unsigned char thtype;
1458 char name[1];
1459 } thunk_v3;
1461 struct
1463 unsigned short int len;
1464 unsigned short int id;
1465 unsigned int pparent;
1466 unsigned int pend;
1467 unsigned int next;
1468 unsigned int proc_len;
1469 unsigned int debug_start;
1470 unsigned int debug_end;
1471 unsigned int offset;
1472 unsigned short segment;
1473 cv_typ16_t proctype;
1474 unsigned char flags;
1475 struct p_string p_name;
1476 } proc_v1;
1478 struct
1480 unsigned short int len;
1481 unsigned short int id;
1482 unsigned int pparent;
1483 unsigned int pend;
1484 unsigned int next;
1485 unsigned int proc_len;
1486 unsigned int debug_start;
1487 unsigned int debug_end;
1488 cv_typ_t proctype;
1489 unsigned int offset;
1490 unsigned short segment;
1491 unsigned char flags;
1492 struct p_string p_name;
1493 } proc_v2;
1495 struct
1497 unsigned short int len;
1498 unsigned short int id;
1499 unsigned int pparent;
1500 unsigned int pend;
1501 unsigned int next;
1502 unsigned int proc_len;
1503 unsigned int debug_start;
1504 unsigned int debug_end;
1505 cv_typ_t proctype;
1506 unsigned int offset;
1507 unsigned short segment;
1508 unsigned char flags;
1509 char name[1];
1510 } proc_v3;
1512 struct
1514 unsigned short int len;
1515 unsigned short int id;
1516 unsigned int offset;
1517 unsigned short segment;
1518 unsigned short pubsymflags;
1519 struct p_string p_name;
1520 } public_v1;
1522 struct
1524 unsigned short int len;
1525 unsigned short int id;
1526 unsigned int pubsymflags;
1527 unsigned int offset;
1528 unsigned short segment;
1529 struct p_string p_name;
1530 } public_v2;
1532 struct
1534 unsigned short int len;
1535 unsigned short int id;
1536 unsigned int pubsymflags;
1537 unsigned int offset;
1538 unsigned short segment;
1539 char name[1];
1540 } public_v3;
1542 struct
1544 unsigned short int len;
1545 unsigned short int id; /* Always S_BPREL32_16t */
1546 unsigned int offset; /* Stack offset relative to BP */
1547 cv_typ16_t symtype;
1548 struct p_string p_name;
1549 } stack_v1;
1551 struct
1553 unsigned short int len;
1554 unsigned short int id; /* Always S_BPREL32_ST */
1555 unsigned int offset; /* Stack offset relative to EBP */
1556 cv_typ_t symtype;
1557 struct p_string p_name;
1558 } stack_v2;
1560 struct
1562 unsigned short int len;
1563 unsigned short int id; /* Always S_BPREL32 */
1564 int offset; /* Stack offset relative to BP */
1565 cv_typ_t symtype;
1566 char name[1];
1567 } stack_v3;
1569 struct
1571 unsigned short int len;
1572 unsigned short int id; /* Always S_BPREL32 */
1573 int offset; /* Stack offset relative to BP */
1574 cv_typ_t symtype;
1575 unsigned short reg;
1576 char name[1];
1577 } regrel_v3;
1579 struct
1581 unsigned short int len;
1582 unsigned short int id; /* Always S_REGISTER */
1583 cv_typ16_t type;
1584 unsigned short reg;
1585 struct p_string p_name;
1586 /* don't handle register tracking */
1587 } register_v1;
1589 struct
1591 unsigned short int len;
1592 unsigned short int id; /* Always S_REGISTER_ST */
1593 cv_typ_t type; /* check whether type & reg are correct */
1594 unsigned short reg;
1595 struct p_string p_name;
1596 /* don't handle register tracking */
1597 } register_v2;
1599 struct
1601 unsigned short int len;
1602 unsigned short int id; /* Always S_REGISTER */
1603 cv_typ_t type; /* check whether type & reg are correct */
1604 unsigned short reg;
1605 char name[1];
1606 /* don't handle register tracking */
1607 } register_v3;
1609 struct
1611 unsigned short int len;
1612 unsigned short int id;
1613 unsigned int parent;
1614 unsigned int end;
1615 unsigned int length;
1616 unsigned int offset;
1617 unsigned short segment;
1618 struct p_string p_name;
1619 } block_v1;
1621 struct
1623 unsigned short int len;
1624 unsigned short int id;
1625 unsigned int parent;
1626 unsigned int end;
1627 unsigned int length;
1628 unsigned int offset;
1629 unsigned short segment;
1630 char name[1];
1631 } block_v3;
1633 struct
1635 unsigned short int len;
1636 unsigned short int id;
1637 unsigned short trampType; /* 0: incremental, 1: branchisland */
1638 unsigned short cbThunk;
1639 unsigned int offThunk;
1640 unsigned int offTarget;
1641 unsigned short sectThunk;
1642 unsigned short sectTarget;
1643 } trampoline_v3;
1645 struct
1647 unsigned short int len;
1648 unsigned short int id;
1649 unsigned int offset;
1650 unsigned short segment;
1651 unsigned char flags;
1652 struct p_string p_name;
1653 } label_v1;
1655 struct
1657 unsigned short int len;
1658 unsigned short int id;
1659 unsigned int offset;
1660 unsigned short segment;
1661 unsigned char flags;
1662 char name[1];
1663 } label_v3;
1665 struct
1667 unsigned short int len;
1668 unsigned short int id;
1669 cv_typ16_t type;
1670 unsigned short cvalue; /* numeric leaf */
1671 #if 0
1672 struct p_string p_name;
1673 #endif
1674 } constant_v1;
1676 struct
1678 unsigned short int len;
1679 unsigned short int id;
1680 cv_typ_t type;
1681 unsigned short cvalue; /* numeric leaf */
1682 #if 0
1683 struct p_string p_name;
1684 #endif
1685 } constant_v2;
1687 struct
1689 unsigned short int len;
1690 unsigned short int id;
1691 cv_typ_t type;
1692 unsigned short cvalue;
1693 #if 0
1694 char name[1];
1695 #endif
1696 } constant_v3;
1698 struct
1700 unsigned short int len;
1701 unsigned short int id;
1702 cv_typ16_t type;
1703 struct p_string p_name;
1704 } udt_v1;
1706 struct
1708 unsigned short int len;
1709 unsigned short int id;
1710 cv_typ_t type;
1711 struct p_string p_name;
1712 } udt_v2;
1714 struct
1716 unsigned short int len;
1717 unsigned short int id;
1718 cv_typ_t type;
1719 char name[1];
1720 } udt_v3;
1722 struct
1724 unsigned short int len;
1725 unsigned short int id;
1726 unsigned signature;
1727 struct p_string p_name;
1728 } objname_v1;
1730 struct
1732 unsigned short int len;
1733 unsigned short int id;
1734 unsigned signature;
1735 char name[1];
1736 } objname_v3;
1738 struct
1740 unsigned short int len;
1741 unsigned short int id;
1742 unsigned char machine;
1743 struct
1745 unsigned char language : 8;
1746 unsigned char _dome : 8; /* other missing fields */
1747 unsigned char pad : 8;
1748 } flags;
1749 struct p_string p_name;
1750 } compile_v1;
1752 struct
1754 unsigned short int len;
1755 unsigned short int id;
1756 struct {
1757 unsigned int iLanguage : 8;
1758 unsigned int _dome : 9; /* other missing fields */
1759 unsigned int pad : 15;
1760 } flags;
1761 unsigned short machine;
1762 unsigned short fe_major;
1763 unsigned short fe_minor;
1764 unsigned short fe_build;
1765 unsigned short be_major;
1766 unsigned short be_minor;
1767 unsigned short be_build;
1768 struct p_string p_name;
1769 } compile2_v2;
1771 struct
1773 unsigned short int len;
1774 unsigned short int id;
1775 struct {
1776 unsigned int iLanguage : 8;
1777 unsigned int _dome : 9; /* other missing fields */
1778 unsigned int pad : 15;
1779 } flags;
1780 unsigned short machine;
1781 unsigned short fe_major;
1782 unsigned short fe_minor;
1783 unsigned short fe_build;
1784 unsigned short be_major;
1785 unsigned short be_minor;
1786 unsigned short be_build;
1787 char name[1];
1788 } compile2_v3;
1790 struct
1792 unsigned short int len;
1793 unsigned short int id;
1794 struct {
1795 unsigned int iLanguage : 8;
1796 unsigned int _dome : 12; /* other missing fields */
1797 unsigned int pad : 12;
1798 } flags;
1799 unsigned short machine;
1800 unsigned short fe_major;
1801 unsigned short fe_minor;
1802 unsigned short fe_build;
1803 unsigned short fe_qfe;
1804 unsigned short be_major;
1805 unsigned short be_minor;
1806 unsigned short be_build;
1807 unsigned short be_qfe;
1808 char name[1];
1809 } compile3_v3;
1811 struct
1813 unsigned short int len;
1814 unsigned short int id;
1815 unsigned int offset;
1816 unsigned short segment;
1817 cv_typ16_t symtype;
1818 struct p_string p_name;
1819 } thread_v1;
1821 struct
1823 unsigned short int len;
1824 unsigned short int id;
1825 cv_typ_t symtype;
1826 unsigned int offset;
1827 unsigned short segment;
1828 struct p_string p_name;
1829 } thread_v2;
1831 struct
1833 unsigned short int len;
1834 unsigned short int id;
1835 cv_typ_t symtype;
1836 unsigned int offset;
1837 unsigned short segment;
1838 char name[1];
1839 } thread_v3;
1841 struct
1843 unsigned short int len;
1844 unsigned short int id;
1845 unsigned int sumName;
1846 unsigned int ibSym;
1847 unsigned short imod;
1848 char name[1];
1849 } refsym2_v3;
1851 struct
1853 unsigned short int len;
1854 unsigned short int id;
1855 unsigned int offset;
1856 unsigned short segment;
1857 } ssearch_v1;
1859 struct
1861 unsigned short int len;
1862 unsigned short int id;
1863 unsigned int offset;
1864 unsigned int unknown;
1865 } security_cookie_v3;
1867 struct
1869 unsigned short int len;
1870 unsigned short int id;
1871 unsigned int sz_frame; /* size of frame */
1872 unsigned int unknown2;
1873 unsigned int unknown3;
1874 unsigned int sz_saved_regs; /* size of saved registers from callee */
1875 unsigned int eh_offset; /* offset for exception handler */
1876 unsigned short eh_sect; /* section for exception handler */
1877 unsigned int flags;
1878 } frame_info_v2;
1880 struct
1882 unsigned short int len;
1883 unsigned short int id;
1884 unsigned int offset;
1885 unsigned short sect_idx;
1886 unsigned short inst_len;
1887 cv_typ_t index;
1888 } heap_alloc_site_v3;
1890 struct
1892 unsigned short int len;
1893 unsigned short int id;
1894 cv_typ_t symtype;
1895 struct cv_local_varflag varflags;
1896 char name[1];
1897 } local_v3;
1899 struct
1901 unsigned short int len;
1902 unsigned short int id;
1903 unsigned int program;
1904 struct cv_addr_range range;
1905 struct cv_addr_gap gaps[0];
1906 } defrange_v3;
1908 struct
1910 unsigned short int len;
1911 unsigned short int id;
1912 unsigned int program;
1913 unsigned int offParent;
1914 struct cv_addr_range range;
1915 struct cv_addr_gap gaps[0];
1916 } defrange_subfield_v3;
1918 struct
1920 unsigned short int len;
1921 unsigned short int id;
1922 unsigned short reg;
1923 unsigned short attr;
1924 struct cv_addr_range range;
1925 struct cv_addr_gap gaps[0];
1926 } defrange_register_v3;
1928 struct
1930 unsigned short int len;
1931 unsigned short int id;
1932 int offFramePointer;
1933 struct cv_addr_range range;
1934 struct cv_addr_gap gaps[0];
1935 } defrange_frameptrrel_v3;
1937 struct
1939 unsigned short int len;
1940 unsigned short int id;
1941 int offFramePointer;
1942 } defrange_frameptr_relfullscope_v3;
1944 struct
1946 unsigned short int len;
1947 unsigned short int id;
1948 unsigned short reg;
1949 unsigned short attr;
1950 unsigned int offParent : 12;
1951 unsigned int padding : 20;
1952 struct cv_addr_range range;
1953 struct cv_addr_gap gaps[0];
1954 } defrange_subfield_register_v3;
1956 struct
1958 unsigned short int len;
1959 unsigned short int id;
1960 unsigned short baseReg;
1961 unsigned short spilledUdtMember : 1;
1962 unsigned short padding : 3;
1963 unsigned short offsetParent : 12;
1964 int offBasePointer;
1965 struct cv_addr_range range;
1966 struct cv_addr_gap gaps[0];
1967 } defrange_registerrel_v3;
1969 struct
1971 unsigned short int len;
1972 unsigned short int id;
1973 cv_itemid_t itemid;
1974 } build_info_v3;
1976 struct
1978 unsigned short int len;
1979 unsigned short int id;
1980 unsigned int pParent;
1981 unsigned int pEnd;
1982 cv_itemid_t inlinee;
1983 unsigned char binaryAnnotations[0];
1984 } inline_site_v3;
1986 struct
1988 unsigned short int len;
1989 unsigned short int typ;
1990 unsigned int off;
1991 unsigned short sect;
1992 unsigned short _pad0;
1993 cv_typ_t typind;
1994 } callsiteinfo_v3;
1996 struct
1998 unsigned short int len;
1999 unsigned short int id;
2000 unsigned int pParent;
2001 unsigned int pEnd;
2002 cv_itemid_t inlinee;
2003 unsigned int invocations;
2004 unsigned char binaryAnnotations[0];
2005 } inline_site2_v3;
2007 struct
2009 unsigned short int len;
2010 unsigned short int id;
2011 unsigned int count;
2012 cv_typ_t funcs[0]; /* array of cuntions, count entries */
2013 #if 0
2014 unsigned int invocations[0]; /* array of count entries, paires with funcs */
2015 #endif
2016 } function_list_v3;
2018 struct
2020 unsigned short int len;
2021 unsigned short int id;
2022 cv_typ_t typind;
2023 unsigned int modOffset;
2024 struct cv_local_varflag varflags;
2025 char name[1];
2026 } file_static_v3;
2028 struct
2030 unsigned short int len;
2031 unsigned short int id;
2032 struct p_string pname;
2033 } unamespace_v2;
2035 struct
2037 unsigned short int len;
2038 unsigned short int id;
2039 char name[1];
2040 } unamespace_v3;
2042 struct
2044 unsigned short int len;
2045 unsigned short int id;
2046 unsigned int pParent;
2047 unsigned int pEnd;
2048 unsigned int length;
2049 unsigned int scf; /* CV_SEPCODEFLAGS */
2050 unsigned int off;
2051 unsigned int offParent;
2052 unsigned short int sect;
2053 unsigned short int sectParent;
2054 } sepcode_v3;
2056 struct
2058 unsigned short int len;
2059 unsigned short int id;
2060 unsigned int off;
2061 unsigned short int seg;
2062 unsigned short int csz; /* number of bytes in following array */
2063 char rgsz[1]; /* array of null terminated strings (bounded by csz) */
2064 } annotation_v3;
2066 struct
2068 unsigned short int len;
2069 unsigned short int id;
2070 unsigned int invocations;
2071 __int64 dynCount;
2072 unsigned numInstrs;
2073 unsigned staInstLive;
2074 } pogoinfo_v3;
2077 enum BinaryAnnotationOpcode
2079 BA_OP_Invalid,
2080 BA_OP_CodeOffset,
2081 BA_OP_ChangeCodeOffsetBase,
2082 BA_OP_ChangeCodeOffset,
2083 BA_OP_ChangeCodeLength,
2084 BA_OP_ChangeFile,
2085 BA_OP_ChangeLineOffset,
2086 BA_OP_ChangeLineEndDelta,
2087 BA_OP_ChangeRangeKind,
2088 BA_OP_ChangeColumnStart,
2089 BA_OP_ChangeColumnEndDelta,
2090 BA_OP_ChangeCodeOffsetAndLineOffset,
2091 BA_OP_ChangeCodeLengthAndCodeOffset,
2092 BA_OP_ChangeColumnEnd,
2095 #define S_COMPILE 0x0001
2096 #define S_REGISTER_16t 0x0002
2097 #define S_CONSTANT_16t 0x0003
2098 #define S_UDT_16t 0x0004
2099 #define S_SSEARCH 0x0005
2100 #define S_END 0x0006
2101 #define S_SKIP 0x0007
2102 #define S_CVRESERVE 0x0008
2103 #define S_OBJNAME_ST 0x0009
2104 #define S_ENDARG 0x000a
2105 #define S_COBOLUDT_16t 0x000b
2106 #define S_MANYREG_16t 0x000c
2107 #define S_RETURN 0x000d
2108 #define S_ENTRYTHIS 0x000e
2110 #define S_BPREL32_16t 0x0200
2111 #define S_LDATA32_16t 0x0201
2112 #define S_GDATA32_16t 0x0202
2113 #define S_PUB32_16t 0x0203
2114 #define S_LPROC32_16t 0x0204
2115 #define S_GPROC32_16t 0x0205
2116 #define S_THUNK32_ST 0x0206
2117 #define S_BLOCK32_ST 0x0207
2118 #define S_WITH32_ST 0x0208
2119 #define S_LABEL32_ST 0x0209
2120 #define S_CEXMODEL32 0x020a
2121 #define S_VFTABLE32_16t 0x020b
2122 #define S_REGREL32_16t 0x020c
2123 #define S_LTHREAD32_16t 0x020d
2124 #define S_GTHREAD32_16t 0x020e
2126 #define S_PROCREF_ST 0x0400
2127 #define S_DATAREF_ST 0x0401
2128 #define S_ALIGN 0x0402
2129 #define S_LPROCREF_ST 0x0403
2131 #define S_REGISTER_ST 0x1001 /* Variants with new 32-bit type indices */
2132 #define S_CONSTANT_ST 0x1002
2133 #define S_UDT_ST 0x1003
2134 #define S_COBOLUDT_ST 0x1004
2135 #define S_MANYREG_ST 0x1005
2136 #define S_BPREL32_ST 0x1006
2137 #define S_LDATA32_ST 0x1007
2138 #define S_GDATA32_ST 0x1008
2139 #define S_PUB32_ST 0x1009
2140 #define S_LPROC32_ST 0x100a
2141 #define S_GPROC32_ST 0x100b
2142 #define S_VFTABLE32 0x100c
2143 #define S_REGREL32_ST 0x100d
2144 #define S_LTHREAD32_ST 0x100e
2145 #define S_GTHREAD32_ST 0x100f
2146 #define S_FRAMEPROC 0x1012
2147 #define S_COMPILE2_ST 0x1013
2148 #define S_ANNOTATION 0x1019
2149 #define S_UNAMESPACE_ST 0x1029
2151 #define S_OBJNAME 0x1101
2152 #define S_THUNK32 0x1102
2153 #define S_BLOCK32 0x1103
2154 #define S_WITH32 0x1104
2155 #define S_LABEL32 0x1105
2156 #define S_REGISTER 0x1106
2157 #define S_CONSTANT 0x1107
2158 #define S_UDT 0x1108
2159 #define S_COBOLUDT 0x1109
2160 #define S_MANYREG 0x110A
2161 #define S_BPREL32 0x110B
2162 #define S_LDATA32 0x110C
2163 #define S_GDATA32 0x110D
2164 #define S_PUB32 0x110E
2165 #define S_LPROC32 0x110F
2166 #define S_GPROC32 0x1110
2167 #define S_REGREL32 0x1111
2168 #define S_LTHREAD32 0x1112
2169 #define S_GTHREAD32 0x1113
2170 #define S_LPROCMIPS 0x1114
2171 #define S_GPROCMIPS 0x1115
2172 #define S_COMPILE2 0x1116 /* compiler command line options and build information */
2173 #define S_MANYREG2 0x1117
2174 #define S_LPROCIA64 0x1118
2175 #define S_GPROCIA64 0x1119
2176 #define S_LOCALSLOT 0x111A
2177 #define S_PARAMSLOT 0x111B
2178 #define S_LMANDATA 0x111C
2179 #define S_GMANDATA 0x111D
2180 #define S_MANFRAMEREL 0x111E
2181 #define S_MANREGISTER 0x111F
2182 #define S_MANSLOT 0x1120
2183 #define S_MANMANYREG 0x1121
2184 #define S_MANREGREL 0x1122
2185 #define S_MANMANYREG2 0x1123
2186 #define S_UNAMESPACE 0x1124
2187 #define S_PROCREF 0x1125 /* didn't get the difference between the two */
2188 #define S_DATAREF 0x1126
2189 #define S_LPROCREF 0x1127
2190 #define S_ANNOTATIONREF 0x1128
2191 #define S_TOKENREF 0x1129
2192 #define S_GMANPROC 0x112A
2193 #define S_LMANPROC 0x112B
2194 #define S_TRAMPOLINE 0x112C
2195 #define S_MANCONSTANT 0x112D
2196 #define S_ATTR_FRAMEREL 0x112E
2197 #define S_ATTR_REGISTER 0x112F
2198 #define S_ATTR_REGREL 0x1130
2199 #define S_ATTR_MANYREG 0x1131
2200 #define S_SEPCODE 0x1132
2201 #define S_LOCAL_2005 0x1133
2202 #define S_DEFRANGE_2005 0x1134
2203 #define S_DEFRANGE2_2005 0x1135
2204 #define S_SECTION 0x1136
2205 #define S_COFFGROUP 0x1137
2206 #define S_EXPORT 0x1138
2207 #define S_CALLSITEINFO 0x1139
2208 #define S_FRAMECOOKIE 0x113A
2209 #define S_DISCARDED 0x113B
2210 #define S_COMPILE3 0x113C
2211 #define S_ENVBLOCK 0x113D
2213 #define S_LOCAL 0x113E
2214 #define S_DEFRANGE 0x113F
2215 #define S_DEFRANGE_SUBFIELD 0x1140
2216 #define S_DEFRANGE_REGISTER 0x1141
2217 #define S_DEFRANGE_FRAMEPOINTER_REL 0x1142
2218 #define S_DEFRANGE_SUBFIELD_REGISTER 0x1143
2219 #define S_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE 0x1144
2220 #define S_DEFRANGE_REGISTER_REL 0x1145
2221 #define S_LPROC32_ID 0x1146
2222 #define S_GPROC32_ID 0x1147
2223 #define S_LPROCMIPS_ID 0x1148
2224 #define S_GPROCMIPS_ID 0x1149
2225 #define S_LPROCIA64_ID 0x114A
2226 #define S_GPROCIA64_ID 0x114B
2227 #define S_BUILDINFO 0x114C
2228 #define S_INLINESITE 0x114D
2229 #define S_INLINESITE_END 0x114E
2230 #define S_PROC_ID_END 0x114F
2231 #define S_DEFRANGE_HLSL 0x1150
2232 #define S_GDATA_HLSL 0x1151
2233 #define S_LDATA_HLSL 0x1152
2235 #define S_FILESTATIC 0x1153
2236 #define S_ARMSWITCHTABLE 0x1159
2237 #define S_CALLEES 0x115A
2238 #define S_CALLERS 0x115B
2239 #define S_POGODATA 0x115C
2240 #define S_INLINESITE2 0x115D
2241 #define S_HEAPALLOCSITE 0x115E
2242 #define S_MOD_TYPEREF 0x115F
2243 #define S_REF_MINIPDB 0x1160
2244 #define S_PDBMAP 0x1161
2245 #define S_GDATA_HLSL32 0x1162
2246 #define S_LDATA_HLSL32 0x1163
2247 #define S_GDATA_HLSL32_EX 0x1164
2248 #define S_LDATA_HLSL32_EX 0x1165
2250 /* not documented yet on MS CV github repo, but that's how LLVM calls it */
2251 #define S_INLINEES 0x1168
2253 /* ======================================== *
2254 * Line number information
2255 * ======================================== */
2257 enum DEBUG_S_SUBSECTION_TYPE
2259 DEBUG_S_IGNORE = 0x80000000, /* bit flag: when set, ignore whole subsection content */
2261 DEBUG_S_SYMBOLS = 0xf1,
2262 DEBUG_S_LINES,
2263 DEBUG_S_STRINGTABLE,
2264 DEBUG_S_FILECHKSMS,
2265 DEBUG_S_FRAMEDATA,
2266 DEBUG_S_INLINEELINES,
2267 DEBUG_S_CROSSSCOPEIMPORTS,
2268 DEBUG_S_CROSSSCOPEEXPORTS,
2270 DEBUG_S_IL_LINES,
2271 DEBUG_S_FUNC_MDTOKEN_MAP,
2272 DEBUG_S_TYPE_MDTOKEN_MAP,
2273 DEBUG_S_MERGED_ASSEMBLYINPUT,
2275 DEBUG_S_COFF_SYMBOL_RVA,
2278 struct CV_DebugSSubsectionHeader_t
2280 enum DEBUG_S_SUBSECTION_TYPE type;
2281 unsigned cbLen;
2284 struct CV_DebugSLinesHeader_t
2286 unsigned offCon;
2287 unsigned short segCon;
2288 unsigned short flags;
2289 unsigned cbCon;
2292 struct CV_DebugSLinesFileBlockHeader_t
2294 unsigned offFile;
2295 unsigned nLines;
2296 unsigned cbBlock;
2297 /* followed by two variable length arrays
2298 * CV_Line_t lines[nLines];
2299 * ^ columns present when CV_DebugSLinesHeader_t.flags has CV_LINES_HAVE_COLUMNS set
2300 * CV_Column_t columns[nLines];
2304 #define CV_LINES_HAVE_COLUMNS 0x0001
2306 struct CV_Line_t
2308 unsigned offset;
2309 unsigned linenumStart:24;
2310 unsigned deltaLineEnd:7;
2311 unsigned fStatement:1;
2314 struct CV_Column_t
2316 unsigned short offColumnStart;
2317 unsigned short offColumnEnd;
2320 struct CV_Checksum_t /* this one is not defined in microsoft pdb information */
2322 unsigned strOffset; /* offset in string table for filename */
2323 unsigned char size; /* size of checksum */
2324 unsigned char method; /* method used to compute check sum */
2325 unsigned char checksum[0]; /* (size) bytes */
2326 /* result is padded on 4-byte boundary */
2329 #define CV_INLINEE_SOURCE_LINE_SIGNATURE 0x0
2330 #define CV_INLINEE_SOURCE_LINE_SIGNATURE_EX 0x1
2332 typedef struct CV_InlineeSourceLine_t
2334 cv_itemid_t inlinee; /* function id */
2335 unsigned fileId; /* offset in DEBUG_S_FILECHKSMS */
2336 unsigned sourceLineNum; /* first line number */
2337 } InlineeSourceLine;
2339 typedef struct CV_InlineeSourceLineEx_t
2341 cv_itemid_t inlinee; /* function id */
2342 unsigned fileId; /* offset in DEBUG_S_FILECHKSMS */
2343 unsigned sourceLineNum; /* first line number */
2344 unsigned int countOfExtraFiles;
2345 unsigned extraFileId[0];
2346 } InlineeSourceLineEx;
2348 #ifdef __WINESRC__
2349 /* those are Wine only helpers */
2350 /* align ptr on sz boundary; sz must be a power of 2 */
2351 #define CV_ALIGN(ptr, sz) ((const void*)(((DWORD_PTR)(ptr) + ((sz) - 1)) & ~((sz) - 1)))
2352 /* move after (ptr) record */
2353 #define CV_RECORD_AFTER(ptr) ((const void*)((ptr) + 1))
2354 /* move after (ptr) record and a gap of sz bytes */
2355 #define CV_RECORD_GAP(ptr, sz) ((const void*)((const char*)((ptr) + 1) + (sz)))
2356 /* test whether ptr record is within limit boundary */
2357 #define CV_IS_INSIDE(ptr, limit) (CV_RECORD_AFTER(ptr) <= (const void*)(limit))
2358 #endif /* __WINESRC__ */
2360 struct codeview_linetab_block
2362 unsigned short seg;
2363 unsigned short num_lines;
2364 unsigned int offsets[1]; /* in fact num_lines */
2365 /* unsigned short linenos[]; */
2368 struct startend
2370 unsigned int start;
2371 unsigned int end;
2374 /* ======================================== *
2375 * PDB file information
2376 * ======================================== */
2379 struct PDB_FILE
2381 unsigned int size;
2382 unsigned int unknown;
2385 struct PDB_JG_HEADER
2387 char ident[40];
2388 unsigned int signature;
2389 unsigned int block_size;
2390 unsigned short free_list;
2391 unsigned short total_alloc;
2392 struct PDB_FILE toc;
2393 unsigned short toc_block[1];
2396 struct PDB_DS_HEADER
2398 char signature[32];
2399 unsigned int block_size;
2400 unsigned int unknown1;
2401 unsigned int num_pages;
2402 unsigned int toc_size;
2403 unsigned int unknown2;
2404 unsigned int toc_page;
2407 struct PDB_JG_TOC
2409 unsigned int num_files;
2410 struct PDB_FILE file[1];
2413 struct PDB_DS_TOC
2415 unsigned int num_files;
2416 unsigned int file_size[1];
2419 struct PDB_JG_ROOT
2421 unsigned int Version;
2422 unsigned int TimeDateStamp;
2423 unsigned int Age;
2424 unsigned int cbNames;
2425 char names[1];
2428 struct PDB_DS_ROOT
2430 unsigned int Version;
2431 unsigned int TimeDateStamp;
2432 unsigned int Age;
2433 GUID guid;
2434 unsigned int cbNames;
2435 char names[1];
2438 typedef struct _PDB_TYPES_OLD
2440 unsigned int version;
2441 unsigned short first_index;
2442 unsigned short last_index;
2443 unsigned int type_size;
2444 unsigned short hash_file;
2445 unsigned short pad;
2446 } PDB_TYPES_OLD, *PPDB_TYPES_OLD;
2448 typedef struct _PDB_TYPES
2450 unsigned int version;
2451 unsigned int type_offset;
2452 unsigned int first_index;
2453 unsigned int last_index;
2454 unsigned int type_size;
2455 unsigned short hash_file;
2456 unsigned short pad;
2457 unsigned int hash_size;
2458 unsigned int hash_num_buckets;
2459 unsigned int hash_offset;
2460 unsigned int hash_len;
2461 unsigned int search_offset;
2462 unsigned int search_len;
2463 unsigned int type_remap_offset;
2464 unsigned int type_remap_len;
2465 } PDB_TYPES, *PPDB_TYPES;
2467 typedef struct _PDB_SYMBOL_RANGE
2469 unsigned short segment;
2470 unsigned short pad1;
2471 unsigned int offset;
2472 unsigned int size;
2473 unsigned int characteristics;
2474 unsigned short index;
2475 unsigned short pad2;
2476 } PDB_SYMBOL_RANGE, *PPDB_SYMBOL_RANGE;
2478 typedef struct _PDB_SYMBOL_RANGE_EX
2480 unsigned short segment;
2481 unsigned short pad1;
2482 unsigned int offset;
2483 unsigned int size;
2484 unsigned int characteristics;
2485 unsigned short index;
2486 unsigned short pad2;
2487 unsigned int timestamp;
2488 unsigned int unknown;
2489 } PDB_SYMBOL_RANGE_EX, *PPDB_SYMBOL_RANGE_EX;
2491 typedef struct _PDB_SYMBOL_FILE
2493 unsigned int unknown1;
2494 PDB_SYMBOL_RANGE range;
2495 unsigned short flag;
2496 unsigned short file;
2497 unsigned int symbol_size;
2498 unsigned int lineno_size;
2499 unsigned int lineno2_size;
2500 unsigned int nSrcFiles;
2501 unsigned int attribute;
2502 char filename[1];
2503 } PDB_SYMBOL_FILE, *PPDB_SYMBOL_FILE;
2505 typedef struct _PDB_SYMBOL_FILE_EX
2507 unsigned int unknown1;
2508 PDB_SYMBOL_RANGE_EX range;
2509 unsigned short flag;
2510 unsigned short file;
2511 unsigned int symbol_size;
2512 unsigned int lineno_size;
2513 unsigned int lineno2_size;
2514 unsigned int nSrcFiles;
2515 unsigned int attribute;
2516 unsigned int reserved[2];
2517 char filename[1];
2518 } PDB_SYMBOL_FILE_EX, *PPDB_SYMBOL_FILE_EX;
2520 typedef struct _PDB_SYMBOL_SOURCE
2522 unsigned short nModules;
2523 unsigned short nSrcFiles;
2524 unsigned short table[1];
2525 } PDB_SYMBOL_SOURCE, *PPDB_SYMBOL_SOURCE;
2527 typedef struct _PDB_SYMBOL_IMPORT
2529 unsigned int unknown1;
2530 unsigned int unknown2;
2531 unsigned int TimeDateStamp;
2532 unsigned int Age;
2533 char filename[1];
2534 } PDB_SYMBOL_IMPORT, *PPDB_SYMBOL_IMPORT;
2536 typedef struct _PDB_SYMBOLS_OLD
2538 unsigned short global_hash_file;
2539 unsigned short public_file;
2540 unsigned short gsym_file;
2541 unsigned short pad;
2542 unsigned int module_size;
2543 unsigned int offset_size;
2544 unsigned int hash_size;
2545 unsigned int srcmodule_size;
2546 } PDB_SYMBOLS_OLD, *PPDB_SYMBOLS_OLD;
2548 typedef struct _PDB_SYMBOLS
2550 unsigned int signature;
2551 unsigned int version;
2552 unsigned int age;
2553 unsigned short global_hash_file;
2554 unsigned short flags;
2555 unsigned short public_file;
2556 unsigned short bldVer;
2557 unsigned short gsym_file;
2558 unsigned short rbldVer;
2559 unsigned int module_size;
2560 unsigned int offset_size;
2561 unsigned int hash_size;
2562 unsigned int srcmodule_size;
2563 unsigned int pdbimport_size;
2564 unsigned int resvd0;
2565 unsigned int stream_index_size;
2566 unsigned int unknown2_size;
2567 unsigned short resvd3;
2568 unsigned short machine;
2569 unsigned int resvd4;
2570 } PDB_SYMBOLS, *PPDB_SYMBOLS;
2572 typedef struct
2574 unsigned short FPO;
2575 unsigned short unk0;
2576 unsigned short unk1;
2577 unsigned short unk2;
2578 unsigned short unk3;
2579 unsigned short segments;
2580 } PDB_STREAM_INDEXES_OLD;
2582 typedef struct
2584 unsigned short FPO;
2585 unsigned short unk0;
2586 unsigned short unk1;
2587 unsigned short unk2;
2588 unsigned short unk3;
2589 unsigned short segments;
2590 unsigned short unk4;
2591 unsigned short unk5;
2592 unsigned short unk6;
2593 unsigned short FPO_EXT;
2594 unsigned short unk7;
2595 } PDB_STREAM_INDEXES;
2597 typedef struct _PDB_FPO_DATA
2599 unsigned int start;
2600 unsigned int func_size;
2601 unsigned int locals_size;
2602 unsigned int params_size;
2603 unsigned int maxstack_size;
2604 unsigned int str_offset;
2605 unsigned short prolog_size;
2606 unsigned short savedregs_size;
2607 #define PDB_FPO_DFL_SEH 0x00000001
2608 #define PDB_FPO_DFL_EH 0x00000002
2609 #define PDB_FPO_DFL_IN_BLOCK 0x00000004
2610 unsigned int flags;
2611 } PDB_FPO_DATA;
2613 typedef struct _PDB_STRING_TABLE
2615 unsigned int magic;
2616 unsigned int hash_version;
2617 unsigned int length;
2619 PDB_STRING_TABLE;
2620 /* This header is followed by:
2621 * - a series (of bytes hdr.length) of 0-terminated strings
2622 * - a serialized hash table
2625 /* Header for hash tables inside DBI (aka symbols) stream.
2626 * - The global hash stream contains only the hash table.
2627 * - The public stream contains the same layout for its hash table
2628 * (but other information as well).
2630 typedef struct
2632 unsigned signature;
2633 unsigned version;
2634 unsigned size_hash_records;
2635 unsigned unknown;
2636 } DBI_HASH_HEADER;
2637 /* This header is followed by:
2638 * - DBI_HASH_RECORDS (on hdr:size_hash_records bytes)
2639 * - a bitmap of DBI_MAX_HASH + 1 entries (on DBI_BITMAP_HASH_SIZE bytes)
2640 * - a table (one entry per present bit in bitmap) as index into hdr:num_records
2643 typedef struct
2645 unsigned offset;
2646 unsigned unknown;
2647 } DBI_HASH_RECORD;
2649 #define DBI_MAX_HASH 4096
2650 #define DBI_BITMAP_HASH_SIZE ((DBI_MAX_HASH / (8 * sizeof(unsigned)) + 1) * sizeof(unsigned))
2652 /* Header for public stream (from DBI / SYMBOLS stream)
2653 * Followed by a hash table (cf DBI_HASH_HEADER and the following bits)
2655 typedef struct
2657 unsigned hash_size;
2658 unsigned address_map_size;
2659 unsigned num_thunks;
2660 unsigned size_thunk;
2661 unsigned short section_thunk_table;
2662 unsigned short _pad0;
2663 unsigned offset_thunk_table;
2664 unsigned num_sects;
2665 } DBI_PUBLIC_HEADER;
2667 #include "poppack.h"
2669 /* ===================================================
2670 * The old CodeView stuff (for NB09 and NB11)
2671 * =================================================== */
2673 #define sstModule 0x120
2674 #define sstTypes 0x121
2675 #define sstPublic 0x122
2676 #define sstPublicSym 0x123
2677 #define sstSymbols 0x124
2678 #define sstAlignSym 0x125
2679 #define sstSrcLnSeg 0x126
2680 #define sstSrcModule 0x127
2681 #define sstLibraries 0x128
2682 #define sstGlobalSym 0x129
2683 #define sstGlobalPub 0x12a
2684 #define sstGlobalTypes 0x12b
2685 #define sstMPC 0x12c
2686 #define sstSegMap 0x12d
2687 #define sstSegName 0x12e
2688 #define sstPreComp 0x12f
2689 #define sstFileIndex 0x133
2690 #define sstStaticSym 0x134
2692 /* overall structure information */
2693 typedef struct OMFSignature
2695 char Signature[4];
2696 int filepos;
2697 } OMFSignature;
2699 typedef struct OMFSignatureRSDS
2701 char Signature[4];
2702 GUID guid;
2703 unsigned int age;
2704 char name[1];
2705 } OMFSignatureRSDS;
2707 typedef struct _CODEVIEW_PDB_DATA
2709 char Signature[4];
2710 int filepos;
2711 unsigned int timestamp;
2712 unsigned int age;
2713 char name[1];
2714 } CODEVIEW_PDB_DATA, *PCODEVIEW_PDB_DATA;
2716 typedef struct OMFDirHeader
2718 unsigned short cbDirHeader;
2719 unsigned short cbDirEntry;
2720 unsigned int cDir;
2721 unsigned int lfoNextDir;
2722 unsigned int flags;
2723 } OMFDirHeader;
2725 typedef struct OMFDirEntry
2727 unsigned short SubSection;
2728 unsigned short iMod;
2729 unsigned int lfo;
2730 unsigned int cb;
2731 } OMFDirEntry;
2733 /* sstModule subsection */
2735 typedef struct OMFSegDesc
2737 unsigned short Seg;
2738 unsigned short pad;
2739 unsigned int Off;
2740 unsigned int cbSeg;
2741 } OMFSegDesc;
2743 typedef struct OMFModule
2745 unsigned short ovlNumber;
2746 unsigned short iLib;
2747 unsigned short cSeg;
2748 char Style[2];
2750 OMFSegDesc SegInfo[cSeg];
2751 p_string Name;
2753 } OMFModule;
2755 typedef struct OMFGlobalTypes
2757 unsigned int flags;
2758 unsigned int cTypes;
2760 unsigned int offset[cTypes];
2761 types_record[];
2763 } OMFGlobalTypes;
2765 /* sstGlobalPub section */
2767 /* Header for symbol table */
2768 typedef struct OMFSymHash
2770 unsigned short symhash;
2771 unsigned short addrhash;
2772 unsigned int cbSymbol;
2773 unsigned int cbHSym;
2774 unsigned int cbHAddr;
2775 } OMFSymHash;
2777 /* sstSegMap section */
2779 typedef struct OMFSegMapDesc
2781 unsigned short flags;
2782 unsigned short ovl;
2783 unsigned short group;
2784 unsigned short frame;
2785 unsigned short iSegName;
2786 unsigned short iClassName;
2787 unsigned int offset;
2788 unsigned int cbSeg;
2789 } OMFSegMapDesc;
2791 typedef struct OMFSegMap
2793 unsigned short cSeg;
2794 unsigned short cSegLog;
2795 /* OMFSegMapDesc rgDesc[0];*/
2796 } OMFSegMap;
2799 /* sstSrcModule section */
2801 typedef struct OMFSourceLine
2803 unsigned short Seg;
2804 unsigned short cLnOff;
2805 unsigned int offset[1];
2806 unsigned short lineNbr[1];
2807 } OMFSourceLine;
2809 typedef struct OMFSourceFile
2811 unsigned short cSeg;
2812 unsigned short reserved;
2813 unsigned int baseSrcLn[1];
2814 unsigned short cFName;
2815 char Name;
2816 } OMFSourceFile;
2818 typedef struct OMFSourceModule
2820 unsigned short cFile;
2821 unsigned short cSeg;
2822 unsigned int baseSrcFile[1];
2823 } OMFSourceModule;