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 <tejohn...@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 <tejohn...@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 | tejohn...@google.com | 408-460-2413