/* Gcov.c: prepend line execution counts and branch probabilities to a
source file.
Copyright (C) 1990, 1991, 1992, 1993, 1994, 1996, 1997, 1998,
- 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+ 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
Contributed by James E. Wilson of Cygnus Support.
Mangled by Bob Manson of Cygnus Support.
Mangled further by Nathan Sidwell <nathan@codesourcery.com>
#include "tm.h"
#include "intl.h"
#include "version.h"
-#undef abort
#include <getopt.h>
{
int argno;
+ /* Unlock the stdio streams. */
+ unlock_std_streams ();
+
gcc_init_libintl ();
argno = process_args (argc, argv);
}
static void
-fnotice (FILE *file, const char *msgid, ...)
+fnotice (FILE *file, const char *cmsgid, ...)
{
va_list ap;
- va_start (ap, msgid);
- vfprintf (file, _(msgid), ap);
+ va_start (ap, cmsgid);
+ vfprintf (file, _(cmsgid), ap);
va_end (ap);
}
-
-/* More 'friendly' abort that prints the line and file.
- config.h can #define abort fancy_abort if you like that sort of thing. */
-extern void fancy_abort (void) ATTRIBUTE_NORETURN;
-
-void
-fancy_abort (void)
-{
- fnotice (stderr, "Internal gcov abort.\n");
- exit (FATAL_EXIT_CODE);
-}
\f
/* Print a usage message and exit. If ERROR_P is nonzero, this is an error,
otherwise the output of --help. */
if (gcov_file)
{
- fnotice (stdout, "%s:creating `%s'\n",
+ fnotice (stdout, "%s:creating '%s'\n",
src->name, gcov_file_name);
output_lines (gcov_file, src);
if (ferror (gcov_file))
- fnotice (stderr, "%s:error writing output file `%s'\n",
+ fnotice (stderr, "%s:error writing output file '%s'\n",
src->name, gcov_file_name);
fclose (gcov_file);
}
else
- fnotice (stderr, "%s:could not open output file `%s'\n",
+ fnotice (stderr, "%s:could not open output file '%s'\n",
src->name, gcov_file_name);
free (gcov_file_name);
}
GCOV_UNSIGNED2STRING (v, version);
GCOV_UNSIGNED2STRING (e, GCOV_VERSION);
- fnotice (stderr, "%s:version `%.4s', prefer `%.4s'\n",
+ fnotice (stderr, "%s:version '%.4s', prefer '%.4s'\n",
bbg_file_name, v, e);
}
bbg_stamp = gcov_read_unsigned ();
else if (fn && tag == GCOV_TAG_BLOCKS)
{
if (fn->blocks)
- fnotice (stderr, "%s:already seen blocks for `%s'\n",
+ fnotice (stderr, "%s:already seen blocks for '%s'\n",
bbg_file_name, fn->name);
else
{
}
gcov_sync (base, length);
if (gcov_is_error ())
- break;
- }
- if (!gcov_is_eof ())
- {
- corrupt:;
- fnotice (stderr, "%s:corrupted\n", bbg_file_name);
- gcov_close ();
- return 1;
+ {
+ corrupt:;
+ fnotice (stderr, "%s:corrupted\n", bbg_file_name);
+ gcov_close ();
+ return 1;
+ }
}
gcov_close ();
GCOV_UNSIGNED2STRING (v, version);
GCOV_UNSIGNED2STRING (e, GCOV_VERSION);
- fnotice (stderr, "%s:version `%.4s', prefer version `%.4s'\n",
+ fnotice (stderr, "%s:version '%.4s', prefer version '%.4s'\n",
da_file_name, v, e);
}
tag = gcov_read_unsigned ();
fn_n = NULL;
else
{
- fnotice (stderr, "%s:unknown function `%u'\n",
+ fnotice (stderr, "%s:unknown function '%u'\n",
da_file_name, ident);
break;
}
else if (gcov_read_unsigned () != fn->checksum)
{
mismatch:;
- fnotice (stderr, "%s:profile mismatch for `%s'\n",
+ fnotice (stderr, "%s:profile mismatch for '%s'\n",
da_file_name, fn->name);
goto cleanup;
}
}
gcov_sync (base, length);
if ((error = gcov_is_error ()))
- break;
- }
-
- if (!gcov_is_eof ())
- {
- fnotice (stderr, error < 0 ? "%s:overflowed\n" : "%s:corrupted\n",
- da_file_name);
- goto cleanup;
+ {
+ fnotice (stderr, error < 0 ? "%s:overflowed\n" : "%s:corrupted\n",
+ da_file_name);
+ goto cleanup;
+ }
}
gcov_close ();
block_t *invalid_blocks = NULL; /* invalid, but inferable blocks. */
if (fn->num_blocks < 2)
- fnotice (stderr, "%s:`%s' lacks entry and/or exit blocks\n",
+ fnotice (stderr, "%s:'%s' lacks entry and/or exit blocks\n",
bbg_file_name, fn->name);
else
{
if (fn->blocks[0].num_pred)
- fnotice (stderr, "%s:`%s' has arcs to entry block\n",
+ fnotice (stderr, "%s:'%s' has arcs to entry block\n",
bbg_file_name, fn->name);
else
/* We can't deduce the entry block counts from the lack of
fn->blocks[0].num_pred = ~(unsigned)0;
if (fn->blocks[fn->num_blocks - 1].num_succ)
- fnotice (stderr, "%s:`%s' has arcs from exit block\n",
+ fnotice (stderr, "%s:'%s' has arcs from exit block\n",
bbg_file_name, fn->name);
else
/* Likewise, we can't deduce exit block counts from the lack
for (ix = 0; ix < fn->num_blocks; ix++)
if (!fn->blocks[ix].count_valid)
{
- fnotice (stderr, "%s:graph is unsolvable for `%s'\n",
+ fnotice (stderr, "%s:graph is unsolvable for '%s'\n",
bbg_file_name, fn->name);
break;
}
static void
function_summary (const coverage_t *coverage, const char *title)
{
- fnotice (stdout, "%s `%s'\n", title, coverage->name);
+ fnotice (stdout, "%s '%s'\n", title, coverage->name);
if (coverage->lines)
fnotice (stdout, "Lines executed:%s of %d\n",
format_gcov (coverage->lines_executed, coverage->lines, 2),
coverage->lines);
else
- fnotice (stdout, "No executable lines");
+ fnotice (stdout, "No executable lines\n");
if (flag_branches)
{
}
}
if (!line)
- fnotice (stderr, "%s:no lines for `%s'\n", bbg_file_name, fn->name);
+ fnotice (stderr, "%s:no lines for '%s'\n", bbg_file_name, fn->name);
}
/* Accumulate the line counts of a file. */
}
}
-/* Ouput information about ARC number IX. Returns nonzero if
+/* Output information about ARC number IX. Returns nonzero if
anything is output. */
static int
const line_t *line; /* current line info ptr. */
char string[STRING_SIZE]; /* line buffer. */
char const *retval = ""; /* status of source file reading. */
- function_t *fn = src->functions;
+ function_t *fn = NULL;
fprintf (gcov_file, "%9s:%5d:Source:%s\n", "-", 0, src->name);
fprintf (gcov_file, "%9s:%5d:Graph:%s\n", "-", 0, bbg_file_name);
if (!fstat (fileno (source_file), &status)
&& status.st_mtime > bbg_file_time)
{
- fnotice (stderr, "%s:source file is newer than graph file `%s'\n",
+ fnotice (stderr, "%s:source file is newer than graph file '%s'\n",
src->name, bbg_file_name);
fprintf (gcov_file, "%9s:%5d:Source is newer than graph\n",
"-", 0);
}
}
+ if (flag_branches)
+ fn = src->functions;
+
for (line_num = 1, line = &src->lines[line_num];
line_num < src->num_lines; line_num++, line++)
{
{
arc_t *arc = fn->blocks[fn->num_blocks - 1].pred;
gcov_type return_count = fn->blocks[fn->num_blocks - 1].count;
-
+
for (; arc; arc = arc->pred_next)
if (arc->fake)
return_count -= arc->count;
-
+
fprintf (gcov_file, "function %s", fn->name);
fprintf (gcov_file, " called %s",
format_gcov (fn->blocks[0].count, 0, -1));