brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.2 KiB · 029c8ff Raw
129 lines · c
1//===-- ObjectFileJSON.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_JSON_OBJECTFILEJSON_H10#define LLDB_SOURCE_PLUGINS_OBJECTFILE_JSON_OBJECTFILEJSON_H11 12#include "lldb/Symbol/ObjectFile.h"13#include "lldb/Utility/ArchSpec.h"14#include "llvm/Support/JSON.h"15 16namespace lldb_private {17 18class ObjectFileJSON : public ObjectFile {19public:20  static void Initialize();21  static void Terminate();22 23  static llvm::StringRef GetPluginNameStatic() { return "JSON"; }24 25  static const char *GetPluginDescriptionStatic() {26    return "JSON object file reader.";27  }28 29  static ObjectFile *30  CreateInstance(const lldb::ModuleSP &module_sp, lldb::DataBufferSP data_sp,31                 lldb::offset_t data_offset, const FileSpec *file,32                 lldb::offset_t file_offset, lldb::offset_t length);33 34  static ObjectFile *CreateMemoryInstance(const lldb::ModuleSP &module_sp,35                                          lldb::WritableDataBufferSP data_sp,36                                          const lldb::ProcessSP &process_sp,37                                          lldb::addr_t header_addr);38 39  static size_t GetModuleSpecifications(const FileSpec &file,40                                        lldb::DataBufferSP &data_sp,41                                        lldb::offset_t data_offset,42                                        lldb::offset_t file_offset,43                                        lldb::offset_t length,44                                        ModuleSpecList &specs);45 46  llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }47 48  // LLVM RTTI support49  static char ID;50  bool isA(const void *ClassID) const override {51    return ClassID == &ID || ObjectFile::isA(ClassID);52  }53  static bool classof(const ObjectFile *obj) { return obj->isA(&ID); }54 55  bool ParseHeader() override;56 57  lldb::ByteOrder GetByteOrder() const override {58    return m_arch.GetByteOrder();59  }60 61  bool IsExecutable() const override { return false; }62 63  uint32_t GetAddressByteSize() const override {64    return m_arch.GetAddressByteSize();65  }66 67  AddressClass GetAddressClass(lldb::addr_t file_addr) override {68    return AddressClass::eInvalid;69  }70 71  void ParseSymtab(lldb_private::Symtab &symtab) override;72 73  bool IsStripped() override { return false; }74 75  void CreateSections(SectionList &unified_section_list) override;76 77  void Dump(Stream *s) override {}78 79  ArchSpec GetArchitecture() override { return m_arch; }80 81  UUID GetUUID() override { return m_uuid; }82 83  uint32_t GetDependentModules(FileSpecList &files) override { return 0; }84 85  Type CalculateType() override { return m_type; }86 87  Strata CalculateStrata() override { return eStrataUser; }88 89  bool SetLoadAddress(Target &target, lldb::addr_t value,90                      bool value_is_offset) override;91 92  static bool MagicBytesMatch(lldb::DataBufferSP data_sp, lldb::addr_t offset,93                              lldb::addr_t length);94 95  struct Header {96    std::string triple;97    std::string uuid;98    std::optional<ObjectFile::Type> type;99  };100 101  struct Body {102    std::vector<JSONSection> sections;103    std::vector<JSONSymbol> symbols;104  };105 106private:107  ArchSpec m_arch;108  UUID m_uuid;109  ObjectFile::Type m_type;110  std::optional<uint64_t> m_size;111  std::vector<JSONSymbol> m_symbols;112  std::vector<JSONSection> m_sections;113 114  ObjectFileJSON(const lldb::ModuleSP &module_sp, lldb::DataBufferSP &data_sp,115                 lldb::offset_t data_offset, const FileSpec *file,116                 lldb::offset_t offset, lldb::offset_t length, ArchSpec arch,117                 UUID uuid, Type type, std::vector<JSONSymbol> symbols,118                 std::vector<JSONSection> sections);119};120 121bool fromJSON(const llvm::json::Value &value, ObjectFileJSON::Header &header,122              llvm::json::Path path);123 124bool fromJSON(const llvm::json::Value &value, ObjectFileJSON::Body &body,125              llvm::json::Path path);126 127} // namespace lldb_private128#endif // LLDB_SOURCE_PLUGINS_OBJECTFILE_JSON_OBJECTFILEJSON_H129