aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Jambor <mjambor@suse.cz>2013-08-06 14:48:53 +0200
committerMartin Jambor <jamborm@gcc.gnu.org>2013-08-06 14:48:53 +0200
commit15682f2418221ee45ebf9fd2c4803fb179060c42 (patch)
tree54d423cab2471b50ef6202932602d8e48f3f22b2
parent6ffd1096cf7620eea04f99693c32601e9312cd8c (diff)
downloadgcc-15682f2418221ee45ebf9fd2c4803fb179060c42.zip
gcc-15682f2418221ee45ebf9fd2c4803fb179060c42.tar.gz
gcc-15682f2418221ee45ebf9fd2c4803fb179060c42.tar.bz2
re PR fortran/57987 (Fortran finalizers considered extern-inline by middle-end)
2013-08-06 Martin Jambor <mjambor@suse.cz> PR fortran/57987 * cgraphunit.c (cgraph_finalize_function): Assert that nested function is not re-finalized. Rename second parameter to no_collect. fortran/ * trans-decl.c (gfc_generate_function_code): Never call cgraph_finalize_function on nested functions. testsuite/ * gfortran.dg/pr57987.f90: New test. From-SVN: r201526
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/cgraphunit.c9
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/trans-decl.c18
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/pr57987.f9024
6 files changed, 57 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6274c8b..a28af11 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2013-08-06 Martin Jambor <mjambor@suse.cz>
+ PR fortran/57987
+ * cgraphunit.c (cgraph_finalize_function): Assert that nested function
+ is not re-finalized. Rename second parameter to no_collect.
+
+2013-08-06 Martin Jambor <mjambor@suse.cz>
+
PR middle-end/58041
* gimple-ssa-strength-reduction.c (replace_ref): Make sure built
MEM_REF has proper alignment information.
diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
index ad91117..cf92b1d 100644
--- a/gcc/cgraphunit.c
+++ b/gcc/cgraphunit.c
@@ -404,17 +404,20 @@ referred_to_p (symtab_node node)
}
/* DECL has been parsed. Take it, queue it, compile it at the whim of the
- logic in effect. If NESTED is true, then our caller cannot stand to have
+ logic in effect. If NO_COLLECT is true, then our caller cannot stand to have
the garbage collector run at the moment. We would need to either create
a new GC context, or just not compile right now. */
void
-cgraph_finalize_function (tree decl, bool nested)
+cgraph_finalize_function (tree decl, bool no_collect)
{
struct cgraph_node *node = cgraph_get_create_node (decl);
if (node->symbol.definition)
{
+ /* Nested functions should only be defined once. */
+ gcc_assert (!DECL_CONTEXT (decl)
+ || TREE_CODE (DECL_CONTEXT (decl)) != FUNCTION_DECL);
cgraph_reset_node (node);
node->local.redefined_extern_inline = true;
}
@@ -453,7 +456,7 @@ cgraph_finalize_function (tree decl, bool nested)
if (warn_unused_parameter)
do_warn_unused_parameter (decl);
- if (!nested)
+ if (!no_collect)
ggc_collect ();
if (cgraph_state == CGRAPH_STATE_CONSTRUCTION
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 7a9fe6e..bcd91a9 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2013-08-06 Martin Jambor <mjambor@suse.cz>
+
+ PR fortran/57987
+ * trans-decl.c (gfc_generate_function_code): Never call
+ cgraph_finalize_function on nested functions.
+
2013-08-06 Janus Weil <janus@gcc.gnu.org>
PR fortran/57306
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c
index 43f401d..1708931 100644
--- a/gcc/fortran/trans-decl.c
+++ b/gcc/fortran/trans-decl.c
@@ -5643,14 +5643,16 @@ gfc_generate_function_code (gfc_namespace * ns)
}
current_function_decl = old_context;
- if (decl_function_context (fndecl) && gfc_option.coarray != GFC_FCOARRAY_LIB
- && has_coarray_vars)
- /* Register this function with cgraph just far enough to get it
- added to our parent's nested function list.
- If there are static coarrays in this function, the nested _caf_init
- function has already called cgraph_create_node, which also created
- the cgraph node for this function. */
- (void) cgraph_create_node (fndecl);
+ if (decl_function_context (fndecl))
+ {
+ /* Register this function with cgraph just far enough to get it
+ added to our parent's nested function list.
+ If there are static coarrays in this function, the nested _caf_init
+ function has already called cgraph_create_node, which also created
+ the cgraph node for this function. */
+ if (!has_coarray_vars || gfc_option.coarray != GFC_FCOARRAY_LIB)
+ (void) cgraph_create_node (fndecl);
+ }
else
cgraph_finalize_function (fndecl, true);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 790c556..c81ec3f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2013-08-06 Martin Jambor <mjambor@suse.cz>
+ PR fortran/57987
+ * gfortran.dg/pr57987.f90: New test.
+
+2013-08-06 Martin Jambor <mjambor@suse.cz>
+
PR middle-end/58041
* gcc.dg/torture/pr58041.c: New test.
* gcc.target/arm/pr58041.c: Likewise.
diff --git a/gcc/testsuite/gfortran.dg/pr57987.f90 b/gcc/testsuite/gfortran.dg/pr57987.f90
new file mode 100644
index 0000000..c881e6d
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr57987.f90
@@ -0,0 +1,24 @@
+! { dg-do compile }
+! { dg-options "-O3 -fno-ipa-cp -fdump-ipa-inline" }
+
+program test
+ call test2 ()
+contains
+ subroutine test2 ()
+ type t
+ integer, allocatable :: x
+ end type t
+
+ type t2
+ class(t), allocatable :: a
+ end type t2
+
+ type(t2) :: one, two
+
+ allocate (two%a)
+ one = two
+ end subroutine test2
+end program test
+
+! { dg-final { scan-ipa-dump-not "redefined extern inline functions are not considered for inlining" "inline" } }
+! { dg-final { cleanup-ipa-dump "inline" } }