diff options
author | nickc <nickc@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-02-19 10:33:41 +0000 |
---|---|---|
committer | nickc <nickc@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-02-19 10:33:41 +0000 |
commit | 86895a67469aadf6a4a9080b1e78ec985c9efc30 (patch) | |
tree | 19e80a2c1735712ed685a4ed4cc4e884c94e3d22 /gcc/opts.c | |
parent | 93bb78b6f8a94ce0f18dbb5d7adf7b38532b334b (diff) | |
download | gcc-86895a67469aadf6a4a9080b1e78ec985c9efc30.tar.gz |
PR other/31349
* opts.c (undocumented_msg): Leave blank unless checking is
enabled.
(handle_options): Fix indentation.
(print_filtered_help): If no language-specific options were
displayed tell the user how to list all the options supported by
the language's front-end.
(print_specific_help): Fix indentation and remove duplicate line.
(common_handle_option): Handle the -v option.
For --help enable the display of undocumented options if the -v
switch has been included on the command line.
For --help= check for overlaps in the arguments between the option
classes and the language names and issue a warning when they
cannot be disambiguated.
* c.opt (v): Pass on to the common option handler.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@132427 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/opts.c')
-rw-r--r-- | gcc/opts.c | 94 |
1 files changed, 71 insertions, 23 deletions
diff --git a/gcc/opts.c b/gcc/opts.c index 16ca6bf81ab..f2eea7dcf7e 100644 --- a/gcc/opts.c +++ b/gcc/opts.c @@ -337,7 +337,11 @@ bool no_unit_at_a_time_default; struct visibility_flags visibility_options; /* What to print when a switch has no documentation. */ +#ifdef ENABLE_CHECKING static const char undocumented_msg[] = N_("This switch lacks documentation"); +#else +static const char undocumented_msg[] = ""; +#endif /* Used for bookkeeping on whether user set these flags so -fprofile-use/-fprofile-generate does not use them. */ @@ -703,7 +707,7 @@ handle_options (unsigned int argc, const char **argv, unsigned int lang_mask) { if (main_input_filename == NULL) { - main_input_filename = opt; + main_input_filename = opt; main_input_baselength = base_of_path (main_input_filename, &main_input_basename); } @@ -1169,7 +1173,24 @@ print_filtered_help (unsigned int include_flags, } if (! found) - printf (_(" No options with the desired characteristics were found\n")); + { + unsigned int langs = include_flags & CL_LANG_ALL; + + if (langs == 0) + printf (_(" No options with the desired characteristics were found\n")); + else + { + unsigned int i; + + /* PR 31349: Tell the user how to see all of the + options supported by a specific front end. */ + for (i = 0; (1U << i) < CL_LANG_ALL; i ++) + if ((1U << i) & langs) + printf (_(" None found. Use --help=%s to show *all* the options supported by the %s front-end\n"), + lang_names[i], lang_names[i]); + } + + } else if (! displayed) printf (_(" All options with the desired characteristics have already been displayed\n")); @@ -1243,13 +1264,10 @@ print_specific_help (unsigned int include_flags, if (i >= cl_lang_count) break; if ((exclude_flags & ((1U << cl_lang_count) - 1)) != 0) - { - description = _("The following options are specific to the language "); - descrip_extra = lang_names [i]; - } + description = _("The following options are specific to the just the language "); else description = _("The following options are supported by the language "); - descrip_extra = lang_names [i]; + descrip_extra = lang_names [i]; break; } } @@ -1289,6 +1307,7 @@ static int common_handle_option (size_t scode, const char *arg, int value, unsigned int lang_mask) { + static bool verbose = false; enum opt_code code = (enum opt_code) scode; switch (code) @@ -1297,6 +1316,10 @@ common_handle_option (size_t scode, const char *arg, int value, handle_param (arg); break; + case OPT_v: + verbose = true; + break; + case OPT_fhelp: case OPT__help: { @@ -1304,7 +1327,7 @@ common_handle_option (size_t scode, const char *arg, int value, unsigned int undoc_mask; unsigned int i; - undoc_mask = extra_warnings ? 0 : CL_UNDOCUMENTED; + undoc_mask = (verbose | extra_warnings) ? 0 : CL_UNDOCUMENTED; /* First display any single language specific options. */ for (i = 0; i < cl_lang_count; i++) print_specific_help @@ -1366,6 +1389,7 @@ common_handle_option (size_t scode, const char *arg, int value, }; unsigned int * pflags; char * comma; + unsigned int lang_flag, specific_flag; unsigned int len; unsigned int i; @@ -1383,28 +1407,52 @@ common_handle_option (size_t scode, const char *arg, int value, else len = comma - a; - for (i = 0; specifics[i].string != NULL; i++) + /* Check to see if the string matches an option class name. */ + for (i = 0, specific_flag = 0; specifics[i].string != NULL; i++) if (strncasecmp (a, specifics[i].string, len) == 0) { - * pflags |= specifics[i].flag; + specific_flag = specifics[i].flag; + break; + } + + /* Check to see if the string matches a language name. + Note - we rely upon the alpha-sorted nature of the entries in + the lang_names array, specifically that shorter names appear + before their longer variants. (ie C before C++). That way + when we are attempting to match --help=c for example we will + match with C first and not C++. */ + for (i = 0, lang_flag = 0; i < cl_lang_count; i++) + if (strncasecmp (a, lang_names[i], len) == 0) + { + lang_flag = 1U << i; break; } - if (specifics[i].string == NULL) + if (specific_flag != 0) { - /* Check to see if the string matches a language name. */ - for (i = 0; i < cl_lang_count; i++) - if (strncasecmp (a, lang_names[i], len) == 0) - { - * pflags |= 1U << i; - break; - } - - if (i == cl_lang_count) - fnotice (stderr, - "warning: unrecognized argument to --help= switch: %.*s\n", - len, a); + if (lang_flag == 0) + * pflags |= specific_flag; + else + { + /* The option's argument matches both the start of a + language name and the start of an option class name. + We have a special case for when the user has + specified "--help=c", but otherwise we have to issue + a warning. */ + if (strncasecmp (a, "c", len) == 0) + * pflags |= lang_flag; + else + fnotice (stderr, + "warning: --help argument %.*s is ambiguous, please be more specific\n", + len, a); + } } + else if (lang_flag != 0) + * pflags |= lang_flag; + else + fnotice (stderr, + "warning: unrecognized argument to --help= option: %.*s\n", + len, a); if (comma == NULL) break; |