[RFC] libgcov.c re-factoring and offline profile-tool
Xinliang David Li
Thu Jan 9 06:46:00 GMT 2014
On Wed, Jan 8, 2014 at 2:20 PM, Rong Xu <email@example.com> wrote:
> On Wed, Dec 18, 2013 at 9:28 AM, Xinliang David Li <firstname.lastname@example.org> wrote:
>>>> #ifdef L_gcov_merge_ior
>>>> /* The profile merging function that just adds the counters. It is given
>>>> - an array COUNTERS of N_COUNTERS old counters and it reads the same number
>>>> - of counters from the gcov file. */
>>>> + an array COUNTERS of N_COUNTERS old counters.
>>>> + When SRC==NULL, it reads the same number of counters from the gcov file.
>>>> + Otherwise, it reads from SRC array. */
>>>> -__gcov_merge_ior (gcov_type *counters, unsigned n_counters)
>>>> +__gcov_merge_ior (gcov_type *counters, unsigned n_counters,
>>>> + gcov_type *src, unsigned w __attribute__ ((unused)))
>>> So the new in-memory variants are introduced for merging tool, while libgcc use gcov_read_counter
>>> Perhaps we can actually just duplicate the functions to avoid runtime to do all the scalling
>>> and in_mem tests it won't need?
>> I thought about this one a little. How about making the interface
>> change conditionally, but still share the implementation? The merge
>> function bodies mostly remain unchanged and there is no runtime
>> penalty for libgcov. The new macros can be shared across most of the
>> #ifdef IN_PREOFILE_TOOL
>> #define GCOV_MERGE_EXTRA_ARGS gcov_type *src, unsigned w
>> #define GCOV_READ_COUNTER *(src++) * w
>> #define GCOV_MERGE_EXTRA_ARGS
>> #define GCOV_READ_COUNTER gcov_read_counter ()
>> __gcov_merge_add (gcov_type *counters, unsigned n_counters,
>> for (; n_counters; counters++, n_counters--)
>> *counters += GCOV_READ_COUNTER ;
> Personally I don't think the run time test of in_mem will cause any
> issue. This is in profile dumping, why don't we care a few more cycle
> heres? it won't pollute the profile.
> If you really don't like that, we can use the above approach, or I can
> hide the logic in gcov_read_counter(), i.e. overload
> gcov_read_counter() in profile_tool. For that, I will need a new
> global variable SRC and set it before calling the merge function.
> I would prefer to keep weight in _gcov_merge_* argument list.
> What do you think?
or perhaps just define an inline wrapper function to read counter.
This wrapper function takes src as input. if src is NULL, call
>>> I would suggest going with libgcov.h changes and clenaups first, with interface changes next
>>> and the gcov-tool is probably quite obvious at the end?
>>> Do you think you can split the patch this way?
>>> Thanks and sorry for taking long to review. I should have more time again now.
More information about the Gcc-patches