Introduce new option -w which shows verbose informations.
authorMartin Liska <mliska@suse.cz>
Fri, 28 Apr 2017 12:50:47 +0000 (14:50 +0200)
committerMartin Liska <marxin@gcc.gnu.org>
Fri, 28 Apr 2017 12:50:47 +0000 (12:50 +0000)
2017-04-28  Martin Liska  <mliska@suse.cz>

* gcov.c (process_args): Handle new argument 'w'.
(read_graph_file): Assign ID to BBs.
(output_branch_count): Display BB # if verbose flag is set.
(output_lines): Likewise for arcs.
(print_usage): Add '--verbose' option help.
* doc/gcov.texi: Document --verbose (-w) option.

From-SVN: r247373

gcc/ChangeLog
gcc/doc/gcov.texi
gcc/gcov.c

index 25c7349606533a5253df24834239a9858a3eb695..86e70e7814bc3e81e2d125bea40c58809164e704 100644 (file)
@@ -1,3 +1,12 @@
+2017-04-28  Martin Liska  <mliska@suse.cz>
+
+       * gcov.c (process_args): Handle new argument 'w'.
+       (read_graph_file): Assign ID to BBs.
+       (output_branch_count): Display BB # if verbose flag is set.
+       (output_lines): Likewise for arcs.
+       (print_usage): Add '--verbose' option help.
+       * doc/gcov.texi: Document --verbose (-w) option.
+
 2017-04-28  Martin Liska  <mliska@suse.cz>
 
        * gcov.c (struct block_location_info): New struct.
index d728444e1e71fca5b3cc663cdf2088f8b033337e..2b4101018a23ea6c2510a25b4cd3aa3012bac229 100644 (file)
@@ -289,6 +289,10 @@ where the @var{source-file} component is the final filename part and
 the @var{md5} component is calculated from the full mangled name that
 would have been used otherwise.
 
+@item -w
+@itemx --verbose
+Print verbose informations related to basic blocks and arcs.
+
 @end table
 
 @command{gcov} should be run with the current directory the same as that
index beab20c19ee05e47516a807cb08b2baa5712e418..c8a26b988e3144260a5c5444f2a2baaf5495b411 100644 (file)
@@ -140,6 +140,8 @@ typedef struct block_info
   gcov_type num_succ;
   gcov_type num_pred;
 
+  unsigned id;
+
   /* Block execution count.  */
   gcov_type count;
   unsigned count_valid : 1;
@@ -369,6 +371,10 @@ static int flag_long_names = 0;
 
 static int flag_hash_filenames = 0;
 
+/* Print verbose informations.  */
+
+static int flag_verbose = 0;
+
 /* Output count information for every basic block, not merely those
    that contain line number information.  */
 
@@ -700,6 +706,7 @@ print_usage (int error_p)
   fnotice (file, "  -s, --source-prefix DIR         Source prefix to elide\n");
   fnotice (file, "  -u, --unconditional-branches    Show unconditional branch counts too\n");
   fnotice (file, "  -v, --version                   Print version number, then exit\n");
+  fnotice (file, "  -w, --verbose                   Print verbose informations\n");
   fnotice (file, "  -x, --hash-filenames            Hash long pathnames\n");
   fnotice (file, "\nFor bug reporting instructions, please see:\n%s.\n",
           bug_report_url);
@@ -725,6 +732,7 @@ static const struct option options[] =
 {
   { "help",                 no_argument,       NULL, 'h' },
   { "version",              no_argument,       NULL, 'v' },
+  { "verbose",              no_argument,       NULL, 'w' },
   { "all-blocks",           no_argument,       NULL, 'a' },
   { "branch-probabilities", no_argument,       NULL, 'b' },
   { "branch-counts",        no_argument,       NULL, 'c' },
@@ -751,7 +759,7 @@ process_args (int argc, char **argv)
 {
   int opt;
 
-  const char *opts = "abcdfhilmno:prs:uvx";
+  const char *opts = "abcdfhilmno:prs:uvwx";
   while ((opt = getopt_long (argc, argv, opts, options, NULL)) != -1)
     {
       switch (opt)
@@ -806,6 +814,9 @@ process_args (int argc, char **argv)
        case 'x':
          flag_hash_filenames = 1;
          break;
+       case 'w':
+         flag_verbose = 1;
+         break;
        case 'v':
          print_version ();
          /* print_version will exit.  */
@@ -1375,6 +1386,7 @@ read_graph_file (void)
       else if (fn && tag == GCOV_TAG_ARCS)
        {
          unsigned src = gcov_read_unsigned ();
+         fn->blocks[src].id = src;
          unsigned num_dests = GCOV_TAG_ARCS_NUM (length);
          block_t *src_blk = &fn->blocks[src];
          unsigned mark_catches = 0;
@@ -2399,12 +2411,17 @@ output_branch_count (FILE *gcov_file, int ix, const arc_t *arc)
   else if (!arc->is_unconditional)
     {
       if (arc->src->count)
-       fnotice (gcov_file, "branch %2d taken %s%s\n", ix,
+       fnotice (gcov_file, "branch %2d taken %s%s", ix,
                 format_gcov (arc->count, arc->src->count, -flag_counts),
                 arc->fall_through ? " (fallthrough)"
                 : arc->is_throw ? " (throw)" : "");
       else
-       fnotice (gcov_file, "branch %2d never executed\n", ix);
+       fnotice (gcov_file, "branch %2d never executed", ix);
+
+      if (flag_verbose)
+       fnotice (gcov_file, " (BB %d)", arc->dst->id);
+
+      fnotice (gcov_file, "\n");
     }
   else if (flag_unconditional && !arc->dst->is_call_return)
     {
@@ -2541,11 +2558,16 @@ output_lines (FILE *gcov_file, const source_t *src)
               block = block->chain)
            {
              if (!block->is_call_return)
-               fprintf (gcov_file, "%9s:%5u-block %2d\n",
-                        !line->exists ? "-" : block->count
-                        ? format_gcov (block->count, 0, -1)
-                        : block->exceptional ? "%%%%%" : "$$$$$",
-                        line_num, ix++);
+               {
+                 fprintf (gcov_file, "%9s:%5u-block %2d",
+                          !line->exists ? "-" : block->count
+                          ? format_gcov (block->count, 0, -1)
+                          : block->exceptional ? "%%%%%" : "$$$$$",
+                          line_num, ix++);
+                 if (flag_verbose)
+                   fprintf (gcov_file, " (BB %u)", block->id);
+                 fprintf (gcov_file, "\n");
+               }
              if (flag_branches)
                for (arc = block->succ; arc; arc = arc->succ_next)
                  jx += output_branch_count (gcov_file, jx, arc);