/* Gcov.c: prepend line execution counts and branch probabilities to a
   source file.
   Copyright (C) 1990, 91-94, 96, 97, 98, 1999 Free Software Foundation, Inc.
   Contributed by James E. Wilson of Cygnus Support.
   Mangled by Bob Manson of Cygnus Support.

Gcov is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

Gcov is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with Gcov; see the file COPYING.  If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.  */

/* ??? The code in final.c that produces the struct bb assumes that there is
   no padding between the fields.  This is not necessary true.  The current
   code can only be trusted if longs and pointers are the same size.  */

/* ??? No need to print an execution count on every line, could just print
   it on the first line of each block, and only print it on a subsequent
   line in the same block if the count changes.  */

/* ??? Print a list of the ten blocks with the highest execution counts,
   and list the line numbers corresponding to those blocks.  Also, perhaps
   list the line numbers with the highest execution counts, only printing
   the first if there are several which are all listed in the same block.  */

/* ??? Should have an option to print the number of basic blocks, and the
   percent of them that are covered.  */

/* ??? Does not correctly handle the case where two .bb files refer to the
   same included source file.  For example, if one has a short file containing
   only inline functions, which is then included in two other files, then
   there will be two .bb files which refer to the include file, but there
   is no way to get the total execution counts for the included file, can
   only get execution counts for one or the other of the including files.  */

#include "config.h"
#include "system.h"
#include "intl.h"

#include "gcov-io.h"

/* The .bb file format consists of several lists of 4-byte integers
   which are the line numbers of each basic block in the file.  Each
   list is terminated by a zero.  These lists correspond to the basic
   blocks in the reconstructed program flow graph.

   A line number of -1 indicates that a source file name (padded to a
   long boundary) follows.  The padded file name is followed by
   another -1 to make it easy to scan past file names.  A -2 indicates
   that a function name (padded to a long boundary) follows; the name
   is followed by another -2 to make it easy to scan past the function
   name.

   The .bbg file contains enough info to enable gcov to reconstruct the
   program flow graph.  The first word is the number of basic blocks,
   the second word is the number of arcs, followed by the list of arcs
   (source bb, dest bb pairs), then a -1, then the number of instrumented
   arcs followed by the instrumented arcs, followed by another -1.  This
   is repeated for each function.

   The .da file contains the execution count for each instrumented branch.

   The .bb and .bbg files are created by giving GCC the -ftest-coverage option,
   and the .da files are created when an executable compiled with
   -fprofile-arcs is run.  */

/* The functions in this file for creating and solution program flow graphs
   are very similar to functions in the gcc source file profile.c.  */

char gcov_version_string[] = "GNU gcov version 1.5\n";

/* This is the size of the buffer used to read in source file lines.  */

#define STRING_SIZE 200

/* One copy of this structure is created for each source file mentioned in the
   .bb file.  */

struct sourcefile
{
  char *name;
  int maxlineno;
  struct sourcefile *next;
};

/* This points to the head of the sourcefile structure list.  */

struct sourcefile *sources;

/* One of these is dynamically created whenever we identify an arc in the
   function.  */

struct adj_list {
  int source;
  int target;
  int arc_count;
  unsigned int count_valid : 1;
  unsigned int on_tree : 1;
  unsigned int fake : 1;
  unsigned int fall_through : 1;
#if 0
  /* Not needed for gcov, but defined in profile.c.  */
  rtx branch_insn;
#endif
  struct adj_list *pred_next;
  struct adj_list *succ_next;
};

/* Count the number of basic blocks, and create an array of these structures,
   one for each bb in the function.  */

struct bb_info {
  struct adj_list *succ;
  struct adj_list *pred;
  int succ_count;
  int pred_count;
  int exec_count;
  unsigned int count_valid : 1;
  unsigned int on_tree : 1;
#if 0
  /* Not needed for gcov, but defined in profile.c.  */
  rtx first_insn;
#endif
};

/* When outputting branch probabilities, one of these structures is created
   for each branch/call.  */

struct arcdata
{
  int prob;
  int call_insn;
  struct arcdata *next;
};

/* Used to save the list of bb_graphs, one per function.  */

struct bb_info_list {
  /* Indexed by block number, holds the basic block graph for one function.  */
  struct bb_info *bb_graph;
  int num_blocks;
  struct bb_info_list *next;
};

/* Holds a list of function basic block graphs.  */

static struct bb_info_list *bb_graph_list = 0;

/* Name and file pointer of the input file for the basic block graph.  */

static char *bbg_file_name;
static FILE *bbg_file;

/* Name and file pointer of the input file for the arc count data.  */

static char *da_file_name;
static FILE *da_file;

/* Name and file pointer of the input file for the basic block line counts.  */

static char *bb_file_name;
static FILE *bb_file;

/* Holds the entire contents of the bb_file read into memory.  */

static char *bb_data;

/* Size of bb_data array in longs.  */

static long bb_data_size;

/* Name and file pointer of the output file.  */

static char *gcov_file_name;
static FILE *gcov_file;

/* Name of the file mentioned on the command line.  */

