Patchwork [Google] Fix test failure after porting __gcov_get_profile_prefix from google/4_7

login
register
mail settings
Submitter Teresa Johnson
Date Sept. 12, 2013, 8:06 p.m.
Message ID <CAAe5K+WpR5m9Gdf+4frtbT6R3=gJPX9rmExSZxfSPfkgGrnnsA@mail.gmail.com>
Download mbox | patch
Permalink /patch/274604/
State New
Headers show

Comments

Teresa Johnson - Sept. 12, 2013, 8:06 p.m.
After porting r198033 from google/4_7 to google/4_8 a test case failed
with an assert when trying to take the strlen of profile_data_prefix.

In most cases this is either set from the directory specified to
-fprofile-generate=, or to getpwd when a directory is not specified.
However, the exception is when no directory is specified for
-fprofile-generate and -auxbase-strip option is used with the absolute
pathname. In that case the code does not set profile_data_prefix since
the filenames already have the full path.

In the code that sets __gcov_get_profile_prefix, the fix is to simply
check if profile_data_prefix is still NULL, and if so just set via
getpwd.

Passes regression tests and failure I reproduced. Ok for google branches?

Thanks,
Teresa

2013-09-12  Teresa Johnson  <tejohnson@google.com>

* tree-profile.c (tree_init_instrumentation): Handle the case
        where profile_data_prefix is NULL.
Xinliang David Li - Sept. 12, 2013, 8:20 p.m.
On Thu, Sep 12, 2013 at 1:06 PM, Teresa Johnson <tejohnson@google.com> wrote:
> After porting r198033 from google/4_7 to google/4_8 a test case failed
> with an assert when trying to take the strlen of profile_data_prefix.
>
> In most cases this is either set from the directory specified to
> -fprofile-generate=, or to getpwd when a directory is not specified.
> However, the exception is when no directory is specified for
> -fprofile-generate and -auxbase-strip option is used with the absolute
> pathname. In that case the code does not set profile_data_prefix since
> the filenames already have the full path.
>
> In the code that sets __gcov_get_profile_prefix, the fix is to simply
> check if profile_data_prefix is still NULL, and if so just set via
> getpwd.

Why setting it to getpwd() val? Should it be set to null instead?

David

>
> Passes regression tests and failure I reproduced. Ok for google branches?
>
> Thanks,
> Teresa
>
> 2013-09-12  Teresa Johnson  <tejohnson@google.com>
>
> * tree-profile.c (tree_init_instrumentation): Handle the case
>         where profile_data_prefix is NULL.
>
> Index: tree-profile.c
> ===================================================================
> --- tree-profile.c (revision 202500)
> +++ tree-profile.c (working copy)
> @@ -470,8 +470,11 @@ tree_init_instrumentation (void)
>                            DECL_ASSEMBLER_NAME (gcov_profile_prefix_decl));
>        TREE_STATIC (gcov_profile_prefix_decl) = 1;
>
> -      prefix_len = strlen (profile_data_prefix);
> -      prefix_string = build_string (prefix_len + 1, profile_data_prefix);
> +      const char *prefix = profile_data_prefix;
> +      if (!prefix)
> +        prefix = getpwd ();
> +      prefix_len = strlen (prefix);
> +      prefix_string = build_string (prefix_len + 1, prefix);
>        TREE_TYPE (prefix_string) = build_array_type
>            (char_type_node, build_index_type
>             (build_int_cst (NULL_TREE, prefix_len)));
>
>
> --
> Teresa Johnson | Software Engineer | tejohnson@google.com | 408-460-2413
Teresa Johnson - Sept. 12, 2013, 9:07 p.m.
On Thu, Sep 12, 2013 at 1:20 PM, Xinliang David Li <davidxl@google.com> wrote:
> On Thu, Sep 12, 2013 at 1:06 PM, Teresa Johnson <tejohnson@google.com> wrote:
>> After porting r198033 from google/4_7 to google/4_8 a test case failed
>> with an assert when trying to take the strlen of profile_data_prefix.
>>
>> In most cases this is either set from the directory specified to
>> -fprofile-generate=, or to getpwd when a directory is not specified.
>> However, the exception is when no directory is specified for
>> -fprofile-generate and -auxbase-strip option is used with the absolute
>> pathname. In that case the code does not set profile_data_prefix since
>> the filenames already have the full path.
>>
>> In the code that sets __gcov_get_profile_prefix, the fix is to simply
>> check if profile_data_prefix is still NULL, and if so just set via
>> getpwd.
>
> Why setting it to getpwd() val? Should it be set to null instead?

The specified behavior when no path is given to -fprofile-generate (or
-fprofile-dir) is to use the current directory.

The case where this was happening was an lto test case, where lto1 was
first run in WPA (-fwpa) mode and was emitting the ltrans output to a
/tmp/ path (-fltrans-output-list=/tmp/cciR1m1o.ltrans.out). Then lto1
was run again in LTRANS mode (-fltrans) with -auxbase-strip
/tmp/cciR1m1o.ltrans0.ltrans.o, triggering the problem.

Teresa

>
> David
>
>>
>> Passes regression tests and failure I reproduced. Ok for google branches?
>>
>> Thanks,
>> Teresa
>>
>> 2013-09-12  Teresa Johnson  <tejohnson@google.com>
>>
>> * tree-profile.c (tree_init_instrumentation): Handle the case
>>         where profile_data_prefix is NULL.
>>
>> Index: tree-profile.c
>> ===================================================================
>> --- tree-profile.c (revision 202500)
>> +++ tree-profile.c (working copy)
>> @@ -470,8 +470,11 @@ tree_init_instrumentation (void)
>>                            DECL_ASSEMBLER_NAME (gcov_profile_prefix_decl));
>>        TREE_STATIC (gcov_profile_prefix_decl) = 1;
>>
>> -      prefix_len = strlen (profile_data_prefix);
>> -      prefix_string = build_string (prefix_len + 1, profile_data_prefix);
>> +      const char *prefix = profile_data_prefix;
>> +      if (!prefix)
>> +        prefix = getpwd ();
>> +      prefix_len = strlen (prefix);
>> +      prefix_string = build_string (prefix_len + 1, prefix);
>>        TREE_TYPE (prefix_string) = build_array_type
>>            (char_type_node, build_index_type
>>             (build_int_cst (NULL_TREE, prefix_len)));
>>
>>
>> --
>> Teresa Johnson | Software Engineer | tejohnson@google.com | 408-460-2413
Xinliang David Li - Sept. 12, 2013, 9:32 p.m.
When absolute path is specified for the object file, no prefix will be
prepended to the gcda path. If you record the cwd as in the
_gcov_profile_prefix variable, at profile dump time, the prefix will
be wrong -- as it is never used.

David

On Thu, Sep 12, 2013 at 2:07 PM, Teresa Johnson <tejohnson@google.com> wrote:
> On Thu, Sep 12, 2013 at 1:20 PM, Xinliang David Li <davidxl@google.com> wrote:
>> On Thu, Sep 12, 2013 at 1:06 PM, Teresa Johnson <tejohnson@google.com> wrote:
>>> After porting r198033 from google/4_7 to google/4_8 a test case failed
>>> with an assert when trying to take the strlen of profile_data_prefix.
>>>
>>> In most cases this is either set from the directory specified to
>>> -fprofile-generate=, or to getpwd when a directory is not specified.
>>> However, the exception is when no directory is specified for
>>> -fprofile-generate and -auxbase-strip option is used with the absolute
>>> pathname. In that case the code does not set profile_data_prefix since
>>> the filenames already have the full path.
>>>
>>> In the code that sets __gcov_get_profile_prefix, the fix is to simply
>>> check if profile_data_prefix is still NULL, and if so just set via
>>> getpwd.
>>
>> Why setting it to getpwd() val? Should it be set to null instead?
>
> The specified behavior when no path is given to -fprofile-generate (or
> -fprofile-dir) is to use the current directory.
>
> The case where this was happening was an lto test case, where lto1 was
> first run in WPA (-fwpa) mode and was emitting the ltrans output to a
> /tmp/ path (-fltrans-output-list=/tmp/cciR1m1o.ltrans.out). Then lto1
> was run again in LTRANS mode (-fltrans) with -auxbase-strip
> /tmp/cciR1m1o.ltrans0.ltrans.o, triggering the problem.
>
> Teresa
>
>>
>> David
>>
>>>
>>> Passes regression tests and failure I reproduced. Ok for google branches?
>>>
>>> Thanks,
>>> Teresa
>>>
>>> 2013-09-12  Teresa Johnson  <tejohnson@google.com>
>>>
>>> * tree-profile.c (tree_init_instrumentation): Handle the case
>>>         where profile_data_prefix is NULL.
>>>
>>> Index: tree-profile.c
>>> ===================================================================
>>> --- tree-profile.c (revision 202500)
>>> +++ tree-profile.c (working copy)
>>> @@ -470,8 +470,11 @@ tree_init_instrumentation (void)
>>>                            DECL_ASSEMBLER_NAME (gcov_profile_prefix_decl));
>>>        TREE_STATIC (gcov_profile_prefix_decl) = 1;
>>>
>>> -      prefix_len = strlen (profile_data_prefix);
>>> -      prefix_string = build_string (prefix_len + 1, profile_data_prefix);
>>> +      const char *prefix = profile_data_prefix;
>>> +      if (!prefix)
>>> +        prefix = getpwd ();
>>> +      prefix_len = strlen (prefix);
>>> +      prefix_string = build_string (prefix_len + 1, prefix);
>>>        TREE_TYPE (prefix_string) = build_array_type
>>>            (char_type_node, build_index_type
>>>             (build_int_cst (NULL_TREE, prefix_len)));
>>>
>>>
>>> --
>>> Teresa Johnson | Software Engineer | tejohnson@google.com | 408-460-2413
>
>
>
> --
> Teresa Johnson | Software Engineer | tejohnson@google.com | 408-460-2413

Patch

Index: tree-profile.c
===================================================================
--- tree-profile.c (revision 202500)
+++ tree-profile.c (working copy)
@@ -470,8 +470,11 @@  tree_init_instrumentation (void)
                           DECL_ASSEMBLER_NAME (gcov_profile_prefix_decl));
       TREE_STATIC (gcov_profile_prefix_decl) = 1;

-      prefix_len = strlen (profile_data_prefix);
-      prefix_string = build_string (prefix_len + 1, profile_data_prefix);
+      const char *prefix = profile_data_prefix;
+      if (!prefix)
+        prefix = getpwd ();
+      prefix_len = strlen (prefix);
+      prefix_string = build_string (prefix_len + 1, prefix);
       TREE_TYPE (prefix_string) = build_array_type
           (char_type_node, build_index_type
            (build_int_cst (NULL_TREE, prefix_len)));