Home | History | Annotate | Line # | Download | only in Native
      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_NATIVE_DBISTREAM_H
     10 #define LLVM_DEBUGINFO_PDB_NATIVE_DBISTREAM_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 
     26 namespace llvm {
     27 namespace object {
     28 struct FpoData;
     29 struct coff_section;
     30 }
     31 
     32 namespace pdb {
     33 class DbiStreamBuilder;
     34 class PDBFile;
     35 class ISectionContribVisitor;
     36 
     37 class DbiStream {
     38   friend class DbiStreamBuilder;
     39 
     40 public:
     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 
     93 private:
     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