static char *input_file_name = 0;

/* Output branch probabilities if true.  */

static int output_branch_probs = 0;

/* Output a gcov file if this is true.  This is on by default, and can
   be turned off by the -n option.  */

static int output_gcov_file = 1;

/* For included files, make the gcov output file name include the name of
   the input source file.  For example, if x.h is included in a.c, then the
   output file name is a.c.x.h.gcov instead of x.h.gcov.  This works only
   when a single source file is specified.  */

static int output_long_names = 0;

/* Output summary info for each function.  */

static int output_function_summary = 0;

/* Object directory file prefix.  This is the directory where .bb and .bbg
   files are looked for, if non-zero.  */

static char *object_directory = 0;

/* Forward declarations.  */
static void process_args PROTO ((int, char **));
static void open_files PROTO ((void));
static void read_files PROTO ((void));
static void scan_for_source_files PROTO ((void));
static void output_data PROTO ((void));
static void print_usage PROTO ((void)) ATTRIBUTE_NORETURN;

int
main (argc, argv)
     int argc;
     char **argv;
{
#ifdef HAVE_LC_MESSAGES
  setlocale (LC_MESSAGES, "");
#endif
  (void) bindtextdomain (PACKAGE, localedir);
  (void) textdomain (PACKAGE);

  process_args (argc, argv);

  open_files ();

  read_files ();

  scan_for_source_files ();

  output_data ();

  return 0;
}

static void fnotice PVPROTO ((FILE *, const char *, ...)) ATTRIBUTE_PRINTF_2;
static void
fnotice VPROTO ((FILE *file, const char *msgid, ...))
{
#ifndef ANSI_PROTOTYPES
  FILE *file;
  const char *msgid;
#endif
  va_list ap;

  VA_START (ap, msgid);

#ifndef ANSI_PROTOTYPES
  file = va_arg (ap, FILE *);
  msgid = va_arg (ap, const char *);
#endif

  vfprintf (file, _(msgid), ap);
  va_end (ap);
}


PTR
xmalloc (size)
  size_t size;
{
  register PTR value = (PTR) malloc (size);
  if (value == 0)
    {
      fnotice (stderr, "error: virtual memory exhausted");
      exit (FATAL_EXIT_CODE);
    }
  return value;
}

/* More 'friendly' abort that prints the line and file.
   config.h can #define abort fancy_abort if you like that sort of thing.  */

void
fancy_abort ()
{
  fnotice (stderr, "Internal gcc abort.\n");
  exit (FATAL_EXIT_CODE);
}

/* Print a usage message and exit.  */

static void
print_usage ()
{
  fnotice (stderr, "gcov [-b] [-v] [-n] [-l] [-f] [-o OBJDIR] file\n");
  exit (FATAL_EXIT_CODE);
}

/* Parse the command line.  */

static void
process_args (argc, argv)
     int argc;
     char **argv;
{
  int i;

  for (i = 1; i < argc; i++)
    {
      if (argv[i][0] == '-')
	{
	  if (argv[i][1] == 'b')
	    output_branch_probs = 1;
	  else if (argv[i][1] == 'v')
	    fputs (gcov_version_string, stderr);
	  else if (argv[i][1] == 'n')
	    output_gcov_file = 0;
	  else if (argv[i][1] == 'l')
	    output_long_names = 1;
	  else if (argv[i][1] == 'f')
	    output_function_summary = 1;
	  else if (argv[i][1] == 'o' && argv[i][2] == '\0')
	    object_directory = argv[++i];
	  else
	    print_usage ();
	}
      else if (! input_file_name)
	input_file_name = argv[i];
      else
	print_usage ();
    }

  if (! input_file_name)
    print_usage ();
}


/* Find and open the .bb, .da, and .bbg files.  */

