PDBTypes.h revision 341825
1321369Sdim//===- PDBTypes.h - Defines enums for various fields contained in PDB ----====//
2283625Sdim//
3283625Sdim//                     The LLVM Compiler Infrastructure
4283625Sdim//
5283625Sdim// This file is distributed under the University of Illinois Open Source
6283625Sdim// License. See LICENSE.TXT for details.
7283625Sdim//
8283625Sdim//===----------------------------------------------------------------------===//
9283625Sdim
10283625Sdim#ifndef LLVM_DEBUGINFO_PDB_PDBTYPES_H
11283625Sdim#define LLVM_DEBUGINFO_PDB_PDBTYPES_H
12283625Sdim
13309124Sdim#include "llvm/DebugInfo/CodeView/CodeView.h"
14321369Sdim#include "llvm/DebugInfo/PDB/IPDBEnumChildren.h"
15321369Sdim#include "llvm/DebugInfo/PDB/Native/RawTypes.h"
16327952Sdim#include <cctype>
17321369Sdim#include <cstddef>
18309124Sdim#include <cstdint>
19309124Sdim#include <cstring>
20314564Sdim#include <functional>
21283625Sdim
22283625Sdimnamespace llvm {
23309124Sdimnamespace pdb {
24283625Sdim
25283625Sdimclass IPDBDataStream;
26341825Sdimclass IPDBInjectedSource;
27283625Sdimclass IPDBLineNumber;
28341825Sdimclass IPDBSectionContrib;
29283625Sdimclass IPDBSourceFile;
30327952Sdimclass IPDBTable;
31321369Sdimclass PDBSymDumper;
32321369Sdimclass PDBSymbol;
33283625Sdimclass PDBSymbolExe;
34283625Sdimclass PDBSymbolCompiland;
35283625Sdimclass PDBSymbolCompilandDetails;
36283625Sdimclass PDBSymbolCompilandEnv;
37283625Sdimclass PDBSymbolFunc;
38283625Sdimclass PDBSymbolBlock;
39283625Sdimclass PDBSymbolData;
40283625Sdimclass PDBSymbolAnnotation;
41283625Sdimclass PDBSymbolLabel;
42283625Sdimclass PDBSymbolPublicSymbol;
43283625Sdimclass PDBSymbolTypeUDT;
44283625Sdimclass PDBSymbolTypeEnum;
45283625Sdimclass PDBSymbolTypeFunctionSig;
46283625Sdimclass PDBSymbolTypePointer;
47283625Sdimclass PDBSymbolTypeArray;
48283625Sdimclass PDBSymbolTypeBuiltin;
49283625Sdimclass PDBSymbolTypeTypedef;
50283625Sdimclass PDBSymbolTypeBaseClass;
51283625Sdimclass PDBSymbolTypeFriend;
52283625Sdimclass PDBSymbolTypeFunctionArg;
53283625Sdimclass PDBSymbolFuncDebugStart;
54283625Sdimclass PDBSymbolFuncDebugEnd;
55283625Sdimclass PDBSymbolUsingNamespace;
56283625Sdimclass PDBSymbolTypeVTableShape;
57283625Sdimclass PDBSymbolTypeVTable;
58283625Sdimclass PDBSymbolCustom;
59283625Sdimclass PDBSymbolThunk;
60283625Sdimclass PDBSymbolTypeCustom;
61283625Sdimclass PDBSymbolTypeManaged;
62283625Sdimclass PDBSymbolTypeDimension;
63283625Sdimclass PDBSymbolUnknown;
64283625Sdim
65321369Sdimusing IPDBEnumSymbols = IPDBEnumChildren<PDBSymbol>;
66321369Sdimusing IPDBEnumSourceFiles = IPDBEnumChildren<IPDBSourceFile>;
67321369Sdimusing IPDBEnumDataStreams = IPDBEnumChildren<IPDBDataStream>;
68321369Sdimusing IPDBEnumLineNumbers = IPDBEnumChildren<IPDBLineNumber>;
69327952Sdimusing IPDBEnumTables = IPDBEnumChildren<IPDBTable>;
70341825Sdimusing IPDBEnumInjectedSources = IPDBEnumChildren<IPDBInjectedSource>;
71341825Sdimusing IPDBEnumSectionContribs = IPDBEnumChildren<IPDBSectionContrib>;
72321369Sdim
73283625Sdim/// Specifies which PDB reader implementation is to be used.  Only a value
74321369Sdim/// of PDB_ReaderType::DIA is currently supported, but Native is in the works.
75283625Sdimenum class PDB_ReaderType {
76283625Sdim  DIA = 0,
77321369Sdim  Native = 1,
78283625Sdim};
79283625Sdim
80283625Sdim/// An enumeration indicating the type of data contained in this table.
81283625Sdimenum class PDB_TableType {
82327952Sdim  TableInvalid = 0,
83283625Sdim  Symbols,
84283625Sdim  SourceFiles,
85283625Sdim  LineNumbers,
86283625Sdim  SectionContribs,
87283625Sdim  Segments,
88283625Sdim  InjectedSources,
89327952Sdim  FrameData,
90327952Sdim  InputAssemblyFiles,
91327952Sdim  Dbg
92283625Sdim};
93283625Sdim
94283625Sdim/// Defines flags used for enumerating child symbols.  This corresponds to the
95283625Sdim/// NameSearchOptions enumeration which is documented here:
96283625Sdim/// https://msdn.microsoft.com/en-us/library/yat28ads.aspx
97283625Sdimenum PDB_NameSearchFlags {
98283625Sdim  NS_Default = 0x0,
99283625Sdim  NS_CaseSensitive = 0x1,
100283625Sdim  NS_CaseInsensitive = 0x2,
101283625Sdim  NS_FileNameExtMatch = 0x4,
102283625Sdim  NS_Regex = 0x8,
103341825Sdim  NS_UndecoratedName = 0x10,
104341825Sdim
105341825Sdim  // For backward compatibility.
106341825Sdim  NS_CaseInFileNameExt = NS_CaseInsensitive | NS_FileNameExtMatch,
107341825Sdim  NS_CaseRegex = NS_Regex | NS_CaseSensitive,
108341825Sdim  NS_CaseInRex = NS_Regex | NS_CaseInsensitive
109283625Sdim};
110283625Sdim
111283625Sdim/// Specifies the hash algorithm that a source file from a PDB was hashed with.
112283625Sdim/// This corresponds to the CV_SourceChksum_t enumeration and are documented
113283625Sdim/// here: https://msdn.microsoft.com/en-us/library/e96az21x.aspx
114341825Sdimenum class PDB_Checksum { None = 0, MD5 = 1, SHA1 = 2, SHA256 = 3 };
115283625Sdim
116283625Sdim/// These values correspond to the CV_CPU_TYPE_e enumeration, and are documented
117283625Sdim/// here: https://msdn.microsoft.com/en-us/library/b2fc64ek.aspx
118321369Sdimusing PDB_Cpu = codeview::CPUType;
119283625Sdim
120283625Sdimenum class PDB_Machine {
121283625Sdim  Invalid = 0xffff,
122283625Sdim  Unknown = 0x0,
123283625Sdim  Am33 = 0x13,
124283625Sdim  Amd64 = 0x8664,
125283625Sdim  Arm = 0x1C0,
126283625Sdim  ArmNT = 0x1C4,
127283625Sdim  Ebc = 0xEBC,
128283625Sdim  x86 = 0x14C,
129283625Sdim  Ia64 = 0x200,
130283625Sdim  M32R = 0x9041,
131283625Sdim  Mips16 = 0x266,
132283625Sdim  MipsFpu = 0x366,
133283625Sdim  MipsFpu16 = 0x466,
134283625Sdim  PowerPC = 0x1F0,
135283625Sdim  PowerPCFP = 0x1F1,
136283625Sdim  R4000 = 0x166,
137283625Sdim  SH3 = 0x1A2,
138283625Sdim  SH3DSP = 0x1A3,
139283625Sdim  SH4 = 0x1A6,
140283625Sdim  SH5 = 0x1A8,
141283625Sdim  Thumb = 0x1C2,
142283625Sdim  WceMipsV2 = 0x169
143283625Sdim};
144283625Sdim
145341825Sdimenum class PDB_SourceCompression {
146341825Sdim  None,
147341825Sdim  RunLengthEncoded,
148341825Sdim  Huffman,
149341825Sdim  LZ,
150341825Sdim};
151341825Sdim
152283625Sdim/// These values correspond to the CV_call_e enumeration, and are documented
153283625Sdim/// at the following locations:
154283625Sdim///   https://msdn.microsoft.com/en-us/library/b2fc64ek.aspx
155283625Sdim///   https://msdn.microsoft.com/en-us/library/windows/desktop/ms680207(v=vs.85).aspx
156321369Sdimusing PDB_CallingConv = codeview::CallingConvention;
157283625Sdim
158283625Sdim/// These values correspond to the CV_CFL_LANG enumeration, and are documented
159283625Sdim/// here: https://msdn.microsoft.com/en-us/library/bw3aekw6.aspx
160321369Sdimusing PDB_Lang = codeview::SourceLanguage;
161283625Sdim
162283625Sdim/// These values correspond to the DataKind enumeration, and are documented
163283625Sdim/// here: https://msdn.microsoft.com/en-us/library/b2x2t313.aspx
164283625Sdimenum class PDB_DataKind {
165283625Sdim  Unknown,
166283625Sdim  Local,
167283625Sdim  StaticLocal,
168283625Sdim  Param,
169283625Sdim  ObjectPtr,
170283625Sdim  FileStatic,
171283625Sdim  Global,
172283625Sdim  Member,
173283625Sdim  StaticMember,
174283625Sdim  Constant
175283625Sdim};
176283625Sdim
177283625Sdim/// These values correspond to the SymTagEnum enumeration, and are documented
178283625Sdim/// here: https://msdn.microsoft.com/en-us/library/bkedss5f.aspx
179283625Sdimenum class PDB_SymType {
180283625Sdim  None,
181283625Sdim  Exe,
182283625Sdim  Compiland,
183283625Sdim  CompilandDetails,
184283625Sdim  CompilandEnv,
185283625Sdim  Function,
186283625Sdim  Block,
187283625Sdim  Data,
188283625Sdim  Annotation,
189283625Sdim  Label,
190283625Sdim  PublicSymbol,
191283625Sdim  UDT,
192283625Sdim  Enum,
193283625Sdim  FunctionSig,
194283625Sdim  PointerType,
195283625Sdim  ArrayType,
196283625Sdim  BuiltinType,
197283625Sdim  Typedef,
198283625Sdim  BaseClass,
199283625Sdim  Friend,
200283625Sdim  FunctionArg,
201283625Sdim  FuncDebugStart,
202283625Sdim  FuncDebugEnd,
203283625Sdim  UsingNamespace,
204283625Sdim  VTableShape,
205283625Sdim  VTable,
206283625Sdim  Custom,
207283625Sdim  Thunk,
208283625Sdim  CustomType,
209283625Sdim  ManagedType,
210283625Sdim  Dimension,
211283625Sdim  Max
212283625Sdim};
213283625Sdim
214283625Sdim/// These values correspond to the LocationType enumeration, and are documented
215283625Sdim/// here: https://msdn.microsoft.com/en-us/library/f57kaez3.aspx
216283625Sdimenum class PDB_LocType {
217283625Sdim  Null,
218283625Sdim  Static,
219283625Sdim  TLS,
220283625Sdim  RegRel,
221283625Sdim  ThisRel,
222283625Sdim  Enregistered,
223283625Sdim  BitField,
224283625Sdim  Slot,
225283625Sdim  IlRel,
226283625Sdim  MetaData,
227283625Sdim  Constant,
228341825Sdim  RegRelAliasIndir,
229283625Sdim  Max
230283625Sdim};
231283625Sdim
232283625Sdim/// These values correspond to the UdtKind enumeration, and are documented
233283625Sdim/// here: https://msdn.microsoft.com/en-us/library/wcstk66t.aspx
234283625Sdimenum class PDB_UdtType { Struct, Class, Union, Interface };
235283625Sdim
236283625Sdim/// These values correspond to the StackFrameTypeEnum enumeration, and are
237283625Sdim/// documented here: https://msdn.microsoft.com/en-us/library/bc5207xw.aspx.
238341825Sdimenum class PDB_StackFrameType : uint16_t {
239341825Sdim  FPO,
240341825Sdim  KernelTrap,
241341825Sdim  KernelTSS,
242341825Sdim  EBP,
243341825Sdim  FrameData,
244341825Sdim  Unknown = 0xffff
245341825Sdim};
246283625Sdim
247341825Sdim/// These values correspond to the MemoryTypeEnum enumeration, and are
248341825Sdim/// documented here: https://msdn.microsoft.com/en-us/library/ms165609.aspx.
249341825Sdimenum class PDB_MemoryType : uint16_t {
250341825Sdim  Code,
251341825Sdim  Data,
252341825Sdim  Stack,
253341825Sdim  HeapCode,
254341825Sdim  Any = 0xffff
255341825Sdim};
256283625Sdim
257283625Sdim/// These values correspond to the Basictype enumeration, and are documented
258283625Sdim/// here: https://msdn.microsoft.com/en-us/library/4szdtzc3.aspx
259283625Sdimenum class PDB_BuiltinType {
260283625Sdim  None = 0,
261283625Sdim  Void = 1,
262283625Sdim  Char = 2,
263283625Sdim  WCharT = 3,
264283625Sdim  Int = 6,
265283625Sdim  UInt = 7,
266283625Sdim  Float = 8,
267283625Sdim  BCD = 9,
268283625Sdim  Bool = 10,
269283625Sdim  Long = 13,
270283625Sdim  ULong = 14,
271283625Sdim  Currency = 25,
272283625Sdim  Date = 26,
273283625Sdim  Variant = 27,
274283625Sdim  Complex = 28,
275283625Sdim  Bitfield = 29,
276283625Sdim  BSTR = 30,
277341825Sdim  HResult = 31,
278341825Sdim  Char16 = 32,
279341825Sdim  Char32 = 33
280283625Sdim};
281283625Sdim
282327952Sdim/// These values correspond to the flags that can be combined to control the
283327952Sdim/// return of an undecorated name for a C++ decorated name, and are documented
284327952Sdim/// here: https://msdn.microsoft.com/en-us/library/kszfk0fs.aspx
285341825Sdimenum PDB_UndnameFlags : uint32_t {
286327952Sdim  Undname_Complete = 0x0,
287327952Sdim  Undname_NoLeadingUnderscores = 0x1,
288327952Sdim  Undname_NoMsKeywords = 0x2,
289327952Sdim  Undname_NoFuncReturns = 0x4,
290327952Sdim  Undname_NoAllocModel = 0x8,
291327952Sdim  Undname_NoAllocLang = 0x10,
292327952Sdim  Undname_Reserved1 = 0x20,
293327952Sdim  Undname_Reserved2 = 0x40,
294327952Sdim  Undname_NoThisType = 0x60,
295327952Sdim  Undname_NoAccessSpec = 0x80,
296327952Sdim  Undname_NoThrowSig = 0x100,
297327952Sdim  Undname_NoMemberType = 0x200,
298327952Sdim  Undname_NoReturnUDTModel = 0x400,
299327952Sdim  Undname_32BitDecode = 0x800,
300327952Sdim  Undname_NameOnly = 0x1000,
301327952Sdim  Undname_TypeOnly = 0x2000,
302327952Sdim  Undname_HaveParams = 0x4000,
303327952Sdim  Undname_NoECSU = 0x8000,
304327952Sdim  Undname_NoIdentCharCheck = 0x10000,
305327952Sdim  Undname_NoPTR64 = 0x20000
306327952Sdim};
307327952Sdim
308283625Sdimenum class PDB_MemberAccess { Private = 1, Protected = 2, Public = 3 };
309283625Sdim
310283625Sdimstruct VersionInfo {
311283625Sdim  uint32_t Major;
312283625Sdim  uint32_t Minor;
313283625Sdim  uint32_t Build;
314283625Sdim  uint32_t QFE;
315283625Sdim};
316283625Sdim
317283625Sdimenum PDB_VariantType {
318283625Sdim  Empty,
319283625Sdim  Unknown,
320283625Sdim  Int8,
321283625Sdim  Int16,
322283625Sdim  Int32,
323283625Sdim  Int64,
324283625Sdim  Single,
325283625Sdim  Double,
326283625Sdim  UInt8,
327283625Sdim  UInt16,
328283625Sdim  UInt32,
329283625Sdim  UInt64,
330283625Sdim  Bool,
331309124Sdim  String
332283625Sdim};
333283625Sdim
334283625Sdimstruct Variant {
335321369Sdim  Variant() = default;
336309124Sdim
337321369Sdim  Variant(const Variant &Other) {
338309124Sdim    *this = Other;
339283625Sdim  }
340283625Sdim
341309124Sdim  ~Variant() {
342309124Sdim    if (Type == PDB_VariantType::String)
343309124Sdim      delete[] Value.String;
344309124Sdim  }
345309124Sdim
346321369Sdim  PDB_VariantType Type = PDB_VariantType::Empty;
347283625Sdim  union {
348283625Sdim    bool Bool;
349283625Sdim    int8_t Int8;
350283625Sdim    int16_t Int16;
351283625Sdim    int32_t Int32;
352283625Sdim    int64_t Int64;
353283625Sdim    float Single;
354283625Sdim    double Double;
355283625Sdim    uint8_t UInt8;
356283625Sdim    uint16_t UInt16;
357283625Sdim    uint32_t UInt32;
358283625Sdim    uint64_t UInt64;
359309124Sdim    char *String;
360309124Sdim  } Value;
361309124Sdim
362283625Sdim#define VARIANT_EQUAL_CASE(Enum)                                               \
363283625Sdim  case PDB_VariantType::Enum:                                                  \
364309124Sdim    return Value.Enum == Other.Value.Enum;
365309124Sdim
366283625Sdim  bool operator==(const Variant &Other) const {
367283625Sdim    if (Type != Other.Type)
368283625Sdim      return false;
369283625Sdim    switch (Type) {
370283625Sdim      VARIANT_EQUAL_CASE(Bool)
371283625Sdim      VARIANT_EQUAL_CASE(Int8)
372283625Sdim      VARIANT_EQUAL_CASE(Int16)
373283625Sdim      VARIANT_EQUAL_CASE(Int32)
374283625Sdim      VARIANT_EQUAL_CASE(Int64)
375283625Sdim      VARIANT_EQUAL_CASE(Single)
376283625Sdim      VARIANT_EQUAL_CASE(Double)
377283625Sdim      VARIANT_EQUAL_CASE(UInt8)
378283625Sdim      VARIANT_EQUAL_CASE(UInt16)
379283625Sdim      VARIANT_EQUAL_CASE(UInt32)
380283625Sdim      VARIANT_EQUAL_CASE(UInt64)
381309124Sdim      VARIANT_EQUAL_CASE(String)
382283625Sdim    default:
383283625Sdim      return true;
384283625Sdim    }
385283625Sdim  }
386309124Sdim
387283625Sdim#undef VARIANT_EQUAL_CASE
388309124Sdim
389283625Sdim  bool operator!=(const Variant &Other) const { return !(*this == Other); }
390309124Sdim  Variant &operator=(const Variant &Other) {
391309124Sdim    if (this == &Other)
392309124Sdim      return *this;
393309124Sdim    if (Type == PDB_VariantType::String)
394309124Sdim      delete[] Value.String;
395309124Sdim    Type = Other.Type;
396309124Sdim    Value = Other.Value;
397309124Sdim    if (Other.Type == PDB_VariantType::String &&
398309124Sdim        Other.Value.String != nullptr) {
399309124Sdim      Value.String = new char[strlen(Other.Value.String) + 1];
400309124Sdim      ::strcpy(Value.String, Other.Value.String);
401309124Sdim    }
402309124Sdim    return *this;
403309124Sdim  }
404283625Sdim};
405283625Sdim
406321369Sdim} // end namespace pdb
407309124Sdim} // end namespace llvm
408296417Sdim
409283625Sdimnamespace std {
410321369Sdim
411309124Sdimtemplate <> struct hash<llvm::pdb::PDB_SymType> {
412321369Sdim  using argument_type = llvm::pdb::PDB_SymType;
413321369Sdim  using result_type = std::size_t;
414283625Sdim
415283625Sdim  result_type operator()(const argument_type &Arg) const {
416283625Sdim    return std::hash<int>()(static_cast<int>(Arg));
417283625Sdim  }
418283625Sdim};
419321369Sdim
420309124Sdim} // end namespace std
421283625Sdim
422309124Sdim#endif // LLVM_DEBUGINFO_PDB_PDBTYPES_H
423