From: Paul Brook Date: Mon, 31 Oct 2011 14:26:38 +0000 (+0000) Subject: cgraphunit.c: Don't mark clones as static constructors. X-Git-Tag: releases/gcc-4.7.0~2688 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2062f77b8b897691f102434aeec3253ad2ea28a5;p=thirdparty%2Fgcc.git cgraphunit.c: Don't mark clones as static constructors. 2011-10-31 Paul Brook gcc/ * cgraphunit.c: Don't mark clones as static constructors. gcc/testsuite/ * gcc.dg/constructor-1.c: New test. From-SVN: r180700 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 198c48862ffe..53f8878288d5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2011-10-31 Paul Brook + + * cgraphunit.c: Don't mark clones as static constructors. + 2011-10-31 David Edelsohn * gcc-ar: Do not include stdio.h. diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c index 25d7561cbdbf..83c47ab66fdf 100644 --- a/gcc/cgraphunit.c +++ b/gcc/cgraphunit.c @@ -2366,6 +2366,10 @@ cgraph_function_versioning (struct cgraph_node *old_version_node, SET_DECL_ASSEMBLER_NAME (new_decl, DECL_NAME (new_decl)); SET_DECL_RTL (new_decl, NULL); + /* When the old decl was a con-/destructor make sure the clone isn't. */ + DECL_STATIC_CONSTRUCTOR(new_decl) = 0; + DECL_STATIC_DESTRUCTOR(new_decl) = 0; + /* Create the new version's call-graph node. and update the edges of the new node. */ new_version_node = diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0828817cee53..a432ab851648 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2011-10-31 Paul Brook + + * gcc.dg/constructor-1.c: New test. + 2011-10-30 Steven G. Kargl PR fortran/50753 diff --git a/gcc/testsuite/gcc.dg/constructor-1.c b/gcc/testsuite/gcc.dg/constructor-1.c new file mode 100644 index 000000000000..1095a455cfa6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/constructor-1.c @@ -0,0 +1,37 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +/* The ipa-split pass pulls the body of the if(!x) block + into a separate function to make foo a better inlining + candidate. Make sure this new function isn't also run + as a static constructor. */ + +#include + +int x, y; + +void __attribute__((noinline)) +bar(void) +{ + y++; +} + +void __attribute__((constructor)) +foo(void) +{ + if (!x) + { + bar(); + y++; + } +} + +int main() +{ + x = 1; + foo(); + foo(); + if (y != 2) + abort(); + exit(0); +}