static void
open_files ()
{
  int count, objdir_count;
  char *cptr;

  /* Determine the names of the .bb, .bbg, and .da files.  Strip off the
     extension, if any, and append the new extensions.  */
  count = strlen (input_file_name);
  if (object_directory)
    objdir_count = strlen (object_directory);
  else
    objdir_count = 0;

  da_file_name = xmalloc (count + objdir_count + 4);
  bb_file_name = xmalloc (count + objdir_count + 4);
  bbg_file_name = xmalloc (count + objdir_count + 5);

  if (object_directory)
    {
      strcpy (da_file_name, object_directory);
      strcpy (bb_file_name, object_directory);
      strcpy (bbg_file_name, object_directory);

      if (object_directory[objdir_count - 1] != '/')
	{
	  strcat (da_file_name, "/");
	  strcat (bb_file_name, "/");
	  strcat (bbg_file_name, "/");
	}

      cptr = rindex (input_file_name, '/');
      if (cptr)
	{
	  strcat (da_file_name, cptr + 1);
	  strcat (bb_file_name, cptr + 1);
	  strcat (bbg_file_name, cptr + 1);
	}
      else
	{
	  strcat (da_file_name, input_file_name);
	  strcat (bb_file_name, input_file_name);
	  strcat (bbg_file_name, input_file_name);
	}
    }
  else
    {
      strcpy (da_file_name, input_file_name);
      strcpy (bb_file_name, input_file_name);
      strcpy (bbg_file_name, input_file_name);
    }

  cptr = rindex (bb_file_name, '.');
  if (cptr)
    strcpy (cptr, ".bb");
  else
    strcat (bb_file_name, ".bb");

  cptr = rindex (da_file_name, '.');
  if (cptr)
    strcpy (cptr, ".da");
  else
    strcat (da_file_name, ".da");

  cptr = rindex (bbg_file_name, '.');
  if (cptr)
    strcpy (cptr, ".bbg");
  else
    strcat (bbg_file_name, ".bbg");

  bb_file = fopen (bb_file_name, "r");
  if (bb_file == NULL)
    {
      fnotice (stderr, "Could not open basic block file %s.\n", bb_file_name);
      exit (FATAL_EXIT_CODE);
    }

  /* If none of the functions in the file were executed, then there won't
     be a .da file.  Just assume that all counts are zero in this case.  */
  da_file = fopen (da_file_name, "r");
  if (da_file == NULL)
    {
      fnotice (stderr, "Could not open data file %s.\n", da_file_name);
      fnotice (stderr, "Assuming that all execution counts are zero.\n");
    }
    
  bbg_file = fopen (bbg_file_name, "r");
  if (bbg_file == NULL)
    {
      fnotice (stderr, "Could not open program flow graph file %s.\n",
	       bbg_file_name);
      exit (FATAL_EXIT_CODE);
    }

  /* Check for empty .bbg file.  This indicates that there is no executable
     code in this source file.  */
  /* Set the EOF condition if at the end of file.  */
  ungetc (getc (bbg_file), bbg_file);
  if (feof (bbg_file))
    {
      fnotice (stderr, "No executable code associated with file %s.\n",
	       input_file_name);
      exit (FATAL_EXIT_CODE);
    }
}

/* Initialize a new arc.  */

static void
init_arc (arcptr, source, target, bb_graph)
     struct adj_list *arcptr;
     int source, target;
     struct bb_info *bb_graph;
{
  arcptr->target = target;
  arcptr->source = source;

  arcptr->arc_count = 0;
  arcptr->count_valid = 0;
  arcptr->on_tree = 0;
  arcptr->fake = 0;
  arcptr->fall_through = 0;

  arcptr->succ_next = bb_graph[source].succ;
  bb_graph[source].succ = arcptr;
  bb_graph[source].succ_count++;

  arcptr->pred_next = bb_graph[target].pred;
  bb_graph[target].pred = arcptr;
  bb_graph[target].pred_count++;
}


/* Reverse the arcs on a arc list.  */

static struct adj_list *
reverse_arcs (arcptr)
     struct adj_list *arcptr;
{
  struct adj_list *prev = 0;
  struct adj_list *next;

  for ( ; arcptr; arcptr = next)
    {
      next = arcptr->succ_next;
      arcptr->succ_next = prev;
      prev = arcptr;
    }

  return prev;
}


/* Construct the program flow graph from the .bbg file, and read in the data
   in the .da file.  */

static void
create_program_flow_graph (bptr)
     struct bb_info_list *bptr;
{
  long num_blocks, number_arcs, src, dest, flag_bits, num_arcs_per_block;
  int i;
  struct adj_list *arcptr;
  struct bb_info *bb_graph;

  /* Read the number of blocks.  */
  __read_long (&num_blocks, bbg_file, 4);

  /* Create an array of size bb number of bb_info structs.  Bzero it.  */
  bb_graph = (struct bb_info *) xmalloc (num_blocks
					 * sizeof (struct bb_info));
  bzero ((char *) bb_graph, sizeof (struct bb_info) * num_blocks);

  bptr->bb_graph = bb_graph;
  bptr->num_blocks = num_blocks;

  /* Read and create each arc from the .bbg file.  */
  __read_long (&number_arcs, bbg_file, 4);
  for (i = 0; i < num_blocks; i++)
    {
      int j;

      __read_long (&num_arcs_per_block, bbg_file, 4);
      for (j = 0; j < num_arcs_per_block; j++)
	{
	  if (number_arcs-- < 0)
	    abort ();

	  src = i;
	  __read_long (&dest, bbg_file, 4);

	  arcptr = (struct adj_list *) xmalloc (sizeof (struct adj_list));
	  init_arc (arcptr, src, dest, bb_graph);

	  __read_long (&flag_bits, bbg_file, 4);
	  arcptr->on_tree = flag_bits & 0x1;
	  arcptr->fake = !! (flag_bits & 0x2);
	  arcptr->fall_through = !! (flag_bits & 0x4);
	}
    }

  if (number_arcs)
    abort ();

  /* Read and ignore the -1 separating the arc list from the arc list of the
     next function.  */
  __read_long (&src, bbg_file, 4);
  if (src != -1)
    abort ();

  /* Must reverse the order of all succ arcs, to ensure that they match
     the order of the data in the .da file.  */

  for (i = 0; i < num_blocks; i++)
    if (bb_graph[i].succ)
      bb_graph[i].succ = reverse_arcs (bb_graph[i].succ);

