This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [GOOGLE] Define libgcov interface for distinguishing -ftest-coverage from -fprofile-generate


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 Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]