brintos

brintos / llvm-project-archived public Read only

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