Index: include/lldb/Core/Module.h =================================================================== --- include/lldb/Core/Module.h +++ include/lldb/Core/Module.h @@ -698,7 +698,7 @@ /// @return /// Unified module section list. //------------------------------------------------------------------ - virtual SectionList *GetSectionList(); + SectionList *GetSectionList(); //------------------------------------------------------------------ /// Notify the module that the file addresses for the Sections have @@ -1196,7 +1196,9 @@ bool SetArchitecture(const ArchSpec &new_arch); - SectionList *GetUnifiedSectionList(); + void + LoadSymbolVendorAndSectionList(bool can_create = true, + lldb_private::Stream *feedback_strm = nullptr); friend class ModuleList; friend class ObjectFile; Index: include/lldb/Symbol/ObjectFile.h =================================================================== --- include/lldb/Symbol/ObjectFile.h +++ include/lldb/Symbol/ObjectFile.h @@ -329,9 +329,7 @@ /// @return /// The list of sections contained in this object file. //------------------------------------------------------------------ - virtual SectionList *GetSectionList(bool update_module_section_list = true); - - virtual void CreateSections(SectionList &unified_section_list) = 0; + virtual SectionList *GetSectionList() = 0; //------------------------------------------------------------------ /// Notify the ObjectFile that the file addresses in the Sections Index: include/lldb/Symbol/SymbolVendor.h =================================================================== --- include/lldb/Symbol/SymbolVendor.h +++ include/lldb/Symbol/SymbolVendor.h @@ -33,7 +33,12 @@ //---------------------------------------------------------------------- class SymbolVendor : public ModuleChild, public PluginInterface { public: + /// Creates a SymbolVendor plugin for the module_sp argument. The + /// unified_list argument is a reference to the unified section list of the + /// module and it should be filled out by the symbol vendor before + /// constructing the SymbolFile object. static SymbolVendor *FindPlugin(const lldb::ModuleSP &module_sp, + SectionList &unified_list, Stream *feedback_strm); //------------------------------------------------------------------ Index: include/lldb/lldb-private-interfaces.h =================================================================== --- include/lldb/lldb-private-interfaces.h +++ include/lldb/lldb-private-interfaces.h @@ -70,7 +70,7 @@ CommandInterpreter &interpreter); typedef SymbolFile *(*SymbolFileCreateInstance)(ObjectFile *obj_file); typedef SymbolVendor *(*SymbolVendorCreateInstance)( - const lldb::ModuleSP &module_sp, + const lldb::ModuleSP &module_sp, SectionList &unified_list, lldb_private::Stream *feedback_strm); // Module can be NULL for default system symbol vendor typedef bool (*BreakpointHitCallback)(void *baton, Index: lit/Modules/Inputs/stripped.yaml =================================================================== --- /dev/null +++ lit/Modules/Inputs/stripped.yaml @@ -0,0 +1,25 @@ +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 + Entry: 0x00000000004003D0 +Sections: + - Name: .note.gnu.build-id + Type: SHT_NOTE + Flags: [ SHF_ALLOC ] + Address: 0x0000000000400274 + AddressAlign: 0x0000000000000004 + Content: 040000001400000003000000474E55001B8A73AC238390E32A7FF4AC8EBE4D6A41ECF5C9 + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Address: 0x00000000004003D0 + AddressAlign: 0x0000000000000010 + Content: DEADBEEFBAADF00D + - Name: .gnu_debuglink + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000004 + Content: 38613733616332333833393065333261376666346163386562653464366134316563663563392E646562756700000000ADEE50C1 +... Index: lit/Modules/Inputs/unstripped.yaml =================================================================== --- /dev/null +++ lit/Modules/Inputs/unstripped.yaml @@ -0,0 +1,32 @@ +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 + Entry: 0x00000000004003D0 +Sections: + - Name: .debug_frame + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000008 + Content: DEADBEEFBAADF00D + - Name: .note.gnu.build-id + Type: SHT_NOTE + Flags: [ SHF_ALLOC ] + Address: 0x0000000000400274 + AddressAlign: 0x0000000000000004 + Content: 040000001400000003000000474E55001B8A73AC238390E32A7FF4AC8EBE4D6A41ECF5C9 + - Name: .text + Type: SHT_NOBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Address: 0x00000000004003D0 + AddressAlign: 0x0000000000000010 + Size: 0x0000000000000008 +Symbols: + Local: + - Name: main + Type: STT_FUNC + Section: .text + Value: 0x00000000004003D0 + Size: 0x0000000000000008 +... Index: lit/Modules/lit.local.cfg =================================================================== --- lit/Modules/lit.local.cfg +++ lit/Modules/lit.local.cfg @@ -1 +1 @@ -config.suffixes = ['.yaml'] +config.suffixes = ['.yaml', '.test'] Index: lit/Modules/unified-section-list.test =================================================================== --- /dev/null +++ lit/Modules/unified-section-list.test @@ -0,0 +1,8 @@ +RUN: mkdir -p %t/.build-id/1b +RUN: yaml2obj %S/Inputs/stripped.yaml > %t/stripped.out +RUN: yaml2obj %S/Inputs/unstripped.yaml > %t/.build-id/1b/8a73ac238390e32a7ff4ac8ebe4d6a41ecf5c9.debug +RUN: lldb-test module-sections %t/stripped.out | FileCheck %s + +CHECK: Name: .debug_frame +CHECK-NEXT: VM size: 0 +CHECK-NEXT: File size: 8 Index: lit/lit.cfg =================================================================== --- lit/lit.cfg +++ lit/lit.cfg @@ -28,6 +28,8 @@ # suffixes: We only support unit tests config.suffixes = [] +config.excludes = ['Inputs'] + # test_source_root: The root path where tests are located. config.test_source_root = os.path.dirname(__file__) Index: source/Core/Module.cpp =================================================================== --- source/Core/Module.cpp +++ source/Core/Module.cpp @@ -1039,20 +1039,27 @@ SymbolVendor *Module::GetSymbolVendor(bool can_create, lldb_private::Stream *feedback_strm) { + LoadSymbolVendorAndSectionList(can_create, feedback_strm); + return m_symfile_ap.get(); +} + +void Module::LoadSymbolVendorAndSectionList( + bool can_create, lldb_private::Stream *feedback_strm) { if (!m_did_load_symbol_vendor.load()) { std::lock_guard guard(m_mutex); if (!m_did_load_symbol_vendor.load() && can_create) { ObjectFile *obj_file = GetObjectFile(); if (obj_file != nullptr) { + m_did_load_symbol_vendor = true; static Timer::Category func_cat(LLVM_PRETTY_FUNCTION); Timer scoped_timer(func_cat, LLVM_PRETTY_FUNCTION); - m_symfile_ap.reset( - SymbolVendor::FindPlugin(shared_from_this(), feedback_strm)); - m_did_load_symbol_vendor = true; + if (!m_sections_ap) + m_sections_ap = llvm::make_unique(); + m_symfile_ap.reset(SymbolVendor::FindPlugin( + shared_from_this(), *m_sections_ap, feedback_strm)); } } } - return m_symfile_ap.get(); } void Module::SetFileSpecAndObjectName(const FileSpec &file, @@ -1278,12 +1285,7 @@ } SectionList *Module::GetSectionList() { - // Populate m_unified_sections_ap with sections from objfile. - if (!m_sections_ap) { - ObjectFile *obj_file = GetObjectFile(); - if (obj_file != nullptr) - obj_file->CreateSections(*GetUnifiedSectionList()); - } + LoadSymbolVendorAndSectionList(); return m_sections_ap.get(); } @@ -1296,13 +1298,6 @@ sym_vendor->SectionFileAddressesChanged(); } -SectionList *Module::GetUnifiedSectionList() { - // Populate m_unified_sections_ap with sections from objfile. - if (!m_sections_ap) - m_sections_ap = llvm::make_unique(); - return m_sections_ap.get(); -} - const Symbol *Module::FindFirstSymbolWithNameAndType(const ConstString &name, SymbolType symbol_type) { static Timer::Category func_cat(LLVM_PRETTY_FUNCTION); @@ -1459,17 +1454,6 @@ return; } } - - if (obj_file != m_objfile_sp.get()) { - size_t num_sections = section_list->GetNumSections(0); - for (size_t idx = num_sections; idx > 0; --idx) { - lldb::SectionSP section_sp( - section_list->GetSectionAtIndex(idx - 1)); - if (section_sp->GetObjectFile() == obj_file) { - section_list->DeleteSection(idx - 1); - } - } - } } } // Keep all old symbol files around in case there are any lingering type Index: source/Plugins/ObjectFile/ELF/ObjectFileELF.h =================================================================== --- source/Plugins/ObjectFile/ELF/ObjectFileELF.h +++ source/Plugins/ObjectFile/ELF/ObjectFileELF.h @@ -119,7 +119,7 @@ bool IsStripped() override; - void CreateSections(lldb_private::SectionList &unified_section_list) override; + lldb_private::SectionList *GetSectionList() override; void Dump(lldb_private::Stream *s) override; Index: source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp =================================================================== --- source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp +++ source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp @@ -1770,7 +1770,7 @@ return 0; } -void ObjectFileELF::CreateSections(SectionList &unified_section_list) { +SectionList *ObjectFileELF::GetSectionList() { if (!m_sections_ap.get() && ParseSectionHeaders()) { m_sections_ap.reset(new SectionList()); @@ -1985,39 +1985,7 @@ m_sections_ap->AddSection(section_sp); } } - - if (m_sections_ap.get()) { - if (GetType() == eTypeDebugInfo) { - static const SectionType g_sections[] = { - eSectionTypeDWARFDebugAbbrev, eSectionTypeDWARFDebugAddr, - eSectionTypeDWARFDebugAranges, eSectionTypeDWARFDebugCuIndex, - eSectionTypeDWARFDebugFrame, eSectionTypeDWARFDebugInfo, - eSectionTypeDWARFDebugLine, eSectionTypeDWARFDebugLoc, - eSectionTypeDWARFDebugMacInfo, eSectionTypeDWARFDebugPubNames, - eSectionTypeDWARFDebugPubTypes, eSectionTypeDWARFDebugRanges, - eSectionTypeDWARFDebugStr, eSectionTypeDWARFDebugStrOffsets, - eSectionTypeELFSymbolTable, - }; - SectionList *elf_section_list = m_sections_ap.get(); - for (size_t idx = 0; idx < sizeof(g_sections) / sizeof(g_sections[0]); - ++idx) { - SectionType section_type = g_sections[idx]; - SectionSP section_sp( - elf_section_list->FindSectionByType(section_type, true)); - if (section_sp) { - SectionSP module_section_sp( - unified_section_list.FindSectionByType(section_type, true)); - if (module_section_sp) - unified_section_list.ReplaceSection(module_section_sp->GetID(), - section_sp); - else - unified_section_list.AddSection(section_sp); - } - } - } else { - unified_section_list = *m_sections_ap; - } - } + return m_sections_ap.get(); } // Find the arm/aarch64 mapping symbol character in the given symbol name. Index: source/Plugins/ObjectFile/JIT/ObjectFileJIT.h =================================================================== --- source/Plugins/ObjectFile/JIT/ObjectFileJIT.h +++ source/Plugins/ObjectFile/JIT/ObjectFileJIT.h @@ -73,7 +73,7 @@ bool IsStripped() override; - void CreateSections(lldb_private::SectionList &unified_section_list) override; + lldb_private::SectionList *GetSectionList() override; void Dump(lldb_private::Stream *s) override; Index: source/Plugins/ObjectFile/JIT/ObjectFileJIT.cpp =================================================================== --- source/Plugins/ObjectFile/JIT/ObjectFileJIT.cpp +++ source/Plugins/ObjectFile/JIT/ObjectFileJIT.cpp @@ -134,15 +134,15 @@ return false; // JIT code that is in a module is never stripped } -void ObjectFileJIT::CreateSections(SectionList &unified_section_list) { +SectionList *ObjectFileJIT::GetSectionList() { if (!m_sections_ap.get()) { m_sections_ap.reset(new SectionList()); ObjectFileJITDelegateSP delegate_sp(m_delegate_wp.lock()); if (delegate_sp) { delegate_sp->PopulateSectionList(this, *m_sections_ap); - unified_section_list = *m_sections_ap; } } + return m_sections_ap.get(); } void ObjectFileJIT::Dump(Stream *s) { Index: source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h =================================================================== --- source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h +++ source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h @@ -92,7 +92,11 @@ bool IsStripped() override; - void CreateSections(lldb_private::SectionList &unified_section_list) override; + lldb_private::SectionList *GetSectionList() override; + + /// Create sections for this object file and populate the unified section list + /// of the module. + void CreateSections(lldb_private::SectionList &unified_section_list); void Dump(lldb_private::Stream *s) override; Index: source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp =================================================================== --- source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp +++ source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp @@ -1349,8 +1349,16 @@ return false; } +SectionList *ObjectFileMachO::GetSectionList() { + if (!m_sections_ap) { + // Resolving the module's symbol vendor will populate our section list as + // the vendor will call back into the CreateSections funcion below. + GetModule()->GetSymbolVendor(); + } + return m_sections_ap.get(); +} + void ObjectFileMachO::CreateSections(SectionList &unified_section_list) { - if (!m_sections_ap.get()) { m_sections_ap.reset(new SectionList()); const bool is_dsym = (m_header.filetype == MH_DSYM); @@ -1919,7 +1927,6 @@ if (section_file_addresses_changed && module_sp.get()) { module_sp->SectionFileAddressesChanged(); } - } } class MachSymtabSectionInfo { Index: source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h =================================================================== --- source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h +++ source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h @@ -109,7 +109,7 @@ bool IsStripped() override; - void CreateSections(lldb_private::SectionList &unified_section_list) override; + lldb_private::SectionList *GetSectionList() override; void Dump(lldb_private::Stream *s) override; Index: source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp =================================================================== --- source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp +++ source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp @@ -662,7 +662,7 @@ return false; } -void ObjectFilePECOFF::CreateSections(SectionList &unified_section_list) { +SectionList *ObjectFilePECOFF::GetSectionList() { if (!m_sections_ap.get()) { m_sections_ap.reset(new SectionList()); @@ -784,11 +784,11 @@ // section_sp->SetIsEncrypted (segment_is_encrypted); - unified_section_list.AddSection(section_sp); m_sections_ap->AddSection(section_sp); } } } + return m_sections_ap.get(); } bool ObjectFilePECOFF::GetUUID(UUID *uuid) { return false; } Index: source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp =================================================================== --- source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp +++ source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp @@ -29,8 +29,7 @@ void SymbolFileDWARFDwo::LoadSectionData(lldb::SectionType sect_type, DWARFDataExtractor &data) { - const SectionList *section_list = - m_obj_file->GetSectionList(false /* update_module_section_list */); + const SectionList *section_list = m_obj_file->GetSectionList(); if (section_list) { SectionSP section_sp(section_list->FindSectionByType(sect_type, true)); if (section_sp) { @@ -63,7 +62,7 @@ DWARFCompileUnit *SymbolFileDWARFDwo::GetCompileUnit() { // A clang module is found via a skeleton CU, but is not a proper DWO. // Clang modules have a .debug_info section instead of the *_dwo variant. - if (auto *section_list = m_obj_file->GetSectionList(false)) + if (auto *section_list = m_obj_file->GetSectionList()) if (auto section_sp = section_list->FindSectionByType(eSectionTypeDWARFDebugInfo, true)) if (!section_sp->GetName().GetStringRef().endswith("dwo")) Index: source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwp.cpp =================================================================== --- source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwp.cpp +++ source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwp.cpp @@ -125,8 +125,7 @@ return true; } - const lldb_private::SectionList *section_list = - m_obj_file->GetSectionList(false /* update_module_section_list */); + const lldb_private::SectionList *section_list = m_obj_file->GetSectionList(); if (section_list) { lldb::SectionSP section_sp( section_list->FindSectionByType(sect_type, true)); Index: source/Plugins/SymbolVendor/ELF/SymbolVendorELF.h =================================================================== --- source/Plugins/SymbolVendor/ELF/SymbolVendorELF.h +++ source/Plugins/SymbolVendor/ELF/SymbolVendorELF.h @@ -39,6 +39,7 @@ static lldb_private::SymbolVendor * CreateInstance(const lldb::ModuleSP &module_sp, + lldb_private::SectionList &unified_list, lldb_private::Stream *feedback_strm); //------------------------------------------------------------------ @@ -49,6 +50,8 @@ uint32_t GetPluginVersion() override; private: + lldb_private::SectionList BuildSectionList(lldb_private::ObjectFile &obj); + DISALLOW_COPY_AND_ASSIGN(SymbolVendorELF); }; Index: source/Plugins/SymbolVendor/ELF/SymbolVendorELF.cpp =================================================================== --- source/Plugins/SymbolVendor/ELF/SymbolVendorELF.cpp +++ source/Plugins/SymbolVendor/ELF/SymbolVendorELF.cpp @@ -63,6 +63,7 @@ //---------------------------------------------------------------------- SymbolVendor * SymbolVendorELF::CreateInstance(const lldb::ModuleSP &module_sp, + SectionList &unified_list, lldb_private::Stream *feedback_strm) { if (!module_sp) return NULL; @@ -120,47 +121,44 @@ dsym_objfile_sp->SetType(ObjectFile::eTypeDebugInfo); SymbolVendorELF *symbol_vendor = new SymbolVendorELF(module_sp); - if (symbol_vendor) { - // Get the module unified section list and add our debug sections to - // that. - SectionList *module_section_list = module_sp->GetSectionList(); - SectionList *objfile_section_list = dsym_objfile_sp->GetSectionList(); - - static const SectionType g_sections[] = { - eSectionTypeDWARFDebugAbbrev, eSectionTypeDWARFDebugAddr, - eSectionTypeDWARFDebugAranges, eSectionTypeDWARFDebugCuIndex, - eSectionTypeDWARFDebugFrame, eSectionTypeDWARFDebugInfo, - eSectionTypeDWARFDebugLine, eSectionTypeDWARFDebugLoc, - eSectionTypeDWARFDebugMacInfo, eSectionTypeDWARFDebugPubNames, - eSectionTypeDWARFDebugPubTypes, eSectionTypeDWARFDebugRanges, - eSectionTypeDWARFDebugStr, eSectionTypeDWARFDebugStrOffsets, - eSectionTypeELFSymbolTable, - }; - for (size_t idx = 0; idx < sizeof(g_sections) / sizeof(g_sections[0]); - ++idx) { - SectionType section_type = g_sections[idx]; - SectionSP section_sp( - objfile_section_list->FindSectionByType(section_type, true)); - if (section_sp) { - SectionSP module_section_sp( - module_section_list->FindSectionByType(section_type, true)); - if (module_section_sp) - module_section_list->ReplaceSection(module_section_sp->GetID(), - section_sp); - else - module_section_list->AddSection(section_sp); - } - } - - symbol_vendor->AddSymbolFileRepresentation(dsym_objfile_sp); - return symbol_vendor; - } + unified_list = symbol_vendor->BuildSectionList(*dsym_objfile_sp); + symbol_vendor->AddSymbolFileRepresentation(dsym_objfile_sp); + return symbol_vendor; } } } return NULL; } +SectionList SymbolVendorELF::BuildSectionList(ObjectFile &obj) { + SectionList UnifiedList = *GetModule()->GetObjectFile()->GetSectionList(); + + SectionList *SymfileList = obj.GetSectionList(); + + static constexpr SectionType g_sections[] = { + eSectionTypeDWARFDebugAbbrev, eSectionTypeDWARFDebugAddr, + eSectionTypeDWARFDebugAranges, eSectionTypeDWARFDebugCuIndex, + eSectionTypeDWARFDebugFrame, eSectionTypeDWARFDebugInfo, + eSectionTypeDWARFDebugLine, eSectionTypeDWARFDebugLoc, + eSectionTypeDWARFDebugMacInfo, eSectionTypeDWARFDebugPubNames, + eSectionTypeDWARFDebugPubTypes, eSectionTypeDWARFDebugRanges, + eSectionTypeDWARFDebugStr, eSectionTypeDWARFDebugStrOffsets, + eSectionTypeELFSymbolTable, + }; + for (SectionType ST : g_sections) { + SectionSP section_sp = SymfileList->FindSectionByType(ST, true); + if (!section_sp) + continue; + + SectionSP module_section_sp = UnifiedList.FindSectionByType(ST, true); + if (module_section_sp) + UnifiedList.ReplaceSection(module_section_sp->GetID(), section_sp); + else + UnifiedList.AddSection(section_sp); + } + return UnifiedList; +} + //------------------------------------------------------------------ // PluginInterface protocol //------------------------------------------------------------------ Index: source/Plugins/SymbolVendor/MacOSX/CMakeLists.txt =================================================================== --- source/Plugins/SymbolVendor/MacOSX/CMakeLists.txt +++ source/Plugins/SymbolVendor/MacOSX/CMakeLists.txt @@ -1,5 +1,3 @@ -include_directories(${LIBXML2_INCLUDE_DIR}) - add_lldb_library(lldbPluginSymbolVendorMacOSX PLUGIN SymbolVendorMacOSX.cpp @@ -7,4 +5,5 @@ lldbCore lldbHost lldbSymbol + lldbPluginObjectFileMachO ) Index: source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.h =================================================================== --- source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.h +++ source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.h @@ -10,6 +10,7 @@ #ifndef liblldb_SymbolVendorMacOSX_h_ #define liblldb_SymbolVendorMacOSX_h_ +#include "lldb/Core/Section.h" #include "lldb/Symbol/SymbolVendor.h" #include "lldb/lldb-private.h" @@ -28,6 +29,7 @@ static lldb_private::SymbolVendor * CreateInstance(const lldb::ModuleSP &module_sp, + lldb_private::SectionList &unified_list, lldb_private::Stream *feedback_strm); //------------------------------------------------------------------ @@ -40,11 +42,14 @@ //------------------------------------------------------------------ // PluginInterface protocol //------------------------------------------------------------------ - virtual lldb_private::ConstString GetPluginName(); + lldb_private::ConstString GetPluginName() override; - virtual uint32_t GetPluginVersion(); + uint32_t GetPluginVersion() override; private: + void BuildUnifiedSectionList(lldb_private::ObjectFile &symfile, + lldb_private::SectionList &unified_list); + DISALLOW_COPY_AND_ASSIGN(SymbolVendorMacOSX); }; Index: source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp =================================================================== --- source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp +++ source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp @@ -11,10 +11,10 @@ #include +#include "Plugins/ObjectFile/Mach-O/ObjectFileMachO.h" #include "lldb/Core/Module.h" #include "lldb/Core/ModuleSpec.h" #include "lldb/Core/PluginManager.h" -#include "lldb/Core/Section.h" #include "lldb/Host/Host.h" #include "lldb/Host/Symbols.h" #include "lldb/Host/XML.h" @@ -100,6 +100,7 @@ //---------------------------------------------------------------------- SymbolVendor * SymbolVendorMacOSX::CreateInstance(const lldb::ModuleSP &module_sp, + SectionList &unified_list, lldb_private::Stream *feedback_strm) { if (!module_sp) return NULL; @@ -298,6 +299,7 @@ } } + symbol_vendor->BuildUnifiedSectionList(*dsym_objfile_sp, unified_list); symbol_vendor->AddSymbolFileRepresentation(dsym_objfile_sp); return symbol_vendor; } @@ -306,11 +308,42 @@ // Just create our symbol vendor using the current objfile as this is either // an executable with no dSYM (that we could locate), an executable with // a dSYM that has a UUID that doesn't match. + symbol_vendor->BuildUnifiedSectionList(*obj_file, unified_list); symbol_vendor->AddSymbolFileRepresentation(obj_file->shared_from_this()); } return symbol_vendor; } +void SymbolVendorMacOSX::BuildUnifiedSectionList(ObjectFile &symfile, + SectionList &unified_list) { + ObjectFile *objfile = GetModule()->GetObjectFile(); + + // Remove any sections which do not belong the the Module's ObjectFile (i.e., + // sections that were placed there by the Module's previous Symbol Vendor). + // TODO: Once ObjectFileMachO can create it's own sections without + // referencing the unified section list, the next two blocks can be replaced + // by: + // unified_list = *objfile->GetSections(); + size_t num_sections = unified_list.GetNumSections(0); + for (size_t idx = num_sections; idx > 0; --idx) { + lldb::SectionSP section_sp(unified_list.GetSectionAtIndex(idx - 1)); + if (section_sp->GetObjectFile() != objfile) + unified_list.DeleteSection(idx - 1); + } + + // If there are no sections in the unified list, it means the main object + // file has not had a chance to create them yet. Do it now. + if (unified_list.GetNumSections(0) == 0) { + static_cast(objfile)->CreateSections(unified_list); + } + + // If the symbol file is different from the object file, create the symbol + // file sections as well. + if (&symfile != GetModule()->GetObjectFile()) { + static_cast(symfile).CreateSections(unified_list); + } +} + //------------------------------------------------------------------ // PluginInterface protocol //------------------------------------------------------------------ Index: source/Symbol/ObjectFile.cpp =================================================================== --- source/Symbol/ObjectFile.cpp +++ source/Symbol/ObjectFile.cpp @@ -604,22 +604,6 @@ } } -SectionList *ObjectFile::GetSectionList(bool update_module_section_list) { - if (m_sections_ap.get() == nullptr) { - if (update_module_section_list) { - ModuleSP module_sp(GetModule()); - if (module_sp) { - std::lock_guard guard(module_sp->GetMutex()); - CreateSections(*module_sp->GetUnifiedSectionList()); - } - } else { - SectionList unified_section_list; - CreateSections(unified_section_list); - } - } - return m_sections_ap.get(); -} - lldb::SymbolType ObjectFile::GetSymbolTypeFromName(llvm::StringRef name, lldb::SymbolType symbol_type_hint) { Index: source/Symbol/SymbolFile.cpp =================================================================== --- source/Symbol/SymbolFile.cpp +++ source/Symbol/SymbolFile.cpp @@ -28,21 +28,6 @@ SymbolFile *SymbolFile::FindPlugin(ObjectFile *obj_file) { std::unique_ptr best_symfile_ap; if (obj_file != nullptr) { - - // We need to test the abilities of this section list. So create what it - // would - // be with this new obj_file. - lldb::ModuleSP module_sp(obj_file->GetModule()); - if (module_sp) { - // Default to the main module section list. - ObjectFile *module_obj_file = module_sp->GetObjectFile(); - if (module_obj_file != obj_file) { - // Make sure the main object file's sections are created - module_obj_file->GetSectionList(); - obj_file->CreateSections(*module_sp->GetUnifiedSectionList()); - } - } - // TODO: Load any plug-ins in the appropriate plug-in search paths and // iterate over all of them to find the best one for the job. Index: source/Symbol/SymbolVendor.cpp =================================================================== --- source/Symbol/SymbolVendor.cpp +++ source/Symbol/SymbolVendor.cpp @@ -15,6 +15,7 @@ // Project includes #include "lldb/Core/Module.h" #include "lldb/Core/PluginManager.h" +#include "lldb/Core/Section.h" #include "lldb/Symbol/CompileUnit.h" #include "lldb/Symbol/ObjectFile.h" #include "lldb/Symbol/SymbolFile.h" @@ -31,6 +32,7 @@ // also allow for finding separate debug information files. //---------------------------------------------------------------------- SymbolVendor *SymbolVendor::FindPlugin(const lldb::ModuleSP &module_sp, + SectionList &unified_list, lldb_private::Stream *feedback_strm) { std::unique_ptr instance_ap; SymbolVendorCreateInstance create_callback; @@ -39,7 +41,7 @@ (create_callback = PluginManager::GetSymbolVendorCreateCallbackAtIndex( idx)) != nullptr; ++idx) { - instance_ap.reset(create_callback(module_sp, feedback_strm)); + instance_ap.reset(create_callback(module_sp, unified_list, feedback_strm)); if (instance_ap.get()) { return instance_ap.release(); @@ -51,7 +53,9 @@ if (instance_ap.get()) { ObjectFile *objfile = module_sp->GetObjectFile(); if (objfile) - instance_ap->AddSymbolFileRepresentation(objfile->shared_from_this()); + unified_list = *objfile->GetSectionList(); + + instance_ap->AddSymbolFileRepresentation(objfile->shared_from_this()); } return instance_ap.release(); } Index: tools/lldb-test/lldb-test.cpp =================================================================== --- tools/lldb-test/lldb-test.cpp +++ tools/lldb-test/lldb-test.cpp @@ -72,7 +72,6 @@ for (const auto &File : opts::module::InputFilenames) { ModuleSpec Spec{FileSpec(File, false)}; - Spec.GetSymbolFileSpec().SetFile(File, false); auto ModulePtr = std::make_shared(Spec); SectionList *Sections = ModulePtr->GetSectionList();