xref: /src/contrib/llvm-project/lldb/source/Plugins/ObjectFile/JSON/ObjectFileJSON.h (revision 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e)
17fa27ce4SDimitry Andric //===-- ObjectFileJSON.h -------------------------------------- -*- C++ -*-===//
27fa27ce4SDimitry Andric //
37fa27ce4SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
47fa27ce4SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
57fa27ce4SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67fa27ce4SDimitry Andric //
77fa27ce4SDimitry Andric //===----------------------------------------------------------------------===//
87fa27ce4SDimitry Andric 
97fa27ce4SDimitry Andric #ifndef LLDB_SOURCE_PLUGINS_OBJECTFILE_JSON_OBJECTFILEJSON_H
107fa27ce4SDimitry Andric #define LLDB_SOURCE_PLUGINS_OBJECTFILE_JSON_OBJECTFILEJSON_H
117fa27ce4SDimitry Andric 
127fa27ce4SDimitry Andric #include "lldb/Symbol/ObjectFile.h"
137fa27ce4SDimitry Andric #include "lldb/Utility/ArchSpec.h"
147fa27ce4SDimitry Andric #include "llvm/Support/JSON.h"
157fa27ce4SDimitry Andric 
167fa27ce4SDimitry Andric namespace lldb_private {
177fa27ce4SDimitry Andric 
187fa27ce4SDimitry Andric class ObjectFileJSON : public ObjectFile {
197fa27ce4SDimitry Andric public:
207fa27ce4SDimitry Andric   static void Initialize();
217fa27ce4SDimitry Andric   static void Terminate();
227fa27ce4SDimitry Andric 
GetPluginNameStatic()237fa27ce4SDimitry Andric   static llvm::StringRef GetPluginNameStatic() { return "JSON"; }
247fa27ce4SDimitry Andric 
GetPluginDescriptionStatic()257fa27ce4SDimitry Andric   static const char *GetPluginDescriptionStatic() {
267fa27ce4SDimitry Andric     return "JSON object file reader.";
277fa27ce4SDimitry Andric   }
287fa27ce4SDimitry Andric 
297fa27ce4SDimitry Andric   static ObjectFile *
307fa27ce4SDimitry Andric   CreateInstance(const lldb::ModuleSP &module_sp, lldb::DataBufferSP data_sp,
317fa27ce4SDimitry Andric                  lldb::offset_t data_offset, const FileSpec *file,
327fa27ce4SDimitry Andric                  lldb::offset_t file_offset, lldb::offset_t length);
337fa27ce4SDimitry Andric 
347fa27ce4SDimitry Andric   static ObjectFile *CreateMemoryInstance(const lldb::ModuleSP &module_sp,
357fa27ce4SDimitry Andric                                           lldb::WritableDataBufferSP data_sp,
367fa27ce4SDimitry Andric                                           const lldb::ProcessSP &process_sp,
377fa27ce4SDimitry Andric                                           lldb::addr_t header_addr);
387fa27ce4SDimitry Andric 
397fa27ce4SDimitry Andric   static size_t GetModuleSpecifications(const FileSpec &file,
407fa27ce4SDimitry Andric                                         lldb::DataBufferSP &data_sp,
417fa27ce4SDimitry Andric                                         lldb::offset_t data_offset,
427fa27ce4SDimitry Andric                                         lldb::offset_t file_offset,
437fa27ce4SDimitry Andric                                         lldb::offset_t length,
447fa27ce4SDimitry Andric                                         ModuleSpecList &specs);
457fa27ce4SDimitry Andric 
GetPluginName()467fa27ce4SDimitry Andric   llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }
477fa27ce4SDimitry Andric 
487fa27ce4SDimitry Andric   // LLVM RTTI support
497fa27ce4SDimitry Andric   static char ID;
isA(const void * ClassID)507fa27ce4SDimitry Andric   bool isA(const void *ClassID) const override {
517fa27ce4SDimitry Andric     return ClassID == &ID || ObjectFile::isA(ClassID);
527fa27ce4SDimitry Andric   }
classof(const ObjectFile * obj)537fa27ce4SDimitry Andric   static bool classof(const ObjectFile *obj) { return obj->isA(&ID); }
547fa27ce4SDimitry Andric 
557fa27ce4SDimitry Andric   bool ParseHeader() override;
567fa27ce4SDimitry Andric 
GetByteOrder()577fa27ce4SDimitry Andric   lldb::ByteOrder GetByteOrder() const override {
587fa27ce4SDimitry Andric     return m_arch.GetByteOrder();
597fa27ce4SDimitry Andric   }
607fa27ce4SDimitry Andric 
IsExecutable()617fa27ce4SDimitry Andric   bool IsExecutable() const override { return false; }
627fa27ce4SDimitry Andric 
GetAddressByteSize()637fa27ce4SDimitry Andric   uint32_t GetAddressByteSize() const override {
647fa27ce4SDimitry Andric     return m_arch.GetAddressByteSize();
657fa27ce4SDimitry Andric   }
667fa27ce4SDimitry Andric 
GetAddressClass(lldb::addr_t file_addr)677fa27ce4SDimitry Andric   AddressClass GetAddressClass(lldb::addr_t file_addr) override {
687fa27ce4SDimitry Andric     return AddressClass::eInvalid;
697fa27ce4SDimitry Andric   }
707fa27ce4SDimitry Andric 
717fa27ce4SDimitry Andric   void ParseSymtab(lldb_private::Symtab &symtab) override;
727fa27ce4SDimitry Andric 
IsStripped()737fa27ce4SDimitry Andric   bool IsStripped() override { return false; }
747fa27ce4SDimitry Andric 
757fa27ce4SDimitry Andric   void CreateSections(SectionList &unified_section_list) override;
767fa27ce4SDimitry Andric 
Dump(Stream * s)777fa27ce4SDimitry Andric   void Dump(Stream *s) override {}
787fa27ce4SDimitry Andric 
GetArchitecture()797fa27ce4SDimitry Andric   ArchSpec GetArchitecture() override { return m_arch; }
807fa27ce4SDimitry Andric 
GetUUID()817fa27ce4SDimitry Andric   UUID GetUUID() override { return m_uuid; }
827fa27ce4SDimitry Andric 
GetDependentModules(FileSpecList & files)837fa27ce4SDimitry Andric   uint32_t GetDependentModules(FileSpecList &files) override { return 0; }
847fa27ce4SDimitry Andric 
CalculateType()857fa27ce4SDimitry Andric   Type CalculateType() override { return m_type; }
867fa27ce4SDimitry Andric 
CalculateStrata()877fa27ce4SDimitry Andric   Strata CalculateStrata() override { return eStrataUser; }
887fa27ce4SDimitry Andric 
897fa27ce4SDimitry Andric   static bool MagicBytesMatch(lldb::DataBufferSP data_sp, lldb::addr_t offset,
907fa27ce4SDimitry Andric                               lldb::addr_t length);
917fa27ce4SDimitry Andric 
927fa27ce4SDimitry Andric   struct Header {
937fa27ce4SDimitry Andric     std::string triple;
947fa27ce4SDimitry Andric     std::string uuid;
957fa27ce4SDimitry Andric     std::optional<ObjectFile::Type> type;
967fa27ce4SDimitry Andric   };
977fa27ce4SDimitry Andric 
987fa27ce4SDimitry Andric   struct Body {
997fa27ce4SDimitry Andric     std::vector<JSONSection> sections;
1007fa27ce4SDimitry Andric     std::vector<JSONSymbol> symbols;
1017fa27ce4SDimitry Andric   };
1027fa27ce4SDimitry Andric 
1037fa27ce4SDimitry Andric private:
1047fa27ce4SDimitry Andric   ArchSpec m_arch;
1057fa27ce4SDimitry Andric   UUID m_uuid;
1067fa27ce4SDimitry Andric   ObjectFile::Type m_type;
1077fa27ce4SDimitry Andric   std::optional<uint64_t> m_size;
1087fa27ce4SDimitry Andric   std::vector<JSONSymbol> m_symbols;
1097fa27ce4SDimitry Andric   std::vector<JSONSection> m_sections;
1107fa27ce4SDimitry Andric 
1117fa27ce4SDimitry Andric   ObjectFileJSON(const lldb::ModuleSP &module_sp, lldb::DataBufferSP &data_sp,
1127fa27ce4SDimitry Andric                  lldb::offset_t data_offset, const FileSpec *file,
1137fa27ce4SDimitry Andric                  lldb::offset_t offset, lldb::offset_t length, ArchSpec arch,
1147fa27ce4SDimitry Andric                  UUID uuid, Type type, std::vector<JSONSymbol> symbols,
1157fa27ce4SDimitry Andric                  std::vector<JSONSection> sections);
1167fa27ce4SDimitry Andric };
1177fa27ce4SDimitry Andric 
1187fa27ce4SDimitry Andric bool fromJSON(const llvm::json::Value &value, ObjectFileJSON::Header &header,
1197fa27ce4SDimitry Andric               llvm::json::Path path);
1207fa27ce4SDimitry Andric 
1217fa27ce4SDimitry Andric bool fromJSON(const llvm::json::Value &value, ObjectFileJSON::Body &body,
1227fa27ce4SDimitry Andric               llvm::json::Path path);
1237fa27ce4SDimitry Andric 
1247fa27ce4SDimitry Andric } // namespace lldb_private
1257fa27ce4SDimitry Andric #endif // LLDB_SOURCE_PLUGINS_OBJECTFILE_JSON_OBJECTFILEJSON_H
126