16b6b8c4fSAdrian McCarthy //===- NativeSession.cpp - Native implementation of IPDBSession -*- C++ -*-===// 26b6b8c4fSAdrian McCarthy // 36b6b8c4fSAdrian McCarthy // The LLVM Compiler Infrastructure 46b6b8c4fSAdrian McCarthy // 56b6b8c4fSAdrian McCarthy // This file is distributed under the University of Illinois Open Source 66b6b8c4fSAdrian McCarthy // License. See LICENSE.TXT for details. 76b6b8c4fSAdrian McCarthy // 86b6b8c4fSAdrian McCarthy //===----------------------------------------------------------------------===// 96b6b8c4fSAdrian McCarthy 106b6b8c4fSAdrian McCarthy #include "llvm/DebugInfo/PDB/Native/NativeSession.h" 116b6b8c4fSAdrian McCarthy 126b6b8c4fSAdrian McCarthy #include "llvm/ADT/STLExtras.h" 138d090fc5SAdrian McCarthy #include "llvm/DebugInfo/CodeView/TypeIndex.h" 146b6b8c4fSAdrian McCarthy #include "llvm/DebugInfo/PDB/IPDBEnumChildren.h" 156b6b8c4fSAdrian McCarthy #include "llvm/DebugInfo/PDB/IPDBSourceFile.h" 16bf0afc32SAdrian McCarthy #include "llvm/DebugInfo/PDB/Native/NativeCompilandSymbol.h" 17b41f03e7SAdrian McCarthy #include "llvm/DebugInfo/PDB/Native/NativeEnumTypes.h" 184d93d66dSAdrian McCarthy #include "llvm/DebugInfo/PDB/Native/NativeExeSymbol.h" 19*5d629966SZachary Turner #include "llvm/DebugInfo/PDB/Native/NativeTypeBuiltin.h" 20*5d629966SZachary Turner #include "llvm/DebugInfo/PDB/Native/NativeTypeEnum.h" 216b6b8c4fSAdrian McCarthy #include "llvm/DebugInfo/PDB/Native/PDBFile.h" 226b6b8c4fSAdrian McCarthy #include "llvm/DebugInfo/PDB/Native/RawError.h" 238ab7dd60SZachary Turner #include "llvm/DebugInfo/PDB/Native/SymbolCache.h" 24b41f03e7SAdrian McCarthy #include "llvm/DebugInfo/PDB/Native/TpiStream.h" 256b6b8c4fSAdrian McCarthy #include "llvm/DebugInfo/PDB/PDBSymbolCompiland.h" 266b6b8c4fSAdrian McCarthy #include "llvm/DebugInfo/PDB/PDBSymbolExe.h" 27b41f03e7SAdrian McCarthy #include "llvm/DebugInfo/PDB/PDBSymbolTypeEnum.h" 286b6b8c4fSAdrian McCarthy #include "llvm/Support/Allocator.h" 29d9dc2829SZachary Turner #include "llvm/Support/BinaryByteStream.h" 306b6b8c4fSAdrian McCarthy #include "llvm/Support/Error.h" 316b6b8c4fSAdrian McCarthy #include "llvm/Support/ErrorOr.h" 326b6b8c4fSAdrian McCarthy #include "llvm/Support/MemoryBuffer.h" 33bf0afc32SAdrian McCarthy 346b6b8c4fSAdrian McCarthy #include <algorithm> 35b41f03e7SAdrian McCarthy #include <cassert> 366b6b8c4fSAdrian McCarthy #include <memory> 37bf0afc32SAdrian McCarthy #include <utility> 386b6b8c4fSAdrian McCarthy 396b6b8c4fSAdrian McCarthy using namespace llvm; 406b6b8c4fSAdrian McCarthy using namespace llvm::msf; 416b6b8c4fSAdrian McCarthy using namespace llvm::pdb; 426b6b8c4fSAdrian McCarthy 438ab7dd60SZachary Turner static DbiStream *getDbiStreamPtr(PDBFile &File) { 448ab7dd60SZachary Turner Expected<DbiStream &> DbiS = File.getPDBDbiStream(); 458ab7dd60SZachary Turner if (DbiS) 468ab7dd60SZachary Turner return &DbiS.get(); 478ab7dd60SZachary Turner 488ab7dd60SZachary Turner consumeError(DbiS.takeError()); 498ab7dd60SZachary Turner return nullptr; 508ab7dd60SZachary Turner } 518d090fc5SAdrian McCarthy 526b6b8c4fSAdrian McCarthy NativeSession::NativeSession(std::unique_ptr<PDBFile> PdbFile, 536b6b8c4fSAdrian McCarthy std::unique_ptr<BumpPtrAllocator> Allocator) 548ab7dd60SZachary Turner : Pdb(std::move(PdbFile)), Allocator(std::move(Allocator)), 558ab7dd60SZachary Turner Cache(*this, getDbiStreamPtr(*Pdb)) {} 566b6b8c4fSAdrian McCarthy 576b6b8c4fSAdrian McCarthy NativeSession::~NativeSession() = default; 586b6b8c4fSAdrian McCarthy 5975257bc2SPeter Collingbourne Error NativeSession::createFromPdb(std::unique_ptr<MemoryBuffer> Buffer, 606b6b8c4fSAdrian McCarthy std::unique_ptr<IPDBSession> &Session) { 6175257bc2SPeter Collingbourne StringRef Path = Buffer->getBufferIdentifier(); 62695ed56bSZachary Turner auto Stream = llvm::make_unique<MemoryBufferByteStream>( 63695ed56bSZachary Turner std::move(Buffer), llvm::support::little); 646b6b8c4fSAdrian McCarthy 656b6b8c4fSAdrian McCarthy auto Allocator = llvm::make_unique<BumpPtrAllocator>(); 667b327d05SZachary Turner auto File = llvm::make_unique<PDBFile>(Path, std::move(Stream), *Allocator); 676b6b8c4fSAdrian McCarthy if (auto EC = File->parseFileHeaders()) 686b6b8c4fSAdrian McCarthy return EC; 696b6b8c4fSAdrian McCarthy if (auto EC = File->parseStreamData()) 706b6b8c4fSAdrian McCarthy return EC; 716b6b8c4fSAdrian McCarthy 726b6b8c4fSAdrian McCarthy Session = 736b6b8c4fSAdrian McCarthy llvm::make_unique<NativeSession>(std::move(File), std::move(Allocator)); 746b6b8c4fSAdrian McCarthy 756b6b8c4fSAdrian McCarthy return Error::success(); 766b6b8c4fSAdrian McCarthy } 776b6b8c4fSAdrian McCarthy 786b6b8c4fSAdrian McCarthy Error NativeSession::createFromExe(StringRef Path, 796b6b8c4fSAdrian McCarthy std::unique_ptr<IPDBSession> &Session) { 806b6b8c4fSAdrian McCarthy return make_error<RawError>(raw_error_code::feature_unsupported); 816b6b8c4fSAdrian McCarthy } 826b6b8c4fSAdrian McCarthy 836b6b8c4fSAdrian McCarthy uint64_t NativeSession::getLoadAddress() const { return 0; } 846b6b8c4fSAdrian McCarthy 8589a19ac3SAaron Smith bool NativeSession::setLoadAddress(uint64_t Address) { return false; } 866b6b8c4fSAdrian McCarthy 876a4b080aSAdrian McCarthy std::unique_ptr<PDBSymbolExe> NativeSession::getGlobalScope() { 887999b4faSZachary Turner return PDBSymbol::createAs<PDBSymbolExe>(*this, getNativeGlobalScope()); 896b6b8c4fSAdrian McCarthy } 906b6b8c4fSAdrian McCarthy 916b6b8c4fSAdrian McCarthy std::unique_ptr<PDBSymbol> 926b6b8c4fSAdrian McCarthy NativeSession::getSymbolById(uint32_t SymbolId) const { 938ab7dd60SZachary Turner return Cache.getSymbolById(SymbolId); 946b6b8c4fSAdrian McCarthy } 956b6b8c4fSAdrian McCarthy 9653708a5eSAaron Smith bool NativeSession::addressForVA(uint64_t VA, uint32_t &Section, 9753708a5eSAaron Smith uint32_t &Offset) const { 9853708a5eSAaron Smith return false; 9953708a5eSAaron Smith } 10053708a5eSAaron Smith 10153708a5eSAaron Smith bool NativeSession::addressForRVA(uint32_t VA, uint32_t &Section, 10253708a5eSAaron Smith uint32_t &Offset) const { 10353708a5eSAaron Smith return false; 10453708a5eSAaron Smith } 10553708a5eSAaron Smith 1066b6b8c4fSAdrian McCarthy std::unique_ptr<PDBSymbol> 1076b6b8c4fSAdrian McCarthy NativeSession::findSymbolByAddress(uint64_t Address, PDB_SymType Type) const { 1086b6b8c4fSAdrian McCarthy return nullptr; 1096b6b8c4fSAdrian McCarthy } 1106b6b8c4fSAdrian McCarthy 1113dca0bedSAaron Smith std::unique_ptr<PDBSymbol> 1123dca0bedSAaron Smith NativeSession::findSymbolByRVA(uint32_t RVA, PDB_SymType Type) const { 1133dca0bedSAaron Smith return nullptr; 1143dca0bedSAaron Smith } 1153dca0bedSAaron Smith 1163dca0bedSAaron Smith std::unique_ptr<PDBSymbol> 1173dca0bedSAaron Smith NativeSession::findSymbolBySectOffset(uint32_t Sect, uint32_t Offset, 1183dca0bedSAaron Smith PDB_SymType Type) const { 1193dca0bedSAaron Smith return nullptr; 1203dca0bedSAaron Smith } 1213dca0bedSAaron Smith 1226b6b8c4fSAdrian McCarthy std::unique_ptr<IPDBEnumLineNumbers> 1236b6b8c4fSAdrian McCarthy NativeSession::findLineNumbers(const PDBSymbolCompiland &Compiland, 1246b6b8c4fSAdrian McCarthy const IPDBSourceFile &File) const { 1256b6b8c4fSAdrian McCarthy return nullptr; 1266b6b8c4fSAdrian McCarthy } 1276b6b8c4fSAdrian McCarthy 1286b6b8c4fSAdrian McCarthy std::unique_ptr<IPDBEnumLineNumbers> 1296b6b8c4fSAdrian McCarthy NativeSession::findLineNumbersByAddress(uint64_t Address, 1306b6b8c4fSAdrian McCarthy uint32_t Length) const { 1316b6b8c4fSAdrian McCarthy return nullptr; 1326b6b8c4fSAdrian McCarthy } 1336b6b8c4fSAdrian McCarthy 13440198f59SAaron Smith std::unique_ptr<IPDBEnumLineNumbers> 135ed81a9dbSAaron Smith NativeSession::findLineNumbersByRVA(uint32_t RVA, uint32_t Length) const { 136ed81a9dbSAaron Smith return nullptr; 137ed81a9dbSAaron Smith } 138ed81a9dbSAaron Smith 139ed81a9dbSAaron Smith std::unique_ptr<IPDBEnumLineNumbers> 14040198f59SAaron Smith NativeSession::findLineNumbersBySectOffset(uint32_t Section, uint32_t Offset, 14140198f59SAaron Smith uint32_t Length) const { 14240198f59SAaron Smith return nullptr; 14340198f59SAaron Smith } 14440198f59SAaron Smith 1456b6b8c4fSAdrian McCarthy std::unique_ptr<IPDBEnumSourceFiles> 1466b6b8c4fSAdrian McCarthy NativeSession::findSourceFiles(const PDBSymbolCompiland *Compiland, 1476b6b8c4fSAdrian McCarthy StringRef Pattern, 1486b6b8c4fSAdrian McCarthy PDB_NameSearchFlags Flags) const { 1496b6b8c4fSAdrian McCarthy return nullptr; 1506b6b8c4fSAdrian McCarthy } 1516b6b8c4fSAdrian McCarthy 1526b6b8c4fSAdrian McCarthy std::unique_ptr<IPDBSourceFile> 1536b6b8c4fSAdrian McCarthy NativeSession::findOneSourceFile(const PDBSymbolCompiland *Compiland, 1546b6b8c4fSAdrian McCarthy StringRef Pattern, 1556b6b8c4fSAdrian McCarthy PDB_NameSearchFlags Flags) const { 1566b6b8c4fSAdrian McCarthy return nullptr; 1576b6b8c4fSAdrian McCarthy } 1586b6b8c4fSAdrian McCarthy 1596b6b8c4fSAdrian McCarthy std::unique_ptr<IPDBEnumChildren<PDBSymbolCompiland>> 1606b6b8c4fSAdrian McCarthy NativeSession::findCompilandsForSourceFile(StringRef Pattern, 1616b6b8c4fSAdrian McCarthy PDB_NameSearchFlags Flags) const { 1626b6b8c4fSAdrian McCarthy return nullptr; 1636b6b8c4fSAdrian McCarthy } 1646b6b8c4fSAdrian McCarthy 1656b6b8c4fSAdrian McCarthy std::unique_ptr<PDBSymbolCompiland> 1666b6b8c4fSAdrian McCarthy NativeSession::findOneCompilandForSourceFile(StringRef Pattern, 1676b6b8c4fSAdrian McCarthy PDB_NameSearchFlags Flags) const { 1686b6b8c4fSAdrian McCarthy return nullptr; 1696b6b8c4fSAdrian McCarthy } 1706b6b8c4fSAdrian McCarthy 1716b6b8c4fSAdrian McCarthy std::unique_ptr<IPDBEnumSourceFiles> NativeSession::getAllSourceFiles() const { 1726b6b8c4fSAdrian McCarthy return nullptr; 1736b6b8c4fSAdrian McCarthy } 1746b6b8c4fSAdrian McCarthy 1756b6b8c4fSAdrian McCarthy std::unique_ptr<IPDBEnumSourceFiles> NativeSession::getSourceFilesForCompiland( 1766b6b8c4fSAdrian McCarthy const PDBSymbolCompiland &Compiland) const { 1776b6b8c4fSAdrian McCarthy return nullptr; 1786b6b8c4fSAdrian McCarthy } 1796b6b8c4fSAdrian McCarthy 1806b6b8c4fSAdrian McCarthy std::unique_ptr<IPDBSourceFile> 1816b6b8c4fSAdrian McCarthy NativeSession::getSourceFileById(uint32_t FileId) const { 1826b6b8c4fSAdrian McCarthy return nullptr; 1836b6b8c4fSAdrian McCarthy } 1846b6b8c4fSAdrian McCarthy 1856b6b8c4fSAdrian McCarthy std::unique_ptr<IPDBEnumDataStreams> NativeSession::getDebugStreams() const { 1866b6b8c4fSAdrian McCarthy return nullptr; 1876b6b8c4fSAdrian McCarthy } 18889bca9e5SAaron Smith 18989bca9e5SAaron Smith std::unique_ptr<IPDBEnumTables> NativeSession::getEnumTables() const { 19089bca9e5SAaron Smith return nullptr; 19189bca9e5SAaron Smith } 192679aeaddSZachary Turner 193679aeaddSZachary Turner std::unique_ptr<IPDBEnumInjectedSources> 194679aeaddSZachary Turner NativeSession::getInjectedSources() const { 195679aeaddSZachary Turner return nullptr; 196679aeaddSZachary Turner } 197523de05aSAaron Smith 198523de05aSAaron Smith std::unique_ptr<IPDBEnumSectionContribs> 199523de05aSAaron Smith NativeSession::getSectionContribs() const { 200523de05aSAaron Smith return nullptr; 201523de05aSAaron Smith } 2027999b4faSZachary Turner 2038ab7dd60SZachary Turner void NativeSession::initializeExeSymbol() { 2048ab7dd60SZachary Turner if (ExeSymbol == 0) 2058ab7dd60SZachary Turner ExeSymbol = Cache.createSymbol<NativeExeSymbol>(); 2067999b4faSZachary Turner } 2078ab7dd60SZachary Turner 2088ab7dd60SZachary Turner NativeExeSymbol &NativeSession::getNativeGlobalScope() const { 2098ab7dd60SZachary Turner const_cast<NativeSession &>(*this).initializeExeSymbol(); 2108ab7dd60SZachary Turner 2118ab7dd60SZachary Turner return Cache.getNativeSymbolById<NativeExeSymbol>(ExeSymbol); 2127999b4faSZachary Turner } 213