re PR other/704 (--help and --version)

* 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.

From-SVN: r46703
This commit is contained in:
Joseph Myers 2001-11-01 21:48:49 +00:00 committed by Joseph Myers
parent 199898121e
commit 5735c3ea78
4 changed files with 128 additions and 43 deletions

View File

@ -1,3 +1,18 @@
2001-11-01 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.
2001-11-01 John David Anglin <dave@hiauly1.hia.nrc.ca>
* pa.c (output_move_double): Fix typo in double load.

View File

@ -2117,7 +2117,7 @@ gcov.o: gcov.c gcov-io.h intl.h $(SYSTEM_H) $(CONFIG_H)
# 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 $@
#

View File

@ -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 test coverage mechanism.
@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} instead of @file{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

View File

@ -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];
}