14bafceceSPaolo Severini //===-- ObjectFileWasm.h ----------------------------------------*- C++ -*-===// 24bafceceSPaolo Severini // 34bafceceSPaolo Severini // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 44bafceceSPaolo Severini // See https://llvm.org/LICENSE.txt for license information. 54bafceceSPaolo Severini // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 64bafceceSPaolo Severini // 74bafceceSPaolo Severini //===----------------------------------------------------------------------===// 84bafceceSPaolo Severini 9cdc514e4SJonas Devlieghere #ifndef LLDB_SOURCE_PLUGINS_OBJECTFILE_WASM_OBJECTFILEWASM_H 10cdc514e4SJonas Devlieghere #define LLDB_SOURCE_PLUGINS_OBJECTFILE_WASM_OBJECTFILEWASM_H 114bafceceSPaolo Severini 124bafceceSPaolo Severini #include "lldb/Symbol/ObjectFile.h" 134bafceceSPaolo Severini #include "lldb/Utility/ArchSpec.h" 144bafceceSPaolo Severini 154bafceceSPaolo Severini namespace lldb_private { 164bafceceSPaolo Severini namespace wasm { 174bafceceSPaolo Severini 184bafceceSPaolo Severini /// Generic Wasm object file reader. 194bafceceSPaolo Severini /// 204bafceceSPaolo Severini /// This class provides a generic wasm32 reader plugin implementing the 214bafceceSPaolo Severini /// ObjectFile protocol. 224bafceceSPaolo Severini class ObjectFileWasm : public ObjectFile { 234bafceceSPaolo Severini public: 244bafceceSPaolo Severini static void Initialize(); 254bafceceSPaolo Severini static void Terminate(); 264bafceceSPaolo Severini GetPluginNameStatic()272ace1e57SPavel Labath static llvm::StringRef GetPluginNameStatic() { return "wasm"; } GetPluginDescriptionStatic()284bafceceSPaolo Severini static const char *GetPluginDescriptionStatic() { 294bafceceSPaolo Severini return "WebAssembly object file reader."; 304bafceceSPaolo Severini } 314bafceceSPaolo Severini 324bafceceSPaolo Severini static ObjectFile * 33c69307e5SJonas Devlieghere CreateInstance(const lldb::ModuleSP &module_sp, lldb::DataBufferSP data_sp, 344bafceceSPaolo Severini lldb::offset_t data_offset, const FileSpec *file, 354bafceceSPaolo Severini lldb::offset_t file_offset, lldb::offset_t length); 364bafceceSPaolo Severini 374bafceceSPaolo Severini static ObjectFile *CreateMemoryInstance(const lldb::ModuleSP &module_sp, 38*f2ea125eSJonas Devlieghere lldb::WritableDataBufferSP data_sp, 394bafceceSPaolo Severini const lldb::ProcessSP &process_sp, 404bafceceSPaolo Severini lldb::addr_t header_addr); 414bafceceSPaolo Severini 424bafceceSPaolo Severini static size_t GetModuleSpecifications(const FileSpec &file, 434bafceceSPaolo Severini lldb::DataBufferSP &data_sp, 444bafceceSPaolo Severini lldb::offset_t data_offset, 454bafceceSPaolo Severini lldb::offset_t file_offset, 464bafceceSPaolo Severini lldb::offset_t length, 474bafceceSPaolo Severini ModuleSpecList &specs); 484bafceceSPaolo Severini 494bafceceSPaolo Severini /// PluginInterface protocol. 504bafceceSPaolo Severini /// \{ GetPluginName()512ace1e57SPavel Labath llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } 524bafceceSPaolo Severini /// \} 534bafceceSPaolo Severini 549b3254dbSPaolo Severini /// LLVM RTTI support 559b3254dbSPaolo Severini /// \{ 569b3254dbSPaolo Severini static char ID; isA(const void * ClassID)579b3254dbSPaolo Severini bool isA(const void *ClassID) const override { 589b3254dbSPaolo Severini return ClassID == &ID || ObjectFile::isA(ClassID); 599b3254dbSPaolo Severini } classof(const ObjectFile * obj)609b3254dbSPaolo Severini static bool classof(const ObjectFile *obj) { return obj->isA(&ID); } 619b3254dbSPaolo Severini /// \} 629b3254dbSPaolo Severini 634bafceceSPaolo Severini /// ObjectFile Protocol. 644bafceceSPaolo Severini /// \{ 654bafceceSPaolo Severini bool ParseHeader() override; 664bafceceSPaolo Severini GetByteOrder()674bafceceSPaolo Severini lldb::ByteOrder GetByteOrder() const override { 684bafceceSPaolo Severini return m_arch.GetByteOrder(); 694bafceceSPaolo Severini } 704bafceceSPaolo Severini IsExecutable()71c1121908SPaolo Severini bool IsExecutable() const override { return false; } 724bafceceSPaolo Severini GetAddressByteSize()734bafceceSPaolo Severini uint32_t GetAddressByteSize() const override { 744bafceceSPaolo Severini return m_arch.GetAddressByteSize(); 754bafceceSPaolo Severini } 764bafceceSPaolo Severini GetAddressClass(lldb::addr_t file_addr)774bafceceSPaolo Severini AddressClass GetAddressClass(lldb::addr_t file_addr) override { 784bafceceSPaolo Severini return AddressClass::eInvalid; 794bafceceSPaolo Severini } 804bafceceSPaolo Severini 817e6df41fSGreg Clayton void ParseSymtab(lldb_private::Symtab &symtab) override; 824bafceceSPaolo Severini IsStripped()83c1121908SPaolo Severini bool IsStripped() override { return !!GetExternalDebugInfoFileSpec(); } 844bafceceSPaolo Severini 854bafceceSPaolo Severini void CreateSections(SectionList &unified_section_list) override; 864bafceceSPaolo Severini 874bafceceSPaolo Severini void Dump(Stream *s) override; 884bafceceSPaolo Severini GetArchitecture()894bafceceSPaolo Severini ArchSpec GetArchitecture() override { return m_arch; } 904bafceceSPaolo Severini GetUUID()914bafceceSPaolo Severini UUID GetUUID() override { return m_uuid; } 924bafceceSPaolo Severini GetDependentModules(FileSpecList & files)934bafceceSPaolo Severini uint32_t GetDependentModules(FileSpecList &files) override { return 0; } 944bafceceSPaolo Severini CalculateType()95c1121908SPaolo Severini Type CalculateType() override { return eTypeSharedLibrary; } 964bafceceSPaolo Severini CalculateStrata()974bafceceSPaolo Severini Strata CalculateStrata() override { return eStrataUser; } 984bafceceSPaolo Severini 994bafceceSPaolo Severini bool SetLoadAddress(lldb_private::Target &target, lldb::addr_t value, 1004bafceceSPaolo Severini bool value_is_offset) override; 1014bafceceSPaolo Severini GetBaseAddress()1024bafceceSPaolo Severini lldb_private::Address GetBaseAddress() override { 103c1121908SPaolo Severini return IsInMemory() ? Address(m_memory_addr) : Address(0); 1044bafceceSPaolo Severini } 1054bafceceSPaolo Severini /// \} 1064bafceceSPaolo Severini 1079b3254dbSPaolo Severini /// A Wasm module that has external DWARF debug information should contain a 1089b3254dbSPaolo Severini /// custom section named "external_debug_info", whose payload is an UTF-8 1099b3254dbSPaolo Severini /// encoded string that points to a Wasm module that contains the debug 1109b3254dbSPaolo Severini /// information for this module. 1119b3254dbSPaolo Severini llvm::Optional<FileSpec> GetExternalDebugInfoFileSpec(); 1129b3254dbSPaolo Severini 1134bafceceSPaolo Severini private: 114*f2ea125eSJonas Devlieghere ObjectFileWasm(const lldb::ModuleSP &module_sp, lldb::DataBufferSP data_sp, 1154bafceceSPaolo Severini lldb::offset_t data_offset, const FileSpec *file, 1164bafceceSPaolo Severini lldb::offset_t offset, lldb::offset_t length); 1174bafceceSPaolo Severini ObjectFileWasm(const lldb::ModuleSP &module_sp, 118*f2ea125eSJonas Devlieghere lldb::WritableDataBufferSP header_data_sp, 1194bafceceSPaolo Severini const lldb::ProcessSP &process_sp, lldb::addr_t header_addr); 1204bafceceSPaolo Severini 1214bafceceSPaolo Severini /// Wasm section decoding routines. 1224bafceceSPaolo Severini /// \{ 1234bafceceSPaolo Severini bool DecodeNextSection(lldb::offset_t *offset_ptr); 1244bafceceSPaolo Severini bool DecodeSections(); 1254bafceceSPaolo Severini /// \} 1264bafceceSPaolo Severini 1274bafceceSPaolo Severini /// Read a range of bytes from the Wasm module. 128c1121908SPaolo Severini DataExtractor ReadImageData(lldb::offset_t offset, uint32_t size); 1294bafceceSPaolo Severini 1304bafceceSPaolo Severini typedef struct section_info { 1314bafceceSPaolo Severini lldb::offset_t offset; 1324bafceceSPaolo Severini uint32_t size; 1334bafceceSPaolo Severini uint32_t id; 1344bafceceSPaolo Severini ConstString name; 1354bafceceSPaolo Severini } section_info_t; 1364bafceceSPaolo Severini 1374bafceceSPaolo Severini /// Wasm section header dump routines. 1384bafceceSPaolo Severini /// \{ 1394bafceceSPaolo Severini void DumpSectionHeader(llvm::raw_ostream &ostream, const section_info_t &sh); 1404bafceceSPaolo Severini void DumpSectionHeaders(llvm::raw_ostream &ostream); 1414bafceceSPaolo Severini /// \} 1424bafceceSPaolo Severini 1434bafceceSPaolo Severini std::vector<section_info_t> m_sect_infos; 1444bafceceSPaolo Severini ArchSpec m_arch; 1454bafceceSPaolo Severini UUID m_uuid; 1464bafceceSPaolo Severini }; 1474bafceceSPaolo Severini 1484bafceceSPaolo Severini } // namespace wasm 1494bafceceSPaolo Severini } // namespace lldb_private 150cdc514e4SJonas Devlieghere #endif // LLDB_SOURCE_PLUGINS_OBJECTFILE_WASM_OBJECTFILEWASM_H 151