From: Geoffrey Keating Date: Sat, 2 Sep 2006 07:26:21 +0000 (+0000) Subject: Revert this change: X-Git-Tag: releases/gcc-4.2.0~1551 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b73aec4fa5506d3f657aede2e44f989a894cf7aa;p=thirdparty%2Fgcc.git Revert this change: 2006-03-17 Alexandre Oliva * 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0674f547fd82..d16697ee748c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2006-09-02 Geoffrey Keating + + Revert this change: + 2006-03-17 Alexandre Oliva + * 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. + 2006-09-02 Jakub Jelinek PR middle-end/27567 diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 9342236966de..20dd06be5f63 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)