Skip to content
Snippets Groups Projects
  • Sebastian Huber's avatar
    8cdcea51
    gcov: Add TARGET_GCOV_TYPE_SIZE target hook · 8cdcea51
    Sebastian Huber authored
    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 hook.
    
    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.
    
    gcc/
    
    	* config/sparc/rtemself.h (SPARC_GCOV_TYPE_SIZE): Define.
    	* config/sparc/sparc.c (sparc_gcov_type_size): New.
    	(TARGET_GCOV_TYPE_SIZE): Redefine if SPARC_GCOV_TYPE_SIZE is defined.
    	* 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 target hook.
    	* targhooks.c (default_gcov_type_size): New.
    	* targhooks.h (default_gcov_type_size): Declare.
    	* 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.
    8cdcea51
    History
    gcov: Add TARGET_GCOV_TYPE_SIZE target hook
    Sebastian Huber authored
    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 hook.
    
    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.
    
    gcc/
    
    	* config/sparc/rtemself.h (SPARC_GCOV_TYPE_SIZE): Define.
    	* config/sparc/sparc.c (sparc_gcov_type_size): New.
    	(TARGET_GCOV_TYPE_SIZE): Redefine if SPARC_GCOV_TYPE_SIZE is defined.
    	* 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 target hook.
    	* targhooks.c (default_gcov_type_size): New.
    	* targhooks.h (default_gcov_type_size): Declare.
    	* 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.