  /* For each arc not on the spanning tree, set its execution count from
     the .da file.  */

  /* The first count in the .da file is the number of times that the function
     was entered.  This is the exec_count for block zero.  */

  /* This duplicates code in branch_prob in profile.c.  */

  for (i = 0; i < num_blocks; i++)
    for (arcptr = bb_graph[i].succ; arcptr; arcptr = arcptr->succ_next)
      if (! arcptr->on_tree)
	{
	  long tmp_count = 0;;
	  if (da_file && __read_long (&tmp_count, da_file, 8))
	    abort();

	  arcptr->arc_count = tmp_count;
	  arcptr->count_valid = 1;
	  bb_graph[i].succ_count--;
	  bb_graph[arcptr->target].pred_count--;
	}
}
  
static void
solve_program_flow_graph (bptr)
     struct bb_info_list *bptr;
{
  int passes, changes, total;
  int i;
  struct adj_list *arcptr;
  struct bb_info *bb_graph;
  int num_blocks;

  num_blocks = bptr->num_blocks;
  bb_graph = bptr->bb_graph;

  /* For every block in the file,
     - if every exit/entrance arc has a known count, then set the block count
     - if the block count is known, and every exit/entrance arc but one has
       a known execution count, then set the count of the remaining arc

     As arc counts are set, decrement the succ/pred count, but don't delete
     the arc, that way we can easily tell when all arcs are known, or only
     one arc is unknown.  */

  /* The order that the basic blocks are iterated through is important.
     Since the code that finds spanning trees starts with block 0, low numbered
     arcs are put on the spanning tree in preference to high numbered arcs.
     Hence, most instrumented arcs are at the end.  Graph solving works much
     faster if we propagate numbers from the end to the start.

     This takes an average of slightly more than 3 passes.  */

  changes = 1;
  passes = 0;
  while (changes)
    {
      passes++;
      changes = 0;

      for (i = num_blocks - 1; i >= 0; i--)
	{
	  if (! bb_graph[i].count_valid)
	    {
	      if (bb_graph[i].succ_count == 0)
		{
		  total = 0;
		  for (arcptr = bb_graph[i].succ; arcptr;
		       arcptr = arcptr->succ_next)
		    total += arcptr->arc_count;
		  bb_graph[i].exec_count = total;
		  bb_graph[i].count_valid = 1;
		  changes = 1;
		}
	      else if (bb_graph[i].pred_count == 0)
		{
		  total = 0;
		  for (arcptr = bb_graph[i].pred; arcptr;
		       arcptr = arcptr->pred_next)
		    total += arcptr->arc_count;
		  bb_graph[i].exec_count = total;
		  bb_graph[i].count_valid = 1;
		  changes = 1;
		}
	    }
	  if (bb_graph[i].count_valid)
	    {
	      if (bb_graph[i].succ_count == 1)
		{
		  total = 0;
		  /* One of the counts will be invalid, but it is zero,
		     so adding it in also doesn't hurt.  */
		  for (arcptr = bb_graph[i].succ; arcptr;
		       arcptr = arcptr->succ_next)
		    total += arcptr->arc_count;
		  /* Calculate count for remaining arc by conservation.  */
		  total = bb_graph[i].exec_count - total;
		  /* Search for the invalid arc, and set its count.  */
		  for (arcptr = bb_graph[i].succ; arcptr;
		       arcptr = arcptr->succ_next)
		    if (! arcptr->count_valid)
		      break;
		  if (! arcptr)
		    abort ();
		  arcptr->count_valid = 1;
		  arcptr->arc_count = total;
		  bb_graph[i].succ_count--;

		  bb_graph[arcptr->target].pred_count--;
		  changes = 1;
		}
	      if (bb_graph[i].pred_count == 1)
		{
		  total = 0;
		  /* One of the counts will be invalid, but it is zero,
		     so adding it in also doesn't hurt.  */
		  for (arcptr = bb_graph[i].pred; arcptr;
		       arcptr = arcptr->pred_next)
		    total += arcptr->arc_count;
		  /* Calculate count for remaining arc by conservation.  */
		  total = bb_graph[i].exec_count - total;
		  /* Search for the invalid arc, and set its count.  */
		  for (arcptr = bb_graph[i].pred; arcptr;
		       arcptr = arcptr->pred_next)
		    if (! arcptr->count_valid)
		      break;
		  if (! arcptr)
		    abort ();
		  arcptr->count_valid = 1;
		  arcptr->arc_count = total;
		  bb_graph[i].pred_count--;

		  bb_graph[arcptr->source].succ_count--;
		  changes = 1;
		}
	    }
	}
    }
	      
  /* If the graph has been correctly solved, every block will have a
     succ and pred count of zero.  */
  for (i = 0; i < num_blocks; i++)
    if (bb_graph[i].succ_count || bb_graph[i].pred_count)
      abort ();
}


