This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Patch for long option support in gcov
- To: <gcc-patches at gcc dot gnu dot org>
- Subject: Patch for long option support in gcov
- From: "Joseph S. Myers" <jsm28 at cam dot ac dot uk>
- Date: Tue, 30 Oct 2001 12:29:07 +0000 (GMT)
This patch makes gcov support long options (using getopt_long,
replacing its own options parser), including --help and --version
following the GNU Coding Standards. It removes gcov's own version
number (1.5), making it just use the GCC version number. (It will
mean that if -v is passed to gcov it will now exit after printing the
version number rather than continuing with normal processing. Version
output also now goes to stdout, not stderr, and is in a different
format.)
Bootstrapped with no regressions on i686-pc-linux-gnu. It passes
"make info" and "make dvi". OK to commit?
2001-10-30 Joseph S. Myers <jsm28@cam.ac.uk>
* Makefile.in (GCOV_OBJS): Add version.o.
* gcov.c: Include "version.h" and <getopt.h>.
(gcov_version_string): Remove.
(print_usage): Take a parameter to determine whether this is a
call from --help or an error message. Give fuller output that
follows the GNU Coding Standards for --help.
(print_version): New function.
(options): New.
(process_args): Use getopt_long. Support long options. Follow
GNU Coding Standards for --help and --version.
* doc/gcov.texi: Document long options.
Addresses part of PR other/704.
diff -rupN gcc.orig/Makefile.in gcc/Makefile.in
--- gcc.orig/Makefile.in Mon Oct 29 17:50:58 2001
+++ gcc/Makefile.in Tue Oct 30 01:00:23 2001
@@ -2117,7 +2117,7 @@ gcov.o: gcov.c gcov-io.h intl.h $(SYSTEM
# Only one of 'gcov' or 'gcov.exe' is actually built, depending
# upon whether $(exeext) is empty or not.
-GCOV_OBJS = gcov.o intl.o
+GCOV_OBJS = gcov.o intl.o version.o
gcov$(exeext): $(GCOV_OBJS) $(LIBDEPS)
$(CC) $(ALL_CFLAGS) $(LDFLAGS) $(GCOV_OBJS) $(LIBS) -o $@
#
diff -rupN gcc.orig/doc/gcov.texi gcc/doc/gcov.texi
--- gcc.orig/doc/gcov.texi Wed Jun 27 14:54:21 2001
+++ gcc/doc/gcov.texi Tue Oct 30 01:57:24 2001
@@ -1,10 +1,10 @@
-@c Copyright (C) 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
+@c Copyright (C) 1996, 1997, 1999, 2000, 2001 Free Software Foundation, Inc.
@c This is part of the GCC manual.
@c For copying conditions, see the file gcc.texi.
@ignore
@c man begin COPYRIGHT
-Copyright @copyright{} 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
+Copyright @copyright{} 1996, 1997, 1999, 2000, 2001 Free Software Foundation, Inc.
Permission is granted to make and distribute verbatim copies of this
manual provided the copyright notice and this permission notice are
@@ -32,8 +32,6 @@ English.
@command{gcov} is a tool you can use in conjunction with GCC to
test code coverage in your programs.
-This chapter describes version 1.5 of @command{gcov}.
-
@menu
* Gcov Intro:: Introduction to gcov.
* Invoking Gcov:: How to use gcov.
@@ -108,12 +106,18 @@ compatible with any other profiling or t
@section Invoking gcov
@smallexample
-gcov [-b] [-c] [-v] [-n] [-l] [-f] [-o directory] @var{sourcefile}
+gcov @r{[}@var{options}@r{]} @var{sourcefile}
@end smallexample
+@command{gcov} accepts the following options:
+
@ignore
@c man begin SYNOPSIS
-gcov [@option{-b}] [@option{-c}] [@option{-v}] [@option{-n}] [@option{-l}] [@option{-f}] [@option{-o} @var{directory}] @var{sourcefile}
+gcov [@option{-v}|@option{--version}] [@option{-h}|@option{--help}]
+ [@option{-b}|@option{--branch-probabilities}] [@option{-c}|@option{--branch-counts}]
+ [@option{-n}|@option{--no-output}] [@option{-l}|@option{--long-file-names}]
+ [@option{-f}|@option{--function-summaries}]
+ [@option{-o}|@option{--object-directory} @var{directory}] @var{sourcefile}
@c man end
@c man begin SEEALSO
gcc(1) and the Info entry for @file{gcc}.
@@ -122,22 +126,33 @@ gcc(1) and the Info entry for @file{gcc}
@c man begin OPTIONS
@table @gcctabopt
+@item -h
+@itemx --help
+Display help about using @command{gcov} (on the standard output), and
+exit without doing any further processing.
+
+@item -v
+@itemx --version
+Display the @command{gcov} version number (on the standard output),
+and exit without doing any further processing.
+
@item -b
+@itemx --branch-probabilities
Write branch frequencies to the output file, and write branch summary
info to the standard output. This option allows you to see how often
each branch in your program was taken.
@item -c
+@itemx --branch-counts
Write branch frequencies as the number of branches taken, rather than
the percentage of branches taken.
-@item -v
-Display the @command{gcov} version number (on the standard error stream).
-
@item -n
+@itemx --no-output
Do not create the @command{gcov} output file.
@item -l
+@itemx --long-file-names
Create long file names for included source files. For example, if the
header file @file{x.h} contains code, and was included in the file
@file{a.c}, then running @command{gcov} on the file @file{a.c} will produce
@@ -145,9 +160,11 @@ an output file called @file{a.c.x.h.gcov
This can be useful if @file{x.h} is included in multiple source files.
@item -f
+@itemx --function-summaries
Output summaries for each function in addition to the file level summary.
-@item -o
+@item -o @var{directory}
+@itemx --object-directory @var{directory}
The directory where the object files live. Gcov will search for @file{.bb},
@file{.bbg}, and @file{.da} files in this directory.
@end table
diff -rupN gcc.orig/gcov.c gcc/gcov.c
--- gcc.orig/gcov.c Fri Oct 19 16:34:00 2001
+++ gcc/gcov.c Tue Oct 30 02:30:59 2001
@@ -46,8 +46,11 @@ Boston, MA 02111-1307, USA. */
#include "config.h"
#include "system.h"
#include "intl.h"
+#include "version.h"
#undef abort
+#include <getopt.h>
+
typedef HOST_WIDEST_INT gcov_type;
#include "gcov-io.h"
@@ -79,8 +82,6 @@ typedef HOST_WIDEST_INT gcov_type;
/* The functions in this file for creating and solution program flow graphs
are very similar to functions in the gcc source file profile.c. */
-static const char gcov_version_string[] = "GNU gcov version 1.5\n";
-
/* This is the size of the buffer used to read in source file lines. */
#define STRING_SIZE 200
@@ -227,7 +228,8 @@ static void open_files PARAMS ((void));
static void read_files PARAMS ((void));
static void scan_for_source_files PARAMS ((void));
static void output_data PARAMS ((void));
-static void print_usage PARAMS ((void)) ATTRIBUTE_NORETURN;
+static void print_usage PARAMS ((int)) ATTRIBUTE_NORETURN;
+static void print_version PARAMS ((void)) ATTRIBUTE_NORETURN;
static void init_arc PARAMS ((struct adj_list *, int, int, struct bb_info *));
static struct adj_list *reverse_arcs PARAMS ((struct adj_list *));
static void create_program_flow_graph PARAMS ((struct bb_info_list *));
@@ -281,15 +283,57 @@ fancy_abort ()
exit (FATAL_EXIT_CODE);
}
-/* Print a usage message and exit. */
+/* Print a usage message and exit. If ERROR_P is nonzero, this is an error,
+ otherwise the output of --help. */
static void
-print_usage ()
+print_usage (error_p)
+ int error_p;
{
- fnotice (stderr, "gcov [-b] [-v] [-n] [-l] [-f] [-o OBJDIR] file\n");
- exit (FATAL_EXIT_CODE);
+ FILE *file = error_p ? stderr : stdout;
+ int status = error_p ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE;
+ fnotice (file, "Usage: gcov [OPTION]... SOURCEFILE\n\n");
+ fnotice (file, "Print code coverage information.\n\n");
+ fnotice (file, " -h, --help Print this help, then exit\n");
+ fnotice (file, " -v, --version Print version number, then exit\n");
+ fnotice (file, " -b, --branch-probabilities Include branch probabilities in output\n");
+ fnotice (file, " -c, --branch-counts Given counts of branches taken\n\
+ rather than percentages\n");
+ fnotice (file, " -n, --no-output Do not create an output file\n");
+ fnotice (file, " -l, --long-file-names Use long output file names for included\n\
+ source files\n");
+ fnotice (file, " -f, --function-summaries Output summaries for each function\n");
+ fnotice (file, " -o, --object-directory OBJDIR Search for object files in OBJDIR\n");
+ fnotice (file, "\nFor bug reporting instructions, please see:\n%s.\n",
+ GCCBUGURL);
+ exit (status);
+}
+
+/* Print version information and exit. */
+
+static void
+print_version ()
+{
+ fnotice (stdout, "gcov (GCC) %s\n", version_string);
+ fnotice (stdout, "Copyright (C) 2001 Free Software Foundation, Inc.\n");
+ fnotice (stdout,
+ "This is free software; see the source for copying conditions. There is NO\n\
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n");
+ exit (SUCCESS_EXIT_CODE);
}
+static const struct option options[] =
+{
+ { "help", no_argument, NULL, 'h' },
+ { "version", no_argument, NULL, 'v' },
+ { "branch-probabilities", no_argument, NULL, 'b' },
+ { "branch-counts", no_argument, NULL, 'c' },
+ { "no-output", no_argument, NULL, 'n' },
+ { "long-file-names", no_argument, NULL, 'l' },
+ { "function-summaries", no_argument, NULL, 'f' },
+ { "object-directory", required_argument, NULL, 'o' }
+};
+
/* Parse the command line. */
static void
@@ -297,37 +341,46 @@ process_args (argc, argv)
int argc;
char **argv;
{
- int i;
+ int opt;
- for (i = 1; i < argc; i++)
+ while ((opt = getopt_long (argc, argv, "hvbclnfo:", options, NULL)) != -1)
{
- if (argv[i][0] == '-')
+ switch (opt)
{
- if (argv[i][1] == 'b')
- output_branch_probs = 1;
- else if (argv[i][1] == 'c')
- output_branch_counts = 1;
- else if (argv[i][1] == 'v')
- fputs (gcov_version_string, stderr);
- else if (argv[i][1] == 'n')
- output_gcov_file = 0;
- else if (argv[i][1] == 'l')
- output_long_names = 1;
- else if (argv[i][1] == 'f')
- output_function_summary = 1;
- else if (argv[i][1] == 'o' && argv[i][2] == '\0')
- object_directory = argv[++i];
- else
- print_usage ();
+ case 'h':
+ print_usage (false);
+ /* print_usage will exit. */
+ case 'v':
+ print_version ();
+ /* print_version will exit. */
+ case 'b':
+ output_branch_probs = 1;
+ break;
+ case 'c':
+ output_branch_counts = 1;
+ break;
+ case 'n':
+ output_gcov_file = 0;
+ break;
+ case 'l':
+ output_long_names = 1;
+ break;
+ case 'f':
+ output_function_summary = 1;
+ break;
+ case 'o':
+ object_directory = optarg;
+ break;
+ default:
+ print_usage (true);
+ /* print_usage will exit. */
}
- else if (! input_file_name)
- input_file_name = argv[i];
- else
- print_usage ();
}
- if (! input_file_name)
- print_usage ();
+ if (optind != argc - 1)
+ print_usage (true);
+
+ input_file_name = argv[optind];
}
--
Joseph S. Myers
jsm28@cam.ac.uk