Commit 160e2e4f by Nathan Sidwell Committed by Nathan Sidwell

gcov-io.h: Update documentation.

	* gcov-io.h: Update documentation.
	(GCOV_GRAPH_SUFFIX, GCOV_GRAPH_MAGIC): Rename to GCOV_NOTE_SUFFIX,
	GCOV_NOTE_MAGIC.
	(GCOV_DATA_SUFFIX, GCOV_NOTE_SUFFIX): Update.
	(GCOV_DATA_MAGIC, GCOV_NOTE_MAGIC): Make non-palindromic.
	(struct gcov_var): Change buffer's type. Add endian flag.
	(gcov_open): Remove mode in libgcov.
	(gcov_magic): Prototype.
	* gcov-io.c (from_file): New.
	(gcov_open): Clear endian flag.
	(gcov_magic): New.
	(gcov_write_bytes, gcov_read_bytes): Return gcov_unsigned_t
	pointers.
	(gcov_write_unsigned, gcov_write_counter, gcov_write_string,
	gcov_write_tag, gcov_write_length, gcov_write_tag_length): Update.
	(gcov_read_unsigned, gcov_read_counter, gcov_read_string): Update.
	* gcov-iov.c (main): Correct cast.
	* coverage.c (read_counts_file): Use gcov_magic. Remove endianness
	conversion.
	(gcov_begin_output): Use GCOV_NOTE_MAGIC.
	(coverage_init): Use GCOV_NOTE_SUFFIX.
	* libgcov.c (gcov_version_mismatch): Remove endianness conversion.
	Rename to gcov_version, and return flag.
	(gcov_exit): Use gcov_version.
	(__gcov_init): Use gcov_version.
	* Makefile.in (coverageexts): Update.
	* gcov.c (print_version): Remove endianness conversion.
	(create_file_names): Use GCOV_NOTE_SUFFIX.
	(read_graph_file): Use gcov_magic.
	(read_count_file): Likewise.
	* gcov-dump.c (dump_file): Remove endianness conversion, use
	gcov_magic.

From-SVN: r69137
parent 83599948
2003-07-09 Nathan Sidwell <nathan@codesourcery.com> 2003-07-09 Nathan Sidwell <nathan@codesourcery.com>
* gcov-io.h: Update documentation.
(GCOV_GRAPH_SUFFIX, GCOV_GRAPH_MAGIC): Rename to GCOV_NOTE_SUFFIX,
GCOV_NOTE_MAGIC.
(GCOV_DATA_SUFFIX, GCOV_NOTE_SUFFIX): Update.
(GCOV_DATA_MAGIC, GCOV_NOTE_MAGIC): Make non-palindromic.
(struct gcov_var): Change buffer's type. Add endian flag.
(gcov_open): Remove mode in libgcov.
(gcov_magic): Prototype.
* gcov-io.c (from_file): New.
(gcov_open): Clear endian flag.
(gcov_magic): New.
(gcov_write_bytes, gcov_read_bytes): Return gcov_unsigned_t
pointers.
(gcov_write_unsigned, gcov_write_counter, gcov_write_string,
gcov_write_tag, gcov_write_length, gcov_write_tag_length): Update.
(gcov_read_unsigned, gcov_read_counter, gcov_read_string): Update.
* gcov-iov.c (main): Correct cast.
* coverage.c (read_counts_file): Use gcov_magic. Remove endianness
conversion.
(gcov_begin_output): Use GCOV_NOTE_MAGIC.
(coverage_init): Use GCOV_NOTE_SUFFIX.
* libgcov.c (gcov_version_mismatch): Remove endianness conversion.
Rename to gcov_version, and return flag.
(gcov_exit): Use gcov_version.
(__gcov_init): Use gcov_version.
* Makefile.in (coverageexts): Update.
* gcov.c (print_version): Remove endianness conversion.
(create_file_names): Use GCOV_NOTE_SUFFIX.
(read_graph_file): Use gcov_magic.
(read_count_file): Likewise.
* gcov-dump.c (dump_file): Remove endianness conversion, use
gcov_magic.
2003-07-09 Nathan Sidwell <nathan@codesourcery.com>
* configure.in (BUILD_PREFIX, BUILD_PREFIX_1): Set if enable * configure.in (BUILD_PREFIX, BUILD_PREFIX_1): Set if enable
coverage is on. coverage is on.
* configure: Regenerated. * configure: Regenerated.
......
...@@ -125,7 +125,7 @@ BOOT_CFLAGS = -g -O2 ...@@ -125,7 +125,7 @@ BOOT_CFLAGS = -g -O2
# contain the optimization flags, as you normally want code coverage # contain the optimization flags, as you normally want code coverage
# without optimization. # without optimization.
COVERAGE_FLAGS = @coverage_flags@ COVERAGE_FLAGS = @coverage_flags@
coverageexts = .{da,bbg} coverageexts = .{gcda,gcno}
# The warning flags are separate from BOOT_CFLAGS because people tend to # The warning flags are separate from BOOT_CFLAGS because people tend to
# override optimization flags and we'd like them to still have warnings # override optimization flags and we'd like them to still have warnings
......
...@@ -150,8 +150,7 @@ static void ...@@ -150,8 +150,7 @@ static void
read_counts_file (void) read_counts_file (void)
{ {
gcov_unsigned_t fn_ident = 0; gcov_unsigned_t fn_ident = 0;
gcov_unsigned_t version, checksum = -1; gcov_unsigned_t checksum = -1;
unsigned ix;
counts_entry_t *summaried = NULL; counts_entry_t *summaried = NULL;
unsigned seen_summary = 0; unsigned seen_summary = 0;
gcov_unsigned_t tag; gcov_unsigned_t tag;
...@@ -160,24 +159,18 @@ read_counts_file (void) ...@@ -160,24 +159,18 @@ read_counts_file (void)
if (!gcov_open (da_file_name, 1)) if (!gcov_open (da_file_name, 1))
return; return;
if (gcov_read_unsigned () != GCOV_DATA_MAGIC) if (!gcov_magic (gcov_read_unsigned (), GCOV_DATA_MAGIC))
{ {
warning ("`%s' is not a gcov data file", da_file_name); warning ("`%s' is not a gcov data file", da_file_name);
gcov_close (); gcov_close ();
return; return;
} }
else if ((version = gcov_read_unsigned ()) != GCOV_VERSION) else if ((tag = gcov_read_unsigned ()) != GCOV_VERSION)
{ {
char v[4], e[4];
gcov_unsigned_t required = GCOV_VERSION; gcov_unsigned_t required = GCOV_VERSION;
for (ix = 4; ix--; required >>= 8, version >>= 8)
{
v[ix] = version;
e[ix] = required;
}
warning ("`%s' is version `%.4s', expected version `%.4s'", warning ("`%s' is version `%.4s', expected version `%.4s'",
da_file_name, v, e); da_file_name, (const char *)&tag, (const char *)&required);
gcov_close (); gcov_close ();
return; return;
} }
...@@ -446,7 +439,7 @@ coverage_begin_output (void) ...@@ -446,7 +439,7 @@ coverage_begin_output (void)
error ("cannot open %s", bbg_file_name); error ("cannot open %s", bbg_file_name);
else else
{ {
gcov_write_unsigned (GCOV_GRAPH_MAGIC); gcov_write_unsigned (GCOV_NOTE_MAGIC);
gcov_write_unsigned (GCOV_VERSION); gcov_write_unsigned (GCOV_VERSION);
gcov_write_unsigned (local_tick); gcov_write_unsigned (local_tick);
} }
...@@ -897,9 +890,9 @@ coverage_init (const char *filename) ...@@ -897,9 +890,9 @@ coverage_init (const char *filename)
strcat (da_file_name, GCOV_DATA_SUFFIX); strcat (da_file_name, GCOV_DATA_SUFFIX);
/* Name of bbg file. */ /* Name of bbg file. */
bbg_file_name = (char *) xmalloc (len + strlen (GCOV_GRAPH_SUFFIX) + 1); bbg_file_name = (char *) xmalloc (len + strlen (GCOV_NOTE_SUFFIX) + 1);
strcpy (bbg_file_name, filename); strcpy (bbg_file_name, filename);
strcat (bbg_file_name, GCOV_GRAPH_SUFFIX); strcat (bbg_file_name, GCOV_NOTE_SUFFIX);
read_counts_file (); read_counts_file ();
} }
......
...@@ -155,33 +155,32 @@ dump_file (const char *filename) ...@@ -155,33 +155,32 @@ dump_file (const char *filename)
/* magic */ /* magic */
{ {
unsigned magic = gcov_read_unsigned (); unsigned magic = gcov_read_unsigned ();
unsigned version = gcov_read_unsigned (); unsigned version;
const char *type = NULL; const char *type = NULL;
char e[4], v[4], m[4]; int endianness = 0;
unsigned expected = GCOV_VERSION;
unsigned ix; if ((endianness = gcov_magic (magic, GCOV_DATA_MAGIC)))
int different = version != GCOV_VERSION;
if (magic == GCOV_DATA_MAGIC)
type = "data"; type = "data";
else if (magic == GCOV_GRAPH_MAGIC) else if ((endianness = gcov_magic (magic, GCOV_NOTE_MAGIC)))
type = "graph"; type = "note";
else else
{ {
printf ("%s:not a gcov file\n", filename); printf ("%s:not a gcov file\n", filename);
gcov_close (); gcov_close ();
return; return;
} }
for (ix = 4; ix--; expected >>= 8, version >>= 8, magic >>= 8) version = gcov_read_unsigned ();
printf ("%s:%s:magic `%.4s':version `%.4s'%s\n", filename, type,
(const char *)&magic, (const char *)&version,
endianness < 0 ? " (swapped endianness)" : "");
if (version != GCOV_VERSION)
{ {
e[ix] = expected; unsigned expected = GCOV_VERSION;
v[ix] = version;
m[ix] = magic; printf ("%s:warning:current version is `%.4s'\n", filename,
(const char *)expected);
} }
printf ("%s:%s:magic `%.4s':version `%.4s'\n", filename, type, m, v);
if (different)
printf ("%s:warning:current version is `%.4s'\n", filename, e);
} }
/* stamp */ /* stamp */
......
...@@ -26,13 +26,25 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA ...@@ -26,13 +26,25 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#if !IN_GCOV #if !IN_GCOV
static void gcov_write_block (unsigned); static void gcov_write_block (unsigned);
static unsigned char *gcov_write_bytes (unsigned); static gcov_unsigned_t *gcov_write_bytes (unsigned);
#endif #endif
static const unsigned char *gcov_read_bytes (unsigned); static const gcov_unsigned_t *gcov_read_bytes (unsigned);
#if !IN_LIBGCOV #if !IN_LIBGCOV
static void gcov_allocate (unsigned); static void gcov_allocate (unsigned);
#endif #endif
static inline gcov_unsigned_t from_file (gcov_unsigned_t value)
{
#if !IN_LIBGCOV
if (gcov_var.endian)
{
value = (value >> 16) | (value << 16);
value = ((value & 0xff00ff) << 8) | ((value >> 8) & 0xff00ff);
}
#endif
return value;
}
/* Open a gcov file. NAME is the name of the file to open and MODE /* Open a gcov file. NAME is the name of the file to open and MODE
indicates whether a new file should be created, or an existing file indicates whether a new file should be created, or an existing file
opened for modification. If MODE is >= 0 an existing file will be opened for modification. If MODE is >= 0 an existing file will be
...@@ -42,9 +54,15 @@ static void gcov_allocate (unsigned); ...@@ -42,9 +54,15 @@ static void gcov_allocate (unsigned);
opening an existing file and <0 on creating a new one. */ opening an existing file and <0 on creating a new one. */
GCOV_LINKAGE int GCOV_LINKAGE int
#if IN_LIBGCOV
gcov_open (const char *name)
#else
gcov_open (const char *name, int mode) gcov_open (const char *name, int mode)
#endif
{ {
int result = 1; #if IN_LIBGCOV
const int mode = 0;
#endif
#if GCOV_LOCKED #if GCOV_LOCKED
struct flock s_flock; struct flock s_flock;
...@@ -61,20 +79,22 @@ gcov_open (const char *name, int mode) ...@@ -61,20 +79,22 @@ gcov_open (const char *name, int mode)
gcov_var.offset = gcov_var.length = 0; gcov_var.offset = gcov_var.length = 0;
gcov_var.overread = -4u; gcov_var.overread = -4u;
gcov_var.error = 0; gcov_var.error = 0;
#if !IN_LIBGCOV
gcov_var.endian = 0;
#endif
if (mode >= 0) if (mode >= 0)
gcov_var.file = fopen (name, "r+b"); gcov_var.file = fopen (name, "r+b");
if (gcov_var.file) if (gcov_var.file)
gcov_var.mode = 1; gcov_var.mode = 1;
else if (mode <= 0) else if (mode <= 0)
{ {
result = -1;
gcov_var.file = fopen (name, "w+b"); gcov_var.file = fopen (name, "w+b");
if (gcov_var.file) if (gcov_var.file)
gcov_var.mode = -1; gcov_var.mode = mode * 2 + 1;
} }
if (!gcov_var.file) if (!gcov_var.file)
return 0; return 0;
setbuf (gcov_var.file, (char *)0); setbuf (gcov_var.file, (char *)0);
#if GCOV_LOCKED #if GCOV_LOCKED
...@@ -83,7 +103,7 @@ gcov_open (const char *name, int mode) ...@@ -83,7 +103,7 @@ gcov_open (const char *name, int mode)
continue; continue;
#endif #endif
return result; return 1;
} }
/* Close the current gcov file. Flushes data to disk. Returns nonzero /* Close the current gcov file. Flushes data to disk. Returns nonzero
...@@ -112,6 +132,27 @@ gcov_close (void) ...@@ -112,6 +132,27 @@ gcov_close (void)
} }
#if !IN_LIBGCOV #if !IN_LIBGCOV
/* Check if MAGIC is EXPECTED. Use it to determine endianness of the
file. Returns +1 for same endian, -1 for other endian and zero for
not EXPECTED. */
GCOV_LINKAGE int
gcov_magic (gcov_unsigned_t magic, gcov_unsigned_t expected)
{
if (magic == expected)
return 1;
magic = (magic >> 16) | (magic << 16);
magic = ((magic & 0xff00ff) << 8) | ((magic >> 8) & 0xff00ff);
if (magic == expected)
{
gcov_var.endian = 1;
return -1;
}
return 0;
}
#endif
#if !IN_LIBGCOV
static void static void
gcov_allocate (unsigned length) gcov_allocate (unsigned length)
{ {
...@@ -142,12 +183,13 @@ gcov_write_block (unsigned size) ...@@ -142,12 +183,13 @@ gcov_write_block (unsigned size)
/* Allocate space to write BYTES bytes to the gcov file. Return a /* Allocate space to write BYTES bytes to the gcov file. Return a
pointer to those bytes, or NULL on failure. */ pointer to those bytes, or NULL on failure. */
static unsigned char * static gcov_unsigned_t *
gcov_write_bytes (unsigned bytes) gcov_write_bytes (unsigned bytes)
{ {
char unsigned *result; gcov_unsigned_t *result;
GCOV_CHECK_WRITING (); GCOV_CHECK_WRITING ();
GCOV_CHECK (!(bytes & 3));
#if IN_LIBGCOV #if IN_LIBGCOV
if (gcov_var.offset >= GCOV_BLOCK_SIZE) if (gcov_var.offset >= GCOV_BLOCK_SIZE)
{ {
...@@ -162,7 +204,7 @@ gcov_write_bytes (unsigned bytes) ...@@ -162,7 +204,7 @@ gcov_write_bytes (unsigned bytes)
if (gcov_var.offset + bytes > gcov_var.alloc) if (gcov_var.offset + bytes > gcov_var.alloc)
gcov_allocate (gcov_var.offset + bytes); gcov_allocate (gcov_var.offset + bytes);
#endif #endif
result = &gcov_var.buffer[gcov_var.offset]; result = (gcov_unsigned_t *)&gcov_var.buffer[gcov_var.offset];
gcov_var.offset += bytes; gcov_var.offset += bytes;
return result; return result;
...@@ -174,18 +216,9 @@ gcov_write_bytes (unsigned bytes) ...@@ -174,18 +216,9 @@ gcov_write_bytes (unsigned bytes)
GCOV_LINKAGE void GCOV_LINKAGE void
gcov_write_unsigned (gcov_unsigned_t value) gcov_write_unsigned (gcov_unsigned_t value)
{ {
unsigned char *buffer = gcov_write_bytes (4); gcov_unsigned_t *buffer = gcov_write_bytes (4);
unsigned ix;
for (ix = 4; ix--; ) buffer[0] = value;
{
buffer[ix] = value;
value >>= 8;
}
if (sizeof (value) > 4 && value)
gcov_var.error = -1;
return;
} }
/* Write counter VALUE to coverage file. Sets error flag /* Write counter VALUE to coverage file. Sets error flag
...@@ -195,17 +228,16 @@ gcov_write_unsigned (gcov_unsigned_t value) ...@@ -195,17 +228,16 @@ gcov_write_unsigned (gcov_unsigned_t value)
GCOV_LINKAGE void GCOV_LINKAGE void
gcov_write_counter (gcov_type value) gcov_write_counter (gcov_type value)
{ {
unsigned char *buffer = gcov_write_bytes (8); gcov_unsigned_t *buffer = gcov_write_bytes (8);
unsigned ix;
for (ix = 8; ix--; ) buffer[0] = (gcov_unsigned_t) value;
{ if (sizeof (value) > sizeof (gcov_unsigned_t))
buffer[ix] = value; buffer[1] = (gcov_unsigned_t) (value >> 32);
value >>= 8; else
} buffer[1] = 0;
if ((sizeof (value) > 8 && value) || value < 0)
if (value < 0)
gcov_var.error = -1; gcov_var.error = -1;
return;
} }
#endif /* IN_LIBGCOV */ #endif /* IN_LIBGCOV */
...@@ -217,28 +249,20 @@ GCOV_LINKAGE void ...@@ -217,28 +249,20 @@ GCOV_LINKAGE void
gcov_write_string (const char *string) gcov_write_string (const char *string)
{ {
unsigned length = 0; unsigned length = 0;
unsigned pad = 0; unsigned alloc = 0;
unsigned rem = 0; gcov_unsigned_t *buffer;
unsigned char *buffer;
unsigned ix;
unsigned value;
if (string) if (string)
{ {
length = strlen (string); length = strlen (string);
rem = 4 - (length & 3); alloc = (length + 4) >> 2;
} }
buffer = gcov_write_bytes (4 + length + rem); buffer = gcov_write_bytes (4 + alloc * 4);
value = length; buffer[0] = alloc;
for (ix = 4; ix--; ) buffer[alloc] = 0;
{ memcpy (&buffer[1], string, length);
buffer[ix] = value;
value >>= 8;
}
memcpy (buffer + 4, string, length);
memcpy (buffer + 4 + length, &pad, rem);
} }
#endif #endif
...@@ -250,15 +274,11 @@ GCOV_LINKAGE gcov_position_t ...@@ -250,15 +274,11 @@ GCOV_LINKAGE gcov_position_t
gcov_write_tag (gcov_unsigned_t tag) gcov_write_tag (gcov_unsigned_t tag)
{ {
gcov_position_t result = gcov_var.start + gcov_var.offset; gcov_position_t result = gcov_var.start + gcov_var.offset;
unsigned char *buffer = gcov_write_bytes (8); gcov_unsigned_t *buffer = gcov_write_bytes (8);
unsigned ix;
for (ix = 4; ix--; ) buffer[0] = tag;
{ buffer[1] = 0;
buffer[ix] = tag;
tag >>= 8;
}
memset (buffer + 4, 0, 4);
return result; return result;
} }
...@@ -272,20 +292,15 @@ gcov_write_length (gcov_position_t position) ...@@ -272,20 +292,15 @@ gcov_write_length (gcov_position_t position)
{ {
unsigned offset; unsigned offset;
gcov_unsigned_t length; gcov_unsigned_t length;
unsigned char *buffer; gcov_unsigned_t *buffer;
unsigned ix;
GCOV_CHECK_WRITING (); GCOV_CHECK_WRITING ();
GCOV_CHECK (position + 8 <= gcov_var.start + gcov_var.offset); GCOV_CHECK (position + 8 <= gcov_var.start + gcov_var.offset);
GCOV_CHECK (position >= gcov_var.start); GCOV_CHECK (position >= gcov_var.start);
offset = position - gcov_var.start; offset = position - gcov_var.start;
length = gcov_var.offset - offset - 8; length = gcov_var.offset - offset - 8;
buffer = &gcov_var.buffer[offset + 4]; buffer = (gcov_unsigned_t *) &gcov_var.buffer[offset];
for (ix = 4; ix--; ) buffer[1] = length;
{
buffer[ix] = length;
length >>= 8;
}
if (gcov_var.offset >= GCOV_BLOCK_SIZE) if (gcov_var.offset >= GCOV_BLOCK_SIZE)
gcov_write_block (gcov_var.offset); gcov_write_block (gcov_var.offset);
} }
...@@ -297,20 +312,10 @@ gcov_write_length (gcov_position_t position) ...@@ -297,20 +312,10 @@ gcov_write_length (gcov_position_t position)
GCOV_LINKAGE void GCOV_LINKAGE void
gcov_write_tag_length (gcov_unsigned_t tag, gcov_unsigned_t length) gcov_write_tag_length (gcov_unsigned_t tag, gcov_unsigned_t length)
{ {
unsigned char *buffer = gcov_write_bytes (8); gcov_unsigned_t *buffer = gcov_write_bytes (8);
unsigned ix;
for (ix = 4; ix--; ) buffer[0] = tag;
{ buffer[1] = length;
buffer[ix] = tag;
tag >>= 8;
}
for (ix = 4; ix--; )
{
buffer[ix + 4] = length;
length >>= 8;
}
return;
} }
/* Write a summary structure to the gcov file. Return nonzero on /* Write a summary structure to the gcov file. Return nonzero on
...@@ -340,13 +345,14 @@ gcov_write_summary (gcov_unsigned_t tag, const struct gcov_summary *summary) ...@@ -340,13 +345,14 @@ gcov_write_summary (gcov_unsigned_t tag, const struct gcov_summary *summary)
/* Return a pointer to read BYTES bytes from the gcov file. Returns /* Return a pointer to read BYTES bytes from the gcov file. Returns
NULL on failure (read past EOF). */ NULL on failure (read past EOF). */
static const unsigned char * static const gcov_unsigned_t *
gcov_read_bytes (unsigned bytes) gcov_read_bytes (unsigned bytes)
{ {
const unsigned char *result; const gcov_unsigned_t *result;
unsigned excess = gcov_var.length - gcov_var.offset; unsigned excess = gcov_var.length - gcov_var.offset;
GCOV_CHECK_READING (); GCOV_CHECK_READING ();
GCOV_CHECK (!(bytes & 3));
if (excess < bytes) if (excess < bytes)
{ {
gcov_var.start += gcov_var.offset; gcov_var.start += gcov_var.offset;
...@@ -379,7 +385,7 @@ gcov_read_bytes (unsigned bytes) ...@@ -379,7 +385,7 @@ gcov_read_bytes (unsigned bytes)
return 0; return 0;
} }
} }
result = &gcov_var.buffer[gcov_var.offset]; result = (gcov_unsigned_t *)&gcov_var.buffer[gcov_var.offset];
gcov_var.offset += bytes; gcov_var.offset += bytes;
return result; return result;
} }
...@@ -390,20 +396,12 @@ gcov_read_bytes (unsigned bytes) ...@@ -390,20 +396,12 @@ gcov_read_bytes (unsigned bytes)
GCOV_LINKAGE gcov_unsigned_t GCOV_LINKAGE gcov_unsigned_t
gcov_read_unsigned (void) gcov_read_unsigned (void)
{ {
gcov_unsigned_t value = 0; gcov_unsigned_t value;
unsigned ix; const gcov_unsigned_t *buffer = gcov_read_bytes (4);
const unsigned char *buffer = gcov_read_bytes (4);
if (!buffer) if (!buffer)
return 0; return 0;
for (ix = sizeof (value); ix < 4; ix++) value = from_file (buffer[0]);
if (buffer[ix])
gcov_var.error = -1;
for (ix = 0; ix != 4; ix++)
{
value <<= 8;
value |= buffer[ix];
}
return value; return value;
} }
...@@ -413,20 +411,17 @@ gcov_read_unsigned (void) ...@@ -413,20 +411,17 @@ gcov_read_unsigned (void)
GCOV_LINKAGE gcov_type GCOV_LINKAGE gcov_type
gcov_read_counter (void) gcov_read_counter (void)
{ {
gcov_type value = 0; gcov_type value;
unsigned ix; const gcov_unsigned_t *buffer = gcov_read_bytes (8);
const unsigned char *buffer = gcov_read_bytes (8);
if (!buffer) if (!buffer)
return 0; return 0;
for (ix = sizeof (value); ix < 8; ix++) value = from_file (buffer[0]);
if (buffer[ix]) if (sizeof (value) > sizeof (gcov_unsigned_t))
gcov_var.error = -1; value |= ((gcov_type) from_file (buffer[1])) << 32;
for (ix = 0; ix != 8; ix++) else if (buffer[1])
{ gcov_var.error = -1;
value <<= 8;
value |= buffer[ix];
}
if (value < 0) if (value < 0)
gcov_var.error = -1; gcov_var.error = -1;
return value; return value;
...@@ -445,7 +440,6 @@ gcov_read_string (void) ...@@ -445,7 +440,6 @@ gcov_read_string (void)
if (!length) if (!length)
return 0; return 0;
length += 4 - (length & 3);
return (const char *) gcov_read_bytes (length); return (const char *) gcov_read_bytes (length);
} }
#endif #endif
......
...@@ -61,7 +61,7 @@ main (int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) ...@@ -61,7 +61,7 @@ main (int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED)
printf ("/* Generated automatically by the program `%s'\n", argv[0]); printf ("/* Generated automatically by the program `%s'\n", argv[0]);
printf (" from `%s'. */\n", version_string); printf (" from `%s'. */\n", version_string);
printf ("\n"); printf ("\n");
printf ("#define GCOV_VERSION ((unsigned)%#08x) /* %.4s */\n", printf ("#define GCOV_VERSION ((gcov_unsigned_t)%#08x) /* %.4s */\n",
version, v); version, v);
return 0; return 0;
......
...@@ -417,13 +417,10 @@ print_usage (int error_p) ...@@ -417,13 +417,10 @@ print_usage (int error_p)
static void static void
print_version (void) print_version (void)
{ {
char v[4];
unsigned version = GCOV_VERSION; unsigned version = GCOV_VERSION;
unsigned ix;
for (ix = 4; ix--; version >>= 8) fnotice (stdout, "gcov %.4s (GCC %s)\n",
v[ix] = version; (const char *)&version, version_string);
fnotice (stdout, "gcov %.4s (GCC %s)\n", v, version_string);
fnotice (stdout, "Copyright (C) 2002 Free Software Foundation, Inc.\n"); fnotice (stdout, "Copyright (C) 2002 Free Software Foundation, Inc.\n");
fnotice (stdout, fnotice (stdout,
"This is free software; see the source for copying conditions. There is NO\n\ "This is free software; see the source for copying conditions. There is NO\n\
...@@ -660,10 +657,10 @@ create_file_names (const char *file_name) ...@@ -660,10 +657,10 @@ create_file_names (const char *file_name)
*cptr = 0; *cptr = 0;
length = strlen (name); length = strlen (name);
bbg_file_name = xmalloc (length + strlen (GCOV_GRAPH_SUFFIX) + 1); bbg_file_name = xmalloc (length + strlen (GCOV_NOTE_SUFFIX) + 1);
strcpy (bbg_file_name, name); strcpy (bbg_file_name, name);
strcpy (bbg_file_name + length, GCOV_GRAPH_SUFFIX); strcpy (bbg_file_name + length, GCOV_NOTE_SUFFIX);
da_file_name = xmalloc (length + strlen (GCOV_DATA_SUFFIX) + 1); da_file_name = xmalloc (length + strlen (GCOV_DATA_SUFFIX) + 1);
strcpy (da_file_name, name); strcpy (da_file_name, name);
...@@ -715,7 +712,7 @@ read_graph_file (void) ...@@ -715,7 +712,7 @@ read_graph_file (void)
return 1; return 1;
} }
bbg_file_time = gcov_time (); bbg_file_time = gcov_time ();
if (gcov_read_unsigned () != GCOV_GRAPH_MAGIC) if (!gcov_magic (gcov_read_unsigned (), GCOV_NOTE_MAGIC))
{ {
fnotice (stderr, "%s:not a gcov graph file\n", bbg_file_name); fnotice (stderr, "%s:not a gcov graph file\n", bbg_file_name);
gcov_close (); gcov_close ();
...@@ -984,7 +981,7 @@ read_count_file (void) ...@@ -984,7 +981,7 @@ read_count_file (void)
fnotice (stderr, "%s:cannot open data file\n", da_file_name); fnotice (stderr, "%s:cannot open data file\n", da_file_name);
return 1; return 1;
} }
if (gcov_read_unsigned () != GCOV_DATA_MAGIC) if (!gcov_magic (gcov_read_unsigned (), GCOV_DATA_MAGIC))
{ {
fnotice (stderr, "%s:not a gcov data file\n", da_file_name); fnotice (stderr, "%s:not a gcov data file\n", da_file_name);
cleanup:; cleanup:;
...@@ -994,16 +991,10 @@ read_count_file (void) ...@@ -994,16 +991,10 @@ read_count_file (void)
version = gcov_read_unsigned (); version = gcov_read_unsigned ();
if (version != GCOV_VERSION) if (version != GCOV_VERSION)
{ {
char v[4], e[4];
unsigned desired = GCOV_VERSION; unsigned desired = GCOV_VERSION;
for (ix = 4; ix--; desired >>= 8, version >>= 8)
{
v[ix] = version;
e[ix] = desired;
}
fnotice (stderr, "%s:version `%.4s', prefer version `%.4s'\n", fnotice (stderr, "%s:version `%.4s', prefer version `%.4s'\n",
da_file_name, v, e); da_file_name, (const char *)&version, (const char *)&desired);
} }
tag = gcov_read_unsigned (); tag = gcov_read_unsigned ();
if (tag != bbg_stamp) if (tag != bbg_stamp)
......
...@@ -91,22 +91,19 @@ static struct gcov_info *gcov_list; ...@@ -91,22 +91,19 @@ static struct gcov_info *gcov_list;
object file included in multiple programs. */ object file included in multiple programs. */
static gcov_unsigned_t gcov_crc32; static gcov_unsigned_t gcov_crc32;
static void static int
gcov_version_mismatch (struct gcov_info *ptr, gcov_unsigned_t version) gcov_version (struct gcov_info *ptr, gcov_unsigned_t version)
{ {
gcov_unsigned_t expected = GCOV_VERSION; gcov_unsigned_t expected = GCOV_VERSION;
unsigned ix;
char e[4], v[4];
for (ix = 4; ix--; expected >>= 8, version >>= 8) if (version != GCOV_VERSION)
{ {
e[ix] = expected; fprintf (stderr,
v[ix] = version; "profiling:%s:Version mismatch - expected %.4s got %.4s\n",
ptr->filename, (const char *)&expected, (const char *)&version);
return 0;
} }
return 1;
fprintf (stderr,
"profiling:%s:Version mismatch - expected %.4s got %.4s\n",
ptr->filename, e, v);
} }
/* Dump the coverage counts. We merge with existing counts when /* Dump the coverage counts. We merge with existing counts when
...@@ -163,7 +160,6 @@ gcov_exit (void) ...@@ -163,7 +160,6 @@ gcov_exit (void)
struct gcov_ctr_summary *cs_ptr; struct gcov_ctr_summary *cs_ptr;
struct gcov_ctr_summary *cs_obj, *cs_tobj, *cs_prg, *cs_tprg, *cs_all; struct gcov_ctr_summary *cs_obj, *cs_tobj, *cs_prg, *cs_tprg, *cs_all;
int error = 0; int error = 0;
int merging;
gcov_unsigned_t tag, length; gcov_unsigned_t tag, length;
gcov_position_t summary_pos = 0; gcov_position_t summary_pos = 0;
...@@ -200,18 +196,17 @@ gcov_exit (void) ...@@ -200,18 +196,17 @@ gcov_exit (void)
fi_stride &= ~(__alignof__ (struct gcov_fn_info) - 1); fi_stride &= ~(__alignof__ (struct gcov_fn_info) - 1);
} }
/* Open for modification, if possible */ if (!gcov_open (gi_ptr->filename))
merging = gcov_open (gi_ptr->filename, 0);
if (!merging)
{ {
fprintf (stderr, "profiling:%s:Cannot open\n", gi_ptr->filename); fprintf (stderr, "profiling:%s:Cannot open\n", gi_ptr->filename);
continue; continue;
} }
if (merging > 0) tag = gcov_read_unsigned ();
if (tag)
{ {
/* Merge data from file. */ /* Merge data from file. */
if (gcov_read_unsigned () != GCOV_DATA_MAGIC) if (tag != GCOV_DATA_MAGIC)
{ {
fprintf (stderr, "profiling:%s:Not a gcov data file\n", fprintf (stderr, "profiling:%s:Not a gcov data file\n",
gi_ptr->filename); gi_ptr->filename);
...@@ -220,11 +215,8 @@ gcov_exit (void) ...@@ -220,11 +215,8 @@ gcov_exit (void)
continue; continue;
} }
length = gcov_read_unsigned (); length = gcov_read_unsigned ();
if (length != GCOV_VERSION) if (!gcov_version (gi_ptr, length))
{ goto read_fatal;
gcov_version_mismatch (gi_ptr, length);
goto read_fatal;
}
length = gcov_read_unsigned (); length = gcov_read_unsigned ();
if (length != gi_ptr->stamp) if (length != gi_ptr->stamp)
...@@ -299,16 +291,17 @@ gcov_exit (void) ...@@ -299,16 +291,17 @@ gcov_exit (void)
goto rewrite; goto rewrite;
} }
} }
if (!gcov_is_eof ())
{
read_error:;
fprintf (stderr, error < 0 ? "profiling:%s:Overflow merging\n"
: "profiling:%s:Error merging\n", gi_ptr->filename);
goto read_fatal;
}
rewrite:;
gcov_rewrite ();
} }
if (!gcov_is_eof ())
{
read_error:;
fprintf (stderr, error < 0 ? "profiling:%s:Overflow merging\n"
: "profiling:%s:Error merging\n", gi_ptr->filename);
goto read_fatal;
}
rewrite:;
gcov_rewrite ();
if (!summary_pos) if (!summary_pos)
memset (&program, 0, sizeof (program)); memset (&program, 0, sizeof (program));
...@@ -414,9 +407,7 @@ __gcov_init (struct gcov_info *info) ...@@ -414,9 +407,7 @@ __gcov_init (struct gcov_info *info)
{ {
if (!info->version) if (!info->version)
return; return;
if (info->version != GCOV_VERSION) if (gcov_version (info, info->version))
gcov_version_mismatch (info, info->version);
else
{ {
const char *ptr = info->filename; const char *ptr = info->filename;
gcov_unsigned_t crc32 = gcov_crc32; gcov_unsigned_t crc32 = gcov_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