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
19namespace llvm {
20class BinaryStreamReader;
21namespace msf {
22class MappedBlockStream;
23}
24namespace pdb {
25class 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.
29class GSIHashIterator
30 : public iterator_adaptor_base<
31 GSIHashIterator, FixedStreamArrayIterator<PSHashRecord>,
32 std::random_access_iterator_tag, const uint32_t> {
33public:
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
45enum : 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.
50class GSIHashTable {
51public:
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
70class GlobalsStream {
71public:
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
80private:
81 GSIHashTable GlobalsTable;
82 std::unique_ptr<msf::MappedBlockStream> Stream;
83};
84} // namespace pdb
85}
86
87#endif
88

source code of llvm/include/llvm/DebugInfo/PDB/Native/GlobalsStream.h