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 llvm::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 llvm::Optional<RecordType>();
34 
35   Record.resize(RecordSize);
36   if (S_OK != StreamData->Item(Index, RecordSize, &RecordSize, &Record[0]))
37     return llvm::Optional<RecordType>();
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