10b57cec5SDimitry Andric //==- NativeEnumGlobals.cpp - Native Global Enumerator impl ------*- C++ -*-==// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 90b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/Native/NativeEnumGlobals.h" 100b57cec5SDimitry Andric 11*81ad6265SDimitry Andric #include "llvm/DebugInfo/CodeView/CVRecord.h" 120b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/IPDBEnumChildren.h" 130b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/Native/GlobalsStream.h" 140b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/Native/NativeSession.h" 150b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/Native/PDBFile.h" 16*81ad6265SDimitry Andric #include "llvm/DebugInfo/PDB/Native/SymbolCache.h" 170b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/Native/SymbolStream.h" 180b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/PDBSymbol.h" 19*81ad6265SDimitry Andric #include "llvm/DebugInfo/PDB/PDBTypes.h" 200b57cec5SDimitry Andric 210b57cec5SDimitry Andric using namespace llvm; 220b57cec5SDimitry Andric using namespace llvm::codeview; 230b57cec5SDimitry Andric using namespace llvm::pdb; 240b57cec5SDimitry Andric NativeEnumGlobals(NativeSession & PDBSession,std::vector<codeview::SymbolKind> Kinds)250b57cec5SDimitry AndricNativeEnumGlobals::NativeEnumGlobals(NativeSession &PDBSession, 260b57cec5SDimitry Andric std::vector<codeview::SymbolKind> Kinds) 270b57cec5SDimitry Andric : Index(0), Session(PDBSession) { 280b57cec5SDimitry Andric GlobalsStream &GS = cantFail(Session.getPDBFile().getPDBGlobalsStream()); 290b57cec5SDimitry Andric SymbolStream &SS = cantFail(Session.getPDBFile().getPDBSymbolStream()); 300b57cec5SDimitry Andric for (uint32_t Off : GS.getGlobalsTable()) { 310b57cec5SDimitry Andric CVSymbol S = SS.readRecord(Off); 320b57cec5SDimitry Andric if (!llvm::is_contained(Kinds, S.kind())) 330b57cec5SDimitry Andric continue; 340b57cec5SDimitry Andric MatchOffsets.push_back(Off); 350b57cec5SDimitry Andric } 360b57cec5SDimitry Andric } 370b57cec5SDimitry Andric getChildCount() const380b57cec5SDimitry Andricuint32_t NativeEnumGlobals::getChildCount() const { 390b57cec5SDimitry Andric return static_cast<uint32_t>(MatchOffsets.size()); 400b57cec5SDimitry Andric } 410b57cec5SDimitry Andric 420b57cec5SDimitry Andric std::unique_ptr<PDBSymbol> getChildAtIndex(uint32_t N) const430b57cec5SDimitry AndricNativeEnumGlobals::getChildAtIndex(uint32_t N) const { 440b57cec5SDimitry Andric if (N >= MatchOffsets.size()) 450b57cec5SDimitry Andric return nullptr; 460b57cec5SDimitry Andric 470b57cec5SDimitry Andric SymIndexId Id = 480b57cec5SDimitry Andric Session.getSymbolCache().getOrCreateGlobalSymbolByOffset(MatchOffsets[N]); 490b57cec5SDimitry Andric return Session.getSymbolCache().getSymbolById(Id); 500b57cec5SDimitry Andric } 510b57cec5SDimitry Andric getNext()520b57cec5SDimitry Andricstd::unique_ptr<PDBSymbol> NativeEnumGlobals::getNext() { 530b57cec5SDimitry Andric return getChildAtIndex(Index++); 540b57cec5SDimitry Andric } 550b57cec5SDimitry Andric reset()560b57cec5SDimitry Andricvoid NativeEnumGlobals::reset() { Index = 0; } 57