diff options
Diffstat (limited to 'lldb/source')
7 files changed, 24 insertions, 72 deletions
diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp index 8d16166cf0f..ba8216527f3 100644 --- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp +++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp @@ -2876,6 +2876,8 @@ Symtab *ObjectFileELF::GetSymtab() { // do the section lookup next time. if (m_symtab_ap == nullptr) m_symtab_ap.reset(new Symtab(this)); + + m_symtab_ap->CalculateSymbolSizes(); } return m_symtab_ap.get(); diff --git a/lldb/source/Plugins/ObjectFile/JIT/ObjectFileJIT.cpp b/lldb/source/Plugins/ObjectFile/JIT/ObjectFileJIT.cpp index 455741e5bd3..af040322ec5 100644 --- a/lldb/source/Plugins/ObjectFile/JIT/ObjectFileJIT.cpp +++ b/lldb/source/Plugins/ObjectFile/JIT/ObjectFileJIT.cpp @@ -124,6 +124,7 @@ Symtab *ObjectFileJIT::GetSymtab() { if (delegate_sp) delegate_sp->PopulateSymtab(this, *m_symtab_ap); // TODO: get symbols from delegate + m_symtab_ap->Finalize(); } } return m_symtab_ap.get(); diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp index b232a001e0c..d92f6bc3176 100644 --- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp +++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp @@ -1315,6 +1315,7 @@ Symtab *ObjectFileMachO::GetSymtab() { std::lock_guard<std::recursive_mutex> symtab_guard( m_symtab_ap->GetMutex()); ParseSymtab(); + m_symtab_ap->Finalize(); } } return m_symtab_ap.get(); @@ -4806,6 +4807,16 @@ size_t ObjectFileMachO::ParseSymtab() { } } + // StreamFile s(stdout, false); + // s.Printf ("Symbol table before CalculateSymbolSizes():\n"); + // symtab->Dump(&s, NULL, eSortOrderNone); + // Set symbol byte sizes correctly since mach-o nlist entries don't have + // sizes + symtab->CalculateSymbolSizes(); + + // s.Printf ("Symbol table after CalculateSymbolSizes():\n"); + // symtab->Dump(&s, NULL, eSortOrderNone); + return symtab->GetNumSymbols(); } return 0; diff --git a/lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp b/lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp index f746c368f3d..40637574e4b 100644 --- a/lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp +++ b/lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp @@ -651,6 +651,7 @@ Symtab *ObjectFilePECOFF::GetSymtab() { symbols[i].SetDebug(true); } } + m_symtab_ap->CalculateSymbolSizes(); } } return m_symtab_ap.get(); diff --git a/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp b/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp index 264d9540440..0b71f6c6829 100644 --- a/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp +++ b/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp @@ -1331,55 +1331,6 @@ void SymbolFilePDB::GetMangledNamesForFunction( const std::string &scope_qualified_name, std::vector<lldb_private::ConstString> &mangled_names) {} -void SymbolFilePDB::AddSymbols(lldb_private::Symtab &symtab) { - std::set<lldb::addr_t> sym_addresses; - for (size_t i = 0; i < symtab.GetNumSymbols(); i++) - sym_addresses.insert(symtab.SymbolAtIndex(i)->GetFileAddress()); - - auto results = m_global_scope_up->findAllChildren<PDBSymbolPublicSymbol>(); - if (!results) - return; - - auto section_list = m_obj_file->GetSectionList(); - if (!section_list) - return; - - while (auto pub_symbol = results->getNext()) { - auto section_idx = pub_symbol->getAddressSection() - 1; - if (section_idx >= section_list->GetSize()) - continue; - - auto section = section_list->GetSectionAtIndex(section_idx); - if (!section) - continue; - - auto offset = pub_symbol->getAddressOffset(); - - auto file_addr = section->GetFileAddress() + offset; - if (sym_addresses.find(file_addr) != sym_addresses.end()) - continue; - sym_addresses.insert(file_addr); - - auto size = pub_symbol->getLength(); - symtab.AddSymbol( - Symbol(pub_symbol->getSymIndexId(), // symID - pub_symbol->getName().c_str(), // name - true, // name_is_mangled - pub_symbol->isCode() ? eSymbolTypeCode : eSymbolTypeData, // type - true, // external - false, // is_debug - false, // is_trampoline - false, // is_artificial - section, // section_sp - offset, // value - size, // size - size != 0, // size_is_valid - false, // contains_linker_annotations - 0 // flags - )); - } -} - uint32_t SymbolFilePDB::FindTypes( const lldb_private::SymbolContext &sc, const lldb_private::ConstString &name, diff --git a/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.h b/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.h index 7e0e4d14f13..71234d4ec66 100644 --- a/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.h +++ b/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.h @@ -133,8 +133,6 @@ public: const std::string &scope_qualified_name, std::vector<lldb_private::ConstString> &mangled_names) override; - void AddSymbols(lldb_private::Symtab &symtab) override; - uint32_t FindTypes(const lldb_private::SymbolContext &sc, const lldb_private::ConstString &name, diff --git a/lldb/source/Symbol/SymbolVendor.cpp b/lldb/source/Symbol/SymbolVendor.cpp index 1d01a526164..6dc45c3117e 100644 --- a/lldb/source/Symbol/SymbolVendor.cpp +++ b/lldb/source/Symbol/SymbolVendor.cpp @@ -61,7 +61,7 @@ SymbolVendor *SymbolVendor::FindPlugin(const lldb::ModuleSP &module_sp, //---------------------------------------------------------------------- SymbolVendor::SymbolVendor(const lldb::ModuleSP &module_sp) : ModuleChild(module_sp), m_type_list(), m_compile_units(), - m_sym_file_ap(), m_symtab() {} + m_sym_file_ap() {} //---------------------------------------------------------------------- // Destructor @@ -438,26 +438,14 @@ FileSpec SymbolVendor::GetMainFileSpec() const { 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_ap) - m_sym_file_ap->AddSymbols(*m_symtab); - - m_symtab->CalculateSymbolSizes(); - m_symtab->Finalize(); - - return m_symtab; + if (module_sp) { + ObjectFile *objfile = module_sp->GetObjectFile(); + if (objfile) { + // Get symbol table from unified section list. + return objfile->GetSymtab(); + } + } + return nullptr; } void SymbolVendor::ClearSymtab() { |