OSDN Git Service

Daily bump.
[pf3gnuchains/gcc-fork.git] / gcc / gcov-dump.c
index c7c31ad..e49cb3c 100644 (file)
@@ -1,10 +1,11 @@
 /* Dump a gcov file, for debugging use.
 /* Dump a gcov file, for debugging use.
-   Copyright (C) 2002 Free Software Foundation, Inc.
+   Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011,
+   2012 Free Software Foundation, Inc.
    Contributed by Nathan Sidwell <nathan@codesourcery.com>
 
 Gcov is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
    Contributed by Nathan Sidwell <nathan@codesourcery.com>
 
 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)
+the Free Software Foundation; either version 3, or (at your option)
 any later version.
 
 Gcov is distributed in the hope that it will be useful,
 any later version.
 
 Gcov is distributed in the hope that it will be useful,
@@ -13,31 +14,32 @@ 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
 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.  */
+along with Gcov; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
 
 #include "config.h"
 #include "system.h"
 #include "coretypes.h"
 #include "tm.h"
 #include "version.h"
 
 #include "config.h"
 #include "system.h"
 #include "coretypes.h"
 #include "tm.h"
 #include "version.h"
+#include "intl.h"
+#include "diagnostic.h"
 #include <getopt.h>
 #define IN_GCOV (-1)
 #include "gcov-io.h"
 #include "gcov-io.c"
 
 #include <getopt.h>
 #define IN_GCOV (-1)
 #include "gcov-io.h"
 #include "gcov-io.c"
 
-static void dump_file PARAMS ((const char *));
-static void print_prefix PARAMS ((const char *, unsigned, gcov_position_t));
-static void print_usage PARAMS ((void));
-static void print_version PARAMS ((void));
-static void tag_function PARAMS ((const char *, unsigned, unsigned));
-static void tag_blocks PARAMS ((const char *, unsigned, unsigned));
-static void tag_arcs PARAMS ((const char *, unsigned, unsigned));
-static void tag_lines PARAMS ((const char *, unsigned, unsigned));
-static void tag_counters PARAMS ((const char *, unsigned, unsigned));
-static void tag_summary PARAMS ((const char *, unsigned, unsigned));
-extern int main PARAMS ((int, char **));
+static void dump_file (const char *);
+static void print_prefix (const char *, unsigned, gcov_position_t);
+static void print_usage (void);
+static void print_version (void);
+static void tag_function (const char *, unsigned, unsigned);
+static void tag_blocks (const char *, unsigned, unsigned);
+static void tag_arcs (const char *, unsigned, unsigned);
+static void tag_lines (const char *, unsigned, unsigned);
+static void tag_counters (const char *, unsigned, unsigned);
+static void tag_summary (const char *, unsigned, unsigned);
+extern int main (int, char **);
 
 typedef struct tag_format
 {
 
 typedef struct tag_format
 {
@@ -55,6 +57,7 @@ static const struct option options[] =
   { "version",              no_argument,       NULL, 'v' },
   { "long",                 no_argument,       NULL, 'l' },
   { "positions",           no_argument,       NULL, 'o' },
   { "version",              no_argument,       NULL, 'v' },
   { "long",                 no_argument,       NULL, 'l' },
   { "positions",           no_argument,       NULL, 'o' },
+  { 0, 0, 0, 0 }
 };
 
 static const tag_format_t tag_table[] =
 };
 
 static const tag_format_t tag_table[] =
@@ -71,11 +74,25 @@ static const tag_format_t tag_table[] =
   {0, NULL, NULL}
 };
 
   {0, NULL, NULL}
 };
 
-int main (argc, argv)
-     int argc ATTRIBUTE_UNUSED;
-     char **argv;
+int
+main (int argc ATTRIBUTE_UNUSED, char **argv)
 {
   int opt;
 {
   int opt;
+  const char *p;
+
+  p = argv[0] + strlen (argv[0]);
+  while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
+    --p;
+  progname = p;
+
+  xmalloc_set_program_name (progname);
+
+  /* Unlock the stdio streams.  */
+  unlock_std_streams ();
+
+  gcc_init_libintl ();
+
+  diagnostic_initialize (global_dc, 0);
 
   while ((opt = getopt_long (argc, argv, "hlpv", options, NULL)) != -1)
     {
 
   while ((opt = getopt_long (argc, argv, "hlpv", options, NULL)) != -1)
     {
@@ -97,14 +114,14 @@ int main (argc, argv)
          fprintf (stderr, "unknown flag `%c'\n", opt);
        }
     }
          fprintf (stderr, "unknown flag `%c'\n", opt);
        }
     }
-  
+
   while (argv[optind])
     dump_file (argv[optind++]);
   return 0;
 }
 
 static void
   while (argv[optind])
     dump_file (argv[optind++]);
   return 0;
 }
 
 static void
-print_usage ()
+print_usage (void)
 {
   printf ("Usage: gcov-dump [OPTION] ... gcovfiles\n");
   printf ("Print coverage file contents\n");
 {
   printf ("Usage: gcov-dump [OPTION] ... gcovfiles\n");
   printf ("Print coverage file contents\n");
@@ -115,28 +132,20 @@ print_usage ()
 }
 
 static void
 }
 
 static void
-print_version ()
+print_version (void)
 {
 {
-  char v[4];
-  unsigned version = GCOV_VERSION;
-  unsigned ix;
-
-  for (ix = 4; ix--; version >>= 8)
-    v[ix] = version;
-  printf ("gcov %.4s (GCC %s)\n", v, version_string);
-  printf ("Copyright (C) 2002 Free Software Foundation, Inc.\n");
-  printf ("This is free software; see the source for copying conditions.  There is NO\n\
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n");
+  printf ("gcov-dump %s%s\n", pkgversion_string, version_string);
+  printf ("Copyright (C) 2012 Free Software Foundation, Inc.\n");
+  printf ("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");
 }
 
 static void
 }
 
 static void
-print_prefix (filename, depth, position)
-     const char *filename;
-     unsigned depth;
-     gcov_position_t position;
+print_prefix (const char *filename, unsigned depth, gcov_position_t position)
 {
   static const char prefix[] = "    ";
 {
   static const char prefix[] = "    ";
-  
+
   printf ("%s:", filename);
   if (flag_dump_positions)
     printf ("%lu:", (unsigned long) position);
   printf ("%s:", filename);
   if (flag_dump_positions)
     printf ("%lu:", (unsigned long) position);
@@ -144,48 +153,55 @@ print_prefix (filename, depth, position)
 }
 
 static void
 }
 
 static void
-dump_file (filename)
-     const char *filename;
+dump_file (const char *filename)
 {
   unsigned tags[4];
   unsigned depth = 0;
 {
   unsigned tags[4];
   unsigned depth = 0;
-  
+
   if (!gcov_open (filename, 1))
     {
       fprintf (stderr, "%s:cannot open\n", filename);
       return;
     }
   if (!gcov_open (filename, 1))
     {
       fprintf (stderr, "%s:cannot open\n", filename);
       return;
     }
-  
+
   /* magic */
   {
     unsigned magic = gcov_read_unsigned ();
   /* magic */
   {
     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];
-    unsigned expected = GCOV_VERSION;
-    unsigned ix;
-    int different = version != GCOV_VERSION;
-    
-    if (magic == GCOV_DATA_MAGIC)
+    int endianness = 0;
+    char m[4], v[4];
+
+    if ((endianness = gcov_magic (magic, GCOV_DATA_MAGIC)))
       type = "data";
       type = "data";
-    else if (magic == GCOV_GRAPH_MAGIC)
-      type = "graph";
+    else if ((endianness = gcov_magic (magic, GCOV_NOTE_MAGIC)))
+      type = "note";
     else
       {
        printf ("%s:not a gcov file\n", filename);
        gcov_close ();
        return;
       }
     else
       {
        printf ("%s:not a gcov file\n", filename);
        gcov_close ();
        return;
       }
-    for (ix = 4; ix--; expected >>= 8, version >>= 8, magic >>= 8)
+    version = gcov_read_unsigned ();
+    GCOV_UNSIGNED2STRING (v, version);
+    GCOV_UNSIGNED2STRING (m, magic);
+
+    printf ("%s:%s:magic `%.4s':version `%.4s'%s\n", filename, type,
+           m, v, endianness < 0 ? " (swapped endianness)" : "");
+    if (version != GCOV_VERSION)
       {
       {
-       e[ix] = expected;
-       v[ix] = version;
-       m[ix] = magic;
+       char e[4];
+
+       GCOV_UNSIGNED2STRING (e, GCOV_VERSION);
+       printf ("%s:warning:current version is `%.4s'\n", filename, e);
       }
       }
-    
-    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 */
+  {
+    unsigned stamp = gcov_read_unsigned ();
+
+    printf ("%s:stamp %lu\n", filename, (unsigned long)stamp);
   }
 
   while (1)
   }
 
   while (1)
@@ -228,17 +244,17 @@ dump_file (filename)
          depth = tag_depth;
          tags[depth - 1] = tag;
        }
          depth = tag_depth;
          tags[depth - 1] = tag;
        }
-      
+
       print_prefix (filename, tag_depth, position);
       printf ("%08x:%4u:%s", tag, length, format->name);
       if (format->proc)
        (*format->proc) (filename, tag, length);
       print_prefix (filename, tag_depth, position);
       printf ("%08x:%4u:%s", tag, length, format->name);
       if (format->proc)
        (*format->proc) (filename, tag, length);
-      
+
       printf ("\n");
       if (flag_dump_contents && format->proc)
        {
          unsigned long actual_length = gcov_position () - base;
       printf ("\n");
       if (flag_dump_contents && format->proc)
        {
          unsigned long actual_length = gcov_position () - base;
-         
+
          if (actual_length > length)
            printf ("%s:record size mismatch %lu bytes overread\n",
                    filename, actual_length - length);
          if (actual_length > length)
            printf ("%s:record size mismatch %lu bytes overread\n",
                    filename, actual_length - length);
@@ -255,42 +271,42 @@ dump_file (filename)
          break;
        }
     }
          break;
        }
     }
-  if (!gcov_is_eof ())
-    printf ("%s:early end of file\n", filename);
   gcov_close ();
 }
 
 static void
   gcov_close ();
 }
 
 static void
-tag_function (filename, tag, length)
-     const char *filename ATTRIBUTE_UNUSED;
-     unsigned tag ATTRIBUTE_UNUSED;
-     unsigned length ATTRIBUTE_UNUSED;
+tag_function (const char *filename ATTRIBUTE_UNUSED,
+             unsigned tag ATTRIBUTE_UNUSED, unsigned length)
 {
   unsigned long pos = gcov_position ();
 {
   unsigned long pos = gcov_position ();
-  
-  printf (" ident=%u", gcov_read_unsigned ());
-  printf (", checksum=0x%08x", gcov_read_unsigned ());
 
 
-  if (gcov_position () - pos < length)
+  if (!length)
+    printf (" placeholder");
+  else
     {
     {
-      const char *name;
-      
-      name = gcov_read_string ();
-      printf (", `%s'", name ? name : "NULL");
-      name = gcov_read_string ();
-      printf (" %s", name ? name : "NULL");
-      printf (":%u", gcov_read_unsigned ());
+      printf (" ident=%u", gcov_read_unsigned ());
+      printf (", lineno_checksum=0x%08x", gcov_read_unsigned ());
+      printf (", cfg_checksum=0x%08x", gcov_read_unsigned ());
+
+      if (gcov_position () - pos < length)
+       {
+         const char *name;
+         
+         name = gcov_read_string ();
+         printf (", `%s'", name ? name : "NULL");
+         name = gcov_read_string ();
+         printf (" %s", name ? name : "NULL");
+         printf (":%u", gcov_read_unsigned ());
+       }
     }
 }
 
 static void
     }
 }
 
 static void
-tag_blocks (filename, tag, length)
-     const char *filename ATTRIBUTE_UNUSED;
-     unsigned tag ATTRIBUTE_UNUSED;
-     unsigned length ATTRIBUTE_UNUSED;
+tag_blocks (const char *filename ATTRIBUTE_UNUSED,
+           unsigned tag ATTRIBUTE_UNUSED, unsigned length ATTRIBUTE_UNUSED)
 {
 {
-  unsigned n_blocks = length / 4;
-  
+  unsigned n_blocks = GCOV_TAG_BLOCKS_NUM (length);
+
   printf (" %u blocks", n_blocks);
 
   if (flag_dump_contents)
   printf (" %u blocks", n_blocks);
 
   if (flag_dump_contents)
@@ -311,12 +327,10 @@ tag_blocks (filename, tag, length)
 }
 
 static void
 }
 
 static void
-tag_arcs (filename, tag, length)
-     const char *filename ATTRIBUTE_UNUSED;
-     unsigned tag ATTRIBUTE_UNUSED;
-     unsigned length ATTRIBUTE_UNUSED;
+tag_arcs (const char *filename ATTRIBUTE_UNUSED,
+         unsigned tag ATTRIBUTE_UNUSED, unsigned length ATTRIBUTE_UNUSED)
 {
 {
-  unsigned n_arcs = (length - 4) / 8;
+  unsigned n_arcs = GCOV_TAG_ARCS_NUM (length);
 
   printf (" %u arcs", n_arcs);
   if (flag_dump_contents)
 
   printf (" %u arcs", n_arcs);
   if (flag_dump_contents)
@@ -327,7 +341,7 @@ tag_arcs (filename, tag, length)
       for (ix = 0; ix != n_arcs; ix++)
        {
          unsigned dst, flags;
       for (ix = 0; ix != n_arcs; ix++)
        {
          unsigned dst, flags;
-         
+
          if (!(ix & 3))
            {
              printf ("\n");
          if (!(ix & 3))
            {
              printf ("\n");
@@ -337,15 +351,25 @@ tag_arcs (filename, tag, length)
          dst = gcov_read_unsigned ();
          flags = gcov_read_unsigned ();
          printf (" %u:%04x", dst, flags);
          dst = gcov_read_unsigned ();
          flags = gcov_read_unsigned ();
          printf (" %u:%04x", dst, flags);
+         if (flags)
+           {
+             char c = '(';
+             
+             if (flags & GCOV_ARC_ON_TREE)
+               printf ("%ctree", c), c = ',';
+             if (flags & GCOV_ARC_FAKE)
+               printf ("%cfake", c), c = ',';
+             if (flags & GCOV_ARC_FALLTHROUGH)
+               printf ("%cfall", c), c = ',';
+             printf (")");
+           }
        }
     }
 }
 
 static void
        }
     }
 }
 
 static void
