gcov-io.h: Add a local time stamp.

* gcov-io.h: Add a local time stamp.
	(struct gcov_info): Add stamp field.
	(gcov_truncate): New.
	* coverage.c (read_counts_file): Skip the stamp.
	(coverage_begin_output): Write the stamp.
	(build_gcov_info): Declare and init the stamp.
	(coverage_finish): Only unlink data file, if stamp is zero.
	* gcov-dump.c (dump_file): Dump the stamp.
	* gcov.c (bbg_stamp): New.
	(release_structures): Clear bbg_stamp.
	(read_graph_file): Read stamp.
	(read_count_file): Check stamp.
	* libgcov.c (gcov_exit): Check stamp and truncate if needed.

From-SVN: r69006
This commit is contained in:
Nathan Sidwell 2003-07-06 14:51:48 +00:00 committed by Nathan Sidwell
parent c07e547752
commit dd486eb27c
6 changed files with 80 additions and 14 deletions

View File

@ -1,3 +1,19 @@
2003-07-06 Nathan Sidwell <nathan@codesourcery.com>
* gcov-io.h: Add a local time stamp.
(struct gcov_info): Add stamp field.
(gcov_truncate): New.
* coverage.c (read_counts_file): Skip the stamp.
(coverage_begin_output): Write the stamp.
(build_gcov_info): Declare and init the stamp.
(coverage_finish): Only unlink data file, if stamp is zero.
* gcov-dump.c (dump_file): Dump the stamp.
* gcov.c (bbg_stamp): New.
(release_structures): Clear bbg_stamp.
(read_graph_file): Read stamp.
(read_count_file): Check stamp.
* libgcov.c (gcov_exit): Check stamp and truncate if needed.
2003-07-06 Nathan Sidwell <nathan@codesourcery.com>
* tree.h (default_flag_random_seed): Remove.

View File

@ -182,6 +182,9 @@ read_counts_file (void)
return;
}
/* Read and discard the stamp. */
gcov_read_unsigned ();
counts_hash = htab_create (10,
htab_counts_entry_hash, htab_counts_entry_eq,
htab_counts_entry_del);
@ -445,6 +448,7 @@ coverage_begin_output (void)
{
gcov_write_unsigned (GCOV_GRAPH_MAGIC);
gcov_write_unsigned (GCOV_VERSION);
gcov_write_unsigned (local_tick);
}
bbg_file_opened = 1;
}
@ -708,6 +712,14 @@ build_gcov_info (void)
fields = field;
value = tree_cons (field, null_pointer_node, value);
/* stamp */
field = build_decl (FIELD_DECL, NULL_TREE, unsigned_intSI_type_node);
TREE_CHAIN (field) = fields;
fields = field;
value = tree_cons (field, convert (unsigned_intSI_type_node,
build_int_2 (local_tick, 0)),
value);
/* Filename */
string_type = build_pointer_type (build_qualified_type (char_type_node,
TYPE_QUAL_CONST));
@ -905,13 +917,9 @@ coverage_finish (void)
if (error)
unlink (bbg_file_name);
#if SELF_COVERAGE
/* If the compiler is instrumented, we should not
unconditionally remove the counts file, because we might be
recompiling ourselves. The .da files are all removed during
copying the stage1 files. */
if (error)
#endif
if (!local_tick)
/* Only remove the da file, if we cannot stamp it. If we can
stamp it, libgcov will DTRT. */
unlink (da_file_name);
}
}

View File

