OSDN Git Service

This patch addresses the bogus "Invocation mismatch" messages seen in parallel
authortejohnson <tejohnson@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 19 Nov 2012 05:20:59 +0000 (05:20 +0000)
committertejohnson <tejohnson@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 19 Nov 2012 05:20:59 +0000 (05:20 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@193612 138bc75d-0d04-0410-961f-82ee72b054a4

libgcc/ChangeLog
libgcc/libgcov.c

index 1cd6f9f..1a62fdf 100644 (file)
@@ -1,3 +1,9 @@
+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>
 
        * soft-fp: Updated from glibc upstream.
index c58427e..ba27c53 100644 (file)
@@ -365,7 +365,9 @@ gcov_exit (void)
   struct gcov_info *gi_ptr;
   const struct gcov_fn_info *gfi_ptr;
   struct gcov_summary this_prg; /* summary for program.  */
+#if !GCOV_LOCKED
   struct gcov_summary all_prg;  /* summary for all instances of program.  */
+#endif
   struct gcov_ctr_summary *cs_ptr;
   const struct gcov_ctr_info *ci_ptr;
   unsigned t_ix;
@@ -382,7 +384,9 @@ gcov_exit (void)
   if (gcov_dump_complete)
     return;
 
+#if !GCOV_LOCKED
   memset (&all_prg, 0, sizeof (all_prg));
+#endif
   /* Find the totals for this execution.  */
   memset (&this_prg, 0, sizeof (this_prg));
   for (gi_ptr = gcov_list; gi_ptr; gi_ptr = gi_ptr->next)
@@ -469,7 +473,10 @@ gcov_exit (void)
       unsigned n_counts;
       struct gcov_summary prg; /* summary for this object over all
                                  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;
       gcov_unsigned_t tag, length;
       gcov_position_t summary_pos = 0;
@@ -684,7 +691,6 @@ gcov_exit (void)
        {
          cs_prg = &prg.ctrs[t_ix];
          cs_tprg = &this_prg.ctrs[t_ix];
-         cs_all = &all_prg.ctrs[t_ix];
 
          if (gi_ptr->merge[t_ix])
            {
@@ -703,23 +709,34 @@ gcov_exit (void)
          else if (cs_prg->runs)
            goto read_mismatch;
 
+#if !GCOV_LOCKED
+         cs_all = &all_prg.ctrs[t_ix];
          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
-                  && (!GCOV_LOCKED || cs_all->runs == cs_prg->runs)
                    /* Don't compare the histograms, which may have slight
                       variations depending on the order they were updated
                       due to the truncating integer divides used in the
                       merge.  */
-                   && memcmp (cs_all, cs_prg,
-                              sizeof (*cs_all) - (sizeof (gcov_bucket_type)
-                                                  * GCOV_HISTOGRAM_SIZE)))
+                   && (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))
            {
-             fprintf (stderr, "profiling:%s:Invocation mismatch - some data files may have been removed%s\n",
-                      gi_filename, GCOV_LOCKED
-                      ? "" : " or concurrently updated without locking support");
+             fprintf (stderr,
+                       "profiling:%s:Data file mismatch - some data files may "
+                       "have been concurrently updated without locking support\n",
+                      gi_filename);
              all_prg.checksum = ~0u;
            }
+#endif
        }
 
       prg.checksum = crc32;