1//===- DbiStream.h - PDB Dbi Stream (Stream 3) Access -----------*- C++ -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8 9#ifndef LLVM_DEBUGINFO_PDB_RAW_PDBDBISTREAM_H 10#define LLVM_DEBUGINFO_PDB_RAW_PDBDBISTREAM_H 11 12#include "llvm/DebugInfo/CodeView/DebugSubsection.h" 13#include "llvm/DebugInfo/CodeView/DebugFrameDataSubsection.h" 14#include "llvm/DebugInfo/MSF/MappedBlockStream.h" 15#include "llvm/DebugInfo/PDB/Native/DbiModuleDescriptor.h" 16#include "llvm/DebugInfo/PDB/Native/DbiModuleList.h" 17#include "llvm/DebugInfo/PDB/Native/PDBStringTable.h" 18#include "llvm/DebugInfo/PDB/Native/RawConstants.h" 19#include "llvm/DebugInfo/PDB/Native/RawTypes.h" 20#include "llvm/DebugInfo/PDB/PDBTypes.h" 21#include "llvm/Support/BinaryStreamArray.h" 22#include "llvm/Support/BinaryStreamRef.h" 23#include "llvm/Support/Endian.h" 24#include "llvm/Support/Error.h" 25 26namespace llvm { 27namespace object { 28struct FpoData; 29struct coff_section; 30} 31 32namespace pdb { 33class DbiStreamBuilder; 34class PDBFile; 35class ISectionContribVisitor; 36 37class DbiStream { 38 friend class DbiStreamBuilder; 39 40public: 41 explicit DbiStream(std::unique_ptr<BinaryStream> Stream); 42 ~DbiStream(); 43 Error reload(PDBFile *Pdb); 44 45 PdbRaw_DbiVer getDbiVersion() const; 46 uint32_t getAge() const; 47 uint16_t getPublicSymbolStreamIndex() const; 48 uint16_t getGlobalSymbolStreamIndex() const; 49 50 uint16_t getFlags() const; 51 bool isIncrementallyLinked() const; 52 bool hasCTypes() const; 53 bool isStripped() const; 54 55 uint16_t getBuildNumber() const; 56 uint16_t getBuildMajorVersion() const; 57 uint16_t getBuildMinorVersion() const; 58 59 uint16_t getPdbDllRbld() const; 60 uint32_t getPdbDllVersion() const; 61 62 uint32_t getSymRecordStreamIndex() const; 63 64 PDB_Machine getMachineType() const; 65 66 const DbiStreamHeader *getHeader() const { return Header; } 67 68 BinarySubstreamRef getSectionContributionData() const; 69 BinarySubstreamRef getSecMapSubstreamData() const; 70 BinarySubstreamRef getModiSubstreamData() const; 71 BinarySubstreamRef getFileInfoSubstreamData() const; 72 BinarySubstreamRef getTypeServerMapSubstreamData() const; 73 BinarySubstreamRef getECSubstreamData() const; 74 75 /// If the given stream type is present, returns its stream index. If it is 76 /// not present, returns InvalidStreamIndex. 77 uint32_t getDebugStreamIndex(DbgHeaderType Type) const; 78 79 const DbiModuleList &modules() const; 80 81 FixedStreamArray<object::coff_section> getSectionHeaders() const; 82 83 bool hasOldFpoRecords() const; 84 FixedStreamArray<object::FpoData> getOldFpoRecords() const; 85 bool hasNewFpoRecords() const; 86 const codeview::DebugFrameDataSubsectionRef &getNewFpoRecords() const; 87 88 FixedStreamArray<SecMapEntry> getSectionMap() const; 89 void visitSectionContributions(ISectionContribVisitor &Visitor) const; 90 91 Expected<StringRef> getECName(uint32_t NI) const; 92 93private: 94 Error initializeSectionContributionData(); 95 Error initializeSectionHeadersData(PDBFile *Pdb); 96 Error initializeSectionMapData(); 97 Error initializeOldFpoRecords(PDBFile *Pdb); 98 Error initializeNewFpoRecords(PDBFile *Pdb); 99 100 Expected<std::unique_ptr<msf::MappedBlockStream>> 101 createIndexedStreamForHeaderType(PDBFile *Pdb, DbgHeaderType Type) const; 102 103 std::unique_ptr<BinaryStream> Stream; 104 105 PDBStringTable ECNames; 106 107 BinarySubstreamRef SecContrSubstream; 108 BinarySubstreamRef SecMapSubstream; 109 BinarySubstreamRef ModiSubstream; 110 BinarySubstreamRef FileInfoSubstream; 111 BinarySubstreamRef TypeServerMapSubstream; 112 BinarySubstreamRef ECSubstream; 113 114 DbiModuleList Modules; 115 116 FixedStreamArray<support::ulittle16_t> DbgStreams; 117 118 PdbRaw_DbiSecContribVer SectionContribVersion = 119 PdbRaw_DbiSecContribVer::DbiSecContribVer60; 120 FixedStreamArray<SectionContrib> SectionContribs; 121 FixedStreamArray<SectionContrib2> SectionContribs2; 122 FixedStreamArray<SecMapEntry> SectionMap; 123 124 std::unique_ptr<msf::MappedBlockStream> SectionHeaderStream; 125 FixedStreamArray<object::coff_section> SectionHeaders; 126 127 std::unique_ptr<msf::MappedBlockStream> OldFpoStream; 128 FixedStreamArray<object::FpoData> OldFpoRecords; 129 130 std::unique_ptr<msf::MappedBlockStream> NewFpoStream; 131 codeview::DebugFrameDataSubsectionRef NewFpoRecords; 132 133 const DbiStreamHeader *Header; 134}; 135} 136} 137 138#endif 139