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