Hi!

If we need to use thunks for ICF to functions with warning or error
attribute, their expansion will warn or error.  This patch just punts
in those cases instead.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2018-03-02  Jakub Jelinek  <ja...@redhat.com>

        PR ipa/84628
        * ipa-icf.c (sem_function::merge): Don't create wrappers for
        functions with warning or error attributes.

        * gcc.dg/pr84628.c: New test.

--- gcc/ipa-icf.c.jj    2018-01-04 12:37:25.365487352 +0100
+++ gcc/ipa-icf.c       2018-03-01 11:48:54.023107823 +0100
@@ -1213,6 +1213,15 @@ sem_function::merge (sem_item *alias_ite
          if (dump_file)
            fprintf (dump_file, "Wrappers are not created for noinline.\n");
        }
+      /* Calls in the thunks would warn or error if we create a wrapper
+        for functions with warning or error attribute.  */
+      else if (lookup_attribute ("warning", DECL_ATTRIBUTES (original->decl))
+              || lookup_attribute ("error", DECL_ATTRIBUTES (original->decl)))
+       {
+         if (dump_file)
+           fprintf (dump_file, "Wrappers are not created for error/warning "
+                               "attribute.\n");
+       }
       else
         create_wrapper = true;
 
--- gcc/testsuite/gcc.dg/pr84628.c.jj   2018-03-01 11:30:39.121021498 +0100
+++ gcc/testsuite/gcc.dg/pr84628.c      2018-03-01 11:28:41.383127588 +0100
@@ -0,0 +1,8 @@
+/* PR ipa/84628 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+int f0 (void);
+__attribute__((error ("err"))) void f1 (void) { f0 (); f0 (); }
+__attribute__((error ("err"))) void f2 (void) { f0 (); f0 (); }
+/* { dg-bogus "declared with attribute error" "" { target *-*-* } 0 } */

        Jakub

Reply via email to