This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [google 4.7] fix line number checksum mismatch in lipo-use (issue6566044)
ok (for google-47 and google/main)
thanks,
David
On Fri, Sep 28, 2012 at 10:22 AM, Rong Xu <xur@google.com> wrote:
> Comments are inlined.
> Attached is the new patch.
>
> Thanks,
>
> -Rong
>
> On Tue, Sep 25, 2012 at 2:25 PM, Xinliang David Li <davidxl@google.com> wrote:
>> On Mon, Sep 24, 2012 at 2:42 PM, Rong Xu <xur@google.com> wrote:
>>> Hi,
>>>
>>> This is for google branches only.
>>> It fix the lino number checksum mismatch during LIPO-use build.
>>>
>>> Tested with SPEC and google internal banchmarks.
>>>
>>> Thanks,
>>>
>>> -Rong
>>>
>>> 2012-09-24 Rong Xu <xur@google.com>
>>>
>>> * gcc/coverage.c (coverage_checksum_string): strip out LIPO
>>> specific string.
>>> (crc32_string_1): New function.
>>> * gcc/cp/decl2.c (start_static_storage_duration_function):
>>> generate LIPO specific string.
>>>
>>> Index: gcc/coverage.c
>>> ===================================================================
>>> --- gcc/coverage.c (revision 191679)
>>> +++ gcc/coverage.c (working copy)
>>> @@ -903,6 +903,27 @@
>>> }
>>>
>>>
>>> +/* Generate a crc32 of a string with specified STR_ELN when it's not 0.
>>
>> STR_ELN --> STR_LEN
>
> Fixed.
>
>>
>>> + Non-zero STR_LEN should only be seen in LIPO mode. */
>>
>> Empty line needed.
>
> Fixed.
>
>>
>>> +static unsigned
>>> +crc32_string_1 (unsigned chksum, const char *string, unsigned str_len)
>>> +{
>>> + char *dup;
>>> +
>>> + if (!L_IPO_COMP_MODE || str_len == 0)
>>> + return crc32_string (chksum, string);
>>> +
>>> + gcc_assert (str_len > 0 && str_len < strlen(string));
>>> + dup = xstrdup (string);
>>> + dup[str_len] = 0;
>>> + chksum = crc32_string (chksum, dup);
>>> + free (dup);
>>> +
>>> + return chksum;
>>> +
>>
>> Remove extra lines after return.
>
> Fixed.
>
>>
>>> +
>>> +}
>>> +
>>> /* Generate a checksum for a string. CHKSUM is the current
>>> checksum. */
>>>
>>> @@ -911,7 +932,26 @@
>>> {
>>> int i;
>>> char *dup = NULL;
>>> + unsigned lipo_orig_str_len = 0;
>>>
>>> + /* Strip out the ending "_cmo_[0-9]*" string from function
>>> + name. Otherwise we will have lineno checksum mismatch. */
>>> + if (L_IPO_COMP_MODE)
>>> + {
>>> + int len;
>>> +
>>> + i = len = strlen (string);
>>> + while (i--)
>>> + if ((string[i] < '0' || string[i] > '9'))
>>> + break;
>>> + if ((i > 5) && (i != len - 1))
>>
>> i >= 5?
>
> This should not matter because we are expecting a non-empty sub-string
> before "_cmo_". If there not sub-string before "_cmo_", the original
> code will do nothing (which I think it's correct in the case of user
> defined name.)
>
>>
>>> + {
>>> + if (!strncmp (string + i - 4, "_cmo_", 5))
>>
>> _cmo_ or .cmo. ?
>>
>>> + lipo_orig_str_len = i - 4;
>>> + }
>>> +
>>> + }
>>> +
>>> /* Look for everything that looks if it were produced by
>>> get_file_function_name and zero out the second part
>>> that may result from flag_random_seed. This is not critical
>>> @@ -957,7 +997,7 @@
>>> }
>>> }
>>>
>>> - chksum = crc32_string (chksum, string);
>>> + chksum = crc32_string_1 (chksum, string, lipo_orig_str_len);
>>> if (dup)
>>> free (dup);
>>>
>>> Index: gcc/cp/decl2.c
>>> ===================================================================
>>> --- gcc/cp/decl2.c (revision 191679)
>>> +++ gcc/cp/decl2.c (working copy)
>>> @@ -2911,7 +2911,7 @@
>>> SSDF_IDENTIFIER_<number>. */
>>> sprintf (id, "%s_%u", SSDF_IDENTIFIER, count);
>>> if (L_IPO_IS_AUXILIARY_MODULE)
>>> - sprintf (id, "%s_%u", id, current_module_id);
>>> + sprintf (id, "%s_cmo_%u", id, current_module_id);
>>
>> _cmo_ or .cmo. for consistency?
>
> Changed all "_cmo_" to ".cmo.".
>
>>
>> David
>>
>>>
>>> type = build_function_type_list (void_type_node,
>>> integer_type_node, integer_type_node,
>>>
>>> --
>>> This patch is available for review at http://codereview.appspot.com/6566044