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