1317017Sdim//===- PDBFile.h - Low level interface to a PDB file ------------*- C++ -*-===//
2317017Sdim//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6317017Sdim//
7317017Sdim//===----------------------------------------------------------------------===//
8317017Sdim
9317017Sdim#ifndef LLVM_DEBUGINFO_PDB_RAW_PDBFILE_H
10317017Sdim#define LLVM_DEBUGINFO_PDB_RAW_PDBFILE_H
11317017Sdim
12317017Sdim#include "llvm/ADT/DenseMap.h"
13317017Sdim#include "llvm/DebugInfo/MSF/IMSFFile.h"
14317017Sdim#include "llvm/DebugInfo/MSF/MSFCommon.h"
15317017Sdim#include "llvm/Support/Allocator.h"
16317017Sdim#include "llvm/Support/BinaryStreamRef.h"
17317017Sdim#include "llvm/Support/Endian.h"
18317017Sdim#include "llvm/Support/Error.h"
19317017Sdim#include "llvm/Support/MathExtras.h"
20317017Sdim
21317017Sdim#include <memory>
22317017Sdim
23317017Sdimnamespace llvm {
24317017Sdim
25317017Sdimclass BinaryStream;
26317017Sdim
27317017Sdimnamespace msf {
28317017Sdimclass MappedBlockStream;
29317017Sdim}
30317017Sdim
31317017Sdimnamespace pdb {
32317017Sdimclass DbiStream;
33317017Sdimclass GlobalsStream;
34317017Sdimclass InfoStream;
35353358Sdimclass InjectedSourceStream;
36317778Sdimclass PDBStringTable;
37317017Sdimclass PDBFileBuilder;
38317017Sdimclass PublicsStream;
39317017Sdimclass SymbolStream;
40317017Sdimclass TpiStream;
41317017Sdim
42317017Sdimclass PDBFile : public msf::IMSFFile {
43317017Sdim  friend PDBFileBuilder;
44317017Sdim
45317017Sdimpublic:
46317017Sdim  PDBFile(StringRef Path, std::unique_ptr<BinaryStream> PdbFileBuffer,
47317017Sdim          BumpPtrAllocator &Allocator);
48317017Sdim  ~PDBFile() override;
49317017Sdim
50317017Sdim  StringRef getFileDirectory() const;
51317017Sdim  StringRef getFilePath() const;
52317017Sdim
53317017Sdim  uint32_t getFreeBlockMapBlock() const;
54317017Sdim  uint32_t getUnknown1() const;
55317017Sdim
56317017Sdim  uint32_t getBlockSize() const override;
57317017Sdim  uint32_t getBlockCount() const override;
58317017Sdim  uint32_t getNumDirectoryBytes() const;
59317017Sdim  uint32_t getBlockMapIndex() const;
60317017Sdim  uint32_t getNumDirectoryBlocks() const;
61317017Sdim  uint64_t getBlockMapOffset() const;
62317017Sdim
63317017Sdim  uint32_t getNumStreams() const override;
64327952Sdim  uint32_t getMaxStreamSize() const;
65317017Sdim  uint32_t getStreamByteSize(uint32_t StreamIndex) const override;
66317017Sdim  ArrayRef<support::ulittle32_t>
67317017Sdim  getStreamBlockList(uint32_t StreamIndex) const override;
68317017Sdim  uint32_t getFileSize() const;
69317017Sdim
70317017Sdim  Expected<ArrayRef<uint8_t>> getBlockData(uint32_t BlockIndex,
71317017Sdim                                           uint32_t NumBytes) const override;
72317017Sdim  Error setBlockData(uint32_t BlockIndex, uint32_t Offset,
73317017Sdim                     ArrayRef<uint8_t> Data) const override;
74317017Sdim
75317017Sdim  ArrayRef<support::ulittle32_t> getStreamSizes() const {
76317017Sdim    return ContainerLayout.StreamSizes;
77317017Sdim  }
78317017Sdim  ArrayRef<ArrayRef<support::ulittle32_t>> getStreamMap() const {
79317017Sdim    return ContainerLayout.StreamMap;
80317017Sdim  }
81317017Sdim
82317017Sdim  const msf::MSFLayout &getMsfLayout() const { return ContainerLayout; }
83317017Sdim  BinaryStreamRef getMsfBuffer() const { return *Buffer; }
84317017Sdim
85317017Sdim  ArrayRef<support::ulittle32_t> getDirectoryBlockArray() const;
86317017Sdim
87353358Sdim  std::unique_ptr<msf::MappedBlockStream>
88353358Sdim  createIndexedStream(uint16_t SN) const;
89353358Sdim  Expected<std::unique_ptr<msf::MappedBlockStream>>
90353358Sdim  safelyCreateIndexedStream(uint32_t StreamIndex) const;
91353358Sdim  Expected<std::unique_ptr<msf::MappedBlockStream>>
92353358Sdim  safelyCreateNamedStream(StringRef Name);
93327952Sdim
94320397Sdim  msf::MSFStreamLayout getStreamLayout(uint32_t StreamIdx) const;
95327952Sdim  msf::MSFStreamLayout getFpmStreamLayout() const;
96320397Sdim
97317017Sdim  Error parseFileHeaders();
98317017Sdim  Error parseStreamData();
99317017Sdim
100317017Sdim  Expected<InfoStream &> getPDBInfoStream();
101317017Sdim  Expected<DbiStream &> getPDBDbiStream();
102317017Sdim  Expected<GlobalsStream &> getPDBGlobalsStream();
103317017Sdim  Expected<TpiStream &> getPDBTpiStream();
104317017Sdim  Expected<TpiStream &> getPDBIpiStream();
105317017Sdim  Expected<PublicsStream &> getPDBPublicsStream();
106317017Sdim  Expected<SymbolStream &> getPDBSymbolStream();
107317778Sdim  Expected<PDBStringTable &> getStringTable();
108353358Sdim  Expected<InjectedSourceStream &> getInjectedSourceStream();
109317017Sdim
110317017Sdim  BumpPtrAllocator &getAllocator() { return Allocator; }
111317017Sdim
112317017Sdim  bool hasPDBDbiStream() const;
113317017Sdim  bool hasPDBGlobalsStream();
114327952Sdim  bool hasPDBInfoStream() const;
115317017Sdim  bool hasPDBIpiStream() const;
116317017Sdim  bool hasPDBPublicsStream();
117317017Sdim  bool hasPDBSymbolStream();
118317017Sdim  bool hasPDBTpiStream() const;
119317778Sdim  bool hasPDBStringTable();
120353358Sdim  bool hasPDBInjectedSourceStream();
121317017Sdim
122320041Sdim  uint32_t getPointerSize();
123320041Sdim
124317017Sdimprivate:
125317017Sdim  std::string FilePath;
126317017Sdim  BumpPtrAllocator &Allocator;
127317017Sdim
128317017Sdim  std::unique_ptr<BinaryStream> Buffer;
129317017Sdim
130317017Sdim  msf::MSFLayout ContainerLayout;
131317017Sdim
132317017Sdim  std::unique_ptr<GlobalsStream> Globals;
133317017Sdim  std::unique_ptr<InfoStream> Info;
134317017Sdim  std::unique_ptr<DbiStream> Dbi;
135317017Sdim  std::unique_ptr<TpiStream> Tpi;
136317017Sdim  std::unique_ptr<TpiStream> Ipi;
137317017Sdim  std::unique_ptr<PublicsStream> Publics;
138317017Sdim  std::unique_ptr<SymbolStream> Symbols;
139317017Sdim  std::unique_ptr<msf::MappedBlockStream> DirectoryStream;
140317017Sdim  std::unique_ptr<msf::MappedBlockStream> StringTableStream;
141353358Sdim  std::unique_ptr<InjectedSourceStream> InjectedSources;
142317778Sdim  std::unique_ptr<PDBStringTable> Strings;
143317017Sdim};
144317017Sdim}
145317017Sdim}
146317017Sdim
147317017Sdim#endif
148