diff options
author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-11-26 02:21:38 +0000 |
---|---|---|
committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-11-26 02:21:38 +0000 |
commit | 535fcfa4c230a473772a9d4b2f215b1b2c8e64a2 (patch) | |
tree | 28556a7be58c09385a153f5126b18bd13e964753 /gcc/dwarf2out.c | |
parent | b471f4db5dfbc71bf71ae7319b095132307c653e (diff) | |
download | gcc-535fcfa4c230a473772a9d4b2f215b1b2c8e64a2.tar.gz |
* dwarf2out.c (dwarf2out_stack_adjust): Add after_p argument. Save
args_size adjustments for calls even with cfa as stack pointer.
Search calls for stack adjustments after the insn is issued.
(dwarf2out_frame_debug): Add after_p argument; pass it on.
* dwarf2out.h (dwarf2out_frame_debug): Update to match.
* final.c (final_start_function, final_scan_insn): Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@91319 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/dwarf2out.c')
-rw-r--r-- | gcc/dwarf2out.c | 54 |
1 files changed, 31 insertions, 23 deletions
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 044a65c4892..bd2650480b0 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -363,7 +363,7 @@ static void initial_return_save (rtx); static HOST_WIDE_INT stack_adjust_offset (rtx); static void output_cfi (dw_cfi_ref, dw_fde_ref, int); static void output_call_frame_info (int); -static void dwarf2out_stack_adjust (rtx); +static void dwarf2out_stack_adjust (rtx, bool); static void flush_queued_reg_saves (void); static bool clobbers_queued_reg_save (rtx); static void dwarf2out_frame_debug_expr (rtx, const char *); @@ -1051,7 +1051,7 @@ stack_adjust_offset (rtx pattern) much extra space it needs to pop off the stack. */ static void -dwarf2out_stack_adjust (rtx insn) +dwarf2out_stack_adjust (rtx insn, bool after_p) { HOST_WIDE_INT offset; const char *label; @@ -1064,26 +1064,31 @@ dwarf2out_stack_adjust (rtx insn) if (prologue_epilogue_contains (insn) || sibcall_epilogue_contains (insn)) return; - if (!flag_asynchronous_unwind_tables && CALL_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) { - /* 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))); + 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 only calls can throw, and we have a frame pointer, - save up adjustments until we see the CALL_INSN. */ - else if (!flag_asynchronous_unwind_tables && cfa.reg != STACK_POINTER_REGNUM) - return; - - if (BARRIER_P (insn)) + 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 @@ -1124,7 +1129,8 @@ dwarf2out_stack_adjust (rtx insn) label = dwarf2out_cfi_label (); def_cfa_1 (label, &cfa); - dwarf2out_args_size (label, args_size); + if (flag_asynchronous_unwind_tables) + dwarf2out_args_size (label, args_size); } #endif @@ -1772,10 +1778,13 @@ dwarf2out_frame_debug_expr (rtx expr, const char *label) /* Record call frame debugging information for INSN, which either sets SP or FP (adjusting how we calculate the frame address) or saves a - register to the stack. If INSN is NULL_RTX, initialize our state. */ + register to the stack. If INSN is NULL_RTX, initialize our state. + + If AFTER_P is false, we're being called before the insn is emitted, + otherwise after. Call instructions get invoked twice. */ void -dwarf2out_frame_debug (rtx insn) +dwarf2out_frame_debug (rtx insn, bool after_p) { const char *label; rtx src; @@ -1812,8 +1821,7 @@ dwarf2out_frame_debug (rtx insn) if (! RTX_FRAME_RELATED_P (insn)) { if (!ACCUMULATE_OUTGOING_ARGS) - dwarf2out_stack_adjust (insn); - + dwarf2out_stack_adjust (insn, after_p); return; } |