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