xref: /aosp_15_r20/external/llvm/lib/DebugInfo/PDB/DIA/DIADataStream.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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