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