summaryrefslogtreecommitdiff
path: root/gcc/opts.c
diff options
context:
space:
mode:
authornickc <nickc@138bc75d-0d04-0410-961f-82ee72b054a4>2008-02-19 10:33:41 +0000
committernickc <nickc@138bc75d-0d04-0410-961f-82ee72b054a4>2008-02-19 10:33:41 +0000
commit86895a67469aadf6a4a9080b1e78ec985c9efc30 (patch)
tree19e80a2c1735712ed685a4ed4cc4e884c94e3d22 /gcc/opts.c
parent93bb78b6f8a94ce0f18dbb5d7adf7b38532b334b (diff)
downloadgcc-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.c94
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;