diff options
Diffstat (limited to 'lldb/source/Plugins/ObjectFile/JSON')
-rw-r--r-- | lldb/source/Plugins/ObjectFile/JSON/ObjectFileJSON.cpp | 73 | ||||
-rw-r--r-- | lldb/source/Plugins/ObjectFile/JSON/ObjectFileJSON.h | 10 |
2 files changed, 66 insertions, 17 deletions
diff --git a/lldb/source/Plugins/ObjectFile/JSON/ObjectFileJSON.cpp b/lldb/source/Plugins/ObjectFile/JSON/ObjectFileJSON.cpp index 7cd836a..ffbd877 100644 --- a/lldb/source/Plugins/ObjectFile/JSON/ObjectFileJSON.cpp +++ b/lldb/source/Plugins/ObjectFile/JSON/ObjectFileJSON.cpp @@ -49,6 +49,7 @@ ObjectFileJSON::CreateInstance(const ModuleSP &module_sp, DataBufferSP data_sp, if (!MagicBytesMatch(data_sp, 0, data_sp->GetByteSize())) return nullptr; + // Update the data to contain the entire file if it doesn't already. if (data_sp->GetByteSize() < length) { data_sp = MapFileData(*file, length, file_offset); if (!data_sp) @@ -56,30 +57,41 @@ ObjectFileJSON::CreateInstance(const ModuleSP &module_sp, DataBufferSP data_sp, data_offset = 0; } + Log *log = GetLog(LLDBLog::Symbols); + auto text = llvm::StringRef(reinterpret_cast<const char *>(data_sp->GetBytes())); Expected<json::Value> json = json::parse(text); if (!json) { - llvm::consumeError(json.takeError()); + LLDB_LOG_ERROR(log, json.takeError(), + "failed to parse JSON object file: {0}"); return nullptr; } json::Path::Root root; Header header; - if (!fromJSON(*json, header, root)) + if (!fromJSON(*json, header, root)) { + LLDB_LOG_ERROR(log, root.getError(), + "failed to parse JSON object file header: {0}"); return nullptr; + } ArchSpec arch(header.triple); UUID uuid; uuid.SetFromStringRef(header.uuid); + Type type = header.type.value_or(eTypeDebugInfo); Body body; - fromJSON(*json, body, root); + if (!fromJSON(*json, body, root)) { + LLDB_LOG_ERROR(log, root.getError(), + "failed to parse JSON object file body: {0}"); + return nullptr; + } return new ObjectFileJSON(module_sp, data_sp, data_offset, file, file_offset, - length, std::move(arch), std::move(uuid), - std::move(body.symbols)); + length, std::move(arch), std::move(uuid), type, + std::move(body.symbols), std::move(body.sections)); } ObjectFile *ObjectFileJSON::CreateMemoryInstance(const ModuleSP &module_sp, @@ -92,23 +104,36 @@ ObjectFile *ObjectFileJSON::CreateMemoryInstance(const ModuleSP &module_sp, size_t ObjectFileJSON::GetModuleSpecifications( const FileSpec &file, DataBufferSP &data_sp, offset_t data_offset, offset_t file_offset, offset_t length, ModuleSpecList &specs) { - if (!MagicBytesMatch(data_sp, data_offset, data_sp->GetByteSize())) return 0; + // Update the data to contain the entire file if it doesn't already. + if (data_sp->GetByteSize() < length) { + data_sp = MapFileData(file, length, file_offset); + if (!data_sp) + return 0; + data_offset = 0; + } + + Log *log = GetLog(LLDBLog::Symbols); + auto text = llvm::StringRef(reinterpret_cast<const char *>(data_sp->GetBytes())); Expected<json::Value> json = json::parse(text); if (!json) { - llvm::consumeError(json.takeError()); + LLDB_LOG_ERROR(log, json.takeError(), + "failed to parse JSON object file: {0}"); return 0; } json::Path::Root root; Header header; - if (!fromJSON(*json, header, root)) + if (!fromJSON(*json, header, root)) { + LLDB_LOG_ERROR(log, root.getError(), + "failed to parse JSON object file header: {0}"); return 0; + } ArchSpec arch(header.triple); UUID uuid; @@ -123,10 +148,12 @@ size_t ObjectFileJSON::GetModuleSpecifications( ObjectFileJSON::ObjectFileJSON(const ModuleSP &module_sp, DataBufferSP &data_sp, offset_t data_offset, const FileSpec *file, offset_t offset, offset_t length, ArchSpec arch, - UUID uuid, std::vector<JSONSymbol> symbols) + UUID uuid, Type type, + std::vector<JSONSymbol> symbols, + std::vector<JSONSection> sections) : ObjectFile(module_sp, file, offset, length, data_sp, data_offset), - m_arch(std::move(arch)), m_uuid(std::move(uuid)), - m_symbols(std::move(symbols)) {} + m_arch(std::move(arch)), m_uuid(std::move(uuid)), m_type(type), + m_symbols(std::move(symbols)), m_sections(std::move(sections)) {} bool ObjectFileJSON::ParseHeader() { // We already parsed the header during initialization. @@ -139,7 +166,7 @@ void ObjectFileJSON::ParseSymtab(Symtab &symtab) { for (JSONSymbol json_symbol : m_symbols) { llvm::Expected<Symbol> symbol = Symbol::FromJSON(json_symbol, section_list); if (!symbol) { - LLDB_LOG_ERROR(log, symbol.takeError(), "invalid symbol"); + LLDB_LOG_ERROR(log, symbol.takeError(), "invalid symbol: {0}"); continue; } symtab.AddSymbol(*symbol); @@ -147,7 +174,21 @@ void ObjectFileJSON::ParseSymtab(Symtab &symtab) { symtab.Finalize(); } -void ObjectFileJSON::CreateSections(SectionList &unified_section_list) {} +void ObjectFileJSON::CreateSections(SectionList &unified_section_list) { + if (m_sections_up) + return; + m_sections_up = std::make_unique<SectionList>(); + + lldb::user_id_t id = 1; + for (const auto §ion : m_sections) { + auto section_sp = std::make_shared<Section>( + GetModule(), this, id++, ConstString(section.name), + section.type.value_or(eSectionTypeCode), 0, section.size.value_or(0), 0, + section.size.value_or(0), /*log2align*/ 0, /*flags*/ 0); + m_sections_up->AddSection(section_sp); + unified_section_list.AddSection(section_sp); + } +} bool ObjectFileJSON::MagicBytesMatch(DataBufferSP data_sp, lldb::addr_t data_offset, @@ -164,13 +205,15 @@ namespace lldb_private { bool fromJSON(const json::Value &value, ObjectFileJSON::Header &header, json::Path path) { json::ObjectMapper o(value, path); - return o && o.map("triple", header.triple) && o.map("uuid", header.uuid); + return o && o.map("triple", header.triple) && o.map("uuid", header.uuid) && + o.map("type", header.type); } bool fromJSON(const json::Value &value, ObjectFileJSON::Body &body, json::Path path) { json::ObjectMapper o(value, path); - return o && o.map("symbols", body.symbols); + return o && o.mapOptional("symbols", body.symbols) && + o.mapOptional("sections", body.sections); } } // namespace lldb_private diff --git a/lldb/source/Plugins/ObjectFile/JSON/ObjectFileJSON.h b/lldb/source/Plugins/ObjectFile/JSON/ObjectFileJSON.h index cb3a7d2..b72565f 100644 --- a/lldb/source/Plugins/ObjectFile/JSON/ObjectFileJSON.h +++ b/lldb/source/Plugins/ObjectFile/JSON/ObjectFileJSON.h @@ -82,7 +82,7 @@ public: uint32_t GetDependentModules(FileSpecList &files) override { return 0; } - Type CalculateType() override { return eTypeDebugInfo; } + Type CalculateType() override { return m_type; } Strata CalculateStrata() override { return eStrataUser; } @@ -92,21 +92,27 @@ public: struct Header { std::string triple; std::string uuid; + std::optional<ObjectFile::Type> type; }; struct Body { + std::vector<JSONSection> sections; std::vector<JSONSymbol> symbols; }; private: ArchSpec m_arch; UUID m_uuid; + ObjectFile::Type m_type; + std::optional<uint64_t> m_size; std::vector<JSONSymbol> m_symbols; + std::vector<JSONSection> m_sections; ObjectFileJSON(const lldb::ModuleSP &module_sp, lldb::DataBufferSP &data_sp, lldb::offset_t data_offset, const FileSpec *file, lldb::offset_t offset, lldb::offset_t length, ArchSpec arch, - UUID uuid, std::vector<JSONSymbol> symbols); + UUID uuid, Type type, std::vector<JSONSymbol> symbols, + std::vector<JSONSection> sections); }; bool fromJSON(const llvm::json::Value &value, ObjectFileJSON::Header &header, |