From: Paul Brook Date: Mon, 9 Aug 2004 20:31:41 +0000 (+0000) Subject: unwind-dw2.c (uw_install_context_1): Update target saved stack pointer. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9d8646d7b098cd131bd9263ec98d3c03bdf4f66b;p=gcc.git unwind-dw2.c (uw_install_context_1): Update target saved stack pointer. * unwind-dw2.c (uw_install_context_1): Update target saved stack pointer. Co-Authored-By: Richard Henderson From-SVN: r85723 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8ce8ab9705d..ee1cbd78cac 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2004-08-09 Paul Brook + Richard Henderson + + * unwind-dw2.c (uw_install_context_1): Update target saved stack + pointer. + 2004-08-09 Geoffrey Keating * ggc-common.c (ggc_rlimit_bound): Don't check RSS limit. diff --git a/gcc/unwind-dw2.c b/gcc/unwind-dw2.c index 11b94b123d0..8b60b0c78d4 100644 --- a/gcc/unwind-dw2.c +++ b/gcc/unwind-dw2.c @@ -1274,6 +1274,12 @@ uw_install_context_1 (struct _Unwind_Context *current, struct _Unwind_Context *target) { long i; + _Unwind_SpTmp sp_slot; + + /* If the target frame does not have a saved stack pointer, + then set up the target's CFA. */ + if (!_Unwind_GetGRPtr (target, __builtin_dwarf_sp_column ())) + _Unwind_SetSpColumn (target, target->cfa, &sp_slot); for (i = 0; i < DWARF_FRAME_REGISTERS; ++i) { @@ -1284,25 +1290,22 @@ uw_install_context_1 (struct _Unwind_Context *current, memcpy (c, t, dwarf_reg_size_table[i]); } -#ifdef EH_RETURN_STACKADJ_RTX - { - void *target_cfa; + /* If the current frame doesn't have a saved stack pointer, then we + need to rely on EH_RETURN_STACKADJ_RTX to get our target stack + pointer value reloaded. */ + if (!_Unwind_GetGRPtr (current, __builtin_dwarf_sp_column ())) + { + void *target_cfa; - /* If the last frame records a saved stack pointer, use it. */ - if (_Unwind_GetGRPtr (target, __builtin_dwarf_sp_column ())) target_cfa = _Unwind_GetPtr (target, __builtin_dwarf_sp_column ()); - else - target_cfa = target->cfa; - - /* We adjust SP by the difference between CURRENT and TARGET's CFA. */ - if (STACK_GROWS_DOWNWARD) - return target_cfa - current->cfa + target->args_size; - else - return current->cfa - target_cfa - target->args_size; - } -#else + + /* We adjust SP by the difference between CURRENT and TARGET's CFA. */ + if (STACK_GROWS_DOWNWARD) + return target_cfa - current->cfa + target->args_size; + else + return current->cfa - target_cfa - target->args_size; + } return 0; -#endif } static inline _Unwind_Ptr