diff options
author | Martin Liska <mliska@suse.cz> | 2016-08-10 15:14:56 +0200 |
---|---|---|
committer | Martin Liska <marxin@gcc.gnu.org> | 2016-08-10 13:14:56 +0000 |
commit | a266236e856aec790b1757064eccff876fad4703 (patch) | |
tree | 4e0657ae5a14e0c48b2bae73db433a086900d985 /gcc/tree-profile.c | |
parent | 22063dbc90d0eb8a7cc7939e0941899f90b403db (diff) | |
download | gcc-a266236e856aec790b1757064eccff876fad4703.zip gcc-a266236e856aec790b1757064eccff876fad4703.tar.gz gcc-a266236e856aec790b1757064eccff876fad4703.tar.bz2 |
Add new *_atomic counter update function
PR gcov-profile/58306
* Makefile.in: New functions (modules) are added.
* libgcov-profiler.c (__gcov_interval_profiler_atomic): New
function.
(__gcov_pow2_profiler_atomic): New function.
(__gcov_one_value_profiler_body): New argument is instroduced.
(__gcov_one_value_profiler): Call with the new argument.
(__gcov_one_value_profiler_atomic): Likewise.
(__gcov_indirect_call_profiler_v2): Likewise.
(__gcov_time_profiler_atomic): New function.
(__gcov_average_profiler_atomic): Likewise.
(__gcov_ior_profiler_atomic): Likewise.
* libgcov.h: Declare the aforementioned functions.
PR gcov-profile/58306
* gcc.dg/tree-prof/val-profiler-threads-1.c: New test.
PR gcov-profile/58306
* tree-profile.c (gimple_init_edge_profiler): Create conditionally
atomic variants of profile update functions.
From-SVN: r239324
Diffstat (limited to 'gcc/tree-profile.c')
-rw-r--r-- | gcc/tree-profile.c | 42 |
1 files changed, 25 insertions, 17 deletions
diff --git a/gcc/tree-profile.c b/gcc/tree-profile.c index 740f7ab..fdf0201 100644 --- a/gcc/tree-profile.c +++ b/gcc/tree-profile.c @@ -128,9 +128,13 @@ gimple_init_edge_profiler (void) tree average_profiler_fn_type; tree time_profiler_fn_type; const char *profiler_fn_name; + const char *fn_name; if (!gcov_type_node) { + const char *fn_suffix + = flag_profile_update == PROFILE_UPDATE_ATOMIC ? "_atomic" : ""; + gcov_type_node = get_gcov_type (); gcov_type_ptr = build_pointer_type (gcov_type_node); @@ -140,9 +144,10 @@ gimple_init_edge_profiler (void) gcov_type_ptr, gcov_type_node, integer_type_node, unsigned_type_node, NULL_TREE); - tree_interval_profiler_fn - = build_fn_decl ("__gcov_interval_profiler", - interval_profiler_fn_type); + fn_name = concat ("__gcov_interval_profiler", fn_suffix, NULL); + tree_interval_profiler_fn = build_fn_decl (fn_name, + interval_profiler_fn_type); + free (CONST_CAST (char *, fn_name)); TREE_NOTHROW (tree_interval_profiler_fn) = 1; DECL_ATTRIBUTES (tree_interval_profiler_fn) = tree_cons (get_identifier ("leaf"), NULL, @@ -153,8 +158,9 @@ gimple_init_edge_profiler (void) = build_function_type_list (void_type_node, gcov_type_ptr, gcov_type_node, NULL_TREE); - tree_pow2_profiler_fn = build_fn_decl ("__gcov_pow2_profiler", - pow2_profiler_fn_type); + fn_name = concat ("__gcov_pow2_profiler", fn_suffix, NULL); + tree_pow2_profiler_fn = build_fn_decl (fn_name, pow2_profiler_fn_type); + free (CONST_CAST (char *, fn_name)); TREE_NOTHROW (tree_pow2_profiler_fn) = 1; DECL_ATTRIBUTES (tree_pow2_profiler_fn) = tree_cons (get_identifier ("leaf"), NULL, @@ -165,9 +171,10 @@ gimple_init_edge_profiler (void) = build_function_type_list (void_type_node, gcov_type_ptr, gcov_type_node, NULL_TREE); - tree_one_value_profiler_fn - = build_fn_decl ("__gcov_one_value_profiler", - one_value_profiler_fn_type); + fn_name = concat ("__gcov_one_value_profiler", fn_suffix, NULL); + tree_one_value_profiler_fn = build_fn_decl (fn_name, + one_value_profiler_fn_type); + free (CONST_CAST (char *, fn_name)); TREE_NOTHROW (tree_one_value_profiler_fn) = 1; DECL_ATTRIBUTES (tree_one_value_profiler_fn) = tree_cons (get_identifier ("leaf"), NULL, @@ -197,9 +204,9 @@ gimple_init_edge_profiler (void) time_profiler_fn_type = build_function_type_list (void_type_node, gcov_type_ptr, NULL_TREE); - tree_time_profiler_fn - = build_fn_decl ("__gcov_time_profiler", - time_profiler_fn_type); + fn_name = concat ("__gcov_time_profiler", fn_suffix, NULL); + tree_time_profiler_fn = build_fn_decl (fn_name, time_profiler_fn_type); + free (CONST_CAST (char *, fn_name)); TREE_NOTHROW (tree_time_profiler_fn) = 1; DECL_ATTRIBUTES (tree_time_profiler_fn) = tree_cons (get_identifier ("leaf"), NULL, @@ -209,16 +216,17 @@ gimple_init_edge_profiler (void) average_profiler_fn_type = build_function_type_list (void_type_node, gcov_type_ptr, gcov_type_node, NULL_TREE); - tree_average_profiler_fn - = build_fn_decl ("__gcov_average_profiler", - average_profiler_fn_type); + fn_name = concat ("__gcov_average_profiler", fn_suffix, NULL); + tree_average_profiler_fn = build_fn_decl (fn_name, + average_profiler_fn_type); + free (CONST_CAST (char *, fn_name)); TREE_NOTHROW (tree_average_profiler_fn) = 1; DECL_ATTRIBUTES (tree_average_profiler_fn) = tree_cons (get_identifier ("leaf"), NULL, DECL_ATTRIBUTES (tree_average_profiler_fn)); - tree_ior_profiler_fn - = build_fn_decl ("__gcov_ior_profiler", - average_profiler_fn_type); + fn_name = concat ("__gcov_ior_profiler", fn_suffix, NULL); + tree_ior_profiler_fn = build_fn_decl (fn_name, average_profiler_fn_type); + free (CONST_CAST (char *, fn_name)); TREE_NOTHROW (tree_ior_profiler_fn) = 1; DECL_ATTRIBUTES (tree_ior_profiler_fn) = tree_cons (get_identifier ("leaf"), NULL, |