diff mbox

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

Message ID CAAe5K+W=XngqEP90KZ9nfWThqe-eBGTXY3d2gRoJe3Fv=BY8nQ@mail.gmail.com
State New
Headers show

Commit Message

Teresa Johnson July 3, 2014, 12:20 a.m. UTC
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.


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

Comments

Xinliang David Li July 3, 2014, 4:25 a.m. UTC | #1
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
diff mbox

Patch

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