1be691f3bSpatrick //===-- ObjectFilePDB.h --------------------------------------- -*- C++ -*-===// 2be691f3bSpatrick // 3be691f3bSpatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4be691f3bSpatrick // See https://llvm.org/LICENSE.txt for license information. 5be691f3bSpatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6be691f3bSpatrick // 7be691f3bSpatrick //===----------------------------------------------------------------------===// 8be691f3bSpatrick 9be691f3bSpatrick #ifndef LLDB_SOURCE_PLUGINS_OBJECTFILE_PDB_OBJECTFILEPDB_H 10be691f3bSpatrick #define LLDB_SOURCE_PLUGINS_OBJECTFILE_PDB_OBJECTFILEPDB_H 11be691f3bSpatrick 12be691f3bSpatrick #include "lldb/Symbol/ObjectFile.h" 13be691f3bSpatrick #include "lldb/Utility/ArchSpec.h" 14be691f3bSpatrick #include "llvm/DebugInfo/PDB/Native/NativeSession.h" 15be691f3bSpatrick #include "llvm/DebugInfo/PDB/PDBTypes.h" 16be691f3bSpatrick 17be691f3bSpatrick namespace lldb_private { 18be691f3bSpatrick 19be691f3bSpatrick class ObjectFilePDB : public ObjectFile { 20be691f3bSpatrick public: 21be691f3bSpatrick // Static Functions 22be691f3bSpatrick static void Initialize(); 23be691f3bSpatrick static void Terminate(); 24be691f3bSpatrick GetPluginNameStatic()25*f6aab3d8Srobert static llvm::StringRef GetPluginNameStatic() { return "pdb"; } GetPluginDescriptionStatic()26be691f3bSpatrick static const char *GetPluginDescriptionStatic() { 27be691f3bSpatrick return "PDB object file reader."; 28be691f3bSpatrick } 29be691f3bSpatrick 30be691f3bSpatrick static std::unique_ptr<llvm::pdb::PDBFile> 31be691f3bSpatrick loadPDBFile(std::string PdbPath, llvm::BumpPtrAllocator &Allocator); 32be691f3bSpatrick 33be691f3bSpatrick static ObjectFile * 34*f6aab3d8Srobert CreateInstance(const lldb::ModuleSP &module_sp, lldb::DataBufferSP data_sp, 35be691f3bSpatrick lldb::offset_t data_offset, const FileSpec *file, 36be691f3bSpatrick lldb::offset_t file_offset, lldb::offset_t length); 37be691f3bSpatrick 38be691f3bSpatrick static ObjectFile *CreateMemoryInstance(const lldb::ModuleSP &module_sp, 39*f6aab3d8Srobert lldb::WritableDataBufferSP data_sp, 40be691f3bSpatrick const lldb::ProcessSP &process_sp, 41be691f3bSpatrick lldb::addr_t header_addr); 42be691f3bSpatrick 43be691f3bSpatrick static size_t GetModuleSpecifications(const FileSpec &file, 44be691f3bSpatrick lldb::DataBufferSP &data_sp, 45be691f3bSpatrick lldb::offset_t data_offset, 46be691f3bSpatrick lldb::offset_t file_offset, 47be691f3bSpatrick lldb::offset_t length, 48be691f3bSpatrick ModuleSpecList &specs); 49be691f3bSpatrick 50be691f3bSpatrick // PluginInterface protocol GetPluginName()51*f6aab3d8Srobert llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } 52be691f3bSpatrick 53be691f3bSpatrick // LLVM RTTI support 54be691f3bSpatrick static char ID; isA(const void * ClassID)55be691f3bSpatrick bool isA(const void *ClassID) const override { 56be691f3bSpatrick return ClassID == &ID || ObjectFile::isA(ClassID); 57be691f3bSpatrick } classof(const ObjectFile * obj)58be691f3bSpatrick static bool classof(const ObjectFile *obj) { return obj->isA(&ID); } 59be691f3bSpatrick 60be691f3bSpatrick // ObjectFile Protocol. GetAddressByteSize()61be691f3bSpatrick uint32_t GetAddressByteSize() const override { return 8; } 62be691f3bSpatrick GetByteOrder()63be691f3bSpatrick lldb::ByteOrder GetByteOrder() const override { 64be691f3bSpatrick return lldb::eByteOrderLittle; 65be691f3bSpatrick } 66be691f3bSpatrick ParseHeader()67be691f3bSpatrick bool ParseHeader() override { return true; } 68be691f3bSpatrick IsExecutable()69be691f3bSpatrick bool IsExecutable() const override { return false; } 70be691f3bSpatrick ParseSymtab(lldb_private::Symtab & symtab)71*f6aab3d8Srobert void ParseSymtab(lldb_private::Symtab &symtab) override {} 72be691f3bSpatrick IsStripped()73be691f3bSpatrick bool IsStripped() override { return false; } 74be691f3bSpatrick 75be691f3bSpatrick // No section in PDB file. CreateSections(SectionList & unified_section_list)76be691f3bSpatrick void CreateSections(SectionList &unified_section_list) override {} 77be691f3bSpatrick Dump(Stream * s)78be691f3bSpatrick void Dump(Stream *s) override {} 79be691f3bSpatrick 80be691f3bSpatrick ArchSpec GetArchitecture() override; 81be691f3bSpatrick GetUUID()82be691f3bSpatrick UUID GetUUID() override { return m_uuid; } 83be691f3bSpatrick GetDependentModules(FileSpecList & files)84be691f3bSpatrick uint32_t GetDependentModules(FileSpecList &files) override { return 0; } 85be691f3bSpatrick CalculateType()86be691f3bSpatrick Type CalculateType() override { return eTypeDebugInfo; } 87be691f3bSpatrick CalculateStrata()88be691f3bSpatrick Strata CalculateStrata() override { return eStrataUser; } 89be691f3bSpatrick GetPDBFile()90be691f3bSpatrick llvm::pdb::PDBFile &GetPDBFile() { return *m_file_up; } 91be691f3bSpatrick 92be691f3bSpatrick ObjectFilePDB(const lldb::ModuleSP &module_sp, lldb::DataBufferSP &data_sp, 93be691f3bSpatrick lldb::offset_t data_offset, const FileSpec *file, 94be691f3bSpatrick lldb::offset_t offset, lldb::offset_t length); 95be691f3bSpatrick 96be691f3bSpatrick private: 97be691f3bSpatrick UUID m_uuid; 98be691f3bSpatrick llvm::BumpPtrAllocator m_allocator; 99be691f3bSpatrick std::unique_ptr<llvm::pdb::PDBFile> m_file_up; 100be691f3bSpatrick 101be691f3bSpatrick bool initPDBFile(); 102be691f3bSpatrick }; 103be691f3bSpatrick 104be691f3bSpatrick } // namespace lldb_private 105*f6aab3d8Srobert #endif // LLDB_SOURCE_PLUGINS_OBJECTFILE_PDB_OBJECTFILEPDB_H 106