IPA ICF: add no_icf attribute.
authorMartin Liska <mliska@suse.cz>
Mon, 19 Jan 2015 15:20:16 +0000 (16:20 +0100)
committerMartin Liska <marxin@gcc.gnu.org>
Mon, 19 Jan 2015 15:20:16 +0000 (15:20 +0000)
* c-common.c (handle_noicf_attribute): New function.
* doc/extend.texi (no_icf): Add new attribute description.
* ipa-icf.c (sem_item_optimizer::merge_classes): Handle cases
where the pass attempts to merge a function with no_icf attribute.
* gcc.dg/ipa/ipa-icf-33.c: New test.

From-SVN: r219848

gcc/ChangeLog
gcc/c-family/ChangeLog
gcc/c-family/c-common.c
gcc/doc/extend.texi
gcc/ipa-icf.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/ipa/ipa-icf-33.c [new file with mode: 0644]

index 8a5a1de970bc073098e5c73e8682cbb1886fd98b..48341c53e1c4efaa3f1d5e62ebb2e18a3d34ac53 100644 (file)
@@ -1,3 +1,9 @@
+2015-01-19  Martin Liska  <mliska@suse.cz>
+
+       * doc/extend.texi (no_icf): Add new attribute description.
+       * ipa-icf.c (sem_item_optimizer::merge_classes): Handle cases
+       where the pass attempts to merge a function with no_icf attribute.
+
 2015-01-19  Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>
 
        PR target/64532
index e0ad21506adbd5d91493e1e01b315ad6f2c7c0a4..df56b3109921f602f600aa9bbf22b024831c1851 100644 (file)
@@ -1,3 +1,7 @@
+2015-01-19  Martin Liska  <mliska@suse.cz>
+
+       * c-common.c (handle_noicf_attribute): New function.
+
 2015-01-15  Thomas Schwinge  <thomas@codesourcery.com>
            Bernd Schmidt  <bernds@codesourcery.com>
            James Norris  <jnorris@codesourcery.com>
index eb132c537feed823f0013bda992b2cd539c2507b..3c18d1cc915689ac18dda4512f47d641cdf882ca 100644 (file)
@@ -330,6 +330,7 @@ static tree handle_no_sanitize_undefined_attribute (tree *, tree, tree, int,
 static tree handle_stack_protect_attribute (tree *, tree, tree, int, bool *);
 static tree handle_noinline_attribute (tree *, tree, tree, int, bool *);
 static tree handle_noclone_attribute (tree *, tree, tree, int, bool *);
+static tree handle_noicf_attribute (tree *, tree, tree, int, bool *);
 static tree handle_leaf_attribute (tree *, tree, tree, int, bool *);
 static tree handle_always_inline_attribute (tree *, tree, tree, int,
                                            bool *);
@@ -664,6 +665,8 @@ const struct attribute_spec c_common_attribute_table[] =
                              handle_noinline_attribute, false },
   { "noclone",                0, 0, true,  false, false,
                              handle_noclone_attribute, false },
+  { "no_icf",                 0, 0, true,  false, false,
+                             handle_noicf_attribute, false },
   { "leaf",                   0, 0, true,  false, false,
                              handle_leaf_attribute, false },
   { "always_inline",          0, 0, true,  false, false,
@@ -6853,6 +6856,24 @@ handle_noclone_attribute (tree *node, tree name,
   return NULL_TREE;
 }
 
+/* Handle a "no_icf" attribute; arguments as in
+   struct attribute_spec.handler.  */
+
+static tree
+handle_noicf_attribute (tree *node, tree name,
+                       tree ARG_UNUSED (args),
+                       int ARG_UNUSED (flags), bool *no_add_attrs)
+{
+  if (TREE_CODE (*node) != FUNCTION_DECL)
+    {
+      warning (OPT_Wattributes, "%qE attribute ignored", name);
+      *no_add_attrs = true;
+    }
+
+  return NULL_TREE;
+}
+
+
 /* Handle a "always_inline" attribute; arguments as in
    struct attribute_spec.handler.  */
 
index bf6d7102147deacff3ac0661aa9bba6d44396939..ba921e914bdbf729450e6006dd929e134c78c2a1 100644 (file)
@@ -2195,6 +2195,7 @@ attribute specification inside double parentheses.  The following
 attributes are currently defined for functions on all targets:
 @code{aligned}, @code{alloc_size}, @code{alloc_align}, @code{assume_aligned},
 @code{noreturn}, @code{returns_twice}, @code{noinline}, @code{noclone},
+@code{no_icf},
 @code{always_inline}, @code{flatten}, @code{pure}, @code{const},
 @code{nothrow}, @code{sentinel}, @code{format}, @code{format_arg},
 @code{no_instrument_function}, @code{no_split_stack},
@@ -3475,6 +3476,11 @@ cloning---a mechanism that produces specialized copies of functions
 and which is (currently) performed by interprocedural constant
 propagation.
 
+@item no_icf
+@cindex @code{no_icf} function attribute
+This function attribute prevents a functions from being merged with another
+semantically equivalent function.
+
 @item nonnull (@var{arg-index}, @dots{})
 @cindex @code{nonnull} function attribute
 The @code{nonnull} attribute specifies that some function parameters should
index 0ac01a9c3d065eb508f39fb7a3553f28468b9f51..a91fd98b807784d7449943f09c5419879e3a2a73 100644 (file)
@@ -2373,6 +2373,16 @@ sem_item_optimizer::merge_classes (unsigned int prev_class_count)
                         source->asm_name (), alias->asm_name ());
              }
 
+           if (lookup_attribute ("no_icf", DECL_ATTRIBUTES (alias->decl)))
+             {
+               if (dump_file)
+                 fprintf (dump_file,
+                          "Merge operation is skipped due to no_icf "
+                          "attribute.\n\n");
+
+               continue;
+             }
+
            if (dump_file && (dump_flags & TDF_DETAILS))
              {
                source->dump_to_file (dump_file);
index 8f6a88fd4187256579ab83051f6f45e904d41c13..fa357a3bc34a66e032173284fa0ecebde170ba83 100644 (file)
@@ -1,3 +1,7 @@
+2015-01-19  Martin Liska  <mliska@suse.cz>
+
+       * gcc.dg/ipa/ipa-icf-33.c: New test.
+
 2015-01-19  Felix Yang  <felix.yang@huawei.com>
            Haijian Zhang  <z.zhanghaijian@huawei.com>
 
diff --git a/gcc/testsuite/gcc.dg/ipa/ipa-icf-33.c b/gcc/testsuite/gcc.dg/ipa/ipa-icf-33.c
new file mode 100644 (file)
index 0000000..d7e814d
--- /dev/null
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-O0 -fipa-icf -fdump-ipa-icf"  } */
+
+#include <stdio.h>
+
+static int
+__attribute__ ((no_icf))
+foo()
+{
+  return 2;
+}
+
+static int
+__attribute__ ((no_icf))
+bar()
+{
+  return 2;
+}
+
+int main()
+{
+  return foo() - bar();
+}
+
+/* { dg-final { scan-ipa-dump "Equal symbols: 1" "icf"  } } */
+/* { dg-final { scan-ipa-dump "Equal symbols: 1" "icf"  } } */
+/* { dg-final { cleanup-ipa-dump "icf" } } */