1 //===- PDBTypes.h - Defines enums for various fields contained in PDB ---*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #ifndef LLVM_DEBUGINFO_PDB_PDBTYPES_H
11 #define LLVM_DEBUGINFO_PDB_PDBTYPES_H
12 
13 #include "llvm/Config/llvm-config.h"
14 #include <functional>
15 #include <stdint.h>
16 
17 namespace llvm {
18 
19 class PDBSymDumper;
20 class PDBSymbol;
21 
22 class IPDBDataStream;
23 template <class T> class IPDBEnumChildren;
24 class IPDBRawSymbol;
25 class IPDBSession;
26 class IPDBSourceFile;
27 
28 typedef IPDBEnumChildren<PDBSymbol> IPDBEnumSymbols;
29 typedef IPDBEnumChildren<IPDBSourceFile> IPDBEnumSourceFiles;
30 typedef IPDBEnumChildren<IPDBDataStream> IPDBEnumDataStreams;
31 
32 class PDBSymbolExe;
33 class PDBSymbolCompiland;
34 class PDBSymbolCompilandDetails;
35 class PDBSymbolCompilandEnv;
36 class PDBSymbolFunc;
37 class PDBSymbolBlock;
38 class PDBSymbolData;
39 class PDBSymbolAnnotation;
40 class PDBSymbolLabel;
41 class PDBSymbolPublicSymbol;
42 class PDBSymbolTypeUDT;
43 class PDBSymbolTypeEnum;
44 class PDBSymbolTypeFunctionSig;
45 class PDBSymbolTypePointer;
46 class PDBSymbolTypeArray;
47 class PDBSymbolTypeBuiltin;
48 class PDBSymbolTypeTypedef;
49 class PDBSymbolTypeBaseClass;
50 class PDBSymbolTypeFriend;
51 class PDBSymbolTypeFunctionArg;
52 class PDBSymbolFuncDebugStart;
53 class PDBSymbolFuncDebugEnd;
54 class PDBSymbolUsingNamespace;
55 class PDBSymbolTypeVTableShape;
56 class PDBSymbolTypeVTable;
57 class PDBSymbolCustom;
58 class PDBSymbolThunk;
59 class PDBSymbolTypeCustom;
60 class PDBSymbolTypeManaged;
61 class PDBSymbolTypeDimension;
62 class PDBSymbolUnknown;
63 
64 /// Specifies which PDB reader implementation is to be used.  Only a value
65 /// of PDB_ReaderType::DIA is supported.
66 enum class PDB_ReaderType {
67   DIA = 0,
68 };
69 
70 /// Defines a 128-bit unique identifier.  This maps to a GUID on Windows, but
71 /// is abstracted here for the purposes of non-Windows platforms that don't have
72 /// the GUID structure defined.
73 struct PDB_UniqueId {
74   uint64_t HighPart;
75   uint64_t LowPart;
76 };
77 
78 /// An enumeration indicating the type of data contained in this table.
79 enum class PDB_TableType {
80   Symbols,
81   SourceFiles,
82   LineNumbers,
83   SectionContribs,
84   Segments,
85   InjectedSources,
86   FrameData
87 };
88 
89 /// Defines flags used for enumerating child symbols.  This corresponds to the
90 /// NameSearchOptions enumeration which is documented here:
91 /// https://msdn.microsoft.com/en-us/library/yat28ads.aspx
92 enum PDB_NameSearchFlags {
93   NS_Default = 0x0,
94   NS_CaseSensitive = 0x1,
95   NS_CaseInsensitive = 0x2,
96   NS_FileNameExtMatch = 0x4,
97   NS_Regex = 0x8,
98   NS_UndecoratedName = 0x10
99 };
100 
101 /// Specifies the hash algorithm that a source file from a PDB was hashed with.
102 /// This corresponds to the CV_SourceChksum_t enumeration and are documented
103 /// here: https://msdn.microsoft.com/en-us/library/e96az21x.aspx
104 enum class PDB_Checksum { None = 0, MD5 = 1, SHA1 = 2 };
105 
106 /// These values correspond to the CV_CPU_TYPE_e enumeration, and are documented
107 /// here: https://msdn.microsoft.com/en-us/library/b2fc64ek.aspx
108 enum class PDB_Cpu {
109   Intel8080 = 0x0,
110   Intel8086 = 0x1,
111   Intel80286 = 0x2,
112   Intel80386 = 0x3,
113   Intel80486 = 0x4,
114   Pentium = 0x5,
115   PentiumPro = 0x6,
116   Pentium3 = 0x7,
117   MIPS = 0x10,
118   MIPS16 = 0x11,
119   MIPS32 = 0x12,
120   MIPS64 = 0x13,
121   MIPSI = 0x14,
122   MIPSII = 0x15,
123   MIPSIII = 0x16,
124   MIPSIV = 0x17,
125   MIPSV = 0x18,
126   M68000 = 0x20,
127   M68010 = 0x21,
128   M68020 = 0x22,
129   M68030 = 0x23,
130   M68040 = 0x24,
131   Alpha = 0x30,
132   Alpha21164 = 0x31,
133   Alpha21164A = 0x32,
134   Alpha21264 = 0x33,
135   Alpha21364 = 0x34,
136   PPC601 = 0x40,
137   PPC603 = 0x41,
138   PPC604 = 0x42,
139   PPC620 = 0x43,
140   PPCFP = 0x44,
141   PPCBE = 0x45,
142   SH3 = 0x50,
143   SH3E = 0x51,
144   SH3DSP = 0x52,
145   SH4 = 0x53,
146   SHMedia = 0x54,
147   ARM3 = 0x60,
148   ARM4 = 0x61,
149   ARM4T = 0x62,
150   ARM5 = 0x63,
151   ARM5T = 0x64,
152   ARM6 = 0x65,
153   ARM_XMAC = 0x66,
154   ARM_WMMX = 0x67,
155   ARM7 = 0x68,
156   Omni = 0x70,
157   Ia64 = 0x80,
158   Ia64_2 = 0x81,
159   CEE = 0x90,
160   AM33 = 0xa0,
161   M32R = 0xb0,
162   TriCore = 0xc0,
163   X64 = 0xd0,
164   EBC = 0xe0,
165   Thumb = 0xf0,
166   ARMNT = 0xf4,
167   D3D11_Shader = 0x100,
168 };
169 
170 enum class PDB_Machine {
171   Invalid = 0xffff,
172   Unknown = 0x0,
173   Am33 = 0x13,
174   Amd64 = 0x8664,
175   Arm = 0x1C0,
176   ArmNT = 0x1C4,
177   Ebc = 0xEBC,
178   x86 = 0x14C,
179   Ia64 = 0x200,
180   M32R = 0x9041,
181   Mips16 = 0x266,
182   MipsFpu = 0x366,
183   MipsFpu16 = 0x466,
184   PowerPC = 0x1F0,
185   PowerPCFP = 0x1F1,
186   R4000 = 0x166,
187   SH3 = 0x1A2,
188   SH3DSP = 0x1A3,
189   SH4 = 0x1A6,
190   SH5 = 0x1A8,
191   Thumb = 0x1C2,
192   WceMipsV2 = 0x169
193 };
194 
195 /// These values correspond to the CV_call_e enumeration, and are documented
196 /// at the following locations:
197 ///   https://msdn.microsoft.com/en-us/library/b2fc64ek.aspx
198 ///   https://msdn.microsoft.com/en-us/library/windows/desktop/ms680207(v=vs.85).aspx
199 ///
200 enum class PDB_CallingConv {
201   NearCdecl = 0x00,
202   FarCdecl = 0x01,
203   NearPascal = 0x02,
204   FarPascal = 0x03,
205   NearFastcall = 0x04,
206   FarFastcall = 0x05,
207   Skipped = 0x06,
208   NearStdcall = 0x07,
209   FarStdcall = 0x08,
210   NearSyscall = 0x09,
211   FarSyscall = 0x0a,
212   Thiscall = 0x0b,
213   MipsCall = 0x0c,
214   Generic = 0x0d,
215   Alphacall = 0x0e,
216   Ppccall = 0x0f,
217   SuperHCall = 0x10,
218   Armcall = 0x11,
219   AM33call = 0x12,
220   Tricall = 0x13,
221   Sh5call = 0x14,
222   M32R = 0x15,
223   Clrcall = 0x16,
224   Inline = 0x17,
225   NearVectorcall = 0x18,
226   Reserved = 0x19,
227 };
228 
229 /// These values correspond to the CV_CFL_LANG enumeration, and are documented
230 /// here: https://msdn.microsoft.com/en-us/library/bw3aekw6.aspx
231 enum class PDB_Lang {
232   C = 0x00,
233   Cpp = 0x01,
234   Fortran = 0x02,
235   Masm = 0x03,
236   Pascal = 0x04,
237   Basic = 0x05,
238   Cobol = 0x06,
239   Link = 0x07,
240   Cvtres = 0x08,
241   Cvtpgd = 0x09,
242   CSharp = 0x0a,
243   VB = 0x0b,
244   ILAsm = 0x0c,
245   Java = 0x0d,
246   JScript = 0x0e,
247   MSIL = 0x0f,
248   HLSL = 0x10
249 };
250 
251 /// These values correspond to the DataKind enumeration, and are documented
252 /// here: https://msdn.microsoft.com/en-us/library/b2x2t313.aspx
253 enum class PDB_DataKind {
254   Unknown,
255   Local,
256   StaticLocal,
257   Param,
258   ObjectPtr,
259   FileStatic,
260   Global,
261   Member,
262   StaticMember,
263   Constant
264 };
265 
266 /// These values correspond to the SymTagEnum enumeration, and are documented
267 /// here: https://msdn.microsoft.com/en-us/library/bkedss5f.aspx
268 enum class PDB_SymType {
269   None,
270   Exe,
271   Compiland,
272   CompilandDetails,
273   CompilandEnv,
274   Function,
275   Block,
276   Data,
277   Annotation,
278   Label,
279   PublicSymbol,
280   UDT,
281   Enum,
282   FunctionSig,
283   PointerType,
284   ArrayType,
285   BuiltinType,
286   Typedef,
287   BaseClass,
288   Friend,
289   FunctionArg,
290   FuncDebugStart,
291   FuncDebugEnd,
292   UsingNamespace,
293   VTableShape,
294   VTable,
295   Custom,
296   Thunk,
297   CustomType,
298   ManagedType,
299   Dimension,
300   Max
301 };
302 
303 /// These values correspond to the LocationType enumeration, and are documented
304 /// here: https://msdn.microsoft.com/en-us/library/f57kaez3.aspx
305 enum class PDB_LocType {
306   Null,
307   Static,
308   TLS,
309   RegRel,
310   ThisRel,
311   Enregistered,
312   BitField,
313   Slot,
314   IlRel,
315   MetaData,
316   Constant,
317   Max
318 };
319 
320 /// These values correspond to the THUNK_ORDINAL enumeration, and are documented
321 /// here: https://msdn.microsoft.com/en-us/library/dh0k8hft.aspx
322 enum class PDB_ThunkOrdinal {
323   Standard,
324   ThisAdjustor,
325   Vcall,
326   Pcode,
327   UnknownLoad,
328   TrampIncremental,
329   BranchIsland
330 };
331 
332 /// These values correspond to the UdtKind enumeration, and are documented
333 /// here: https://msdn.microsoft.com/en-us/library/wcstk66t.aspx
334 enum class PDB_UdtType { Struct, Class, Union, Interface };
335 
336 /// These values correspond to the StackFrameTypeEnum enumeration, and are
337 /// documented here: https://msdn.microsoft.com/en-us/library/bc5207xw.aspx.
338 enum class PDB_StackFrameType { FPO, KernelTrap, KernelTSS, EBP, FrameData };
339 
340 /// These values correspond to the StackFrameTypeEnum enumeration, and are
341 /// documented here: https://msdn.microsoft.com/en-us/library/bc5207xw.aspx.
342 enum class PDB_MemoryType { Code, Data, Stack, HeapCode };
343 
344 /// These values correspond to the Basictype enumeration, and are documented
345 /// here: https://msdn.microsoft.com/en-us/library/4szdtzc3.aspx
346 enum class PDB_BuiltinType {
347   None = 0,
348   Void = 1,
349   Char = 2,
350   WCharT = 3,
351   Int = 6,
352   UInt = 7,
353   Float = 8,
354   BCD = 9,
355   Bool = 10,
356   Long = 13,
357   ULong = 14,
358   Currency = 25,
359   Date = 26,
360   Variant = 27,
361   Complex = 28,
362   Bitfield = 29,
363   BSTR = 30,
364   HResult = 31
365 };
366 
367 enum class PDB_RegisterId {
368   Unknown = 0,
369   VFrame = 30006,
370   AL = 1,
371   CL = 2,
372   DL = 3,
373   BL = 4,
374   AH = 5,
375   CH = 6,
376   DH = 7,
377   BH = 8,
378   AX = 9,
379   CX = 10,
380   DX = 11,
381   BX = 12,
382   SP = 13,
383   BP = 14,
384   SI = 15,
385   DI = 16,
386   EAX = 17,
387   ECX = 18,
388   EDX = 19,
389   EBX = 20,
390   ESP = 21,
391   EBP = 22,
392   ESI = 23,
393   EDI = 24,
394   ES = 25,
395   CS = 26,
396   SS = 27,
397   DS = 28,
398   FS = 29,
399   GS = 30,
400   IP = 31,
401   RAX = 328,
402   RBX = 329,
403   RCX = 330,
404   RDX = 331,
405   RSI = 332,
406   RDI = 333,
407   RBP = 334,
408   RSP = 335,
409   R8 = 336,
410   R9 = 337,
411   R10 = 338,
412   R11 = 339,
413   R12 = 340,
414   R13 = 341,
415   R14 = 342,
416   R15 = 343,
417 };
418 
419 enum class PDB_MemberAccess { Private = 1, Protected = 2, Public = 3 };
420 
421 enum class PDB_ErrorCode {
422   Success,
423   NoPdbImpl,
424   InvalidPath,
425   InvalidFileFormat,
426   InvalidParameter,
427   AlreadyLoaded,
428   UnknownError,
429   NoMemory
430 };
431 
432 struct VersionInfo {
433   uint32_t Major;
434   uint32_t Minor;
435   uint32_t Build;
436   uint32_t QFE;
437 };
438 
439 enum PDB_VariantType {
440   Empty,
441   Unknown,
442   Int8,
443   Int16,
444   Int32,
445   Int64,
446   Single,
447   Double,
448   UInt8,
449   UInt16,
450   UInt32,
451   UInt64,
452   Bool,
453 };
454 
455 struct Variant {
VariantVariant456   Variant()
457     : Type(PDB_VariantType::Empty) {
458   }
459 
460   PDB_VariantType Type;
461   union {
462     bool Bool;
463     int8_t Int8;
464     int16_t Int16;
465     int32_t Int32;
466     int64_t Int64;
467     float Single;
468     double Double;
469     uint8_t UInt8;
470     uint16_t UInt16;
471     uint32_t UInt32;
472     uint64_t UInt64;
473   };
474 #define VARIANT_EQUAL_CASE(Enum)                                               \
475   case PDB_VariantType::Enum:                                                  \
476     return Enum == Other.Enum;
477   bool operator==(const Variant &Other) const {
478     if (Type != Other.Type)
479       return false;
480     switch (Type) {
481       VARIANT_EQUAL_CASE(Bool)
482       VARIANT_EQUAL_CASE(Int8)
483       VARIANT_EQUAL_CASE(Int16)
484       VARIANT_EQUAL_CASE(Int32)
485       VARIANT_EQUAL_CASE(Int64)
486       VARIANT_EQUAL_CASE(Single)
487       VARIANT_EQUAL_CASE(Double)
488       VARIANT_EQUAL_CASE(UInt8)
489       VARIANT_EQUAL_CASE(UInt16)
490       VARIANT_EQUAL_CASE(UInt32)
491       VARIANT_EQUAL_CASE(UInt64)
492     default:
493       return true;
494     }
495   }
496 #undef VARIANT_EQUAL_CASE
497   bool operator!=(const Variant &Other) const { return !(*this == Other); }
498 };
499 
500 } // namespace llvm
501 
502 namespace std {
503 template <> struct hash<llvm::PDB_SymType> {
504   typedef llvm::PDB_SymType argument_type;
505   typedef std::size_t result_type;
506 
507   result_type operator()(const argument_type &Arg) const {
508     return std::hash<int>()(static_cast<int>(Arg));
509   }
510 };
511 }
512 
513 #endif
514