Introduce no_profile_instrument_function attribute
authorMartin Liska <mliska@suse.cz>
Thu, 28 Jul 2016 08:45:29 +0000 (10:45 +0200)
committerMartin Liska <marxin@gcc.gnu.org>
Thu, 28 Jul 2016 08:45:29 +0000 (08:45 +0000)
PR gcov-profile/68025
* tree-profile.c (tree_profiling): Respect
no_profile_instrument_function attribute.
* doc/extend.texi: Document no_profile_instrument_function
attribute.
PR gcov-profile/68025
* c-common.c (handle_no_profile_instrument_function_attribute):
PR gcov-profile/68025
* gcc.dg/no_profile_instrument_function-attr-1.c: New test.

From-SVN: r238811

gcc/ChangeLog
gcc/c-family/ChangeLog
gcc/c-family/c-common.c
gcc/doc/extend.texi
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/no_profile_instrument_function-attr-1.c [new file with mode: 0644]
gcc/tree-profile.c

index 919f3f8bacb419eebaab2b0fae14027b362b6468..7e3ac320cf0e44830fd313191560b40e079bc67b 100644 (file)
@@ -1,3 +1,11 @@
+2016-07-28  Martin Liska  <mliska@suse.cz>
+
+       PR gcov-profile/68025
+       * tree-profile.c (tree_profiling): Respect
+       no_profile_instrument_function attribute.
+       * doc/extend.texi: Document no_profile_instrument_function
+       attribute.
+
 2016-07-28  Martin Liska  <mliska@suse.cz>
 
        PR rtl-optimization/70944
index 34c65ecc7f8ecee22092070aeb849fca34cd765a..10073406963852313bf71a8eb3f8c88405992873 100644 (file)
@@ -1,3 +1,8 @@
+2016-07-28  Martin Liska  <mliska@suse.cz>
+
+       PR gcov-profile/68025
+       * c-common.c (handle_no_profile_instrument_function_attribute):
+
 2016-07-27  Bernd Edlinger  <bernd.edlinger@hotmail.de>
 
        * c-common.c (check_user_alignment): Use LOG2_BITS_PER_UNIT instead of
index 38a7b2e383dd55b137286d341459893a046f1dd5..16e3965cbd00c4d50d472b17d16d6f16eb0d0ccb 100644 (file)
@@ -353,6 +353,8 @@ static tree handle_tls_model_attribute (tree *, tree, tree, int,
                                        bool *);
 static tree handle_no_instrument_function_attribute (tree *, tree,
                                                     tree, int, bool *);
+static tree handle_no_profile_instrument_function_attribute (tree *, tree,
+                                                            tree, int, bool *);
 static tree handle_malloc_attribute (tree *, tree, tree, int, bool *);
 static tree handle_returns_twice_attribute (tree *, tree, tree, int, bool *);
 static tree handle_no_limit_stack_attribute (tree *, tree, tree, int,
@@ -717,6 +719,9 @@ const struct attribute_spec c_common_attribute_table[] =
   { "no_instrument_function", 0, 0, true,  false, false,
                              handle_no_instrument_function_attribute,
                              false },
+  { "no_profile_instrument_function",  0, 0, true, false, false,
+                             handle_no_profile_instrument_function_attribute,
+                             false },
   { "malloc",                 0, 0, true,  false, false,
                              handle_malloc_attribute, false },
   { "returns_twice",          0, 0, true,  false, false,
@@ -8293,6 +8298,22 @@ handle_no_instrument_function_attribute (tree *node, tree name,
   return NULL_TREE;
 }
 
+/* Handle a "no_profile_instrument_function" attribute; arguments as in
+   struct attribute_spec.handler.  */
+
+static tree
+handle_no_profile_instrument_function_attribute (tree *node, tree name, tree,
+                                                int, 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 "malloc" attribute; arguments as in
    struct attribute_spec.handler.  */
 
index ad8898c44853fbdc4cd5eaa4292beba73f90777e..70636c1bf4fe615d07c4d0e8c5fe3a20212a0512 100644 (file)
@@ -2853,6 +2853,12 @@ If @option{-finstrument-functions} is given, profiling function calls are
 generated at entry and exit of most user-compiled functions.
 Functions with this attribute are not so instrumented.
 
+@item no_profile_instrument_function
+@cindex @code{no_profile_instrument_function} function attribute
+The @code{no_profile_instrument_function} attribute on functions is used
+to inform the compiler that it should not process any profile feedback based
+optimization code instrumentation.
+
 @item no_reorder
 @cindex @code{no_reorder} function attribute
 Do not reorder functions or variables marked @code{no_reorder}
index 4becb4afcd1470ef8df2c9de42a90a5cbc3393ca..6123f100dad317ff05b1d6fedb4a9c3249f6086e 100644 (file)
@@ -1,3 +1,8 @@
+2016-07-28  Martin Liska  <mliska@suse.cz>
+
+       PR gcov-profile/68025
+       * gcc.dg/no_profile_instrument_function-attr-1.c: New test.
+
 2016-07-28  Martin Liska  <mliska@suse.cz>
 
        * g++.dg/vect/pr70944.cc: New test.
diff --git a/gcc/testsuite/gcc.dg/no_profile_instrument_function-attr-1.c b/gcc/testsuite/gcc.dg/no_profile_instrument_function-attr-1.c
new file mode 100644 (file)
index 0000000..c93d171
--- /dev/null
@@ -0,0 +1,23 @@
+/* { dg-options "-O2 -fprofile-generate -fdump-tree-optimized" } */
+
+__attribute__ ((no_profile_instrument_function))
+int foo()
+{
+  return 0;
+}
+
+__attribute__ ((no_profile_instrument_function))
+int bar()
+{
+  return 1;
+}
+
+int main ()
+{
+  return foo ();
+}
+
+/* { dg-final { scan-tree-dump-times "__gcov0\\.main.* = PROF_edge_counter" 1 "optimized"} } */
+/* { dg-final { scan-tree-dump-times "__gcov_indirect_call_profiler_v2" 1 "optimized" } } */
+/* { dg-final { scan-tree-dump-times "__gcov_time_profiler" 1 "optimized" } } */
+/* { dg-final { scan-tree-dump-times "__gcov_init" 1 "optimized" } } */
index 1f3a726988ac0ba7f7b6bdca733067c833e61cdb..39fe15fae9bba12d5d9bbe251ef4f5a8fe20adbd 100644 (file)
@@ -524,6 +524,9 @@ tree_profiling (void)
       if (DECL_SOURCE_LOCATION (node->decl) == BUILTINS_LOCATION)
        continue;
 
+      if (lookup_attribute ("no_profile_instrument_function",
+                           DECL_ATTRIBUTES (node->decl)))
+       continue;
       /* Do not instrument extern inline functions when testing coverage.
         While this is not perfectly consistent (early inlined extern inlines
         will get acocunted), testsuite expects that.  */