static void
read_files ()
{
  struct stat buf;
  struct bb_info_list *list_end = 0;
  struct bb_info_list *b_ptr;
  long total;

  /* Read and ignore the first word of the .da file, which is the count of
     how many numbers follow.  */
  if (da_file && __read_long (&total, da_file, 8))
    abort();

  while (! feof (bbg_file))
    {
      b_ptr = (struct bb_info_list *) xmalloc (sizeof (struct bb_info_list));

      b_ptr->next = 0;
      if (list_end)
	list_end->next = b_ptr;
      else
	bb_graph_list = b_ptr;
      list_end = b_ptr;

      /* Read in the data in the .bbg file and reconstruct the program flow
	 graph for one function.  */
      create_program_flow_graph (b_ptr);

      /* Set the EOF condition if at the end of file.  */
      ungetc (getc (bbg_file), bbg_file);
    }

  /* Check to make sure the .da file data is valid.  */

  if (da_file)
    {
      if (feof (da_file))
	fnotice (stderr, ".da file contents exhausted too early\n");
      /* Should be at end of file now.  */
      if (__read_long (&total, da_file, 8) == 0)
	fnotice (stderr, ".da file contents not exhausted\n");
    }

  /* Calculate all of the basic block execution counts and branch
     taken probabilities.  */

  for (b_ptr = bb_graph_list; b_ptr; b_ptr = b_ptr->next)
    solve_program_flow_graph (b_ptr);

  /* Read in all of the data from the .bb file.   This info will be accessed
     sequentially twice.  */
  stat (bb_file_name, &buf);
  bb_data_size = buf.st_size / 4;

  bb_data = (char *) xmalloc ((unsigned) buf.st_size);
  fread (bb_data, sizeof (char), buf.st_size, bb_file);
  
  fclose (bb_file);
  if (da_file)
    fclose (da_file);
  fclose (bbg_file);
}


/* Scan the data in the .bb file to find all source files referenced,
   and the largest line number mentioned in each one.  */

static void
scan_for_source_files ()
{
  struct sourcefile *s_ptr = NULL;
  char *ptr;
  int count;
  long line_num;

  /* Search the bb_data to find:
     1) The number of sources files contained herein, and
     2) The largest line number for each source file.  */

  ptr = bb_data;
  sources = 0;
  for (count = 0; count < bb_data_size; count++)
    {
      __fetch_long (&line_num, ptr, 4);
      ptr += 4;
      if (line_num == -1)
	{
	  /* A source file name follows.  Check to see if we already have
	   a sourcefile structure for this file.  */
	  s_ptr = sources;
	  while (s_ptr && strcmp (s_ptr->name, ptr))
	    s_ptr = s_ptr->next;

	  if (s_ptr == 0)
	    {
	      /* No sourcefile structure for this file name exists, create
		 a new one, and append it to the front of the sources list.  */
	      s_ptr = (struct sourcefile *) xmalloc (sizeof(struct sourcefile));
	      s_ptr->name = xmalloc (strlen ((char *) ptr) + 1);
	      strcpy (s_ptr->name, (char *) ptr);
	      s_ptr->maxlineno = 0;
	      s_ptr->next = sources;
	      sources = s_ptr;
	    }

	  /* Scan past the file name.  */
	  {
	    long delim;
	    do {
	      count++;
	      __fetch_long (&delim, ptr, 4);
	      ptr += 4;
	    } while (delim != line_num);
	  }
	}
      else if (line_num == -2)
	{
	  long delim;

	  /* A function name follows.  Ignore it.  */
	  do {
	    count++;
	    __fetch_long (&delim, ptr, 4);
	    ptr += 4;
	  } while (delim != line_num);
	}
      /* There will be a zero before the first file name, in which case s_ptr
	 will still be uninitialized.  So, only try to set the maxlineno
	 field if line_num is non-zero.  */
      else if (line_num > 0)
	{
	  if (s_ptr->maxlineno <= line_num)
	    s_ptr->maxlineno = line_num + 1;
	}
      else if (line_num < 0)
	{
	  /* Don't know what this is, but it's garbage. */
	  abort();
	}
    }
}

/* For calculating coverage at the function level.  */

static int function_source_lines;
static int function_source_lines_executed;
static int function_branches;
static int function_branches_executed;
static int function_branches_taken;
static int function_calls;
static int function_calls_executed;
static char *function_name;

/* Calculate the branch taken probabilities for all arcs branches at the
   end of this block.  */

