17a7e6055SDimitry Andric //===- NativeSession.cpp - Native implementation of IPDBSession -*- C++ -*-===//
27a7e6055SDimitry Andric //
37a7e6055SDimitry Andric //                     The LLVM Compiler Infrastructure
47a7e6055SDimitry Andric //
57a7e6055SDimitry Andric // This file is distributed under the University of Illinois Open Source
67a7e6055SDimitry Andric // License. See LICENSE.TXT for details.
77a7e6055SDimitry Andric //
87a7e6055SDimitry Andric //===----------------------------------------------------------------------===//
97a7e6055SDimitry Andric 
107a7e6055SDimitry Andric #include "llvm/DebugInfo/PDB/Native/NativeSession.h"
117a7e6055SDimitry Andric 
127a7e6055SDimitry Andric #include "llvm/ADT/STLExtras.h"
13c4394386SDimitry Andric #include "llvm/DebugInfo/CodeView/TypeIndex.h"
147a7e6055SDimitry Andric #include "llvm/DebugInfo/PDB/IPDBEnumChildren.h"
157a7e6055SDimitry Andric #include "llvm/DebugInfo/PDB/IPDBSourceFile.h"
16a580b014SDimitry Andric #include "llvm/DebugInfo/PDB/Native/NativeCompilandSymbol.h"
172cab237bSDimitry Andric #include "llvm/DebugInfo/PDB/Native/NativeEnumTypes.h"
187a7e6055SDimitry Andric #include "llvm/DebugInfo/PDB/Native/NativeExeSymbol.h"
19*b5893f02SDimitry Andric #include "llvm/DebugInfo/PDB/Native/NativeTypeBuiltin.h"
20*b5893f02SDimitry Andric #include "llvm/DebugInfo/PDB/Native/NativeTypeEnum.h"
217a7e6055SDimitry Andric #include "llvm/DebugInfo/PDB/Native/PDBFile.h"
227a7e6055SDimitry Andric #include "llvm/DebugInfo/PDB/Native/RawError.h"
23*b5893f02SDimitry Andric #include "llvm/DebugInfo/PDB/Native/SymbolCache.h"
242cab237bSDimitry Andric #include "llvm/DebugInfo/PDB/Native/TpiStream.h"
257a7e6055SDimitry Andric #include "llvm/DebugInfo/PDB/PDBSymbolCompiland.h"
267a7e6055SDimitry Andric #include "llvm/DebugInfo/PDB/PDBSymbolExe.h"
272cab237bSDimitry Andric #include "llvm/DebugInfo/PDB/PDBSymbolTypeEnum.h"
287a7e6055SDimitry Andric #include "llvm/Support/Allocator.h"
297a7e6055SDimitry Andric #include "llvm/Support/BinaryByteStream.h"
307a7e6055SDimitry Andric #include "llvm/Support/Error.h"
317a7e6055SDimitry Andric #include "llvm/Support/ErrorOr.h"
327a7e6055SDimitry Andric #include "llvm/Support/MemoryBuffer.h"
33a580b014SDimitry Andric 
347a7e6055SDimitry Andric #include <algorithm>
352cab237bSDimitry Andric #include <cassert>
367a7e6055SDimitry Andric #include <memory>
37a580b014SDimitry Andric #include <utility>
387a7e6055SDimitry Andric 
397a7e6055SDimitry Andric using namespace llvm;
407a7e6055SDimitry Andric using namespace llvm::msf;
417a7e6055SDimitry Andric using namespace llvm::pdb;
427a7e6055SDimitry Andric 
getDbiStreamPtr(PDBFile & File)43*b5893f02SDimitry Andric static DbiStream *getDbiStreamPtr(PDBFile &File) {
44*b5893f02SDimitry Andric   Expected<DbiStream &> DbiS = File.getPDBDbiStream();
45*b5893f02SDimitry Andric   if (DbiS)
46*b5893f02SDimitry Andric     return &DbiS.get();
47*b5893f02SDimitry Andric 
48*b5893f02SDimitry Andric   consumeError(DbiS.takeError());
49*b5893f02SDimitry Andric   return nullptr;
50*b5893f02SDimitry Andric }
51c4394386SDimitry Andric 
NativeSession(std::unique_ptr<PDBFile> PdbFile,std::unique_ptr<BumpPtrAllocator> Allocator)527a7e6055SDimitry Andric NativeSession::NativeSession(std::unique_ptr<PDBFile> PdbFile,
537a7e6055SDimitry Andric                              std::unique_ptr<BumpPtrAllocator> Allocator)
54*b5893f02SDimitry Andric     : Pdb(std::move(PdbFile)), Allocator(std::move(Allocator)),
55*b5893f02SDimitry Andric       Cache(*this, getDbiStreamPtr(*Pdb)) {}
567a7e6055SDimitry Andric 
577a7e6055SDimitry Andric NativeSession::~NativeSession() = default;
587a7e6055SDimitry Andric 
createFromPdb(std::unique_ptr<MemoryBuffer> Buffer,std::unique_ptr<IPDBSession> & Session)592cab237bSDimitry Andric Error NativeSession::createFromPdb(std::unique_ptr<MemoryBuffer> Buffer,
607a7e6055SDimitry Andric                                    std::unique_ptr<IPDBSession> &Session) {
612cab237bSDimitry Andric   StringRef Path = Buffer->getBufferIdentifier();
627a7e6055SDimitry Andric   auto Stream = llvm::make_unique<MemoryBufferByteStream>(
637a7e6055SDimitry Andric       std::move(Buffer), llvm::support::little);
647a7e6055SDimitry Andric 
657a7e6055SDimitry Andric   auto Allocator = llvm::make_unique<BumpPtrAllocator>();
667a7e6055SDimitry Andric   auto File = llvm::make_unique<PDBFile>(Path, std::move(Stream), *Allocator);
677a7e6055SDimitry Andric   if (auto EC = File->parseFileHeaders())
687a7e6055SDimitry Andric     return EC;
697a7e6055SDimitry Andric   if (auto EC = File->parseStreamData())
707a7e6055SDimitry Andric     return EC;
717a7e6055SDimitry Andric 
727a7e6055SDimitry Andric   Session =
737a7e6055SDimitry Andric       llvm::make_unique<NativeSession>(std::move(File), std::move(Allocator));
747a7e6055SDimitry Andric 
757a7e6055SDimitry Andric   return Error::success();
767a7e6055SDimitry Andric }
777a7e6055SDimitry Andric 
createFromExe(StringRef Path,std::unique_ptr<IPDBSession> & Session)787a7e6055SDimitry Andric Error NativeSession::createFromExe(StringRef Path,
797a7e6055SDimitry Andric                                    std::unique_ptr<IPDBSession> &Session) {
807a7e6055SDimitry Andric   return make_error<RawError>(raw_error_code::feature_unsupported);
817a7e6055SDimitry Andric }
827a7e6055SDimitry Andric 
getLoadAddress() const837a7e6055SDimitry Andric uint64_t NativeSession::getLoadAddress() const { return 0; }
847a7e6055SDimitry Andric 
setLoadAddress(uint64_t Address)854ba319b5SDimitry Andric bool NativeSession::setLoadAddress(uint64_t Address) { return false; }
867a7e6055SDimitry Andric 
getGlobalScope()87edd7eaddSDimitry Andric std::unique_ptr<PDBSymbolExe> NativeSession::getGlobalScope() {
88*b5893f02SDimitry Andric   return PDBSymbol::createAs<PDBSymbolExe>(*this, getNativeGlobalScope());
897a7e6055SDimitry Andric }
907a7e6055SDimitry Andric 
917a7e6055SDimitry Andric std::unique_ptr<PDBSymbol>
getSymbolById(SymIndexId SymbolId) const92*b5893f02SDimitry Andric NativeSession::getSymbolById(SymIndexId SymbolId) const {
93*b5893f02SDimitry Andric   return Cache.getSymbolById(SymbolId);
947a7e6055SDimitry Andric }
957a7e6055SDimitry Andric 
addressForVA(uint64_t VA,uint32_t & Section,uint32_t & Offset) const964ba319b5SDimitry Andric bool NativeSession::addressForVA(uint64_t VA, uint32_t &Section,
974ba319b5SDimitry Andric                                  uint32_t &Offset) const {
984ba319b5SDimitry Andric   return false;
994ba319b5SDimitry Andric }
1004ba319b5SDimitry Andric 
addressForRVA(uint32_t VA,uint32_t & Section,uint32_t & Offset) const1014ba319b5SDimitry Andric bool NativeSession::addressForRVA(uint32_t VA, uint32_t &Section,
1024ba319b5SDimitry Andric                                   uint32_t &Offset) const {
1034ba319b5SDimitry Andric   return false;
1044ba319b5SDimitry Andric }
1054ba319b5SDimitry Andric 
1067a7e6055SDimitry Andric std::unique_ptr<PDBSymbol>
findSymbolByAddress(uint64_t Address,PDB_SymType Type) const1077a7e6055SDimitry Andric NativeSession::findSymbolByAddress(uint64_t Address, PDB_SymType Type) const {
1087a7e6055SDimitry Andric   return nullptr;
1097a7e6055SDimitry Andric }
1107a7e6055SDimitry Andric 
1114ba319b5SDimitry Andric std::unique_ptr<PDBSymbol>
findSymbolByRVA(uint32_t RVA,PDB_SymType Type) const1124ba319b5SDimitry Andric NativeSession::findSymbolByRVA(uint32_t RVA, PDB_SymType Type) const {
1134ba319b5SDimitry Andric   return nullptr;
1144ba319b5SDimitry Andric }
1154ba319b5SDimitry Andric 
1164ba319b5SDimitry Andric std::unique_ptr<PDBSymbol>
findSymbolBySectOffset(uint32_t Sect,uint32_t Offset,PDB_SymType Type) const1174ba319b5SDimitry Andric NativeSession::findSymbolBySectOffset(uint32_t Sect, uint32_t Offset,
1184ba319b5SDimitry Andric                                       PDB_SymType Type) const {
1194ba319b5SDimitry Andric   return nullptr;
1204ba319b5SDimitry Andric }
1214ba319b5SDimitry Andric 
1227a7e6055SDimitry Andric std::unique_ptr<IPDBEnumLineNumbers>
findLineNumbers(const PDBSymbolCompiland & Compiland,const IPDBSourceFile & File) const1237a7e6055SDimitry Andric NativeSession::findLineNumbers(const PDBSymbolCompiland &Compiland,
1247a7e6055SDimitry Andric                                const IPDBSourceFile &File) const {
1257a7e6055SDimitry Andric   return nullptr;
1267a7e6055SDimitry Andric }
1277a7e6055SDimitry Andric 
1287a7e6055SDimitry Andric std::unique_ptr<IPDBEnumLineNumbers>
findLineNumbersByAddress(uint64_t Address,uint32_t Length) const1297a7e6055SDimitry Andric NativeSession::findLineNumbersByAddress(uint64_t Address,
1307a7e6055SDimitry Andric                                         uint32_t Length) const {
1317a7e6055SDimitry Andric   return nullptr;
1327a7e6055SDimitry Andric }
1337a7e6055SDimitry Andric 
1344ba319b5SDimitry Andric std::unique_ptr<IPDBEnumLineNumbers>
findLineNumbersByRVA(uint32_t RVA,uint32_t Length) const1354ba319b5SDimitry Andric NativeSession::findLineNumbersByRVA(uint32_t RVA, uint32_t Length) const {
1364ba319b5SDimitry Andric   return nullptr;
1374ba319b5SDimitry Andric }
1384ba319b5SDimitry Andric 
1394ba319b5SDimitry Andric std::unique_ptr<IPDBEnumLineNumbers>
findLineNumbersBySectOffset(uint32_t Section,uint32_t Offset,uint32_t Length) const1404ba319b5SDimitry Andric NativeSession::findLineNumbersBySectOffset(uint32_t Section, uint32_t Offset,
1414ba319b5SDimitry Andric                                            uint32_t Length) const {
1424ba319b5SDimitry Andric   return nullptr;
1434ba319b5SDimitry Andric }
1444ba319b5SDimitry Andric 
1457a7e6055SDimitry Andric std::unique_ptr<IPDBEnumSourceFiles>
findSourceFiles(const PDBSymbolCompiland * Compiland,StringRef Pattern,PDB_NameSearchFlags Flags) const1467a7e6055SDimitry Andric NativeSession::findSourceFiles(const PDBSymbolCompiland *Compiland,
1477a7e6055SDimitry Andric                                StringRef Pattern,
1487a7e6055SDimitry Andric                                PDB_NameSearchFlags Flags) const {
1497a7e6055SDimitry Andric   return nullptr;
1507a7e6055SDimitry Andric }
1517a7e6055SDimitry Andric 
1527a7e6055SDimitry Andric std::unique_ptr<IPDBSourceFile>
findOneSourceFile(const PDBSymbolCompiland * Compiland,StringRef Pattern,PDB_NameSearchFlags Flags) const1537a7e6055SDimitry Andric NativeSession::findOneSourceFile(const PDBSymbolCompiland *Compiland,
1547a7e6055SDimitry Andric                                  StringRef Pattern,
1557a7e6055SDimitry Andric                                  PDB_NameSearchFlags Flags) const {
1567a7e6055SDimitry Andric   return nullptr;
1577a7e6055SDimitry Andric }
1587a7e6055SDimitry Andric 
1597a7e6055SDimitry Andric std::unique_ptr<IPDBEnumChildren<PDBSymbolCompiland>>
findCompilandsForSourceFile(StringRef Pattern,PDB_NameSearchFlags Flags) const1607a7e6055SDimitry Andric NativeSession::findCompilandsForSourceFile(StringRef Pattern,
1617a7e6055SDimitry Andric                                            PDB_NameSearchFlags Flags) const {
1627a7e6055SDimitry Andric   return nullptr;
1637a7e6055SDimitry Andric }
1647a7e6055SDimitry Andric 
1657a7e6055SDimitry Andric std::unique_ptr<PDBSymbolCompiland>
findOneCompilandForSourceFile(StringRef Pattern,PDB_NameSearchFlags Flags) const1667a7e6055SDimitry Andric NativeSession::findOneCompilandForSourceFile(StringRef Pattern,
1677a7e6055SDimitry Andric                                              PDB_NameSearchFlags Flags) const {
1687a7e6055SDimitry Andric   return nullptr;
1697a7e6055SDimitry Andric }
1707a7e6055SDimitry Andric 
getAllSourceFiles() const1717a7e6055SDimitry Andric std::unique_ptr<IPDBEnumSourceFiles> NativeSession::getAllSourceFiles() const {
1727a7e6055SDimitry Andric   return nullptr;
1737a7e6055SDimitry Andric }
1747a7e6055SDimitry Andric 
getSourceFilesForCompiland(const PDBSymbolCompiland & Compiland) const1757a7e6055SDimitry Andric std::unique_ptr<IPDBEnumSourceFiles> NativeSession::getSourceFilesForCompiland(
1767a7e6055SDimitry Andric     const PDBSymbolCompiland &Compiland) const {
1777a7e6055SDimitry Andric   return nullptr;
1787a7e6055SDimitry Andric }
1797a7e6055SDimitry Andric 
1807a7e6055SDimitry Andric std::unique_ptr<IPDBSourceFile>
getSourceFileById(uint32_t FileId) const1817a7e6055SDimitry Andric NativeSession::getSourceFileById(uint32_t FileId) const {
1827a7e6055SDimitry Andric   return nullptr;
1837a7e6055SDimitry Andric }
1847a7e6055SDimitry Andric 
getDebugStreams() const1857a7e6055SDimitry Andric std::unique_ptr<IPDBEnumDataStreams> NativeSession::getDebugStreams() const {
1867a7e6055SDimitry Andric   return nullptr;
1877a7e6055SDimitry Andric }
1882cab237bSDimitry Andric 
getEnumTables() const1892cab237bSDimitry Andric std::unique_ptr<IPDBEnumTables> NativeSession::getEnumTables() const {
1902cab237bSDimitry Andric   return nullptr;
1912cab237bSDimitry Andric }
1924ba319b5SDimitry Andric 
1934ba319b5SDimitry Andric std::unique_ptr<IPDBEnumInjectedSources>
getInjectedSources() const1944ba319b5SDimitry Andric NativeSession::getInjectedSources() const {
1954ba319b5SDimitry Andric   return nullptr;
1964ba319b5SDimitry Andric }
1974ba319b5SDimitry Andric 
1984ba319b5SDimitry Andric std::unique_ptr<IPDBEnumSectionContribs>
getSectionContribs() const1994ba319b5SDimitry Andric NativeSession::getSectionContribs() const {
2004ba319b5SDimitry Andric   return nullptr;
2014ba319b5SDimitry Andric }
202*b5893f02SDimitry Andric 
203*b5893f02SDimitry Andric std::unique_ptr<IPDBEnumFrameData>
getFrameData() const204*b5893f02SDimitry Andric NativeSession::getFrameData() const {
205*b5893f02SDimitry Andric   return nullptr;
206*b5893f02SDimitry Andric }
207*b5893f02SDimitry Andric 
initializeExeSymbol()208*b5893f02SDimitry Andric void NativeSession::initializeExeSymbol() {
209*b5893f02SDimitry Andric   if (ExeSymbol == 0)
210*b5893f02SDimitry Andric     ExeSymbol = Cache.createSymbol<NativeExeSymbol>();
211*b5893f02SDimitry Andric }
212*b5893f02SDimitry Andric 
getNativeGlobalScope() const213*b5893f02SDimitry Andric NativeExeSymbol &NativeSession::getNativeGlobalScope() const {
214*b5893f02SDimitry Andric   const_cast<NativeSession &>(*this).initializeExeSymbol();
215*b5893f02SDimitry Andric 
216*b5893f02SDimitry Andric   return Cache.getNativeSymbolById<NativeExeSymbol>(ExeSymbol);
217*b5893f02SDimitry Andric }
218