gcov: add more debugging facility
authorMartin Liska <mliska@suse.cz>
Tue, 12 Jan 2021 10:27:34 +0000 (11:27 +0100)
committerMartin Liska <mliska@suse.cz>
Tue, 12 Jan 2021 11:55:17 +0000 (12:55 +0100)
gcc/ChangeLog:

* gcov.c (source_info::debug): New.
(print_usage): Add --debug (-D) option.
(process_args): Likewise.
(generate_results): Call src->debug after
accumulate_line_counts.
(read_graph_file): Properly assign id for EXIT_BLOCK.
* profile.c (branch_prob): Dump function body before it is
instrumented.

gcc/gcov.c
gcc/profile.c

index 01ca52b215db0c86f28214f0a206e09a46e809f4..93128721ef6ca854af720fffc17b4b8c45200aa7 100644 (file)
@@ -371,6 +371,9 @@ public:
   /* Register a new function.  */
   void add_function (function_info *fn);
 
+  /* Debug the source file.  */
+  void debug ();
+
   /* Index of the source_info in sources vector.  */
   unsigned index;
 
@@ -428,6 +431,31 @@ source_info::get_functions_at_location (unsigned line_num) const
   return slot;
 }
 
+void source_info::debug ()
+{
+  fprintf (stderr, "source_info: %s\n", name);
+  for (vector<function_info *>::iterator it = functions.begin ();
+       it != functions.end (); it++)
+    {
+      function_info *fn = *it;
+      fprintf (stderr, "  function_info: %s\n", fn->get_name ());
+      for (vector<block_info>::iterator bit = fn->blocks.begin ();
+          bit != fn->blocks.end (); bit++)
+       {
+         fprintf (stderr, "    block_info id=%d, count=%ld\n",
+                  bit->id, bit->count);
+       }
+    }
+
+  for (unsigned lineno = 1; lineno < lines.size (); ++lineno)
+    {
+      line_info &line = lines[lineno];
+      fprintf (stderr, "  line_info=%d, count=%ld\n", lineno, line.count);
+    }
+
+  fprintf (stderr, "\n");
+}
+
 class name_map
 {
 public:
@@ -579,6 +607,10 @@ static int flag_human_readable_numbers = 0;
 
 static int flag_function_summary = 0;
 
+/* Print debugging dumps.  */
+
+static int flag_debug = 0;
+
 /* Object directory file prefix.  This is the directory/file where the
    graph and data files are looked for, if nonzero.  */
 
@@ -896,6 +928,7 @@ print_usage (int error_p)
   fnotice (file, "  -c, --branch-counts             Output counts of branches taken\n\
                                     rather than percentages\n");
   fnotice (file, "  -d, --display-progress          Display progress information\n");
+  fnotice (file, "  -D, --debug                            Display debugging dumps\n");
   fnotice (file, "  -f, --function-summaries        Output summaries for each function\n");
   fnotice (file, "  -h, --help                      Print this help, then exit\n");
   fnotice (file, "  -j, --json-format               Output JSON intermediate format\n\
@@ -963,6 +996,7 @@ static const struct option options[] =
   { "hash-filenames",      no_argument,       NULL, 'x' },
   { "use-colors",          no_argument,       NULL, 'k' },
   { "use-hotness-colors",   no_argument,       NULL, 'q' },
+  { "debug",               no_argument,       NULL, 'D' },
   { 0, 0, 0, 0 }
 };
 
@@ -973,7 +1007,7 @@ process_args (int argc, char **argv)
 {
   int opt;
 
-  const char *opts = "abcdfhHijklmno:pqrs:tuvwx";
+  const char *opts = "abcdDfhHijklmno:pqrs:tuvwx";
   while ((opt = getopt_long (argc, argv, opts, options, NULL)) != -1)
     {
       switch (opt)
@@ -1044,6 +1078,9 @@ process_args (int argc, char **argv)
        case 't':
          flag_use_stdout = 1;
          break;
+       case 'D':
+         flag_debug = 1;
+         break;
        case 'v':
          print_version ();
          /* print_version will exit.  */
@@ -1466,6 +1503,8 @@ generate_results (const char *file_name)
        }
 
       accumulate_line_counts (src);
+      if (flag_debug)
+       src->debug ();
 
       if (!flag_use_stdout)
        file_summary (&src->coverage);
@@ -1804,6 +1843,8 @@ read_graph_file (void)
              arc = XCNEW (arc_info);
 
              arc->dst = &fn->blocks[dest];
+             /* Set id in order to find EXIT_BLOCK.  */
+             arc->dst->id = dest;
              arc->src = src_blk;
 
              arc->count = 0;
index d629687484b3bd132564bfc1a4c3e01c04e93d3a..1f1d60c818014b929fc3b71a019ed11d11788838 100644 (file)
@@ -1294,6 +1294,11 @@ branch_prob (bool thunk)
   if (dump_file)
     fprintf (dump_file, "%d instrumentation edges\n", num_instrumented);
 
+  /* Dump function body before it's instrumented.
+     It helps to debug gcov tool.  */
+  if (dump_file && (dump_flags & TDF_DETAILS))
+    dump_function_to_file (cfun->decl, dump_file, dump_flags);
+
   /* Compute two different checksums. Note that we want to compute
      the checksum in only once place, since it depends on the shape
      of the control flow which can change during