16b6b8c4fSAdrian McCarthy //===- NativeSession.cpp - Native implementation of IPDBSession -*- C++ -*-===//
26b6b8c4fSAdrian McCarthy //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
66b6b8c4fSAdrian McCarthy //
76b6b8c4fSAdrian McCarthy //===----------------------------------------------------------------------===//
86b6b8c4fSAdrian McCarthy 
96b6b8c4fSAdrian McCarthy #include "llvm/DebugInfo/PDB/Native/NativeSession.h"
106b6b8c4fSAdrian McCarthy 
116b6b8c4fSAdrian McCarthy #include "llvm/ADT/STLExtras.h"
128d090fc5SAdrian McCarthy #include "llvm/DebugInfo/CodeView/TypeIndex.h"
136b6b8c4fSAdrian McCarthy #include "llvm/DebugInfo/PDB/IPDBEnumChildren.h"
146b6b8c4fSAdrian McCarthy #include "llvm/DebugInfo/PDB/IPDBSourceFile.h"
15bf0afc32SAdrian McCarthy #include "llvm/DebugInfo/PDB/Native/NativeCompilandSymbol.h"
16*d100b5ddSNico Weber #include "llvm/DebugInfo/PDB/Native/NativeEnumInjectedSources.h"
17b41f03e7SAdrian McCarthy #include "llvm/DebugInfo/PDB/Native/NativeEnumTypes.h"
184d93d66dSAdrian McCarthy #include "llvm/DebugInfo/PDB/Native/NativeExeSymbol.h"
195d629966SZachary Turner #include "llvm/DebugInfo/PDB/Native/NativeTypeBuiltin.h"
205d629966SZachary 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>
92cae73458SZachary Turner NativeSession::getSymbolById(SymIndexId 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 {
195*d100b5ddSNico Weber   auto ISS = Pdb->getInjectedSourceStream();
196*d100b5ddSNico Weber   if (!ISS) {
197*d100b5ddSNico Weber     consumeError(ISS.takeError());
198679aeaddSZachary Turner     return nullptr;
199679aeaddSZachary Turner   }
200*d100b5ddSNico Weber   auto Strings = Pdb->getStringTable();
201*d100b5ddSNico Weber   if (!Strings) {
202*d100b5ddSNico Weber     consumeError(Strings.takeError());
203*d100b5ddSNico Weber     return nullptr;
204*d100b5ddSNico Weber   }
205*d100b5ddSNico Weber   return make_unique<NativeEnumInjectedSources>(*Pdb, *ISS, *Strings);
206*d100b5ddSNico Weber }
207523de05aSAaron Smith 
208523de05aSAaron Smith std::unique_ptr<IPDBEnumSectionContribs>
209523de05aSAaron Smith NativeSession::getSectionContribs() const {
210523de05aSAaron Smith   return nullptr;
211523de05aSAaron Smith }
2127999b4faSZachary Turner 
213c43e086cSAleksandr Urakov std::unique_ptr<IPDBEnumFrameData>
214c43e086cSAleksandr Urakov NativeSession::getFrameData() const {
215c43e086cSAleksandr Urakov   return nullptr;
216c43e086cSAleksandr Urakov }
217c43e086cSAleksandr Urakov 
2188ab7dd60SZachary Turner void NativeSession::initializeExeSymbol() {
2198ab7dd60SZachary Turner   if (ExeSymbol == 0)
2208ab7dd60SZachary Turner     ExeSymbol = Cache.createSymbol<NativeExeSymbol>();
2217999b4faSZachary Turner }
2228ab7dd60SZachary Turner 
2238ab7dd60SZachary Turner NativeExeSymbol &NativeSession::getNativeGlobalScope() const {
2248ab7dd60SZachary Turner   const_cast<NativeSession &>(*this).initializeExeSymbol();
2258ab7dd60SZachary Turner 
2268ab7dd60SZachary Turner   return Cache.getNativeSymbolById<NativeExeSymbol>(ExeSymbol);
2277999b4faSZachary Turner }
228