OSDN Git Service

2011-10-31 Paul Brook <paul@codesourcery.com>
authorpbrook <pbrook@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 31 Oct 2011 14:26:38 +0000 (14:26 +0000)
committerpbrook <pbrook@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 31 Oct 2011 14:26:38 +0000 (14:26 +0000)
gcc/
* cgraphunit.c: Don't mark clones as static constructors.

gcc/testsuite/
* gcc.dg/constructor-1.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@180700 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/cgraphunit.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/constructor-1.c [new file with mode: 0644]

index 198c488..53f8878 100644 (file)
@@ -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.
index 25d7561..83c47ab 100644 (file)
@@ -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 =
index 0828817..a432ab8 100644 (file)
@@ -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 (file)
index 0000000..1095a45
--- /dev/null
@@ -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);
+}