mirror of git://gcc.gnu.org/git/gcc.git
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:
parent
9bd6a6aebf
commit
1225d6b113
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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. */
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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}
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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" } } */
|
||||||
|
|
@ -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. */
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue