[PATCH, RFC] gcov: dump in a static dtor instead of in an atexit handler

Martin Liška mliska@suse.cz
Thu Sep 29 12:54:00 GMT 2016


On 09/29/2016 11:00 AM, Rainer Orth wrote:
> Hi Martin,
> 
>> On 08/12/2016 04:08 PM, Martin Liška wrote:
>>> On 08/10/2016 02:53 PM, Nathan Sidwell wrote:
>>>> On 08/10/16 06:43, Martin Liška wrote:
>>>>> Hello.
>>>>>
>>>>> There are multiple PRs (mentioned in ChangeLog) which suffer from
>>>>> missing capability of gcov
>>>>> to save counters for functions with constructor/destructor
>>>>> attributes. I done that by simply
>>>>> replacing atexit handler (gcov_exit) with a new static destructor
>>>>> (__gcov_exit), which has
>>>>> priority 99 (I did the same for __gcov_init). However, I'm not sure
>>>>> whether it's possible
>>>>> that a ctor defined in a source file can be potentially executed before
>>>>> __gcov_init (w/ the default
>>>>> priority)?
>>>>>
>>>>> Patch survives:
>>>>> make check -k -j10 RUNTESTFLAGS="gcov.exp"
>>>>> make check -k -j10 RUNTESTFLAGS="tree-prof.exp"
>>>>>
>>>>> I've just also verified that a DSO gcov dump works as before. I'm
>>>>> attaching a test-case which
>>>>> tests both static ctors/dtors, as well as C++ ctors/dtors.
>>>>
>>>> Does a coverage bootstrap (--enable-coverage) still succeed?
>>>
>>> Well, looks results are more unstable than I thought.
>>> Even running 'make -j1' in objdir/x86_64-pc-linux-gnu/libgcc repeatedly
>>> generates different results.
>>> I'll dig in after weekend.
>>>
>>> Martin
> [...]
>>>> I think this is a good idea, but we should document the changed
>>>> behavior. (I don't think the current behaviour's documented).
>>
>> I'm adding a new hunk that documents the behavior.
>>
>> Is the patch ready to be installed?
> 
> the testcase FAILs on Solaris 12 (both SPARC and x86):
> 
> +FAIL: g++.dg/gcov/pr16855.C  -std=gnu++11  gcov: 1 failures in line counts, 0 i
> n branch percentages, 0 in return percentages, 0 in intermediate format
> +FAIL: g++.dg/gcov/pr16855.C  -std=gnu++11  line 21: is #####:should be 1
> +FAIL: g++.dg/gcov/pr16855.C  -std=gnu++14  gcov: 1 failures in line counts, 0 i
> n branch percentages, 0 in return percentages, 0 in intermediate format
> +FAIL: g++.dg/gcov/pr16855.C  -std=gnu++14  line 21: is #####:should be 1
> +FAIL: g++.dg/gcov/pr16855.C  -std=gnu++98  gcov: 1 failures in line counts, 0 i
> n branch percentages, 0 in return percentages, 0 in intermediate format
> +FAIL: g++.dg/gcov/pr16855.C  -std=gnu++98  line 21: is #####:should be 1
> 
> I haven't looked closer yet, but notice that you require constructor
> priority support which isn't available everywhere (it is on Solaris 12,
> but not before).
> 
> 	Rainer
> 

Hello.

Sorry for the test-breakage. The issue is really connected to fact that current trunk relies
on support of dtor priority. The former implementation called the function __gcov_exit via atexit.
If I understand correctly, fully support of static ctors/dtors, C++ ctors/dtors, with combination
of atexit cannot be done on a target w/o ctor/dtor priorities.

Ideally we should have a macro for each target telling whether it supports priorities or not.
However, we probably don't have? I would suggest to make the test conditional just for main
targets which support priorities?

Thoughts?



More information about the Gcc-patches mailing list