yann@402: Date: 18 May 2005 22:47:59 -0000 yann@402: Message-ID: <20050518224759.7352.qmail@sourceware.org> yann@402: From: "hubicka at ucw dot cz" yann@402: To: dank@kegel.com yann@402: References: <20050407215701.20815.dank@kegel.com> yann@402: Reply-To: gcc-bugzilla@gcc.gnu.org yann@402: Subject: [Bug gcov/profile/20815] -fprofile-use barfs with "coverage mismatch for function '...' while reading counter 'arcs'." yann@402: yann@402: yann@402: ------- Additional Comments From hubicka at ucw dot cz 2005-05-18 22:47 ------- yann@402: Subject: Re: [Bug gcov/profile/20815] -fprofile-use barfs with "coverage mismatch for function '...' while reading counter 'arcs'." yann@402: yann@402: > yann@402: > ------- Additional Comments From hubicka at ucw dot cz 2005-05-18 22:22 ------- yann@402: > Subject: Re: [Bug gcov/profile/20815] -fprofile-use barfs with "coverage mismatch for function '...' while reading counter 'arcs'." yann@402: > yann@402: > coverage_checksum_string already knows a bit about ignoring random seed yann@402: > produced mess. It looks like this needs to be extended somehow to yann@402: > handle namespaces too... yann@402: yann@402: This seems to solve the missmatch. Would it be possible to test it on yann@402: bigger testcase and if it works distile a testcase that don't use yann@402: file IO so it is more suitable for gcc regtesting? yann@402: yann@402: Index: coverage.c yann@402: =================================================================== yann@402: RCS file: /cvs/gcc/gcc/gcc/coverage.c,v yann@402: retrieving revision 1.6.2.12.2.12 yann@402: diff -c -3 -p -r1.6.2.12.2.12 coverage.c yann@402: *** gcc-old/gcc/coverage.c 18 May 2005 07:37:31 -0000 1.6.2.12.2.12 yann@402: --- gcc/gcc/coverage.c 18 May 2005 22:45:36 -0000 yann@402: *************** coverage_checksum_string (unsigned chksu yann@402: *** 471,505 **** yann@402: as the checksums are used only for sanity checking. */ yann@402: for (i = 0; string[i]; i++) yann@402: { yann@402: if (!strncmp (string + i, "_GLOBAL__", 9)) yann@402: ! for (i = i + 9; string[i]; i++) yann@402: ! if (string[i]=='_') yann@402: ! { yann@402: ! int y; yann@402: ! unsigned seed; yann@402: ! int scan; yann@402: ! yann@402: ! for (y = 1; y < 9; y++) yann@402: ! if (!(string[i + y] >= '0' && string[i + y] <= '9') yann@402: ! && !(string[i + y] >= 'A' && string[i + y] <= 'F')) yann@402: ! break; yann@402: ! if (y != 9 || string[i + 9] != '_') yann@402: ! continue; yann@402: ! for (y = 10; y < 18; y++) yann@402: ! if (!(string[i + y] >= '0' && string[i + y] <= '9') yann@402: ! && !(string[i + y] >= 'A' && string[i + y] <= 'F')) yann@402: ! break; yann@402: ! if (y != 18) yann@402: ! continue; yann@402: ! scan = sscanf (string + i + 10, "%X", &seed); yann@402: ! gcc_assert (scan); yann@402: ! if (seed != crc32_string (0, flag_random_seed)) yann@402: ! continue; yann@402: ! string = dup = xstrdup (string); yann@402: ! for (y = 10; y < 18; y++) yann@402: ! dup[i + y] = '0'; yann@402: ! break; yann@402: ! } yann@402: break; yann@402: } yann@402: yann@402: --- 471,511 ---- yann@402: as the checksums are used only for sanity checking. */ yann@402: for (i = 0; string[i]; i++) yann@402: { yann@402: + int offset = 0; yann@402: + if (!strncmp (string + i, "_GLOBAL__N_", 11)) yann@402: + offset = 11; yann@402: if (!strncmp (string + i, "_GLOBAL__", 9)) yann@402: ! offset = 9; yann@402: ! yann@402: ! /* C++ namespaces do have scheme: yann@402: ! _GLOBAL__N___functionname yann@402: ! since filename might contain extra underscores there seems yann@402: ! to be no better chance then walk all possible offsets looking yann@402: ! for magicnuber. */ yann@402: ! if (offset) yann@402: ! for (;string[offset]; offset++) yann@402: ! for (i = i + offset; string[i]; i++) yann@402: ! if (string[i]=='_') yann@402: ! { yann@402: ! int y; yann@402: ! yann@402: ! for (y = 1; y < 9; y++) yann@402: ! if (!(string[i + y] >= '0' && string[i + y] <= '9') yann@402: ! && !(string[i + y] >= 'A' && string[i + y] <= 'F')) yann@402: ! break; yann@402: ! if (y != 9 || string[i + 9] != '_') yann@402: ! continue; yann@402: ! for (y = 10; y < 18; y++) yann@402: ! if (!(string[i + y] >= '0' && string[i + y] <= '9') yann@402: ! && !(string[i + y] >= 'A' && string[i + y] <= 'F')) yann@402: ! break; yann@402: ! if (y != 18) yann@402: ! continue; yann@402: ! if (!dup) yann@402: ! string = dup = xstrdup (string); yann@402: ! for (y = 10; y < 18; y++) yann@402: ! dup[i + y] = '0'; yann@402: ! } yann@402: break; yann@402: } yann@402: yann@402: yann@402: yann@402: -- yann@402: yann@402: yann@402: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20815 yann@402: yann@402: ------- You are receiving this mail because: ------- yann@402: You reported the bug, or are watching the reporter. yann@402: yann@402: