diff options
-rw-r--r-- | lldb/include/lldb/Symbol/FuncUnwinders.h | 7 | ||||
-rw-r--r-- | lldb/include/lldb/Symbol/SymbolFile.h | 12 | ||||
-rw-r--r-- | lldb/include/lldb/Symbol/UnwindTable.h | 1 | ||||
-rw-r--r-- | lldb/source/Commands/CommandObjectTarget.cpp | 8 | ||||
-rw-r--r-- | lldb/source/Symbol/FuncUnwinders.cpp | 37 | ||||
-rw-r--r-- | lldb/source/Symbol/SymbolFile.cpp | 2 | ||||
-rw-r--r-- | lldb/source/Symbol/UnwindTable.cpp | 7 |
7 files changed, 71 insertions, 3 deletions
diff --git a/lldb/include/lldb/Symbol/FuncUnwinders.h b/lldb/include/lldb/Symbol/FuncUnwinders.h index 8b35d36df35..1872e77fb82 100644 --- a/lldb/include/lldb/Symbol/FuncUnwinders.h +++ b/lldb/include/lldb/Symbol/FuncUnwinders.h @@ -90,6 +90,8 @@ public: lldb::UnwindPlanSP GetArmUnwindUnwindPlan(Target &target); + lldb::UnwindPlanSP GetSymbolFileUnwindPlan(Thread &thread); + lldb::UnwindPlanSP GetArchDefaultUnwindPlan(Thread &thread); lldb::UnwindPlanSP GetArchDefaultAtFuncEntryUnwindPlan(Thread &thread); @@ -120,6 +122,7 @@ private: std::vector<lldb::UnwindPlanSP> 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 @@ private: 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; diff --git a/lldb/include/lldb/Symbol/SymbolFile.h b/lldb/include/lldb/Symbol/SymbolFile.h index e2f18d81c3e..dbb723e9d36 100644 --- a/lldb/include/lldb/Symbol/SymbolFile.h +++ b/lldb/include/lldb/Symbol/SymbolFile.h @@ -223,6 +223,18 @@ public: /// 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: diff --git a/lldb/include/lldb/Symbol/UnwindTable.h b/lldb/include/lldb/Symbol/UnwindTable.h index c0a37ab4f19..60708f5121a 100644 --- a/lldb/include/lldb/Symbol/UnwindTable.h +++ b/lldb/include/lldb/Symbol/UnwindTable.h @@ -33,6 +33,7 @@ public: lldb_private::CompactUnwindInfo *GetCompactUnwindInfo(); ArmUnwindInfo *GetArmUnwindInfo(); + SymbolFile *GetSymbolFile(); lldb::FuncUnwindersSP GetFuncUnwindersContainingAddress(const Address &addr, SymbolContext &sc); diff --git a/lldb/source/Commands/CommandObjectTarget.cpp b/lldb/source/Commands/CommandObjectTarget.cpp index ebc68731aed..53e7347d4f6 100644 --- a/lldb/source/Commands/CommandObjectTarget.cpp +++ b/lldb/source/Commands/CommandObjectTarget.cpp @@ -3591,6 +3591,14 @@ protected: 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) { diff --git a/lldb/source/Symbol/FuncUnwinders.cpp b/lldb/source/Symbol/FuncUnwinders.cpp index 7b44b1094a8..bbdb5e1bbf7 100644 --- a/lldb/source/Symbol/FuncUnwinders.cpp +++ b/lldb/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 @@ FuncUnwinders::FuncUnwinders(UnwindTable &unwind_table, AddressRange range) 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 @@ UnwindPlanSP FuncUnwinders::GetArmUnwindUnwindPlan(Target &target) { 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<std::recursive_mutex> 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<std::recursive_mutex> guard(m_mutex); diff --git a/lldb/source/Symbol/SymbolFile.cpp b/lldb/source/Symbol/SymbolFile.cpp index e55b997b513..77ab2223ec0 100644 --- a/lldb/source/Symbol/SymbolFile.cpp +++ b/lldb/source/Symbol/SymbolFile.cpp @@ -168,3 +168,5 @@ void SymbolFile::AssertModuleLock() { "Module is not locked"); #endif } + +SymbolFile::RegisterInfoResolver::~RegisterInfoResolver() = default; diff --git a/lldb/source/Symbol/UnwindTable.cpp b/lldb/source/Symbol/UnwindTable.cpp index 4b87f697fc0..a8f451dc464 100644 --- a/lldb/source/Symbol/UnwindTable.cpp +++ b/lldb/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 @@ ArmUnwindInfo *UnwindTable::GetArmUnwindInfo() { 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() { |