blob: 6eece3df2db3470e56b0757aebe70764d0d6b75c [file] [log] [blame]
Zachary Turnera5e3e022018-10-01 17:55:38 +00001//==- NativeEnumGlobals.cpp - Native Global Enumerator impl ------*- C++ -*-==//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "llvm/DebugInfo/PDB/Native/NativeEnumGlobals.h"
11
12#include "llvm/DebugInfo/CodeView/SymbolDeserializer.h"
13#include "llvm/DebugInfo/PDB/IPDBEnumChildren.h"
14#include "llvm/DebugInfo/PDB/Native/GlobalsStream.h"
15#include "llvm/DebugInfo/PDB/Native/NativeSession.h"
16#include "llvm/DebugInfo/PDB/Native/PDBFile.h"
17#include "llvm/DebugInfo/PDB/Native/SymbolStream.h"
18#include "llvm/DebugInfo/PDB/PDBSymbol.h"
19
20using namespace llvm;
21using namespace llvm::codeview;
22using namespace llvm::pdb;
23
24NativeEnumGlobals::NativeEnumGlobals(NativeSession &PDBSession,
25 std::vector<codeview::SymbolKind> Kinds)
26 : Index(0), Session(PDBSession) {
27 GlobalsStream &GS = cantFail(Session.getPDBFile().getPDBGlobalsStream());
28 SymbolStream &SS = cantFail(Session.getPDBFile().getPDBSymbolStream());
29 for (uint32_t Off : GS.getGlobalsTable()) {
30 CVSymbol S = SS.readRecord(Off);
31 if (!llvm::is_contained(Kinds, S.kind()))
32 continue;
33 MatchOffsets.push_back(Off);
34 }
35}
36
37uint32_t NativeEnumGlobals::getChildCount() const {
38 return static_cast<uint32_t>(MatchOffsets.size());
39}
40
41std::unique_ptr<PDBSymbol>
42NativeEnumGlobals::getChildAtIndex(uint32_t N) const {
43 if (N >= MatchOffsets.size())
44 return nullptr;
45
46 SymIndexId Id =
47 Session.getSymbolCache().getOrCreateGlobalSymbolByOffset(MatchOffsets[N]);
48 return Session.getSymbolCache().getSymbolById(Id);
49}
50
51std::unique_ptr<PDBSymbol> NativeEnumGlobals::getNext() {
52 return getChildAtIndex(Index++);
53}
54
55void NativeEnumGlobals::reset() { Index = 0; }