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 <x...@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. + Non-zero STR_LEN should only be seen in LIPO mode. */ +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; + + +} + /* 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)) + { + if (!strncmp (string + i - 4, "_cmo_", 5)) + 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); 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