re PR c++/44127 (G++ emits unnecessary EH code)

PR c++/44127
gcc:
	* gimplify.c (gimplify_seq_add_stmt): No longer static.
	* gimple.h: Declare it.
	* gimple.c (gimple_build_eh_filter): No ops.
gcc/cp:
	* cp-gimplify.c (gimplify_must_not_throw_expr): Use
	gimple_build_eh_must_not_throw.

From-SVN: r159407
This commit is contained in:
Jason Merrill 2010-05-14 14:55:10 -04:00 committed by Jason Merrill
parent 19fb0b860f
commit 786f715dc6
8 changed files with 58 additions and 5 deletions

View File

@ -1,3 +1,10 @@
2010-05-14 Jason Merrill <jason@redhat.com>
PR c++/44127
* gimplify.c (gimplify_seq_add_stmt): No longer static.
* gimple.h: Declare it.
* gimple.c (gimple_build_eh_filter): No ops.
2010-05-14 Jan Hubicka <jh@suse.cz>
* ipa.c (enqueue_cgraph_node): Update comment; do not re-enqueue

View File

@ -1,3 +1,9 @@
2010-05-14 Jason Merrill <jason@redhat.com>
PR c++/44127
* cp-gimplify.c (gimplify_must_not_throw_expr): Use
gimple_build_eh_must_not_throw.
2010-05-14 Martin Jambor <mjambor@suse.cz>
* cp-lang.c (LANG_HOOKS_FOLD_OBJ_TYPE_REF): Remove both its undef

View File

@ -480,11 +480,16 @@ gimplify_must_not_throw_expr (tree *expr_p, gimple_seq *pre_p)
tree stmt = *expr_p;
tree temp = voidify_wrapper_expr (stmt, NULL);
tree body = TREE_OPERAND (stmt, 0);
gimple_seq try_ = NULL;
gimple_seq catch_ = NULL;
gimple mnt;
stmt = build_gimple_eh_filter_tree (body, NULL_TREE,
build_call_n (terminate_node, 0));
gimplify_and_add (body, &try_);
mnt = gimple_build_eh_must_not_throw (terminate_node);
gimplify_seq_add_stmt (&catch_, mnt);
mnt = gimple_build_try (try_, catch_, GIMPLE_TRY_CATCH);
gimplify_and_add (stmt, pre_p);
gimplify_seq_add_stmt (pre_p, mnt);
if (temp)
{
*expr_p = temp;

View File

@ -636,7 +636,7 @@ gimple_build_eh_filter (tree types, gimple_seq failure)
gimple
gimple_build_eh_must_not_throw (tree decl)
{
gimple p = gimple_alloc (GIMPLE_EH_MUST_NOT_THROW, 1);
gimple p = gimple_alloc (GIMPLE_EH_MUST_NOT_THROW, 0);
gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
gcc_assert (flags_from_decl_or_type (decl) & ECF_NORETURN);

View File

@ -221,6 +221,13 @@ gimple_seq_empty_p (const_gimple_seq s)
void gimple_seq_add_stmt (gimple_seq *, gimple);
/* Link gimple statement GS to the end of the sequence *SEQ_P. If
*SEQ_P is NULL, a new sequence is allocated. This function is
similar to gimple_seq_add_stmt, but does not scan the operands.
During gimplification, we need to manipulate statement sequences
before the def/use vectors have been constructed. */
void gimplify_seq_add_stmt (gimple_seq *, gimple);
/* Allocate a new sequence and initialize its first element with STMT. */
static inline gimple_seq

View File

@ -158,7 +158,7 @@ gimple_tree_eq (const void *p1, const void *p2)
During gimplification, we need to manipulate statement sequences
before the def/use vectors have been constructed. */
static void
void
gimplify_seq_add_stmt (gimple_seq *seq_p, gimple gs)
{
gimple_stmt_iterator si;

View File

@ -1,3 +1,8 @@
2010-05-14 Jason Merrill <jason@redhat.com>
PR c++/44127
* g++.dg/eh/terminate1.C: New.
2010-05-14 Jakub Jelinek <jakub@redhat.com>
* gfortran.dg/gomp/pr44036-1.f90: Adjust.

View File

@ -0,0 +1,23 @@
// PR c++/44127
// This is basically the same test as g++.eh/terminate1.C, but that one
// tests runtime behavior and this tests the assembly output. The test
// should call terminate (because initializing the catch parm throws), but
// from the personality routine, not directly.
// { dg-final { scan-assembler-not "_ZSt9terminatev" } }
struct A
{
A() { }
A (const A&) { throw 1; }
};
int main()
{
try
{
throw A();
}
catch (A) { }
}