10b57cec5SDimitry Andric //===- RawTypes.h -----------------------------------------------*- C++ -*-===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 90b57cec5SDimitry Andric #ifndef LLVM_DEBUGINFO_PDB_NATIVE_RAWTYPES_H 100b57cec5SDimitry Andric #define LLVM_DEBUGINFO_PDB_NATIVE_RAWTYPES_H 110b57cec5SDimitry Andric 120b57cec5SDimitry Andric #include "llvm/DebugInfo/CodeView/GUID.h" 130b57cec5SDimitry Andric #include "llvm/DebugInfo/CodeView/TypeRecord.h" 140b57cec5SDimitry Andric #include "llvm/Support/Endian.h" 150b57cec5SDimitry Andric 160b57cec5SDimitry Andric namespace llvm { 170b57cec5SDimitry Andric namespace pdb { 180b57cec5SDimitry Andric // This struct is defined as "SO" in langapi/include/pdb.h. 190b57cec5SDimitry Andric struct SectionOffset { 200b57cec5SDimitry Andric support::ulittle32_t Off; 210b57cec5SDimitry Andric support::ulittle16_t Isect; 220b57cec5SDimitry Andric char Padding[2]; 230b57cec5SDimitry Andric }; 240b57cec5SDimitry Andric 250b57cec5SDimitry Andric /// Header of the hash tables found in the globals and publics sections. 260b57cec5SDimitry Andric /// Based on GSIHashHdr in 270b57cec5SDimitry Andric /// https://github.com/Microsoft/microsoft-pdb/blob/master/PDB/dbi/gsi.h 280b57cec5SDimitry Andric struct GSIHashHeader { 290b57cec5SDimitry Andric enum : unsigned { 300b57cec5SDimitry Andric HdrSignature = ~0U, 310b57cec5SDimitry Andric HdrVersion = 0xeffe0000 + 19990810, 320b57cec5SDimitry Andric }; 330b57cec5SDimitry Andric support::ulittle32_t VerSignature; 340b57cec5SDimitry Andric support::ulittle32_t VerHdr; 350b57cec5SDimitry Andric support::ulittle32_t HrSize; 360b57cec5SDimitry Andric support::ulittle32_t NumBuckets; 370b57cec5SDimitry Andric }; 380b57cec5SDimitry Andric 390b57cec5SDimitry Andric // This is HRFile. 400b57cec5SDimitry Andric struct PSHashRecord { 410b57cec5SDimitry Andric support::ulittle32_t Off; // Offset in the symbol record stream 420b57cec5SDimitry Andric support::ulittle32_t CRef; 430b57cec5SDimitry Andric }; 440b57cec5SDimitry Andric 450b57cec5SDimitry Andric // This struct is defined as `SC` in include/dbicommon.h 460b57cec5SDimitry Andric struct SectionContrib { 470b57cec5SDimitry Andric support::ulittle16_t ISect; 480b57cec5SDimitry Andric char Padding[2]; 490b57cec5SDimitry Andric support::little32_t Off; 500b57cec5SDimitry Andric support::little32_t Size; 510b57cec5SDimitry Andric support::ulittle32_t Characteristics; 520b57cec5SDimitry Andric support::ulittle16_t Imod; 530b57cec5SDimitry Andric char Padding2[2]; 540b57cec5SDimitry Andric support::ulittle32_t DataCrc; 550b57cec5SDimitry Andric support::ulittle32_t RelocCrc; 560b57cec5SDimitry Andric }; 570b57cec5SDimitry Andric 580b57cec5SDimitry Andric // This struct is defined as `SC2` in include/dbicommon.h 590b57cec5SDimitry Andric struct SectionContrib2 { 600b57cec5SDimitry Andric // To guarantee SectionContrib2 is standard layout, we cannot use inheritance. 610b57cec5SDimitry Andric SectionContrib Base; 620b57cec5SDimitry Andric support::ulittle32_t ISectCoff; 630b57cec5SDimitry Andric }; 640b57cec5SDimitry Andric 650b57cec5SDimitry Andric // This corresponds to the `OMFSegMap` structure. 660b57cec5SDimitry Andric struct SecMapHeader { 670b57cec5SDimitry Andric support::ulittle16_t SecCount; // Number of segment descriptors in table 680b57cec5SDimitry Andric support::ulittle16_t SecCountLog; // Number of logical segment descriptors 690b57cec5SDimitry Andric }; 700b57cec5SDimitry Andric 710b57cec5SDimitry Andric // This corresponds to the `OMFSegMapDesc` structure. The definition is not 720b57cec5SDimitry Andric // present in the reference implementation, but the layout is derived from 730b57cec5SDimitry Andric // code that accesses the fields. 740b57cec5SDimitry Andric struct SecMapEntry { 750b57cec5SDimitry Andric support::ulittle16_t Flags; // Descriptor flags. See OMFSegDescFlags 760b57cec5SDimitry Andric support::ulittle16_t Ovl; // Logical overlay number. 770b57cec5SDimitry Andric support::ulittle16_t Group; // Group index into descriptor array. 780b57cec5SDimitry Andric support::ulittle16_t Frame; 790b57cec5SDimitry Andric support::ulittle16_t SecName; // Byte index of the segment or group name 800b57cec5SDimitry Andric // in the sstSegName table, or 0xFFFF. 810b57cec5SDimitry Andric support::ulittle16_t ClassName; // Byte index of the class name in the 820b57cec5SDimitry Andric // sstSegName table, or 0xFFFF. 830b57cec5SDimitry Andric support::ulittle32_t Offset; // Byte offset of the logical segment 840b57cec5SDimitry Andric // within the specified physical segment. 850b57cec5SDimitry Andric // If group is set in flags, offset is the 860b57cec5SDimitry Andric // offset of the group. 870b57cec5SDimitry Andric support::ulittle32_t SecByteLength; // Byte count of the segment or group. 880b57cec5SDimitry Andric }; 890b57cec5SDimitry Andric 900b57cec5SDimitry Andric /// Some of the values are stored in bitfields. Since this needs to be portable 910b57cec5SDimitry Andric /// across compilers and architectures (big / little endian in particular) we 920b57cec5SDimitry Andric /// can't use the actual structures below, but must instead do the shifting 930b57cec5SDimitry Andric /// and masking ourselves. The struct definitions are provided for reference. 940b57cec5SDimitry Andric struct DbiFlags { 950b57cec5SDimitry Andric /// uint16_t IncrementalLinking : 1; // True if linked incrementally 960b57cec5SDimitry Andric /// uint16_t IsStripped : 1; // True if private symbols were 970b57cec5SDimitry Andric /// stripped. 980b57cec5SDimitry Andric /// uint16_t HasCTypes : 1; // True if linked with /debug:ctypes. 990b57cec5SDimitry Andric /// uint16_t Reserved : 13; 1000b57cec5SDimitry Andric static const uint16_t FlagIncrementalMask = 0x0001; 1010b57cec5SDimitry Andric static const uint16_t FlagStrippedMask = 0x0002; 1020b57cec5SDimitry Andric static const uint16_t FlagHasCTypesMask = 0x0004; 1030b57cec5SDimitry Andric }; 1040b57cec5SDimitry Andric 1050b57cec5SDimitry Andric struct DbiBuildNo { 1060b57cec5SDimitry Andric /// uint16_t MinorVersion : 8; 1070b57cec5SDimitry Andric /// uint16_t MajorVersion : 7; 1080b57cec5SDimitry Andric /// uint16_t NewVersionFormat : 1; 1090b57cec5SDimitry Andric static const uint16_t BuildMinorMask = 0x00FF; 1100b57cec5SDimitry Andric static const uint16_t BuildMinorShift = 0; 1110b57cec5SDimitry Andric 1120b57cec5SDimitry Andric static const uint16_t BuildMajorMask = 0x7F00; 1130b57cec5SDimitry Andric static const uint16_t BuildMajorShift = 8; 1140b57cec5SDimitry Andric 1150b57cec5SDimitry Andric static const uint16_t NewVersionFormatMask = 0x8000; 1160b57cec5SDimitry Andric }; 1170b57cec5SDimitry Andric 1180b57cec5SDimitry Andric /// The fixed size header that appears at the beginning of the DBI Stream. 1190b57cec5SDimitry Andric struct DbiStreamHeader { 1200b57cec5SDimitry Andric support::little32_t VersionSignature; 1210b57cec5SDimitry Andric support::ulittle32_t VersionHeader; 1220b57cec5SDimitry Andric 1230b57cec5SDimitry Andric /// How "old" is this DBI Stream. Should match the age of the PDB InfoStream. 1240b57cec5SDimitry Andric support::ulittle32_t Age; 1250b57cec5SDimitry Andric 1260b57cec5SDimitry Andric /// Global symbol stream # 1270b57cec5SDimitry Andric support::ulittle16_t GlobalSymbolStreamIndex; 1280b57cec5SDimitry Andric 1290b57cec5SDimitry Andric /// See DbiBuildNo structure. 1300b57cec5SDimitry Andric support::ulittle16_t BuildNumber; 1310b57cec5SDimitry Andric 1320b57cec5SDimitry Andric /// Public symbols stream # 1330b57cec5SDimitry Andric support::ulittle16_t PublicSymbolStreamIndex; 1340b57cec5SDimitry Andric 1350b57cec5SDimitry Andric /// version of mspdbNNN.dll 1360b57cec5SDimitry Andric support::ulittle16_t PdbDllVersion; 1370b57cec5SDimitry Andric 1380b57cec5SDimitry Andric /// Symbol records stream # 1390b57cec5SDimitry Andric support::ulittle16_t SymRecordStreamIndex; 1400b57cec5SDimitry Andric 1410b57cec5SDimitry Andric /// rbld number of mspdbNNN.dll 1420b57cec5SDimitry Andric support::ulittle16_t PdbDllRbld; 1430b57cec5SDimitry Andric 1440b57cec5SDimitry Andric /// Size of module info stream 1450b57cec5SDimitry Andric support::little32_t ModiSubstreamSize; 1460b57cec5SDimitry Andric 1470b57cec5SDimitry Andric /// Size of sec. contrib stream 1480b57cec5SDimitry Andric support::little32_t SecContrSubstreamSize; 1490b57cec5SDimitry Andric 1500b57cec5SDimitry Andric /// Size of sec. map substream 1510b57cec5SDimitry Andric support::little32_t SectionMapSize; 1520b57cec5SDimitry Andric 1530b57cec5SDimitry Andric /// Size of file info substream 1540b57cec5SDimitry Andric support::little32_t FileInfoSize; 1550b57cec5SDimitry Andric 1560b57cec5SDimitry Andric /// Size of type server map 1570b57cec5SDimitry Andric support::little32_t TypeServerSize; 1580b57cec5SDimitry Andric 1590b57cec5SDimitry Andric /// Index of MFC Type Server 1600b57cec5SDimitry Andric support::ulittle32_t MFCTypeServerIndex; 1610b57cec5SDimitry Andric 1620b57cec5SDimitry Andric /// Size of DbgHeader info 1630b57cec5SDimitry Andric support::little32_t OptionalDbgHdrSize; 1640b57cec5SDimitry Andric 1650b57cec5SDimitry Andric /// Size of EC stream (what is EC?) 1660b57cec5SDimitry Andric support::little32_t ECSubstreamSize; 1670b57cec5SDimitry Andric 1680b57cec5SDimitry Andric /// See DbiFlags enum. 1690b57cec5SDimitry Andric support::ulittle16_t Flags; 1700b57cec5SDimitry Andric 1710b57cec5SDimitry Andric /// See PDB_MachineType enum. 1720b57cec5SDimitry Andric support::ulittle16_t MachineType; 1730b57cec5SDimitry Andric 1740b57cec5SDimitry Andric /// Pad to 64 bytes 1750b57cec5SDimitry Andric support::ulittle32_t Reserved; 1760b57cec5SDimitry Andric }; 1770b57cec5SDimitry Andric static_assert(sizeof(DbiStreamHeader) == 64, "Invalid DbiStreamHeader size!"); 1780b57cec5SDimitry Andric 1790b57cec5SDimitry Andric /// The header preceding the File Info Substream of the DBI stream. 1800b57cec5SDimitry Andric struct FileInfoSubstreamHeader { 1810b57cec5SDimitry Andric /// Total # of modules, should match number of records in the ModuleInfo 1820b57cec5SDimitry Andric /// substream. 1830b57cec5SDimitry Andric support::ulittle16_t NumModules; 1840b57cec5SDimitry Andric 1850b57cec5SDimitry Andric /// Total # of source files. This value is not accurate because PDB actually 1860b57cec5SDimitry Andric /// supports more than 64k source files, so we ignore it and compute the value 1870b57cec5SDimitry Andric /// from other stream fields. 1880b57cec5SDimitry Andric support::ulittle16_t NumSourceFiles; 1890b57cec5SDimitry Andric 1900b57cec5SDimitry Andric /// Following this header the File Info Substream is laid out as follows: 1910b57cec5SDimitry Andric /// ulittle16_t ModIndices[NumModules]; 1920b57cec5SDimitry Andric /// ulittle16_t ModFileCounts[NumModules]; 1930b57cec5SDimitry Andric /// ulittle32_t FileNameOffsets[NumSourceFiles]; 1940b57cec5SDimitry Andric /// char Names[][NumSourceFiles]; 1950b57cec5SDimitry Andric /// with the caveat that `NumSourceFiles` cannot be trusted, so 1960b57cec5SDimitry Andric /// it is computed by summing the `ModFileCounts` array. 1970b57cec5SDimitry Andric }; 1980b57cec5SDimitry Andric 1990b57cec5SDimitry Andric struct ModInfoFlags { 2000b57cec5SDimitry Andric /// uint16_t fWritten : 1; // True if DbiModuleDescriptor is dirty 2010b57cec5SDimitry Andric /// uint16_t fECEnabled : 1; // Is EC symbolic info present? (What is EC?) 2020b57cec5SDimitry Andric /// uint16_t unused : 6; // Reserved 2030b57cec5SDimitry Andric /// uint16_t iTSM : 8; // Type Server Index for this module 2040b57cec5SDimitry Andric static const uint16_t HasECFlagMask = 0x2; 2050b57cec5SDimitry Andric 2060b57cec5SDimitry Andric static const uint16_t TypeServerIndexMask = 0xFF00; 2070b57cec5SDimitry Andric static const uint16_t TypeServerIndexShift = 8; 2080b57cec5SDimitry Andric }; 2090b57cec5SDimitry Andric 2100b57cec5SDimitry Andric /// The header preceding each entry in the Module Info substream of the DBI 2110b57cec5SDimitry Andric /// stream. Corresponds to the type MODI in the reference implementation. 2120b57cec5SDimitry Andric struct ModuleInfoHeader { 2130b57cec5SDimitry Andric /// Currently opened module. This field is a pointer in the reference 2140b57cec5SDimitry Andric /// implementation, but that won't work on 64-bit systems, and anyway it 2150b57cec5SDimitry Andric /// doesn't make sense to read a pointer from a file. For now it is unused, 2160b57cec5SDimitry Andric /// so just ignore it. 2170b57cec5SDimitry Andric support::ulittle32_t Mod; 2180b57cec5SDimitry Andric 2190b57cec5SDimitry Andric /// First section contribution of this module. 2200b57cec5SDimitry Andric SectionContrib SC; 2210b57cec5SDimitry Andric 2220b57cec5SDimitry Andric /// See ModInfoFlags definition. 2230b57cec5SDimitry Andric support::ulittle16_t Flags; 2240b57cec5SDimitry Andric 2250b57cec5SDimitry Andric /// Stream Number of module debug info 2260b57cec5SDimitry Andric support::ulittle16_t ModDiStream; 2270b57cec5SDimitry Andric 2280b57cec5SDimitry Andric /// Size of local symbol debug info in above stream 2290b57cec5SDimitry Andric support::ulittle32_t SymBytes; 2300b57cec5SDimitry Andric 2310b57cec5SDimitry Andric /// Size of C11 line number info in above stream 2320b57cec5SDimitry Andric support::ulittle32_t C11Bytes; 2330b57cec5SDimitry Andric 2340b57cec5SDimitry Andric /// Size of C13 line number info in above stream 2350b57cec5SDimitry Andric support::ulittle32_t C13Bytes; 2360b57cec5SDimitry Andric 2370b57cec5SDimitry Andric /// Number of files contributing to this module 2380b57cec5SDimitry Andric support::ulittle16_t NumFiles; 2390b57cec5SDimitry Andric 2400b57cec5SDimitry Andric /// Padding so the next field is 4-byte aligned. 2410b57cec5SDimitry Andric char Padding1[2]; 2420b57cec5SDimitry Andric 2430b57cec5SDimitry Andric /// Array of [0..NumFiles) DBI name buffer offsets. In the reference 2440b57cec5SDimitry Andric /// implementation this field is a pointer. But since you can't portably 2450b57cec5SDimitry Andric /// serialize a pointer, on 64-bit platforms they copy all the values except 2460b57cec5SDimitry Andric /// this one into the 32-bit version of the struct and use that for 2470b57cec5SDimitry Andric /// serialization. Regardless, this field is unused, it is only there to 2480b57cec5SDimitry Andric /// store a pointer that can be accessed at runtime. 2490b57cec5SDimitry Andric support::ulittle32_t FileNameOffs; 2500b57cec5SDimitry Andric 2510b57cec5SDimitry Andric /// Name Index for src file name 2520b57cec5SDimitry Andric support::ulittle32_t SrcFileNameNI; 2530b57cec5SDimitry Andric 2540b57cec5SDimitry Andric /// Name Index for path to compiler PDB 2550b57cec5SDimitry Andric support::ulittle32_t PdbFilePathNI; 2560b57cec5SDimitry Andric 2570b57cec5SDimitry Andric /// Following this header are two zero terminated strings. 2580b57cec5SDimitry Andric /// char ModuleName[]; 2590b57cec5SDimitry Andric /// char ObjFileName[]; 2600b57cec5SDimitry Andric }; 2610b57cec5SDimitry Andric 2620b57cec5SDimitry Andric // This is PSGSIHDR struct defined in 2630b57cec5SDimitry Andric // https://github.com/Microsoft/microsoft-pdb/blob/master/PDB/dbi/gsi.h 2640b57cec5SDimitry Andric struct PublicsStreamHeader { 2650b57cec5SDimitry Andric support::ulittle32_t SymHash; 2660b57cec5SDimitry Andric support::ulittle32_t AddrMap; 2670b57cec5SDimitry Andric support::ulittle32_t NumThunks; 2680b57cec5SDimitry Andric support::ulittle32_t SizeOfThunk; 2690b57cec5SDimitry Andric support::ulittle16_t ISectThunkTable; 2700b57cec5SDimitry Andric char Padding[2]; 2710b57cec5SDimitry Andric support::ulittle32_t OffThunkTable; 2720b57cec5SDimitry Andric support::ulittle32_t NumSections; 2730b57cec5SDimitry Andric }; 2740b57cec5SDimitry Andric 2750b57cec5SDimitry Andric // The header preceding the global TPI stream. 2760b57cec5SDimitry Andric // This corresponds to `HDR` in PDB/dbi/tpi.h. 2770b57cec5SDimitry Andric struct TpiStreamHeader { 2780b57cec5SDimitry Andric struct EmbeddedBuf { 2790b57cec5SDimitry Andric support::little32_t Off; 2800b57cec5SDimitry Andric support::ulittle32_t Length; 2810b57cec5SDimitry Andric }; 2820b57cec5SDimitry Andric 2830b57cec5SDimitry Andric support::ulittle32_t Version; 2840b57cec5SDimitry Andric support::ulittle32_t HeaderSize; 2850b57cec5SDimitry Andric support::ulittle32_t TypeIndexBegin; 2860b57cec5SDimitry Andric support::ulittle32_t TypeIndexEnd; 2870b57cec5SDimitry Andric support::ulittle32_t TypeRecordBytes; 2880b57cec5SDimitry Andric 2890b57cec5SDimitry Andric // The following members correspond to `TpiHash` in PDB/dbi/tpi.h. 2900b57cec5SDimitry Andric support::ulittle16_t HashStreamIndex; 2910b57cec5SDimitry Andric support::ulittle16_t HashAuxStreamIndex; 2920b57cec5SDimitry Andric support::ulittle32_t HashKeySize; 2930b57cec5SDimitry Andric support::ulittle32_t NumHashBuckets; 2940b57cec5SDimitry Andric 2950b57cec5SDimitry Andric EmbeddedBuf HashValueBuffer; 2960b57cec5SDimitry Andric EmbeddedBuf IndexOffsetBuffer; 2970b57cec5SDimitry Andric EmbeddedBuf HashAdjBuffer; 2980b57cec5SDimitry Andric }; 2990b57cec5SDimitry Andric 3000b57cec5SDimitry Andric const uint32_t MinTpiHashBuckets = 0x1000; 3010b57cec5SDimitry Andric const uint32_t MaxTpiHashBuckets = 0x40000; 3020b57cec5SDimitry Andric 3030b57cec5SDimitry Andric /// The header preceding the global PDB Stream (Stream 1) 3040b57cec5SDimitry Andric struct InfoStreamHeader { 3050b57cec5SDimitry Andric support::ulittle32_t Version; 3060b57cec5SDimitry Andric support::ulittle32_t Signature; 3070b57cec5SDimitry Andric support::ulittle32_t Age; 3080b57cec5SDimitry Andric codeview::GUID Guid; 3090b57cec5SDimitry Andric }; 3100b57cec5SDimitry Andric 3110b57cec5SDimitry Andric /// The header preceding the /names stream. 3120b57cec5SDimitry Andric struct PDBStringTableHeader { 3130b57cec5SDimitry Andric support::ulittle32_t Signature; // PDBStringTableSignature 3140b57cec5SDimitry Andric support::ulittle32_t HashVersion; // 1 or 2 3150b57cec5SDimitry Andric support::ulittle32_t ByteSize; // Number of bytes of names buffer. 3160b57cec5SDimitry Andric }; 3170b57cec5SDimitry Andric 3180b57cec5SDimitry Andric const uint32_t PDBStringTableSignature = 0xEFFEEFFE; 3190b57cec5SDimitry Andric 3200b57cec5SDimitry Andric /// The header preceding the /src/headerblock stream. 3210b57cec5SDimitry Andric struct SrcHeaderBlockHeader { 3220b57cec5SDimitry Andric support::ulittle32_t Version; // PdbRaw_SrcHeaderBlockVer enumeration. 3230b57cec5SDimitry Andric support::ulittle32_t Size; // Size of entire stream. 3240b57cec5SDimitry Andric uint64_t FileTime; // Time stamp (Windows FILETIME format). 3250b57cec5SDimitry Andric support::ulittle32_t Age; // Age 3260b57cec5SDimitry Andric uint8_t Padding[44]; // Pad to 64 bytes. 3270b57cec5SDimitry Andric }; 3280b57cec5SDimitry Andric static_assert(sizeof(SrcHeaderBlockHeader) == 64, "Incorrect struct size!"); 3290b57cec5SDimitry Andric 3300b57cec5SDimitry Andric /// A single file record entry within the /src/headerblock stream. 3310b57cec5SDimitry Andric struct SrcHeaderBlockEntry { 3320b57cec5SDimitry Andric support::ulittle32_t Size; // Record Length. 3330b57cec5SDimitry Andric support::ulittle32_t Version; // PdbRaw_SrcHeaderBlockVer enumeration. 3340b57cec5SDimitry Andric support::ulittle32_t CRC; // CRC of the original file contents. 3350b57cec5SDimitry Andric support::ulittle32_t FileSize; // Size of original source file. 3360b57cec5SDimitry Andric support::ulittle32_t FileNI; // String table index of file name. 3370b57cec5SDimitry Andric support::ulittle32_t ObjNI; // String table index of object name. 3380b57cec5SDimitry Andric support::ulittle32_t VFileNI; // String table index of virtual file name. 3390b57cec5SDimitry Andric uint8_t Compression; // PDB_SourceCompression enumeration. 3400b57cec5SDimitry Andric uint8_t IsVirtual; // Is this a virtual file (injected)? 3410b57cec5SDimitry Andric short Padding; // Pad to 4 bytes. 3420b57cec5SDimitry Andric char Reserved[8]; 3430b57cec5SDimitry Andric }; 3440b57cec5SDimitry Andric static_assert(sizeof(SrcHeaderBlockEntry) == 40, "Incorrect struct size!"); 3450b57cec5SDimitry Andric 3460b57cec5SDimitry Andric } // namespace pdb 3470b57cec5SDimitry Andric } // namespace llvm 3480b57cec5SDimitry Andric 3490b57cec5SDimitry Andric #endif 350