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