Index: include/lldb/Symbol/FuncUnwinders.h =================================================================== --- include/lldb/Symbol/FuncUnwinders.h +++ include/lldb/Symbol/FuncUnwinders.h @@ -90,6 +90,8 @@ lldb::UnwindPlanSP GetArmUnwindUnwindPlan(Target &target); + lldb::UnwindPlanSP GetSymbolFileUnwindPlan(Thread &thread); + lldb::UnwindPlanSP GetArchDefaultUnwindPlan(Thread &thread); lldb::UnwindPlanSP GetArchDefaultAtFuncEntryUnwindPlan(Thread &thread); @@ -120,6 +122,7 @@ std::vector m_unwind_plan_compact_unwind; lldb::UnwindPlanSP m_unwind_plan_arm_unwind_sp; + lldb::UnwindPlanSP m_unwind_plan_symbol_file_sp; lldb::UnwindPlanSP m_unwind_plan_fast_sp; lldb::UnwindPlanSP m_unwind_plan_arch_default_sp; lldb::UnwindPlanSP m_unwind_plan_arch_default_at_func_entry_sp; @@ -131,8 +134,8 @@ m_tried_unwind_plan_eh_frame_augmented : 1, m_tried_unwind_plan_debug_frame_augmented : 1, m_tried_unwind_plan_compact_unwind : 1, - m_tried_unwind_plan_arm_unwind : 1, m_tried_unwind_fast : 1, - m_tried_unwind_arch_default : 1, + m_tried_unwind_plan_arm_unwind : 1, m_tried_unwind_plan_symbol_file : 1, + m_tried_unwind_fast : 1, m_tried_unwind_arch_default : 1, m_tried_unwind_arch_default_at_func_entry : 1; Address m_first_non_prologue_insn; Index: include/lldb/Symbol/SymbolFile.h =================================================================== --- include/lldb/Symbol/SymbolFile.h +++ include/lldb/Symbol/SymbolFile.h @@ -223,6 +223,18 @@ /// for this module have been changed. virtual void SectionFileAddressesChanged() {} + struct RegisterInfoResolver { + virtual ~RegisterInfoResolver(); // anchor + + virtual const RegisterInfo *ResolveName(llvm::StringRef name) const = 0; + virtual const RegisterInfo *ResolveNumber(lldb::RegisterKind kind, + uint32_t number) const = 0; + }; + virtual lldb::UnwindPlanSP + GetUnwindPlan(const Address &address, const RegisterInfoResolver &resolver) { + return nullptr; + } + virtual void Dump(Stream &s) {} protected: Index: include/lldb/Symbol/UnwindTable.h =================================================================== --- include/lldb/Symbol/UnwindTable.h +++ include/lldb/Symbol/UnwindTable.h @@ -33,6 +33,7 @@ lldb_private::CompactUnwindInfo *GetCompactUnwindInfo(); ArmUnwindInfo *GetArmUnwindInfo(); + SymbolFile *GetSymbolFile(); lldb::FuncUnwindersSP GetFuncUnwindersContainingAddress(const Address &addr, SymbolContext &sc); Index: source/Commands/CommandObjectTarget.cpp =================================================================== --- source/Commands/CommandObjectTarget.cpp +++ source/Commands/CommandObjectTarget.cpp @@ -3591,6 +3591,14 @@ result.GetOutputStream().Printf("\n"); } + if (UnwindPlanSP symfile_plan_sp = + func_unwinders_sp->GetSymbolFileUnwindPlan(*thread)) { + result.GetOutputStream().Printf("Symbol file UnwindPlan:\n"); + symfile_plan_sp->Dump(result.GetOutputStream(), thread.get(), + LLDB_INVALID_ADDRESS); + result.GetOutputStream().Printf("\n"); + } + UnwindPlanSP compact_unwind_sp = func_unwinders_sp->GetCompactUnwindUnwindPlan(*target); if (compact_unwind_sp) { Index: source/Symbol/FuncUnwinders.cpp =================================================================== --- source/Symbol/FuncUnwinders.cpp +++ source/Symbol/FuncUnwinders.cpp @@ -13,11 +13,13 @@ #include "lldb/Symbol/CompactUnwindInfo.h" #include "lldb/Symbol/DWARFCallFrameInfo.h" #include "lldb/Symbol/ObjectFile.h" +#include "lldb/Symbol/SymbolFile.h" #include "lldb/Symbol/UnwindPlan.h" #include "lldb/Symbol/UnwindTable.h" #include "lldb/Target/ABI.h" #include "lldb/Target/ExecutionContext.h" #include "lldb/Target/Process.h" +#include "lldb/Target/RegisterContext.h" #include "lldb/Target/RegisterNumber.h" #include "lldb/Target/Target.h" #include "lldb/Target/Thread.h" @@ -42,7 +44,8 @@ m_tried_unwind_plan_eh_frame_augmented(false), m_tried_unwind_plan_debug_frame_augmented(false), m_tried_unwind_plan_compact_unwind(false), - m_tried_unwind_plan_arm_unwind(false), m_tried_unwind_fast(false), + m_tried_unwind_plan_arm_unwind(false), + m_tried_unwind_plan_symbol_file(false), m_tried_unwind_fast(false), m_tried_unwind_arch_default(false), m_tried_unwind_arch_default_at_func_entry(false), m_first_non_prologue_insn() {} @@ -147,6 +150,38 @@ return m_unwind_plan_arm_unwind_sp; } +namespace { +class RegisterContextToInfo: public SymbolFile::RegisterInfoResolver { +public: + RegisterContextToInfo(RegisterContext &ctx) : m_ctx(ctx) {} + + const RegisterInfo *ResolveName(llvm::StringRef name) const { + return m_ctx.GetRegisterInfoByName(name); + } + const RegisterInfo *ResolveNumber(lldb::RegisterKind kind, + uint32_t number) const { + return m_ctx.GetRegisterInfo(kind, number); + } + +private: + RegisterContext &m_ctx; +}; +} // namespace + +UnwindPlanSP FuncUnwinders::GetSymbolFileUnwindPlan(Thread &thread) { + std::lock_guard guard(m_mutex); + if (m_unwind_plan_symbol_file_sp.get() || m_tried_unwind_plan_symbol_file) + return m_unwind_plan_symbol_file_sp; + + m_tried_unwind_plan_symbol_file = true; + if (SymbolFile *symfile = m_unwind_table.GetSymbolFile()) { + m_unwind_plan_symbol_file_sp = symfile->GetUnwindPlan( + m_range.GetBaseAddress(), + RegisterContextToInfo(*thread.GetRegisterContext())); + } + return m_unwind_plan_symbol_file_sp; +} + UnwindPlanSP FuncUnwinders::GetEHFrameAugmentedUnwindPlan(Target &target, Thread &thread) { std::lock_guard guard(m_mutex); Index: source/Symbol/SymbolFile.cpp =================================================================== --- source/Symbol/SymbolFile.cpp +++ source/Symbol/SymbolFile.cpp @@ -168,3 +168,5 @@ "Module is not locked"); #endif } + +SymbolFile::RegisterInfoResolver::~RegisterInfoResolver() = default; Index: source/Symbol/UnwindTable.cpp =================================================================== --- source/Symbol/UnwindTable.cpp +++ source/Symbol/UnwindTable.cpp @@ -18,6 +18,7 @@ #include "lldb/Symbol/FuncUnwinders.h" #include "lldb/Symbol/ObjectFile.h" #include "lldb/Symbol/SymbolContext.h" +#include "lldb/Symbol/SymbolVendor.h" // There is one UnwindTable object per ObjectFile. It contains a list of Unwind // objects -- one per function, populated lazily -- for the ObjectFile. Each @@ -181,6 +182,12 @@ return m_arm_unwind_up.get(); } +SymbolFile *UnwindTable::GetSymbolFile() { + if (SymbolVendor *vendor = m_module.GetSymbolVendor()) + return vendor->GetSymbolFile(); + return nullptr; +} + ArchSpec UnwindTable::GetArchitecture() { return m_module.GetArchitecture(); } bool UnwindTable::GetAllowAssemblyEmulationUnwindPlans() {