15ffd83dbSDimitry Andric //===-- ObjectFileWasm.h ----------------------------------------*- C++ -*-===// 25ffd83dbSDimitry Andric // 35ffd83dbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 45ffd83dbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 55ffd83dbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 65ffd83dbSDimitry Andric // 75ffd83dbSDimitry Andric //===----------------------------------------------------------------------===// 85ffd83dbSDimitry Andric 95ffd83dbSDimitry Andric #ifndef LLDB_SOURCE_PLUGINS_OBJECTFILE_WASM_OBJECTFILEWASM_H 105ffd83dbSDimitry Andric #define LLDB_SOURCE_PLUGINS_OBJECTFILE_WASM_OBJECTFILEWASM_H 115ffd83dbSDimitry Andric 125ffd83dbSDimitry Andric #include "lldb/Symbol/ObjectFile.h" 135ffd83dbSDimitry Andric #include "lldb/Utility/ArchSpec.h" 145ffd83dbSDimitry Andric 155ffd83dbSDimitry Andric namespace lldb_private { 165ffd83dbSDimitry Andric namespace wasm { 175ffd83dbSDimitry Andric 185ffd83dbSDimitry Andric /// Generic Wasm object file reader. 195ffd83dbSDimitry Andric /// 205ffd83dbSDimitry Andric /// This class provides a generic wasm32 reader plugin implementing the 215ffd83dbSDimitry Andric /// ObjectFile protocol. 225ffd83dbSDimitry Andric class ObjectFileWasm : public ObjectFile { 235ffd83dbSDimitry Andric public: 245ffd83dbSDimitry Andric static void Initialize(); 255ffd83dbSDimitry Andric static void Terminate(); 265ffd83dbSDimitry Andric 27*349cc55cSDimitry Andric static llvm::StringRef GetPluginNameStatic() { return "wasm"; } 285ffd83dbSDimitry Andric static const char *GetPluginDescriptionStatic() { 295ffd83dbSDimitry Andric return "WebAssembly object file reader."; 305ffd83dbSDimitry Andric } 315ffd83dbSDimitry Andric 325ffd83dbSDimitry Andric static ObjectFile * 335ffd83dbSDimitry Andric CreateInstance(const lldb::ModuleSP &module_sp, lldb::DataBufferSP &data_sp, 345ffd83dbSDimitry Andric lldb::offset_t data_offset, const FileSpec *file, 355ffd83dbSDimitry Andric lldb::offset_t file_offset, lldb::offset_t length); 365ffd83dbSDimitry Andric 375ffd83dbSDimitry Andric static ObjectFile *CreateMemoryInstance(const lldb::ModuleSP &module_sp, 385ffd83dbSDimitry Andric lldb::DataBufferSP &data_sp, 395ffd83dbSDimitry Andric const lldb::ProcessSP &process_sp, 405ffd83dbSDimitry Andric lldb::addr_t header_addr); 415ffd83dbSDimitry Andric 425ffd83dbSDimitry Andric static size_t GetModuleSpecifications(const FileSpec &file, 435ffd83dbSDimitry Andric lldb::DataBufferSP &data_sp, 445ffd83dbSDimitry Andric lldb::offset_t data_offset, 455ffd83dbSDimitry Andric lldb::offset_t file_offset, 465ffd83dbSDimitry Andric lldb::offset_t length, 475ffd83dbSDimitry Andric ModuleSpecList &specs); 485ffd83dbSDimitry Andric 495ffd83dbSDimitry Andric /// PluginInterface protocol. 505ffd83dbSDimitry Andric /// \{ 51*349cc55cSDimitry Andric llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } 525ffd83dbSDimitry Andric /// \} 535ffd83dbSDimitry Andric 545ffd83dbSDimitry Andric /// LLVM RTTI support 555ffd83dbSDimitry Andric /// \{ 565ffd83dbSDimitry Andric static char ID; 575ffd83dbSDimitry Andric bool isA(const void *ClassID) const override { 585ffd83dbSDimitry Andric return ClassID == &ID || ObjectFile::isA(ClassID); 595ffd83dbSDimitry Andric } 605ffd83dbSDimitry Andric static bool classof(const ObjectFile *obj) { return obj->isA(&ID); } 615ffd83dbSDimitry Andric /// \} 625ffd83dbSDimitry Andric 635ffd83dbSDimitry Andric /// ObjectFile Protocol. 645ffd83dbSDimitry Andric /// \{ 655ffd83dbSDimitry Andric bool ParseHeader() override; 665ffd83dbSDimitry Andric 675ffd83dbSDimitry Andric lldb::ByteOrder GetByteOrder() const override { 685ffd83dbSDimitry Andric return m_arch.GetByteOrder(); 695ffd83dbSDimitry Andric } 705ffd83dbSDimitry Andric 715ffd83dbSDimitry Andric bool IsExecutable() const override { return false; } 725ffd83dbSDimitry Andric 735ffd83dbSDimitry Andric uint32_t GetAddressByteSize() const override { 745ffd83dbSDimitry Andric return m_arch.GetAddressByteSize(); 755ffd83dbSDimitry Andric } 765ffd83dbSDimitry Andric 775ffd83dbSDimitry Andric AddressClass GetAddressClass(lldb::addr_t file_addr) override { 785ffd83dbSDimitry Andric return AddressClass::eInvalid; 795ffd83dbSDimitry Andric } 805ffd83dbSDimitry Andric 815ffd83dbSDimitry Andric Symtab *GetSymtab() override; 825ffd83dbSDimitry Andric 835ffd83dbSDimitry Andric bool IsStripped() override { return !!GetExternalDebugInfoFileSpec(); } 845ffd83dbSDimitry Andric 855ffd83dbSDimitry Andric void CreateSections(SectionList &unified_section_list) override; 865ffd83dbSDimitry Andric 875ffd83dbSDimitry Andric void Dump(Stream *s) override; 885ffd83dbSDimitry Andric 895ffd83dbSDimitry Andric ArchSpec GetArchitecture() override { return m_arch; } 905ffd83dbSDimitry Andric 915ffd83dbSDimitry Andric UUID GetUUID() override { return m_uuid; } 925ffd83dbSDimitry Andric 935ffd83dbSDimitry Andric uint32_t GetDependentModules(FileSpecList &files) override { return 0; } 945ffd83dbSDimitry Andric 955ffd83dbSDimitry Andric Type CalculateType() override { return eTypeSharedLibrary; } 965ffd83dbSDimitry Andric 975ffd83dbSDimitry Andric Strata CalculateStrata() override { return eStrataUser; } 985ffd83dbSDimitry Andric 995ffd83dbSDimitry Andric bool SetLoadAddress(lldb_private::Target &target, lldb::addr_t value, 1005ffd83dbSDimitry Andric bool value_is_offset) override; 1015ffd83dbSDimitry Andric 1025ffd83dbSDimitry Andric lldb_private::Address GetBaseAddress() override { 1035ffd83dbSDimitry Andric return IsInMemory() ? Address(m_memory_addr) : Address(0); 1045ffd83dbSDimitry Andric } 1055ffd83dbSDimitry Andric /// \} 1065ffd83dbSDimitry Andric 1075ffd83dbSDimitry Andric /// A Wasm module that has external DWARF debug information should contain a 1085ffd83dbSDimitry Andric /// custom section named "external_debug_info", whose payload is an UTF-8 1095ffd83dbSDimitry Andric /// encoded string that points to a Wasm module that contains the debug 1105ffd83dbSDimitry Andric /// information for this module. 1115ffd83dbSDimitry Andric llvm::Optional<FileSpec> GetExternalDebugInfoFileSpec(); 1125ffd83dbSDimitry Andric 1135ffd83dbSDimitry Andric private: 1145ffd83dbSDimitry Andric ObjectFileWasm(const lldb::ModuleSP &module_sp, lldb::DataBufferSP &data_sp, 1155ffd83dbSDimitry Andric lldb::offset_t data_offset, const FileSpec *file, 1165ffd83dbSDimitry Andric lldb::offset_t offset, lldb::offset_t length); 1175ffd83dbSDimitry Andric ObjectFileWasm(const lldb::ModuleSP &module_sp, 1185ffd83dbSDimitry Andric lldb::DataBufferSP &header_data_sp, 1195ffd83dbSDimitry Andric const lldb::ProcessSP &process_sp, lldb::addr_t header_addr); 1205ffd83dbSDimitry Andric 1215ffd83dbSDimitry Andric /// Wasm section decoding routines. 1225ffd83dbSDimitry Andric /// \{ 1235ffd83dbSDimitry Andric bool DecodeNextSection(lldb::offset_t *offset_ptr); 1245ffd83dbSDimitry Andric bool DecodeSections(); 1255ffd83dbSDimitry Andric /// \} 1265ffd83dbSDimitry Andric 1275ffd83dbSDimitry Andric /// Read a range of bytes from the Wasm module. 1285ffd83dbSDimitry Andric DataExtractor ReadImageData(lldb::offset_t offset, uint32_t size); 1295ffd83dbSDimitry Andric 1305ffd83dbSDimitry Andric typedef struct section_info { 1315ffd83dbSDimitry Andric lldb::offset_t offset; 1325ffd83dbSDimitry Andric uint32_t size; 1335ffd83dbSDimitry Andric uint32_t id; 1345ffd83dbSDimitry Andric ConstString name; 1355ffd83dbSDimitry Andric } section_info_t; 1365ffd83dbSDimitry Andric 1375ffd83dbSDimitry Andric /// Wasm section header dump routines. 1385ffd83dbSDimitry Andric /// \{ 1395ffd83dbSDimitry Andric void DumpSectionHeader(llvm::raw_ostream &ostream, const section_info_t &sh); 1405ffd83dbSDimitry Andric void DumpSectionHeaders(llvm::raw_ostream &ostream); 1415ffd83dbSDimitry Andric /// \} 1425ffd83dbSDimitry Andric 1435ffd83dbSDimitry Andric std::vector<section_info_t> m_sect_infos; 1445ffd83dbSDimitry Andric ArchSpec m_arch; 1455ffd83dbSDimitry Andric UUID m_uuid; 1465ffd83dbSDimitry Andric }; 1475ffd83dbSDimitry Andric 1485ffd83dbSDimitry Andric } // namespace wasm 1495ffd83dbSDimitry Andric } // namespace lldb_private 1505ffd83dbSDimitry Andric #endif // LLDB_SOURCE_PLUGINS_OBJECTFILE_WASM_OBJECTFILEWASM_H 151