diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2022-03-30 16:53:29 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2022-04-28 20:46:50 +0200 |
commit | 210e32b60b9018e5db2d9741dc7aaa5d9b436999 (patch) | |
tree | 1ab37b8840ce2f34db3bbe36c9836da255e8dbac /gcc/gcov-tool.cc | |
parent | ef9a53feae5701953da9161afef2aea0329ec8b2 (diff) | |
download | gcc-210e32b60b9018e5db2d9741dc7aaa5d9b436999.zip gcc-210e32b60b9018e5db2d9741dc7aaa5d9b436999.tar.gz gcc-210e32b60b9018e5db2d9741dc7aaa5d9b436999.tar.bz2 |
gcov-tool: Add merge-stream subcommand
gcc/
* doc/gcov-tool.texi: Document merge-stream subcommand.
* doc/invoke.texi (fprofile-info-section): Mention merge-stream
subcommand of gcov-tool.
* gcov-tool.cc (gcov_profile_merge_stream): Declare.
(print_merge_stream_usage_message): New.
(merge_stream_usage): Likewise.
(do_merge_stream): Likewise.
(print_usage): Call print_merge_stream_usage_message().
(main): Call do_merge_stream() to execute merge-stream subcommand.
libgcc/
* libgcov-util.c (consume_stream): New.
(get_target_profiles_for_merge): Likewise.
(gcov_profile_merge_stream): Likewise.
Diffstat (limited to 'gcc/gcov-tool.cc')
-rw-r--r-- | gcc/gcov-tool.cc | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/gcc/gcov-tool.cc b/gcc/gcov-tool.cc index d712715..ceb2501 100644 --- a/gcc/gcov-tool.cc +++ b/gcc/gcov-tool.cc @@ -42,6 +42,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see extern struct gcov_info *gcov_profile_merge (struct gcov_info*, struct gcov_info*, int, int); +extern struct gcov_info *gcov_profile_merge_stream (const char *, int, int); extern int gcov_profile_overlap (struct gcov_info*, struct gcov_info*); extern int gcov_profile_normalize (struct gcov_info*, gcov_type); extern int gcov_profile_scale (struct gcov_info*, float, int, int); @@ -229,6 +230,78 @@ do_merge (int argc, char **argv) return profile_merge (argv[optind], argv[optind+1], output_dir, w1, w2); } +/* Usage message for profile merge-stream. */ + +static void +print_merge_stream_usage_message (int error_p) +{ + FILE *file = error_p ? stderr : stdout; + + fnotice (file, " merge-stream [options] [<file>] Merge coverage stream file (or stdin)\n" + " and coverage file contents\n"); + fnotice (file, " -v, --verbose Verbose mode\n"); + fnotice (file, " -w, --weight <w1,w2> Set weights (float point values)\n"); +} + +static const struct option merge_stream_options[] = +{ + { "verbose", no_argument, NULL, 'v' }, + { "weight", required_argument, NULL, 'w' }, + { 0, 0, 0, 0 } +}; + +/* Print merge-stream usage and exit. */ + +static void ATTRIBUTE_NORETURN +merge_stream_usage (void) +{ + fnotice (stderr, "Merge-stream subcomand usage:"); + print_merge_stream_usage_message (true); + exit (FATAL_EXIT_CODE); +} + +/* Driver for profile merge-stream sub-command. */ + +static int +do_merge_stream (int argc, char **argv) +{ + int opt; + int w1 = 1, w2 = 1; + struct gcov_info *merged_profile; + + optind = 0; + while ((opt = getopt_long (argc, argv, "vw:", + merge_stream_options, NULL)) != -1) + { + switch (opt) + { + case 'v': + verbose = true; + gcov_set_verbose (); + break; + case 'w': + sscanf (optarg, "%d,%d", &w1, &w2); + if (w1 < 0 || w2 < 0) + fatal_error (input_location, "weights need to be non-negative"); + break; + default: + merge_stream_usage (); + } + } + + if (argc - optind > 1) + merge_stream_usage (); + + merged_profile = gcov_profile_merge_stream (argv[optind], w1, w2); + + if (merged_profile) + gcov_do_dump (merged_profile, 0, -1); + else if (verbose) + fnotice (stdout, "no profile files were merged\n"); + + return 0; +} + /* If N_VAL is no-zero, normalize the profile by setting the largest counter counter value to N_VAL and scale others counters proportionally. Otherwise, multiply the all counters by SCALE. */ @@ -505,6 +578,7 @@ print_usage (int error_p) fnotice (file, " -h, --help Print this help, then exit\n"); fnotice (file, " -v, --version Print version number, then exit\n"); print_merge_usage_message (error_p); + print_merge_stream_usage_message (error_p); print_rewrite_usage_message (error_p); print_overlap_usage_message (error_p); fnotice (file, "\nFor bug reporting instructions, please see:\n%s.\n", @@ -594,6 +668,8 @@ main (int argc, char **argv) if (!strcmp (sub_command, "merge")) return do_merge (argc - optind, argv + optind); + else if (!strcmp (sub_command, "merge-stream")) + return do_merge_stream (argc - optind, argv + optind); else if (!strcmp (sub_command, "rewrite")) return do_rewrite (argc - optind, argv + optind); else if (!strcmp (sub_command, "overlap")) |