labath created this revision. labath added reviewers: clayborg, jingham, davide. Herald added a subscriber: emaste.
The result of Module::GetSectionList depended on whether the symbol vendor has been loaded (which would augment the section list with the extra sections that have been found by the vendor). Although this bit was documented in the function header, this makes a quirky api, as other Module functions have no requirement to load the vendor explicitly -- instead they will do it on demand. In practice, what this meant is that the user would nearly always get the augmented section list (because by the time he requested it, it's likely something would have loaded the vendor already), *except* if all that he was doing was loading a module and immediately dumping out the sections like lldb-test does. https://reviews.llvm.org/D42955 Files: include/lldb/Symbol/SymbolVendor.h lit/Modules/Inputs/stripped.yaml lit/Modules/Inputs/unstripped.yaml lit/Modules/lit.local.cfg lit/Modules/unified-section-list.test lit/lit.cfg source/Core/Module.cpp source/Plugins/SymbolVendor/ELF/SymbolVendorELF.cpp source/Plugins/SymbolVendor/ELF/SymbolVendorELF.h tools/lldb-test/lldb-test.cpp
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<lldb_private::Module>(Spec); SectionList *Sections = ModulePtr->GetSectionList(); Index: source/Plugins/SymbolVendor/ELF/SymbolVendorELF.h =================================================================== --- source/Plugins/SymbolVendor/ELF/SymbolVendorELF.h +++ source/Plugins/SymbolVendor/ELF/SymbolVendorELF.h @@ -26,6 +26,8 @@ ~SymbolVendorELF() override; + void CreateSections(lldb_private::SectionList &UnifiedList) override; + //------------------------------------------------------------------ // Static Functions //------------------------------------------------------------------ Index: source/Plugins/SymbolVendor/ELF/SymbolVendorELF.cpp =================================================================== --- source/Plugins/SymbolVendor/ELF/SymbolVendorELF.cpp +++ source/Plugins/SymbolVendor/ELF/SymbolVendorELF.cpp @@ -120,47 +120,40 @@ 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; - } + symbol_vendor->AddSymbolFileRepresentation(dsym_objfile_sp); + return symbol_vendor; } } } return NULL; } +void SymbolVendorELF::CreateSections(SectionList &UnifiedList) { + SectionList *ObjfileList = m_objfile_sp->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 = ObjfileList->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); + } +} + //------------------------------------------------------------------ // PluginInterface protocol //------------------------------------------------------------------ Index: source/Core/Module.cpp =================================================================== --- source/Core/Module.cpp +++ source/Core/Module.cpp @@ -1280,9 +1280,10 @@ SectionList *Module::GetSectionList() { // Populate m_unified_sections_ap with sections from objfile. if (!m_sections_ap) { - ObjectFile *obj_file = GetObjectFile(); - if (obj_file != nullptr) + if (ObjectFile *obj_file = GetObjectFile()) obj_file->CreateSections(*GetUnifiedSectionList()); + if (SymbolVendor *vendor = GetSymbolVendor()) + vendor->CreateSections(*GetUnifiedSectionList()); } return m_sections_ap.get(); } 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: 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/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/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/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: include/lldb/Symbol/SymbolVendor.h =================================================================== --- include/lldb/Symbol/SymbolVendor.h +++ include/lldb/Symbol/SymbolVendor.h @@ -130,6 +130,10 @@ FileSpec GetMainFileSpec() const; + /// Populate the unified section list of a module with sections the vendor's + /// sections. + virtual void CreateSections(SectionList &UnifiedList) {} + // Get module unified section list symbol table. virtual Symtab *GetSymtab();
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits