From 5b2d9d9084afb8803644c8e5ec8422d86606f9f0 Mon Sep 17 00:00:00 2001 From: Bernd Schmidt Date: Tue, 25 Oct 2011 15:44:03 +0000 Subject: [PATCH] pr-support.c (__gnu_unwind_24bit): Correct logic for the case where B3 isn't the return register. * config/c6x/pr-support.c (__gnu_unwind_24bit): Correct logic for the case where B3 isn't the return register. From-SVN: r180434 --- libgcc/ChangeLog | 5 +++++ libgcc/config/c6x/pr-support.c | 11 +++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index 91068ce1f50..e39fccc322c 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,3 +1,8 @@ +2011-10-25 Bernd Schmidt + + * config/c6x/pr-support.c (__gnu_unwind_24bit): Correct logic for the + case where B3 isn't the return register. + 2011-10-25 Andreas Tobler * config/rs6000/t-freebsd: Add wildcard. diff --git a/libgcc/config/c6x/pr-support.c b/libgcc/config/c6x/pr-support.c index 6375013cb66..e635a6033c2 100644 --- a/libgcc/config/c6x/pr-support.c +++ b/libgcc/config/c6x/pr-support.c @@ -273,6 +273,14 @@ __gnu_unwind_24bit (_Unwind_Context * context, _uw data, int compact) _uw mask; _uw *ptr; _uw tmp; + int ret_reg = unwind_frame_regs[data & 0xf]; + + if (ret_reg != R_B3) + { + _Unwind_VRS_Get (context, _UVRSC_CORE, unwind_frame_regs[data & 0xf], + _UVRSD_UINT32, &tmp); + _Unwind_VRS_Set (context, _UVRSC_CORE, R_B3, _UVRSD_UINT32, &tmp); + } mask = (data >> 4) & 0x1fff; @@ -291,8 +299,7 @@ __gnu_unwind_24bit (_Unwind_Context * context, _uw data, int compact) else pop_frame (context, mask, ptr, offset != 0x7f); - _Unwind_VRS_Get (context, _UVRSC_CORE, unwind_frame_regs[data & 0xf], - _UVRSD_UINT32, &tmp); + _Unwind_VRS_Get (context, _UVRSC_CORE, R_B3, _UVRSD_UINT32, &tmp); _Unwind_VRS_Set (context, _UVRSC_CORE, R_PC, _UVRSD_UINT32, &tmp); return _URC_OK;