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 
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