| //===-- SymbolFileJSON.cpp ----------------------------------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "SymbolFileJSON.h" |
| |
| #include "Plugins/ObjectFile/JSON/ObjectFileJSON.h" |
| #include "lldb/Core/Module.h" |
| #include "lldb/Core/PluginManager.h" |
| #include "lldb/Symbol/CompileUnit.h" |
| #include "lldb/Symbol/Function.h" |
| #include "lldb/Symbol/ObjectFile.h" |
| #include "lldb/Symbol/Symbol.h" |
| #include "lldb/Symbol/SymbolContext.h" |
| #include "lldb/Symbol/Symtab.h" |
| #include "lldb/Symbol/TypeList.h" |
| #include "lldb/Utility/LLDBLog.h" |
| #include "lldb/Utility/Log.h" |
| #include "lldb/Utility/RegularExpression.h" |
| #include "lldb/Utility/Timer.h" |
| #include "llvm/Support/MemoryBuffer.h" |
| |
| #include <memory> |
| #include <optional> |
| |
| using namespace llvm; |
| using namespace lldb; |
| using namespace lldb_private; |
| |
| LLDB_PLUGIN_DEFINE(SymbolFileJSON) |
| |
| char SymbolFileJSON::ID; |
| |
| SymbolFileJSON::SymbolFileJSON(lldb::ObjectFileSP objfile_sp) |
| : SymbolFileCommon(std::move(objfile_sp)) {} |
| |
| void SymbolFileJSON::Initialize() { |
| PluginManager::RegisterPlugin(GetPluginNameStatic(), |
| GetPluginDescriptionStatic(), CreateInstance); |
| } |
| |
| void SymbolFileJSON::Terminate() { |
| PluginManager::UnregisterPlugin(CreateInstance); |
| } |
| |
| llvm::StringRef SymbolFileJSON::GetPluginDescriptionStatic() { |
| return "Reads debug symbols from a JSON symbol table."; |
| } |
| |
| SymbolFile *SymbolFileJSON::CreateInstance(ObjectFileSP objfile_sp) { |
| return new SymbolFileJSON(std::move(objfile_sp)); |
| } |
| |
| uint32_t SymbolFileJSON::CalculateAbilities() { |
| if (!m_objfile_sp || !llvm::isa<ObjectFileJSON>(*m_objfile_sp)) |
| return 0; |
| |
| return GlobalVariables | Functions; |
| } |
| |
| uint32_t SymbolFileJSON::ResolveSymbolContext(const Address &so_addr, |
| SymbolContextItem resolve_scope, |
| SymbolContext &sc) { |
| std::lock_guard<std::recursive_mutex> guard(GetModuleMutex()); |
| if (m_objfile_sp->GetSymtab() == nullptr) |
| return 0; |
| |
| uint32_t resolved_flags = 0; |
| if (resolve_scope & eSymbolContextSymbol) { |
| sc.symbol = m_objfile_sp->GetSymtab()->FindSymbolContainingFileAddress( |
| so_addr.GetFileAddress()); |
| if (sc.symbol) |
| resolved_flags |= eSymbolContextSymbol; |
| } |
| return resolved_flags; |
| } |
| |
| CompUnitSP SymbolFileJSON::ParseCompileUnitAtIndex(uint32_t idx) { return {}; } |
| |
| void SymbolFileJSON::GetTypes(SymbolContextScope *sc_scope, TypeClass type_mask, |
| lldb_private::TypeList &type_list) {} |
| |
| void SymbolFileJSON::AddSymbols(Symtab &symtab) { |
| if (!m_objfile_sp) |
| return; |
| |
| Symtab *json_symtab = m_objfile_sp->GetSymtab(); |
| if (!json_symtab) |
| return; |
| |
| if (&symtab == json_symtab) |
| return; |
| |
| // Merge the two symbol tables. |
| const size_t num_new_symbols = json_symtab->GetNumSymbols(); |
| for (size_t i = 0; i < num_new_symbols; ++i) { |
| Symbol *s = json_symtab->SymbolAtIndex(i); |
| symtab.AddSymbol(*s); |
| } |
| symtab.Finalize(); |
| } |