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