1321369Sdim//===- PDBTypes.h - Defines enums for various fields contained in PDB ----====//
2283625Sdim//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6283625Sdim//
7283625Sdim//===----------------------------------------------------------------------===//
8283625Sdim
9283625Sdim#ifndef LLVM_DEBUGINFO_PDB_PDBTYPES_H
10283625Sdim#define LLVM_DEBUGINFO_PDB_PDBTYPES_H
11283625Sdim
12309124Sdim#include "llvm/DebugInfo/CodeView/CodeView.h"
13321369Sdim#include "llvm/DebugInfo/PDB/IPDBEnumChildren.h"
14344779Sdim#include "llvm/DebugInfo/PDB/IPDBFrameData.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
25344779Sdimtypedef uint32_t SymIndexId;
26344779Sdim
27283625Sdimclass IPDBDataStream;
28341825Sdimclass IPDBInjectedSource;
29283625Sdimclass IPDBLineNumber;
30341825Sdimclass IPDBSectionContrib;
31283625Sdimclass IPDBSourceFile;
32327952Sdimclass IPDBTable;
33321369Sdimclass PDBSymDumper;
34321369Sdimclass PDBSymbol;
35283625Sdimclass PDBSymbolExe;
36283625Sdimclass PDBSymbolCompiland;
37283625Sdimclass PDBSymbolCompilandDetails;
38283625Sdimclass PDBSymbolCompilandEnv;
39283625Sdimclass PDBSymbolFunc;
40283625Sdimclass PDBSymbolBlock;
41283625Sdimclass PDBSymbolData;
42283625Sdimclass PDBSymbolAnnotation;
43283625Sdimclass PDBSymbolLabel;
44283625Sdimclass PDBSymbolPublicSymbol;
45283625Sdimclass PDBSymbolTypeUDT;
46283625Sdimclass PDBSymbolTypeEnum;
47283625Sdimclass PDBSymbolTypeFunctionSig;
48283625Sdimclass PDBSymbolTypePointer;
49283625Sdimclass PDBSymbolTypeArray;
50283625Sdimclass PDBSymbolTypeBuiltin;
51283625Sdimclass PDBSymbolTypeTypedef;
52283625Sdimclass PDBSymbolTypeBaseClass;
53283625Sdimclass PDBSymbolTypeFriend;
54283625Sdimclass PDBSymbolTypeFunctionArg;
55283625Sdimclass PDBSymbolFuncDebugStart;
56283625Sdimclass PDBSymbolFuncDebugEnd;
57283625Sdimclass PDBSymbolUsingNamespace;
58283625Sdimclass PDBSymbolTypeVTableShape;
59283625Sdimclass PDBSymbolTypeVTable;
60283625Sdimclass PDBSymbolCustom;
61283625Sdimclass PDBSymbolThunk;
62283625Sdimclass PDBSymbolTypeCustom;
63283625Sdimclass PDBSymbolTypeManaged;
64283625Sdimclass PDBSymbolTypeDimension;
65283625Sdimclass PDBSymbolUnknown;
66283625Sdim
67321369Sdimusing IPDBEnumSymbols = IPDBEnumChildren<PDBSymbol>;
68321369Sdimusing IPDBEnumSourceFiles = IPDBEnumChildren<IPDBSourceFile>;
69321369Sdimusing IPDBEnumDataStreams = IPDBEnumChildren<IPDBDataStream>;
70321369Sdimusing IPDBEnumLineNumbers = IPDBEnumChildren<IPDBLineNumber>;
71327952Sdimusing IPDBEnumTables = IPDBEnumChildren<IPDBTable>;
72341825Sdimusing IPDBEnumInjectedSources = IPDBEnumChildren<IPDBInjectedSource>;
73341825Sdimusing IPDBEnumSectionContribs = IPDBEnumChildren<IPDBSectionContrib>;
74344779Sdimusing IPDBEnumFrameData = IPDBEnumChildren<IPDBFrameData>;
75321369Sdim
76283625Sdim/// Specifies which PDB reader implementation is to be used.  Only a value
77321369Sdim/// of PDB_ReaderType::DIA is currently supported, but Native is in the works.
78283625Sdimenum class PDB_ReaderType {
79283625Sdim  DIA = 0,
80321369Sdim  Native = 1,
81283625Sdim};
82283625Sdim
83283625Sdim/// An enumeration indicating the type of data contained in this table.
84283625Sdimenum class PDB_TableType {
85327952Sdim  TableInvalid = 0,
86283625Sdim  Symbols,
87283625Sdim  SourceFiles,
88283625Sdim  LineNumbers,
89283625Sdim  SectionContribs,
90283625Sdim  Segments,
91283625Sdim  InjectedSources,
92327952Sdim  FrameData,
93327952Sdim  InputAssemblyFiles,
94327952Sdim  Dbg
95283625Sdim};
96283625Sdim
97283625Sdim/// Defines flags used for enumerating child symbols.  This corresponds to the
98283625Sdim/// NameSearchOptions enumeration which is documented here:
99283625Sdim/// https://msdn.microsoft.com/en-us/library/yat28ads.aspx
100283625Sdimenum PDB_NameSearchFlags {
101283625Sdim  NS_Default = 0x0,
102283625Sdim  NS_CaseSensitive = 0x1,
103283625Sdim  NS_CaseInsensitive = 0x2,
104283625Sdim  NS_FileNameExtMatch = 0x4,
105283625Sdim  NS_Regex = 0x8,
106341825Sdim  NS_UndecoratedName = 0x10,
107341825Sdim
108341825Sdim  // For backward compatibility.
109341825Sdim  NS_CaseInFileNameExt = NS_CaseInsensitive | NS_FileNameExtMatch,
110341825Sdim  NS_CaseRegex = NS_Regex | NS_CaseSensitive,
111341825Sdim  NS_CaseInRex = NS_Regex | NS_CaseInsensitive
112283625Sdim};
113283625Sdim
114283625Sdim/// Specifies the hash algorithm that a source file from a PDB was hashed with.
115283625Sdim/// This corresponds to the CV_SourceChksum_t enumeration and are documented
116283625Sdim/// here: https://msdn.microsoft.com/en-us/library/e96az21x.aspx
117341825Sdimenum class PDB_Checksum { None = 0, MD5 = 1, SHA1 = 2, SHA256 = 3 };
118283625Sdim
119283625Sdim/// These values correspond to the CV_CPU_TYPE_e enumeration, and are documented
120283625Sdim/// here: https://msdn.microsoft.com/en-us/library/b2fc64ek.aspx
121321369Sdimusing PDB_Cpu = codeview::CPUType;
122283625Sdim
123283625Sdimenum class PDB_Machine {
124283625Sdim  Invalid = 0xffff,
125283625Sdim  Unknown = 0x0,
126283625Sdim  Am33 = 0x13,
127283625Sdim  Amd64 = 0x8664,
128283625Sdim  Arm = 0x1C0,
129353358Sdim  Arm64 = 0xaa64,
130283625Sdim  ArmNT = 0x1C4,
131283625Sdim  Ebc = 0xEBC,
132283625Sdim  x86 = 0x14C,
133283625Sdim  Ia64 = 0x200,
134283625Sdim  M32R = 0x9041,
135283625Sdim  Mips16 = 0x266,
136283625Sdim  MipsFpu = 0x366,
137283625Sdim  MipsFpu16 = 0x466,
138283625Sdim  PowerPC = 0x1F0,
139283625Sdim  PowerPCFP = 0x1F1,
140283625Sdim  R4000 = 0x166,
141283625Sdim  SH3 = 0x1A2,
142283625Sdim  SH3DSP = 0x1A3,
143283625Sdim  SH4 = 0x1A6,
144283625Sdim  SH5 = 0x1A8,
145283625Sdim  Thumb = 0x1C2,
146283625Sdim  WceMipsV2 = 0x169
147283625Sdim};
148283625Sdim
149353358Sdim// A struct with an inner unnamed enum with explicit underlying type resuls
150353358Sdim// in an enum class that can implicitly convert to the underlying type, which
151353358Sdim// is convenient for this enum.
152353358Sdimstruct PDB_SourceCompression {
153353358Sdim  enum : uint32_t {
154353358Sdim    // No compression. Produced e.g. by `link.exe /natvis:foo.natvis`.
155353358Sdim    None,
156353358Sdim    // Not known what produces this.
157353358Sdim    RunLengthEncoded,
158353358Sdim    // Not known what produces this.
159353358Sdim    Huffman,
160353358Sdim    // Not known what produces this.
161353358Sdim    LZ,
162353358Sdim    // Produced e.g. by `csc /debug`. The encoded data is its own mini-stream
163353358Sdim    // with the following layout (in little endian):
164353358Sdim    //   GUID LanguageTypeGuid;
165353358Sdim    //   GUID LanguageVendorGuid;
166353358Sdim    //   GUID DocumentTypeGuid;
167353358Sdim    //   GUID HashFunctionGuid;
168353358Sdim    //   uint32_t HashDataSize;
169353358Sdim    //   uint32_t CompressedDataSize;
170353358Sdim    // Followed by HashDataSize bytes containing a hash checksum,
171353358Sdim    // followed by CompressedDataSize bytes containing source contents.
172353358Sdim    //
173353358Sdim    // CompressedDataSize can be 0, in this case only the hash data is present.
174353358Sdim    // (CompressedDataSize is != 0 e.g. if `/embed` is passed to csc.exe.)
175353358Sdim    // The compressed data format is:
176353358Sdim    //   uint32_t UncompressedDataSize;
177353358Sdim    // If UncompressedDataSize is 0, the data is stored uncompressed and
178353358Sdim    // CompressedDataSize stores the uncompressed size.
179353358Sdim    // If UncompressedDataSize is != 0, then the data is in raw deflate
180353358Sdim    // encoding as described in rfc1951.
181353358Sdim    //
182353358Sdim    // A GUID is 16 bytes, stored in the usual
183353358Sdim    //   uint32_t
184353358Sdim    //   uint16_t
185353358Sdim    //   uint16_t
186353358Sdim    //   uint8_t[24]
187353358Sdim    // layout.
188353358Sdim    //
189353358Sdim    // Well-known GUIDs for LanguageTypeGuid are:
190353358Sdim    //   63a08714-fc37-11d2-904c-00c04fa302a1 C
191353358Sdim    //   3a12d0b7-c26c-11d0-b442-00a0244a1dd2 C++
192353358Sdim    //   3f5162f8-07c6-11d3-9053-00c04fa302a1 C#
193353358Sdim    //   af046cd1-d0e1-11d2-977c-00a0c9b4d50c Cobol
194353358Sdim    //   ab4f38c9-b6e6-43ba-be3b-58080b2ccce3 F#
195353358Sdim    //   3a12d0b4-c26c-11d0-b442-00a0244a1dd2 Java
196353358Sdim    //   3a12d0b6-c26c-11d0-b442-00a0244a1dd2 JScript
197353358Sdim    //   af046cd2-d0e1-11d2-977c-00a0c9b4d50c Pascal
198353358Sdim    //   3a12d0b8-c26c-11d0-b442-00a0244a1dd2 Visual Basic
199353358Sdim    //
200353358Sdim    // Well-known GUIDs for LanguageVendorGuid are:
201353358Sdim    //   994b45c4-e6e9-11d2-903f-00c04fa302a1 Microsoft
202353358Sdim    //
203353358Sdim    // Well-known GUIDs for DocumentTypeGuid are:
204353358Sdim    //   5a869d0b-6611-11d3-bd2a-0000f80849bd Text
205353358Sdim    //
206353358Sdim    // Well-known GUIDs for HashFunctionGuid are:
207353358Sdim    //   406ea660-64cf-4c82-b6f0-42d48172a799 MD5    (HashDataSize is 16)
208353358Sdim    //   ff1816ec-aa5e-4d10-87f7-6f4963833460 SHA1   (HashDataSize is 20)
209353358Sdim    //   8829d00f-11b8-4213-878b-770e8597ac16 SHA256 (HashDataSize is 32)
210353358Sdim    DotNet = 101,
211353358Sdim  };
212341825Sdim};
213341825Sdim
214283625Sdim/// These values correspond to the CV_call_e enumeration, and are documented
215283625Sdim/// at the following locations:
216283625Sdim///   https://msdn.microsoft.com/en-us/library/b2fc64ek.aspx
217283625Sdim///   https://msdn.microsoft.com/en-us/library/windows/desktop/ms680207(v=vs.85).aspx
218321369Sdimusing PDB_CallingConv = codeview::CallingConvention;
219283625Sdim
220283625Sdim/// These values correspond to the CV_CFL_LANG enumeration, and are documented
221283625Sdim/// here: https://msdn.microsoft.com/en-us/library/bw3aekw6.aspx
222321369Sdimusing PDB_Lang = codeview::SourceLanguage;
223283625Sdim
224283625Sdim/// These values correspond to the DataKind enumeration, and are documented
225283625Sdim/// here: https://msdn.microsoft.com/en-us/library/b2x2t313.aspx
226283625Sdimenum class PDB_DataKind {
227283625Sdim  Unknown,
228283625Sdim  Local,
229283625Sdim  StaticLocal,
230283625Sdim  Param,
231283625Sdim  ObjectPtr,
232283625Sdim  FileStatic,
233283625Sdim  Global,
234283625Sdim  Member,
235283625Sdim  StaticMember,
236283625Sdim  Constant
237283625Sdim};
238283625Sdim
239283625Sdim/// These values correspond to the SymTagEnum enumeration, and are documented
240283625Sdim/// here: https://msdn.microsoft.com/en-us/library/bkedss5f.aspx
241283625Sdimenum class PDB_SymType {
242283625Sdim  None,
243283625Sdim  Exe,
244283625Sdim  Compiland,
245283625Sdim  CompilandDetails,
246283625Sdim  CompilandEnv,
247283625Sdim  Function,
248283625Sdim  Block,
249283625Sdim  Data,
250283625Sdim  Annotation,
251283625Sdim  Label,
252283625Sdim  PublicSymbol,
253283625Sdim  UDT,
254283625Sdim  Enum,
255283625Sdim  FunctionSig,
256283625Sdim  PointerType,
257283625Sdim  ArrayType,
258283625Sdim  BuiltinType,
259283625Sdim  Typedef,
260283625Sdim  BaseClass,
261283625Sdim  Friend,
262283625Sdim  FunctionArg,
263283625Sdim  FuncDebugStart,
264283625Sdim  FuncDebugEnd,
265283625Sdim  UsingNamespace,
266283625Sdim  VTableShape,
267283625Sdim  VTable,
268283625Sdim  Custom,
269283625Sdim  Thunk,
270283625Sdim  CustomType,
271283625Sdim  ManagedType,
272283625Sdim  Dimension,
273344779Sdim  CallSite,
274344779Sdim  InlineSite,
275344779Sdim  BaseInterface,
276344779Sdim  VectorType,
277344779Sdim  MatrixType,
278344779Sdim  HLSLType,
279344779Sdim  Caller,
280344779Sdim  Callee,
281344779Sdim  Export,
282344779Sdim  HeapAllocationSite,
283344779Sdim  CoffGroup,
284344779Sdim  Inlinee,
285283625Sdim  Max
286283625Sdim};
287283625Sdim
288283625Sdim/// These values correspond to the LocationType enumeration, and are documented
289283625Sdim/// here: https://msdn.microsoft.com/en-us/library/f57kaez3.aspx
290283625Sdimenum class PDB_LocType {
291283625Sdim  Null,
292283625Sdim  Static,
293283625Sdim  TLS,
294283625Sdim  RegRel,
295283625Sdim  ThisRel,
296283625Sdim  Enregistered,
297283625Sdim  BitField,
298283625Sdim  Slot,
299283625Sdim  IlRel,
300283625Sdim  MetaData,
301283625Sdim  Constant,
302341825Sdim  RegRelAliasIndir,
303283625Sdim  Max
304283625Sdim};
305283625Sdim
306283625Sdim/// These values correspond to the UdtKind enumeration, and are documented
307283625Sdim/// here: https://msdn.microsoft.com/en-us/library/wcstk66t.aspx
308283625Sdimenum class PDB_UdtType { Struct, Class, Union, Interface };
309283625Sdim
310283625Sdim/// These values correspond to the StackFrameTypeEnum enumeration, and are
311283625Sdim/// documented here: https://msdn.microsoft.com/en-us/library/bc5207xw.aspx.
312341825Sdimenum class PDB_StackFrameType : uint16_t {
313341825Sdim  FPO,
314341825Sdim  KernelTrap,
315341825Sdim  KernelTSS,
316341825Sdim  EBP,
317341825Sdim  FrameData,
318341825Sdim  Unknown = 0xffff
319341825Sdim};
320283625Sdim
321341825Sdim/// These values correspond to the MemoryTypeEnum enumeration, and are
322341825Sdim/// documented here: https://msdn.microsoft.com/en-us/library/ms165609.aspx.
323341825Sdimenum class PDB_MemoryType : uint16_t {
324341825Sdim  Code,
325341825Sdim  Data,
326341825Sdim  Stack,
327341825Sdim  HeapCode,
328341825Sdim  Any = 0xffff
329341825Sdim};
330283625Sdim
331283625Sdim/// These values correspond to the Basictype enumeration, and are documented
332283625Sdim/// here: https://msdn.microsoft.com/en-us/library/4szdtzc3.aspx
333283625Sdimenum class PDB_BuiltinType {
334283625Sdim  None = 0,
335283625Sdim  Void = 1,
336283625Sdim  Char = 2,
337283625Sdim  WCharT = 3,
338283625Sdim  Int = 6,
339283625Sdim  UInt = 7,
340283625Sdim  Float = 8,
341283625Sdim  BCD = 9,
342283625Sdim  Bool = 10,
343283625Sdim  Long = 13,
344283625Sdim  ULong = 14,
345283625Sdim  Currency = 25,
346283625Sdim  Date = 26,
347283625Sdim  Variant = 27,
348283625Sdim  Complex = 28,
349283625Sdim  Bitfield = 29,
350283625Sdim  BSTR = 30,
351341825Sdim  HResult = 31,
352341825Sdim  Char16 = 32,
353341825Sdim  Char32 = 33
354283625Sdim};
355283625Sdim
356327952Sdim/// These values correspond to the flags that can be combined to control the
357327952Sdim/// return of an undecorated name for a C++ decorated name, and are documented
358327952Sdim/// here: https://msdn.microsoft.com/en-us/library/kszfk0fs.aspx
359341825Sdimenum PDB_UndnameFlags : uint32_t {
360327952Sdim  Undname_Complete = 0x0,
361327952Sdim  Undname_NoLeadingUnderscores = 0x1,
362327952Sdim  Undname_NoMsKeywords = 0x2,
363327952Sdim  Undname_NoFuncReturns = 0x4,
364327952Sdim  Undname_NoAllocModel = 0x8,
365327952Sdim  Undname_NoAllocLang = 0x10,
366327952Sdim  Undname_Reserved1 = 0x20,
367327952Sdim  Undname_Reserved2 = 0x40,
368327952Sdim  Undname_NoThisType = 0x60,
369327952Sdim  Undname_NoAccessSpec = 0x80,
370327952Sdim  Undname_NoThrowSig = 0x100,
371327952Sdim  Undname_NoMemberType = 0x200,
372327952Sdim  Undname_NoReturnUDTModel = 0x400,
373327952Sdim  Undname_32BitDecode = 0x800,
374327952Sdim  Undname_NameOnly = 0x1000,
375327952Sdim  Undname_TypeOnly = 0x2000,
376327952Sdim  Undname_HaveParams = 0x4000,
377327952Sdim  Undname_NoECSU = 0x8000,
378327952Sdim  Undname_NoIdentCharCheck = 0x10000,
379327952Sdim  Undname_NoPTR64 = 0x20000
380327952Sdim};
381327952Sdim
382283625Sdimenum class PDB_MemberAccess { Private = 1, Protected = 2, Public = 3 };
383283625Sdim
384283625Sdimstruct VersionInfo {
385283625Sdim  uint32_t Major;
386283625Sdim  uint32_t Minor;
387283625Sdim  uint32_t Build;
388283625Sdim  uint32_t QFE;
389283625Sdim};
390283625Sdim
391283625Sdimenum PDB_VariantType {
392283625Sdim  Empty,
393283625Sdim  Unknown,
394283625Sdim  Int8,
395283625Sdim  Int16,
396283625Sdim  Int32,
397283625Sdim  Int64,
398283625Sdim  Single,
399283625Sdim  Double,
400283625Sdim  UInt8,
401283625Sdim  UInt16,
402283625Sdim  UInt32,
403283625Sdim  UInt64,
404283625Sdim  Bool,
405309124Sdim  String
406283625Sdim};
407283625Sdim
408283625Sdimstruct Variant {
409321369Sdim  Variant() = default;
410309124Sdim
411344779Sdim  explicit Variant(bool V) : Type(PDB_VariantType::Bool) { Value.Bool = V; }
412344779Sdim  explicit Variant(int8_t V) : Type(PDB_VariantType::Int8) { Value.Int8 = V; }
413344779Sdim  explicit Variant(int16_t V) : Type(PDB_VariantType::Int16) {
414344779Sdim    Value.Int16 = V;
415344779Sdim  }
416344779Sdim  explicit Variant(int32_t V) : Type(PDB_VariantType::Int32) {
417344779Sdim    Value.Int32 = V;
418344779Sdim  }
419344779Sdim  explicit Variant(int64_t V) : Type(PDB_VariantType::Int64) {
420344779Sdim    Value.Int64 = V;
421344779Sdim  }
422344779Sdim  explicit Variant(float V) : Type(PDB_VariantType::Single) {
423344779Sdim    Value.Single = V;
424344779Sdim  }
425344779Sdim  explicit Variant(double V) : Type(PDB_VariantType::Double) {
426344779Sdim    Value.Double = V;
427344779Sdim  }
428344779Sdim  explicit Variant(uint8_t V) : Type(PDB_VariantType::UInt8) {
429344779Sdim    Value.UInt8 = V;
430344779Sdim  }
431344779Sdim  explicit Variant(uint16_t V) : Type(PDB_VariantType::UInt16) {
432344779Sdim    Value.UInt16 = V;
433344779Sdim  }
434344779Sdim  explicit Variant(uint32_t V) : Type(PDB_VariantType::UInt32) {
435344779Sdim    Value.UInt32 = V;
436344779Sdim  }
437344779Sdim  explicit Variant(uint64_t V) : Type(PDB_VariantType::UInt64) {
438344779Sdim    Value.UInt64 = V;
439344779Sdim  }
440344779Sdim
441321369Sdim  Variant(const Variant &Other) {
442309124Sdim    *this = Other;
443283625Sdim  }
444283625Sdim
445309124Sdim  ~Variant() {
446309124Sdim    if (Type == PDB_VariantType::String)
447309124Sdim      delete[] Value.String;
448309124Sdim  }
449309124Sdim
450321369Sdim  PDB_VariantType Type = PDB_VariantType::Empty;
451283625Sdim  union {
452283625Sdim    bool Bool;
453283625Sdim    int8_t Int8;
454283625Sdim    int16_t Int16;
455283625Sdim    int32_t Int32;
456283625Sdim    int64_t Int64;
457283625Sdim    float Single;
458283625Sdim    double Double;
459283625Sdim    uint8_t UInt8;
460283625Sdim    uint16_t UInt16;
461283625Sdim    uint32_t UInt32;
462283625Sdim    uint64_t UInt64;
463309124Sdim    char *String;
464309124Sdim  } Value;
465309124Sdim
466283625Sdim#define VARIANT_EQUAL_CASE(Enum)                                               \
467283625Sdim  case PDB_VariantType::Enum:                                                  \
468309124Sdim    return Value.Enum == Other.Value.Enum;
469309124Sdim
470283625Sdim  bool operator==(const Variant &Other) const {
471283625Sdim    if (Type != Other.Type)
472283625Sdim      return false;
473283625Sdim    switch (Type) {
474283625Sdim      VARIANT_EQUAL_CASE(Bool)
475283625Sdim      VARIANT_EQUAL_CASE(Int8)
476283625Sdim      VARIANT_EQUAL_CASE(Int16)
477283625Sdim      VARIANT_EQUAL_CASE(Int32)
478283625Sdim      VARIANT_EQUAL_CASE(Int64)
479283625Sdim      VARIANT_EQUAL_CASE(Single)
480283625Sdim      VARIANT_EQUAL_CASE(Double)
481283625Sdim      VARIANT_EQUAL_CASE(UInt8)
482283625Sdim      VARIANT_EQUAL_CASE(UInt16)
483283625Sdim      VARIANT_EQUAL_CASE(UInt32)
484283625Sdim      VARIANT_EQUAL_CASE(UInt64)
485309124Sdim      VARIANT_EQUAL_CASE(String)
486283625Sdim    default:
487283625Sdim      return true;
488283625Sdim    }
489283625Sdim  }
490309124Sdim
491283625Sdim#undef VARIANT_EQUAL_CASE
492309124Sdim
493283625Sdim  bool operator!=(const Variant &Other) const { return !(*this == Other); }
494309124Sdim  Variant &operator=(const Variant &Other) {
495309124Sdim    if (this == &Other)
496309124Sdim      return *this;
497309124Sdim    if (Type == PDB_VariantType::String)
498309124Sdim      delete[] Value.String;
499309124Sdim    Type = Other.Type;
500309124Sdim    Value = Other.Value;
501309124Sdim    if (Other.Type == PDB_VariantType::String &&
502309124Sdim        Other.Value.String != nullptr) {
503309124Sdim      Value.String = new char[strlen(Other.Value.String) + 1];
504309124Sdim      ::strcpy(Value.String, Other.Value.String);
505309124Sdim    }
506309124Sdim    return *this;
507309124Sdim  }
508283625Sdim};
509283625Sdim
510321369Sdim} // end namespace pdb
511309124Sdim} // end namespace llvm
512296417Sdim
513283625Sdimnamespace std {
514321369Sdim
515309124Sdimtemplate <> struct hash<llvm::pdb::PDB_SymType> {
516321369Sdim  using argument_type = llvm::pdb::PDB_SymType;
517321369Sdim  using result_type = std::size_t;
518283625Sdim
519283625Sdim  result_type operator()(const argument_type &Arg) const {
520283625Sdim    return std::hash<int>()(static_cast<int>(Arg));
521283625Sdim  }
522283625Sdim};
523321369Sdim
524309124Sdim} // end namespace std
525283625Sdim
526309124Sdim#endif // LLVM_DEBUGINFO_PDB_PDBTYPES_H
527