diff options
author | Jakub Jelinek <jakub@redhat.com> | 2010-01-07 16:10:26 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2010-01-07 16:10:26 +0100 |
commit | 4139c7ef40a6e43d53509b17d3397e94a7e20db2 (patch) | |
tree | bd1b5a39ccc8b70f0e46666012120ec53853f4ad | |
parent | 01094033c6b98cda7cbde9e78a2f949939435be5 (diff) | |
download | gcc-4139c7ef40a6e43d53509b17d3397e94a7e20db2.zip gcc-4139c7ef40a6e43d53509b17d3397e94a7e20db2.tar.gz gcc-4139c7ef40a6e43d53509b17d3397e94a7e20db2.tar.bz2 |
re PR tree-optimization/42625 (-fipa-sra can generate different destructors in different object files, binary breaks after linking)
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.
* g++.dg/opt/dtor4.C: New test.
* g++.dg/opt/dtor4.h: New.
* g++.dg/opt/dtor4-aux.cc: New.
From-SVN: r155694
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cgraph.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/dtor4-aux.cc | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/dtor4.C | 13 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/dtor4.h | 8 |
6 files changed, 51 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4bf1274..7762077 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-01-07 Jakub Jelinek <jakub@redhat.com> + + 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 <baldrick@free.fr> * Makefile.in (PLUGIN_HEADERS): Add version.h. diff --git a/gcc/cgraph.c b/gcc/cgraph.c index fc7ba1a..baaf601 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 459dde3..d68e6e9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2010-01-07 Jakub Jelinek <jakub@redhat.com> + + 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 <burnus@net-b.de> 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 0000000..e3ca43b --- /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 0000000..c58fadf --- /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 0000000..d3b43be --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/dtor4.h @@ -0,0 +1,8 @@ +#include <cassert> + +struct S +{ + int a, i; + S () : i(1) {} + __attribute__((noinline)) ~S () { assert (i == 1); } +}; |