diff options
author | Geoffrey Keating <geoffk@apple.com> | 2006-09-02 07:26:21 +0000 |
---|---|---|
committer | Geoffrey Keating <geoffk@gcc.gnu.org> | 2006-09-02 07:26:21 +0000 |
commit | b73aec4fa5506d3f657aede2e44f989a894cf7aa (patch) | |
tree | 85448e962dab7223ed3cb23b1a0952c2871eb69d /gcc/dwarf2out.c | |
parent | bc038ad518596730e2962addeaa732b7696d458a (diff) | |
download | gcc-b73aec4fa5506d3f657aede2e44f989a894cf7aa.zip gcc-b73aec4fa5506d3f657aede2e44f989a894cf7aa.tar.gz gcc-b73aec4fa5506d3f657aede2e44f989a894cf7aa.tar.bz2 |
Revert this change:
2006-03-17 Alexandre Oliva <aoliva@redhat.com>
* dwarf2out.c (dwarf2out_stack_adjust): Always track the stack
pointer, instead of assuming it is possible to derive the
correct args size from a call insn.
From-SVN: r116659
Diffstat (limited to 'gcc/dwarf2out.c')
-rw-r--r-- | gcc/dwarf2out.c | 49 |
1 files changed, 26 insertions, 23 deletions
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 9342236..20dd06b 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -1086,7 +1086,7 @@ stack_adjust_offset (rtx pattern) much extra space it needs to pop off the stack. */ static void -dwarf2out_stack_adjust (rtx insn, bool after_p ATTRIBUTE_UNUSED) +dwarf2out_stack_adjust (rtx insn, bool after_p) { HOST_WIDE_INT offset; const char *label; @@ -1099,7 +1099,31 @@ dwarf2out_stack_adjust (rtx insn, bool after_p ATTRIBUTE_UNUSED) if (prologue_epilogue_contains (insn) || sibcall_epilogue_contains (insn)) return; - if (BARRIER_P (insn)) + /* If only calls can throw, and we have a frame pointer, + save up adjustments until we see the CALL_INSN. */ + if (!flag_asynchronous_unwind_tables && cfa.reg != STACK_POINTER_REGNUM) + { + if (CALL_P (insn) && !after_p) + { + /* Extract the size of the args from the CALL rtx itself. */ + insn = PATTERN (insn); + if (GET_CODE (insn) == PARALLEL) + insn = XVECEXP (insn, 0, 0); + if (GET_CODE (insn) == SET) + insn = SET_SRC (insn); + gcc_assert (GET_CODE (insn) == CALL); + dwarf2out_args_size ("", INTVAL (XEXP (insn, 1))); + } + return; + } + + if (CALL_P (insn) && !after_p) + { + if (!flag_asynchronous_unwind_tables) + dwarf2out_args_size ("", args_size); + return; + } + else if (BARRIER_P (insn)) { /* When we see a BARRIER, we know to reset args_size to 0. Usually the compiler will have already emitted a stack adjustment, but @@ -1121,20 +1145,9 @@ dwarf2out_stack_adjust (rtx insn, bool after_p ATTRIBUTE_UNUSED) if (GET_CODE (XVECEXP (PATTERN (insn), 0, i)) == SET) offset += stack_adjust_offset (XVECEXP (PATTERN (insn), 0, i)); } - else if (GET_CODE (insn) == CALL_INSN) - offset = 0; else return; - /* We handle this separately because we want stack adjustments in a - CALL_INSN to be handled. */; - if (GET_CODE (insn) == CALL_INSN) - { - /* If only calls can throw, adjust args_size only at call sites. */ - if (!flag_asynchronous_unwind_tables) - dwarf2out_args_size ("", args_size); - } - if (offset == 0) return; @@ -1149,16 +1162,6 @@ dwarf2out_stack_adjust (rtx insn, bool after_p ATTRIBUTE_UNUSED) if (args_size < 0) args_size = 0; - /* If only calls can throw and we have a frame pointer, we'll save - up adjustments until we see the CALL_INSN. We used to return - early and derive args_size from NARGS in the CALL_INSN itself, - but that doesn't compute the right value if we have nested call - expansions, e.g., stack adjustments for a call have already been - emitted, and then we issue another call to compute an argument - for the enclosing call (i.e., bar (foo ())). */ - if (!flag_asynchronous_unwind_tables && cfa.reg != STACK_POINTER_REGNUM) - return; - label = dwarf2out_cfi_label (); def_cfa_1 (label, &cfa); if (flag_asynchronous_unwind_tables) |