48 lines · cpp
1//==- DIAEnumSymbols.cpp - DIA Symbol 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-exception6//7//===----------------------------------------------------------------------===//8 9#include "llvm/DebugInfo/PDB/DIA/DIAEnumSymbols.h"10#include "llvm/DebugInfo/PDB/DIA/DIARawSymbol.h"11#include "llvm/DebugInfo/PDB/DIA/DIASession.h"12#include "llvm/DebugInfo/PDB/PDBSymbol.h"13 14using namespace llvm;15using namespace llvm::pdb;16 17DIAEnumSymbols::DIAEnumSymbols(const DIASession &PDBSession,18 CComPtr<IDiaEnumSymbols> DiaEnumerator)19 : Session(PDBSession), Enumerator(DiaEnumerator) {}20 21uint32_t DIAEnumSymbols::getChildCount() const {22 LONG Count = 0;23 return (S_OK == Enumerator->get_Count(&Count)) ? Count : 0;24}25 26std::unique_ptr<PDBSymbol>27DIAEnumSymbols::getChildAtIndex(uint32_t Index) const {28 CComPtr<IDiaSymbol> Item;29 if (S_OK != Enumerator->Item(Index, &Item))30 return nullptr;31 32 std::unique_ptr<DIARawSymbol> RawSymbol(new DIARawSymbol(Session, Item));33 return std::unique_ptr<PDBSymbol>(PDBSymbol::create(Session, std::move(RawSymbol)));34}35 36std::unique_ptr<PDBSymbol> DIAEnumSymbols::getNext() {37 CComPtr<IDiaSymbol> Item;38 ULONG NumFetched = 0;39 if (S_OK != Enumerator->Next(1, &Item, &NumFetched))40 return nullptr;41 42 std::unique_ptr<DIARawSymbol> RawSymbol(new DIARawSymbol(Session, Item));43 return std::unique_ptr<PDBSymbol>(44 PDBSymbol::create(Session, std::move(RawSymbol)));45}46 47void DIAEnumSymbols::reset() { Enumerator->Reset(); }48