aboutsummaryrefslogtreecommitdiff
path: root/gcc/dwarf2out.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@gcc.gnu.org>2008-07-10 09:39:54 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2008-07-10 09:39:54 +0200
commita182fb6bfe35332c0890dfe6f89e433123f12f04 (patch)
treed543916a368659cba776054160616092ec3f7128 /gcc/dwarf2out.c
parentb1caaefc1cde4049a13aa413cdae0be107551c31 (diff)
downloadgcc-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.c26
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;
}