aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Brook <paul@codesourcery.com>2011-10-31 14:26:38 +0000
committerPaul Brook <pbrook@gcc.gnu.org>2011-10-31 14:26:38 +0000
commit2062f77b8b897691f102434aeec3253ad2ea28a5 (patch)
tree42ff300848a41e6cdbc324d1a275461b455846f8
parent41bd49ea5fb7c089aa2def40e07c548af8a745e2 (diff)
downloadgcc-2062f77b8b897691f102434aeec3253ad2ea28a5.zip
gcc-2062f77b8b897691f102434aeec3253ad2ea28a5.tar.gz
gcc-2062f77b8b897691f102434aeec3253ad2ea28a5.tar.bz2
cgraphunit.c: Don't mark clones as static constructors.
2011-10-31 Paul Brook <paul@codesourcery.com> gcc/ * cgraphunit.c: Don't mark clones as static constructors. gcc/testsuite/ * gcc.dg/constructor-1.c: New test. From-SVN: r180700
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/cgraphunit.c4
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/constructor-1.c37
4 files changed, 49 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 198c48862..53f8878 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,7 @@
+2011-10-31 Paul Brook <paul@codesourcery.com>
+
+ * cgraphunit.c: Don't mark clones as static constructors.
+
2011-10-31 David Edelsohn <dje.gcc@gmail.com>
* gcc-ar: Do not include stdio.h.
diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
index 25d7561..83c47ab 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 0828817..a432ab8 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2011-10-31 Paul Brook <paul@codesourcery.com>
+
+ * gcc.dg/constructor-1.c: New test.
+
2011-10-30 Steven G. Kargl <kargl@gcc.gnu.org>
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 0000000..1095a45
--- /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 <stdlib.h>
+
+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);
+}