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