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_NATIVE_GLOBALSSTREAM_H |
10 | #define LLVM_DEBUGINFO_PDB_NATIVE_GLOBALSSTREAM_H |
11 | |
12 | #include "llvm/ADT/iterator.h" |
13 | #include "llvm/DebugInfo/CodeView/CVRecord.h" |
14 | #include "llvm/DebugInfo/PDB/Native/RawTypes.h" |
15 | #include "llvm/Support/BinaryStreamArray.h" |
16 | #include "llvm/Support/Endian.h" |
17 | #include "llvm/Support/Error.h" |
18 | |
19 | namespace llvm { |
20 | class BinaryStreamReader; |
21 | namespace msf { |
22 | class MappedBlockStream; |
23 | } |
24 | namespace pdb { |
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. |
29 | class GSIHashIterator |
30 | : public iterator_adaptor_base< |
31 | GSIHashIterator, FixedStreamArrayIterator<PSHashRecord>, |
32 | std::random_access_iterator_tag, const uint32_t> { |
33 | public: |
34 | template <typename T> |
35 | GSIHashIterator(T &&v) |
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: |
52 | const GSIHashHeader *HashHdr; |
53 | FixedStreamArray<PSHashRecord> HashRecords; |
54 | FixedStreamArray<support::ulittle32_t> HashBitmap; |
55 | FixedStreamArray<support::ulittle32_t> HashBuckets; |
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 | |
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 | 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 | } // namespace pdb |
85 | } |
86 | |
87 | #endif |
88 |