xref: /llvm-project/lldb/source/Plugins/ObjectFile/wasm/ObjectFileWasm.h (revision 2fe8327406050d2585d2ced910a678e28caefcf5)
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