* [PATCH v3] gcov: Add TARGET_GCOV_TYPE_SIZE target macro
@ 2021-08-11 6:58 Sebastian Huber
2021-08-11 16:11 ` Joseph Myers
0 siblings, 1 reply; 2+ messages in thread
From: Sebastian Huber @ 2021-08-11 6:58 UTC (permalink / raw)
To: gcc-patches; +Cc: Martin Liška, Joseph Myers
If -fprofile-update=atomic is used, then the target must provide atomic
operations for the counters of the type returned by get_gcov_type().
This is a 64-bit type for targets which have a 64-bit long long type.
On 32-bit targets this could be an issue since they may not provide
64-bit atomic operations. Allow targets to override the default type
size with the new TARGET_GCOV_TYPE_SIZE target macro.
If a 32-bit gcov type size is used, then there is currently a warning in
libgcov-driver.c in a dead code block due to
sizeof (counter) == sizeof (gcov_unsigned_t):
libgcc/libgcov-driver.c: In function 'dump_counter':
libgcc/libgcov-driver.c:401:46: warning: right shift count >= width of type [-Wshift-count-overflow]
401 | dump_unsigned ((gcov_unsigned_t)(counter >> 32), dump_fn, arg);
| ^~
gcc/
* c-family/c-cppbuiltin.c (c_cpp_builtins): Define
__LIBGCC_GCOV_TYPE_SIZE if flag_building_libgcc is true.
* config/sparc/rtemself.h (TARGET_GCOV_TYPE_SIZE): Redefine.
* coverage.c (get_gcov_type): Use targetm.gcov_type_size.
* doc/tm.texi (TARGET_GCOV_TYPE_SIZE): Add hook under "Misc".
* doc/tm.texi.in: Regenerate.
* target.def (gcov_type_size): New POD hook.
* tree-profile.c (gimple_gen_edge_profiler): Use precision of
gcov_type_node.
(gimple_gen_time_profiler): Likewise.
libgcc/
* libgcov.h (gcov_type): Define using __LIBGCC_GCOV_TYPE_SIZE.
(gcov_type_unsigned): Likewise.
---
gcc/c-family/c-cppbuiltin.c | 2 ++
gcc/config/sparc/rtemself.h | 3 +++
gcc/coverage.c | 3 +--
gcc/doc/tm.texi | 11 +++++++++++
gcc/doc/tm.texi.in | 2 ++
gcc/target.def | 12 ++++++++++++
gcc/tree-profile.c | 4 ++--
libgcc/libgcov.h | 6 +++---
8 files changed, 36 insertions(+), 7 deletions(-)
diff --git a/gcc/c-family/c-cppbuiltin.c b/gcc/c-family/c-cppbuiltin.c
index f79f939bd10f..e85b60c79f49 100644
--- a/gcc/c-family/c-cppbuiltin.c
+++ b/gcc/c-family/c-cppbuiltin.c
@@ -1450,6 +1450,8 @@ c_cpp_builtins (cpp_reader *pfile)
/* For libgcov. */
builtin_define_with_int_value ("__LIBGCC_VTABLE_USES_DESCRIPTORS__",
TARGET_VTABLE_USES_DESCRIPTORS);
+ builtin_define_with_int_value ("__LIBGCC_GCOV_TYPE_SIZE",
+ TARGET_GCOV_TYPE_SIZE);
}
/* For use in assembly language. */
diff --git a/gcc/config/sparc/rtemself.h b/gcc/config/sparc/rtemself.h
index fa972af640cc..87a3ceb640c0 100644
--- a/gcc/config/sparc/rtemself.h
+++ b/gcc/config/sparc/rtemself.h
@@ -40,3 +40,6 @@
/* Use the default */
#undef LINK_GCC_C_SEQUENCE_SPEC
+
+#undef TARGET_GCOV_TYPE_SIZE
+#define TARGET_GCOV_TYPE_SIZE 32
diff --git a/gcc/coverage.c b/gcc/coverage.c
index ac9a9fdad228..6166247ad179 100644
--- a/gcc/coverage.c
+++ b/gcc/coverage.c
@@ -145,8 +145,7 @@ static void coverage_obj_finish (vec<constructor_elt, va_gc> *);
tree
get_gcov_type (void)
{
- scalar_int_mode mode
- = smallest_int_mode_for_size (LONG_LONG_TYPE_SIZE > 32 ? 64 : 32);
+ scalar_int_mode mode = smallest_int_mode_for_size (targetm.gcov_type_size);
return lang_hooks.types.type_for_mode (mode, false);
}
diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index a30fdcbbf3d6..429e7edf0e9d 100644
--- a/gcc/doc/tm.texi
+++ b/gcc/doc/tm.texi
@@ -12588,3 +12588,14 @@ Return an RTX representing @var{tagged_pointer} with its tag set to zero.
Store the result in @var{target} if convenient.
The default clears the top byte of the original pointer.
@end deftypefn
+
+@deftypevr {Target Hook} HOST_WIDE_INT TARGET_GCOV_TYPE_SIZE
+The gcov type size in bits. This type is used for example for counters
+incremented by profiling and code-coverage events. The default value is 64,
+if the type size of long long is greater than 32, otherwise the default
+value is 32. A 64-bit type is recommended to avoid overflows of the
+counters. If the @option{-fprofile-update=atomic} is used, then the
+counters are incremented using atomic operations. Targets not supporting
+64-bit atomic operations may override the default value and request a 32-bit
+type.
+@end deftypevr
diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in
index 611fc500ac86..fdf16b901c53 100644
--- a/gcc/doc/tm.texi.in
+++ b/gcc/doc/tm.texi.in
@@ -8180,3 +8180,5 @@ maintainer is familiar with.
@hook TARGET_MEMTAG_EXTRACT_TAG
@hook TARGET_MEMTAG_UNTAGGED_POINTER
+
+@hook TARGET_GCOV_TYPE_SIZE
diff --git a/gcc/target.def b/gcc/target.def
index 7676d5e626e3..b94c2c40dcf1 100644
--- a/gcc/target.def
+++ b/gcc/target.def
@@ -7104,6 +7104,18 @@ DEFHOOK
void, (void),
NULL)
+DEFHOOKPOD
+(gcov_type_size,
+ "The gcov type size in bits. This type is used for example for counters\n\
+incremented by profiling and code-coverage events. The default value is 64,\n\
+if the type size of long long is greater than 32, otherwise the default\n\
+value is 32. A 64-bit type is recommended to avoid overflows of the\n\
+counters. If the @option{-fprofile-update=atomic} is used, then the\n\
+counters are incremented using atomic operations. Targets not supporting\n\
+64-bit atomic operations may override the default value and request a 32-bit\n\
+type.",
+ HOST_WIDE_INT, (LONG_LONG_TYPE_SIZE > 32 ? 64 : 32))
+
/* Close the 'struct gcc_target' definition. */
HOOK_VECTOR_END (C90_EMPTY_HACK)
diff --git a/gcc/tree-profile.c b/gcc/tree-profile.c
index 5a74cc96e132..cf46912631cb 100644
--- a/gcc/tree-profile.c
+++ b/gcc/tree-profile.c
@@ -250,7 +250,7 @@ gimple_gen_edge_profiler (int edgeno, edge e)
{
/* __atomic_fetch_add (&counter, 1, MEMMODEL_RELAXED); */
tree addr = tree_coverage_counter_addr (GCOV_COUNTER_ARCS, edgeno);
- tree f = builtin_decl_explicit (LONG_LONG_TYPE_SIZE > 32
+ tree f = builtin_decl_explicit (TYPE_PRECISION (gcov_type_node) > 32
? BUILT_IN_ATOMIC_FETCH_ADD_8:
BUILT_IN_ATOMIC_FETCH_ADD_4);
gcall *stmt = gimple_build_call (f, 3, addr, one,
@@ -525,7 +525,7 @@ gimple_gen_time_profiler (unsigned tag)
tree_time_profiler_counter);
gassign *assign = gimple_build_assign (ptr, NOP_EXPR, addr);
gsi_insert_before (&gsi, assign, GSI_NEW_STMT);
- tree f = builtin_decl_explicit (LONG_LONG_TYPE_SIZE > 32
+ tree f = builtin_decl_explicit (TYPE_PRECISION (gcov_type_node) > 32
? BUILT_IN_ATOMIC_ADD_FETCH_8:
BUILT_IN_ATOMIC_ADD_FETCH_4);
gcall *stmt = gimple_build_call (f, 3, ptr, one,
diff --git a/libgcc/libgcov.h b/libgcc/libgcov.h
index 9c537253293f..f6354a7a0705 100644
--- a/libgcc/libgcov.h
+++ b/libgcc/libgcov.h
@@ -52,7 +52,7 @@
#if __CHAR_BIT__ == 8
typedef unsigned gcov_unsigned_t __attribute__ ((mode (SI)));
typedef unsigned gcov_position_t __attribute__ ((mode (SI)));
-#if LONG_LONG_TYPE_SIZE > 32
+#if __LIBGCC_GCOV_TYPE_SIZE > 32
typedef signed gcov_type __attribute__ ((mode (DI)));
typedef unsigned gcov_type_unsigned __attribute__ ((mode (DI)));
#else
@@ -63,7 +63,7 @@ typedef unsigned gcov_type_unsigned __attribute__ ((mode (SI)));
#if __CHAR_BIT__ == 16
typedef unsigned gcov_unsigned_t __attribute__ ((mode (HI)));
typedef unsigned gcov_position_t __attribute__ ((mode (HI)));
-#if LONG_LONG_TYPE_SIZE > 32
+#if __LIBGCC_GCOV_TYPE_SIZE > 32
typedef signed gcov_type __attribute__ ((mode (SI)));
typedef unsigned gcov_type_unsigned __attribute__ ((mode (SI)));
#else
@@ -73,7 +73,7 @@ typedef unsigned gcov_type_unsigned __attribute__ ((mode (HI)));
#else
typedef unsigned gcov_unsigned_t __attribute__ ((mode (QI)));
typedef unsigned gcov_position_t __attribute__ ((mode (QI)));
-#if LONG_LONG_TYPE_SIZE > 32
+#if __LIBGCC_GCOV_TYPE_SIZE > 32
typedef signed gcov_type __attribute__ ((mode (HI)));
typedef unsigned gcov_type_unsigned __attribute__ ((mode (HI)));
#else
--
2.26.2
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH v3] gcov: Add TARGET_GCOV_TYPE_SIZE target macro
2021-08-11 6:58 [PATCH v3] gcov: Add TARGET_GCOV_TYPE_SIZE target macro Sebastian Huber
@ 2021-08-11 16:11 ` Joseph Myers
0 siblings, 0 replies; 2+ messages in thread
From: Joseph Myers @ 2021-08-11 16:11 UTC (permalink / raw)
To: Sebastian Huber; +Cc: gcc-patches
On Wed, 11 Aug 2021, Sebastian Huber wrote:
> 64-bit atomic operations. Allow targets to override the default type
> size with the new TARGET_GCOV_TYPE_SIZE target macro.
Hook, not macro.
> diff --git a/gcc/c-family/c-cppbuiltin.c b/gcc/c-family/c-cppbuiltin.c
> index f79f939bd10f..e85b60c79f49 100644
> --- a/gcc/c-family/c-cppbuiltin.c
> +++ b/gcc/c-family/c-cppbuiltin.c
> @@ -1450,6 +1450,8 @@ c_cpp_builtins (cpp_reader *pfile)
> /* For libgcov. */
> builtin_define_with_int_value ("__LIBGCC_VTABLE_USES_DESCRIPTORS__",
> TARGET_VTABLE_USES_DESCRIPTORS);
> + builtin_define_with_int_value ("__LIBGCC_GCOV_TYPE_SIZE",
> + TARGET_GCOV_TYPE_SIZE);
The TARGET_* macros used to initialize targetm may only be defined to
their final values in the architecture-specific .c file that actually
defines targetm. All other files should access the hook via targetm, not
the TARGET_* macros. (TARGET_VTABLE_USES_DESCRIPTORS in the diff context
is a target macro, not a hook at all.)
> +DEFHOOKPOD
> +(gcov_type_size,
> + "The gcov type size in bits. This type is used for example for counters\n\
> +incremented by profiling and code-coverage events. The default value is 64,\n\
> +if the type size of long long is greater than 32, otherwise the default\n\
> +value is 32. A 64-bit type is recommended to avoid overflows of the\n\
> +counters. If the @option{-fprofile-update=atomic} is used, then the\n\
> +counters are incremented using atomic operations. Targets not supporting\n\
> +64-bit atomic operations may override the default value and request a 32-bit\n\
> +type.",
> + HOST_WIDE_INT, (LONG_LONG_TYPE_SIZE > 32 ? 64 : 32))
LONG_LONG_TYPE_SIZE may depend on command-line options passed to the
compiler (it does for AVR). The hook thus needs to be a function
returning the desired size.
--
Joseph S. Myers
joseph@codesourcery.com
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2021-08-11 16:11 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-08-11 6:58 [PATCH v3] gcov: Add TARGET_GCOV_TYPE_SIZE target macro Sebastian Huber
2021-08-11 16:11 ` Joseph Myers
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).