coverage.c (bbg_file_stamp): New.
authorNathan Sidwell <nathan@acm.org>
Sat, 30 Jun 2012 11:42:52 +0000 (11:42 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Sat, 30 Jun 2012 11:42:52 +0000 (11:42 +0000)
* coverage.c (bbg_file_stamp): New.
(read_counts_file): Merge incoming stamp with bbg_file_stamp.
(build_info): Write bbg_file_stamp.
(coverage_init): Initialize bbg_file_stamp.  Read counts file
before writing graph header.
(coverage_finish): Don't unlink the data file if we can generate a
unique file stamp.
* tree.h (crc32_unsigned): Declare.
* tree.c (crc32_unsigned_bits): New, broken out of ...
(crc32_byte): ... here.  Use it.
(crc32_unsigned): New.

From-SVN: r189095

gcc/ChangeLog
gcc/coverage.c
gcc/tree.c
gcc/tree.h

index a6f4b346938dbbe7e8c3a2e09ed900f93502a2f3..cb3dc027701b6ab500966c539203f0a1caa3703a 100644 (file)
@@ -1,3 +1,17 @@
+2012-06-30  Nathan Sidwell  <nathan@acm.org>
+
+       * coverage.c (bbg_file_stamp): New.
+       (read_counts_file): Merge incoming stamp with bbg_file_stamp.
+       (build_info): Write bbg_file_stamp.
+       (coverage_init): Initialize bbg_file_stamp.  Read counts file
+       before writing graph header.
+       (coverage_finish): Don't unlink the data file if we can generate a
+       unique file stamp.
+       * tree.h (crc32_unsigned): Declare.
+       * tree.c (crc32_unsigned_bits): New, broken out of ...
+       (crc32_byte): ... here.  Use it.
+       (crc32_unsigned): New.
+
 2012-06-29   Cary Coutant  <ccoutant@google.com>
 
        * dwarf2out.c (add_pubname_string): Don't check for want_pubnames.
index 14fe52f404becb4ceb80c760a58a15b8f575d33f..8978afc0b82bd2fa22e1fa224afce30fd2f9df4d 100644 (file)
@@ -101,6 +101,9 @@ static GTY(()) tree gcov_fn_info_ptr_type;
    we're not writing to the notes file.  */
 static char *bbg_file_name;
 
+/* File stamp for graph file.  */
+static unsigned bbg_file_stamp;
+
 /* Name of the count data file.  */
 static char *da_file_name;
 
@@ -205,8 +208,9 @@ read_counts_file (void)
       return;
     }
 
-  /* Read and discard the stamp.  */
-  gcov_read_unsigned ();
+  /* Read the stamp, used for creating a generation count.  */
+  tag = gcov_read_unsigned ();
+  bbg_file_stamp = crc32_unsigned (bbg_file_stamp, tag);
 
   counts_hash = htab_create (10,
                             htab_counts_entry_hash, htab_counts_entry_eq,
@@ -905,7 +909,7 @@ build_info (tree info_type, tree fn_ary)
   /* stamp */
   CONSTRUCTOR_APPEND_ELT (v1, info_fields,
                          build_int_cstu (TREE_TYPE (info_fields),
-                                         local_tick));
+                                         bbg_file_stamp));
   info_fields = DECL_CHAIN (info_fields);
 
   /* Filename */
@@ -1101,6 +1105,11 @@ coverage_init (const char *filename)
   memcpy (da_file_name + prefix_len, filename, len);
   strcpy (da_file_name + prefix_len + len, GCOV_DATA_SUFFIX);
 
+  bbg_file_stamp = local_tick;
+  
+  if (flag_branch_probabilities)
+    read_counts_file ();
+
   /* Name of bbg file.  */
   if (flag_test_coverage && !flag_compare_debug)
     {
@@ -1117,12 +1126,9 @@ coverage_init (const char *filename)
        {
          gcov_write_unsigned (GCOV_NOTE_MAGIC);
          gcov_write_unsigned (GCOV_VERSION);
-         gcov_write_unsigned (local_tick);
+         gcov_write_unsigned (bbg_file_stamp);
        }
     }
-
-  if (flag_branch_probabilities)
-    read_counts_file ();
 }
 
 /* Performs file-level cleanup.  Close graph file, generate coverage
@@ -1133,10 +1139,11 @@ coverage_finish (void)
 {
   if (bbg_file_name && gcov_close ())
     unlink (bbg_file_name);
-  
-  if (!local_tick || local_tick == (unsigned)-1)
-    /* Only remove the da file, if we cannot stamp it.  If we can
-       stamp it, libgcov will DTRT.  */
+
+  if (!flag_branch_probabilities && flag_test_coverage
+      && (!local_tick || local_tick == (unsigned)-1))
+    /* Only remove the da file, if we're emitting coverage code and
+       cannot uniquely stamp it.  If we can stamp it, libgcov will DTRT.  */
     unlink (da_file_name);
 
   if (coverage_obj_init ())
index 1717d713698b44cad68542a2adee002dc169d3b9..5aa5399d7d1450b3c78a2f4c53084d8e5e82d176 100644 (file)
@@ -8738,23 +8738,37 @@ dump_tree_statistics (void)
 
 /* Generate a crc32 of a byte.  */
 
-unsigned
-crc32_byte (unsigned chksum, char byte)
+static unsigned
+crc32_unsigned_bits (unsigned chksum, unsigned value, unsigned bits)
 {
-  unsigned value = (unsigned) byte << 24;
-      unsigned ix;
-
-      for (ix = 8; ix--; value <<= 1)
-       {
-         unsigned feedback;
+  unsigned ix;
 
-         feedback = (value ^ chksum) & 0x80000000 ? 0x04c11db7 : 0;
-         chksum <<= 1;
-         chksum ^= feedback;
-       }
+  for (ix = bits; ix--; value <<= 1)
+    {
+      unsigned feedback;
+      
+      feedback = (value ^ chksum) & 0x80000000 ? 0x04c11db7 : 0;
+      chksum <<= 1;
+      chksum ^= feedback;
+    }
   return chksum;
 }
 
+/* Generate a crc32 of a 32-bit unsigned.  */
+
+unsigned
+crc32_unsigned (unsigned chksum, unsigned value)
+{
+  return crc32_unsigned_bits (chksum, value, 32);
+}
+
+/* Generate a crc32 of a byte.  */
+
+unsigned
+crc32_byte (unsigned chksum, char byte)
+{
+  return crc32_unsigned_bits (chksum, (unsigned) byte << 24, 8);
+}
 
 /* Generate a crc32 of a string.  */
 
index 5df8b84687f1af045ef746d61b24ee6d2dab3554..43d5fdc69c60cf42f95afe5e8ec8156cb9e85a5c 100644 (file)
@@ -5170,6 +5170,7 @@ inlined_function_outer_scope_p (const_tree block)
 /* In tree.c */
 extern unsigned crc32_string (unsigned, const char *);
 extern unsigned crc32_byte (unsigned, char);
+extern unsigned crc32_unsigned (unsigned, unsigned);
 extern void clean_symbol_name (char *);
 extern tree get_file_function_name (const char *);
 extern tree get_callee_fndecl (const_tree);