Skip static ctors/dtors in IPA ICF (PR ipa/70306)
authorMartin Liska <mliska@suse.cz>
Mon, 21 Mar 2016 19:33:33 +0000 (20:33 +0100)
committerMartin Liska <marxin@gcc.gnu.org>
Mon, 21 Mar 2016 19:33:33 +0000 (19:33 +0000)
* gcc.dg/ipa/pr70306.c: New test.
* ipa-icf.c (sem_function::parse): Skip static
constructors and destructors.

From-SVN: r234378

gcc/ChangeLog
gcc/ipa-icf.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/ipa/pr70306.c [new file with mode: 0644]

index 0bc45fd34e140e27bc2bf331b5431ee718b19836..cd1e678e39dae2d21fe7b01e411736edb4936a07 100644 (file)
@@ -1,3 +1,8 @@
+2016-03-21  Martin Liska  <mliska@suse.cz>
+
+       * ipa-icf.c (sem_function::parse): Skip static
+       constructors and destructors.
+
 2016-03-21  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/70296
index d82eb879d05aac159d2bccfd2b2cc06eeb038d8a..aa6589c16e1ae284914e6a7a61ab6cd14b406bd4 100644 (file)
@@ -1697,6 +1697,11 @@ sem_function::parse (cgraph_node *node, bitmap_obstack *stack)
   if (lookup_attribute_by_prefix ("omp ", DECL_ATTRIBUTES (node->decl)) != NULL)
     return NULL;
 
+  /* PR ipa/70306.  */
+  if (DECL_STATIC_CONSTRUCTOR (node->decl)
+      || DECL_STATIC_DESTRUCTOR (node->decl))
+    return NULL;
+
   sem_function *f = new sem_function (node, 0, stack);
 
   f->init ();
index 9bb36d3dcc45e7159638239277ca3eddbc3fe4b0..f572c9dd12f5ed20c917435be8b7fde1e7daec5f 100644 (file)
@@ -1,3 +1,7 @@
+2016-03-21  Martin Liska  <mliska@suse.cz>
+
+       * gcc.dg/ipa/pr70306.c: New test.
+
 2016-03-21  Andre Vieira  <andre.simoesdiasvieira@arm>
 
        * gcc.target/arm/attr-align1.c: Skip if M-profile.
diff --git a/gcc/testsuite/gcc.dg/ipa/pr70306.c b/gcc/testsuite/gcc.dg/ipa/pr70306.c
new file mode 100644 (file)
index 0000000..be18208
--- /dev/null
@@ -0,0 +1,45 @@
+/* { dg-options "-O2 -fdump-ipa-icf" } */
+/* { dg-do run } */
+
+int ctor_counter = 1;
+int dtor_counter;
+
+__attribute__((constructor))
+void A()
+{
+  ctor_counter++;
+}
+
+__attribute__((destructor))
+void B()
+{
+  if (dtor_counter == 0)
+    __builtin_abort ();
+
+  dtor_counter--;
+}
+
+__attribute__((constructor))
+static void C() {
+    ctor_counter++;
+}
+
+__attribute__((destructor))
+static void D() {
+  if (dtor_counter == 0)
+    __builtin_abort ();
+
+  dtor_counter--;
+}
+
+int main()
+{
+    if (ctor_counter != 3)
+        __builtin_abort ();
+
+    dtor_counter = 2;
+
+    return 0;
+}
+
+/* { dg-final { scan-ipa-dump "Equal symbols: 0" "icf"  } } */