Message ID | CAAe5K+W=XngqEP90KZ9nfWThqe-eBGTXY3d2gRoJe3Fv=BY8nQ@mail.gmail.com |
---|---|
State | New |
Headers | show |
ok. thanks, David On Wed, Jul 2, 2014 at 5:20 PM, Teresa Johnson <tejohnson@google.com> wrote: > New patch below. Retested. Ok for google branches? > > Thanks, > Teresa > > 2014-07-02 Teresa Johnson <tejohnson@google.com> > > Google ref b/15378201. > * gcc/tree-profile.c (gcov_test_coverage_decl): Declare. > (tree_init_instrumentation): Initialize gcov_test_coverage_decl. > * libgcc/libgcov-driver.c (__gcov_dummy_ref7): Define. > * libgcc/libgcov-interface.c (__gcov_profiling_for_test_coverage): New > function. > > Index: gcc/tree-profile.c > =================================================================== > --- gcc/tree-profile.c (revision 212044) > +++ gcc/tree-profile.c (working copy) > @@ -164,6 +164,9 @@ static GTY(()) tree gcov_sample_counter_decl = NUL > /* extern gcov_unsigned_t __gcov_profile_prefix */ > static tree GTY(()) gcov_profile_prefix_decl = NULL_TREE; > > +/* extern gcov_unsigned_t __gcov_test_coverage */ > +static tree GTY(()) gcov_test_coverage_decl = NULL_TREE; > + > /* extern gcov_unsigned_t __gcov_sampling_period */ > static GTY(()) tree gcov_sampling_period_decl = NULL_TREE; > > @@ -498,6 +501,27 @@ tree_init_instrumentation (void) > DECL_INITIAL (gcov_profile_prefix_decl) = prefix_ptr; > varpool_finalize_decl (gcov_profile_prefix_decl); > } > + > + if (!gcov_test_coverage_decl) > + { > + /* Initialize __gcov_test_coverage to 1 if -ftest-coverage > + specified, 0 otherwise. Used by libgcov to determine whether > + a binary was instrumented for coverage or profile optimization. */ > + gcov_test_coverage_decl = build_decl ( > + UNKNOWN_LOCATION, > + VAR_DECL, > + get_identifier ("__gcov_test_coverage"), > + get_gcov_unsigned_t ()); > + TREE_PUBLIC (gcov_test_coverage_decl) = 1; > + DECL_ARTIFICIAL (gcov_test_coverage_decl) = 1; > + DECL_COMDAT_GROUP (gcov_test_coverage_decl) > + = DECL_ASSEMBLER_NAME (gcov_test_coverage_decl); > + TREE_STATIC (gcov_test_coverage_decl) = 1; > + DECL_INITIAL (gcov_test_coverage_decl) = build_int_cst ( > + get_gcov_unsigned_t (), > + flag_test_coverage ? 1 : 0); > + varpool_finalize_decl (gcov_test_coverage_decl); > + } > } > > /* Initialization function for FDO sampling. */ > Index: libgcc/libgcov-driver.c > =================================================================== > --- libgcc/libgcov-driver.c (revision 212044) > +++ libgcc/libgcov-driver.c (working copy) > @@ -79,6 +79,8 @@ extern unsigned int __gcov_sampling_enabled (void) > char *(*__gcov_dummy_ref5)(void) = &__gcov_sampling_enabled; > extern void __gcov_flush (void); > char *(*__gcov_dummy_ref6)(void) = &__gcov_flush; > +extern unsigned int __gcov_profiling_for_test_coverage (void); > +char *(*__gcov_dummy_ref7)(void) = &__gcov_profiling_for_test_coverage; > > /* Default callback function for profile instrumentation callback. */ > extern void __coverage_callback (gcov_type, int); > Index: libgcc/libgcov-interface.c > =================================================================== > --- libgcc/libgcov-interface.c (revision 212044) > +++ libgcc/libgcov-interface.c (working copy) > @@ -116,6 +116,20 @@ __gcov_dump (void) > set_gcov_dump_complete (); > } > > +/* Emitted in coverage.c. */ > +extern gcov_unsigned_t __gcov_test_coverage; > + > +unsigned int __gcov_profiling_for_test_coverage (void); > + > +/* Function that can be called from application to distinguish binaries > + instrumented for coverage from those instrumented for profile > + optimization (e.g. -fprofile-generate). */ > + > +unsigned int __gcov_profiling_for_test_coverage (void) > +{ > + return __gcov_test_coverage; > +} > + > #endif /* L_gcov_dump */ > > #ifdef L_gcov_sampling > > On Wed, Jul 2, 2014 at 1:25 PM, Xinliang David Li <davidxl@google.com> wrote: >> The reason is that test coverage is using the same underlying >> profiling. Returning false when calling '__gcov_profiling_enabled()) >> in coverage mode is a little misleading. >> >> David >> >> On Wed, Jul 2, 2014 at 1:22 PM, Teresa Johnson <tejohnson@google.com> wrote: >>> On Wed, Jul 2, 2014 at 1:15 PM, Xinliang David Li <davidxl@google.com> wrote: >>>> Should the interface be something like: >>>> >>>> int __gcov_profiling_for_test_coverage(void)? >>> >>> I was equating the term "profiling" with -fprofile-generate, as >>> opposed to -ftest-coverage instrumentation. But I can change it to >>> this if you think that is clearer. >>> >>> Teresa >>> >>>> >>>> David >>>> >>>> >>>> On Wed, Jul 2, 2014 at 12:55 PM, Teresa Johnson <tejohnson@google.com> wrote: >>>>> The following patch adds support for a new libgcov interface, >>>>> __gcov_profiling_enabled, that can be used by applications to >>>>> determine whether a binary has been instrumented for test coverage or >>>>> profile optimization. >>>>> >>>>> Passes regression tests and manual testing with different options. Ok >>>>> for google branches? >>>>> >>>>> Thanks, >>>>> Teresa >>>>> >>>>> 2014-07-02 Teresa Johnson <tejohnson@google.com> >>>>> >>>>> Google ref b/15378201. >>>>> * gcc/tree-profile.c (gcov_test_coverage_decl): Declare. >>>>> (tree_init_instrumentation): Initialize gcov_test_coverage_decl. >>>>> * libgcc/libgcov-driver.c (__gcov_dummy_ref7): Define. >>>>> * libgcc/libgcov-interface.c (__gcov_profiling_enabled): New function. >>>>> >>>>> Index: gcc/tree-profile.c >>>>> =================================================================== >>>>> --- gcc/tree-profile.c (revision 212044) >>>>> +++ gcc/tree-profile.c (working copy) >>>>> @@ -164,6 +164,9 @@ static GTY(()) tree gcov_sample_counter_decl = NUL >>>>> /* extern gcov_unsigned_t __gcov_profile_prefix */ >>>>> static tree GTY(()) gcov_profile_prefix_decl = NULL_TREE; >>>>> >>>>> +/* extern gcov_unsigned_t __gcov_test_coverage */ >>>>> +static tree GTY(()) gcov_test_coverage_decl = NULL_TREE; >>>>> + >>>>> /* extern gcov_unsigned_t __gcov_sampling_period */ >>>>> static GTY(()) tree gcov_sampling_period_decl = NULL_TREE; >>>>> >>>>> @@ -498,6 +501,27 @@ tree_init_instrumentation (void) >>>>> DECL_INITIAL (gcov_profile_prefix_decl) = prefix_ptr; >>>>> varpool_finalize_decl (gcov_profile_prefix_decl); >>>>> } >>>>> + >>>>> + if (!gcov_test_coverage_decl) >>>>> + { >>>>> + /* Initialize __gcov_test_coverage to 1 if -ftest-coverage >>>>> + specified, 0 otherwise. Used by libgcov to determine whether >>>>> + a binary was instrumented for coverage or profile optimization. */ >>>>> + gcov_test_coverage_decl = build_decl ( >>>>> + UNKNOWN_LOCATION, >>>>> + VAR_DECL, >>>>> + get_identifier ("__gcov_test_coverage"), >>>>> + get_gcov_unsigned_t ()); >>>>> + TREE_PUBLIC (gcov_test_coverage_decl) = 1; >>>>> + DECL_ARTIFICIAL (gcov_test_coverage_decl) = 1; >>>>> + DECL_COMDAT_GROUP (gcov_test_coverage_decl) >>>>> + = DECL_ASSEMBLER_NAME (gcov_test_coverage_decl); >>>>> + TREE_STATIC (gcov_test_coverage_decl) = 1; >>>>> + DECL_INITIAL (gcov_test_coverage_decl) = build_int_cst ( >>>>> + get_gcov_unsigned_t (), >>>>> + flag_test_coverage ? 1 : 0); >>>>> + varpool_finalize_decl (gcov_test_coverage_decl); >>>>> + } >>>>> } >>>>> >>>>> /* Initialization function for FDO sampling. */ >>>>> Index: libgcc/libgcov-driver.c >>>>> =================================================================== >>>>> --- libgcc/libgcov-driver.c (revision 212044) >>>>> +++ libgcc/libgcov-driver.c (working copy) >>>>> @@ -79,6 +79,8 @@ extern unsigned int __gcov_sampling_enabled (void) >>>>> char *(*__gcov_dummy_ref5)(void) = &__gcov_sampling_enabled; >>>>> extern void __gcov_flush (void); >>>>> char *(*__gcov_dummy_ref6)(void) = &__gcov_flush; >>>>> +extern unsigned int __gcov_profiling_enabled (void); >>>>> +char *(*__gcov_dummy_ref7)(void) = &__gcov_profiling_enabled; >>>>> >>>>> /* Default callback function for profile instrumentation callback. */ >>>>> extern void __coverage_callback (gcov_type, int); >>>>> Index: libgcc/libgcov-interface.c >>>>> =================================================================== >>>>> --- libgcc/libgcov-interface.c (revision 212044) >>>>> +++ libgcc/libgcov-interface.c (working copy) >>>>> @@ -116,6 +116,20 @@ __gcov_dump (void) >>>>> set_gcov_dump_complete (); >>>>> } >>>>> >>>>> +/* Emitted in coverage.c. */ >>>>> +extern gcov_unsigned_t __gcov_test_coverage; >>>>> + >>>>> +unsigned int __gcov_profiling_enabled (void); >>>>> + >>>>> +/* Function that can be called from application to distinguish binaries >>>>> + instrumented from coverage fro those instrumented for profiling >>>>> + (e.g. -fprofile-generate). */ >>>>> + >>>>> +unsigned int __gcov_profiling_enabled (void) >>>>> +{ >>>>> + return !__gcov_test_coverage; >>>>> +} >>>>> + >>>>> #endif /* L_gcov_dump */ >>>>> >>>>> #ifdef L_gcov_sampling >>>>> >>>>> >>>>> -- >>>>> Teresa Johnson | Software Engineer | tejohnson@google.com | 408-460-2413 >>> >>> >>> >>> -- >>> Teresa Johnson | Software Engineer | tejohnson@google.com | 408-460-2413 > > > > -- > Teresa Johnson | Software Engineer | tejohnson@google.com | 408-460-2413
Index: gcc/tree-profile.c =================================================================== --- gcc/tree-profile.c (revision 212044) +++ gcc/tree-profile.c (working copy) @@ -164,6 +164,9 @@ static GTY(()) tree gcov_sample_counter_decl = NUL /* extern gcov_unsigned_t __gcov_profile_prefix */ static tree GTY(()) gcov_profile_prefix_decl = NULL_TREE; +/* extern gcov_unsigned_t __gcov_test_coverage */ +static tree GTY(()) gcov_test_coverage_decl = NULL_TREE; + /* extern gcov_unsigned_t __gcov_sampling_period */ static GTY(()) tree gcov_sampling_period_decl = NULL_TREE; @@ -498,6 +501,27 @@ tree_init_instrumentation (void) DECL_INITIAL (gcov_profile_prefix_decl) = prefix_ptr; varpool_finalize_decl (gcov_profile_prefix_decl); } + + if (!gcov_test_coverage_decl) + { + /* Initialize __gcov_test_coverage to 1 if -ftest-coverage + specified, 0 otherwise. Used by libgcov to determine whether + a binary was instrumented for coverage or profile optimization. */ + gcov_test_coverage_decl = build_decl ( + UNKNOWN_LOCATION, + VAR_DECL, + get_identifier ("__gcov_test_coverage"), + get_gcov_unsigned_t ()); + TREE_PUBLIC (gcov_test_coverage_decl) = 1; + DECL_ARTIFICIAL (gcov_test_coverage_decl) = 1; + DECL_COMDAT_GROUP (gcov_test_coverage_decl) + = DECL_ASSEMBLER_NAME (gcov_test_coverage_decl); + TREE_STATIC (gcov_test_coverage_decl) = 1; + DECL_INITIAL (gcov_test_coverage_decl) = build_int_cst ( + get_gcov_unsigned_t (), + flag_test_coverage ? 1 : 0); + varpool_finalize_decl (gcov_test_coverage_decl); + } } /* Initialization function for FDO sampling. */ Index: libgcc/libgcov-driver.c =================================================================== --- libgcc/libgcov-driver.c (revision 212044) +++ libgcc/libgcov-driver.c (working copy) @@ -79,6 +79,8 @@ extern unsigned int __gcov_sampling_enabled (void) char *(*__gcov_dummy_ref5)(void) = &__gcov_sampling_enabled; extern void __gcov_flush (void); char *(*__gcov_dummy_ref6)(void) = &__gcov_flush; +extern unsigned int __gcov_profiling_for_test_coverage (void); +char *(*__gcov_dummy_ref7)(void) = &__gcov_profiling_for_test_coverage; /* Default callback function for profile instrumentation callback. */ extern void __coverage_callback (gcov_type, int); Index: libgcc/libgcov-interface.c =================================================================== --- libgcc/libgcov-interface.c (revision 212044) +++ libgcc/libgcov-interface.c (working copy) @@ -116,6 +116,20 @@ __gcov_dump (void) set_gcov_dump_complete (); } +/* Emitted in coverage.c. */ +extern gcov_unsigned_t __gcov_test_coverage; + +unsigned int __gcov_profiling_for_test_coverage (void); + +/* Function that can be called from application to distinguish binaries + instrumented for coverage from those instrumented for profile + optimization (e.g. -fprofile-generate). */ + +unsigned int __gcov_profiling_for_test_coverage (void) +{ + return __gcov_test_coverage; +} + #endif /* L_gcov_dump */ #ifdef L_gcov_sampling