Commit 786f715d by Jason Merrill Committed by Jason Merrill

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
parent 19fb0b86
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> 2010-05-14 Jan Hubicka <jh@suse.cz>
* ipa.c (enqueue_cgraph_node): Update comment; do not re-enqueue * ipa.c (enqueue_cgraph_node): Update comment; do not re-enqueue
......
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> 2010-05-14 Martin Jambor <mjambor@suse.cz>
* cp-lang.c (LANG_HOOKS_FOLD_OBJ_TYPE_REF): Remove both its undef * cp-lang.c (LANG_HOOKS_FOLD_OBJ_TYPE_REF): Remove both its undef
......
...@@ -480,11 +480,16 @@ gimplify_must_not_throw_expr (tree *expr_p, gimple_seq *pre_p) ...@@ -480,11 +480,16 @@ gimplify_must_not_throw_expr (tree *expr_p, gimple_seq *pre_p)
tree stmt = *expr_p; tree stmt = *expr_p;
tree temp = voidify_wrapper_expr (stmt, NULL); tree temp = voidify_wrapper_expr (stmt, NULL);
tree body = TREE_OPERAND (stmt, 0); 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, gimplify_and_add (body, &try_);
build_call_n (terminate_node, 0)); 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) if (temp)
{ {
*expr_p = temp; *expr_p = temp;
......
...@@ -636,7 +636,7 @@ gimple_build_eh_filter (tree types, gimple_seq failure) ...@@ -636,7 +636,7 @@ gimple_build_eh_filter (tree types, gimple_seq failure)
gimple gimple
gimple_build_eh_must_not_throw (tree decl) 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 (TREE_CODE (decl) == FUNCTION_DECL);
gcc_assert (flags_from_decl_or_type (decl) & ECF_NORETURN); gcc_assert (flags_from_decl_or_type (decl) & ECF_NORETURN);
......
...@@ -221,6 +221,13 @@ gimple_seq_empty_p (const_gimple_seq s) ...@@ -221,6 +221,13 @@ gimple_seq_empty_p (const_gimple_seq s)
void gimple_seq_add_stmt (gimple_seq *, gimple); 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. */ /* Allocate a new sequence and initialize its first element with STMT. */
static inline gimple_seq static inline gimple_seq
......
...@@ -158,7 +158,7 @@ gimple_tree_eq (const void *p1, const void *p2) ...@@ -158,7 +158,7 @@ gimple_tree_eq (const void *p1, const void *p2)
During gimplification, we need to manipulate statement sequences During gimplification, we need to manipulate statement sequences
before the def/use vectors have been constructed. */ before the def/use vectors have been constructed. */
static void void
gimplify_seq_add_stmt (gimple_seq *seq_p, gimple gs) gimplify_seq_add_stmt (gimple_seq *seq_p, gimple gs)
{ {
gimple_stmt_iterator si; gimple_stmt_iterator si;
......
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> 2010-05-14 Jakub Jelinek <jakub@redhat.com>
* gfortran.dg/gomp/pr44036-1.f90: Adjust. * gfortran.dg/gomp/pr44036-1.f90: Adjust.
......
// 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) { }
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment