]> gcc.gnu.org Git - gcc.git/commitdiff
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 
This page took 0.06416 seconds and 5 git commands to generate.