OSDN Git Service

* config/rs6000/darwin.h (SUBTARGET_OPTIONS): Move from here, to...
[pf3gnuchains/gcc-fork.git] / gcc / gcov.c
index 4c9af4d..c988730 100644 (file)
@@ -1,7 +1,7 @@
 /* Gcov.c: prepend line execution counts and branch probabilities to a
    source file.
    Copyright (C) 1990, 1991, 1992, 1993, 1994, 1996, 1997, 1998,
 /* 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 Free Software Foundation, Inc.
+   1999, 2000, 2001, 2002, 2003, 2004 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>
    Contributed by James E. Wilson of Cygnus Support.
    Mangled by Bob Manson of Cygnus Support.
    Mangled further by Nathan Sidwell <nathan@codesourcery.com>
@@ -82,6 +82,8 @@ typedef struct arc_info
 
   /* transition counts.  */
   gcov_type count;
 
   /* transition counts.  */
   gcov_type count;
+  /* used in cycle search, so that we do not clobber original counts.  */
+  gcov_type cs_count;
 
   unsigned int count_valid : 1;
   unsigned int on_tree : 1;
 
   unsigned int count_valid : 1;
   unsigned int on_tree : 1;
@@ -418,11 +420,12 @@ static void
 print_version (void)
 {
   fnotice (stdout, "gcov (GCC) %s\n", version_string);
 print_version (void)
 {
   fnotice (stdout, "gcov (GCC) %s\n", version_string);
-  fnotice (stdout, "Copyright (C) 2003 Free Software Foundation, Inc.\n");
+  fprintf (stdout, "Copyright %s 2004 Free Software Foundation, Inc.\n",
+          _("(C)"));
   fnotice (stdout,
   fnotice (stdout,
-          "This is free software; see the source for copying conditions.\n"
-          "There is NO warranty; not even for MERCHANTABILITY or \n"
-          "FITNESS FOR A PARTICULAR PURPOSE.\n\n");
+          _("This is free software; see the source for copying conditions.\n"
+            "There is NO warranty; not even for MERCHANTABILITY or \n"
+            "FITNESS FOR A PARTICULAR PURPOSE.\n\n"));
   exit (SUCCESS_EXIT_CODE);
 }
 
   exit (SUCCESS_EXIT_CODE);
 }
 
@@ -893,18 +896,16 @@ read_graph_file (void)
        }
       gcov_sync (base, length);
       if (gcov_is_error ())
        }
       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_close ();
 
-  /* We built everything backwards, so nreverse them all */
+  /* We built everything backwards, so nreverse them all */
 
   /* Reverse sources. Not strictly necessary, but we'll then process
      them in the 'expected' order.  */
 
   /* Reverse sources. Not strictly necessary, but we'll then process
      them in the 'expected' order.  */
@@ -1052,14 +1053,11 @@ read_count_file (void)
        }
       gcov_sync (base, length);
       if ((error = gcov_is_error ()))
        }
       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 ();
     }
 
   gcov_close ();
@@ -1388,7 +1386,7 @@ function_summary (const coverage_t *coverage, const char *title)
             format_gcov (coverage->lines_executed, coverage->lines, 2),
             coverage->lines);
   else
             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 (flag_branches)
     {
@@ -1622,6 +1620,10 @@ accumulate_line_counts (source_t *src)
                  if (flag_branches)
                    add_branch_counts (&src->coverage, arc);
                }
                  if (flag_branches)
                    add_branch_counts (&src->coverage, arc);
                }
+
+             /* Initialize the cs_count.  */
+             for (arc = block->succ; arc; arc = arc->succ_next)
+               arc->cs_count = arc->count;
            }
 
          /* Find the loops. This uses the algorithm described in
            }
 
          /* Find the loops. This uses the algorithm described in
@@ -1638,7 +1640,8 @@ accumulate_line_counts (source_t *src)
 
             For each loop we find, locate the arc with the smallest
             transition count, and add that to the cumulative
 
             For each loop we find, locate the arc with the smallest
             transition count, and add that to the cumulative
-            count. Remove the arc from consideration.  */
+            count.  Decrease flow over the cycle and remove the arc
+            from consideration.  */
          for (block = line->u.blocks; block; block = block->chain)
            {
              block_t *head = block;
          for (block = line->u.blocks; block; block = block->chain)
            {
              block_t *head = block;
@@ -1664,25 +1667,33 @@ accumulate_line_counts (source_t *src)
                  if (dst == block)
                    {
                      /* Found a closing arc.  */
                  if (dst == block)
                    {
                      /* Found a closing arc.  */
-                     gcov_type cycle_count = arc->count;
+                     gcov_type cycle_count = arc->cs_count;
                      arc_t *cycle_arc = arc;
                      arc_t *probe_arc;
 
                      /* Locate the smallest arc count of the loop.  */
                      for (dst = head; (probe_arc = dst->u.cycle.arc);
                           dst = probe_arc->src)
                      arc_t *cycle_arc = arc;
                      arc_t *probe_arc;
 
                      /* Locate the smallest arc count of the loop.  */
                      for (dst = head; (probe_arc = dst->u.cycle.arc);
                           dst = probe_arc->src)
-                       if (cycle_count > probe_arc->count)
+                       if (cycle_count > probe_arc->cs_count)
                          {
                          {
-                           cycle_count = probe_arc->count;
+                           cycle_count = probe_arc->cs_count;
                            cycle_arc = probe_arc;
                          }
 
                      count += cycle_count;
                      cycle_arc->cycle = 1;
                            cycle_arc = probe_arc;
                          }
 
                      count += cycle_count;
                      cycle_arc->cycle = 1;
+
+                     /* Remove the flow from the cycle.  */
+                     arc->cs_count -= cycle_count;
+                     for (dst = head; (probe_arc = dst->u.cycle.arc);
+                          dst = probe_arc->src)
+                       probe_arc->cs_count -= cycle_count;
+
                      /* Unwind to the cyclic arc.  */
                      while (head != cycle_arc->src)
                        {
                          arc = head->u.cycle.arc;
                      /* Unwind to the cyclic arc.  */
                      while (head != cycle_arc->src)
                        {
                          arc = head->u.cycle.arc;
+                         head->u.cycle.arc = NULL;
                          head = arc->src;
                        }
                      /* Move on.  */
                          head = arc->src;
                        }
                      /* Move on.  */
@@ -1722,7 +1733,7 @@ accumulate_line_counts (source_t *src)
     }
 }
 
     }
 }
 
-/* Ouput information about ARC number IX.  Returns nonzero if
+/* Output information about ARC number IX.  Returns nonzero if
    anything is output.  */
 
 static int
    anything is output.  */
 
 static int