1dda28197Spatrick //===-- ObjectFileWasm.h ----------------------------------------*- C++ -*-===// 2dda28197Spatrick // 3dda28197Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4dda28197Spatrick // See https://llvm.org/LICENSE.txt for license information. 5dda28197Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6dda28197Spatrick // 7dda28197Spatrick //===----------------------------------------------------------------------===// 8dda28197Spatrick 9dda28197Spatrick #ifndef LLDB_SOURCE_PLUGINS_OBJECTFILE_WASM_OBJECTFILEWASM_H 10dda28197Spatrick #define LLDB_SOURCE_PLUGINS_OBJECTFILE_WASM_OBJECTFILEWASM_H 11dda28197Spatrick 12dda28197Spatrick #include "lldb/Symbol/ObjectFile.h" 13dda28197Spatrick #include "lldb/Utility/ArchSpec.h" 14*f6aab3d8Srobert #include <optional> 15dda28197Spatrick 16dda28197Spatrick namespace lldb_private { 17dda28197Spatrick namespace wasm { 18dda28197Spatrick 19dda28197Spatrick /// Generic Wasm object file reader. 20dda28197Spatrick /// 21dda28197Spatrick /// This class provides a generic wasm32 reader plugin implementing the 22dda28197Spatrick /// ObjectFile protocol. 23dda28197Spatrick class ObjectFileWasm : public ObjectFile { 24dda28197Spatrick public: 25dda28197Spatrick static void Initialize(); 26dda28197Spatrick static void Terminate(); 27dda28197Spatrick GetPluginNameStatic()28*f6aab3d8Srobert static llvm::StringRef GetPluginNameStatic() { return "wasm"; } GetPluginDescriptionStatic()29dda28197Spatrick static const char *GetPluginDescriptionStatic() { 30dda28197Spatrick return "WebAssembly object file reader."; 31dda28197Spatrick } 32dda28197Spatrick 33dda28197Spatrick static ObjectFile * 34*f6aab3d8Srobert CreateInstance(const lldb::ModuleSP &module_sp, lldb::DataBufferSP data_sp, 35dda28197Spatrick lldb::offset_t data_offset, const FileSpec *file, 36dda28197Spatrick lldb::offset_t file_offset, lldb::offset_t length); 37dda28197Spatrick 38dda28197Spatrick static ObjectFile *CreateMemoryInstance(const lldb::ModuleSP &module_sp, 39*f6aab3d8Srobert lldb::WritableDataBufferSP data_sp, 40dda28197Spatrick const lldb::ProcessSP &process_sp, 41dda28197Spatrick lldb::addr_t header_addr); 42dda28197Spatrick 43dda28197Spatrick static size_t GetModuleSpecifications(const FileSpec &file, 44dda28197Spatrick lldb::DataBufferSP &data_sp, 45dda28197Spatrick lldb::offset_t data_offset, 46dda28197Spatrick lldb::offset_t file_offset, 47dda28197Spatrick lldb::offset_t length, 48dda28197Spatrick ModuleSpecList &specs); 49dda28197Spatrick 50dda28197Spatrick /// PluginInterface protocol. 51dda28197Spatrick /// \{ GetPluginName()52*f6aab3d8Srobert llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } 53dda28197Spatrick /// \} 54dda28197Spatrick 55dda28197Spatrick /// LLVM RTTI support 56dda28197Spatrick /// \{ 57dda28197Spatrick static char ID; isA(const void * ClassID)58dda28197Spatrick bool isA(const void *ClassID) const override { 59dda28197Spatrick return ClassID == &ID || ObjectFile::isA(ClassID); 60dda28197Spatrick } classof(const ObjectFile * obj)61dda28197Spatrick static bool classof(const ObjectFile *obj) { return obj->isA(&ID); } 62dda28197Spatrick /// \} 63dda28197Spatrick 64dda28197Spatrick /// ObjectFile Protocol. 65dda28197Spatrick /// \{ 66dda28197Spatrick bool ParseHeader() override; 67dda28197Spatrick GetByteOrder()68dda28197Spatrick lldb::ByteOrder GetByteOrder() const override { 69dda28197Spatrick return m_arch.GetByteOrder(); 70dda28197Spatrick } 71dda28197Spatrick IsExecutable()72dda28197Spatrick bool IsExecutable() const override { return false; } 73dda28197Spatrick GetAddressByteSize()74dda28197Spatrick uint32_t GetAddressByteSize() const override { 75dda28197Spatrick return m_arch.GetAddressByteSize(); 76dda28197Spatrick } 77dda28197Spatrick GetAddressClass(lldb::addr_t file_addr)78dda28197Spatrick AddressClass GetAddressClass(lldb::addr_t file_addr) override { 79dda28197Spatrick return AddressClass::eInvalid; 80dda28197Spatrick } 81dda28197Spatrick 82*f6aab3d8Srobert void ParseSymtab(lldb_private::Symtab &symtab) override; 83dda28197Spatrick IsStripped()84dda28197Spatrick bool IsStripped() override { return !!GetExternalDebugInfoFileSpec(); } 85dda28197Spatrick 86dda28197Spatrick void CreateSections(SectionList &unified_section_list) override; 87dda28197Spatrick 88dda28197Spatrick void Dump(Stream *s) override; 89dda28197Spatrick GetArchitecture()90dda28197Spatrick ArchSpec GetArchitecture() override { return m_arch; } 91dda28197Spatrick GetUUID()92dda28197Spatrick UUID GetUUID() override { return m_uuid; } 93dda28197Spatrick GetDependentModules(FileSpecList & files)94dda28197Spatrick uint32_t GetDependentModules(FileSpecList &files) override { return 0; } 95dda28197Spatrick CalculateType()96dda28197Spatrick Type CalculateType() override { return eTypeSharedLibrary; } 97dda28197Spatrick CalculateStrata()98dda28197Spatrick Strata CalculateStrata() override { return eStrataUser; } 99dda28197Spatrick 100dda28197Spatrick bool SetLoadAddress(lldb_private::Target &target, lldb::addr_t value, 101dda28197Spatrick bool value_is_offset) override; 102dda28197Spatrick GetBaseAddress()103dda28197Spatrick lldb_private::Address GetBaseAddress() override { 104dda28197Spatrick return IsInMemory() ? Address(m_memory_addr) : Address(0); 105dda28197Spatrick } 106dda28197Spatrick /// \} 107dda28197Spatrick 108dda28197Spatrick /// A Wasm module that has external DWARF debug information should contain a 109dda28197Spatrick /// custom section named "external_debug_info", whose payload is an UTF-8 110dda28197Spatrick /// encoded string that points to a Wasm module that contains the debug 111dda28197Spatrick /// information for this module. 112*f6aab3d8Srobert std::optional<FileSpec> GetExternalDebugInfoFileSpec(); 113dda28197Spatrick 114dda28197Spatrick private: 115*f6aab3d8Srobert ObjectFileWasm(const lldb::ModuleSP &module_sp, lldb::DataBufferSP data_sp, 116dda28197Spatrick lldb::offset_t data_offset, const FileSpec *file, 117dda28197Spatrick lldb::offset_t offset, lldb::offset_t length); 118dda28197Spatrick ObjectFileWasm(const lldb::ModuleSP &module_sp, 119*f6aab3d8Srobert lldb::WritableDataBufferSP header_data_sp, 120dda28197Spatrick const lldb::ProcessSP &process_sp, lldb::addr_t header_addr); 121dda28197Spatrick 122dda28197Spatrick /// Wasm section decoding routines. 123dda28197Spatrick /// \{ 124dda28197Spatrick bool DecodeNextSection(lldb::offset_t *offset_ptr); 125dda28197Spatrick bool DecodeSections(); 126dda28197Spatrick /// \} 127dda28197Spatrick 128dda28197Spatrick /// Read a range of bytes from the Wasm module. 129dda28197Spatrick DataExtractor ReadImageData(lldb::offset_t offset, uint32_t size); 130dda28197Spatrick 131dda28197Spatrick typedef struct section_info { 132dda28197Spatrick lldb::offset_t offset; 133dda28197Spatrick uint32_t size; 134dda28197Spatrick uint32_t id; 135dda28197Spatrick ConstString name; 136dda28197Spatrick } section_info_t; 137dda28197Spatrick 138dda28197Spatrick /// Wasm section header dump routines. 139dda28197Spatrick /// \{ 140dda28197Spatrick void DumpSectionHeader(llvm::raw_ostream &ostream, const section_info_t &sh); 141dda28197Spatrick void DumpSectionHeaders(llvm::raw_ostream &ostream); 142dda28197Spatrick /// \} 143dda28197Spatrick 144dda28197Spatrick std::vector<section_info_t> m_sect_infos; 145dda28197Spatrick ArchSpec m_arch; 146dda28197Spatrick UUID m_uuid; 147dda28197Spatrick }; 148dda28197Spatrick 149dda28197Spatrick } // namespace wasm 150dda28197Spatrick } // namespace lldb_private 151dda28197Spatrick #endif // LLDB_SOURCE_PLUGINS_OBJECTFILE_WASM_OBJECTFILEWASM_H 152