diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4bf1274a9435..77620771597b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-01-07 Jakub Jelinek + + PR tree-optimization/42625 + * cgraph.c (cgraph_make_node_local): Clear DECL_COMDAT*, + TREE_PUBLIC, DECL_WEAK and DECL_EXTERNAL also for same_body + aliases. + 2010-01-07 Duncan Sands * Makefile.in (PLUGIN_HEADERS): Add version.h. diff --git a/gcc/cgraph.c b/gcc/cgraph.c index fc7ba1a50bab..baaf601c9676 100644 --- a/gcc/cgraph.c +++ b/gcc/cgraph.c @@ -1,5 +1,5 @@ /* Callgraph handling code. - Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 + Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. Contributed by Jan Hubicka @@ -2197,11 +2197,20 @@ cgraph_make_node_local (struct cgraph_node *node) gcc_assert (cgraph_node_can_be_local_p (node)); if (DECL_COMDAT (node->decl) || DECL_EXTERNAL (node->decl)) { + struct cgraph_node *alias; DECL_COMDAT (node->decl) = 0; DECL_COMDAT_GROUP (node->decl) = 0; TREE_PUBLIC (node->decl) = 0; DECL_WEAK (node->decl) = 0; DECL_EXTERNAL (node->decl) = 0; + for (alias = node->same_body; alias; alias = alias->next) + { + DECL_COMDAT (alias->decl) = 0; + DECL_COMDAT_GROUP (alias->decl) = 0; + TREE_PUBLIC (alias->decl) = 0; + DECL_WEAK (alias->decl) = 0; + DECL_EXTERNAL (alias->decl) = 0; + } node->local.externally_visible = false; node->local.local = true; gcc_assert (cgraph_function_body_availability (node) == AVAIL_LOCAL); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 459dde397fff..d68e6e9fb100 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2010-01-07 Jakub Jelinek + + PR tree-optimization/42625 + * g++.dg/opt/dtor4.C: New test. + * g++.dg/opt/dtor4.h: New. + * g++.dg/opt/dtor4-aux.cc: New. + 2010-01-07 Tobias Burnus PR fortran/42597 diff --git a/gcc/testsuite/g++.dg/opt/dtor4-aux.cc b/gcc/testsuite/g++.dg/opt/dtor4-aux.cc new file mode 100644 index 000000000000..e3ca43b74306 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/dtor4-aux.cc @@ -0,0 +1,6 @@ +// { dg-do compile } +// { dg-options "" } + +#include "dtor4.h" + +S s; diff --git a/gcc/testsuite/g++.dg/opt/dtor4.C b/gcc/testsuite/g++.dg/opt/dtor4.C new file mode 100644 index 000000000000..c58fadfa18d2 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/dtor4.C @@ -0,0 +1,13 @@ +// PR tree-optimization/42625 +// { dg-do run } +// { dg-options "-O1 -fipa-sra" } +// { dg-additional-sources "dtor4-aux.cc" } + +#include "dtor4.h" + +int +main () +{ + S s; + return 0; +} diff --git a/gcc/testsuite/g++.dg/opt/dtor4.h b/gcc/testsuite/g++.dg/opt/dtor4.h new file mode 100644 index 000000000000..d3b43beabd7f --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/dtor4.h @@ -0,0 +1,8 @@ +#include + +struct S +{ + int a, i; + S () : i(1) {} + __attribute__((noinline)) ~S () { assert (i == 1); } +};