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