+Wed Nov 10 10:57:22 1999 Clinton Popetz <cpopetz@cygnus.com>
+
+ * gcov.c (struct arcdata): Add hits and total, remove prob.
+ (output_branch_counts): New.
+ (process_args): Set output_branch_counts if -c.
+ (calculate_branch_probs): Store hits and total instead of
+ percentage.
+ (output_data): Emit counts if output_branch_counts is true.
+ * gcov.texi (Invoking Gcov): Document -c switch..
+
Wed Nov 10 01:10:41 1999 Philippe De Muyter <phdm@macqel.be>
* genoutput.c (output_insn_data): Cast `INSN_OUTPUT_FORMAT_MULTI' and
struct arcdata
{
- int prob;
+ int hits;
+ int total;
int call_insn;
struct arcdata *next;
};
static char *object_directory = 0;
+/* Output the number of times a branch was taken as opposed to the percentage
+ of times it was taken. Turned on by the -c option */
+
+static int output_branch_counts = 0;
+
/* Forward declarations. */
static void process_args PROTO ((int, char **));
static void open_files PROTO ((void));
{
if (argv[i][1] == 'b')
output_branch_probs = 1;
+ else if (argv[i][1] == 'c')
+ output_branch_counts = 1;
else if (argv[i][1] == 'v')
fputs (gcov_version_string, stderr);
else if (argv[i][1] == 'n')
continue;
a_ptr = (struct arcdata *) xmalloc (sizeof (struct arcdata));
+ a_ptr->total = total;
if (total == 0)
- a_ptr->prob = -1;
+ a_ptr->hits = 0;
else
- a_ptr->prob = ((arcptr->arc_count * 100) + (total >> 1)) / total;
+ a_ptr->hits = arcptr->arc_count;
a_ptr->call_insn = arcptr->fake;
if (output_function_summary)
if (a_ptr->call_insn)
{
function_calls++;
- if (a_ptr->prob != -1)
+ if (a_ptr->total != 0)
function_calls_executed++;
}
else
{
function_branches++;
- if (a_ptr->prob != -1)
+ if (a_ptr->total != 0)
function_branches_executed++;
- if (a_ptr->prob > 0)
+ if (a_ptr->hits > 0)
function_branches_taken++;
}
}
if (a_ptr->call_insn)
{
total_calls++;
- if (a_ptr->prob != -1)
+ if (a_ptr->total != 0)
total_calls_executed++;
}
else
{
total_branches++;
- if (a_ptr->prob != -1)
+ if (a_ptr->total != 0)
total_branches_executed++;
- if (a_ptr->prob > 0)
+ if (a_ptr->hits > 0)
total_branches_taken++;
}
}
{
if (a_ptr->call_insn)
{
- if (a_ptr->prob == -1)
+ if (a_ptr->total == 0)
fnotice (gcov_file, "call %d never executed\n", i);
- else
- fnotice (gcov_file,
- "call %d returns = %d%%\n",
- i, 100 - a_ptr->prob);
+ else
+ {
+ if (output_branch_counts)
+ fnotice (gcov_file,
+ "call %d returns = %d\n",
+ i, a_ptr->total - a_ptr->hits);
+ else
+ fnotice (gcov_file,
+ "call %d returns = %d%%\n",
+ i, 100 - ((a_ptr->hits * 100) +
+ (a_ptr->total >> 1))/a_ptr->total);
+ }
}
else
{
- if (a_ptr->prob == -1)
+ if (a_ptr->total == 0)
fnotice (gcov_file, "branch %d never executed\n",
i);
else
- fnotice (gcov_file, "branch %d taken = %d%%\n", i,
- a_ptr->prob);
+ {
+ if (output_branch_counts)
+ fnotice (gcov_file,
+ "branch %d taken = %d\n",
+ i, a_ptr->hits);
+ else
+ fnotice (gcov_file,
+ "branch %d taken = %d%%\n", i,
+ ((a_ptr->hits * 100) +
+ (a_ptr->total >> 1))/
+ a_ptr->total);
+
+ }
}
- }
- }
+ }
+ }
/* Gracefully handle errors while reading the source file. */
if (retval == NULL)
@section Invoking gcov
@smallexample
-gcov [-b] [-v] [-n] [-l] [-f] [-o directory] @var{sourcefile}
+gcov [-b] [-c] [-v] [-n] [-l] [-f] [-o directory] @var{sourcefile}
@end smallexample
@table @code
info to the standard output. This option allows you to see how often
each branch in your program was taken.
+@item -c
+Write branch frequencies as the number of branches taken, rather than
+the percentage of branches taken.
+
@item -v
Display the @code{gcov} version number (on the standard error stream).