diff options
author | Alexandre Oliva <aoliva@redhat.com> | 2012-06-22 01:33:46 +0000 |
---|---|---|
committer | Alexandre Oliva <aoliva@gcc.gnu.org> | 2012-06-22 01:33:46 +0000 |
commit | 48b00503b168518ebbf5bc54525b0c1157321501 (patch) | |
tree | ef7bf49759547cb9a88926ff8e76ffea08a7c037 /gcc | |
parent | 4977e903b2372bdc2b7718faa1cdcd3d149f1b3c (diff) | |
download | gcc-48b00503b168518ebbf5bc54525b0c1157321501.zip gcc-48b00503b168518ebbf5bc54525b0c1157321501.tar.gz gcc-48b00503b168518ebbf5bc54525b0c1157321501.tar.bz2 |
re PR debug/53671 (Many guality test failures)
PR debug/53671
PR debug/49888
* var-tracking.c (vt_initialize): Record initial offset between
arg pointer and stack pointer.
From-SVN: r188870
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/var-tracking.c | 35 |
2 files changed, 42 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0145a6a..4b812f6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -2,6 +2,13 @@ PR debug/53671 PR debug/49888 + * var-tracking.c (vt_initialize): Record initial offset between + arg pointer and stack pointer. + +2012-06-21 Alexandre Oliva <aoliva@redhat.com> + + PR debug/53671 + PR debug/49888 * var-tracking.c (vt_init_cfa_base): Drop redundant recording of CFA base. diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c index a8a858a..9fdd252 100644 --- a/gcc/var-tracking.c +++ b/gcc/var-tracking.c @@ -9504,6 +9504,41 @@ vt_initialize (void) valvar_pool = NULL; } + if (MAY_HAVE_DEBUG_INSNS) + { + rtx reg, expr; + int ofst; + cselib_val *val; + +#ifdef FRAME_POINTER_CFA_OFFSET + reg = frame_pointer_rtx; + ofst = FRAME_POINTER_CFA_OFFSET (current_function_decl); +#else + reg = arg_pointer_rtx; + ofst = ARG_POINTER_CFA_OFFSET (current_function_decl); +#endif + + ofst -= INCOMING_FRAME_SP_OFFSET; + + val = cselib_lookup_from_insn (reg, GET_MODE (reg), 1, + VOIDmode, get_insns ()); + preserve_value (val); + cselib_preserve_cfa_base_value (val, REGNO (reg)); + expr = plus_constant (GET_MODE (stack_pointer_rtx), + stack_pointer_rtx, -ofst); + cselib_add_permanent_equiv (val, expr, get_insns ()); + + if (ofst) + { + val = cselib_lookup_from_insn (stack_pointer_rtx, + GET_MODE (stack_pointer_rtx), 1, + VOIDmode, get_insns ()); + preserve_value (val); + expr = plus_constant (GET_MODE (reg), reg, ofst); + cselib_add_permanent_equiv (val, expr, get_insns ()); + } + } + /* In order to factor out the adjustments made to the stack pointer or to the hard frame pointer and thus be able to use DW_OP_fbreg operations instead of individual location lists, we're going to rewrite MEMs based |