LLVM  9.0.0svn
GlobalsStream.h
Go to the documentation of this file.
1 //===- GlobalsStream.h - PDB Index of Symbols by Name -----------*- 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_RAW_GLOBALS_STREAM_H
10 #define LLVM_DEBUGINFO_PDB_RAW_GLOBALS_STREAM_H
11 
12 #include "llvm/ADT/iterator.h"
19 #include "llvm/Support/Error.h"
20 
21 namespace llvm {
22 namespace pdb {
23 class DbiStream;
24 class PDBFile;
25 class SymbolStream;
26 
27 /// Iterator over hash records producing symbol record offsets. Abstracts away
28 /// the fact that symbol record offsets on disk are off-by-one.
30  : public iterator_adaptor_base<
31  GSIHashIterator, FixedStreamArrayIterator<PSHashRecord>,
32  std::random_access_iterator_tag, const uint32_t> {
33 public:
34  template <typename T>
36  : GSIHashIterator::iterator_adaptor_base(std::forward<T &&>(v)) {}
37 
38  uint32_t operator*() const {
39  uint32_t Off = this->I->Off;
40  return --Off;
41  }
42 };
43 
44 /// From https://github.com/Microsoft/microsoft-pdb/blob/master/PDB/dbi/gsi.cpp
45 enum : unsigned { IPHR_HASH = 4096 };
46 
47 /// A readonly view of a hash table used in the globals and publics streams.
48 /// Most clients will only want to iterate this to get symbol record offsets
49 /// into the PDB symbol stream.
50 class GSIHashTable {
51 public:
56  std::array<int32_t, IPHR_HASH + 1> BucketMap;
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  std::vector<std::pair<uint32_t, codeview::CVSymbol>>
78  findRecordsByName(StringRef Name, const SymbolStream &Symbols) const;
79 
80 private:
81  GSIHashTable GlobalsTable;
82  std::unique_ptr<msf::MappedBlockStream> Stream;
83 };
84 }
85 }
86 
87 #endif
A readonly view of a hash table used in the globals and publics streams.
Definition: GlobalsStream.h:50
FixedStreamArray< support::ulittle32_t > HashBitmap
Definition: GlobalsStream.h:54
support::ulittle32_t VerSignature
Definition: RawTypes.h:33
This class represents lattice values for constants.
Definition: AllocatorList.h:23
amdgpu Simplify well known AMD library false FunctionCallee Value const Twine & Name
support::ulittle32_t VerHdr
Definition: RawTypes.h:34
Definition: BitVector.h:937
uint32_t getVerSignature() const
Definition: GlobalsStream.h:60
Header of the hash tables found in the globals and publics sections.
Definition: RawTypes.h:28
uint32_t getHashRecordSize() const
Definition: GlobalsStream.h:62
GSIHashIterator begin() const
Definition: GlobalsStream.h:66
const GSIHashHeader * HashHdr
Definition: GlobalsStream.h:52
support::ulittle32_t NumBuckets
Definition: RawTypes.h:36
std::array< int32_t, IPHR_HASH+1 > BucketMap
Definition: GlobalsStream.h:56
CRTP base class for adapting an iterator to a different type.
Definition: iterator.h:205
uint32_t getVerHeader() const
Definition: GlobalsStream.h:61
GSIHashIterator end() const
Definition: GlobalsStream.h:67
GSIHashHeader iterator
Definition: GlobalsStream.h:65
FixedStreamArray< support::ulittle32_t > HashBuckets
Definition: GlobalsStream.h:55
uint32_t operator*() const
Definition: GlobalsStream.h:38
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:65
const GSIHashTable & getGlobalsTable() const
Definition: GlobalsStream.h:74
FixedStreamArrayIterator< T > end() const
FixedStreamArray< PSHashRecord > HashRecords
Definition: GlobalsStream.h:53
Lightweight error class with error context and mandatory checking.
Definition: Error.h:157
Provides read only access to a subclass of BinaryStream.
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:48
support::ulittle32_t HrSize
Definition: RawTypes.h:35
FixedStreamArrayIterator< T > begin() const
Iterator over hash records producing symbol record offsets.
Definition: GlobalsStream.h:29