Home | History | Annotate | Line # | Download | only in Native
      1 //===- PDBFile.h - Low level interface to a PDB file ------------*- C++ -*-===//
      2 //
      3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
      4 // See https://llvm.org/LICENSE.txt for license information.
      5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
      6 //
      7 //===----------------------------------------------------------------------===//
      8 
      9 #ifndef LLVM_DEBUGINFO_PDB_NATIVE_PDBFILE_H
     10 #define LLVM_DEBUGINFO_PDB_NATIVE_PDBFILE_H
     11 
     12 #include "llvm/ADT/DenseMap.h"
     13 #include "llvm/DebugInfo/MSF/IMSFFile.h"
     14 #include "llvm/DebugInfo/MSF/MSFCommon.h"
     15 #include "llvm/Support/Allocator.h"
     16 #include "llvm/Support/BinaryStreamRef.h"
     17 #include "llvm/Support/Endian.h"
     18 #include "llvm/Support/Error.h"
     19 #include "llvm/Support/MathExtras.h"
     20 
     21 #include <memory>
     22 
     23 namespace llvm {
     24 
     25 class BinaryStream;
     26 
     27 namespace msf {
     28 class MappedBlockStream;
     29 }
     30 
     31 namespace pdb {
     32 class DbiStream;
     33 class GlobalsStream;
     34 class InfoStream;
     35 class InjectedSourceStream;
     36 class PDBStringTable;
     37 class PDBFileBuilder;
     38 class PublicsStream;
     39 class SymbolStream;
     40 class TpiStream;
     41 
     42 class PDBFile : public msf::IMSFFile {
     43   friend PDBFileBuilder;
     44 
     45 public:
     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>
     88   createIndexedStream(uint16_t SN) const;
     89   Expected<std::unique_ptr<msf::MappedBlockStream>>
     90   safelyCreateIndexedStream(uint32_t StreamIndex) const;
     91   Expected<std::unique_ptr<msf::MappedBlockStream>>
     92   safelyCreateNamedStream(StringRef Name);
     93 
     94   msf::MSFStreamLayout getStreamLayout(uint32_t StreamIdx) const;
     95   msf::MSFStreamLayout getFpmStreamLayout() const;
     96 
     97   Error parseFileHeaders();
     98   Error parseStreamData();
     99 
    100   Expected<InfoStream &> getPDBInfoStream();
    101   Expected<DbiStream &> getPDBDbiStream();
    102   Expected<GlobalsStream &> getPDBGlobalsStream();
    103   Expected<TpiStream &> getPDBTpiStream();
    104   Expected<TpiStream &> getPDBIpiStream();
    105   Expected<PublicsStream &> getPDBPublicsStream();
    106   Expected<SymbolStream &> getPDBSymbolStream();
    107   Expected<PDBStringTable &> getStringTable();
    108   Expected<InjectedSourceStream &> getInjectedSourceStream();
    109 
    110   BumpPtrAllocator &getAllocator() { return Allocator; }
    111 
    112   bool hasPDBDbiStream() const;
    113   bool hasPDBGlobalsStream();
    114   bool hasPDBInfoStream() const;
    115   bool hasPDBIpiStream() const;
    116   bool hasPDBPublicsStream();
    117   bool hasPDBSymbolStream();
    118   bool hasPDBTpiStream() const;
    119   bool hasPDBStringTable();
    120   bool hasPDBInjectedSourceStream();
    121 
    122   uint32_t getPointerSize();
    123 
    124 private:
    125   std::string FilePath;
    126   BumpPtrAllocator &Allocator;
    127 
    128   std::unique_ptr<BinaryStream> Buffer;
    129 
    130   msf::MSFLayout ContainerLayout;
    131 
    132   std::unique_ptr<GlobalsStream> Globals;
    133   std::unique_ptr<InfoStream> Info;
    134   std::unique_ptr<DbiStream> Dbi;
    135   std::unique_ptr<TpiStream> Tpi;
    136   std::unique_ptr<TpiStream> Ipi;
    137   std::unique_ptr<PublicsStream> Publics;
    138   std::unique_ptr<SymbolStream> Symbols;
    139   std::unique_ptr<msf::MappedBlockStream> DirectoryStream;
    140   std::unique_ptr<msf::MappedBlockStream> StringTableStream;
    141   std::unique_ptr<InjectedSourceStream> InjectedSources;
    142   std::unique_ptr<PDBStringTable> Strings;
    143 };
    144 }
    145 }
    146 
    147 #endif
    148