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" 136b6b8c4fSAdrian McCarthy #include "llvm/DebugInfo/MSF/ByteStream.h" 146b6b8c4fSAdrian McCarthy #include "llvm/DebugInfo/PDB/GenericError.h" 156b6b8c4fSAdrian McCarthy #include "llvm/DebugInfo/PDB/IPDBEnumChildren.h" 166b6b8c4fSAdrian McCarthy #include "llvm/DebugInfo/PDB/IPDBSourceFile.h" 176b6b8c4fSAdrian McCarthy #include "llvm/DebugInfo/PDB/Native/PDBFile.h" 186b6b8c4fSAdrian McCarthy #include "llvm/DebugInfo/PDB/Native/RawError.h" 196b6b8c4fSAdrian McCarthy #include "llvm/DebugInfo/PDB/PDBSymbolCompiland.h" 206b6b8c4fSAdrian McCarthy #include "llvm/DebugInfo/PDB/PDBSymbolExe.h" 216b6b8c4fSAdrian McCarthy #include "llvm/Support/Allocator.h" 226b6b8c4fSAdrian McCarthy #include "llvm/Support/Error.h" 236b6b8c4fSAdrian McCarthy #include "llvm/Support/ErrorOr.h" 246b6b8c4fSAdrian McCarthy #include "llvm/Support/MemoryBuffer.h" 256b6b8c4fSAdrian McCarthy #include <algorithm> 266b6b8c4fSAdrian McCarthy #include <memory> 276b6b8c4fSAdrian McCarthy 286b6b8c4fSAdrian McCarthy using namespace llvm; 296b6b8c4fSAdrian McCarthy using namespace llvm::msf; 306b6b8c4fSAdrian McCarthy using namespace llvm::pdb; 316b6b8c4fSAdrian McCarthy 326b6b8c4fSAdrian McCarthy NativeSession::NativeSession(std::unique_ptr<PDBFile> PdbFile, 336b6b8c4fSAdrian McCarthy std::unique_ptr<BumpPtrAllocator> Allocator) 346b6b8c4fSAdrian McCarthy : Pdb(std::move(PdbFile)), Allocator(std::move(Allocator)) {} 356b6b8c4fSAdrian McCarthy 366b6b8c4fSAdrian McCarthy NativeSession::~NativeSession() = default; 376b6b8c4fSAdrian McCarthy 386b6b8c4fSAdrian McCarthy Error NativeSession::createFromPdb(StringRef Path, 396b6b8c4fSAdrian McCarthy std::unique_ptr<IPDBSession> &Session) { 406b6b8c4fSAdrian McCarthy ErrorOr<std::unique_ptr<MemoryBuffer>> ErrorOrBuffer = 416b6b8c4fSAdrian McCarthy MemoryBuffer::getFileOrSTDIN(Path, /*FileSize=*/-1, 426b6b8c4fSAdrian McCarthy /*RequiresNullTerminator=*/false); 436b6b8c4fSAdrian McCarthy if (!ErrorOrBuffer) 446b6b8c4fSAdrian McCarthy return make_error<GenericError>(generic_error_code::invalid_path); 456b6b8c4fSAdrian McCarthy 466b6b8c4fSAdrian McCarthy std::unique_ptr<MemoryBuffer> Buffer = std::move(*ErrorOrBuffer); 476b6b8c4fSAdrian McCarthy auto Stream = llvm::make_unique<MemoryBufferByteStream>(std::move(Buffer)); 486b6b8c4fSAdrian McCarthy 496b6b8c4fSAdrian McCarthy auto Allocator = llvm::make_unique<BumpPtrAllocator>(); 50*7b327d05SZachary Turner auto File = llvm::make_unique<PDBFile>(Path, std::move(Stream), *Allocator); 516b6b8c4fSAdrian McCarthy if (auto EC = File->parseFileHeaders()) 526b6b8c4fSAdrian McCarthy return EC; 536b6b8c4fSAdrian McCarthy if (auto EC = File->parseStreamData()) 546b6b8c4fSAdrian McCarthy return EC; 556b6b8c4fSAdrian McCarthy 566b6b8c4fSAdrian McCarthy Session = 576b6b8c4fSAdrian McCarthy llvm::make_unique<NativeSession>(std::move(File), std::move(Allocator)); 586b6b8c4fSAdrian McCarthy 596b6b8c4fSAdrian McCarthy return Error::success(); 606b6b8c4fSAdrian McCarthy } 616b6b8c4fSAdrian McCarthy 626b6b8c4fSAdrian McCarthy Error NativeSession::createFromExe(StringRef Path, 636b6b8c4fSAdrian McCarthy std::unique_ptr<IPDBSession> &Session) { 646b6b8c4fSAdrian McCarthy return make_error<RawError>(raw_error_code::feature_unsupported); 656b6b8c4fSAdrian McCarthy } 666b6b8c4fSAdrian McCarthy 676b6b8c4fSAdrian McCarthy uint64_t NativeSession::getLoadAddress() const { return 0; } 686b6b8c4fSAdrian McCarthy 696b6b8c4fSAdrian McCarthy void NativeSession::setLoadAddress(uint64_t Address) {} 706b6b8c4fSAdrian McCarthy 716b6b8c4fSAdrian McCarthy std::unique_ptr<PDBSymbolExe> NativeSession::getGlobalScope() const { 726b6b8c4fSAdrian McCarthy return nullptr; 736b6b8c4fSAdrian McCarthy } 746b6b8c4fSAdrian McCarthy 756b6b8c4fSAdrian McCarthy std::unique_ptr<PDBSymbol> 766b6b8c4fSAdrian McCarthy NativeSession::getSymbolById(uint32_t SymbolId) const { 776b6b8c4fSAdrian McCarthy return nullptr; 786b6b8c4fSAdrian McCarthy } 796b6b8c4fSAdrian McCarthy 806b6b8c4fSAdrian McCarthy std::unique_ptr<PDBSymbol> 816b6b8c4fSAdrian McCarthy NativeSession::findSymbolByAddress(uint64_t Address, PDB_SymType Type) const { 826b6b8c4fSAdrian McCarthy return nullptr; 836b6b8c4fSAdrian McCarthy } 846b6b8c4fSAdrian McCarthy 856b6b8c4fSAdrian McCarthy std::unique_ptr<IPDBEnumLineNumbers> 866b6b8c4fSAdrian McCarthy NativeSession::findLineNumbers(const PDBSymbolCompiland &Compiland, 876b6b8c4fSAdrian McCarthy const IPDBSourceFile &File) const { 886b6b8c4fSAdrian McCarthy return nullptr; 896b6b8c4fSAdrian McCarthy } 906b6b8c4fSAdrian McCarthy 916b6b8c4fSAdrian McCarthy std::unique_ptr<IPDBEnumLineNumbers> 926b6b8c4fSAdrian McCarthy NativeSession::findLineNumbersByAddress(uint64_t Address, 936b6b8c4fSAdrian McCarthy uint32_t Length) const { 946b6b8c4fSAdrian McCarthy return nullptr; 956b6b8c4fSAdrian McCarthy } 966b6b8c4fSAdrian McCarthy 976b6b8c4fSAdrian McCarthy std::unique_ptr<IPDBEnumSourceFiles> 986b6b8c4fSAdrian McCarthy NativeSession::findSourceFiles(const PDBSymbolCompiland *Compiland, 996b6b8c4fSAdrian McCarthy StringRef Pattern, 1006b6b8c4fSAdrian McCarthy PDB_NameSearchFlags Flags) const { 1016b6b8c4fSAdrian McCarthy return nullptr; 1026b6b8c4fSAdrian McCarthy } 1036b6b8c4fSAdrian McCarthy 1046b6b8c4fSAdrian McCarthy std::unique_ptr<IPDBSourceFile> 1056b6b8c4fSAdrian McCarthy NativeSession::findOneSourceFile(const PDBSymbolCompiland *Compiland, 1066b6b8c4fSAdrian McCarthy StringRef Pattern, 1076b6b8c4fSAdrian McCarthy PDB_NameSearchFlags Flags) const { 1086b6b8c4fSAdrian McCarthy return nullptr; 1096b6b8c4fSAdrian McCarthy } 1106b6b8c4fSAdrian McCarthy 1116b6b8c4fSAdrian McCarthy std::unique_ptr<IPDBEnumChildren<PDBSymbolCompiland>> 1126b6b8c4fSAdrian McCarthy NativeSession::findCompilandsForSourceFile(StringRef Pattern, 1136b6b8c4fSAdrian McCarthy PDB_NameSearchFlags Flags) const { 1146b6b8c4fSAdrian McCarthy return nullptr; 1156b6b8c4fSAdrian McCarthy } 1166b6b8c4fSAdrian McCarthy 1176b6b8c4fSAdrian McCarthy std::unique_ptr<PDBSymbolCompiland> 1186b6b8c4fSAdrian McCarthy NativeSession::findOneCompilandForSourceFile(StringRef Pattern, 1196b6b8c4fSAdrian McCarthy PDB_NameSearchFlags Flags) const { 1206b6b8c4fSAdrian McCarthy return nullptr; 1216b6b8c4fSAdrian McCarthy } 1226b6b8c4fSAdrian McCarthy 1236b6b8c4fSAdrian McCarthy std::unique_ptr<IPDBEnumSourceFiles> NativeSession::getAllSourceFiles() const { 1246b6b8c4fSAdrian McCarthy return nullptr; 1256b6b8c4fSAdrian McCarthy } 1266b6b8c4fSAdrian McCarthy 1276b6b8c4fSAdrian McCarthy std::unique_ptr<IPDBEnumSourceFiles> NativeSession::getSourceFilesForCompiland( 1286b6b8c4fSAdrian McCarthy const PDBSymbolCompiland &Compiland) const { 1296b6b8c4fSAdrian McCarthy return nullptr; 1306b6b8c4fSAdrian McCarthy } 1316b6b8c4fSAdrian McCarthy 1326b6b8c4fSAdrian McCarthy std::unique_ptr<IPDBSourceFile> 1336b6b8c4fSAdrian McCarthy NativeSession::getSourceFileById(uint32_t FileId) const { 1346b6b8c4fSAdrian McCarthy return nullptr; 1356b6b8c4fSAdrian McCarthy } 1366b6b8c4fSAdrian McCarthy 1376b6b8c4fSAdrian McCarthy std::unique_ptr<IPDBEnumDataStreams> NativeSession::getDebugStreams() const { 1386b6b8c4fSAdrian McCarthy return nullptr; 1396b6b8c4fSAdrian McCarthy } 140