aboutsummaryrefslogtreecommitdiffstats
path: root/include/lldb/Symbol/UnwindPlan.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/lldb/Symbol/UnwindPlan.h')
-rw-r--r--include/lldb/Symbol/UnwindPlan.h35
1 files changed, 31 insertions, 4 deletions
diff --git a/include/lldb/Symbol/UnwindPlan.h b/include/lldb/Symbol/UnwindPlan.h
index 2b49acaafa04..fa41ba5d056a 100644
--- a/include/lldb/Symbol/UnwindPlan.h
+++ b/include/lldb/Symbol/UnwindPlan.h
@@ -201,7 +201,8 @@ public:
unspecified, // not specified
isRegisterPlusOffset, // FA = register + offset
isRegisterDereferenced, // FA = [reg]
- isDWARFExpression // FA = eval(dwarf_expr)
+ isDWARFExpression, // FA = eval(dwarf_expr)
+ isRaSearch, // FA = SP + offset + ???
};
FAValue() : m_type(unspecified), m_value() {}
@@ -214,6 +215,11 @@ public:
bool IsUnspecified() const { return m_type == unspecified; }
+ void SetRaSearch(int32_t offset) {
+ m_type = isRaSearch;
+ m_value.ra_search_offset = offset;
+ }
+
bool IsRegisterPlusOffset() const {
return m_type == isRegisterPlusOffset;
}
@@ -250,9 +256,14 @@ public:
ValueType GetValueType() const { return m_type; }
int32_t GetOffset() const {
- if (m_type == isRegisterPlusOffset)
- return m_value.reg.offset;
- return 0;
+ switch (m_type) {
+ case isRegisterPlusOffset:
+ return m_value.reg.offset;
+ case isRaSearch:
+ return m_value.ra_search_offset;
+ default:
+ return 0;
+ }
}
void IncOffset(int32_t delta) {
@@ -304,6 +315,8 @@ public:
const uint8_t *opcodes;
uint16_t length;
} expr;
+ // For m_type == isRaSearch
+ int32_t ra_search_offset;
} m_value;
}; // class FAValue
@@ -370,6 +383,7 @@ public:
m_return_addr_register(LLDB_INVALID_REGNUM), m_source_name(),
m_plan_is_sourced_from_compiler(eLazyBoolCalculate),
m_plan_is_valid_at_all_instruction_locations(eLazyBoolCalculate),
+ m_plan_is_for_signal_trap(eLazyBoolCalculate),
m_lsda_address(), m_personality_func_addr() {}
// Performs a deep copy of the plan, including all the rows (expensive).
@@ -463,6 +477,17 @@ public:
m_plan_is_valid_at_all_instruction_locations = valid_at_all_insn;
}
+ // Is this UnwindPlan for a signal trap frame? If so, then its saved pc
+ // may have been set manually by the signal dispatch code and therefore
+ // not follow a call to the child frame.
+ lldb_private::LazyBool GetUnwindPlanForSignalTrap() const {
+ return m_plan_is_for_signal_trap;
+ }
+
+ void SetUnwindPlanForSignalTrap(lldb_private::LazyBool is_for_signal_trap) {
+ m_plan_is_for_signal_trap = is_for_signal_trap;
+ }
+
int GetRowCount() const;
void Clear() {
@@ -472,6 +497,7 @@ public:
m_source_name.Clear();
m_plan_is_sourced_from_compiler = eLazyBoolCalculate;
m_plan_is_valid_at_all_instruction_locations = eLazyBoolCalculate;
+ m_plan_is_for_signal_trap = eLazyBoolCalculate;
m_lsda_address.Clear();
m_personality_func_addr.Clear();
}
@@ -502,6 +528,7 @@ private:
m_source_name; // for logging, where this UnwindPlan originated from
lldb_private::LazyBool m_plan_is_sourced_from_compiler;
lldb_private::LazyBool m_plan_is_valid_at_all_instruction_locations;
+ lldb_private::LazyBool m_plan_is_for_signal_trap;
Address m_lsda_address; // Where the language specific data area exists in the
// module - used