Index: include/lldb/Symbol/SymbolFile.h =================================================================== --- include/lldb/Symbol/SymbolFile.h +++ include/lldb/Symbol/SymbolFile.h @@ -114,6 +114,8 @@ uint32_t GetNumCompileUnits(); lldb::CompUnitSP GetCompileUnitAtIndex(uint32_t idx); + Symtab *GetSymtab(); + virtual lldb::LanguageType ParseLanguage(CompileUnit &comp_unit) = 0; virtual size_t ParseFunctions(CompileUnit &comp_unit) = 0; virtual bool ParseLineTable(CompileUnit &comp_unit) = 0; @@ -246,6 +248,7 @@ ObjectFile *m_obj_file; // The object file that symbols can be extracted from. llvm::Optional> m_compile_units; TypeList m_type_list; + Symtab *m_symtab = nullptr; uint32_t m_abilities; bool m_calculated_abilities; Index: include/lldb/Symbol/SymbolVendor.h =================================================================== --- include/lldb/Symbol/SymbolVendor.h +++ include/lldb/Symbol/SymbolVendor.h @@ -121,9 +121,6 @@ // Get module unified section list symbol table. virtual Symtab *GetSymtab(); - // Clear module unified section list symbol table. - virtual void ClearSymtab(); - /// Notify the SymbolVendor that the file addresses in the Sections /// for this module have been changed. virtual void SectionFileAddressesChanged(); @@ -140,8 +137,6 @@ // file) std::unique_ptr m_sym_file_up; // A single symbol file. Subclasses // can add more of these if needed. - Symtab *m_symtab; // Save a symtab once to not pass it through `AddSymbols` of - // the symbol file each time when it is needed private: // For SymbolVendor only Index: source/Symbol/SymbolFile.cpp =================================================================== --- source/Symbol/SymbolFile.cpp +++ source/Symbol/SymbolFile.cpp @@ -199,6 +199,21 @@ (*m_compile_units)[idx] = cu_sp; } +Symtab *SymbolFile::GetSymtab() { + std::lock_guard guard(GetModuleMutex()); + if (m_symtab) + return m_symtab; + + // Fetch the symtab from the main object file. + m_symtab = m_obj_file->GetModule()->GetObjectFile()->GetSymtab(); + + // Then add our symbols to it. + if (m_symtab) + AddSymbols(*m_symtab); + + return m_symtab; +} + void SymbolFile::Dump(Stream &s) { s.PutCString("Types:\n"); m_type_list.Dump(&s, /*show_context*/ false); Index: source/Symbol/SymbolVendor.cpp =================================================================== --- source/Symbol/SymbolVendor.cpp +++ source/Symbol/SymbolVendor.cpp @@ -58,7 +58,7 @@ // SymbolVendor constructor SymbolVendor::SymbolVendor(const lldb::ModuleSP &module_sp) - : ModuleChild(module_sp), m_sym_file_up(), m_symtab() {} + : ModuleChild(module_sp), m_sym_file_up() {} // Destructor SymbolVendor::~SymbolVendor() {} @@ -384,35 +384,9 @@ } Symtab *SymbolVendor::GetSymtab() { - ModuleSP module_sp(GetModule()); - if (!module_sp) - return nullptr; - - std::lock_guard guard(module_sp->GetMutex()); - - if (m_symtab) - return m_symtab; - - ObjectFile *objfile = module_sp->GetObjectFile(); - if (!objfile) - return nullptr; - - m_symtab = objfile->GetSymtab(); - if (m_symtab && m_sym_file_up) - m_sym_file_up->AddSymbols(*m_symtab); - - return m_symtab; -} - -void SymbolVendor::ClearSymtab() { - ModuleSP module_sp(GetModule()); - if (module_sp) { - ObjectFile *objfile = module_sp->GetObjectFile(); - if (objfile) { - // Clear symbol table from unified section list. - objfile->ClearSymtab(); - } - } + if (m_sym_file_up) + return m_sym_file_up->GetSymtab(); + return nullptr; } void SymbolVendor::SectionFileAddressesChanged() { Index: unittests/Core/CMakeLists.txt =================================================================== --- unittests/Core/CMakeLists.txt +++ unittests/Core/CMakeLists.txt @@ -9,7 +9,7 @@ lldbHost lldbSymbol lldbPluginObjectFileELF - lldbPluginSymbolVendorELF + lldbPluginSymbolFileSymtab lldbUtilityHelpers LLVMTestingSupport LINK_COMPONENTS Index: unittests/Core/MangledTest.cpp =================================================================== --- unittests/Core/MangledTest.cpp +++ unittests/Core/MangledTest.cpp @@ -7,7 +7,7 @@ //===----------------------------------------------------------------------===// #include "Plugins/ObjectFile/ELF/ObjectFileELF.h" -#include "Plugins/SymbolVendor/ELF/SymbolVendorELF.h" +#include "Plugins/SymbolFile/Symtab/SymbolFileSymtab.h" #include "TestingSupport/TestUtilities.h" #include "lldb/Core/Mangled.h" @@ -54,7 +54,7 @@ FileSystem::Initialize(); HostInfo::Initialize(); ObjectFileELF::Initialize(); - SymbolVendorELF::Initialize(); + SymbolFileSymtab::Initialize(); llvm::SmallString<128> Obj; ASSERT_NO_ERROR(llvm::sys::fs::createTemporaryFile( @@ -146,7 +146,7 @@ EXPECT_EQ(0, Count("undemangable", eFunctionNameTypeBase)); EXPECT_EQ(0, Count("undemangable", eFunctionNameTypeMethod)); - SymbolVendorELF::Terminate(); + SymbolFileSymtab::Terminate(); ObjectFileELF::Terminate(); HostInfo::Terminate(); FileSystem::Terminate(); Index: unittests/ObjectFile/ELF/CMakeLists.txt =================================================================== --- unittests/ObjectFile/ELF/CMakeLists.txt +++ unittests/ObjectFile/ELF/CMakeLists.txt @@ -3,7 +3,7 @@ LINK_LIBS lldbPluginObjectFileELF - lldbPluginSymbolVendorELF + lldbPluginSymbolFileSymtab lldbCore lldbUtilityHelpers LLVMTestingSupport Index: unittests/ObjectFile/ELF/TestObjectFileELF.cpp =================================================================== --- unittests/ObjectFile/ELF/TestObjectFileELF.cpp +++ unittests/ObjectFile/ELF/TestObjectFileELF.cpp @@ -8,7 +8,7 @@ //===----------------------------------------------------------------------===// #include "Plugins/ObjectFile/ELF/ObjectFileELF.h" -#include "Plugins/SymbolVendor/ELF/SymbolVendorELF.h" +#include "Plugins/SymbolFile/Symtab/SymbolFileSymtab.h" #include "TestingSupport/TestUtilities.h" #include "lldb/Core/Module.h" #include "lldb/Core/ModuleSpec.h" @@ -34,11 +34,11 @@ FileSystem::Initialize(); HostInfo::Initialize(); ObjectFileELF::Initialize(); - SymbolVendorELF::Initialize(); + SymbolFileSymtab::Initialize(); } void TearDown() override { - SymbolVendorELF::Terminate(); + SymbolFileSymtab::Terminate(); ObjectFileELF::Terminate(); HostInfo::Terminate(); FileSystem::Terminate(); Index: unittests/Symbol/CMakeLists.txt =================================================================== --- unittests/Symbol/CMakeLists.txt +++ unittests/Symbol/CMakeLists.txt @@ -13,6 +13,7 @@ lldbPluginObjectFileELF lldbPluginObjectFileMachO lldbPluginSymbolFileDWARF + lldbPluginSymbolFileSymtab LLVMTestingSupport ) Index: unittests/Symbol/TestDWARFCallFrameInfo.cpp =================================================================== --- unittests/Symbol/TestDWARFCallFrameInfo.cpp +++ unittests/Symbol/TestDWARFCallFrameInfo.cpp @@ -11,6 +11,7 @@ #include "Plugins/ObjectFile/ELF/ObjectFileELF.h" #include "Plugins/Process/Utility/RegisterContext_x86.h" +#include "Plugins/SymbolFile/Symtab/SymbolFileSymtab.h" #include "TestingSupport/TestUtilities.h" #include "lldb/Core/Module.h" @@ -36,9 +37,11 @@ FileSystem::Initialize(); HostInfo::Initialize(); ObjectFileELF::Initialize(); + SymbolFileSymtab::Initialize(); } void TearDown() override { + SymbolFileSymtab::Terminate(); ObjectFileELF::Terminate(); HostInfo::Terminate(); FileSystem::Terminate(); Index: unittests/Target/CMakeLists.txt =================================================================== --- unittests/Target/CMakeLists.txt +++ unittests/Target/CMakeLists.txt @@ -10,6 +10,7 @@ lldbSymbol lldbUtility lldbPluginObjectFileELF + lldbPluginSymbolFileSymtab lldbUtilityHelpers LINK_COMPONENTS Support Index: unittests/Target/ModuleCacheTest.cpp =================================================================== --- unittests/Target/ModuleCacheTest.cpp +++ unittests/Target/ModuleCacheTest.cpp @@ -5,6 +5,7 @@ #include "llvm/Support/Path.h" #include "Plugins/ObjectFile/ELF/ObjectFileELF.h" +#include "Plugins/SymbolFile/Symtab/SymbolFileSymtab.h" #include "TestingSupport/TestUtilities.h" #include "lldb/Core/Module.h" #include "lldb/Core/ModuleSpec.h" @@ -69,12 +70,14 @@ FileSystem::Initialize(); HostInfo::Initialize(); ObjectFileELF::Initialize(); + SymbolFileSymtab::Initialize(); s_cache_dir = HostInfo::GetProcessTempDir(); s_test_executable = GetInputFilePath(module_name); } void ModuleCacheTest::TearDownTestCase() { + SymbolFileSymtab::Terminate(); ObjectFileELF::Terminate(); HostInfo::Terminate(); FileSystem::Terminate();