1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
|
//===- DbiStream.h - PDB Dbi Stream (Stream 3) Access -----------*- C++ -*-===//
//
// 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_RAW_PDBDBISTREAM_H
#define LLVM_DEBUGINFO_PDB_RAW_PDBDBISTREAM_H
#include "llvm/DebugInfo/CodeView/ModuleSubstream.h"
#include "llvm/DebugInfo/CodeView/StreamArray.h"
#include "llvm/DebugInfo/CodeView/StreamRef.h"
#include "llvm/DebugInfo/PDB/PDBTypes.h"
#include "llvm/DebugInfo/PDB/Raw/MappedBlockStream.h"
#include "llvm/DebugInfo/PDB/Raw/ModInfo.h"
#include "llvm/DebugInfo/PDB/Raw/NameHashTable.h"
#include "llvm/DebugInfo/PDB/Raw/RawConstants.h"
#include "llvm/DebugInfo/PDB/Raw/RawTypes.h"
#include "llvm/Support/Endian.h"
#include "llvm/Support/Error.h"
namespace llvm {
namespace object {
struct FpoData;
struct coff_section;
}
namespace pdb {
class DbiStreamBuilder;
class PDBFile;
class ISectionContribVisitor;
class DbiStream {
friend class DbiStreamBuilder;
struct HeaderInfo {
support::little32_t VersionSignature;
support::ulittle32_t VersionHeader;
support::ulittle32_t Age; // Should match InfoStream.
support::ulittle16_t GlobalSymbolStreamIndex; // Global symbol stream #
support::ulittle16_t BuildNumber; // See DbiBuildNo structure.
support::ulittle16_t PublicSymbolStreamIndex; // Public symbols stream #
support::ulittle16_t PdbDllVersion; // version of mspdbNNN.dll
support::ulittle16_t SymRecordStreamIndex; // Symbol records stream #
support::ulittle16_t PdbDllRbld; // rbld number of mspdbNNN.dll
support::little32_t ModiSubstreamSize; // Size of module info stream
support::little32_t SecContrSubstreamSize; // Size of sec. contrib stream
support::little32_t SectionMapSize; // Size of sec. map substream
support::little32_t FileInfoSize; // Size of file info substream
support::little32_t TypeServerSize; // Size of type server map
support::ulittle32_t MFCTypeServerIndex; // Index of MFC Type Server
support::little32_t OptionalDbgHdrSize; // Size of DbgHeader info
support::little32_t ECSubstreamSize; // Size of EC stream (what is EC?)
support::ulittle16_t Flags; // See DbiFlags enum.
support::ulittle16_t MachineType; // See PDB_MachineType enum.
support::ulittle32_t Reserved; // Pad to 64 bytes
};
public:
DbiStream(PDBFile &File, std::unique_ptr<MappedBlockStream> Stream);
~DbiStream();
Error reload();
PdbRaw_DbiVer getDbiVersion() const;
uint32_t getAge() const;
uint16_t getPublicSymbolStreamIndex() const;
uint16_t getGlobalSymbolStreamIndex() const;
uint16_t getFlags() const;
bool isIncrementallyLinked() const;
bool hasCTypes() const;
bool isStripped() const;
uint16_t getBuildNumber() const;
uint16_t getBuildMajorVersion() const;
uint16_t getBuildMinorVersion() const;
uint16_t getPdbDllRbld() const;
uint32_t getPdbDllVersion() const;
uint32_t getSymRecordStreamIndex() const;
PDB_Machine getMachineType() const;
enum { InvalidStreamIndex = 0xffff };
/// If the given stream type is present, returns its stream index. If it is
/// not present, returns InvalidStreamIndex.
uint32_t getDebugStreamIndex(DbgHeaderType Type) const;
ArrayRef<ModuleInfoEx> modules() const;
Expected<StringRef> getFileNameForIndex(uint32_t Index) const;
codeview::FixedStreamArray<object::coff_section> getSectionHeaders();
codeview::FixedStreamArray<object::FpoData> getFpoRecords();
codeview::FixedStreamArray<SecMapEntry> getSectionMap() const;
void visitSectionContributions(ISectionContribVisitor &Visitor) const;
Error commit();
private:
Error initializeSectionContributionData();
Error initializeSectionHeadersData();
Error initializeSectionMapData();
Error initializeFileInfo();
Error initializeFpoRecords();
PDBFile &Pdb;
std::unique_ptr<MappedBlockStream> Stream;
std::vector<ModuleInfoEx> ModuleInfos;
NameHashTable ECNames;
codeview::StreamRef ModInfoSubstream;
codeview::StreamRef SecContrSubstream;
codeview::StreamRef SecMapSubstream;
codeview::StreamRef FileInfoSubstream;
codeview::StreamRef TypeServerMapSubstream;
codeview::StreamRef ECSubstream;
codeview::StreamRef NamesBuffer;
codeview::FixedStreamArray<support::ulittle16_t> DbgStreams;
PdbRaw_DbiSecContribVer SectionContribVersion;
codeview::FixedStreamArray<SectionContrib> SectionContribs;
codeview::FixedStreamArray<SectionContrib2> SectionContribs2;
codeview::FixedStreamArray<SecMapEntry> SectionMap;
codeview::FixedStreamArray<support::little32_t> FileNameOffsets;
std::unique_ptr<MappedBlockStream> SectionHeaderStream;
codeview::FixedStreamArray<object::coff_section> SectionHeaders;
std::unique_ptr<MappedBlockStream> FpoStream;
codeview::FixedStreamArray<object::FpoData> FpoRecords;
const HeaderInfo *Header;
};
}
}
#endif
|