gcov: add new option -t that prints output to stdout (PR gcov-profile/84846).
authorMartin Liska <mliska@suse.cz>
Fri, 18 May 2018 13:06:31 +0000 (15:06 +0200)
committerMartin Liska <marxin@gcc.gnu.org>
Fri, 18 May 2018 13:06:31 +0000 (13:06 +0000)
2018-05-18  Martin Liska  <mliska@suse.cz>

PR gcov-profile/84846
* gcov.c (print_usage): Add new -t option.
(process_args): Handle the option.
(generate_results): Use stdout as output when requested by
the option.
2018-05-18  Martin Liska  <mliska@suse.cz>

PR gcov-profile/84846
* doc/gcov.texi: Document -t option of gcov tool.

From-SVN: r260361

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

index dc0932fb8276c4a5bb6a8c44b395edfb431fa45f..da16d874974de84642075053084d0a6725318b59 100644 (file)
@@ -1,3 +1,16 @@
+2018-05-18  Martin Liska  <mliska@suse.cz>
+
+       PR gcov-profile/84846
+       * doc/gcov.texi: Document -t option of gcov tool.
+
+2018-05-18  Martin Liska  <mliska@suse.cz>
+
+       PR gcov-profile/84846
+       * gcov.c (print_usage): Add new -t option.
+       (process_args): Handle the option.
+       (generate_results): Use stdout as output when requested by
+       the option.
+
 2018-05-18  Martin Liska  <mliska@suse.cz>
 
        PR gcov-profile/84846
index 54625ce67cb430f7728493a049bc15c4ec8f2944..4bd976db0b5dfcf54a9592215cfe2641f23d1bef 100644 (file)
@@ -134,6 +134,7 @@ gcov [@option{-v}|@option{--version}] [@option{-h}|@option{--help}]
      [@option{-p}|@option{--preserve-paths}]
      [@option{-r}|@option{--relative-only}]
      [@option{-s}|@option{--source-prefix} @var{directory}]
+     [@option{-t}|@option{--stdout}]
      [@option{-u}|@option{--unconditional-branches}]
      [@option{-x}|@option{--hash-filenames}]
      @var{files}
@@ -319,6 +320,10 @@ directory, and the pathname to the source directory is not wanted when
 determining the output file names.  Note that this prefix detection is
 applied before determining whether the source file is absolute.
 
+@item -t
+@itemx --stdout
+Output to standard output instead of output files.
+
 @item -u
 @itemx --unconditional-branches
 When branch probabilities are given, include those of unconditional branches.
index 8ed6e0d4d3fda0bae4bc27c88fa1739a42d3e71c..887972a1fcd9a1fc00f5814a00b0449b954509f2 100644 (file)
@@ -462,6 +462,10 @@ static int flag_unconditional = 0;
 
 static int flag_gcov_file = 1;
 
+/* Output to stdout instead to a gcov file.  */
+
+static int flag_use_stdout = 0;
+
 /* Output progress indication if this is true.  This is off by default
    and can be turned on by the -d option.  */
 
@@ -831,6 +835,7 @@ print_usage (int error_p)
   fnotice (file, "  -p, --preserve-paths            Preserve all pathname components\n");
   fnotice (file, "  -r, --relative-only             Only show data for relative sources\n");
   fnotice (file, "  -s, --source-prefix DIR         Source prefix to elide\n");
+  fnotice (file, "  -t, --stdout                    Output to stdout instead of a file\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");
@@ -874,6 +879,7 @@ static const struct option options[] =
   { "object-directory",     required_argument, NULL, 'o' },
   { "object-file",          required_argument, NULL, 'o' },
   { "source-prefix",        required_argument, NULL, 's' },
+  { "stdout",              no_argument,       NULL, 't' },
   { "unconditional-branches", no_argument,     NULL, 'u' },
   { "display-progress",     no_argument,       NULL, 'd' },
   { "hash-filenames",      no_argument,       NULL, 'x' },
@@ -888,7 +894,7 @@ process_args (int argc, char **argv)
 {
   int opt;
 
-  const char *opts = "abcdfhijklmno:prs:uvwx";
+  const char *opts = "abcdfhijklmno:prs:tuvwx";
   while ((opt = getopt_long (argc, argv, opts, options, NULL)) != -1)
     {
       switch (opt)
@@ -952,6 +958,9 @@ process_args (int argc, char **argv)
        case 'w':
          flag_verbose = 1;
          break;
+       case 't':
+         flag_use_stdout = 1;
+         break;
        case 'v':
          print_version ();
          /* print_version will exit.  */
@@ -1293,7 +1302,7 @@ generate_results (const char *file_name)
        file_name = canonicalize_name (file_name);
     }
 
-  if (flag_gcov_file && flag_intermediate_format)
+  if (flag_gcov_file && flag_intermediate_format && !flag_use_stdout)
     {
       /* Open the intermediate file.  */
       gcov_intermediate_filename = get_gcov_intermediate_filename (file_name);
@@ -1325,7 +1334,9 @@ generate_results (const char *file_name)
        }
 
       accumulate_line_counts (src);
-      function_summary (&src->coverage, "File");
+
+      if (!flag_use_stdout)
+       function_summary (&src->coverage, "File");
       total_lines += src->coverage.lines;
       total_executed += src->coverage.lines_executed;
       if (flag_gcov_file)
@@ -1333,14 +1344,25 @@ generate_results (const char *file_name)
          if (flag_intermediate_format)
            /* Output the intermediate format without requiring source
               files.  This outputs a section to a *single* file.  */
-           output_intermediate_file (gcov_intermediate_file, src);
+           output_intermediate_file ((flag_use_stdout
+                                      ? stdout : gcov_intermediate_file), src);
          else
-           output_gcov_file (file_name, src);
-         fnotice (stdout, "\n");
+           {
+             if (flag_use_stdout)
+               {
+                 if (src->coverage.lines)
+                   output_lines (stdout, src);
+               }
+             else
+               {
+                 output_gcov_file (file_name, src);
+                 fnotice (stdout, "\n");
+               }
+           }
        }
     }
 
-  if (flag_gcov_file && flag_intermediate_format)
+  if (flag_gcov_file && flag_intermediate_format && !flag_use_stdout)
     {
       /* Now we've finished writing the intermediate file.  */
       fclose (gcov_intermediate_file);