summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/include/lldb/Symbol/FuncUnwinders.h7
-rw-r--r--lldb/include/lldb/Symbol/SymbolFile.h12
-rw-r--r--lldb/include/lldb/Symbol/UnwindTable.h1
-rw-r--r--lldb/source/Commands/CommandObjectTarget.cpp8
-rw-r--r--lldb/source/Symbol/FuncUnwinders.cpp37
-rw-r--r--lldb/source/Symbol/SymbolFile.cpp2
-rw-r--r--lldb/source/Symbol/UnwindTable.cpp7
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() {
OpenPOWER on IntegriCloud