aboutsummaryrefslogtreecommitdiff
path: root/gcc/dwarf2out.c
diff options
context:
space:
mode:
authorGeoffrey Keating <geoffk@apple.com>2006-09-02 07:26:21 +0000
committerGeoffrey Keating <geoffk@gcc.gnu.org>2006-09-02 07:26:21 +0000
commitb73aec4fa5506d3f657aede2e44f989a894cf7aa (patch)
tree85448e962dab7223ed3cb23b1a0952c2871eb69d /gcc/dwarf2out.c
parentbc038ad518596730e2962addeaa732b7696d458a (diff)
downloadgcc-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.c49
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)