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