From b2230210f1742ddf5e863172ff86531019d1039e Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Tue, 12 Jan 2021 11:27:34 +0100 Subject: [PATCH] gcov: add more debugging facility 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 | 43 ++++++++++++++++++++++++++++++++++++++++++- gcc/profile.c | 5 +++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/gcc/gcov.c b/gcc/gcov.c index 01ca52b..9312872 100644 --- a/gcc/gcov.c +++ b/gcc/gcov.c @@ -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::iterator it = functions.begin (); + it != functions.end (); it++) + { + function_info *fn = *it; + fprintf (stderr, " function_info: %s\n", fn->get_name ()); + for (vector::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; diff --git a/gcc/profile.c b/gcc/profile.c index d629687..1f1d60c 100644 --- a/gcc/profile.c +++ b/gcc/profile.c @@ -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 -- 2.7.4