xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/gcov-dump.c (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
11debfc3dSmrg /* Dump a gcov file, for debugging use.
2*8feb0f0bSmrg    Copyright (C) 2002-2020 Free Software Foundation, Inc.
31debfc3dSmrg    Contributed by Nathan Sidwell <nathan@codesourcery.com>
41debfc3dSmrg 
51debfc3dSmrg Gcov is free software; you can redistribute it and/or modify
61debfc3dSmrg it under the terms of the GNU General Public License as published by
71debfc3dSmrg the Free Software Foundation; either version 3, or (at your option)
81debfc3dSmrg any later version.
91debfc3dSmrg 
101debfc3dSmrg Gcov is distributed in the hope that it will be useful,
111debfc3dSmrg but WITHOUT ANY WARRANTY; without even the implied warranty of
121debfc3dSmrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
131debfc3dSmrg GNU General Public License for more details.
141debfc3dSmrg 
151debfc3dSmrg You should have received a copy of the GNU General Public License
161debfc3dSmrg along with Gcov; see the file COPYING3.  If not see
171debfc3dSmrg <http://www.gnu.org/licenses/>.  */
181debfc3dSmrg 
191debfc3dSmrg #include "config.h"
201debfc3dSmrg #include "system.h"
211debfc3dSmrg #include "coretypes.h"
221debfc3dSmrg #include "tm.h"
231debfc3dSmrg #include "version.h"
241debfc3dSmrg #include "intl.h"
251debfc3dSmrg #include "diagnostic.h"
261debfc3dSmrg #include <getopt.h>
271debfc3dSmrg #define IN_GCOV (-1)
281debfc3dSmrg #include "gcov-io.h"
291debfc3dSmrg #include "gcov-io.c"
301debfc3dSmrg 
311debfc3dSmrg static void dump_gcov_file (const char *);
321debfc3dSmrg static void print_prefix (const char *, unsigned, gcov_position_t);
331debfc3dSmrg static void print_usage (void);
341debfc3dSmrg static void print_version (void);
35a2dc1f3fSmrg static void tag_function (const char *, unsigned, unsigned, unsigned);
36a2dc1f3fSmrg static void tag_blocks (const char *, unsigned, unsigned, unsigned);
37a2dc1f3fSmrg static void tag_arcs (const char *, unsigned, unsigned, unsigned);
38a2dc1f3fSmrg static void tag_lines (const char *, unsigned, unsigned, unsigned);
39a2dc1f3fSmrg static void tag_counters (const char *, unsigned, unsigned, unsigned);
40a2dc1f3fSmrg static void tag_summary (const char *, unsigned, unsigned, unsigned);
411debfc3dSmrg extern int main (int, char **);
421debfc3dSmrg 
431debfc3dSmrg typedef struct tag_format
441debfc3dSmrg {
451debfc3dSmrg   unsigned tag;
461debfc3dSmrg   char const *name;
47a2dc1f3fSmrg   void (*proc) (const char *, unsigned, unsigned, unsigned);
481debfc3dSmrg } tag_format_t;
491debfc3dSmrg 
501debfc3dSmrg static int flag_dump_contents = 0;
511debfc3dSmrg static int flag_dump_positions = 0;
521debfc3dSmrg 
531debfc3dSmrg static const struct option options[] =
541debfc3dSmrg {
551debfc3dSmrg   { "help",                 no_argument,       NULL, 'h' },
561debfc3dSmrg   { "version",              no_argument,       NULL, 'v' },
571debfc3dSmrg   { "long",                 no_argument,       NULL, 'l' },
581debfc3dSmrg   { "positions",	    no_argument,       NULL, 'o' },
591debfc3dSmrg   { 0, 0, 0, 0 }
601debfc3dSmrg };
611debfc3dSmrg 
62a2dc1f3fSmrg #define VALUE_PADDING_PREFIX "              "
63a2dc1f3fSmrg #define VALUE_PREFIX "%2d: "
64a2dc1f3fSmrg 
651debfc3dSmrg static const tag_format_t tag_table[] =
661debfc3dSmrg {
671debfc3dSmrg   {0, "NOP", NULL},
681debfc3dSmrg   {0, "UNKNOWN", NULL},
691debfc3dSmrg   {0, "COUNTERS", tag_counters},
701debfc3dSmrg   {GCOV_TAG_FUNCTION, "FUNCTION", tag_function},
711debfc3dSmrg   {GCOV_TAG_BLOCKS, "BLOCKS", tag_blocks},
721debfc3dSmrg   {GCOV_TAG_ARCS, "ARCS", tag_arcs},
731debfc3dSmrg   {GCOV_TAG_LINES, "LINES", tag_lines},
741debfc3dSmrg   {GCOV_TAG_OBJECT_SUMMARY, "OBJECT_SUMMARY", tag_summary},
751debfc3dSmrg   {0, NULL, NULL}
761debfc3dSmrg };
771debfc3dSmrg 
781debfc3dSmrg int
main(int argc ATTRIBUTE_UNUSED,char ** argv)791debfc3dSmrg main (int argc ATTRIBUTE_UNUSED, char **argv)
801debfc3dSmrg {
811debfc3dSmrg   int opt;
821debfc3dSmrg   const char *p;
831debfc3dSmrg 
841debfc3dSmrg   p = argv[0] + strlen (argv[0]);
851debfc3dSmrg   while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
861debfc3dSmrg     --p;
871debfc3dSmrg   progname = p;
881debfc3dSmrg 
891debfc3dSmrg   xmalloc_set_program_name (progname);
901debfc3dSmrg 
911debfc3dSmrg   /* Unlock the stdio streams.  */
921debfc3dSmrg   unlock_std_streams ();
931debfc3dSmrg 
941debfc3dSmrg   gcc_init_libintl ();
951debfc3dSmrg 
961debfc3dSmrg   diagnostic_initialize (global_dc, 0);
971debfc3dSmrg 
981debfc3dSmrg   while ((opt = getopt_long (argc, argv, "hlpvw", options, NULL)) != -1)
991debfc3dSmrg     {
1001debfc3dSmrg       switch (opt)
1011debfc3dSmrg 	{
1021debfc3dSmrg 	case 'h':
1031debfc3dSmrg 	  print_usage ();
1041debfc3dSmrg 	  break;
1051debfc3dSmrg 	case 'v':
1061debfc3dSmrg 	  print_version ();
1071debfc3dSmrg 	  break;
1081debfc3dSmrg 	case 'l':
1091debfc3dSmrg 	  flag_dump_contents = 1;
1101debfc3dSmrg 	  break;
1111debfc3dSmrg 	case 'p':
1121debfc3dSmrg 	  flag_dump_positions = 1;
1131debfc3dSmrg 	  break;
1141debfc3dSmrg 	default:
1151debfc3dSmrg 	  fprintf (stderr, "unknown flag `%c'\n", opt);
1161debfc3dSmrg 	}
1171debfc3dSmrg     }
1181debfc3dSmrg 
1191debfc3dSmrg   while (argv[optind])
1201debfc3dSmrg     dump_gcov_file (argv[optind++]);
1211debfc3dSmrg   return 0;
1221debfc3dSmrg }
1231debfc3dSmrg 
1241debfc3dSmrg static void
print_usage(void)1251debfc3dSmrg print_usage (void)
1261debfc3dSmrg {
1271debfc3dSmrg   printf ("Usage: gcov-dump [OPTION] ... gcovfiles\n");
1281debfc3dSmrg   printf ("Print coverage file contents\n");
1291debfc3dSmrg   printf ("  -h, --help           Print this help\n");
1301debfc3dSmrg   printf ("  -l, --long           Dump record contents too\n");
1311debfc3dSmrg   printf ("  -p, --positions      Dump record positions\n");
1321debfc3dSmrg   printf ("  -v, --version        Print version number\n");
1331debfc3dSmrg   printf ("\nFor bug reporting instructions, please see:\n%s.\n",
1341debfc3dSmrg 	   bug_report_url);
1351debfc3dSmrg }
1361debfc3dSmrg 
1371debfc3dSmrg static void
print_version(void)1381debfc3dSmrg print_version (void)
1391debfc3dSmrg {
1401debfc3dSmrg   printf ("gcov-dump %s%s\n", pkgversion_string, version_string);
141*8feb0f0bSmrg   printf ("Copyright (C) 2020 Free Software Foundation, Inc.\n");
1421debfc3dSmrg   printf ("This is free software; see the source for copying conditions.\n"
1431debfc3dSmrg   	  "There is NO warranty; not even for MERCHANTABILITY or \n"
1441debfc3dSmrg 	  "FITNESS FOR A PARTICULAR PURPOSE.\n\n");
1451debfc3dSmrg }
1461debfc3dSmrg 
1471debfc3dSmrg static void
print_prefix(const char * filename,unsigned depth,gcov_position_t position)1481debfc3dSmrg print_prefix (const char *filename, unsigned depth, gcov_position_t position)
1491debfc3dSmrg {
1501debfc3dSmrg   static const char prefix[] = "    ";
1511debfc3dSmrg 
1521debfc3dSmrg   printf ("%s:", filename);
1531debfc3dSmrg   if (flag_dump_positions)
154a2dc1f3fSmrg     printf ("%5lu:", (unsigned long) position);
155a2dc1f3fSmrg   printf ("%.*s", (int) 2 * depth, prefix);
1561debfc3dSmrg }
1571debfc3dSmrg 
1581debfc3dSmrg static void
dump_gcov_file(const char * filename)1591debfc3dSmrg dump_gcov_file (const char *filename)
1601debfc3dSmrg {
1611debfc3dSmrg   unsigned tags[4];
1621debfc3dSmrg   unsigned depth = 0;
163a2dc1f3fSmrg   bool is_data_type;
1641debfc3dSmrg 
1651debfc3dSmrg   if (!gcov_open (filename, 1))
1661debfc3dSmrg     {
1671debfc3dSmrg       fprintf (stderr, "%s:cannot open\n", filename);
1681debfc3dSmrg       return;
1691debfc3dSmrg     }
1701debfc3dSmrg 
1711debfc3dSmrg   /* magic */
1721debfc3dSmrg   {
1731debfc3dSmrg     unsigned magic = gcov_read_unsigned ();
1741debfc3dSmrg     unsigned version;
1751debfc3dSmrg     int endianness = 0;
1761debfc3dSmrg     char m[4], v[4];
1771debfc3dSmrg 
1781debfc3dSmrg     if ((endianness = gcov_magic (magic, GCOV_DATA_MAGIC)))
179a2dc1f3fSmrg       is_data_type = true;
1801debfc3dSmrg     else if ((endianness = gcov_magic (magic, GCOV_NOTE_MAGIC)))
181a2dc1f3fSmrg       is_data_type = false;
1821debfc3dSmrg     else
1831debfc3dSmrg       {
1841debfc3dSmrg 	printf ("%s:not a gcov file\n", filename);
1851debfc3dSmrg 	gcov_close ();
1861debfc3dSmrg 	return;
1871debfc3dSmrg       }
1881debfc3dSmrg     version = gcov_read_unsigned ();
1891debfc3dSmrg     GCOV_UNSIGNED2STRING (v, version);
1901debfc3dSmrg     GCOV_UNSIGNED2STRING (m, magic);
1911debfc3dSmrg 
192a2dc1f3fSmrg     printf ("%s:%s:magic `%.4s':version `%.4s'%s\n", filename,
193a2dc1f3fSmrg 	    is_data_type ? "data" : "note",
1941debfc3dSmrg  	    m, v, endianness < 0 ? " (swapped endianness)" : "");
1951debfc3dSmrg     if (version != GCOV_VERSION)
1961debfc3dSmrg       {
1971debfc3dSmrg 	char e[4];
1981debfc3dSmrg 
1991debfc3dSmrg 	GCOV_UNSIGNED2STRING (e, GCOV_VERSION);
2001debfc3dSmrg 	printf ("%s:warning:current version is `%.4s'\n", filename, e);
2011debfc3dSmrg       }
2021debfc3dSmrg   }
2031debfc3dSmrg 
2041debfc3dSmrg   /* stamp */
2051debfc3dSmrg   {
2061debfc3dSmrg     unsigned stamp = gcov_read_unsigned ();
2071debfc3dSmrg 
2081debfc3dSmrg     printf ("%s:stamp %lu\n", filename, (unsigned long)stamp);
2091debfc3dSmrg   }
2101debfc3dSmrg 
211a2dc1f3fSmrg   if (!is_data_type)
212a2dc1f3fSmrg     {
213c0a68be4Smrg       printf ("%s:cwd: %s\n", filename, gcov_read_string ());
214c0a68be4Smrg 
215a2dc1f3fSmrg       /* Support for unexecuted basic blocks.  */
216a2dc1f3fSmrg       unsigned support_unexecuted_blocks = gcov_read_unsigned ();
217a2dc1f3fSmrg       if (!support_unexecuted_blocks)
218a2dc1f3fSmrg 	printf ("%s: has_unexecuted_block is not supported\n", filename);
219a2dc1f3fSmrg     }
220a2dc1f3fSmrg 
2211debfc3dSmrg   while (1)
2221debfc3dSmrg     {
2231debfc3dSmrg       gcov_position_t base, position = gcov_position ();
2241debfc3dSmrg       unsigned tag, length;
2251debfc3dSmrg       tag_format_t const *format;
2261debfc3dSmrg       unsigned tag_depth;
2271debfc3dSmrg       int error;
2281debfc3dSmrg       unsigned mask;
2291debfc3dSmrg 
2301debfc3dSmrg       tag = gcov_read_unsigned ();
2311debfc3dSmrg       if (!tag)
2321debfc3dSmrg 	break;
2331debfc3dSmrg       length = gcov_read_unsigned ();
2341debfc3dSmrg       base = gcov_position ();
2351debfc3dSmrg       mask = GCOV_TAG_MASK (tag) >> 1;
2361debfc3dSmrg       for (tag_depth = 4; mask; mask >>= 8)
2371debfc3dSmrg 	{
2381debfc3dSmrg 	  if ((mask & 0xff) != 0xff)
2391debfc3dSmrg 	    {
2401debfc3dSmrg 	      printf ("%s:tag `%08x' is invalid\n", filename, tag);
2411debfc3dSmrg 	      break;
2421debfc3dSmrg 	    }
2431debfc3dSmrg 	  tag_depth--;
2441debfc3dSmrg 	}
2451debfc3dSmrg       for (format = tag_table; format->name; format++)
2461debfc3dSmrg 	if (format->tag == tag)
2471debfc3dSmrg 	  goto found;
2481debfc3dSmrg       format = &tag_table[GCOV_TAG_IS_COUNTER (tag) ? 2 : 1];
2491debfc3dSmrg     found:;
2501debfc3dSmrg       if (tag)
2511debfc3dSmrg 	{
2521debfc3dSmrg 	  if (depth && depth < tag_depth)
2531debfc3dSmrg 	    {
2541debfc3dSmrg 	      if (!GCOV_TAG_IS_SUBTAG (tags[depth - 1], tag))
2551debfc3dSmrg 		printf ("%s:tag `%08x' is incorrectly nested\n",
2561debfc3dSmrg 			filename, tag);
2571debfc3dSmrg 	    }
2581debfc3dSmrg 	  depth = tag_depth;
2591debfc3dSmrg 	  tags[depth - 1] = tag;
2601debfc3dSmrg 	}
2611debfc3dSmrg 
2621debfc3dSmrg       print_prefix (filename, tag_depth, position);
2631debfc3dSmrg       printf ("%08x:%4u:%s", tag, length, format->name);
2641debfc3dSmrg       if (format->proc)
265a2dc1f3fSmrg 	(*format->proc) (filename, tag, length, depth);
2661debfc3dSmrg 
2671debfc3dSmrg       printf ("\n");
2681debfc3dSmrg       if (flag_dump_contents && format->proc)
2691debfc3dSmrg 	{
2701debfc3dSmrg 	  unsigned long actual_length = gcov_position () - base;
2711debfc3dSmrg 
2721debfc3dSmrg 	  if (actual_length > length)
2731debfc3dSmrg 	    printf ("%s:record size mismatch %lu bytes overread\n",
2741debfc3dSmrg 		    filename, actual_length - length);
2751debfc3dSmrg 	  else if (length > actual_length)
2761debfc3dSmrg 	    printf ("%s:record size mismatch %lu bytes unread\n",
2771debfc3dSmrg 		    filename, length - actual_length);
2781debfc3dSmrg 	}
2791debfc3dSmrg       gcov_sync (base, length);
2801debfc3dSmrg       if ((error = gcov_is_error ()))
2811debfc3dSmrg 	{
2821debfc3dSmrg 	  printf (error < 0 ? "%s:counter overflow at %lu\n" :
2831debfc3dSmrg 		  "%s:read error at %lu\n", filename,
2841debfc3dSmrg 		  (long unsigned) gcov_position ());
2851debfc3dSmrg 	  break;
2861debfc3dSmrg 	}
2871debfc3dSmrg     }
2881debfc3dSmrg   gcov_close ();
2891debfc3dSmrg }
2901debfc3dSmrg 
2911debfc3dSmrg static void
tag_function(const char * filename ATTRIBUTE_UNUSED,unsigned tag ATTRIBUTE_UNUSED,unsigned length,unsigned depth ATTRIBUTE_UNUSED)2921debfc3dSmrg tag_function (const char *filename ATTRIBUTE_UNUSED,
293a2dc1f3fSmrg 	      unsigned tag ATTRIBUTE_UNUSED, unsigned length,
294a2dc1f3fSmrg 	      unsigned depth ATTRIBUTE_UNUSED)
2951debfc3dSmrg {
2961debfc3dSmrg   unsigned long pos = gcov_position ();
2971debfc3dSmrg 
2981debfc3dSmrg   if (!length)
2991debfc3dSmrg     printf (" placeholder");
3001debfc3dSmrg   else
3011debfc3dSmrg     {
3021debfc3dSmrg       printf (" ident=%u", gcov_read_unsigned ());
3031debfc3dSmrg       printf (", lineno_checksum=0x%08x", gcov_read_unsigned ());
3041debfc3dSmrg       printf (", cfg_checksum=0x%08x", gcov_read_unsigned ());
3051debfc3dSmrg 
3061debfc3dSmrg       if (gcov_position () - pos < length)
3071debfc3dSmrg 	{
3081debfc3dSmrg 	  const char *name;
3091debfc3dSmrg 
3101debfc3dSmrg 	  name = gcov_read_string ();
3111debfc3dSmrg 	  printf (", `%s'", name ? name : "NULL");
312a2dc1f3fSmrg 	  unsigned artificial = gcov_read_unsigned ();
3131debfc3dSmrg 	  name = gcov_read_string ();
3141debfc3dSmrg 	  printf (" %s", name ? name : "NULL");
315a2dc1f3fSmrg 	  unsigned line_start = gcov_read_unsigned ();
316a2dc1f3fSmrg 	  unsigned column_start = gcov_read_unsigned ();
317a2dc1f3fSmrg 	  unsigned line_end = gcov_read_unsigned ();
318c0a68be4Smrg 	  unsigned column_end = gcov_read_unsigned ();
319c0a68be4Smrg 	  printf (":%u:%u-%u:%u", line_start, column_start,
320c0a68be4Smrg 		  line_end, column_end);
321a2dc1f3fSmrg 	  if (artificial)
322a2dc1f3fSmrg 	    printf (", artificial");
3231debfc3dSmrg 	}
3241debfc3dSmrg     }
3251debfc3dSmrg }
3261debfc3dSmrg 
3271debfc3dSmrg static void
tag_blocks(const char * filename ATTRIBUTE_UNUSED,unsigned tag ATTRIBUTE_UNUSED,unsigned length ATTRIBUTE_UNUSED,unsigned depth ATTRIBUTE_UNUSED)3281debfc3dSmrg tag_blocks (const char *filename ATTRIBUTE_UNUSED,
329a2dc1f3fSmrg 	    unsigned tag ATTRIBUTE_UNUSED, unsigned length ATTRIBUTE_UNUSED,
330a2dc1f3fSmrg 	    unsigned depth ATTRIBUTE_UNUSED)
3311debfc3dSmrg {
332a2dc1f3fSmrg   printf (" %u blocks", gcov_read_unsigned ());
3331debfc3dSmrg }
3341debfc3dSmrg 
3351debfc3dSmrg static void
tag_arcs(const char * filename ATTRIBUTE_UNUSED,unsigned tag ATTRIBUTE_UNUSED,unsigned length ATTRIBUTE_UNUSED,unsigned depth)3361debfc3dSmrg tag_arcs (const char *filename ATTRIBUTE_UNUSED,
337a2dc1f3fSmrg 	  unsigned tag ATTRIBUTE_UNUSED, unsigned length ATTRIBUTE_UNUSED,
338a2dc1f3fSmrg 	  unsigned depth)
3391debfc3dSmrg {
3401debfc3dSmrg   unsigned n_arcs = GCOV_TAG_ARCS_NUM (length);
3411debfc3dSmrg 
3421debfc3dSmrg   printf (" %u arcs", n_arcs);
3431debfc3dSmrg   if (flag_dump_contents)
3441debfc3dSmrg     {
3451debfc3dSmrg       unsigned ix;
3461debfc3dSmrg       unsigned blockno = gcov_read_unsigned ();
3471debfc3dSmrg 
3481debfc3dSmrg       for (ix = 0; ix != n_arcs; ix++)
3491debfc3dSmrg 	{
3501debfc3dSmrg 	  unsigned dst, flags;
3511debfc3dSmrg 
3521debfc3dSmrg 	  if (!(ix & 3))
3531debfc3dSmrg 	    {
3541debfc3dSmrg 	      printf ("\n");
355a2dc1f3fSmrg 	      print_prefix (filename, depth, gcov_position ());
356a2dc1f3fSmrg 	      printf (VALUE_PADDING_PREFIX "block %u:", blockno);
3571debfc3dSmrg 	    }
3581debfc3dSmrg 	  dst = gcov_read_unsigned ();
3591debfc3dSmrg 	  flags = gcov_read_unsigned ();
3601debfc3dSmrg 	  printf (" %u:%04x", dst, flags);
3611debfc3dSmrg 	  if (flags)
3621debfc3dSmrg 	    {
3631debfc3dSmrg 	      char c = '(';
3641debfc3dSmrg 
3651debfc3dSmrg 	      if (flags & GCOV_ARC_ON_TREE)
3661debfc3dSmrg 		printf ("%ctree", c), c = ',';
3671debfc3dSmrg 	      if (flags & GCOV_ARC_FAKE)
3681debfc3dSmrg 		printf ("%cfake", c), c = ',';
3691debfc3dSmrg 	      if (flags & GCOV_ARC_FALLTHROUGH)
3701debfc3dSmrg 		printf ("%cfall", c), c = ',';
3711debfc3dSmrg 	      printf (")");
3721debfc3dSmrg 	    }
3731debfc3dSmrg 	}
3741debfc3dSmrg     }
3751debfc3dSmrg }
3761debfc3dSmrg 
3771debfc3dSmrg static void
tag_lines(const char * filename ATTRIBUTE_UNUSED,unsigned tag ATTRIBUTE_UNUSED,unsigned length ATTRIBUTE_UNUSED,unsigned depth)3781debfc3dSmrg tag_lines (const char *filename ATTRIBUTE_UNUSED,
379a2dc1f3fSmrg 	   unsigned tag ATTRIBUTE_UNUSED, unsigned length ATTRIBUTE_UNUSED,
380a2dc1f3fSmrg 	   unsigned depth)
3811debfc3dSmrg {
3821debfc3dSmrg   if (flag_dump_contents)
3831debfc3dSmrg     {
3841debfc3dSmrg       unsigned blockno = gcov_read_unsigned ();
3851debfc3dSmrg       char const *sep = NULL;
3861debfc3dSmrg 
3871debfc3dSmrg       while (1)
3881debfc3dSmrg 	{
3891debfc3dSmrg 	  gcov_position_t position = gcov_position ();
3901debfc3dSmrg 	  const char *source = NULL;
3911debfc3dSmrg 	  unsigned lineno = gcov_read_unsigned ();
3921debfc3dSmrg 
3931debfc3dSmrg 	  if (!lineno)
3941debfc3dSmrg 	    {
3951debfc3dSmrg 	      source = gcov_read_string ();
3961debfc3dSmrg 	      if (!source)
3971debfc3dSmrg 		break;
3981debfc3dSmrg 	      sep = NULL;
3991debfc3dSmrg 	    }
4001debfc3dSmrg 
4011debfc3dSmrg 	  if (!sep)
4021debfc3dSmrg 	    {
4031debfc3dSmrg 	      printf ("\n");
404a2dc1f3fSmrg 	      print_prefix (filename, depth, position);
405a2dc1f3fSmrg 	      printf (VALUE_PADDING_PREFIX "block %u:", blockno);
4061debfc3dSmrg 	      sep = "";
4071debfc3dSmrg 	    }
4081debfc3dSmrg 	  if (lineno)
4091debfc3dSmrg 	    {
4101debfc3dSmrg 	      printf ("%s%u", sep, lineno);
4111debfc3dSmrg 	      sep = ", ";
4121debfc3dSmrg 	    }
4131debfc3dSmrg 	  else
4141debfc3dSmrg 	    {
4151debfc3dSmrg 	      printf ("%s`%s'", sep, source);
4161debfc3dSmrg 	      sep = ":";
4171debfc3dSmrg 	    }
4181debfc3dSmrg 	}
4191debfc3dSmrg     }
4201debfc3dSmrg }
4211debfc3dSmrg 
4221debfc3dSmrg static void
tag_counters(const char * filename ATTRIBUTE_UNUSED,unsigned tag ATTRIBUTE_UNUSED,unsigned length ATTRIBUTE_UNUSED,unsigned depth)4231debfc3dSmrg tag_counters (const char *filename ATTRIBUTE_UNUSED,
424a2dc1f3fSmrg 	      unsigned tag ATTRIBUTE_UNUSED, unsigned length ATTRIBUTE_UNUSED,
425a2dc1f3fSmrg 	      unsigned depth)
4261debfc3dSmrg {
4271debfc3dSmrg #define DEF_GCOV_COUNTER(COUNTER, NAME, MERGE_FN) NAME,
4281debfc3dSmrg   static const char *const counter_names[] = {
4291debfc3dSmrg #include "gcov-counter.def"
4301debfc3dSmrg };
4311debfc3dSmrg #undef DEF_GCOV_COUNTER
4321debfc3dSmrg   unsigned n_counts = GCOV_TAG_COUNTER_NUM (length);
4331debfc3dSmrg 
4341debfc3dSmrg   printf (" %s %u counts",
4351debfc3dSmrg 	  counter_names[GCOV_COUNTER_FOR_TAG (tag)], n_counts);
4361debfc3dSmrg   if (flag_dump_contents)
4371debfc3dSmrg     {
4381debfc3dSmrg       unsigned ix;
4391debfc3dSmrg 
4401debfc3dSmrg       for (ix = 0; ix != n_counts; ix++)
4411debfc3dSmrg 	{
4421debfc3dSmrg 	  gcov_type count;
4431debfc3dSmrg 
4441debfc3dSmrg 	  if (!(ix & 7))
4451debfc3dSmrg 	    {
4461debfc3dSmrg 	      printf ("\n");
447a2dc1f3fSmrg 	      print_prefix (filename, depth, gcov_position ());
448a2dc1f3fSmrg 	      printf (VALUE_PADDING_PREFIX VALUE_PREFIX, ix);
4491debfc3dSmrg 	    }
4501debfc3dSmrg 
4511debfc3dSmrg 	  count = gcov_read_counter ();
452a2dc1f3fSmrg 	  printf ("%" PRId64 " ", count);
4531debfc3dSmrg 	}
4541debfc3dSmrg     }
4551debfc3dSmrg }
4561debfc3dSmrg 
4571debfc3dSmrg static void
tag_summary(const char * filename ATTRIBUTE_UNUSED,unsigned tag ATTRIBUTE_UNUSED,unsigned length ATTRIBUTE_UNUSED,unsigned depth ATTRIBUTE_UNUSED)4581debfc3dSmrg tag_summary (const char *filename ATTRIBUTE_UNUSED,
459a2dc1f3fSmrg 	     unsigned tag ATTRIBUTE_UNUSED, unsigned length ATTRIBUTE_UNUSED,
460c0a68be4Smrg 	     unsigned depth ATTRIBUTE_UNUSED)
4611debfc3dSmrg {
462c0a68be4Smrg   gcov_summary summary;
4631debfc3dSmrg   gcov_read_summary (&summary);
464c0a68be4Smrg   printf (" runs=%d, sum_max=%" PRId64,
465c0a68be4Smrg 	  summary.runs, summary.sum_max);
4661debfc3dSmrg }
467