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 <tejohn...@google.com> wrote: > 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