static void
calculate_branch_probs (current_graph, block_num, branch_probs, last_line_num)
     struct bb_info_list *current_graph;
     int block_num;
     struct arcdata **branch_probs;
     int last_line_num;
{
  int total;
  struct adj_list *arcptr;
  struct arcdata *end_ptr, *a_ptr;

  total = current_graph->bb_graph[block_num].exec_count;
  for (arcptr = current_graph->bb_graph[block_num].succ; arcptr;
       arcptr = arcptr->succ_next)
    {
      /* Ignore fall through arcs as they aren't really branches.  */

      if (arcptr->fall_through)
	continue;
		      
      a_ptr = (struct arcdata *) xmalloc (sizeof (struct arcdata));
      if (total == 0)
	a_ptr->prob = -1;
      else
	a_ptr->prob = ((arcptr->arc_count * 100) + (total >> 1)) / total;
      a_ptr->call_insn = arcptr->fake;

      if (output_function_summary)
	{
	  if (a_ptr->call_insn)
	    {
	      function_calls++;
	      if (a_ptr->prob != -1)
		function_calls_executed++;
	    }
	  else
	    {
	      function_branches++;
	      if (a_ptr->prob != -1)
		function_branches_executed++;
	      if (a_ptr->prob > 0)
		function_branches_taken++;
	    }
	}

      /* Append the new branch to the end of the list.  */
      a_ptr->next = 0;
      if (! branch_probs[last_line_num])
	branch_probs[last_line_num] = a_ptr;
      else
	{
	  end_ptr = branch_probs[last_line_num];
	  while (end_ptr->next != 0)
	    end_ptr = end_ptr->next;
	  end_ptr->next = a_ptr;
	}
    }
}

/* Output summary info for a function.  */

static void
function_summary ()
{
  if (function_source_lines)
    fnotice (stdout, "%6.2f%% of %d source lines executed in function %s\n",
	     (((double) function_source_lines_executed / function_source_lines)
	      * 100), function_source_lines, function_name);
  else
    fnotice (stdout, "No executable source lines in function %s\n",
	     function_name);

  if (output_branch_probs)
    {
      if (function_branches)
	{
	  fnotice (stdout, "%6.2f%% of %d branches executed in function %s\n",
		   (((double) function_branches_executed / function_branches)
		    * 100), function_branches, function_name);
	  fnotice (stdout,
		"%6.2f%% of %d branches taken at least once in function %s\n",
		   (((double) function_branches_taken / function_branches)
		    * 100), function_branches, function_name);
	}
      else
	fnotice (stdout, "No branches in function %s\n", function_name);
      if (function_calls)
	fnotice (stdout, "%6.2f%% of %d calls executed in function %s\n",
		 (((double) function_calls_executed / function_calls)
		  * 100), function_calls, function_name);
      else
	fnotice (stdout, "No calls in function %s\n", function_name);
    }
}

/* Calculate line execution counts, and output the data to a .tcov file.  */

