17fa27ce4SDimitry Andric //===-- SymbolFileJSON.cpp ----------------------------------------------===//
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 #include "SymbolFileJSON.h"
107fa27ce4SDimitry Andric
117fa27ce4SDimitry Andric #include "Plugins/ObjectFile/JSON/ObjectFileJSON.h"
127fa27ce4SDimitry Andric #include "lldb/Core/Module.h"
137fa27ce4SDimitry Andric #include "lldb/Core/PluginManager.h"
147fa27ce4SDimitry Andric #include "lldb/Symbol/CompileUnit.h"
157fa27ce4SDimitry Andric #include "lldb/Symbol/Function.h"
167fa27ce4SDimitry Andric #include "lldb/Symbol/ObjectFile.h"
177fa27ce4SDimitry Andric #include "lldb/Symbol/Symbol.h"
187fa27ce4SDimitry Andric #include "lldb/Symbol/SymbolContext.h"
197fa27ce4SDimitry Andric #include "lldb/Symbol/Symtab.h"
207fa27ce4SDimitry Andric #include "lldb/Symbol/TypeList.h"
217fa27ce4SDimitry Andric #include "lldb/Utility/LLDBLog.h"
227fa27ce4SDimitry Andric #include "lldb/Utility/Log.h"
237fa27ce4SDimitry Andric #include "lldb/Utility/RegularExpression.h"
247fa27ce4SDimitry Andric #include "lldb/Utility/Timer.h"
257fa27ce4SDimitry Andric #include "llvm/Support/MemoryBuffer.h"
267fa27ce4SDimitry Andric
277fa27ce4SDimitry Andric #include <memory>
287fa27ce4SDimitry Andric #include <optional>
297fa27ce4SDimitry Andric
307fa27ce4SDimitry Andric using namespace llvm;
317fa27ce4SDimitry Andric using namespace lldb;
327fa27ce4SDimitry Andric using namespace lldb_private;
337fa27ce4SDimitry Andric
347fa27ce4SDimitry Andric LLDB_PLUGIN_DEFINE(SymbolFileJSON)
357fa27ce4SDimitry Andric
367fa27ce4SDimitry Andric char SymbolFileJSON::ID;
377fa27ce4SDimitry Andric
SymbolFileJSON(lldb::ObjectFileSP objfile_sp)387fa27ce4SDimitry Andric SymbolFileJSON::SymbolFileJSON(lldb::ObjectFileSP objfile_sp)
397fa27ce4SDimitry Andric : SymbolFileCommon(std::move(objfile_sp)) {}
407fa27ce4SDimitry Andric
Initialize()417fa27ce4SDimitry Andric void SymbolFileJSON::Initialize() {
427fa27ce4SDimitry Andric PluginManager::RegisterPlugin(GetPluginNameStatic(),
437fa27ce4SDimitry Andric GetPluginDescriptionStatic(), CreateInstance);
447fa27ce4SDimitry Andric }
457fa27ce4SDimitry Andric
Terminate()467fa27ce4SDimitry Andric void SymbolFileJSON::Terminate() {
477fa27ce4SDimitry Andric PluginManager::UnregisterPlugin(CreateInstance);
487fa27ce4SDimitry Andric }
497fa27ce4SDimitry Andric
GetPluginDescriptionStatic()507fa27ce4SDimitry Andric llvm::StringRef SymbolFileJSON::GetPluginDescriptionStatic() {
517fa27ce4SDimitry Andric return "Reads debug symbols from a JSON symbol table.";
527fa27ce4SDimitry Andric }
537fa27ce4SDimitry Andric
CreateInstance(ObjectFileSP objfile_sp)547fa27ce4SDimitry Andric SymbolFile *SymbolFileJSON::CreateInstance(ObjectFileSP objfile_sp) {
557fa27ce4SDimitry Andric return new SymbolFileJSON(std::move(objfile_sp));
567fa27ce4SDimitry Andric }
577fa27ce4SDimitry Andric
CalculateAbilities()587fa27ce4SDimitry Andric uint32_t SymbolFileJSON::CalculateAbilities() {
597fa27ce4SDimitry Andric if (!m_objfile_sp || !llvm::isa<ObjectFileJSON>(*m_objfile_sp))
607fa27ce4SDimitry Andric return 0;
617fa27ce4SDimitry Andric
627fa27ce4SDimitry Andric return GlobalVariables | Functions;
637fa27ce4SDimitry Andric }
647fa27ce4SDimitry Andric
ResolveSymbolContext(const Address & so_addr,SymbolContextItem resolve_scope,SymbolContext & sc)657fa27ce4SDimitry Andric uint32_t SymbolFileJSON::ResolveSymbolContext(const Address &so_addr,
667fa27ce4SDimitry Andric SymbolContextItem resolve_scope,
677fa27ce4SDimitry Andric SymbolContext &sc) {
687fa27ce4SDimitry Andric std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
697fa27ce4SDimitry Andric if (m_objfile_sp->GetSymtab() == nullptr)
707fa27ce4SDimitry Andric return 0;
717fa27ce4SDimitry Andric
727fa27ce4SDimitry Andric uint32_t resolved_flags = 0;
737fa27ce4SDimitry Andric if (resolve_scope & eSymbolContextSymbol) {
747fa27ce4SDimitry Andric sc.symbol = m_objfile_sp->GetSymtab()->FindSymbolContainingFileAddress(
757fa27ce4SDimitry Andric so_addr.GetFileAddress());
767fa27ce4SDimitry Andric if (sc.symbol)
777fa27ce4SDimitry Andric resolved_flags |= eSymbolContextSymbol;
787fa27ce4SDimitry Andric }
797fa27ce4SDimitry Andric return resolved_flags;
807fa27ce4SDimitry Andric }
817fa27ce4SDimitry Andric
ParseCompileUnitAtIndex(uint32_t idx)827fa27ce4SDimitry Andric CompUnitSP SymbolFileJSON::ParseCompileUnitAtIndex(uint32_t idx) { return {}; }
837fa27ce4SDimitry Andric
GetTypes(SymbolContextScope * sc_scope,TypeClass type_mask,lldb_private::TypeList & type_list)847fa27ce4SDimitry Andric void SymbolFileJSON::GetTypes(SymbolContextScope *sc_scope, TypeClass type_mask,
857fa27ce4SDimitry Andric lldb_private::TypeList &type_list) {}
867fa27ce4SDimitry Andric
AddSymbols(Symtab & symtab)877fa27ce4SDimitry Andric void SymbolFileJSON::AddSymbols(Symtab &symtab) {
887fa27ce4SDimitry Andric if (!m_objfile_sp)
897fa27ce4SDimitry Andric return;
907fa27ce4SDimitry Andric
917fa27ce4SDimitry Andric Symtab *json_symtab = m_objfile_sp->GetSymtab();
927fa27ce4SDimitry Andric if (!json_symtab)
937fa27ce4SDimitry Andric return;
947fa27ce4SDimitry Andric
957fa27ce4SDimitry Andric if (&symtab == json_symtab)
967fa27ce4SDimitry Andric return;
977fa27ce4SDimitry Andric
987fa27ce4SDimitry Andric // Merge the two symbol tables.
997fa27ce4SDimitry Andric const size_t num_new_symbols = json_symtab->GetNumSymbols();
1007fa27ce4SDimitry Andric for (size_t i = 0; i < num_new_symbols; ++i) {
1017fa27ce4SDimitry Andric Symbol *s = json_symtab->SymbolAtIndex(i);
1027fa27ce4SDimitry Andric symtab.AddSymbol(*s);
1037fa27ce4SDimitry Andric }
1047fa27ce4SDimitry Andric symtab.Finalize();
1057fa27ce4SDimitry Andric }
106