Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 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