SymbolVendor: Move Symtab construction into the SymbolFile
Summary:
Instead of having SymbolVendor coordinate Symtab construction between
Symbol and Object files, make the SymbolVendor function a passthrough,
and put all of the logic into the SymbolFile.
Reviewers: clayborg, JDevlieghere, jingham, espindola
Subscribers: emaste, mgorny, arichardson, MaskRay, lldb-commits
Differential Revision: https://reviews.llvm.org/D65208
llvm-svn: 367086
diff --git a/lldb/source/Symbol/SymbolFile.cpp b/lldb/source/Symbol/SymbolFile.cpp
index 7688d18..223e678 100644
--- a/lldb/source/Symbol/SymbolFile.cpp
+++ b/lldb/source/Symbol/SymbolFile.cpp
@@ -200,6 +200,21 @@
(*m_compile_units)[idx] = cu_sp;
}
+Symtab *SymbolFile::GetSymtab() {
+ std::lock_guard<std::recursive_mutex> 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);
diff --git a/lldb/source/Symbol/SymbolVendor.cpp b/lldb/source/Symbol/SymbolVendor.cpp
index 30e78ef..5bb4ea3 100644
--- a/lldb/source/Symbol/SymbolVendor.cpp
+++ b/lldb/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<std::recursive_mutex> 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() {