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