xref: /freebsd-src/contrib/llvm-project/lldb/source/Plugins/ObjectFile/wasm/ObjectFileWasm.h (revision 349cc55c9796c4596a5b9904cd3281af295f878f)
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