This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [GOOGLE] Define libgcov interface for distinguishing -ftest-coverage from -fprofile-generate
- From: Xinliang David Li <davidxl at google dot com>
- To: Teresa Johnson <tejohnson at google dot com>
- Cc: "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>
- Date: Wed, 2 Jul 2014 21:25:32 -0700
- Subject: Re: [GOOGLE] Define libgcov interface for distinguishing -ftest-coverage from -fprofile-generate
- Authentication-results: sourceware.org; auth=none
- References: <CAAe5K+UFJb-1+hPNP0fN3+PhYCn4v+mAyzibjBjq1w3KNWEfTw at mail dot gmail dot com> <CAAkRFZ+gQX_-zGMURj7BWdfjABMUChkTUwkw5a91Ci62YLgguA at mail dot gmail dot com> <CAAe5K+WP72hzUcESMw9n0oWRRaoPY9MEUNoyinSN4JriksXY0A at mail dot gmail dot com> <CAAkRFZJRbUbDA8on2GPOY8whpij=pvD-PTt6hN+d2eF2W62myA at mail dot gmail dot com> <CAAe5K+W=XngqEP90KZ9nfWThqe-eBGTXY3d2gRoJe3Fv=BY8nQ at mail dot gmail dot com>
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