-tag_lines (filename, tag, length)
-     const char *filename ATTRIBUTE_UNUSED;
-     unsigned tag ATTRIBUTE_UNUSED;
-     unsigned length ATTRIBUTE_UNUSED;
+tag_lines (const char *filename ATTRIBUTE_UNUSED,
+          unsigned tag ATTRIBUTE_UNUSED, unsigned length ATTRIBUTE_UNUSED)
 {
   if (flag_dump_contents)
     {
 {
   if (flag_dump_contents)
     {
@@ -357,7 +381,7 @@ tag_lines (filename, tag, length)
          gcov_position_t position = gcov_position ();
          const char *source = NULL;
          unsigned lineno = gcov_read_unsigned ();
          gcov_position_t position = gcov_position ();
          const char *source = NULL;
          unsigned lineno = gcov_read_unsigned ();
-         
+
          if (!lineno)
            {
              source = gcov_read_string ();
          if (!lineno)
            {
              source = gcov_read_string ();
@@ -365,7 +389,7 @@ tag_lines (filename, tag, length)
                break;
              sep = NULL;
            }
                break;
              sep = NULL;
            }
-         
+
          if (!sep)
            {
              printf ("\n");
          if (!sep)
            {
              printf ("\n");
@@ -388,14 +412,12 @@ tag_lines (filename, tag, length)
 }
 
 static void
 }
 
 static void
-tag_counters (filename, tag, length)
-     const char *filename ATTRIBUTE_UNUSED;
-     unsigned tag ATTRIBUTE_UNUSED;
-     unsigned length ATTRIBUTE_UNUSED;
+tag_counters (const char *filename ATTRIBUTE_UNUSED,
+             unsigned tag ATTRIBUTE_UNUSED, unsigned length ATTRIBUTE_UNUSED)
 {
   static const char *const counter_names[] = GCOV_COUNTER_NAMES;
 {
   static const char *const counter_names[] = GCOV_COUNTER_NAMES;
-  unsigned n_counts = length / 8;
-  
+  unsigned n_counts = GCOV_TAG_COUNTER_NUM (length);
+
   printf (" %s %u counts",
          counter_names[GCOV_COUNTER_FOR_TAG (tag)], n_counts);
   if (flag_dump_contents)
   printf (" %s %u counts",
          counter_names[GCOV_COUNTER_FOR_TAG (tag)], n_counts);
   if (flag_dump_contents)
@@ -405,14 +427,14 @@ tag_counters (filename, tag, length)
       for (ix = 0; ix != n_counts; ix++)
        {
          gcov_type count;
       for (ix = 0; ix != n_counts; ix++)
        {
          gcov_type count;
-         
+
          if (!(ix & 7))
            {
              printf ("\n");
              print_prefix (filename, 0, gcov_position ());
              printf ("\t\t%u", ix);
            }
          if (!(ix & 7))
            {
              printf ("\n");
              print_prefix (filename, 0, gcov_position ());
              printf ("\t\t%u", ix);
            }
-         
+
          count = gcov_read_counter ();
          printf (" ");
          printf (HOST_WIDEST_INT_PRINT_DEC, count);
          count = gcov_read_counter ();
          printf (" ");
          printf (HOST_WIDEST_INT_PRINT_DEC, count);
@@ -421,24 +443,22 @@ tag_counters (filename, tag, length)
 }
 
 static void
 }
 
 static void
-tag_summary (filename, tag, length)
-     const char *filename ATTRIBUTE_UNUSED;
-     unsigned tag ATTRIBUTE_UNUSED;
-     unsigned length ATTRIBUTE_UNUSED;
+tag_summary (const char *filename ATTRIBUTE_UNUSED,
+            unsigned tag ATTRIBUTE_UNUSED, unsigned length ATTRIBUTE_UNUSED)
 {
   struct gcov_summary summary;
   unsigned ix;
 {
   struct gcov_summary summary;
   unsigned ix;
-  
+
   gcov_read_summary (&summary);
   printf (" checksum=0x%08x", summary.checksum);
   gcov_read_summary (&summary);
   printf (" checksum=0x%08x", summary.checksum);
-  
-  for (ix = 0; ix != GCOV_COUNTERS; ix++)
+
+  for (ix = 0; ix != GCOV_COUNTERS_SUMMABLE; ix++)
     {
       printf ("\n");
       print_prefix (filename, 0, 0);
       printf ("\t\tcounts=%u, runs=%u",
              summary.ctrs[ix].num, summary.ctrs[ix].runs);
     {
       printf ("\n");
       print_prefix (filename, 0, 0);
       printf ("\t\tcounts=%u, runs=%u",
              summary.ctrs[ix].num, summary.ctrs[ix].runs);
-      
+
       printf (", sum_all=" HOST_WIDEST_INT_PRINT_DEC,
              (HOST_WIDEST_INT)summary.ctrs[ix].sum_all);
       printf (", run_max=" HOST_WIDEST_INT_PRINT_DEC,
       printf (", sum_all=" HOST_WIDEST_INT_PRINT_DEC,
              (HOST_WIDEST_INT)summary.ctrs[ix].sum_all);
       printf (", run_max=" HOST_WIDEST_INT_PRINT_DEC,