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