Commit 822a258a by Teresa Johnson Committed by Teresa Johnson

This patch addresses the bogus "Invocation mismatch" messages seen in parallel…

This patch addresses the bogus "Invocation mismatch" messages seen in parallel profiledbootstrap builds of gcc.

This patch addresses the bogus "Invocation mismatch" messages seen in parallel
profiledbootstrap builds of gcc. See PR bootstrap/55051 for a discussion of
why this is occurring and why this checking is inaccurate. Leave it in when
!GCOV_LOCKED, to warn about concurrent update issues requiring locking.

2012-11-18  Teresa Johnson  <tejohnson@google.com>

	PR bootstrap/55051
	* libgcov.c (gcov_exit): Remove merged program summary
	comparison unless !GCOV_LOCKED.

From-SVN: r193612
parent c513ecbf
2012-11-18 Teresa Johnson <tejohnson@google.com>
PR bootstrap/55051
* libgcov.c (gcov_exit): Remove merged program summary
comparison unless !GCOV_LOCKED.
2012-11-15 Marcus Shawcroft <marcus.shawcroft@arm.com> 2012-11-15 Marcus Shawcroft <marcus.shawcroft@arm.com>
* soft-fp: Updated from glibc upstream. * soft-fp: Updated from glibc upstream.
......
...@@ -365,7 +365,9 @@ gcov_exit (void) ...@@ -365,7 +365,9 @@ gcov_exit (void)
struct gcov_info *gi_ptr; struct gcov_info *gi_ptr;
const struct gcov_fn_info *gfi_ptr; const struct gcov_fn_info *gfi_ptr;
struct gcov_summary this_prg; /* summary for program. */ struct gcov_summary this_prg; /* summary for program. */
#if !GCOV_LOCKED
struct gcov_summary all_prg; /* summary for all instances of program. */ struct gcov_summary all_prg; /* summary for all instances of program. */
#endif
struct gcov_ctr_summary *cs_ptr; struct gcov_ctr_summary *cs_ptr;
const struct gcov_ctr_info *ci_ptr; const struct gcov_ctr_info *ci_ptr;
unsigned t_ix; unsigned t_ix;
...@@ -382,7 +384,9 @@ gcov_exit (void) ...@@ -382,7 +384,9 @@ gcov_exit (void)
if (gcov_dump_complete) if (gcov_dump_complete)
return; return;
#if !GCOV_LOCKED
memset (&all_prg, 0, sizeof (all_prg)); memset (&all_prg, 0, sizeof (all_prg));
#endif
/* Find the totals for this execution. */ /* Find the totals for this execution. */
memset (&this_prg, 0, sizeof (this_prg)); memset (&this_prg, 0, sizeof (this_prg));
for (gi_ptr = gcov_list; gi_ptr; gi_ptr = gi_ptr->next) for (gi_ptr = gcov_list; gi_ptr; gi_ptr = gi_ptr->next)
...@@ -469,7 +473,10 @@ gcov_exit (void) ...@@ -469,7 +473,10 @@ gcov_exit (void)
unsigned n_counts; unsigned n_counts;
struct gcov_summary prg; /* summary for this object over all struct gcov_summary prg; /* summary for this object over all
program. */ program. */
struct gcov_ctr_summary *cs_prg, *cs_tprg, *cs_all; struct gcov_ctr_summary *cs_prg, *cs_tprg;
#if !GCOV_LOCKED
struct gcov_ctr_summary *cs_all;
#endif
int error = 0; int error = 0;
gcov_unsigned_t tag, length; gcov_unsigned_t tag, length;
gcov_position_t summary_pos = 0; gcov_position_t summary_pos = 0;
...@@ -684,7 +691,6 @@ gcov_exit (void) ...@@ -684,7 +691,6 @@ gcov_exit (void)
{ {
cs_prg = &prg.ctrs[t_ix]; cs_prg = &prg.ctrs[t_ix];
cs_tprg = &this_prg.ctrs[t_ix]; cs_tprg = &this_prg.ctrs[t_ix];
cs_all = &all_prg.ctrs[t_ix];
if (gi_ptr->merge[t_ix]) if (gi_ptr->merge[t_ix])
{ {
...@@ -703,23 +709,34 @@ gcov_exit (void) ...@@ -703,23 +709,34 @@ gcov_exit (void)
else if (cs_prg->runs) else if (cs_prg->runs)
goto read_mismatch; goto read_mismatch;
#if !GCOV_LOCKED
cs_all = &all_prg.ctrs[t_ix];
if (!cs_all->runs && cs_prg->runs) if (!cs_all->runs && cs_prg->runs)
memcpy (cs_all, cs_prg, sizeof (*cs_all)); {
cs_all->num = cs_prg->num;
cs_all->runs = cs_prg->runs;
cs_all->sum_all = cs_prg->sum_all;
cs_all->run_max = cs_prg->run_max;
cs_all->sum_max = cs_prg->sum_max;
}
else if (!all_prg.checksum else if (!all_prg.checksum
&& (!GCOV_LOCKED || cs_all->runs == cs_prg->runs)
/* Don't compare the histograms, which may have slight /* Don't compare the histograms, which may have slight
variations depending on the order they were updated variations depending on the order they were updated
due to the truncating integer divides used in the due to the truncating integer divides used in the
merge. */ merge. */
&& memcmp (cs_all, cs_prg, && (cs_all->num != cs_prg->num
sizeof (*cs_all) - (sizeof (gcov_bucket_type) || cs_all->runs != cs_prg->runs
* GCOV_HISTOGRAM_SIZE))) || cs_all->sum_all != cs_prg->sum_all
|| cs_all->run_max != cs_prg->run_max
|| cs_all->sum_max != cs_prg->sum_max))
{ {
fprintf (stderr, "profiling:%s:Invocation mismatch - some data files may have been removed%s\n", fprintf (stderr,
gi_filename, GCOV_LOCKED "profiling:%s:Data file mismatch - some data files may "
? "" : " or concurrently updated without locking support"); "have been concurrently updated without locking support\n",
gi_filename);
all_prg.checksum = ~0u; all_prg.checksum = ~0u;
} }
#endif
} }
prg.checksum = crc32; prg.checksum = crc32;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment