xref: /freebsd-src/contrib/llvm-project/lldb/source/Plugins/ObjectFile/wasm/ObjectFileWasm.h (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
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"
14*bdd1243dSDimitry Andric #include <optional>
155ffd83dbSDimitry Andric 
165ffd83dbSDimitry Andric namespace lldb_private {
175ffd83dbSDimitry Andric namespace wasm {
185ffd83dbSDimitry Andric 
195ffd83dbSDimitry Andric /// Generic Wasm object file reader.
205ffd83dbSDimitry Andric ///
215ffd83dbSDimitry Andric /// This class provides a generic wasm32 reader plugin implementing the
225ffd83dbSDimitry Andric /// ObjectFile protocol.
235ffd83dbSDimitry Andric class ObjectFileWasm : public ObjectFile {
245ffd83dbSDimitry Andric public:
255ffd83dbSDimitry Andric   static void Initialize();
265ffd83dbSDimitry Andric   static void Terminate();
275ffd83dbSDimitry Andric 
GetPluginNameStatic()28349cc55cSDimitry Andric   static llvm::StringRef GetPluginNameStatic() { return "wasm"; }
GetPluginDescriptionStatic()295ffd83dbSDimitry Andric   static const char *GetPluginDescriptionStatic() {
305ffd83dbSDimitry Andric     return "WebAssembly object file reader.";
315ffd83dbSDimitry Andric   }
325ffd83dbSDimitry Andric 
335ffd83dbSDimitry Andric   static ObjectFile *
3481ad6265SDimitry Andric   CreateInstance(const lldb::ModuleSP &module_sp, lldb::DataBufferSP data_sp,
355ffd83dbSDimitry Andric                  lldb::offset_t data_offset, const FileSpec *file,
365ffd83dbSDimitry Andric                  lldb::offset_t file_offset, lldb::offset_t length);
375ffd83dbSDimitry Andric 
385ffd83dbSDimitry Andric   static ObjectFile *CreateMemoryInstance(const lldb::ModuleSP &module_sp,
3981ad6265SDimitry Andric                                           lldb::WritableDataBufferSP data_sp,
405ffd83dbSDimitry Andric                                           const lldb::ProcessSP &process_sp,
415ffd83dbSDimitry Andric                                           lldb::addr_t header_addr);
425ffd83dbSDimitry Andric 
435ffd83dbSDimitry Andric   static size_t GetModuleSpecifications(const FileSpec &file,
445ffd83dbSDimitry Andric                                         lldb::DataBufferSP &data_sp,
455ffd83dbSDimitry Andric                                         lldb::offset_t data_offset,
465ffd83dbSDimitry Andric                                         lldb::offset_t file_offset,
475ffd83dbSDimitry Andric                                         lldb::offset_t length,
485ffd83dbSDimitry Andric                                         ModuleSpecList &specs);
495ffd83dbSDimitry Andric 
505ffd83dbSDimitry Andric   /// PluginInterface protocol.
515ffd83dbSDimitry Andric   /// \{
GetPluginName()52349cc55cSDimitry Andric   llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }
535ffd83dbSDimitry Andric   /// \}
545ffd83dbSDimitry Andric 
555ffd83dbSDimitry Andric   /// LLVM RTTI support
565ffd83dbSDimitry Andric   /// \{
575ffd83dbSDimitry Andric   static char ID;
isA(const void * ClassID)585ffd83dbSDimitry Andric   bool isA(const void *ClassID) const override {
595ffd83dbSDimitry Andric     return ClassID == &ID || ObjectFile::isA(ClassID);
605ffd83dbSDimitry Andric   }
classof(const ObjectFile * obj)615ffd83dbSDimitry Andric   static bool classof(const ObjectFile *obj) { return obj->isA(&ID); }
625ffd83dbSDimitry Andric   /// \}
635ffd83dbSDimitry Andric 
645ffd83dbSDimitry Andric   /// ObjectFile Protocol.
655ffd83dbSDimitry Andric   /// \{
665ffd83dbSDimitry Andric   bool ParseHeader() override;
675ffd83dbSDimitry Andric 
GetByteOrder()685ffd83dbSDimitry Andric   lldb::ByteOrder GetByteOrder() const override {
695ffd83dbSDimitry Andric     return m_arch.GetByteOrder();
705ffd83dbSDimitry Andric   }
715ffd83dbSDimitry Andric 
IsExecutable()725ffd83dbSDimitry Andric   bool IsExecutable() const override { return false; }
735ffd83dbSDimitry Andric 
GetAddressByteSize()745ffd83dbSDimitry Andric   uint32_t GetAddressByteSize() const override {
755ffd83dbSDimitry Andric     return m_arch.GetAddressByteSize();
765ffd83dbSDimitry Andric   }
775ffd83dbSDimitry Andric 
GetAddressClass(lldb::addr_t file_addr)785ffd83dbSDimitry Andric   AddressClass GetAddressClass(lldb::addr_t file_addr) override {
795ffd83dbSDimitry Andric     return AddressClass::eInvalid;
805ffd83dbSDimitry Andric   }
815ffd83dbSDimitry Andric 
824824e7fdSDimitry Andric   void ParseSymtab(lldb_private::Symtab &symtab) override;
835ffd83dbSDimitry Andric 
IsStripped()845ffd83dbSDimitry Andric   bool IsStripped() override { return !!GetExternalDebugInfoFileSpec(); }
855ffd83dbSDimitry Andric 
865ffd83dbSDimitry Andric   void CreateSections(SectionList &unified_section_list) override;
875ffd83dbSDimitry Andric 
885ffd83dbSDimitry Andric   void Dump(Stream *s) override;
895ffd83dbSDimitry Andric 
GetArchitecture()905ffd83dbSDimitry Andric   ArchSpec GetArchitecture() override { return m_arch; }
915ffd83dbSDimitry Andric 
GetUUID()925ffd83dbSDimitry Andric   UUID GetUUID() override { return m_uuid; }
935ffd83dbSDimitry Andric 
GetDependentModules(FileSpecList & files)945ffd83dbSDimitry Andric   uint32_t GetDependentModules(FileSpecList &files) override { return 0; }
955ffd83dbSDimitry Andric 
CalculateType()965ffd83dbSDimitry Andric   Type CalculateType() override { return eTypeSharedLibrary; }
975ffd83dbSDimitry Andric 
CalculateStrata()985ffd83dbSDimitry Andric   Strata CalculateStrata() override { return eStrataUser; }
995ffd83dbSDimitry Andric 
1005ffd83dbSDimitry Andric   bool SetLoadAddress(lldb_private::Target &target, lldb::addr_t value,
1015ffd83dbSDimitry Andric                       bool value_is_offset) override;
1025ffd83dbSDimitry Andric 
GetBaseAddress()1035ffd83dbSDimitry Andric   lldb_private::Address GetBaseAddress() override {
1045ffd83dbSDimitry Andric     return IsInMemory() ? Address(m_memory_addr) : Address(0);
1055ffd83dbSDimitry Andric   }
1065ffd83dbSDimitry Andric   /// \}
1075ffd83dbSDimitry Andric 
1085ffd83dbSDimitry Andric   /// A Wasm module that has external DWARF debug information should contain a
1095ffd83dbSDimitry Andric   /// custom section named "external_debug_info", whose payload is an UTF-8
1105ffd83dbSDimitry Andric   /// encoded string that points to a Wasm module that contains the debug
1115ffd83dbSDimitry Andric   /// information for this module.
112*bdd1243dSDimitry Andric   std::optional<FileSpec> GetExternalDebugInfoFileSpec();
1135ffd83dbSDimitry Andric 
1145ffd83dbSDimitry Andric private:
11581ad6265SDimitry Andric   ObjectFileWasm(const lldb::ModuleSP &module_sp, lldb::DataBufferSP data_sp,
1165ffd83dbSDimitry Andric                  lldb::offset_t data_offset, const FileSpec *file,
1175ffd83dbSDimitry Andric                  lldb::offset_t offset, lldb::offset_t length);
1185ffd83dbSDimitry Andric   ObjectFileWasm(const lldb::ModuleSP &module_sp,
11981ad6265SDimitry Andric                  lldb::WritableDataBufferSP header_data_sp,
1205ffd83dbSDimitry Andric                  const lldb::ProcessSP &process_sp, lldb::addr_t header_addr);
1215ffd83dbSDimitry Andric 
1225ffd83dbSDimitry Andric   /// Wasm section decoding routines.
1235ffd83dbSDimitry Andric   /// \{
1245ffd83dbSDimitry Andric   bool DecodeNextSection(lldb::offset_t *offset_ptr);
1255ffd83dbSDimitry Andric   bool DecodeSections();
1265ffd83dbSDimitry Andric   /// \}
1275ffd83dbSDimitry Andric 
1285ffd83dbSDimitry Andric   /// Read a range of bytes from the Wasm module.
1295ffd83dbSDimitry Andric   DataExtractor ReadImageData(lldb::offset_t offset, uint32_t size);
1305ffd83dbSDimitry Andric 
1315ffd83dbSDimitry Andric   typedef struct section_info {
1325ffd83dbSDimitry Andric     lldb::offset_t offset;
1335ffd83dbSDimitry Andric     uint32_t size;
1345ffd83dbSDimitry Andric     uint32_t id;
1355ffd83dbSDimitry Andric     ConstString name;
1365ffd83dbSDimitry Andric   } section_info_t;
1375ffd83dbSDimitry Andric 
1385ffd83dbSDimitry Andric   /// Wasm section header dump routines.
1395ffd83dbSDimitry Andric   /// \{
1405ffd83dbSDimitry Andric   void DumpSectionHeader(llvm::raw_ostream &ostream, const section_info_t &sh);
1415ffd83dbSDimitry Andric   void DumpSectionHeaders(llvm::raw_ostream &ostream);
1425ffd83dbSDimitry Andric   /// \}
1435ffd83dbSDimitry Andric 
1445ffd83dbSDimitry Andric   std::vector<section_info_t> m_sect_infos;
1455ffd83dbSDimitry Andric   ArchSpec m_arch;
1465ffd83dbSDimitry Andric   UUID m_uuid;
1475ffd83dbSDimitry Andric };
1485ffd83dbSDimitry Andric 
1495ffd83dbSDimitry Andric } // namespace wasm
1505ffd83dbSDimitry Andric } // namespace lldb_private
1515ffd83dbSDimitry Andric #endif // LLDB_SOURCE_PLUGINS_OBJECTFILE_WASM_OBJECTFILEWASM_H
152