Home | History | Annotate | Download | only in Native
      1 //===- GlobalsStream.h - PDB Index of Symbols by Name ------ ----*- 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_GLOBALS_STREAM_H
     11 #define LLVM_DEBUGINFO_PDB_RAW_GLOBALS_STREAM_H
     12 
     13 #include "llvm/DebugInfo/MSF/MappedBlockStream.h"
     14 #include "llvm/DebugInfo/PDB/Native/RawConstants.h"
     15 #include "llvm/DebugInfo/PDB/Native/RawTypes.h"
     16 #include "llvm/DebugInfo/PDB/PDBTypes.h"
     17 #include "llvm/Support/BinaryStreamArray.h"
     18 #include "llvm/Support/Error.h"
     19 #include "llvm/ADT/iterator.h"
     20 
     21 namespace llvm {
     22 namespace pdb {
     23 class DbiStream;
     24 class PDBFile;
     25 
     26 /// Iterator over hash records producing symbol record offsets. Abstracts away
     27 /// the fact that symbol record offsets on disk are off-by-one.
     28 class GSIHashIterator
     29     : public iterator_adaptor_base<
     30           GSIHashIterator, FixedStreamArrayIterator<PSHashRecord>,
     31           std::random_access_iterator_tag, const uint32_t> {
     32 public:
     33   GSIHashIterator() = default;
     34 
     35   template <typename T>
     36   GSIHashIterator(T &&v)
     37       : GSIHashIterator::iterator_adaptor_base(std::forward<T &&>(v)) {}
     38 
     39   uint32_t operator*() const {
     40     uint32_t Off = this->I->Off;
     41     return --Off;
     42   }
     43 };
     44 
     45 /// From https://github.com/Microsoft/microsoft-pdb/blob/master/PDB/dbi/gsi.cpp
     46 enum : unsigned { IPHR_HASH = 4096 };
     47 
     48 /// A readonly view of a hash table used in the globals and publics streams.
     49 /// Most clients will only want to iterate this to get symbol record offsets
     50 /// into the PDB symbol stream.
     51 class GSIHashTable {
     52 public:
     53   const GSIHashHeader *HashHdr;
     54   FixedStreamArray<PSHashRecord> HashRecords;
     55   ArrayRef<uint8_t> HashBitmap;
     56   FixedStreamArray<support::ulittle32_t> HashBuckets;
     57 
     58   Error read(BinaryStreamReader &Reader);
     59 
     60   uint32_t getVerSignature() const { return HashHdr->VerSignature; }
     61   uint32_t getVerHeader() const { return HashHdr->VerHdr; }
     62   uint32_t getHashRecordSize() const { return HashHdr->HrSize; }
     63   uint32_t getNumBuckets() const { return HashHdr->NumBuckets; }
     64 
     65   typedef GSIHashHeader iterator;
     66   GSIHashIterator begin() const { return GSIHashIterator(HashRecords.begin()); }
     67   GSIHashIterator end() const { return GSIHashIterator(HashRecords.end()); }
     68 };
     69 
     70 class GlobalsStream {
     71 public:
     72   explicit GlobalsStream(std::unique_ptr<msf::MappedBlockStream> Stream);
     73   ~GlobalsStream();
     74   const GSIHashTable &getGlobalsTable() const { return GlobalsTable; }
     75   Error reload();
     76 
     77 private:
     78   GSIHashTable GlobalsTable;
     79   std::unique_ptr<msf::MappedBlockStream> Stream;
     80 };
     81 }
     82 }
     83 
     84 #endif
     85