Commit 1225d6b1 by Martin Liska Committed by Martin Liska

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
parent 9bd6a6ae
2016-07-28 Martin Liska <mliska@suse.cz> 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 PR rtl-optimization/70944
* combine.c (make_compound_operation): * combine.c (make_compound_operation):
Do not allow make_compound_operation for vector mode Do not allow make_compound_operation for vector mode
......
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
......
...@@ -353,6 +353,8 @@ static tree handle_tls_model_attribute (tree *, tree, tree, int, ...@@ -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[] = ...@@ -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, ...@@ -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. */
......
...@@ -2853,6 +2853,12 @@ If @option{-finstrument-functions} is given, profiling function calls are ...@@ -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}
......
2016-07-28 Martin Liska <mliska@suse.cz> 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. * g++.dg/vect/pr70944.cc: New test.
2016-07-28 Kugan Vivekanandarajah <kuganv@linaro.org> 2016-07-28 Kugan Vivekanandarajah <kuganv@linaro.org>
......
/* { 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" } } */
...@@ -524,6 +524,9 @@ tree_profiling (void) ...@@ -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. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment