xref: /llvm-project/llvm/lib/DebugInfo/PDB/DIA/DIAEnumDebugStreams.cpp (revision 2946cd701067404b99c39fb29dc9c74bd7193eb3)
1cffff26bSZachary Turner //==- DIAEnumDebugStreams.cpp - DIA Debug Stream Enumerator impl -*- C++ -*-==//
2cffff26bSZachary Turner //
3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6cffff26bSZachary Turner //
7cffff26bSZachary Turner //===----------------------------------------------------------------------===//
8cffff26bSZachary Turner 
971f308adSChandler Carruth #include "llvm/DebugInfo/PDB/DIA/DIAEnumDebugStreams.h"
106bda14b3SChandler Carruth #include "llvm/DebugInfo/PDB/DIA/DIADataStream.h"
116bda14b3SChandler Carruth #include "llvm/DebugInfo/PDB/PDBSymbol.h"
12cffff26bSZachary Turner 
13cffff26bSZachary Turner using namespace llvm;
14ec28fc34SZachary Turner using namespace llvm::pdb;
15cffff26bSZachary Turner 
DIAEnumDebugStreams(CComPtr<IDiaEnumDebugStreams> DiaEnumerator)16cffff26bSZachary Turner DIAEnumDebugStreams::DIAEnumDebugStreams(
17cffff26bSZachary Turner     CComPtr<IDiaEnumDebugStreams> DiaEnumerator)
18cffff26bSZachary Turner     : Enumerator(DiaEnumerator) {}
19cffff26bSZachary Turner 
getChildCount() const20cffff26bSZachary Turner uint32_t DIAEnumDebugStreams::getChildCount() const {
21cffff26bSZachary Turner   LONG Count = 0;
22cffff26bSZachary Turner   return (S_OK == Enumerator->get_Count(&Count)) ? Count : 0;
23cffff26bSZachary Turner }
24cffff26bSZachary Turner 
25cffff26bSZachary Turner std::unique_ptr<IPDBDataStream>
getChildAtIndex(uint32_t Index) const26cffff26bSZachary Turner DIAEnumDebugStreams::getChildAtIndex(uint32_t Index) const {
27cffff26bSZachary Turner   CComPtr<IDiaEnumDebugStreamData> Item;
28cffff26bSZachary Turner   VARIANT VarIndex;
29cffff26bSZachary Turner   VarIndex.vt = VT_I4;
30cffff26bSZachary Turner   VarIndex.lVal = Index;
31cffff26bSZachary Turner   if (S_OK != Enumerator->Item(VarIndex, &Item))
32cffff26bSZachary Turner     return nullptr;
33cffff26bSZachary Turner 
34cffff26bSZachary Turner   return std::unique_ptr<IPDBDataStream>(new DIADataStream(Item));
35cffff26bSZachary Turner }
36cffff26bSZachary Turner 
getNext()37cffff26bSZachary Turner std::unique_ptr<IPDBDataStream> DIAEnumDebugStreams::getNext() {
38cffff26bSZachary Turner   CComPtr<IDiaEnumDebugStreamData> Item;
39cffff26bSZachary Turner   ULONG NumFetched = 0;
40cffff26bSZachary Turner   if (S_OK != Enumerator->Next(1, &Item, &NumFetched))
41cffff26bSZachary Turner     return nullptr;
42cffff26bSZachary Turner 
43cffff26bSZachary Turner   return std::unique_ptr<IPDBDataStream>(new DIADataStream(Item));
44cffff26bSZachary Turner }
45cffff26bSZachary Turner 
reset()46cffff26bSZachary Turner void DIAEnumDebugStreams::reset() { Enumerator->Reset(); }
47