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