xref: /openbsd-src/gnu/llvm/lldb/source/Plugins/ObjectFile/wasm/ObjectFileWasm.h (revision f6aab3d83b51b91c24247ad2c2573574de475a82)
1dda28197Spatrick //===-- ObjectFileWasm.h ----------------------------------------*- C++ -*-===//
2dda28197Spatrick //
3dda28197Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4dda28197Spatrick // See https://llvm.org/LICENSE.txt for license information.
5dda28197Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6dda28197Spatrick //
7dda28197Spatrick //===----------------------------------------------------------------------===//
8dda28197Spatrick 
9dda28197Spatrick #ifndef LLDB_SOURCE_PLUGINS_OBJECTFILE_WASM_OBJECTFILEWASM_H
10dda28197Spatrick #define LLDB_SOURCE_PLUGINS_OBJECTFILE_WASM_OBJECTFILEWASM_H
11dda28197Spatrick 
12dda28197Spatrick #include "lldb/Symbol/ObjectFile.h"
13dda28197Spatrick #include "lldb/Utility/ArchSpec.h"
14*f6aab3d8Srobert #include <optional>
15dda28197Spatrick 
16dda28197Spatrick namespace lldb_private {
17dda28197Spatrick namespace wasm {
18dda28197Spatrick 
19dda28197Spatrick /// Generic Wasm object file reader.
20dda28197Spatrick ///
21dda28197Spatrick /// This class provides a generic wasm32 reader plugin implementing the
22dda28197Spatrick /// ObjectFile protocol.
23dda28197Spatrick class ObjectFileWasm : public ObjectFile {
24dda28197Spatrick public:
25dda28197Spatrick   static void Initialize();
26dda28197Spatrick   static void Terminate();
27dda28197Spatrick 
GetPluginNameStatic()28*f6aab3d8Srobert   static llvm::StringRef GetPluginNameStatic() { return "wasm"; }
GetPluginDescriptionStatic()29dda28197Spatrick   static const char *GetPluginDescriptionStatic() {
30dda28197Spatrick     return "WebAssembly object file reader.";
31dda28197Spatrick   }
32dda28197Spatrick 
33dda28197Spatrick   static ObjectFile *
34*f6aab3d8Srobert   CreateInstance(const lldb::ModuleSP &module_sp, lldb::DataBufferSP data_sp,
35dda28197Spatrick                  lldb::offset_t data_offset, const FileSpec *file,
36dda28197Spatrick                  lldb::offset_t file_offset, lldb::offset_t length);
37dda28197Spatrick 
38dda28197Spatrick   static ObjectFile *CreateMemoryInstance(const lldb::ModuleSP &module_sp,
39*f6aab3d8Srobert                                           lldb::WritableDataBufferSP data_sp,
40dda28197Spatrick                                           const lldb::ProcessSP &process_sp,
41dda28197Spatrick                                           lldb::addr_t header_addr);
42dda28197Spatrick 
43dda28197Spatrick   static size_t GetModuleSpecifications(const FileSpec &file,
44dda28197Spatrick                                         lldb::DataBufferSP &data_sp,
45dda28197Spatrick                                         lldb::offset_t data_offset,
46dda28197Spatrick                                         lldb::offset_t file_offset,
47dda28197Spatrick                                         lldb::offset_t length,
48dda28197Spatrick                                         ModuleSpecList &specs);
49dda28197Spatrick 
50dda28197Spatrick   /// PluginInterface protocol.
51dda28197Spatrick   /// \{
GetPluginName()52*f6aab3d8Srobert   llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }
53dda28197Spatrick   /// \}
54dda28197Spatrick 
55dda28197Spatrick   /// LLVM RTTI support
56dda28197Spatrick   /// \{
57dda28197Spatrick   static char ID;
isA(const void * ClassID)58dda28197Spatrick   bool isA(const void *ClassID) const override {
59dda28197Spatrick     return ClassID == &ID || ObjectFile::isA(ClassID);
60dda28197Spatrick   }
classof(const ObjectFile * obj)61dda28197Spatrick   static bool classof(const ObjectFile *obj) { return obj->isA(&ID); }
62dda28197Spatrick   /// \}
63dda28197Spatrick 
64dda28197Spatrick   /// ObjectFile Protocol.
65dda28197Spatrick   /// \{
66dda28197Spatrick   bool ParseHeader() override;
67dda28197Spatrick 
GetByteOrder()68dda28197Spatrick   lldb::ByteOrder GetByteOrder() const override {
69dda28197Spatrick     return m_arch.GetByteOrder();
70dda28197Spatrick   }
71dda28197Spatrick 
IsExecutable()72dda28197Spatrick   bool IsExecutable() const override { return false; }
73dda28197Spatrick 
GetAddressByteSize()74dda28197Spatrick   uint32_t GetAddressByteSize() const override {
75dda28197Spatrick     return m_arch.GetAddressByteSize();
76dda28197Spatrick   }
77dda28197Spatrick 
GetAddressClass(lldb::addr_t file_addr)78dda28197Spatrick   AddressClass GetAddressClass(lldb::addr_t file_addr) override {
79dda28197Spatrick     return AddressClass::eInvalid;
80dda28197Spatrick   }
81dda28197Spatrick 
82*f6aab3d8Srobert   void ParseSymtab(lldb_private::Symtab &symtab) override;
83dda28197Spatrick 
IsStripped()84dda28197Spatrick   bool IsStripped() override { return !!GetExternalDebugInfoFileSpec(); }
85dda28197Spatrick 
86dda28197Spatrick   void CreateSections(SectionList &unified_section_list) override;
87dda28197Spatrick 
88dda28197Spatrick   void Dump(Stream *s) override;
89dda28197Spatrick 
GetArchitecture()90dda28197Spatrick   ArchSpec GetArchitecture() override { return m_arch; }
91dda28197Spatrick 
GetUUID()92dda28197Spatrick   UUID GetUUID() override { return m_uuid; }
93dda28197Spatrick 
GetDependentModules(FileSpecList & files)94dda28197Spatrick   uint32_t GetDependentModules(FileSpecList &files) override { return 0; }
95dda28197Spatrick 
CalculateType()96dda28197Spatrick   Type CalculateType() override { return eTypeSharedLibrary; }
97dda28197Spatrick 
CalculateStrata()98dda28197Spatrick   Strata CalculateStrata() override { return eStrataUser; }
99dda28197Spatrick 
100dda28197Spatrick   bool SetLoadAddress(lldb_private::Target &target, lldb::addr_t value,
101dda28197Spatrick                       bool value_is_offset) override;
102dda28197Spatrick 
GetBaseAddress()103dda28197Spatrick   lldb_private::Address GetBaseAddress() override {
104dda28197Spatrick     return IsInMemory() ? Address(m_memory_addr) : Address(0);
105dda28197Spatrick   }
106dda28197Spatrick   /// \}
107dda28197Spatrick 
108dda28197Spatrick   /// A Wasm module that has external DWARF debug information should contain a
109dda28197Spatrick   /// custom section named "external_debug_info", whose payload is an UTF-8
110dda28197Spatrick   /// encoded string that points to a Wasm module that contains the debug
111dda28197Spatrick   /// information for this module.
112*f6aab3d8Srobert   std::optional<FileSpec> GetExternalDebugInfoFileSpec();
113dda28197Spatrick 
114dda28197Spatrick private:
115*f6aab3d8Srobert   ObjectFileWasm(const lldb::ModuleSP &module_sp, lldb::DataBufferSP data_sp,
116dda28197Spatrick                  lldb::offset_t data_offset, const FileSpec *file,
117dda28197Spatrick                  lldb::offset_t offset, lldb::offset_t length);
118dda28197Spatrick   ObjectFileWasm(const lldb::ModuleSP &module_sp,
119*f6aab3d8Srobert                  lldb::WritableDataBufferSP header_data_sp,
120dda28197Spatrick                  const lldb::ProcessSP &process_sp, lldb::addr_t header_addr);
121dda28197Spatrick 
122dda28197Spatrick   /// Wasm section decoding routines.
123dda28197Spatrick   /// \{
124dda28197Spatrick   bool DecodeNextSection(lldb::offset_t *offset_ptr);
125dda28197Spatrick   bool DecodeSections();
126dda28197Spatrick   /// \}
127dda28197Spatrick 
128dda28197Spatrick   /// Read a range of bytes from the Wasm module.
129dda28197Spatrick   DataExtractor ReadImageData(lldb::offset_t offset, uint32_t size);
130dda28197Spatrick 
131dda28197Spatrick   typedef struct section_info {
132dda28197Spatrick     lldb::offset_t offset;
133dda28197Spatrick     uint32_t size;
134dda28197Spatrick     uint32_t id;
135dda28197Spatrick     ConstString name;
136dda28197Spatrick   } section_info_t;
137dda28197Spatrick 
138dda28197Spatrick   /// Wasm section header dump routines.
139dda28197Spatrick   /// \{
140dda28197Spatrick   void DumpSectionHeader(llvm::raw_ostream &ostream, const section_info_t &sh);
141dda28197Spatrick   void DumpSectionHeaders(llvm::raw_ostream &ostream);
142dda28197Spatrick   /// \}
143dda28197Spatrick 
144dda28197Spatrick   std::vector<section_info_t> m_sect_infos;
145dda28197Spatrick   ArchSpec m_arch;
146dda28197Spatrick   UUID m_uuid;
147dda28197Spatrick };
148dda28197Spatrick 
149dda28197Spatrick } // namespace wasm
150dda28197Spatrick } // namespace lldb_private
151dda28197Spatrick #endif // LLDB_SOURCE_PLUGINS_OBJECTFILE_WASM_OBJECTFILEWASM_H
152