static void
output_data ()
{
  /* When scanning data, this is true only if the data applies to the
     current source file.  */
  int this_file;
  /* An array indexed by line number which indicates how many times that line
     was executed.  */
  long *line_counts;
  /* An array indexed by line number which indicates whether the line was
     present in the bb file (i.e. whether it had code associate with it).
     Lines never executed are those which both exist, and have zero execution
     counts.  */
  char *line_exists;
  /* An array indexed by line number, which contains a list of branch
     probabilities, one for each branch on that line.  */
  struct arcdata **branch_probs = NULL;
  struct sourcefile *s_ptr;
  char *source_file_name;
  FILE *source_file;
  struct bb_info_list *current_graph;
  int count;
  char *cptr;
  long block_num;
  long line_num;
  long last_line_num = 0;
  int i;
  struct arcdata *a_ptr;
  /* Buffer used for reading in lines from the source file.  */
  char string[STRING_SIZE];
  /* For calculating coverage at the file level.  */
  int total_source_lines;
  int total_source_lines_executed;
  int total_branches;
  int total_branches_executed;
  int total_branches_taken;
  int total_calls;
  int total_calls_executed;

  /* Now, for each source file, allocate an array big enough to hold a count
     for each line.  Scan through the bb_data, and when the file name matches
     the current file name, then for each following line number, increment
     the line number execution count indicated by the execution count of
     the appropriate basic block.  */

  for (s_ptr = sources; s_ptr; s_ptr = s_ptr->next)
    {
      /* If this is a relative file name, and an object directory has been
	 specified, then make it relative to the object directory name.  */
      if (*s_ptr->name != '/' && object_directory != 0
	  && *object_directory != '\0')
	{
	  int objdir_count = strlen (object_directory);
	  source_file_name = xmalloc (objdir_count + strlen (s_ptr->name) + 2);
	  strcpy (source_file_name, object_directory);
	  if (object_directory[objdir_count - 1] != '/')
	    source_file_name[objdir_count++] = '/';
	  strcpy (source_file_name + objdir_count, s_ptr->name);
	}
      else
	source_file_name = s_ptr->name;

      line_counts = (long *) xmalloc (sizeof (long) * s_ptr->maxlineno);
      bzero ((char *) line_counts, sizeof (long) * s_ptr->maxlineno);
      line_exists = xmalloc (s_ptr->maxlineno);
      bzero (line_exists, s_ptr->maxlineno);
      if (output_branch_probs)
	{
	  branch_probs = (struct arcdata **) xmalloc (sizeof (struct arcdata *)
						      * s_ptr->maxlineno);
	  bzero ((char *) branch_probs, 
		 sizeof (struct arcdata *) * s_ptr->maxlineno);
	}
      
      /* There will be a zero at the beginning of the bb info, before the
	 first list of line numbers, so must initialize block_num to 0.  */
      block_num = 0;
      this_file = 0;
      current_graph = 0;
      {
	/* Pointer into the bb_data, incremented while scanning the data.  */
	char *ptr = bb_data;
	for (count = 0; count < bb_data_size; count++)
	  {
	    long delim;

	    __fetch_long (&line_num, ptr, 4);
	    ptr += 4;
	    if (line_num == -1)
	      {
		/* Marks the beginning of a file name.  Check to see whether
		   this is the filename we are currently collecting data for.  */

		if (strcmp (s_ptr->name, ptr))
		  this_file = 0;
		else
		  this_file = 1;
	      
		/* Scan past the file name.  */
		do {
		  count++;
		  __fetch_long (&delim, ptr, 4);
		  ptr += 4;
		} while (delim != line_num);
	      }
	    else if (line_num == -2)
	      {
		/* Marks the start of a new function.  Advance to the next
		   program flow graph.  */

		if (! current_graph)
		  current_graph = bb_graph_list;
		else
		  {
		    if (block_num == current_graph->num_blocks - 1)
		      /* Last block falls through to exit.  */
		      ;
		    else if (block_num == current_graph->num_blocks - 2)
		      {
			if (output_branch_probs && this_file)
			  calculate_branch_probs (current_graph, block_num,
						  branch_probs, last_line_num);
		      }
		    else
		      {
			fnotice (stderr,
				 "didn't use all bb entries of graph, function %s\n",
				 function_name);
			fnotice (stderr, "block_num = %ld, num_blocks = %d\n",
				 block_num, current_graph->num_blocks);
		      }

		    current_graph = current_graph->next;
		    block_num = 0;

		    if (output_function_summary && this_file)
		      function_summary ();
		  }

		if (output_function_summary)
		  {
		    function_source_lines = 0;
		    function_source_lines_executed = 0;
		    function_branches = 0;
		    function_branches_executed = 0;
		    function_branches_taken = 0;
		    function_calls = 0;
		    function_calls_executed = 0;
		  }

		/* Save the function name for later use.  */
		function_name = ptr;

		/* Scan past the file name.  */
		do {
		  count++;
		  __fetch_long (&delim, ptr, 4);
		  ptr += 4;
		} while (delim != line_num);
	      }
	    else if (line_num == 0)
	      {
		/* Marks the end of a block.  */

		if (block_num >= current_graph->num_blocks)
		  {
		    fnotice (stderr, "ERROR: too many basic blocks in .bb file %s\n",
			     function_name);
		    abort ();
		  }
		  
		if (output_branch_probs && this_file)
		  calculate_branch_probs (current_graph, block_num,
					  branch_probs, last_line_num);

		block_num++;
	      }
	    else if (this_file)
	      {
		if (output_function_summary)
		  {
		    if (line_exists[line_num] == 0)
		      function_source_lines++;
		    if (line_counts[line_num] == 0
			&& current_graph->bb_graph[block_num].exec_count != 0)
		      function_source_lines_executed++;
		  }

		/* Accumulate execution data for this line number.  */

		line_counts[line_num]
		  += current_graph->bb_graph[block_num].exec_count;
		line_exists[line_num] = 1;
		last_line_num = line_num;
	      }
	  }
      }

      if (output_function_summary && this_file)
	function_summary ();

      /* Calculate summary test coverage statistics.  */

      total_source_lines = 0;
      total_source_lines_executed = 0;
      total_branches = 0;
      total_branches_executed = 0;
      total_branches_taken = 0;
      total_calls = 0;
      total_calls_executed = 0;

      for (count = 1; count < s_ptr->maxlineno; count++)
	{
	  if (line_exists[count])
	    {
	      total_source_lines++;
	      if (line_counts[count])
		total_source_lines_executed++;
	    }
	  if (output_branch_probs)
	    {
	      for (a_ptr = branch_probs[count]; a_ptr; a_ptr = a_ptr->next)
		{
		  if (a_ptr->call_insn)
		    {
		      total_calls++;
		      if (a_ptr->prob != -1)
			total_calls_executed++;
		    }
		  else
		    {
		      total_branches++;
		      if (a_ptr->prob != -1)
			total_branches_executed++;
		      if (a_ptr->prob > 0)
			total_branches_taken++;
		    }
		}
	    }
	}

      if (total_source_lines)
	fnotice (stdout,
		 "%6.2f%% of %d source lines executed in file %s\n",
		 (((double) total_source_lines_executed / total_source_lines)
		  * 100), total_source_lines, source_file_name);
      else
	fnotice (stdout, "No executable source lines in file %s\n",
		 source_file_name);

      if (output_branch_probs)
	{
	  if (total_branches)
	    {
	      fnotice (stdout, "%6.2f%% of %d branches executed in file %s\n",
		       (((double) total_branches_executed / total_branches)
			* 100), total_branches, source_file_name);
	      fnotice (stdout,
		    "%6.2f%% of %d branches taken at least once in file %s\n",
		       (((double) total_branches_taken / total_branches)
			* 100), total_branches, source_file_name);
	    }
	  else
	    fnotice (stdout, "No branches in file %s\n", source_file_name);
	  if (total_calls)
	    fnotice (stdout, "%6.2f%% of %d calls executed in file %s\n",
		     (((double) total_calls_executed / total_calls)
		      * 100), total_calls, source_file_name);
	  else
	    fnotice (stdout, "No calls in file %s\n", source_file_name);
	}

      if (output_gcov_file)
	{
	  /* Now the statistics are ready.  Read in the source file one line
	     at a time, and output that line to the gcov file preceded by
	     its execution count if non zero.  */
      
	  source_file = fopen (source_file_name, "r");
	  if (source_file == NULL)
	    {
	      fnotice (stderr, "Could not open source file %s.\n",
		       source_file_name);
	      free (line_counts);
	      free (line_exists);
	      continue;
	    }

	  count = strlen (source_file_name);
	  cptr = rindex (s_ptr->name, '/');
	  if (cptr)
	    cptr = cptr + 1;
	  else
	    cptr = s_ptr->name;
	  if (output_long_names && strcmp (cptr, input_file_name))
	    {
	      gcov_file_name = xmalloc (count + 7 + strlen (input_file_name));
	      
	      cptr = rindex (input_file_name, '/');
	      if (cptr)
		strcpy (gcov_file_name, cptr + 1);
	      else
		strcpy (gcov_file_name, input_file_name);

	      strcat (gcov_file_name, ".");

	      cptr = rindex (source_file_name, '/');
	      if (cptr)
		strcat (gcov_file_name, cptr + 1);
	      else
		strcat (gcov_file_name, source_file_name);
	    }
	  else
	    {
	      gcov_file_name = xmalloc (count + 6);
	      cptr = rindex (source_file_name, '/');
	      if (cptr)
		strcpy (gcov_file_name, cptr + 1);
	      else
		strcpy (gcov_file_name, source_file_name);
	    }

	  /* Don't strip off the ending for compatibility with tcov, since
	     this results in confusion if there is more than one file with
	     the same basename, e.g. tmp.c and tmp.h.  */
	  strcat (gcov_file_name, ".gcov");

	  gcov_file = fopen (gcov_file_name, "w");

	  if (gcov_file == NULL)
	    {
	      fnotice (stderr, "Could not open output file %s.\n",
		       gcov_file_name);
	      fclose (source_file);
	      free (line_counts);
	      free (line_exists);
	      continue;
	    }

	  fnotice (stdout, "Creating %s.\n", gcov_file_name);

	  for (count = 1; count < s_ptr->maxlineno; count++)
	    {
	      char *retval;
	      int len;

	      retval = fgets (string, STRING_SIZE, source_file);

	      /* For lines which don't exist in the .bb file, print nothing
		 before the source line.  For lines which exist but were never
		 executed, print ###### before the source line.  Otherwise,
		 print the execution count before the source line.  */
	      /* There are 16 spaces of indentation added before the source
		 line so that tabs won't be messed up.  */
	      if (line_exists[count])
		{
		  if (line_counts[count])
		    fprintf (gcov_file, "%12ld    %s", line_counts[count],
			     string);
		  else
		    fprintf (gcov_file, "      ######    %s", string);
		}
	      else
		fprintf (gcov_file, "\t\t%s", string);

	      /* In case the source file line is larger than our buffer, keep
		 reading and outputting lines until we get a newline.  */
	      len = strlen (string);
	      while ((len == 0 || string[strlen (string) - 1] != '\n')
		     && retval != NULL)
		{
		  retval = fgets (string, STRING_SIZE, source_file);
		  fputs (string, gcov_file);
		}

	      if (output_branch_probs)
		{
		  for (i = 0, a_ptr = branch_probs[count]; a_ptr;
		       a_ptr = a_ptr->next, i++)
		    {
		      if (a_ptr->call_insn)
			{
			  if (a_ptr->prob == -1)
			    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 (a_ptr->prob == -1)
			    fnotice (gcov_file, "branch %d never executed\n",
				     i);
			  else
			    fnotice (gcov_file, "branch %d taken = %d%%\n", i,
				     a_ptr->prob);
			}
		    }
		}

	      /* Gracefully handle errors while reading the source file.  */
	      if (retval == NULL)
		{
		  fnotice (stderr,
			   "Unexpected EOF while reading source file %s.\n",
			   source_file_name);
		  break;
		}
	    }

	  /* Handle all remaining source lines.  There may be lines
	     after the last line of code.  */

	  {
	    char *retval = fgets (string, STRING_SIZE, source_file);
	    while (retval != NULL)
	      {
		int len;

		fprintf (gcov_file, "\t\t%s", string);

		/* In case the source file line is larger than our buffer, keep
		   reading and outputting lines until we get a newline.  */
		len = strlen (string);
		while ((len == 0 || string[strlen (string) - 1] != '\n')
		       && retval != NULL)
		  {
		    retval = fgets (string, STRING_SIZE, source_file);
		    fputs (string, gcov_file);
		  }

		retval = fgets (string, STRING_SIZE, source_file);
	      }
	  }

	  fclose (source_file);
	  fclose (gcov_file);
	}

      free (line_counts);
      free (line_exists);
    }
}
