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