On Mon, Aug 9, 2021 at 2:03 PM Sebastian Huber
<sebastian.hu...@embedded-brains.de> wrote:
>
>
>
> On 09/08/2021 13:27, Richard Biener wrote:
> >>> Can you not implement 64bit atomic support for 32bit SPARC somehow?
> >> The 32-bit SPARC/LEON3 has only a 32-bit compare and swap instruction
> >> (gcc/config/sparc/sync.md). I don't know how you could implement a
> >> 64-bit atomic support using this without spin locks (this is how
> >> libatomic support for RTEMS works).
> > I see.  Note the above get_gcov_type_could_  use a separate target macro
> > instead of LONG_LONG_TYPE_SIZE (GCOV_TYPE_SIZE?), that
> > way targets could opt to use a smaller counter.
>
> Ok, something like this?

Yeah, plus in defaults.h do

#ifndef GCOV_TYPE_SIZE
#define GCOV_TYPE_SIZE (LONG_LONG_TYPE_SIZE > 32 ? 64  : 32)
#endif

and then ...

> diff --git a/gcc/config/sparc/rtemself.h b/gcc/config/sparc/rtemself.h
> index fa972af640cc..ac4f70c48c43 100644
> --- a/gcc/config/sparc/rtemself.h
> +++ b/gcc/config/sparc/rtemself.h
> @@ -40,3 +40,5 @@
>
>   /* Use the default */
>   #undef LINK_GCC_C_SEQUENCE_SPEC
> +
> +#define GCOV_TYPE_SIZE 32
> diff --git a/gcc/coverage.c b/gcc/coverage.c
> index ac9a9fdad228..51297665e7f4 100644
> --- a/gcc/coverage.c
> +++ b/gcc/coverage.c
> @@ -146,7 +146,7 @@ tree
>   get_gcov_type (void)
>   {
>     scalar_int_mode mode
> -    = smallest_int_mode_for_size (LONG_LONG_TYPE_SIZE > 32 ? 64 : 32);
> +    = smallest_int_mode_for_size (GCOV_TYPE_SIZE > 32 ? 64 : 32);

just use

       smallest_int_mode_for_size (GCOV_TYPE_SIZE);

>     return lang_hooks.types.type_for_mode (mode, false);
>   }
>
> diff --git a/gcc/tree-profile.c b/gcc/tree-profile.c
> index 5a74cc96e132..b7f3f445d05b 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 (GCOV_TYPE_SIZE > 32
>                                        ? BUILT_IN_ATOMIC_FETCH_ADD_8:
>                                        BUILT_IN_ATOMIC_FETCH_ADD_4);

I think those uses should look at the actual gcov_type_node, not at the
target macro again.  So TYPE_PRECISION (gcov_type_node) > 32.

>         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 (GCOV_TYPE_SIZE > 32
>                                        ? BUILT_IN_ATOMIC_ADD_FETCH_8:
>                                        BUILT_IN_ATOMIC_ADD_FETCH_4);
>         gcall *stmt = gimple_build_call (f, 3, ptr, one,
>
> >
> > Note that it isn't currently feasible to for example use a 32bit gcov type
> > with =atomic but 64bit with =single since the "ABI" of the gcov data isn't
> > self-descriptive in this aspect.  But it should be possible to record the
> > counter size in the meta-data and keep the on-disk format use "big"
> > counters in theory.
>
> The on-disk format shouldn't be an issue since we have:
>
> /* Dump the COUNTER using the DUMP handler called with ARG.  */
>
> static inline void
> dump_counter (gcov_type counter,
>               void (*dump_fn) (const void *, unsigned, void *),
>               void *arg)
> {
>    dump_unsigned ((gcov_unsigned_t)counter, dump_fn, arg);
>
>    if (sizeof (counter) > sizeof (gcov_unsigned_t))
>      dump_unsigned ((gcov_unsigned_t)(counter >> 32), dump_fn, arg);
>    else
>      dump_unsigned (0, dump_fn, arg);
> }

I think that's debugging, relevant is probably
gcov-io.c:gcov_read_counter?  But I'm not too familiar with how the
bits of the gcov infrastructure play together.  gcov-io.h documents
the IO format to some extent.  It looks like there 'gcov_type' is
hard-wired to 64bits?

> >
> > But I guess using 32bit counters on sparc-rtems might be the way to
> > go ...
>
> Yes, you somehow just have to make sure that your test programs don't
> overflow the counters.

Right - thus in principle it would be "nice" to allow to alter this with
a command-line switch (even per TU in case 64bit is slow).

Richard.

> --
> embedded brains GmbH
> Herr Sebastian HUBER
> Dornierstr. 4
> 82178 Puchheim
> Germany
> email: sebastian.hu...@embedded-brains.de
> phone: +49-89-18 94 741 - 16
> fax:   +49-89-18 94 741 - 08
>
> Registergericht: Amtsgericht München
> Registernummer: HRB 157899
> Vertretungsberechtigte Geschäftsführer: Peter Rasmussen, Thomas Dörfler
> Unsere Datenschutzerklärung finden Sie hier:
> https://embedded-brains.de/datenschutzerklaerung/

Reply via email to