//===- PDBTypes.h - Defines enums for various fields contained in PDB ---*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef LLVM_DEBUGINFO_PDB_PDBTYPES_H #define LLVM_DEBUGINFO_PDB_PDBTYPES_H #include "llvm/Config/llvm-config.h" #include "llvm/DebugInfo/CodeView/CodeView.h" #include "llvm/DebugInfo/PDB/Raw/RawTypes.h" #include #include #include namespace llvm { namespace pdb { class PDBSymDumper; class PDBSymbol; class IPDBDataStream; template class IPDBEnumChildren; class IPDBLineNumber; class IPDBRawSymbol; class IPDBSession; class IPDBSourceFile; typedef IPDBEnumChildren IPDBEnumSymbols; typedef IPDBEnumChildren IPDBEnumSourceFiles; typedef IPDBEnumChildren IPDBEnumDataStreams; typedef IPDBEnumChildren IPDBEnumLineNumbers; class PDBSymbolExe; class PDBSymbolCompiland; class PDBSymbolCompilandDetails; class PDBSymbolCompilandEnv; class PDBSymbolFunc; class PDBSymbolBlock; class PDBSymbolData; class PDBSymbolAnnotation; class PDBSymbolLabel; class PDBSymbolPublicSymbol; class PDBSymbolTypeUDT; class PDBSymbolTypeEnum; class PDBSymbolTypeFunctionSig; class PDBSymbolTypePointer; class PDBSymbolTypeArray; class PDBSymbolTypeBuiltin; class PDBSymbolTypeTypedef; class PDBSymbolTypeBaseClass; class PDBSymbolTypeFriend; class PDBSymbolTypeFunctionArg; class PDBSymbolFuncDebugStart; class PDBSymbolFuncDebugEnd; class PDBSymbolUsingNamespace; class PDBSymbolTypeVTableShape; class PDBSymbolTypeVTable; class PDBSymbolCustom; class PDBSymbolThunk; class PDBSymbolTypeCustom; class PDBSymbolTypeManaged; class PDBSymbolTypeDimension; class PDBSymbolUnknown; /// Specifies which PDB reader implementation is to be used. Only a value /// of PDB_ReaderType::DIA is supported. enum class PDB_ReaderType { DIA = 0, Raw = 1, }; /// An enumeration indicating the type of data contained in this table. enum class PDB_TableType { Symbols, SourceFiles, LineNumbers, SectionContribs, Segments, InjectedSources, FrameData }; /// Defines flags used for enumerating child symbols. This corresponds to the /// NameSearchOptions enumeration which is documented here: /// https://msdn.microsoft.com/en-us/library/yat28ads.aspx enum PDB_NameSearchFlags { NS_Default = 0x0, NS_CaseSensitive = 0x1, NS_CaseInsensitive = 0x2, NS_FileNameExtMatch = 0x4, NS_Regex = 0x8, NS_UndecoratedName = 0x10 }; /// Specifies the hash algorithm that a source file from a PDB was hashed with. /// This corresponds to the CV_SourceChksum_t enumeration and are documented /// here: https://msdn.microsoft.com/en-us/library/e96az21x.aspx enum class PDB_Checksum { None = 0, MD5 = 1, SHA1 = 2 }; /// These values correspond to the CV_CPU_TYPE_e enumeration, and are documented /// here: https://msdn.microsoft.com/en-us/library/b2fc64ek.aspx typedef codeview::CPUType PDB_Cpu; enum class PDB_Machine { Invalid = 0xffff, Unknown = 0x0, Am33 = 0x13, Amd64 = 0x8664, Arm = 0x1C0, ArmNT = 0x1C4, Ebc = 0xEBC, x86 = 0x14C, Ia64 = 0x200, M32R = 0x9041, Mips16 = 0x266, MipsFpu = 0x366, MipsFpu16 = 0x466, PowerPC = 0x1F0, PowerPCFP = 0x1F1, R4000 = 0x166, SH3 = 0x1A2, SH3DSP = 0x1A3, SH4 = 0x1A6, SH5 = 0x1A8, Thumb = 0x1C2, WceMipsV2 = 0x169 }; /// These values correspond to the CV_call_e enumeration, and are documented /// at the following locations: /// https://msdn.microsoft.com/en-us/library/b2fc64ek.aspx /// https://msdn.microsoft.com/en-us/library/windows/desktop/ms680207(v=vs.85).aspx /// typedef codeview::CallingConvention PDB_CallingConv; /// These values correspond to the CV_CFL_LANG enumeration, and are documented /// here: https://msdn.microsoft.com/en-us/library/bw3aekw6.aspx typedef codeview::SourceLanguage PDB_Lang; /// These values correspond to the DataKind enumeration, and are documented /// here: https://msdn.microsoft.com/en-us/library/b2x2t313.aspx enum class PDB_DataKind { Unknown, Local, StaticLocal, Param, ObjectPtr, FileStatic, Global, Member, StaticMember, Constant }; /// These values correspond to the SymTagEnum enumeration, and are documented /// here: https://msdn.microsoft.com/en-us/library/bkedss5f.aspx enum class PDB_SymType { None, Exe, Compiland, CompilandDetails, CompilandEnv, Function, Block, Data, Annotation, Label, PublicSymbol, UDT, Enum, FunctionSig, PointerType, ArrayType, BuiltinType, Typedef, BaseClass, Friend, FunctionArg, FuncDebugStart, FuncDebugEnd, UsingNamespace, VTableShape, VTable, Custom, Thunk, CustomType, ManagedType, Dimension, Max }; /// These values correspond to the LocationType enumeration, and are documented /// here: https://msdn.microsoft.com/en-us/library/f57kaez3.aspx enum class PDB_LocType { Null, Static, TLS, RegRel, ThisRel, Enregistered, BitField, Slot, IlRel, MetaData, Constant, Max }; /// These values correspond to the UdtKind enumeration, and are documented /// here: https://msdn.microsoft.com/en-us/library/wcstk66t.aspx enum class PDB_UdtType { Struct, Class, Union, Interface }; /// These values correspond to the StackFrameTypeEnum enumeration, and are /// documented here: https://msdn.microsoft.com/en-us/library/bc5207xw.aspx. enum class PDB_StackFrameType { FPO, KernelTrap, KernelTSS, EBP, FrameData }; /// These values correspond to the StackFrameTypeEnum enumeration, and are /// documented here: https://msdn.microsoft.com/en-us/library/bc5207xw.aspx. enum class PDB_MemoryType { Code, Data, Stack, HeapCode }; /// These values correspond to the Basictype enumeration, and are documented /// here: https://msdn.microsoft.com/en-us/library/4szdtzc3.aspx enum class PDB_BuiltinType { None = 0, Void = 1, Char = 2, WCharT = 3, Int = 6, UInt = 7, Float = 8, BCD = 9, Bool = 10, Long = 13, ULong = 14, Currency = 25, Date = 26, Variant = 27, Complex = 28, Bitfield = 29, BSTR = 30, HResult = 31 }; enum class PDB_MemberAccess { Private = 1, Protected = 2, Public = 3 }; struct VersionInfo { uint32_t Major; uint32_t Minor; uint32_t Build; uint32_t QFE; }; enum PDB_VariantType { Empty, Unknown, Int8, Int16, Int32, Int64, Single, Double, UInt8, UInt16, UInt32, UInt64, Bool, String }; struct Variant { Variant() : Type(PDB_VariantType::Empty) {} Variant(const Variant &Other) : Type(PDB_VariantType::Empty) { *this = Other; } ~Variant() { if (Type == PDB_VariantType::String) delete[] Value.String; } PDB_VariantType Type; union { bool Bool; int8_t Int8; int16_t Int16; int32_t Int32; int64_t Int64; float Single; double Double; uint8_t UInt8; uint16_t UInt16; uint32_t UInt32; uint64_t UInt64; char *String; } Value; #define VARIANT_EQUAL_CASE(Enum) \ case PDB_VariantType::Enum: \ return Value.Enum == Other.Value.Enum; bool operator==(const Variant &Other) const { if (Type != Other.Type) return false; switch (Type) { VARIANT_EQUAL_CASE(Bool) VARIANT_EQUAL_CASE(Int8) VARIANT_EQUAL_CASE(Int16) VARIANT_EQUAL_CASE(Int32) VARIANT_EQUAL_CASE(Int64) VARIANT_EQUAL_CASE(Single) VARIANT_EQUAL_CASE(Double) VARIANT_EQUAL_CASE(UInt8) VARIANT_EQUAL_CASE(UInt16) VARIANT_EQUAL_CASE(UInt32) VARIANT_EQUAL_CASE(UInt64) VARIANT_EQUAL_CASE(String) default: return true; } } #undef VARIANT_EQUAL_CASE bool operator!=(const Variant &Other) const { return !(*this == Other); } Variant &operator=(const Variant &Other) { if (this == &Other) return *this; if (Type == PDB_VariantType::String) delete[] Value.String; Type = Other.Type; Value = Other.Value; if (Other.Type == PDB_VariantType::String && Other.Value.String != nullptr) { Value.String = new char[strlen(Other.Value.String) + 1]; ::strcpy(Value.String, Other.Value.String); } return *this; } }; } // end namespace llvm } namespace std { template <> struct hash { typedef llvm::pdb::PDB_SymType argument_type; typedef std::size_t result_type; result_type operator()(const argument_type &Arg) const { return std::hash()(static_cast(Arg)); } }; } // end namespace std #endif // LLVM_DEBUGINFO_PDB_PDBTYPES_H