Message ID | CAAe5K+UFJb-1+hPNP0fN3+PhYCn4v+mAyzibjBjq1w3KNWEfTw@mail.gmail.com |
---|---|
State | New |
Headers | show |
Should the interface be something like: int __gcov_profiling_for_test_coverage(void)? 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
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
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
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