1 /**
2  * CodeView 4 symbolic debug info declarations
3  *
4  * See "Microsoft Symbol and Type OMF" document
5  *
6  * Compiler implementation of the
7  * $(LINK2 https://www.dlang.org, D programming language).
8  *
9  * Source:      $(LINK2 https://github.com/dlang/dmd/blob/master/src/dmd/backend/cv4.d, backend/_cv4.d)
10  */
11 
12 module dmd.backend.cv4;
13 
14 // Online documentation: https://dlang.org/phobos/dmd_backend_cv4.html
15 
16 enum OEM = 0x42;        // Digital Mars OEM number (picked at random)
17 
18 // Symbol Indices
19 enum
20 {
21     S_COMPILE     = 1,
22     S_REGISTER    = 2,
23     S_CONST       = 3,
24     S_UDT         = 4,
25     S_SSEARCH     = 5,
26     S_END         = 6,
27     S_SKIP        = 7,
28     S_CVRESERVE   = 8,
29     S_OBJNAME     = 9,
30     S_ENDARG      = 0x0A,
31     S_COBOLUDT    = 0x0B,
32     S_MANYREG     = 0x0C,
33     S_RETURN      = 0x0D,
34     S_ENTRYTHIS   = 0x0E,
35     S_TDBNAME     = 0x0F,
36 
37     S_BPREL16     = 0x100,
38     S_LDATA16     = 0x101,
39     S_GDATA16     = 0x102,
40     S_PUB16       = 0x103,
41     S_LPROC16     = 0x104,
42     S_GPROC16     = 0x105,
43     S_THUNK16     = 0x106,
44     S_BLOCK16     = 0x107,
45     S_WITH16      = 0x108,
46     S_LABEL16     = 0x109,
47     S_CEXMODEL16  = 0x10A,
48     S_VFTPATH16   = 0x10B,
49 
50     S_BPREL32     = 0x200,
51     S_LDATA32     = 0x201,
52     S_GDATA32     = 0x202,
53     S_PUB32       = 0x203,
54     S_LPROC32     = 0x204,
55     S_GPROC32     = 0x205,
56     S_THUNK32     = 0x206,
57     S_BLOCK32     = 0x207,
58     S_WITH32      = 0x208,
59     S_LABEL32     = 0x209,
60     S_CEXMODEL32  = 0x20A,
61     S_VFTPATH32   = 0x20B,
62 
63     /************** Added Since CV4 *********************/
64 
65     S_REGISTER_V2         = 0x1001,
66     S_CONSTANT_V2         = 0x1002,
67     S_UDT_V2              = 0x1003,
68     S_COBOLUDT_V2         = 0x1004,
69     S_MANYREG_V2          = 0x1005,
70     S_BPREL_V2            = 0x1006,
71     S_LDATA_V2            = 0x1007,
72     S_GDATA_V2            = 0x1008,
73     S_PUB_V2              = 0x1009,
74     S_LPROC_V2            = 0x100A,
75     S_GPROC_V2            = 0x100B,
76     S_VFTTABLE_V2         = 0x100C,
77     S_REGREL_V2           = 0x100D,
78     S_LTHREAD_V2          = 0x100E,
79     S_GTHREAD_V2          = 0x100F,
80     S_FUNCINFO_V2         = 0x1012,
81     S_COMPILAND_V2        = 0x1013,
82 
83     S_COMPILAND_V3        = 0x1101,
84     S_THUNK_V3            = 0x1102,
85     S_BLOCK_V3            = 0x1103,
86     S_LABEL_V3            = 0x1105,
87     S_REGISTER_V3         = 0x1106,
88     S_CONSTANT_V3         = 0x1107,
89     S_UDT_V3              = 0x1108,
90     S_BPREL_V3            = 0x110B,
91     S_LDATA_V3            = 0x110C,
92     S_GDATA_V3            = 0x110D,
93     S_PUB_V3              = 0x110E,
94     S_LPROC_V3            = 0x110F,
95     S_GPROC_V3            = 0x1110,
96     S_BPREL_XXXX_V3       = 0x1111,
97     S_MSTOOL_V3           = 0x1116,
98     S_PUB_FUNC1_V3        = 0x1125,
99     S_PUB_FUNC2_V3        = 0x1127,
100     S_SECTINFO_V3         = 0x1136,
101     S_SUBSECTINFO_V3      = 0x1137,
102     S_ENTRYPOINT_V3       = 0x1138,
103     S_SECUCOOKIE_V3       = 0x113A,
104     S_MSTOOLINFO_V3       = 0x113C,
105     S_MSTOOLENV_V3        = 0x113D,
106 }
107 
108 // Leaf Indices
109 enum
110 {
111     LF_MODIFIER    = 1,
112     LF_POINTER     = 2,
113     LF_ARRAY       = 3,
114     LF_CLASS       = 4,
115     LF_STRUCTURE   = 5,
116     LF_UNION       = 6,
117     LF_ENUM        = 7,
118     LF_PROCEDURE   = 8,
119     LF_MFUNCTION   = 9,
120     LF_VTSHAPE     = 0x0A,
121     LF_COBOL0      = 0x0B,
122     LF_COBOL1      = 0x0C,
123     LF_BARRAY      = 0x0D,
124     LF_LABEL       = 0x0E,
125     LF_NULL        = 0x0F,
126     LF_NOTTRAN     = 0x10,
127     LF_DIMARRAY    = 0x11,
128     LF_VFTPATH     = 0x12,
129     LF_PRECOMP     = 0x13,
130     LF_ENDPRECOMP  = 0x14,
131     LF_OEM         = 0x15,
132     LF_TYPESERVER  = 0x16,
133 
134     // D extensions (not used, causes linker to fail)
135     LF_DYN_ARRAY   = 0x17,
136     LF_ASSOC_ARRAY = 0x18,
137     LF_DELEGATE    = 0x19,
138 
139     LF_SKIP        = 0x200,
140     LF_ARGLIST     = 0x201,
141     LF_DEFARG      = 0x202,
142     LF_LIST        = 0x203,
143     LF_FIELDLIST   = 0x204,
144     LF_DERIVED     = 0x205,
145     LF_BITFIELD    = 0x206,
146     LF_METHODLIST  = 0x207,
147     LF_DIMCONU     = 0x208,
148     LF_DIMCONLU    = 0x209,
149     LF_DIMVARU     = 0x20A,
150     LF_DIMVARLU    = 0x20B,
151     LF_REFSYM      = 0x20C,
152 
153     LF_BCLASS      = 0x400,
154     LF_VBCLASS     = 0x401,
155     LF_IVBCLASS    = 0x402,
156     LF_ENUMERATE   = 0x403,
157     LF_FRIENDFCN   = 0x404,
158     LF_INDEX       = 0x405,
159     LF_MEMBER      = 0x406,
160     LF_STMEMBER    = 0x407,
161     LF_METHOD      = 0x408,
162     LF_NESTTYPE    = 0x409,
163     LF_VFUNCTAB    = 0x40A,
164     LF_FRIENDCLS   = 0x40B,
165 
166     LF_NUMERIC     = 0x8000,
167     LF_CHAR        = 0x8000,
168     LF_SHORT       = 0x8001,
169     LF_USHORT      = 0x8002,
170     LF_LONG        = 0x8003,
171     LF_ULONG       = 0x8004,
172     LF_REAL32      = 0x8005,
173     LF_REAL64      = 0x8006,
174     LF_REAL80      = 0x8007,
175     LF_REAL128     = 0x8008,
176     LF_QUADWORD    = 0x8009,
177     LF_UQUADWORD   = 0x800A,
178     LF_REAL48      = 0x800B,
179 
180     LF_COMPLEX32   = 0x800C,
181     LF_COMPLEX64   = 0x800D,
182     LF_COMPLEX80   = 0x800E,
183     LF_COMPLEX128  = 0x800F,
184 
185     LF_VARSTRING   = 0x8010,
186 
187     /************** Added Since CV4 *********************/
188 
189     LF_MODIFIER_V2        = 0x1001,
190     LF_POINTER_V2         = 0x1002,
191     LF_ARRAY_V2           = 0x1003,
192     LF_CLASS_V2           = 0x1004,
193     LF_STRUCTURE_V2       = 0x1005,
194     LF_UNION_V2           = 0x1006,
195     LF_ENUM_V2            = 0x1007,
196     LF_PROCEDURE_V2       = 0x1008,
197     LF_MFUNCTION_V2       = 0x1009,
198     LF_COBOL0_V2          = 0x100A,
199     LF_BARRAY_V2          = 0x100B,
200     LF_DIMARRAY_V2        = 0x100C,
201     LF_VFTPATH_V2         = 0x100D,
202     LF_PRECOMP_V2         = 0x100E,
203     LF_OEM_V2             = 0x100F,
204 
205     LF_SKIP_V2            = 0x1200,
206     LF_ARGLIST_V2         = 0x1201,
207     LF_DEFARG_V2          = 0x1202,
208     LF_FIELDLIST_V2       = 0x1203,
209     LF_DERIVED_V2         = 0x1204,
210     LF_BITFIELD_V2        = 0x1205,
211     LF_METHODLIST_V2      = 0x1206,
212     LF_DIMCONU_V2         = 0x1207,
213     LF_DIMCONLU_V2        = 0x1208,
214     LF_DIMVARU_V2         = 0x1209,
215     LF_DIMVARLU_V2        = 0x120A,
216 
217     LF_BCLASS_V2          = 0x1400,
218     LF_VBCLASS_V2         = 0x1401,
219     LF_IVBCLASS_V2        = 0x1402,
220     LF_FRIENDFCN_V2       = 0x1403,
221     LF_INDEX_V2           = 0x1404,
222     LF_MEMBER_V2          = 0x1405,
223     LF_STMEMBER_V2        = 0x1406,
224     LF_METHOD_V2          = 0x1407,
225     LF_NESTTYPE_V2        = 0x1408,
226     LF_VFUNCTAB_V2        = 0x1409,
227     LF_FRIENDCLS_V2       = 0x140A,
228     LF_ONEMETHOD_V2       = 0x140B,
229     LF_VFUNCOFF_V2        = 0x140C,
230     LF_NESTTYPEEX_V2      = 0x140D,
231 
232     LF_ENUMERATE_V3       = 0x1502,
233     LF_ARRAY_V3           = 0x1503,
234     LF_CLASS_V3           = 0x1504,
235     LF_STRUCTURE_V3       = 0x1505,
236     LF_UNION_V3           = 0x1506,
237     LF_ENUM_V3            = 0x1507,
238     LF_MEMBER_V3          = 0x150D,
239     LF_STMEMBER_V3        = 0x150E,
240     LF_METHOD_V3          = 0x150F,
241     LF_NESTTYPE_V3        = 0x1510,
242     LF_ONEMETHOD_V3       = 0x1511,
243 }