Index: include/lldb/Core/Module.h =================================================================== --- include/lldb/Core/Module.h +++ include/lldb/Core/Module.h @@ -710,7 +710,7 @@ /// Returns the unwind table for this module. If this object has no /// associated object file, an empty UnwindTable is returned. //------------------------------------------------------------------ - UnwindTable &GetUnwindTable() { return m_unwind_table; } + UnwindTable &GetUnwindTable(); llvm::VersionTuple GetVersion(); @@ -1109,8 +1109,9 @@ lldb::ObjectFileSP m_objfile_sp; ///< A shared pointer to the object file ///parser for this module as it may or may ///not be shared with the SymbolFile - UnwindTable m_unwind_table{*this}; ///< Table of FuncUnwinders objects created - /// for this Module's functions + llvm::Optional m_unwind_table; ///< Table of FuncUnwinders + /// objects created for this + /// Module's functions lldb::SymbolVendorUP m_symfile_up; ///< A pointer to the symbol vendor for this module. std::vector Index: lit/SymbolFile/Inputs/target-symbols-add-unwind.c =================================================================== --- /dev/null +++ lit/SymbolFile/Inputs/target-symbols-add-unwind.c @@ -0,0 +1 @@ +void _start() {} Index: lit/SymbolFile/target-symbols-add-unwind.test =================================================================== --- /dev/null +++ lit/SymbolFile/target-symbols-add-unwind.test @@ -0,0 +1,26 @@ +# TODO: When it's possible to run "image show-unwind" without a running +# process, we can remove the unsupported line below, and hard-code an ELF +# triple in the test. +# UNSUPPORTED: system-windows, system-darwin + +# RUN: cd %T +# RUN: %clang %S/Inputs/target-symbols-add-unwind.c -nostdlib -g \ +# RUN: -fno-unwind-tables -o target-symbols-add-unwind.debug +# RUN: llvm-objcopy --strip-debug target-symbols-add-unwind.debug \ +# RUN: target-symbols-add-unwind.stripped +# RUN: %lldb target-symbols-add-unwind.stripped -s %s -o quit | FileCheck %s + +process launch --stop-at-entry +image show-unwind -n _start +# CHECK-LABEL: image show-unwind -n _start +# CHECK-NOT: debug_frame UnwindPlan: + +target symbols add -s target-symbols-add-unwind.stripped target-symbols-add-unwind.debug +# CHECK-LABEL: target symbols add +# CHECK: symbol file {{.*}} has been added to {{.*}} + +image show-unwind -n _start +# CHECK-LABEL: image show-unwind -n _start +# CHECK: debug_frame UnwindPlan: +# CHECK-NEXT: This UnwindPlan originally sourced from DWARF CFI +# CHECK-NEXT: This UnwindPlan is sourced from the compiler: yes. Index: source/Core/Module.cpp =================================================================== --- source/Core/Module.cpp +++ source/Core/Module.cpp @@ -1296,6 +1296,12 @@ sym_vendor->SectionFileAddressesChanged(); } +UnwindTable &Module::GetUnwindTable() { + if (!m_unwind_table) + m_unwind_table.emplace(*this); + return *m_unwind_table; +} + SectionList *Module::GetUnifiedSectionList() { if (!m_sections_up) m_sections_up = llvm::make_unique(); @@ -1442,6 +1448,10 @@ // one obj_file->ClearSymtab(); + // Clear the unwind table too, as that may also be affected by the + // symbol file information. + m_unwind_table.reset(); + // The symbol file might be a directory bundle ("/tmp/a.out.dSYM") // instead of a full path to the symbol file within the bundle // ("/tmp/a.out.dSYM/Contents/Resources/DWARF/a.out"). So we need to Index: source/Symbol/UnwindTable.cpp =================================================================== --- source/Symbol/UnwindTable.cpp +++ source/Symbol/UnwindTable.cpp @@ -46,7 +46,7 @@ if (!object_file) return; - SectionList *sl = object_file->GetSectionList(); + SectionList *sl = m_module.GetSectionList(); if (!sl) return;