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