xref: /aosp_15_r20/external/llvm/lib/DebugInfo/PDB/DIA/DIASession.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===- DIASession.cpp - DIA implementation of IPDBSession -------*- 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 #include "llvm/DebugInfo/PDB/DIA/DIASession.h"
10*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/STLExtras.h"
11*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/PDB/DIA/DIAEnumDebugStreams.h"
12*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/PDB/DIA/DIAEnumLineNumbers.h"
13*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/PDB/DIA/DIAEnumSourceFiles.h"
14*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/PDB/DIA/DIAError.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/PDB/DIA/DIARawSymbol.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/PDB/DIA/DIASourceFile.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/PDB/DIA/DIASupport.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/PDB/GenericError.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/PDB/PDB.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/PDB/PDBSymbolCompiland.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/PDB/PDBSymbolExe.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ConvertUTF.h"
23*9880d681SAndroid Build Coastguard Worker 
24*9880d681SAndroid Build Coastguard Worker using namespace llvm;
25*9880d681SAndroid Build Coastguard Worker using namespace llvm::pdb;
26*9880d681SAndroid Build Coastguard Worker 
27*9880d681SAndroid Build Coastguard Worker namespace {
28*9880d681SAndroid Build Coastguard Worker 
ErrorFromHResult(HRESULT Result)29*9880d681SAndroid Build Coastguard Worker Error ErrorFromHResult(HRESULT Result) {
30*9880d681SAndroid Build Coastguard Worker   switch (Result) {
31*9880d681SAndroid Build Coastguard Worker   case E_PDB_NOT_FOUND:
32*9880d681SAndroid Build Coastguard Worker     return make_error<GenericError>(generic_error_code::invalid_path);
33*9880d681SAndroid Build Coastguard Worker   case E_PDB_FORMAT:
34*9880d681SAndroid Build Coastguard Worker     return make_error<DIAError>(dia_error_code::invalid_file_format);
35*9880d681SAndroid Build Coastguard Worker   case E_INVALIDARG:
36*9880d681SAndroid Build Coastguard Worker     return make_error<DIAError>(dia_error_code::invalid_parameter);
37*9880d681SAndroid Build Coastguard Worker   case E_UNEXPECTED:
38*9880d681SAndroid Build Coastguard Worker     return make_error<DIAError>(dia_error_code::already_loaded);
39*9880d681SAndroid Build Coastguard Worker   case E_PDB_INVALID_SIG:
40*9880d681SAndroid Build Coastguard Worker   case E_PDB_INVALID_AGE:
41*9880d681SAndroid Build Coastguard Worker     return make_error<DIAError>(dia_error_code::debug_info_mismatch);
42*9880d681SAndroid Build Coastguard Worker   default:
43*9880d681SAndroid Build Coastguard Worker     return make_error<DIAError>(dia_error_code::unspecified);
44*9880d681SAndroid Build Coastguard Worker   }
45*9880d681SAndroid Build Coastguard Worker }
46*9880d681SAndroid Build Coastguard Worker 
LoadDIA(CComPtr<IDiaDataSource> & DiaDataSource)47*9880d681SAndroid Build Coastguard Worker Error LoadDIA(CComPtr<IDiaDataSource> &DiaDataSource) {
48*9880d681SAndroid Build Coastguard Worker   if (SUCCEEDED(CoCreateInstance(CLSID_DiaSource, nullptr, CLSCTX_INPROC_SERVER,
49*9880d681SAndroid Build Coastguard Worker                                  IID_IDiaDataSource,
50*9880d681SAndroid Build Coastguard Worker                                  reinterpret_cast<LPVOID *>(&DiaDataSource))))
51*9880d681SAndroid Build Coastguard Worker     return Error::success();
52*9880d681SAndroid Build Coastguard Worker 
53*9880d681SAndroid Build Coastguard Worker // If the CoCreateInstance call above failed, msdia*.dll is not registered.
54*9880d681SAndroid Build Coastguard Worker // Try loading the DLL corresponding to the #included DIA SDK.
55*9880d681SAndroid Build Coastguard Worker #if !defined(_MSC_VER)
56*9880d681SAndroid Build Coastguard Worker   return llvm::make_error<GenericError>(
57*9880d681SAndroid Build Coastguard Worker       "DIA is only supported when using MSVC.");
58*9880d681SAndroid Build Coastguard Worker #endif
59*9880d681SAndroid Build Coastguard Worker 
60*9880d681SAndroid Build Coastguard Worker   const wchar_t *msdia_dll = nullptr;
61*9880d681SAndroid Build Coastguard Worker #if _MSC_VER == 1900
62*9880d681SAndroid Build Coastguard Worker   msdia_dll = L"msdia140.dll"; // VS2015
63*9880d681SAndroid Build Coastguard Worker #elif _MSC_VER == 1800
64*9880d681SAndroid Build Coastguard Worker   msdia_dll = L"msdia120.dll"; // VS2013
65*9880d681SAndroid Build Coastguard Worker #else
66*9880d681SAndroid Build Coastguard Worker #error "Unknown Visual Studio version."
67*9880d681SAndroid Build Coastguard Worker #endif
68*9880d681SAndroid Build Coastguard Worker 
69*9880d681SAndroid Build Coastguard Worker   HRESULT HR;
70*9880d681SAndroid Build Coastguard Worker   if (FAILED(HR = NoRegCoCreate(msdia_dll, CLSID_DiaSource, IID_IDiaDataSource,
71*9880d681SAndroid Build Coastguard Worker                                 reinterpret_cast<LPVOID *>(&DiaDataSource))))
72*9880d681SAndroid Build Coastguard Worker     return ErrorFromHResult(HR);
73*9880d681SAndroid Build Coastguard Worker   return Error::success();
74*9880d681SAndroid Build Coastguard Worker }
75*9880d681SAndroid Build Coastguard Worker 
76*9880d681SAndroid Build Coastguard Worker }
77*9880d681SAndroid Build Coastguard Worker 
DIASession(CComPtr<IDiaSession> DiaSession)78*9880d681SAndroid Build Coastguard Worker DIASession::DIASession(CComPtr<IDiaSession> DiaSession) : Session(DiaSession) {}
79*9880d681SAndroid Build Coastguard Worker 
createFromPdb(StringRef Path,std::unique_ptr<IPDBSession> & Session)80*9880d681SAndroid Build Coastguard Worker Error DIASession::createFromPdb(StringRef Path,
81*9880d681SAndroid Build Coastguard Worker                                 std::unique_ptr<IPDBSession> &Session) {
82*9880d681SAndroid Build Coastguard Worker   CComPtr<IDiaDataSource> DiaDataSource;
83*9880d681SAndroid Build Coastguard Worker   CComPtr<IDiaSession> DiaSession;
84*9880d681SAndroid Build Coastguard Worker 
85*9880d681SAndroid Build Coastguard Worker   // We assume that CoInitializeEx has already been called by the executable.
86*9880d681SAndroid Build Coastguard Worker   if (auto E = LoadDIA(DiaDataSource))
87*9880d681SAndroid Build Coastguard Worker     return E;
88*9880d681SAndroid Build Coastguard Worker 
89*9880d681SAndroid Build Coastguard Worker   llvm::SmallVector<UTF16, 128> Path16;
90*9880d681SAndroid Build Coastguard Worker   if (!llvm::convertUTF8ToUTF16String(Path, Path16))
91*9880d681SAndroid Build Coastguard Worker     return make_error<GenericError>(generic_error_code::invalid_path);
92*9880d681SAndroid Build Coastguard Worker 
93*9880d681SAndroid Build Coastguard Worker   const wchar_t *Path16Str = reinterpret_cast<const wchar_t*>(Path16.data());
94*9880d681SAndroid Build Coastguard Worker   HRESULT HR;
95*9880d681SAndroid Build Coastguard Worker   if (FAILED(HR = DiaDataSource->loadDataFromPdb(Path16Str)))
96*9880d681SAndroid Build Coastguard Worker     return ErrorFromHResult(HR);
97*9880d681SAndroid Build Coastguard Worker 
98*9880d681SAndroid Build Coastguard Worker   if (FAILED(HR = DiaDataSource->openSession(&DiaSession)))
99*9880d681SAndroid Build Coastguard Worker     return ErrorFromHResult(HR);
100*9880d681SAndroid Build Coastguard Worker 
101*9880d681SAndroid Build Coastguard Worker   Session.reset(new DIASession(DiaSession));
102*9880d681SAndroid Build Coastguard Worker   return Error::success();
103*9880d681SAndroid Build Coastguard Worker }
104*9880d681SAndroid Build Coastguard Worker 
createFromExe(StringRef Path,std::unique_ptr<IPDBSession> & Session)105*9880d681SAndroid Build Coastguard Worker Error DIASession::createFromExe(StringRef Path,
106*9880d681SAndroid Build Coastguard Worker                                 std::unique_ptr<IPDBSession> &Session) {
107*9880d681SAndroid Build Coastguard Worker   CComPtr<IDiaDataSource> DiaDataSource;
108*9880d681SAndroid Build Coastguard Worker   CComPtr<IDiaSession> DiaSession;
109*9880d681SAndroid Build Coastguard Worker 
110*9880d681SAndroid Build Coastguard Worker   // We assume that CoInitializeEx has already been called by the executable.
111*9880d681SAndroid Build Coastguard Worker   if (auto EC = LoadDIA(DiaDataSource))
112*9880d681SAndroid Build Coastguard Worker     return EC;
113*9880d681SAndroid Build Coastguard Worker 
114*9880d681SAndroid Build Coastguard Worker   llvm::SmallVector<UTF16, 128> Path16;
115*9880d681SAndroid Build Coastguard Worker   if (!llvm::convertUTF8ToUTF16String(Path, Path16))
116*9880d681SAndroid Build Coastguard Worker     return make_error<GenericError>(generic_error_code::invalid_path, Path);
117*9880d681SAndroid Build Coastguard Worker 
118*9880d681SAndroid Build Coastguard Worker   const wchar_t *Path16Str = reinterpret_cast<const wchar_t *>(Path16.data());
119*9880d681SAndroid Build Coastguard Worker   HRESULT HR;
120*9880d681SAndroid Build Coastguard Worker   if (FAILED(HR = DiaDataSource->loadDataForExe(Path16Str, nullptr, nullptr)))
121*9880d681SAndroid Build Coastguard Worker     return ErrorFromHResult(HR);
122*9880d681SAndroid Build Coastguard Worker 
123*9880d681SAndroid Build Coastguard Worker   if (FAILED(HR = DiaDataSource->openSession(&DiaSession)))
124*9880d681SAndroid Build Coastguard Worker     return ErrorFromHResult(HR);
125*9880d681SAndroid Build Coastguard Worker 
126*9880d681SAndroid Build Coastguard Worker   Session.reset(new DIASession(DiaSession));
127*9880d681SAndroid Build Coastguard Worker   return Error::success();
128*9880d681SAndroid Build Coastguard Worker }
129*9880d681SAndroid Build Coastguard Worker 
getLoadAddress() const130*9880d681SAndroid Build Coastguard Worker uint64_t DIASession::getLoadAddress() const {
131*9880d681SAndroid Build Coastguard Worker   uint64_t LoadAddress;
132*9880d681SAndroid Build Coastguard Worker   bool success = (S_OK == Session->get_loadAddress(&LoadAddress));
133*9880d681SAndroid Build Coastguard Worker   return (success) ? LoadAddress : 0;
134*9880d681SAndroid Build Coastguard Worker }
135*9880d681SAndroid Build Coastguard Worker 
setLoadAddress(uint64_t Address)136*9880d681SAndroid Build Coastguard Worker void DIASession::setLoadAddress(uint64_t Address) {
137*9880d681SAndroid Build Coastguard Worker   Session->put_loadAddress(Address);
138*9880d681SAndroid Build Coastguard Worker }
139*9880d681SAndroid Build Coastguard Worker 
getGlobalScope() const140*9880d681SAndroid Build Coastguard Worker std::unique_ptr<PDBSymbolExe> DIASession::getGlobalScope() const {
141*9880d681SAndroid Build Coastguard Worker   CComPtr<IDiaSymbol> GlobalScope;
142*9880d681SAndroid Build Coastguard Worker   if (S_OK != Session->get_globalScope(&GlobalScope))
143*9880d681SAndroid Build Coastguard Worker     return nullptr;
144*9880d681SAndroid Build Coastguard Worker 
145*9880d681SAndroid Build Coastguard Worker   auto RawSymbol = llvm::make_unique<DIARawSymbol>(*this, GlobalScope);
146*9880d681SAndroid Build Coastguard Worker   auto PdbSymbol(PDBSymbol::create(*this, std::move(RawSymbol)));
147*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<PDBSymbolExe> ExeSymbol(
148*9880d681SAndroid Build Coastguard Worker       static_cast<PDBSymbolExe *>(PdbSymbol.release()));
149*9880d681SAndroid Build Coastguard Worker   return ExeSymbol;
150*9880d681SAndroid Build Coastguard Worker }
151*9880d681SAndroid Build Coastguard Worker 
getSymbolById(uint32_t SymbolId) const152*9880d681SAndroid Build Coastguard Worker std::unique_ptr<PDBSymbol> DIASession::getSymbolById(uint32_t SymbolId) const {
153*9880d681SAndroid Build Coastguard Worker   CComPtr<IDiaSymbol> LocatedSymbol;
154*9880d681SAndroid Build Coastguard Worker   if (S_OK != Session->symbolById(SymbolId, &LocatedSymbol))
155*9880d681SAndroid Build Coastguard Worker     return nullptr;
156*9880d681SAndroid Build Coastguard Worker 
157*9880d681SAndroid Build Coastguard Worker   auto RawSymbol = llvm::make_unique<DIARawSymbol>(*this, LocatedSymbol);
158*9880d681SAndroid Build Coastguard Worker   return PDBSymbol::create(*this, std::move(RawSymbol));
159*9880d681SAndroid Build Coastguard Worker }
160*9880d681SAndroid Build Coastguard Worker 
161*9880d681SAndroid Build Coastguard Worker std::unique_ptr<PDBSymbol>
findSymbolByAddress(uint64_t Address,PDB_SymType Type) const162*9880d681SAndroid Build Coastguard Worker DIASession::findSymbolByAddress(uint64_t Address, PDB_SymType Type) const {
163*9880d681SAndroid Build Coastguard Worker   enum SymTagEnum EnumVal = static_cast<enum SymTagEnum>(Type);
164*9880d681SAndroid Build Coastguard Worker 
165*9880d681SAndroid Build Coastguard Worker   CComPtr<IDiaSymbol> Symbol;
166*9880d681SAndroid Build Coastguard Worker   if (S_OK != Session->findSymbolByVA(Address, EnumVal, &Symbol)) {
167*9880d681SAndroid Build Coastguard Worker     ULONGLONG LoadAddr = 0;
168*9880d681SAndroid Build Coastguard Worker     if (S_OK != Session->get_loadAddress(&LoadAddr))
169*9880d681SAndroid Build Coastguard Worker       return nullptr;
170*9880d681SAndroid Build Coastguard Worker     DWORD RVA = static_cast<DWORD>(Address - LoadAddr);
171*9880d681SAndroid Build Coastguard Worker     if (S_OK != Session->findSymbolByRVA(RVA, EnumVal, &Symbol))
172*9880d681SAndroid Build Coastguard Worker       return nullptr;
173*9880d681SAndroid Build Coastguard Worker   }
174*9880d681SAndroid Build Coastguard Worker   auto RawSymbol = llvm::make_unique<DIARawSymbol>(*this, Symbol);
175*9880d681SAndroid Build Coastguard Worker   return PDBSymbol::create(*this, std::move(RawSymbol));
176*9880d681SAndroid Build Coastguard Worker }
177*9880d681SAndroid Build Coastguard Worker 
178*9880d681SAndroid Build Coastguard Worker std::unique_ptr<IPDBEnumLineNumbers>
findLineNumbers(const PDBSymbolCompiland & Compiland,const IPDBSourceFile & File) const179*9880d681SAndroid Build Coastguard Worker DIASession::findLineNumbers(const PDBSymbolCompiland &Compiland,
180*9880d681SAndroid Build Coastguard Worker                             const IPDBSourceFile &File) const {
181*9880d681SAndroid Build Coastguard Worker   const DIARawSymbol &RawCompiland =
182*9880d681SAndroid Build Coastguard Worker       static_cast<const DIARawSymbol &>(Compiland.getRawSymbol());
183*9880d681SAndroid Build Coastguard Worker   const DIASourceFile &RawFile = static_cast<const DIASourceFile &>(File);
184*9880d681SAndroid Build Coastguard Worker 
185*9880d681SAndroid Build Coastguard Worker   CComPtr<IDiaEnumLineNumbers> LineNumbers;
186*9880d681SAndroid Build Coastguard Worker   if (S_OK !=
187*9880d681SAndroid Build Coastguard Worker       Session->findLines(RawCompiland.getDiaSymbol(), RawFile.getDiaFile(),
188*9880d681SAndroid Build Coastguard Worker                          &LineNumbers))
189*9880d681SAndroid Build Coastguard Worker     return nullptr;
190*9880d681SAndroid Build Coastguard Worker 
191*9880d681SAndroid Build Coastguard Worker   return llvm::make_unique<DIAEnumLineNumbers>(LineNumbers);
192*9880d681SAndroid Build Coastguard Worker }
193*9880d681SAndroid Build Coastguard Worker 
194*9880d681SAndroid Build Coastguard Worker std::unique_ptr<IPDBEnumLineNumbers>
findLineNumbersByAddress(uint64_t Address,uint32_t Length) const195*9880d681SAndroid Build Coastguard Worker DIASession::findLineNumbersByAddress(uint64_t Address, uint32_t Length) const {
196*9880d681SAndroid Build Coastguard Worker   CComPtr<IDiaEnumLineNumbers> LineNumbers;
197*9880d681SAndroid Build Coastguard Worker   if (S_OK != Session->findLinesByVA(Address, Length, &LineNumbers))
198*9880d681SAndroid Build Coastguard Worker     return nullptr;
199*9880d681SAndroid Build Coastguard Worker 
200*9880d681SAndroid Build Coastguard Worker   return llvm::make_unique<DIAEnumLineNumbers>(LineNumbers);
201*9880d681SAndroid Build Coastguard Worker }
202*9880d681SAndroid Build Coastguard Worker 
203*9880d681SAndroid Build Coastguard Worker std::unique_ptr<IPDBEnumSourceFiles>
findSourceFiles(const PDBSymbolCompiland * Compiland,llvm::StringRef Pattern,PDB_NameSearchFlags Flags) const204*9880d681SAndroid Build Coastguard Worker DIASession::findSourceFiles(const PDBSymbolCompiland *Compiland,
205*9880d681SAndroid Build Coastguard Worker                             llvm::StringRef Pattern,
206*9880d681SAndroid Build Coastguard Worker                             PDB_NameSearchFlags Flags) const {
207*9880d681SAndroid Build Coastguard Worker   IDiaSymbol *DiaCompiland = nullptr;
208*9880d681SAndroid Build Coastguard Worker   CComBSTR Utf16Pattern;
209*9880d681SAndroid Build Coastguard Worker   if (!Pattern.empty())
210*9880d681SAndroid Build Coastguard Worker     Utf16Pattern = CComBSTR(Pattern.data());
211*9880d681SAndroid Build Coastguard Worker 
212*9880d681SAndroid Build Coastguard Worker   if (Compiland)
213*9880d681SAndroid Build Coastguard Worker     DiaCompiland = static_cast<const DIARawSymbol &>(Compiland->getRawSymbol())
214*9880d681SAndroid Build Coastguard Worker                        .getDiaSymbol();
215*9880d681SAndroid Build Coastguard Worker 
216*9880d681SAndroid Build Coastguard Worker   Flags = static_cast<PDB_NameSearchFlags>(
217*9880d681SAndroid Build Coastguard Worker       Flags | PDB_NameSearchFlags::NS_FileNameExtMatch);
218*9880d681SAndroid Build Coastguard Worker   CComPtr<IDiaEnumSourceFiles> SourceFiles;
219*9880d681SAndroid Build Coastguard Worker   if (S_OK !=
220*9880d681SAndroid Build Coastguard Worker       Session->findFile(DiaCompiland, Utf16Pattern.m_str, Flags, &SourceFiles))
221*9880d681SAndroid Build Coastguard Worker     return nullptr;
222*9880d681SAndroid Build Coastguard Worker   return llvm::make_unique<DIAEnumSourceFiles>(*this, SourceFiles);
223*9880d681SAndroid Build Coastguard Worker }
224*9880d681SAndroid Build Coastguard Worker 
225*9880d681SAndroid Build Coastguard Worker std::unique_ptr<IPDBSourceFile>
findOneSourceFile(const PDBSymbolCompiland * Compiland,llvm::StringRef Pattern,PDB_NameSearchFlags Flags) const226*9880d681SAndroid Build Coastguard Worker DIASession::findOneSourceFile(const PDBSymbolCompiland *Compiland,
227*9880d681SAndroid Build Coastguard Worker                               llvm::StringRef Pattern,
228*9880d681SAndroid Build Coastguard Worker                               PDB_NameSearchFlags Flags) const {
229*9880d681SAndroid Build Coastguard Worker   auto SourceFiles = findSourceFiles(Compiland, Pattern, Flags);
230*9880d681SAndroid Build Coastguard Worker   if (!SourceFiles || SourceFiles->getChildCount() == 0)
231*9880d681SAndroid Build Coastguard Worker     return nullptr;
232*9880d681SAndroid Build Coastguard Worker   return SourceFiles->getNext();
233*9880d681SAndroid Build Coastguard Worker }
234*9880d681SAndroid Build Coastguard Worker 
235*9880d681SAndroid Build Coastguard Worker std::unique_ptr<IPDBEnumChildren<PDBSymbolCompiland>>
findCompilandsForSourceFile(llvm::StringRef Pattern,PDB_NameSearchFlags Flags) const236*9880d681SAndroid Build Coastguard Worker DIASession::findCompilandsForSourceFile(llvm::StringRef Pattern,
237*9880d681SAndroid Build Coastguard Worker                                         PDB_NameSearchFlags Flags) const {
238*9880d681SAndroid Build Coastguard Worker   auto File = findOneSourceFile(nullptr, Pattern, Flags);
239*9880d681SAndroid Build Coastguard Worker   if (!File)
240*9880d681SAndroid Build Coastguard Worker     return nullptr;
241*9880d681SAndroid Build Coastguard Worker   return File->getCompilands();
242*9880d681SAndroid Build Coastguard Worker }
243*9880d681SAndroid Build Coastguard Worker 
244*9880d681SAndroid Build Coastguard Worker std::unique_ptr<PDBSymbolCompiland>
findOneCompilandForSourceFile(llvm::StringRef Pattern,PDB_NameSearchFlags Flags) const245*9880d681SAndroid Build Coastguard Worker DIASession::findOneCompilandForSourceFile(llvm::StringRef Pattern,
246*9880d681SAndroid Build Coastguard Worker                                           PDB_NameSearchFlags Flags) const {
247*9880d681SAndroid Build Coastguard Worker   auto Compilands = findCompilandsForSourceFile(Pattern, Flags);
248*9880d681SAndroid Build Coastguard Worker   if (!Compilands || Compilands->getChildCount() == 0)
249*9880d681SAndroid Build Coastguard Worker     return nullptr;
250*9880d681SAndroid Build Coastguard Worker   return Compilands->getNext();
251*9880d681SAndroid Build Coastguard Worker }
252*9880d681SAndroid Build Coastguard Worker 
getAllSourceFiles() const253*9880d681SAndroid Build Coastguard Worker std::unique_ptr<IPDBEnumSourceFiles> DIASession::getAllSourceFiles() const {
254*9880d681SAndroid Build Coastguard Worker   CComPtr<IDiaEnumSourceFiles> Files;
255*9880d681SAndroid Build Coastguard Worker   if (S_OK != Session->findFile(nullptr, nullptr, nsNone, &Files))
256*9880d681SAndroid Build Coastguard Worker     return nullptr;
257*9880d681SAndroid Build Coastguard Worker 
258*9880d681SAndroid Build Coastguard Worker   return llvm::make_unique<DIAEnumSourceFiles>(*this, Files);
259*9880d681SAndroid Build Coastguard Worker }
260*9880d681SAndroid Build Coastguard Worker 
getSourceFilesForCompiland(const PDBSymbolCompiland & Compiland) const261*9880d681SAndroid Build Coastguard Worker std::unique_ptr<IPDBEnumSourceFiles> DIASession::getSourceFilesForCompiland(
262*9880d681SAndroid Build Coastguard Worker     const PDBSymbolCompiland &Compiland) const {
263*9880d681SAndroid Build Coastguard Worker   CComPtr<IDiaEnumSourceFiles> Files;
264*9880d681SAndroid Build Coastguard Worker 
265*9880d681SAndroid Build Coastguard Worker   const DIARawSymbol &RawSymbol =
266*9880d681SAndroid Build Coastguard Worker       static_cast<const DIARawSymbol &>(Compiland.getRawSymbol());
267*9880d681SAndroid Build Coastguard Worker   if (S_OK !=
268*9880d681SAndroid Build Coastguard Worker       Session->findFile(RawSymbol.getDiaSymbol(), nullptr, nsNone, &Files))
269*9880d681SAndroid Build Coastguard Worker     return nullptr;
270*9880d681SAndroid Build Coastguard Worker 
271*9880d681SAndroid Build Coastguard Worker   return llvm::make_unique<DIAEnumSourceFiles>(*this, Files);
272*9880d681SAndroid Build Coastguard Worker }
273*9880d681SAndroid Build Coastguard Worker 
274*9880d681SAndroid Build Coastguard Worker std::unique_ptr<IPDBSourceFile>
getSourceFileById(uint32_t FileId) const275*9880d681SAndroid Build Coastguard Worker DIASession::getSourceFileById(uint32_t FileId) const {
276*9880d681SAndroid Build Coastguard Worker   CComPtr<IDiaSourceFile> LocatedFile;
277*9880d681SAndroid Build Coastguard Worker   if (S_OK != Session->findFileById(FileId, &LocatedFile))
278*9880d681SAndroid Build Coastguard Worker     return nullptr;
279*9880d681SAndroid Build Coastguard Worker 
280*9880d681SAndroid Build Coastguard Worker   return llvm::make_unique<DIASourceFile>(*this, LocatedFile);
281*9880d681SAndroid Build Coastguard Worker }
282*9880d681SAndroid Build Coastguard Worker 
getDebugStreams() const283*9880d681SAndroid Build Coastguard Worker std::unique_ptr<IPDBEnumDataStreams> DIASession::getDebugStreams() const {
284*9880d681SAndroid Build Coastguard Worker   CComPtr<IDiaEnumDebugStreams> DiaEnumerator;
285*9880d681SAndroid Build Coastguard Worker   if (S_OK != Session->getEnumDebugStreams(&DiaEnumerator))
286*9880d681SAndroid Build Coastguard Worker     return nullptr;
287*9880d681SAndroid Build Coastguard Worker 
288*9880d681SAndroid Build Coastguard Worker   return llvm::make_unique<DIAEnumDebugStreams>(DiaEnumerator);
289*9880d681SAndroid Build Coastguard Worker }
290