LLVM  6.0.0svn
GlobalsStream.h
Go to the documentation of this file.
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 
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.
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>
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:
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 
66  GSIHashIterator begin() const { return GSIHashIterator(HashRecords.begin()); }
67  GSIHashIterator end() const { return GSIHashIterator(HashRecords.end()); }
68 };
69 
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
A readonly view of a hash table used in the globals and publics streams.
Definition: GlobalsStream.h:51
support::ulittle32_t VerSignature
Definition: RawTypes.h:34
Compute iterated dominance frontiers using a linear time algorithm.
Definition: AllocatorList.h:24
support::ulittle32_t VerHdr
Definition: RawTypes.h:35
Definition: BitVector.h:920
uint32_t getVerSignature() const
Definition: GlobalsStream.h:60
Header of the hash tables found in the globals and publics sections.
Definition: RawTypes.h:29
uint32_t getHashRecordSize() const
Definition: GlobalsStream.h:62
GSIHashIterator begin() const
Definition: GlobalsStream.h:66
const GSIHashHeader * HashHdr
Definition: GlobalsStream.h:53
support::ulittle32_t NumBuckets
Definition: RawTypes.h:37
CRTP base class for adapting an iterator to a different type.
Definition: iterator.h:208
uint32_t getVerHeader() const
Definition: GlobalsStream.h:61
ArrayRef< uint8_t > HashBitmap
Definition: GlobalsStream.h:55
GSIHashIterator end() const
Definition: GlobalsStream.h:67
GSIHashHeader iterator
Definition: GlobalsStream.h:65
FixedStreamArray< support::ulittle32_t > HashBuckets
Definition: GlobalsStream.h:56
uint32_t operator*() const
Definition: GlobalsStream.h:39
uint32_t getNumBuckets() const
Definition: GlobalsStream.h:63
value_type read(const void *memory, endianness endian)
Read a value of a particular endianness from memory.
Definition: Endian.h:66
const GSIHashTable & getGlobalsTable() const
Definition: GlobalsStream.h:74
FixedStreamArrayIterator< T > end() const
FixedStreamArray< PSHashRecord > HashRecords
Definition: GlobalsStream.h:54
Lightweight error class with error context and mandatory checking.
Definition: Error.h:156
Provides read only access to a subclass of BinaryStream.
support::ulittle32_t HrSize
Definition: RawTypes.h:36
FixedStreamArrayIterator< T > begin() const
Iterator over hash records producing symbol record offsets.
Definition: GlobalsStream.h:28