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 12 using namespace llvm; 13 using namespace llvm::pdb; 14 15 DIADataStream::DIADataStream(CComPtr<IDiaEnumDebugStreamData> DiaStreamData) 16 : StreamData(DiaStreamData) {} 17 18 uint32_t DIADataStream::getRecordCount() const { 19 LONG Count = 0; 20 return (S_OK == StreamData->get_Count(&Count)) ? Count : 0; 21 } 22 23 std::string DIADataStream::getName() const { 24 return invokeBstrMethod(*StreamData, &IDiaEnumDebugStreamData::get_name); 25 } 26 27 std::optional<DIADataStream::RecordType> 28 DIADataStream::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 41 bool 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 56 void DIADataStream::reset() { StreamData->Reset(); } 57