1 | //==- NativeEnumGlobals.cpp - Native Global Enumerator impl ------*- 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 | #include "llvm/DebugInfo/PDB/Native/NativeEnumGlobals.h" |
10 | |
11 | #include "llvm/DebugInfo/CodeView/CVRecord.h" |
12 | #include "llvm/DebugInfo/PDB/IPDBEnumChildren.h" |
13 | #include "llvm/DebugInfo/PDB/Native/GlobalsStream.h" |
14 | #include "llvm/DebugInfo/PDB/Native/NativeSession.h" |
15 | #include "llvm/DebugInfo/PDB/Native/PDBFile.h" |
16 | #include "llvm/DebugInfo/PDB/Native/SymbolCache.h" |
17 | #include "llvm/DebugInfo/PDB/Native/SymbolStream.h" |
18 | #include "llvm/DebugInfo/PDB/PDBSymbol.h" |
19 | #include "llvm/DebugInfo/PDB/PDBTypes.h" |
20 | |
21 | using namespace llvm; |
22 | using namespace llvm::codeview; |
23 | using namespace llvm::pdb; |
24 | |
25 | NativeEnumGlobals::NativeEnumGlobals(NativeSession &PDBSession, |
26 | std::vector<codeview::SymbolKind> Kinds) |
27 | : Index(0), Session(PDBSession) { |
28 | GlobalsStream &GS = cantFail(ValOrErr: Session.getPDBFile().getPDBGlobalsStream()); |
29 | SymbolStream &SS = cantFail(ValOrErr: Session.getPDBFile().getPDBSymbolStream()); |
30 | for (uint32_t Off : GS.getGlobalsTable()) { |
31 | CVSymbol S = SS.readRecord(Offset: Off); |
32 | if (!llvm::is_contained(Range&: Kinds, Element: S.kind())) |
33 | continue; |
34 | MatchOffsets.push_back(x: Off); |
35 | } |
36 | } |
37 | |
38 | uint32_t NativeEnumGlobals::getChildCount() const { |
39 | return static_cast<uint32_t>(MatchOffsets.size()); |
40 | } |
41 | |
42 | std::unique_ptr<PDBSymbol> |
43 | NativeEnumGlobals::getChildAtIndex(uint32_t N) const { |
44 | if (N >= MatchOffsets.size()) |
45 | return nullptr; |
46 | |
47 | SymIndexId Id = |
48 | Session.getSymbolCache().getOrCreateGlobalSymbolByOffset(Offset: MatchOffsets[N]); |
49 | return Session.getSymbolCache().getSymbolById(SymbolId: Id); |
50 | } |
51 | |
52 | std::unique_ptr<PDBSymbol> NativeEnumGlobals::getNext() { |
53 | return getChildAtIndex(N: Index++); |
54 | } |
55 | |
56 | void NativeEnumGlobals::reset() { Index = 0; } |
57 |