On Wed, Jul 2, 2014 at 1:15 PM, Xinliang David Li <davi...@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 <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 -- Teresa Johnson | Software Engineer | tejohn...@google.com | 408-460-2413