Introduce no_profile_instrument_function attribute

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
This commit is contained in:
Martin Liska 2016-07-28 10:45:29 +02:00 committed by Martin Liska
parent 9bd6a6aebf
commit 1225d6b113
7 changed files with 71 additions and 0 deletions

View 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> 2016-07-28 Martin Liska <mliska@suse.cz>
PR rtl-optimization/70944 PR rtl-optimization/70944

View 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> 2016-07-27 Bernd Edlinger <bernd.edlinger@hotmail.de>
* c-common.c (check_user_alignment): Use LOG2_BITS_PER_UNIT instead of * c-common.c (check_user_alignment): Use LOG2_BITS_PER_UNIT instead of

View File

@ -353,6 +353,8 @@ static tree handle_tls_model_attribute (tree *, tree, tree, int,
bool *); bool *);
static tree handle_no_instrument_function_attribute (tree *, tree, static tree handle_no_instrument_function_attribute (tree *, tree,
tree, int, bool *); 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_malloc_attribute (tree *, tree, tree, int, bool *);
static tree handle_returns_twice_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, 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, { "no_instrument_function", 0, 0, true, false, false,
handle_no_instrument_function_attribute, handle_no_instrument_function_attribute,
false }, false },
{ "no_profile_instrument_function", 0, 0, true, false, false,
handle_no_profile_instrument_function_attribute,
false },
{ "malloc", 0, 0, true, false, false, { "malloc", 0, 0, true, false, false,
handle_malloc_attribute, false }, handle_malloc_attribute, false },
{ "returns_twice", 0, 0, true, false, false, { "returns_twice", 0, 0, true, false, false,
@ -8293,6 +8298,22 @@ handle_no_instrument_function_attribute (tree *node, tree name,
return NULL_TREE; 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 /* Handle a "malloc" attribute; arguments as in
struct attribute_spec.handler. */ struct attribute_spec.handler. */

View 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. generated at entry and exit of most user-compiled functions.
Functions with this attribute are not so instrumented. 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 @item no_reorder
@cindex @code{no_reorder} function attribute @cindex @code{no_reorder} function attribute
Do not reorder functions or variables marked @code{no_reorder} Do not reorder functions or variables marked @code{no_reorder}

View 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> 2016-07-28 Martin Liska <mliska@suse.cz>
* g++.dg/vect/pr70944.cc: New test. * g++.dg/vect/pr70944.cc: New test.

View File

@ -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" } } */

View File

@ -524,6 +524,9 @@ tree_profiling (void)
if (DECL_SOURCE_LOCATION (node->decl) == BUILTINS_LOCATION) if (DECL_SOURCE_LOCATION (node->decl) == BUILTINS_LOCATION)
continue; continue;
if (lookup_attribute ("no_profile_instrument_function",
DECL_ATTRIBUTES (node->decl)))
continue;
/* Do not instrument extern inline functions when testing coverage. /* Do not instrument extern inline functions when testing coverage.
While this is not perfectly consistent (early inlined extern inlines While this is not perfectly consistent (early inlined extern inlines
will get acocunted), testsuite expects that. */ will get acocunted), testsuite expects that. */