1*9880d681SAndroid Build Coastguard Worker //===- DIADataStream.cpp - DIA implementation of IPDBDataStream -*- C++ -*-===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/PDB/DIA/DIADataStream.h"
11*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/ArrayRef.h"
12*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ConvertUTF.h"
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker using namespace llvm;
15*9880d681SAndroid Build Coastguard Worker using namespace llvm::pdb;
16*9880d681SAndroid Build Coastguard Worker
DIADataStream(CComPtr<IDiaEnumDebugStreamData> DiaStreamData)17*9880d681SAndroid Build Coastguard Worker DIADataStream::DIADataStream(CComPtr<IDiaEnumDebugStreamData> DiaStreamData)
18*9880d681SAndroid Build Coastguard Worker : StreamData(DiaStreamData) {}
19*9880d681SAndroid Build Coastguard Worker
getRecordCount() const20*9880d681SAndroid Build Coastguard Worker uint32_t DIADataStream::getRecordCount() const {
21*9880d681SAndroid Build Coastguard Worker LONG Count = 0;
22*9880d681SAndroid Build Coastguard Worker return (S_OK == StreamData->get_Count(&Count)) ? Count : 0;
23*9880d681SAndroid Build Coastguard Worker }
24*9880d681SAndroid Build Coastguard Worker
getName() const25*9880d681SAndroid Build Coastguard Worker std::string DIADataStream::getName() const {
26*9880d681SAndroid Build Coastguard Worker CComBSTR Name16;
27*9880d681SAndroid Build Coastguard Worker if (S_OK != StreamData->get_name(&Name16))
28*9880d681SAndroid Build Coastguard Worker return std::string();
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Worker std::string Name8;
31*9880d681SAndroid Build Coastguard Worker llvm::ArrayRef<char> Name16Bytes(reinterpret_cast<char *>(Name16.m_str),
32*9880d681SAndroid Build Coastguard Worker Name16.ByteLength());
33*9880d681SAndroid Build Coastguard Worker if (!llvm::convertUTF16ToUTF8String(Name16Bytes, Name8))
34*9880d681SAndroid Build Coastguard Worker return std::string();
35*9880d681SAndroid Build Coastguard Worker return Name8;
36*9880d681SAndroid Build Coastguard Worker }
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Worker llvm::Optional<DIADataStream::RecordType>
getItemAtIndex(uint32_t Index) const39*9880d681SAndroid Build Coastguard Worker DIADataStream::getItemAtIndex(uint32_t Index) const {
40*9880d681SAndroid Build Coastguard Worker RecordType Record;
41*9880d681SAndroid Build Coastguard Worker DWORD RecordSize = 0;
42*9880d681SAndroid Build Coastguard Worker StreamData->Item(Index, 0, &RecordSize, nullptr);
43*9880d681SAndroid Build Coastguard Worker if (RecordSize == 0)
44*9880d681SAndroid Build Coastguard Worker return llvm::Optional<RecordType>();
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Worker Record.resize(RecordSize);
47*9880d681SAndroid Build Coastguard Worker if (S_OK != StreamData->Item(Index, RecordSize, &RecordSize, &Record[0]))
48*9880d681SAndroid Build Coastguard Worker return llvm::Optional<RecordType>();
49*9880d681SAndroid Build Coastguard Worker return Record;
50*9880d681SAndroid Build Coastguard Worker }
51*9880d681SAndroid Build Coastguard Worker
getNext(RecordType & Record)52*9880d681SAndroid Build Coastguard Worker bool DIADataStream::getNext(RecordType &Record) {
53*9880d681SAndroid Build Coastguard Worker Record.clear();
54*9880d681SAndroid Build Coastguard Worker DWORD RecordSize = 0;
55*9880d681SAndroid Build Coastguard Worker ULONG CountFetched = 0;
56*9880d681SAndroid Build Coastguard Worker StreamData->Next(1, 0, &RecordSize, nullptr, &CountFetched);
57*9880d681SAndroid Build Coastguard Worker if (RecordSize == 0)
58*9880d681SAndroid Build Coastguard Worker return false;
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Worker Record.resize(RecordSize);
61*9880d681SAndroid Build Coastguard Worker if (S_OK ==
62*9880d681SAndroid Build Coastguard Worker StreamData->Next(1, RecordSize, &RecordSize, &Record[0], &CountFetched))
63*9880d681SAndroid Build Coastguard Worker return false;
64*9880d681SAndroid Build Coastguard Worker return true;
65*9880d681SAndroid Build Coastguard Worker }
66*9880d681SAndroid Build Coastguard Worker
reset()67*9880d681SAndroid Build Coastguard Worker void DIADataStream::reset() { StreamData->Reset(); }
68*9880d681SAndroid Build Coastguard Worker
clone() const69*9880d681SAndroid Build Coastguard Worker DIADataStream *DIADataStream::clone() const {
70*9880d681SAndroid Build Coastguard Worker CComPtr<IDiaEnumDebugStreamData> EnumeratorClone;
71*9880d681SAndroid Build Coastguard Worker if (S_OK != StreamData->Clone(&EnumeratorClone))
72*9880d681SAndroid Build Coastguard Worker return nullptr;
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Worker return new DIADataStream(EnumeratorClone);
75*9880d681SAndroid Build Coastguard Worker }
76