@ -184,6 +184,13 @@ dump_file (const char *filename)
printf ("%s:warning:current version is `%.4s'\n", filename, e);
}
/* stamp */
{
unsigned stamp = gcov_read_unsigned ();
printf ("%s:stamp %lu\n", filename, (unsigned long)stamp);
}
while (1)
{
gcov_position_t base, position = gcov_position ();

View File

@ -52,11 +52,17 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
The basic format of the files is
file : int32:magic int32:version record*
file : int32:magic int32:version int32:stamp record*
The magic ident is different for the bbg and the counter files.
The version is the same for both files and is derived from gcc's
version number. Although the ident and version are formally 32 bit
version number. The stamp value is used to synchronize bbg and
counter files and to synchronize merging within a counter file. It
need not be an absolute time stamp, merely a ticker that increments
fast enough and cycles slow enough to distinguish different
compile/run/compile cycles.
Although the ident and version are formally 32 bit
numbers, they are derived from 4 character ASCII strings. The
version number consists of the single character major version
number, a two character minor version number (leading zero for
@ -370,8 +376,9 @@ struct gcov_info
gcov_unsigned_t version; /* expected version number */
struct gcov_info *next; /* link to next, used by libgcc */
gcov_unsigned_t stamp; /* uniquifying time stamp */
const char *filename; /* output file name */
unsigned n_functions; /* number of functions */
const struct gcov_fn_info *functions; /* table of functions */
@ -453,6 +460,7 @@ GCOV_LINKAGE void gcov_write_counter (gcov_type);
GCOV_LINKAGE void gcov_write_tag_length (gcov_unsigned_t, gcov_unsigned_t);
GCOV_LINKAGE void gcov_write_summary (gcov_unsigned_t /*tag*/,
const struct gcov_summary *);
static void gcov_truncate (void);
static void gcov_rewrite (void);
GCOV_LINKAGE void gcov_seek (gcov_position_t /*position*/);
#else
@ -525,6 +533,12 @@ gcov_rewrite (void)
gcov_var.offset = 0;
fseek (gcov_var.file, 0L, SEEK_SET);
}
static inline void
gcov_truncate (void)
{
ftruncate (fileno (gcov_var.file), 0L);
}
#endif
#endif /* IN_LIBGCOV >= 0 */

View File

@ -269,6 +269,9 @@ static time_t bbg_file_time;
static char *bbg_file_name;
/* Stamp of the bbg file */
static unsigned bbg_stamp;
/* Name and file pointer of the input file for the arc count data. */
static char *da_file_name;
@ -583,6 +586,7 @@ release_structures ()
free (da_file_name);
da_file_name = bbg_file_name = NULL;
bbg_file_time = 0;
bbg_stamp = 0;
while ((src = sources))
{
@ -740,7 +744,8 @@ read_graph_file ()
fnotice (stderr, "%s:version `%.4s', prefer `%.4s'\n",
bbg_file_name, v, e);
}
bbg_stamp = gcov_read_unsigned ();
while ((tag = gcov_read_unsigned ()))
{
unsigned length = gcov_read_unsigned ();
@ -1008,6 +1013,12 @@ read_count_file ()
fnotice (stderr, "%s:version `%.4s', prefer version `%.4s'\n",
da_file_name, v, e);
}
tag = gcov_read_unsigned ();
if (tag != bbg_stamp)
{
fnotice (stderr, "%s:stamp mismatch with graph file\n", da_file_name);
goto cleanup;
}
while ((tag = gcov_read_unsigned ()))
{

View File

@ -167,8 +167,10 @@ gcov_exit (void)
gcov_unsigned_t tag, length;
gcov_position_t summary_pos = 0;
/* Totals for this object file. */
memset (&this_object, 0, sizeof (this_object));
memset (&object, 0, sizeof (object));
/* Totals for this object file. */
for (t_ix = c_ix = 0,
ci_ptr = gi_ptr->counts, cs_ptr = this_object.ctrs;
t_ix != GCOV_COUNTERS_SUMMABLE; t_ix++, cs_ptr++)
@ -223,6 +225,15 @@ gcov_exit (void)
gcov_version_mismatch (gi_ptr, length);
goto read_fatal;
}
length = gcov_read_unsigned ();
if (length != gi_ptr->stamp)
{
/* Read from a different compilation. Overwrite the
file. */
gcov_truncate ();
goto rewrite;
}
/* Merge execution counts for each function. */
for (f_ix = gi_ptr->n_functions, fi_ptr = gi_ptr->functions;
@ -298,8 +309,6 @@ gcov_exit (void)
rewrite:;
gcov_rewrite ();
}
else
memset (&object, 0, sizeof (object));
if (!summary_pos)
memset (&program, 0, sizeof (program));
@ -355,6 +364,7 @@ gcov_exit (void)
/* Write out the data. */
gcov_write_tag_length (GCOV_DATA_MAGIC, GCOV_VERSION);
gcov_write_unsigned (gi_ptr->stamp);
/* Write execution counts for each function. */
for (f_ix = gi_ptr->n_functions, fi_ptr = gi_ptr->functions; f_ix--;