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