Home | History | Annotate | Download | only in PDB
      1 //===- PDBTypes.h - Defines enums for various fields contained in PDB ---*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #ifndef LLVM_DEBUGINFO_PDB_PDBTYPES_H
     11 #define LLVM_DEBUGINFO_PDB_PDBTYPES_H
     12 
     13 #include "llvm/Config/llvm-config.h"
     14 #include "llvm/Support/Endian.h"
     15 #include <functional>
     16 #include <stdint.h>
     17 
     18 namespace llvm {
     19 
     20 class PDBSymDumper;
     21 class PDBSymbol;
     22 
     23 class IPDBDataStream;
     24 template <class T> class IPDBEnumChildren;
     25 class IPDBLineNumber;
     26 class IPDBRawSymbol;
     27 class IPDBSession;
     28 class IPDBSourceFile;
     29 
     30 typedef IPDBEnumChildren<PDBSymbol> IPDBEnumSymbols;
     31 typedef IPDBEnumChildren<IPDBSourceFile> IPDBEnumSourceFiles;
     32 typedef IPDBEnumChildren<IPDBDataStream> IPDBEnumDataStreams;
     33 typedef IPDBEnumChildren<IPDBLineNumber> IPDBEnumLineNumbers;
     34 
     35 class PDBSymbolExe;
     36 class PDBSymbolCompiland;
     37 class PDBSymbolCompilandDetails;
     38 class PDBSymbolCompilandEnv;
     39 class PDBSymbolFunc;
     40 class PDBSymbolBlock;
     41 class PDBSymbolData;
     42 class PDBSymbolAnnotation;
     43 class PDBSymbolLabel;
     44 class PDBSymbolPublicSymbol;
     45 class PDBSymbolTypeUDT;
     46 class PDBSymbolTypeEnum;
     47 class PDBSymbolTypeFunctionSig;
     48 class PDBSymbolTypePointer;
     49 class PDBSymbolTypeArray;
     50 class PDBSymbolTypeBuiltin;
     51 class PDBSymbolTypeTypedef;
     52 class PDBSymbolTypeBaseClass;
     53 class PDBSymbolTypeFriend;
     54 class PDBSymbolTypeFunctionArg;
     55 class PDBSymbolFuncDebugStart;
     56 class PDBSymbolFuncDebugEnd;
     57 class PDBSymbolUsingNamespace;
     58 class PDBSymbolTypeVTableShape;
     59 class PDBSymbolTypeVTable;
     60 class PDBSymbolCustom;
     61 class PDBSymbolThunk;
     62 class PDBSymbolTypeCustom;
     63 class PDBSymbolTypeManaged;
     64 class PDBSymbolTypeDimension;
     65 class PDBSymbolUnknown;
     66 
     67 /// Specifies which PDB reader implementation is to be used.  Only a value
     68 /// of PDB_ReaderType::DIA is supported.
     69 enum class PDB_ReaderType {
     70   DIA = 0,
     71 };
     72 
     73 /// Defines a 128-bit unique identifier.  This maps to a GUID on Windows, but
     74 /// is abstracted here for the purposes of non-Windows platforms that don't have
     75 /// the GUID structure defined.
     76 struct PDB_UniqueId {
     77   uint64_t HighPart;
     78   uint64_t LowPart;
     79 };
     80 
     81 /// An enumeration indicating the type of data contained in this table.
     82 enum class PDB_TableType {
     83   Symbols,
     84   SourceFiles,
     85   LineNumbers,
     86   SectionContribs,
     87   Segments,
     88   InjectedSources,
     89   FrameData
     90 };
     91 
     92 /// Defines flags used for enumerating child symbols.  This corresponds to the
     93 /// NameSearchOptions enumeration which is documented here:
     94 /// https://msdn.microsoft.com/en-us/library/yat28ads.aspx
     95 enum PDB_NameSearchFlags {
     96   NS_Default = 0x0,
     97   NS_CaseSensitive = 0x1,
     98   NS_CaseInsensitive = 0x2,
     99   NS_FileNameExtMatch = 0x4,
    100   NS_Regex = 0x8,
    101   NS_UndecoratedName = 0x10
    102 };
    103 
    104 /// Specifies the hash algorithm that a source file from a PDB was hashed with.
    105 /// This corresponds to the CV_SourceChksum_t enumeration and are documented
    106 /// here: https://msdn.microsoft.com/en-us/library/e96az21x.aspx
    107 enum class PDB_Checksum { None = 0, MD5 = 1, SHA1 = 2 };
    108 
    109 /// These values correspond to the CV_CPU_TYPE_e enumeration, and are documented
    110 /// here: https://msdn.microsoft.com/en-us/library/b2fc64ek.aspx
    111 enum class PDB_Cpu {
    112   Intel8080 = 0x0,
    113   Intel8086 = 0x1,
    114   Intel80286 = 0x2,
    115   Intel80386 = 0x3,
    116   Intel80486 = 0x4,
    117   Pentium = 0x5,
    118   PentiumPro = 0x6,
    119   Pentium3 = 0x7,
    120   MIPS = 0x10,
    121   MIPS16 = 0x11,
    122   MIPS32 = 0x12,
    123   MIPS64 = 0x13,
    124   MIPSI = 0x14,
    125   MIPSII = 0x15,
    126   MIPSIII = 0x16,
    127   MIPSIV = 0x17,
    128   MIPSV = 0x18,
    129   M68000 = 0x20,
    130   M68010 = 0x21,
    131   M68020 = 0x22,
    132   M68030 = 0x23,
    133   M68040 = 0x24,
    134   Alpha = 0x30,
    135   Alpha21164 = 0x31,
    136   Alpha21164A = 0x32,
    137   Alpha21264 = 0x33,
    138   Alpha21364 = 0x34,
    139   PPC601 = 0x40,
    140   PPC603 = 0x41,
    141   PPC604 = 0x42,
    142   PPC620 = 0x43,
    143   PPCFP = 0x44,
    144   PPCBE = 0x45,
    145   SH3 = 0x50,
    146   SH3E = 0x51,
    147   SH3DSP = 0x52,
    148   SH4 = 0x53,
    149   SHMedia = 0x54,
    150   ARM3 = 0x60,
    151   ARM4 = 0x61,
    152   ARM4T = 0x62,
    153   ARM5 = 0x63,
    154   ARM5T = 0x64,
    155   ARM6 = 0x65,
    156   ARM_XMAC = 0x66,
    157   ARM_WMMX = 0x67,
    158   ARM7 = 0x68,
    159   Omni = 0x70,
    160   Ia64 = 0x80,
    161   Ia64_2 = 0x81,
    162   CEE = 0x90,
    163   AM33 = 0xa0,
    164   M32R = 0xb0,
    165   TriCore = 0xc0,
    166   X64 = 0xd0,
    167   EBC = 0xe0,
    168   Thumb = 0xf0,
    169   ARMNT = 0xf4,
    170   D3D11_Shader = 0x100,
    171 };
    172 
    173 enum class PDB_Machine {
    174   Invalid = 0xffff,
    175   Unknown = 0x0,
    176   Am33 = 0x13,
    177   Amd64 = 0x8664,
    178   Arm = 0x1C0,
    179   ArmNT = 0x1C4,
    180   Ebc = 0xEBC,
    181   x86 = 0x14C,
    182   Ia64 = 0x200,
    183   M32R = 0x9041,
    184   Mips16 = 0x266,
    185   MipsFpu = 0x366,
    186   MipsFpu16 = 0x466,
    187   PowerPC = 0x1F0,
    188   PowerPCFP = 0x1F1,
    189   R4000 = 0x166,
    190   SH3 = 0x1A2,
    191   SH3DSP = 0x1A3,
    192   SH4 = 0x1A6,
    193   SH5 = 0x1A8,
    194   Thumb = 0x1C2,
    195   WceMipsV2 = 0x169
    196 };
    197 
    198 /// These values correspond to the CV_call_e enumeration, and are documented
    199 /// at the following locations:
    200 ///   https://msdn.microsoft.com/en-us/library/b2fc64ek.aspx
    201 ///   https://msdn.microsoft.com/en-us/library/windows/desktop/ms680207(v=vs.85).aspx
    202 ///
    203 enum class PDB_CallingConv {
    204   NearCdecl = 0x00,
    205   FarCdecl = 0x01,
    206   NearPascal = 0x02,
    207   FarPascal = 0x03,
    208   NearFastcall = 0x04,
    209   FarFastcall = 0x05,
    210   Skipped = 0x06,
    211   NearStdcall = 0x07,
    212   FarStdcall = 0x08,
    213   NearSyscall = 0x09,
    214   FarSyscall = 0x0a,
    215   Thiscall = 0x0b,
    216   MipsCall = 0x0c,
    217   Generic = 0x0d,
    218   Alphacall = 0x0e,
    219   Ppccall = 0x0f,
    220   SuperHCall = 0x10,
    221   Armcall = 0x11,
    222   AM33call = 0x12,
    223   Tricall = 0x13,
    224   Sh5call = 0x14,
    225   M32R = 0x15,
    226   Clrcall = 0x16,
    227   Inline = 0x17,
    228   NearVectorcall = 0x18,
    229   Reserved = 0x19,
    230 };
    231 
    232 /// These values correspond to the CV_CFL_LANG enumeration, and are documented
    233 /// here: https://msdn.microsoft.com/en-us/library/bw3aekw6.aspx
    234 enum class PDB_Lang {
    235   C = 0x00,
    236   Cpp = 0x01,
    237   Fortran = 0x02,
    238   Masm = 0x03,
    239   Pascal = 0x04,
    240   Basic = 0x05,
    241   Cobol = 0x06,
    242   Link = 0x07,
    243   Cvtres = 0x08,
    244   Cvtpgd = 0x09,
    245   CSharp = 0x0a,
    246   VB = 0x0b,
    247   ILAsm = 0x0c,
    248   Java = 0x0d,
    249   JScript = 0x0e,
    250   MSIL = 0x0f,
    251   HLSL = 0x10
    252 };
    253 
    254 /// These values correspond to the DataKind enumeration, and are documented
    255 /// here: https://msdn.microsoft.com/en-us/library/b2x2t313.aspx
    256 enum class PDB_DataKind {
    257   Unknown,
    258   Local,
    259   StaticLocal,
    260   Param,
    261   ObjectPtr,
    262   FileStatic,
    263   Global,
    264   Member,
    265   StaticMember,
    266   Constant
    267 };
    268 
    269 /// These values correspond to the SymTagEnum enumeration, and are documented
    270 /// here: https://msdn.microsoft.com/en-us/library/bkedss5f.aspx
    271 enum class PDB_SymType {
    272   None,
    273   Exe,
    274   Compiland,
    275   CompilandDetails,
    276   CompilandEnv,
    277   Function,
    278   Block,
    279   Data,
    280   Annotation,
    281   Label,
    282   PublicSymbol,
    283   UDT,
    284   Enum,
    285   FunctionSig,
    286   PointerType,
    287   ArrayType,
    288   BuiltinType,
    289   Typedef,
    290   BaseClass,
    291   Friend,
    292   FunctionArg,
    293   FuncDebugStart,
    294   FuncDebugEnd,
    295   UsingNamespace,
    296   VTableShape,
    297   VTable,
    298   Custom,
    299   Thunk,
    300   CustomType,
    301   ManagedType,
    302   Dimension,
    303   Max
    304 };
    305 
    306 /// These values correspond to the LocationType enumeration, and are documented
    307 /// here: https://msdn.microsoft.com/en-us/library/f57kaez3.aspx
    308 enum class PDB_LocType {
    309   Null,
    310   Static,
    311   TLS,
    312   RegRel,
    313   ThisRel,
    314   Enregistered,
    315   BitField,
    316   Slot,
    317   IlRel,
    318   MetaData,
    319   Constant,
    320   Max
    321 };
    322 
    323 /// These values correspond to the THUNK_ORDINAL enumeration, and are documented
    324 /// here: https://msdn.microsoft.com/en-us/library/dh0k8hft.aspx
    325 enum class PDB_ThunkOrdinal {
    326   Standard,
    327   ThisAdjustor,
    328   Vcall,
    329   Pcode,
    330   UnknownLoad,
    331   TrampIncremental,
    332   BranchIsland
    333 };
    334 
    335 /// These values correspond to the UdtKind enumeration, and are documented
    336 /// here: https://msdn.microsoft.com/en-us/library/wcstk66t.aspx
    337 enum class PDB_UdtType { Struct, Class, Union, Interface };
    338 
    339 /// These values correspond to the StackFrameTypeEnum enumeration, and are
    340 /// documented here: https://msdn.microsoft.com/en-us/library/bc5207xw.aspx.
    341 enum class PDB_StackFrameType { FPO, KernelTrap, KernelTSS, EBP, FrameData };
    342 
    343 /// These values correspond to the StackFrameTypeEnum enumeration, and are
    344 /// documented here: https://msdn.microsoft.com/en-us/library/bc5207xw.aspx.
    345 enum class PDB_MemoryType { Code, Data, Stack, HeapCode };
    346 
    347 /// These values correspond to the Basictype enumeration, and are documented
    348 /// here: https://msdn.microsoft.com/en-us/library/4szdtzc3.aspx
    349 enum class PDB_BuiltinType {
    350   None = 0,
    351   Void = 1,
    352   Char = 2,
    353   WCharT = 3,
    354   Int = 6,
    355   UInt = 7,
    356   Float = 8,
    357   BCD = 9,
    358   Bool = 10,
    359   Long = 13,
    360   ULong = 14,
    361   Currency = 25,
    362   Date = 26,
    363   Variant = 27,
    364   Complex = 28,
    365   Bitfield = 29,
    366   BSTR = 30,
    367   HResult = 31
    368 };
    369 
    370 enum class PDB_RegisterId {
    371   Unknown = 0,
    372   VFrame = 30006,
    373   AL = 1,
    374   CL = 2,
    375   DL = 3,
    376   BL = 4,
    377   AH = 5,
    378   CH = 6,
    379   DH = 7,
    380   BH = 8,
    381   AX = 9,
    382   CX = 10,
    383   DX = 11,
    384   BX = 12,
    385   SP = 13,
    386   BP = 14,
    387   SI = 15,
    388   DI = 16,
    389   EAX = 17,
    390   ECX = 18,
    391   EDX = 19,
    392   EBX = 20,
    393   ESP = 21,
    394   EBP = 22,
    395   ESI = 23,
    396   EDI = 24,
    397   ES = 25,
    398   CS = 26,
    399   SS = 27,
    400   DS = 28,
    401   FS = 29,
    402   GS = 30,
    403   IP = 31,
    404   RAX = 328,
    405   RBX = 329,
    406   RCX = 330,
    407   RDX = 331,
    408   RSI = 332,
    409   RDI = 333,
    410   RBP = 334,
    411   RSP = 335,
    412   R8 = 336,
    413   R9 = 337,
    414   R10 = 338,
    415   R11 = 339,
    416   R12 = 340,
    417   R13 = 341,
    418   R14 = 342,
    419   R15 = 343,
    420 };
    421 
    422 enum class PDB_MemberAccess { Private = 1, Protected = 2, Public = 3 };
    423 
    424 enum class PDB_ErrorCode {
    425   Success,
    426   NoPdbImpl,
    427   InvalidPath,
    428   InvalidFileFormat,
    429   InvalidParameter,
    430   AlreadyLoaded,
    431   UnknownError,
    432   NoMemory,
    433   DebugInfoMismatch
    434 };
    435 
    436 struct VersionInfo {
    437   uint32_t Major;
    438   uint32_t Minor;
    439   uint32_t Build;
    440   uint32_t QFE;
    441 };
    442 
    443 enum PDB_VariantType {
    444   Empty,
    445   Unknown,
    446   Int8,
    447   Int16,
    448   Int32,
    449   Int64,
    450   Single,
    451   Double,
    452   UInt8,
    453   UInt16,
    454   UInt32,
    455   UInt64,
    456   Bool,
    457 };
    458 
    459 struct Variant {
    460   Variant()
    461     : Type(PDB_VariantType::Empty) {
    462   }
    463 
    464   PDB_VariantType Type;
    465   union {
    466     bool Bool;
    467     int8_t Int8;
    468     int16_t Int16;
    469     int32_t Int32;
    470     int64_t Int64;
    471     float Single;
    472     double Double;
    473     uint8_t UInt8;
    474     uint16_t UInt16;
    475     uint32_t UInt32;
    476     uint64_t UInt64;
    477   };
    478 #define VARIANT_EQUAL_CASE(Enum)                                               \
    479   case PDB_VariantType::Enum:                                                  \
    480     return Enum == Other.Enum;
    481   bool operator==(const Variant &Other) const {
    482     if (Type != Other.Type)
    483       return false;
    484     switch (Type) {
    485       VARIANT_EQUAL_CASE(Bool)
    486       VARIANT_EQUAL_CASE(Int8)
    487       VARIANT_EQUAL_CASE(Int16)
    488       VARIANT_EQUAL_CASE(Int32)
    489       VARIANT_EQUAL_CASE(Int64)
    490       VARIANT_EQUAL_CASE(Single)
    491       VARIANT_EQUAL_CASE(Double)
    492       VARIANT_EQUAL_CASE(UInt8)
    493       VARIANT_EQUAL_CASE(UInt16)
    494       VARIANT_EQUAL_CASE(UInt32)
    495       VARIANT_EQUAL_CASE(UInt64)
    496     default:
    497       return true;
    498     }
    499   }
    500 #undef VARIANT_EQUAL_CASE
    501   bool operator!=(const Variant &Other) const { return !(*this == Other); }
    502 };
    503 
    504 namespace PDB {
    505 static const char Magic[] = {'M',  'i',  'c',    'r', 'o', 's',  'o',  'f',
    506                              't',  ' ',  'C',    '/', 'C', '+',  '+',  ' ',
    507                              'M',  'S',  'F',    ' ', '7', '.',  '0',  '0',
    508                              '\r', '\n', '\x1a', 'D', 'S', '\0', '\0', '\0'};
    509 
    510 // The superblock is overlaid at the beginning of the file (offset 0).
    511 // It starts with a magic header and is followed by information which describes
    512 // the layout of the file system.
    513 struct SuperBlock {
    514   char MagicBytes[sizeof(Magic)];
    515   // The file system is split into a variable number of fixed size elements.
    516   // These elements are referred to as blocks.  The size of a block may vary
    517   // from system to system.
    518   support::ulittle32_t BlockSize;
    519   // This field's purpose is not yet known.
    520   support::ulittle32_t Unknown0;
    521   // This contains the number of blocks resident in the file system.  In
    522   // practice, NumBlocks * BlockSize is equivalent to the size of the PDB file.
    523   support::ulittle32_t NumBlocks;
    524   // This contains the number of bytes which make up the directory.
    525   support::ulittle32_t NumDirectoryBytes;
    526   // This field's purpose is not yet known.
    527   support::ulittle32_t Unknown1;
    528   // This contains the block # of the block map.
    529   support::ulittle32_t BlockMapAddr;
    530 };
    531 }
    532 
    533 } // namespace llvm
    534 
    535 namespace std {
    536 template <> struct hash<llvm::PDB_SymType> {
    537   typedef llvm::PDB_SymType argument_type;
    538   typedef std::size_t result_type;
    539 
    540   result_type operator()(const argument_type &Arg) const {
    541     return std::hash<int>()(static_cast<int>(Arg));
    542   }
    543 };
    544 }
    545 
    546 
    547 #endif
    548