1//===- DIADataStream.cpp - DIA implementation of IPDBDataStream -*- 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/DIA/DIADataStream.h" 10#include "llvm/DebugInfo/PDB/DIA/DIAUtils.h" 11 12using namespace llvm; 13using namespace llvm::pdb; 14 15DIADataStream::DIADataStream(CComPtr<IDiaEnumDebugStreamData> DiaStreamData) 16 : StreamData(DiaStreamData) {} 17 18uint32_t DIADataStream::getRecordCount() const { 19 LONG Count = 0; 20 return (S_OK == StreamData->get_Count(&Count)) ? Count : 0; 21} 22 23std::string DIADataStream::getName() const { 24 return invokeBstrMethod(*StreamData, &IDiaEnumDebugStreamData::get_name); 25} 26 27std::optional<DIADataStream::RecordType> 28DIADataStream::getItemAtIndex(uint32_t Index) const { 29 RecordType Record; 30 DWORD RecordSize = 0; 31 StreamData->Item(Index, 0, &RecordSize, nullptr); 32 if (RecordSize == 0) 33 return std::nullopt; 34 35 Record.resize(RecordSize); 36 if (S_OK != StreamData->Item(Index, RecordSize, &RecordSize, &Record[0])) 37 return std::nullopt; 38 return Record; 39} 40 41bool DIADataStream::getNext(RecordType &Record) { 42 Record.clear(); 43 DWORD RecordSize = 0; 44 ULONG CountFetched = 0; 45 StreamData->Next(1, 0, &RecordSize, nullptr, &CountFetched); 46 if (RecordSize == 0) 47 return false; 48 49 Record.resize(RecordSize); 50 if (S_OK == 51 StreamData->Next(1, RecordSize, &RecordSize, &Record[0], &CountFetched)) 52 return false; 53 return true; 54} 55 56void DIADataStream::reset() { StreamData->Reset(); } 57