aboutsummaryrefslogtreecommitdiff
path: root/libgcc
diff options
context:
space:
mode:
authorBernd Schmidt <bernds@codesourcery.com>2011-10-25 15:44:03 +0000
committerBernd Schmidt <bernds@gcc.gnu.org>2011-10-25 15:44:03 +0000
commit5b2d9d9084afb8803644c8e5ec8422d86606f9f0 (patch)
treeecb26b57f95f7e89167f34c2184d957f7f5f4ba6 /libgcc
parent793ff12bf255144504035e01adc836a292ccc578 (diff)
downloadgcc-5b2d9d9084afb8803644c8e5ec8422d86606f9f0.zip
gcc-5b2d9d9084afb8803644c8e5ec8422d86606f9f0.tar.gz
gcc-5b2d9d9084afb8803644c8e5ec8422d86606f9f0.tar.bz2
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
Diffstat (limited to 'libgcc')
-rw-r--r--libgcc/ChangeLog5
-rw-r--r--libgcc/config/c6x/pr-support.c11
2 files changed, 14 insertions, 2 deletions
diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog
index 91068ce..e39fccc 100644
--- a/libgcc/ChangeLog
+++ b/libgcc/ChangeLog
@@ -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.
diff --git a/libgcc/config/c6x/pr-support.c b/libgcc/config/c6x/pr-support.c
index 6375013..e635a60 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;