diff options
author | Jakub Jelinek <jakub@gcc.gnu.org> | 2008-07-10 09:39:54 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2008-07-10 09:39:54 +0200 |
commit | a182fb6bfe35332c0890dfe6f89e433123f12f04 (patch) | |
tree | d543916a368659cba776054160616092ec3f7128 /gcc/dwarf2out.c | |
parent | b1caaefc1cde4049a13aa413cdae0be107551c31 (diff) | |
download | gcc-a182fb6bfe35332c0890dfe6f89e433123f12f04.zip gcc-a182fb6bfe35332c0890dfe6f89e433123f12f04.tar.gz gcc-a182fb6bfe35332c0890dfe6f89e433123f12f04.tar.bz2 |
re PR rtl-optimization/36419 (Wrong unwind info with -Os -fasynchronous-unwind-tables)
PR rtl-optimization/36419
* combine-stack-adj.c (adjust_frame_related_expr): New function.
(combine_stack_adjustments_for_block): Call it if needed. Delete
correct insn.
* dwarf2out.c (dwarf2out_frame_debug_expr): Adjust
DW_CFA_GNU_args_size if CSA pass merged some adjustments into
prologue sp adjustment.
* g++.dg/eh/async-unwind1.C: New test.
From-SVN: r137689
Diffstat (limited to 'gcc/dwarf2out.c')
-rw-r--r-- | gcc/dwarf2out.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 80bdc0a..46ab104 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -1579,6 +1579,32 @@ dwarf2out_frame_debug_expr (rtx expr, const char *label) && (!MEM_P (SET_DEST (elem)) || GET_CODE (expr) == SEQUENCE) && (RTX_FRAME_RELATED_P (elem) || par_index == 0)) dwarf2out_frame_debug_expr (elem, label); + else if (GET_CODE (elem) == SET + && par_index != 0 + && !RTX_FRAME_RELATED_P (elem)) + { + /* Stack adjustment combining might combine some post-prologue + stack adjustment into a prologue stack adjustment. */ + HOST_WIDE_INT offset = stack_adjust_offset (elem); + + if (offset != 0) + { + if (cfa.reg == STACK_POINTER_REGNUM) + cfa.offset += offset; + +#ifndef STACK_GROWS_DOWNWARD + offset = -offset; +#endif + + args_size += offset; + if (args_size < 0) + args_size = 0; + + def_cfa_1 (label, &cfa); + if (flag_asynchronous_unwind_tables) + dwarf2out_args_size (label, args_size); + } + } } return; } |