1//===- PDBFile.h - Low level interface to a PDB file ------------*- 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_PDBFILE_H
11#define LLVM_DEBUGINFO_PDB_RAW_PDBFILE_H
12
13#include "llvm/ADT/DenseMap.h"
14#include "llvm/DebugInfo/MSF/IMSFFile.h"
15#include "llvm/DebugInfo/MSF/MSFCommon.h"
16#include "llvm/Support/Allocator.h"
17#include "llvm/Support/BinaryStreamRef.h"
18#include "llvm/Support/Endian.h"
19#include "llvm/Support/Error.h"
20#include "llvm/Support/MathExtras.h"
21
22#include <memory>
23
24namespace llvm {
25
26class BinaryStream;
27
28namespace msf {
29class MappedBlockStream;
30}
31
32namespace pdb {
33class DbiStream;
34class GlobalsStream;
35class InfoStream;
36class PDBStringTable;
37class PDBFileBuilder;
38class PublicsStream;
39class SymbolStream;
40class TpiStream;
41
42class PDBFile : public msf::IMSFFile {
43  friend PDBFileBuilder;
44
45public:
46  PDBFile(StringRef Path, std::unique_ptr<BinaryStream> PdbFileBuffer,
47          BumpPtrAllocator &Allocator);
48  ~PDBFile() override;
49
50  StringRef getFileDirectory() const;
51  StringRef getFilePath() const;
52
53  uint32_t getFreeBlockMapBlock() const;
54  uint32_t getUnknown1() const;
55
56  uint32_t getBlockSize() const override;
57  uint32_t getBlockCount() const override;
58  uint32_t getNumDirectoryBytes() const;
59  uint32_t getBlockMapIndex() const;
60  uint32_t getNumDirectoryBlocks() const;
61  uint64_t getBlockMapOffset() const;
62
63  uint32_t getNumStreams() const override;
64  uint32_t getMaxStreamSize() const;
65  uint32_t getStreamByteSize(uint32_t StreamIndex) const override;
66  ArrayRef<support::ulittle32_t>
67  getStreamBlockList(uint32_t StreamIndex) const override;
68  uint32_t getFileSize() const;
69
70  Expected<ArrayRef<uint8_t>> getBlockData(uint32_t BlockIndex,
71                                           uint32_t NumBytes) const override;
72  Error setBlockData(uint32_t BlockIndex, uint32_t Offset,
73                     ArrayRef<uint8_t> Data) const override;
74
75  ArrayRef<support::ulittle32_t> getStreamSizes() const {
76    return ContainerLayout.StreamSizes;
77  }
78  ArrayRef<ArrayRef<support::ulittle32_t>> getStreamMap() const {
79    return ContainerLayout.StreamMap;
80  }
81
82  const msf::MSFLayout &getMsfLayout() const { return ContainerLayout; }
83  BinaryStreamRef getMsfBuffer() const { return *Buffer; }
84
85  ArrayRef<support::ulittle32_t> getDirectoryBlockArray() const;
86
87  std::unique_ptr<msf::MappedBlockStream> createIndexedStream(uint16_t SN);
88
89  msf::MSFStreamLayout getStreamLayout(uint32_t StreamIdx) const;
90  msf::MSFStreamLayout getFpmStreamLayout() const;
91
92  Error parseFileHeaders();
93  Error parseStreamData();
94
95  Expected<InfoStream &> getPDBInfoStream();
96  Expected<DbiStream &> getPDBDbiStream();
97  Expected<GlobalsStream &> getPDBGlobalsStream();
98  Expected<TpiStream &> getPDBTpiStream();
99  Expected<TpiStream &> getPDBIpiStream();
100  Expected<PublicsStream &> getPDBPublicsStream();
101  Expected<SymbolStream &> getPDBSymbolStream();
102  Expected<PDBStringTable &> getStringTable();
103
104  BumpPtrAllocator &getAllocator() { return Allocator; }
105
106  bool hasPDBDbiStream() const;
107  bool hasPDBGlobalsStream();
108  bool hasPDBInfoStream() const;
109  bool hasPDBIpiStream() const;
110  bool hasPDBPublicsStream();
111  bool hasPDBSymbolStream();
112  bool hasPDBTpiStream() const;
113  bool hasPDBStringTable();
114
115  uint32_t getPointerSize();
116
117private:
118  Expected<std::unique_ptr<msf::MappedBlockStream>>
119  safelyCreateIndexedStream(const msf::MSFLayout &Layout,
120                            BinaryStreamRef MsfData,
121                            uint32_t StreamIndex) const;
122
123  std::string FilePath;
124  BumpPtrAllocator &Allocator;
125
126  std::unique_ptr<BinaryStream> Buffer;
127
128  msf::MSFLayout ContainerLayout;
129
130  std::unique_ptr<GlobalsStream> Globals;
131  std::unique_ptr<InfoStream> Info;
132  std::unique_ptr<DbiStream> Dbi;
133  std::unique_ptr<TpiStream> Tpi;
134  std::unique_ptr<TpiStream> Ipi;
135  std::unique_ptr<PublicsStream> Publics;
136  std::unique_ptr<SymbolStream> Symbols;
137  std::unique_ptr<msf::MappedBlockStream> DirectoryStream;
138  std::unique_ptr<msf::MappedBlockStream> StringTableStream;
139  std::unique_ptr<PDBStringTable> Strings;
140};
141}
142}
143
144#endif
145