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?