===================================================================
@@ -1,3 +1,8 @@
+2011-10-25 Bernd Schmidt <bernds@codesourcery.com>
+
+ * 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 <andreast@fgznet.ch>
* config/rs6000/t-freebsd: Add wildcard.
===================================================================
@@ -273,6 +273,14 @@ __gnu_unwind_24bit (_Unwind_Context * co
_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 * co
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;