aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/arm-tdep.c97
1 files changed, 65 insertions, 32 deletions
diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c
index 56936bd..347f3e6 100644
--- a/gdb/arm-tdep.c
+++ b/gdb/arm-tdep.c
@@ -3965,6 +3965,18 @@ struct frame_base arm_normal_base = {
arm_normal_frame_base
};
+struct arm_dwarf2_prev_register_cache
+{
+ /* Cached value of the coresponding stack pointer for the inner frame. */
+ CORE_ADDR sp;
+ CORE_ADDR msp;
+ CORE_ADDR msp_s;
+ CORE_ADDR msp_ns;
+ CORE_ADDR psp;
+ CORE_ADDR psp_s;
+ CORE_ADDR psp_ns;
+};
+
static struct value *
arm_dwarf2_prev_register (frame_info_ptr this_frame, void **this_cache,
int regnum)
@@ -3973,6 +3985,49 @@ arm_dwarf2_prev_register (frame_info_ptr this_frame, void **this_cache,
arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
CORE_ADDR lr;
ULONGEST cpsr;
+ arm_dwarf2_prev_register_cache *cache
+ = ((arm_dwarf2_prev_register_cache *)
+ dwarf2_frame_get_fn_data (this_frame, this_cache,
+ arm_dwarf2_prev_register));
+
+ if (!cache)
+ {
+ const unsigned int size = sizeof (struct arm_dwarf2_prev_register_cache);
+ cache = ((arm_dwarf2_prev_register_cache *)
+ dwarf2_frame_allocate_fn_data (this_frame, this_cache,
+ arm_dwarf2_prev_register, size));
+
+ if (tdep->have_sec_ext)
+ {
+ cache->sp
+ = get_frame_register_unsigned (this_frame, ARM_SP_REGNUM);
+
+ cache->msp_s
+ = get_frame_register_unsigned (this_frame,
+ tdep->m_profile_msp_s_regnum);
+ cache->msp_ns
+ = get_frame_register_unsigned (this_frame,
+ tdep->m_profile_msp_ns_regnum);
+ cache->psp_s
+ = get_frame_register_unsigned (this_frame,
+ tdep->m_profile_psp_s_regnum);
+ cache->psp_ns
+ = get_frame_register_unsigned (this_frame,
+ tdep->m_profile_psp_ns_regnum);
+ }
+ else if (tdep->is_m)
+ {
+ cache->sp
+ = get_frame_register_unsigned (this_frame, ARM_SP_REGNUM);
+
+ cache->msp
+ = get_frame_register_unsigned (this_frame,
+ tdep->m_profile_msp_regnum);
+ cache->psp
+ = get_frame_register_unsigned (this_frame,
+ tdep->m_profile_psp_regnum);
+ }
+ }
if (regnum == ARM_PC_REGNUM)
{
@@ -4012,33 +4067,18 @@ arm_dwarf2_prev_register (frame_info_ptr this_frame, void **this_cache,
if (tdep->have_sec_ext)
{
- CORE_ADDR sp
- = get_frame_register_unsigned (this_frame, ARM_SP_REGNUM);
- CORE_ADDR msp_s
- = get_frame_register_unsigned (this_frame,
- tdep->m_profile_msp_s_regnum);
- CORE_ADDR msp_ns
- = get_frame_register_unsigned (this_frame,
- tdep->m_profile_msp_ns_regnum);
- CORE_ADDR psp_s
- = get_frame_register_unsigned (this_frame,
- tdep->m_profile_psp_s_regnum);
- CORE_ADDR psp_ns
- = get_frame_register_unsigned (this_frame,
- tdep->m_profile_psp_ns_regnum);
-
bool is_msp = (regnum == tdep->m_profile_msp_regnum)
- && (msp_s == sp || msp_ns == sp);
+ && (cache->msp_s == cache->sp || cache->msp_ns == cache->sp);
bool is_msp_s = (regnum == tdep->m_profile_msp_s_regnum)
- && (msp_s == sp);
+ && (cache->msp_s == cache->sp);
bool is_msp_ns = (regnum == tdep->m_profile_msp_ns_regnum)
- && (msp_ns == sp);
+ && (cache->msp_ns == cache->sp);
bool is_psp = (regnum == tdep->m_profile_psp_regnum)
- && (psp_s == sp || psp_ns == sp);
+ && (cache->psp_s == cache->sp || cache->psp_ns == cache->sp);
bool is_psp_s = (regnum == tdep->m_profile_psp_s_regnum)
- && (psp_s == sp);
+ && (cache->psp_s == cache->sp);
bool is_psp_ns = (regnum == tdep->m_profile_psp_ns_regnum)
- && (psp_ns == sp);
+ && (cache->psp_ns == cache->sp);
override_with_sp_value = is_msp || is_msp_s || is_msp_ns
|| is_psp || is_psp_s || is_psp_ns;
@@ -4046,17 +4086,10 @@ arm_dwarf2_prev_register (frame_info_ptr this_frame, void **this_cache,
}
else if (tdep->is_m)
{
- CORE_ADDR sp
- = get_frame_register_unsigned (this_frame, ARM_SP_REGNUM);
- CORE_ADDR msp
- = get_frame_register_unsigned (this_frame,
- tdep->m_profile_msp_regnum);
- CORE_ADDR psp
- = get_frame_register_unsigned (this_frame,
- tdep->m_profile_psp_regnum);
-
- bool is_msp = (regnum == tdep->m_profile_msp_regnum) && (sp == msp);
- bool is_psp = (regnum == tdep->m_profile_psp_regnum) && (sp == psp);
+ bool is_msp = (regnum == tdep->m_profile_msp_regnum)
+ && (cache->sp == cache->msp);
+ bool is_psp = (regnum == tdep->m_profile_psp_regnum)
+ && (cache->sp == cache->psp);
override_with_sp_value = is_msp || is_psp;
}