LLVM  4.0.0
PDBFile.h
Go to the documentation of this file.
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"
18 #include "llvm/Support/Allocator.h"
19 #include "llvm/Support/Endian.h"
20 #include "llvm/Support/Error.h"
22 
23 #include <memory>
24 
25 namespace llvm {
26 
27 namespace msf {
28 class MappedBlockStream;
29 }
30 
31 namespace pdb {
32 class DbiStream;
33 class GlobalsStream;
34 class InfoStream;
35 class NameHashTable;
36 class PDBFileBuilder;
37 class PublicsStream;
38 class SymbolStream;
39 class TpiStream;
40 
41 class PDBFile : public msf::IMSFFile {
42  friend PDBFileBuilder;
43 
44 public:
45  PDBFile(std::unique_ptr<msf::ReadableStream> PdbFileBuffer,
46  BumpPtrAllocator &Allocator);
47  ~PDBFile() override;
48 
50  uint32_t getUnknown1() const;
51 
52  uint32_t getBlockSize() const override;
53  uint32_t getBlockCount() const override;
55  uint32_t getBlockMapIndex() const;
57  uint64_t getBlockMapOffset() const;
58 
59  uint32_t getNumStreams() const override;
60  uint32_t getStreamByteSize(uint32_t StreamIndex) const override;
62  getStreamBlockList(uint32_t StreamIndex) const override;
63  uint32_t getFileSize() const;
64 
66  uint32_t NumBytes) const override;
68  ArrayRef<uint8_t> Data) const override;
69 
70  ArrayRef<uint32_t> getFpmPages() const { return FpmPages; }
71 
73  return ContainerLayout.StreamSizes;
74  }
76  return ContainerLayout.StreamMap;
77  }
78 
79  const msf::MSFLayout &getMsfLayout() const { return ContainerLayout; }
80  const msf::ReadableStream &getMsfBuffer() const { return *Buffer; }
81 
83 
86 
95 
96  BumpPtrAllocator &getAllocator() { return Allocator; }
97 
98  bool hasPDBDbiStream() const;
99  bool hasPDBGlobalsStream();
100  bool hasPDBInfoStream();
101  bool hasPDBIpiStream() const;
102  bool hasPDBPublicsStream();
103  bool hasPDBSymbolStream();
104  bool hasPDBTpiStream() const;
105  bool hasStringTable();
106 
107  private:
108  Expected<std::unique_ptr<msf::MappedBlockStream>> safelyCreateIndexedStream(
109  const msf::MSFLayout &Layout, const msf::ReadableStream &MsfData,
110  uint32_t StreamIndex) const;
111 
112  BumpPtrAllocator &Allocator;
113 
114  std::unique_ptr<msf::ReadableStream> Buffer;
115 
116  std::vector<uint32_t> FpmPages;
117  msf::MSFLayout ContainerLayout;
118 
119  std::unique_ptr<GlobalsStream> Globals;
120  std::unique_ptr<InfoStream> Info;
121  std::unique_ptr<DbiStream> Dbi;
122  std::unique_ptr<TpiStream> Tpi;
123  std::unique_ptr<TpiStream> Ipi;
124  std::unique_ptr<PublicsStream> Publics;
125  std::unique_ptr<SymbolStream> Symbols;
126  std::unique_ptr<msf::MappedBlockStream> DirectoryStream;
127  std::unique_ptr<msf::MappedBlockStream> StringTableStream;
128  std::unique_ptr<NameHashTable> StringTable;
129 };
130 }
131 }
132 
133 #endif
uint32_t getNumDirectoryBytes() const
Definition: PDBFile.cpp:57
bool hasPDBSymbolStream()
Definition: PDBFile.cpp:366
Error parseStreamData()
Definition: PDBFile.cpp:168
PDBFile(std::unique_ptr< msf::ReadableStream > PdbFileBuffer, BumpPtrAllocator &Allocator)
Definition: PDBFile.cpp:41
ArrayRef< support::ulittle32_t > getDirectoryBlockArray() const
Definition: PDBFile.cpp:220
Expected< GlobalsStream & > getPDBGlobalsStream()
Definition: PDBFile.cpp:224
bool hasPDBPublicsStream()
Definition: PDBFile.cpp:360
uint32_t getBlockMapIndex() const
Definition: PDBFile.cpp:61
Expected< TpiStream & > getPDBTpiStream()
Definition: PDBFile.cpp:265
This file defines the MallocAllocator and BumpPtrAllocator interfaces.
bool hasPDBInfoStream()
Definition: PDBFile.cpp:356
Error parseFileHeaders()
Definition: PDBFile.cpp:108
uint32_t getFileSize() const
Definition: PDBFile.cpp:90
uint32_t getNumStreams() const override
Definition: PDBFile.cpp:77
Error setBlockData(uint32_t BlockIndex, uint32_t Offset, ArrayRef< uint8_t > Data) const override
Definition: PDBFile.cpp:102
uint64_t getBlockMapOffset() const
Definition: PDBFile.cpp:72
ArrayRef< support::ulittle32_t > getStreamSizes() const
Definition: PDBFile.h:72
uint32_t getStreamByteSize(uint32_t StreamIndex) const override
Definition: PDBFile.cpp:81
uint32_t getBlockSize() const override
Definition: PDBFile.cpp:47
Tagged union holding either a T or a Error.
bool hasPDBDbiStream() const
Definition: PDBFile.cpp:348
ArrayRef< uint32_t > getFpmPages() const
Definition: PDBFile.h:70
bool hasPDBIpiStream() const
Definition: PDBFile.cpp:358
Expected< NameHashTable & > getStringTable()
Definition: PDBFile.cpp:326
BumpPtrAllocator & getAllocator()
Definition: PDBFile.h:96
bool hasStringTable()
Definition: PDBFile.cpp:374
~PDBFile() override
Allocate memory in an ever growing pool, as if by bump-pointer.
Definition: Allocator.h:138
Expected< SymbolStream & > getPDBSymbolStream()
Definition: PDBFile.cpp:307
const msf::ReadableStream & getMsfBuffer() const
Definition: PDBFile.h:80
Expected< TpiStream & > getPDBIpiStream()
Definition: PDBFile.cpp:277
uint32_t Offset
const msf::MSFLayout & getMsfLayout() const
Definition: PDBFile.h:79
Expected< DbiStream & > getPDBDbiStream()
Definition: PDBFile.cpp:253
uint32_t getNumDirectoryBlocks() const
Definition: PDBFile.cpp:67
uint32_t getUnknown1() const
Definition: PDBFile.cpp:65
uint32_t getFreeBlockMapBlock() const
Definition: PDBFile.cpp:49
Expected< PublicsStream & > getPDBPublicsStream()
Definition: PDBFile.cpp:289
bool hasPDBTpiStream() const
Definition: PDBFile.cpp:372
ArrayRef< ArrayRef< support::ulittle32_t > > getStreamMap() const
Definition: PDBFile.h:75
std::vector< ArrayRef< support::ulittle32_t > > StreamMap
Definition: MSFCommon.h:58
bool hasPDBGlobalsStream()
Definition: PDBFile.cpp:350
Expected< ArrayRef< uint8_t > > getBlockData(uint32_t BlockIndex, uint32_t NumBytes) const override
Definition: PDBFile.cpp:92
ArrayRef< support::ulittle32_t > StreamSizes
Definition: MSFCommon.h:57
Expected< InfoStream & > getPDBInfoStream()
Definition: PDBFile.cpp:241
Lightweight error class with error context and mandatory checking.
ArrayRef< support::ulittle32_t > getStreamBlockList(uint32_t StreamIndex) const override
Definition: PDBFile.cpp:86
uint32_t getBlockCount() const override
Definition: PDBFile.cpp:53