From: jakub Date: Thu, 5 Jan 2012 20:47:16 +0000 (+0000) Subject: PR debug/51762 X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=commitdiff_plain;h=27827244123913039f536cade44263ac25de9957;ds=sidebyside PR debug/51762 * calls.c (emit_call_1): For noreturn calls force a REG_ARGS_SIZE note when !ACCUMULATE_OUTGOING_ARGS. * gcc.dg/pr51762.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@182924 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7991f1af03d..e63604ffcf9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-01-05 Jakub Jelinek + + PR debug/51762 + * calls.c (emit_call_1): For noreturn calls force a REG_ARGS_SIZE + note when !ACCUMULATE_OUTGOING_ARGS. + 2012-01-05 Eric Botcazou * tree-vrp.c (extract_range_from_binary_expr_1): Remove duplicated diff --git a/gcc/calls.c b/gcc/calls.c index c8d0b849985..943ab093c0f 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -1,7 +1,7 @@ /* Convert function calls to rtl insns, for GNU C compiler. Copyright (C) 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, - 2011 Free Software Foundation, Inc. + 2011, 2012 Free Software Foundation, Inc. This file is part of GCC. @@ -445,6 +445,11 @@ emit_call_1 (rtx funexp, tree fntree ATTRIBUTE_UNUSED, tree fndecl ATTRIBUTE_UNU if (SUPPORTS_STACK_ALIGNMENT) crtl->need_drap = true; } + /* For noreturn calls when not accumulating outgoing args force + REG_ARGS_SIZE note to prevent crossjumping of calls with different + args sizes. */ + else if (!ACCUMULATE_OUTGOING_ARGS && (ecf_flags & ECF_NORETURN) != 0) + add_reg_note (call_insn, REG_ARGS_SIZE, GEN_INT (stack_pointer_delta)); if (!ACCUMULATE_OUTGOING_ARGS) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8db8b22655a..6db75695305 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2012-01-05 Jakub Jelinek + PR debug/51762 + * gcc.dg/pr51762.c: New test. + PR rtl-optimization/51767 * gcc.c-torture/compile/pr51767.c: New test. diff --git a/gcc/testsuite/gcc.dg/pr51762.c b/gcc/testsuite/gcc.dg/pr51762.c new file mode 100644 index 00000000000..9c59f338c7e --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr51762.c @@ -0,0 +1,19 @@ +/* PR debug/51762 */ +/* { dg-do compile } */ +/* { dg-options "-g -Os -fomit-frame-pointer -fno-asynchronous-unwind-tables" } */ + +void noret (void) __attribute__ ((noreturn)); +int bar (void); +void baz (const char *); +static int v = -1; + +void +foo (void) +{ + if (bar () && v == -1) + { + baz ("baz"); + noret (); + } + noret (); +}