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" 14f190ce62SKazu Hirata #include <optional> 154bafceceSPaolo Severini 164bafceceSPaolo Severini namespace lldb_private { 174bafceceSPaolo Severini namespace wasm { 184bafceceSPaolo Severini 194bafceceSPaolo Severini /// Generic Wasm object file reader. 204bafceceSPaolo Severini /// 214bafceceSPaolo Severini /// This class provides a generic wasm32 reader plugin implementing the 224bafceceSPaolo Severini /// ObjectFile protocol. 234bafceceSPaolo Severini class ObjectFileWasm : public ObjectFile { 244bafceceSPaolo Severini public: 254bafceceSPaolo Severini static void Initialize(); 264bafceceSPaolo Severini static void Terminate(); 274bafceceSPaolo Severini GetPluginNameStatic()282ace1e57SPavel Labath static llvm::StringRef GetPluginNameStatic() { return "wasm"; } GetPluginDescriptionStatic()294bafceceSPaolo Severini static const char *GetPluginDescriptionStatic() { 304bafceceSPaolo Severini return "WebAssembly object file reader."; 314bafceceSPaolo Severini } 324bafceceSPaolo Severini 334bafceceSPaolo Severini static ObjectFile * 34c69307e5SJonas Devlieghere CreateInstance(const lldb::ModuleSP &module_sp, lldb::DataBufferSP data_sp, 354bafceceSPaolo Severini lldb::offset_t data_offset, const FileSpec *file, 364bafceceSPaolo Severini lldb::offset_t file_offset, lldb::offset_t length); 374bafceceSPaolo Severini 384bafceceSPaolo Severini static ObjectFile *CreateMemoryInstance(const lldb::ModuleSP &module_sp, 39f2ea125eSJonas Devlieghere lldb::WritableDataBufferSP data_sp, 404bafceceSPaolo Severini const lldb::ProcessSP &process_sp, 414bafceceSPaolo Severini lldb::addr_t header_addr); 424bafceceSPaolo Severini 434bafceceSPaolo Severini static size_t GetModuleSpecifications(const FileSpec &file, 444bafceceSPaolo Severini lldb::DataBufferSP &data_sp, 454bafceceSPaolo Severini lldb::offset_t data_offset, 464bafceceSPaolo Severini lldb::offset_t file_offset, 474bafceceSPaolo Severini lldb::offset_t length, 484bafceceSPaolo Severini ModuleSpecList &specs); 494bafceceSPaolo Severini 504bafceceSPaolo Severini /// PluginInterface protocol. 514bafceceSPaolo Severini /// \{ GetPluginName()522ace1e57SPavel Labath llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } 534bafceceSPaolo Severini /// \} 544bafceceSPaolo Severini 559b3254dbSPaolo Severini /// LLVM RTTI support 569b3254dbSPaolo Severini /// \{ 579b3254dbSPaolo Severini static char ID; isA(const void * ClassID)589b3254dbSPaolo Severini bool isA(const void *ClassID) const override { 599b3254dbSPaolo Severini return ClassID == &ID || ObjectFile::isA(ClassID); 609b3254dbSPaolo Severini } classof(const ObjectFile * obj)619b3254dbSPaolo Severini static bool classof(const ObjectFile *obj) { return obj->isA(&ID); } 629b3254dbSPaolo Severini /// \} 639b3254dbSPaolo Severini 644bafceceSPaolo Severini /// ObjectFile Protocol. 654bafceceSPaolo Severini /// \{ 664bafceceSPaolo Severini bool ParseHeader() override; 674bafceceSPaolo Severini GetByteOrder()684bafceceSPaolo Severini lldb::ByteOrder GetByteOrder() const override { 694bafceceSPaolo Severini return m_arch.GetByteOrder(); 704bafceceSPaolo Severini } 714bafceceSPaolo Severini IsExecutable()72c1121908SPaolo Severini bool IsExecutable() const override { return false; } 734bafceceSPaolo Severini GetAddressByteSize()744bafceceSPaolo Severini uint32_t GetAddressByteSize() const override { 754bafceceSPaolo Severini return m_arch.GetAddressByteSize(); 764bafceceSPaolo Severini } 774bafceceSPaolo Severini GetAddressClass(lldb::addr_t file_addr)784bafceceSPaolo Severini AddressClass GetAddressClass(lldb::addr_t file_addr) override { 794bafceceSPaolo Severini return AddressClass::eInvalid; 804bafceceSPaolo Severini } 814bafceceSPaolo Severini 827e6df41fSGreg Clayton void ParseSymtab(lldb_private::Symtab &symtab) override; 834bafceceSPaolo Severini IsStripped()84c1121908SPaolo Severini bool IsStripped() override { return !!GetExternalDebugInfoFileSpec(); } 854bafceceSPaolo Severini 864bafceceSPaolo Severini void CreateSections(SectionList &unified_section_list) override; 874bafceceSPaolo Severini 884bafceceSPaolo Severini void Dump(Stream *s) override; 894bafceceSPaolo Severini GetArchitecture()904bafceceSPaolo Severini ArchSpec GetArchitecture() override { return m_arch; } 914bafceceSPaolo Severini GetUUID()924bafceceSPaolo Severini UUID GetUUID() override { return m_uuid; } 934bafceceSPaolo Severini GetDependentModules(FileSpecList & files)944bafceceSPaolo Severini uint32_t GetDependentModules(FileSpecList &files) override { return 0; } 954bafceceSPaolo Severini CalculateType()96c1121908SPaolo Severini Type CalculateType() override { return eTypeSharedLibrary; } 974bafceceSPaolo Severini CalculateStrata()984bafceceSPaolo Severini Strata CalculateStrata() override { return eStrataUser; } 994bafceceSPaolo Severini 1004bafceceSPaolo Severini bool SetLoadAddress(lldb_private::Target &target, lldb::addr_t value, 1014bafceceSPaolo Severini bool value_is_offset) override; 1024bafceceSPaolo Severini GetBaseAddress()1034bafceceSPaolo Severini lldb_private::Address GetBaseAddress() override { 104c1121908SPaolo Severini return IsInMemory() ? Address(m_memory_addr) : Address(0); 1054bafceceSPaolo Severini } 1064bafceceSPaolo Severini /// \} 1074bafceceSPaolo Severini 1089b3254dbSPaolo Severini /// A Wasm module that has external DWARF debug information should contain a 1099b3254dbSPaolo Severini /// custom section named "external_debug_info", whose payload is an UTF-8 1109b3254dbSPaolo Severini /// encoded string that points to a Wasm module that contains the debug 1119b3254dbSPaolo Severini /// information for this module. 112*2fe83274SKazu Hirata std::optional<FileSpec> GetExternalDebugInfoFileSpec(); 1139b3254dbSPaolo Severini 1144bafceceSPaolo Severini private: 115f2ea125eSJonas Devlieghere ObjectFileWasm(const lldb::ModuleSP &module_sp, lldb::DataBufferSP data_sp, 1164bafceceSPaolo Severini lldb::offset_t data_offset, const FileSpec *file, 1174bafceceSPaolo Severini lldb::offset_t offset, lldb::offset_t length); 1184bafceceSPaolo Severini ObjectFileWasm(const lldb::ModuleSP &module_sp, 119f2ea125eSJonas Devlieghere lldb::WritableDataBufferSP header_data_sp, 1204bafceceSPaolo Severini const lldb::ProcessSP &process_sp, lldb::addr_t header_addr); 1214bafceceSPaolo Severini 1224bafceceSPaolo Severini /// Wasm section decoding routines. 1234bafceceSPaolo Severini /// \{ 1244bafceceSPaolo Severini bool DecodeNextSection(lldb::offset_t *offset_ptr); 1254bafceceSPaolo Severini bool DecodeSections(); 1264bafceceSPaolo Severini /// \} 1274bafceceSPaolo Severini 1284bafceceSPaolo Severini /// Read a range of bytes from the Wasm module. 129c1121908SPaolo Severini DataExtractor ReadImageData(lldb::offset_t offset, uint32_t size); 1304bafceceSPaolo Severini 1314bafceceSPaolo Severini typedef struct section_info { 1324bafceceSPaolo Severini lldb::offset_t offset; 1334bafceceSPaolo Severini uint32_t size; 1344bafceceSPaolo Severini uint32_t id; 1354bafceceSPaolo Severini ConstString name; 1364bafceceSPaolo Severini } section_info_t; 1374bafceceSPaolo Severini 1384bafceceSPaolo Severini /// Wasm section header dump routines. 1394bafceceSPaolo Severini /// \{ 1404bafceceSPaolo Severini void DumpSectionHeader(llvm::raw_ostream &ostream, const section_info_t &sh); 1414bafceceSPaolo Severini void DumpSectionHeaders(llvm::raw_ostream &ostream); 1424bafceceSPaolo Severini /// \} 1434bafceceSPaolo Severini 1444bafceceSPaolo Severini std::vector<section_info_t> m_sect_infos; 1454bafceceSPaolo Severini ArchSpec m_arch; 1464bafceceSPaolo Severini UUID m_uuid; 1474bafceceSPaolo Severini }; 1484bafceceSPaolo Severini 1494bafceceSPaolo Severini } // namespace wasm 1504bafceceSPaolo Severini } // namespace lldb_private 151cdc514e4SJonas Devlieghere #endif // LLDB_SOURCE_PLUGINS_OBJECTFILE_WASM_OBJECTFILEWASM_H 152