1 /* Command line option handling.
2    Copyright (C) 2006-2013 Free Software Foundation, Inc.
3 
4 This file is part of GCC.
5 
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10 
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19 
20 #include "config.h"
21 #include "system.h"
22 #include "intl.h"
23 #include "coretypes.h"
24 #include "opts.h"
25 #include "flags.h"
26 #include "diagnostic.h"
27 
28 static void prune_options (struct cl_decoded_option **, unsigned int *);
29 
30 /* Perform a binary search to find which option the command-line INPUT
31    matches.  Returns its index in the option array, and
32    OPT_SPECIAL_unknown on failure.
33 
34    This routine is quite subtle.  A normal binary search is not good
35    enough because some options can be suffixed with an argument, and
36    multiple sub-matches can occur, e.g. input of "-pedantic" matching
37    the initial substring of "-pedantic-errors".
38 
39    A more complicated example is -gstabs.  It should match "-g" with
40    an argument of "stabs".  Suppose, however, that the number and list
41    of switches are such that the binary search tests "-gen-decls"
42    before having tested "-g".  This doesn't match, and as "-gen-decls"
43    is less than "-gstabs", it will become the lower bound of the
44    binary search range, and "-g" will never be seen.  To resolve this
45    issue, 'optc-gen.awk' makes "-gen-decls" point, via the back_chain member,
46    to "-g" so that failed searches that end between "-gen-decls" and
47    the lexicographically subsequent switch know to go back and see if
48    "-g" causes a match (which it does in this example).
49 
50    This search is done in such a way that the longest match for the
51    front end in question wins.  If there is no match for the current
52    front end, the longest match for a different front end is returned
53    (or N_OPTS if none) and the caller emits an error message.  */
54 size_t
find_opt(const char * input,unsigned int lang_mask)55 find_opt (const char *input, unsigned int lang_mask)
56 {
57   size_t mn, mn_orig, mx, md, opt_len;
58   size_t match_wrong_lang;
59   int comp;
60 
61   mn = 0;
62   mx = cl_options_count;
63 
64   /* Find mn such this lexicographical inequality holds:
65      cl_options[mn] <= input < cl_options[mn + 1].  */
66   while (mx - mn > 1)
67     {
68       md = (mn + mx) / 2;
69       opt_len = cl_options[md].opt_len;
70       comp = strncmp (input, cl_options[md].opt_text + 1, opt_len);
71 
72       if (comp < 0)
73 	mx = md;
74       else
75 	mn = md;
76     }
77 
78   mn_orig = mn;
79 
80   /* This is the switch that is the best match but for a different
81      front end, or OPT_SPECIAL_unknown if there is no match at all.  */
82   match_wrong_lang = OPT_SPECIAL_unknown;
83 
84   /* Backtrace the chain of possible matches, returning the longest
85      one, if any, that fits best.  With current GCC switches, this
86      loop executes at most twice.  */
87   do
88     {
89       const struct cl_option *opt = &cl_options[mn];
90 
91       /* Is the input either an exact match or a prefix that takes a
92 	 joined argument?  */
93       if (!strncmp (input, opt->opt_text + 1, opt->opt_len)
94 	  && (input[opt->opt_len] == '\0' || (opt->flags & CL_JOINED)))
95 	{
96 	  /* If language is OK, return it.  */
97 	  if (opt->flags & lang_mask)
98 	    return mn;
99 
100 	  /* If we haven't remembered a prior match, remember this
101 	     one.  Any prior match is necessarily better.  */
102 	  if (match_wrong_lang == OPT_SPECIAL_unknown)
103 	    match_wrong_lang = mn;
104 	}
105 
106       /* Try the next possibility.  This is cl_options_count if there
107 	 are no more.  */
108       mn = opt->back_chain;
109     }
110   while (mn != cl_options_count);
111 
112   if (match_wrong_lang == OPT_SPECIAL_unknown && input[0] == '-')
113     {
114       /* Long options, starting "--", may be abbreviated if the
115 	 abbreviation is unambiguous.  This only applies to options
116 	 not taking a joined argument, and abbreviations of "--option"
117 	 are permitted even if there is a variant "--option=".  */
118       size_t mnc = mn_orig + 1;
119       size_t cmp_len = strlen (input);
120       while (mnc < cl_options_count
121 	     && strncmp (input, cl_options[mnc].opt_text + 1, cmp_len) == 0)
122 	{
123 	  /* Option matching this abbreviation.  OK if it is the first
124 	     match and that does not take a joined argument, or the
125 	     second match, taking a joined argument and with only '='
126 	     added to the first match; otherwise considered
127 	     ambiguous.  */
128 	  if (mnc == mn_orig + 1
129 	      && !(cl_options[mnc].flags & CL_JOINED))
130 	    match_wrong_lang = mnc;
131 	  else if (mnc == mn_orig + 2
132 		   && match_wrong_lang == mn_orig + 1
133 		   && (cl_options[mnc].flags & CL_JOINED)
134 		   && (cl_options[mnc].opt_len
135 		       == cl_options[mn_orig + 1].opt_len + 1)
136 		   && strncmp (cl_options[mnc].opt_text + 1,
137 			       cl_options[mn_orig + 1].opt_text + 1,
138 			       cl_options[mn_orig + 1].opt_len) == 0)
139 	    ; /* OK, as long as there are no more matches.  */
140 	  else
141 	    return OPT_SPECIAL_unknown;
142 	  mnc++;
143 	}
144     }
145 
146   /* Return the best wrong match, or OPT_SPECIAL_unknown if none.  */
147   return match_wrong_lang;
148 }
149 
150 /* If ARG is a non-negative integer made up solely of digits, return its
151    value, otherwise return -1.  */
152 
153 int
integral_argument(const char * arg)154 integral_argument (const char *arg)
155 {
156   const char *p = arg;
157 
158   while (*p && ISDIGIT (*p))
159     p++;
160 
161   if (*p == '\0')
162     return atoi (arg);
163 
164   return -1;
165 }
166 
167 /* Return whether OPTION is OK for the language given by
168    LANG_MASK.  */
169 static bool
option_ok_for_language(const struct cl_option * option,unsigned int lang_mask)170 option_ok_for_language (const struct cl_option *option,
171 			unsigned int lang_mask)
172 {
173   if (!(option->flags & lang_mask))
174     return false;
175   else if ((option->flags & CL_TARGET)
176 	   && (option->flags & (CL_LANG_ALL | CL_DRIVER))
177 	   && !(option->flags & (lang_mask & ~CL_COMMON & ~CL_TARGET)))
178     /* Complain for target flag language mismatches if any languages
179        are specified.  */
180     return false;
181   return true;
182 }
183 
184 /* Return whether ENUM_ARG is OK for the language given by
185    LANG_MASK.  */
186 
187 static bool
enum_arg_ok_for_language(const struct cl_enum_arg * enum_arg,unsigned int lang_mask)188 enum_arg_ok_for_language (const struct cl_enum_arg *enum_arg,
189 			  unsigned int lang_mask)
190 {
191   return (lang_mask & CL_DRIVER) || !(enum_arg->flags & CL_ENUM_DRIVER_ONLY);
192 }
193 
194 /* Look up ARG in ENUM_ARGS for language LANG_MASK, returning true and
195    storing the value in *VALUE if found, and returning false without
196    modifying *VALUE if not found.  */
197 
198 static bool
enum_arg_to_value(const struct cl_enum_arg * enum_args,const char * arg,int * value,unsigned int lang_mask)199 enum_arg_to_value (const struct cl_enum_arg *enum_args,
200 		   const char *arg, int *value, unsigned int lang_mask)
201 {
202   unsigned int i;
203 
204   for (i = 0; enum_args[i].arg != NULL; i++)
205     if (strcmp (arg, enum_args[i].arg) == 0
206 	&& enum_arg_ok_for_language (&enum_args[i], lang_mask))
207       {
208 	*value = enum_args[i].value;
209 	return true;
210       }
211 
212   return false;
213 }
214 
215 /* Look up ARG in the enum used by option OPT_INDEX for language
216    LANG_MASK, returning true and storing the value in *VALUE if found,
217    and returning false without modifying *VALUE if not found.  */
218 
219 bool
opt_enum_arg_to_value(size_t opt_index,const char * arg,int * value,unsigned int lang_mask)220 opt_enum_arg_to_value (size_t opt_index, const char *arg, int *value,
221 		       unsigned int lang_mask)
222 {
223   const struct cl_option *option = &cl_options[opt_index];
224 
225   gcc_assert (option->var_type == CLVC_ENUM);
226 
227   return enum_arg_to_value (cl_enums[option->var_enum].values, arg,
228 			    value, lang_mask);
229 }
230 
231 /* Look of VALUE in ENUM_ARGS for language LANG_MASK and store the
232    corresponding string in *ARGP, returning true if the found string
233    was marked as canonical, false otherwise.  If VALUE is not found
234    (which may be the case for uninitialized values if the relevant
235    option has not been passed), set *ARGP to NULL and return
236    false.  */
237 
238 bool
enum_value_to_arg(const struct cl_enum_arg * enum_args,const char ** argp,int value,unsigned int lang_mask)239 enum_value_to_arg (const struct cl_enum_arg *enum_args,
240 		   const char **argp, int value, unsigned int lang_mask)
241 {
242   unsigned int i;
243 
244   for (i = 0; enum_args[i].arg != NULL; i++)
245     if (enum_args[i].value == value
246 	&& (enum_args[i].flags & CL_ENUM_CANONICAL)
247 	&& enum_arg_ok_for_language (&enum_args[i], lang_mask))
248       {
249 	*argp = enum_args[i].arg;
250 	return true;
251       }
252 
253   for (i = 0; enum_args[i].arg != NULL; i++)
254     if (enum_args[i].value == value
255 	&& enum_arg_ok_for_language (&enum_args[i], lang_mask))
256       {
257 	*argp = enum_args[i].arg;
258 	return false;
259       }
260 
261   *argp = NULL;
262   return false;
263 }
264 
265 /* Fill in the canonical option part of *DECODED with an option
266    described by OPT_INDEX, ARG and VALUE.  */
267 
268 static void
generate_canonical_option(size_t opt_index,const char * arg,int value,struct cl_decoded_option * decoded)269 generate_canonical_option (size_t opt_index, const char *arg, int value,
270 			   struct cl_decoded_option *decoded)
271 {
272   const struct cl_option *option = &cl_options[opt_index];
273   const char *opt_text = option->opt_text;
274 
275   if (value == 0
276       && !option->cl_reject_negative
277       && (opt_text[1] == 'W' || opt_text[1] == 'f' || opt_text[1] == 'm'))
278     {
279       char *t = XOBNEWVEC (&opts_obstack, char, option->opt_len + 5);
280       t[0] = '-';
281       t[1] = opt_text[1];
282       t[2] = 'n';
283       t[3] = 'o';
284       t[4] = '-';
285       memcpy (t + 5, opt_text + 2, option->opt_len);
286       opt_text = t;
287     }
288 
289   decoded->canonical_option[2] = NULL;
290   decoded->canonical_option[3] = NULL;
291 
292   if (arg)
293     {
294       if ((option->flags & CL_SEPARATE)
295 	  && !option->cl_separate_alias)
296 	{
297 	  decoded->canonical_option[0] = opt_text;
298 	  decoded->canonical_option[1] = arg;
299 	  decoded->canonical_option_num_elements = 2;
300 	}
301       else
302 	{
303 	  gcc_assert (option->flags & CL_JOINED);
304 	  decoded->canonical_option[0] = opts_concat (opt_text, arg, NULL);
305 	  decoded->canonical_option[1] = NULL;
306 	  decoded->canonical_option_num_elements = 1;
307 	}
308     }
309   else
310     {
311       decoded->canonical_option[0] = opt_text;
312       decoded->canonical_option[1] = NULL;
313       decoded->canonical_option_num_elements = 1;
314     }
315 }
316 
317 /* Structure describing mappings from options on the command line to
318    options to look up with find_opt.  */
319 struct option_map
320 {
321   /* Prefix of the option on the command line.  */
322   const char *opt0;
323   /* If two argv elements are considered to be merged into one option,
324      prefix for the second element, otherwise NULL.  */
325   const char *opt1;
326   /* The new prefix to map to.  */
327   const char *new_prefix;
328   /* Whether at least one character is needed following opt1 or opt0
329      for this mapping to be used.  (--optimize= is valid for -O, but
330      --warn- is not valid for -W.)  */
331   bool another_char_needed;
332   /* Whether the original option is a negated form of the option
333      resulting from this map.  */
334   bool negated;
335 };
336 static const struct option_map option_map[] =
337   {
338     { "-Wno-", NULL, "-W", false, true },
339     { "-fno-", NULL, "-f", false, true },
340     { "-mno-", NULL, "-m", false, true },
341     { "--debug=", NULL, "-g", false, false },
342     { "--machine-", NULL, "-m", true, false },
343     { "--machine-no-", NULL, "-m", false, true },
344     { "--machine=", NULL, "-m", false, false },
345     { "--machine=no-", NULL, "-m", false, true },
346     { "--machine", "", "-m", false, false },
347     { "--machine", "no-", "-m", false, true },
348     { "--optimize=", NULL, "-O", false, false },
349     { "--std=", NULL, "-std=", false, false },
350     { "--std", "", "-std=", false, false },
351     { "--warn-", NULL, "-W", true, false },
352     { "--warn-no-", NULL, "-W", false, true },
353     { "--", NULL, "-f", true, false },
354     { "--no-", NULL, "-f", false, true }
355   };
356 
357 /* Decode the switch beginning at ARGV for the language indicated by
358    LANG_MASK (including CL_COMMON and CL_TARGET if applicable), into
359    the structure *DECODED.  Returns the number of switches
360    consumed.  */
361 
362 static unsigned int
decode_cmdline_option(const char ** argv,unsigned int lang_mask,struct cl_decoded_option * decoded)363 decode_cmdline_option (const char **argv, unsigned int lang_mask,
364 		       struct cl_decoded_option *decoded)
365 {
366   size_t opt_index;
367   const char *arg = 0;
368   int value = 1;
369   unsigned int result = 1, i, extra_args, separate_args = 0;
370   int adjust_len = 0;
371   size_t total_len;
372   char *p;
373   const struct cl_option *option;
374   int errors = 0;
375   const char *warn_message = NULL;
376   bool separate_arg_flag;
377   bool joined_arg_flag;
378   bool have_separate_arg = false;
379 
380   extra_args = 0;
381 
382   opt_index = find_opt (argv[0] + 1, lang_mask);
383   i = 0;
384   while (opt_index == OPT_SPECIAL_unknown
385 	 && i < ARRAY_SIZE (option_map))
386     {
387       const char *opt0 = option_map[i].opt0;
388       const char *opt1 = option_map[i].opt1;
389       const char *new_prefix = option_map[i].new_prefix;
390       bool another_char_needed = option_map[i].another_char_needed;
391       size_t opt0_len = strlen (opt0);
392       size_t opt1_len = (opt1 == NULL ? 0 : strlen (opt1));
393       size_t optn_len = (opt1 == NULL ? opt0_len : opt1_len);
394       size_t new_prefix_len = strlen (new_prefix);
395 
396       extra_args = (opt1 == NULL ? 0 : 1);
397       value = !option_map[i].negated;
398 
399       if (strncmp (argv[0], opt0, opt0_len) == 0
400 	  && (opt1 == NULL
401 	      || (argv[1] != NULL && strncmp (argv[1], opt1, opt1_len) == 0))
402 	  && (!another_char_needed
403 	      || argv[extra_args][optn_len] != 0))
404 	{
405 	  size_t arglen = strlen (argv[extra_args]);
406 	  char *dup;
407 
408 	  adjust_len = (int) optn_len - (int) new_prefix_len;
409 	  dup = XNEWVEC (char, arglen + 1 - adjust_len);
410 	  memcpy (dup, new_prefix, new_prefix_len);
411 	  memcpy (dup + new_prefix_len, argv[extra_args] + optn_len,
412 		  arglen - optn_len + 1);
413 	  opt_index = find_opt (dup + 1, lang_mask);
414 	  free (dup);
415 	}
416       i++;
417     }
418 
419   if (opt_index == OPT_SPECIAL_unknown)
420     {
421       arg = argv[0];
422       extra_args = 0;
423       value = 1;
424       goto done;
425     }
426 
427   option = &cl_options[opt_index];
428 
429   /* Reject negative form of switches that don't take negatives as
430      unrecognized.  */
431   if (!value && option->cl_reject_negative)
432     {
433       opt_index = OPT_SPECIAL_unknown;
434       errors |= CL_ERR_NEGATIVE;
435       arg = argv[0];
436       goto done;
437     }
438 
439   result = extra_args + 1;
440   warn_message = option->warn_message;
441 
442   /* Check to see if the option is disabled for this configuration.  */
443   if (option->cl_disabled)
444     errors |= CL_ERR_DISABLED;
445 
446   /* Determine whether there may be a separate argument based on
447      whether this option is being processed for the driver, and, if
448      so, how many such arguments.  */
449   separate_arg_flag = ((option->flags & CL_SEPARATE)
450 		       && !(option->cl_no_driver_arg
451 			    && (lang_mask & CL_DRIVER)));
452   separate_args = (separate_arg_flag
453 		   ? option->cl_separate_nargs + 1
454 		   : 0);
455   joined_arg_flag = (option->flags & CL_JOINED) != 0;
456 
457   /* Sort out any argument the switch takes.  */
458   if (joined_arg_flag)
459     {
460       /* Have arg point to the original switch.  This is because
461 	 some code, such as disable_builtin_function, expects its
462 	 argument to be persistent until the program exits.  */
463       arg = argv[extra_args] + cl_options[opt_index].opt_len + 1 + adjust_len;
464 
465       if (*arg == '\0' && !option->cl_missing_ok)
466 	{
467 	  if (separate_arg_flag)
468 	    {
469 	      arg = argv[extra_args + 1];
470 	      result = extra_args + 2;
471 	      if (arg == NULL)
472 		result = extra_args + 1;
473 	      else
474 		have_separate_arg = true;
475 	    }
476 	  else
477 	    /* Missing argument.  */
478 	    arg = NULL;
479 	}
480     }
481   else if (separate_arg_flag)
482     {
483       arg = argv[extra_args + 1];
484       for (i = 0; i < separate_args; i++)
485 	if (argv[extra_args + 1 + i] == NULL)
486 	  {
487 	    errors |= CL_ERR_MISSING_ARG;
488 	    break;
489 	  }
490       result = extra_args + 1 + i;
491       if (arg != NULL)
492 	have_separate_arg = true;
493     }
494 
495   if (arg == NULL && (separate_arg_flag || joined_arg_flag))
496     errors |= CL_ERR_MISSING_ARG;
497 
498   /* Is this option an alias (or an ignored option, marked as an alias
499      of OPT_SPECIAL_ignore)?  */
500   if (option->alias_target != N_OPTS
501       && (!option->cl_separate_alias || have_separate_arg))
502     {
503       size_t new_opt_index = option->alias_target;
504 
505       if (new_opt_index == OPT_SPECIAL_ignore)
506 	{
507 	  gcc_assert (option->alias_arg == NULL);
508 	  gcc_assert (option->neg_alias_arg == NULL);
509 	  opt_index = new_opt_index;
510 	  arg = NULL;
511 	  value = 1;
512 	}
513       else
514 	{
515 	  const struct cl_option *new_option = &cl_options[new_opt_index];
516 
517 	  /* The new option must not be an alias itself.  */
518 	  gcc_assert (new_option->alias_target == N_OPTS
519 		      || new_option->cl_separate_alias);
520 
521 	  if (option->neg_alias_arg)
522 	    {
523 	      gcc_assert (option->alias_arg != NULL);
524 	      gcc_assert (arg == NULL);
525 	      gcc_assert (!option->cl_negative_alias);
526 	      if (value)
527 		arg = option->alias_arg;
528 	      else
529 		arg = option->neg_alias_arg;
530 	      value = 1;
531 	    }
532 	  else if (option->alias_arg)
533 	    {
534 	      gcc_assert (value == 1);
535 	      gcc_assert (arg == NULL);
536 	      gcc_assert (!option->cl_negative_alias);
537 	      arg = option->alias_arg;
538 	    }
539 
540 	  if (option->cl_negative_alias)
541 	    value = !value;
542 
543 	  opt_index = new_opt_index;
544 	  option = new_option;
545 
546 	  if (value == 0)
547 	    gcc_assert (!option->cl_reject_negative);
548 
549 	  /* Recompute what arguments are allowed.  */
550 	  separate_arg_flag = ((option->flags & CL_SEPARATE)
551 			       && !(option->cl_no_driver_arg
552 				    && (lang_mask & CL_DRIVER)));
553 	  joined_arg_flag = (option->flags & CL_JOINED) != 0;
554 
555 	  if (separate_args > 1 || option->cl_separate_nargs)
556 	    gcc_assert (separate_args
557 			== (unsigned int) option->cl_separate_nargs + 1);
558 
559 	  if (!(errors & CL_ERR_MISSING_ARG))
560 	    {
561 	      if (separate_arg_flag || joined_arg_flag)
562 		{
563 		  if (option->cl_missing_ok && arg == NULL)
564 		    arg = "";
565 		  gcc_assert (arg != NULL);
566 		}
567 	      else
568 		gcc_assert (arg == NULL);
569 	    }
570 
571 	  /* Recheck for warnings and disabled options.  */
572 	  if (option->warn_message)
573 	    {
574 	      gcc_assert (warn_message == NULL);
575 	      warn_message = option->warn_message;
576 	    }
577 	  if (option->cl_disabled)
578 	    errors |= CL_ERR_DISABLED;
579 	}
580     }
581 
582   /* Check if this is a switch for a different front end.  */
583   if (!option_ok_for_language (option, lang_mask))
584     errors |= CL_ERR_WRONG_LANG;
585 
586   /* Convert the argument to lowercase if appropriate.  */
587   if (arg && option->cl_tolower)
588     {
589       size_t j;
590       size_t len = strlen (arg);
591       char *arg_lower = XOBNEWVEC (&opts_obstack, char, len + 1);
592 
593       for (j = 0; j < len; j++)
594 	arg_lower[j] = TOLOWER ((unsigned char) arg[j]);
595       arg_lower[len] = 0;
596       arg = arg_lower;
597     }
598 
599   /* If the switch takes an integer, convert it.  */
600   if (arg && option->cl_uinteger)
601     {
602       value = integral_argument (arg);
603       if (value == -1)
604 	errors |= CL_ERR_UINT_ARG;
605     }
606 
607   /* If the switch takes an enumerated argument, convert it.  */
608   if (arg && (option->var_type == CLVC_ENUM))
609     {
610       const struct cl_enum *e = &cl_enums[option->var_enum];
611 
612       gcc_assert (value == 1);
613       if (enum_arg_to_value (e->values, arg, &value, lang_mask))
614 	{
615 	  const char *carg = NULL;
616 
617 	  if (enum_value_to_arg (e->values, &carg, value, lang_mask))
618 	    arg = carg;
619 	  gcc_assert (carg != NULL);
620 	}
621       else
622 	errors |= CL_ERR_ENUM_ARG;
623     }
624 
625  done:
626   decoded->opt_index = opt_index;
627   decoded->arg = arg;
628   decoded->value = value;
629   decoded->errors = errors;
630   decoded->warn_message = warn_message;
631 
632   if (opt_index == OPT_SPECIAL_unknown)
633     gcc_assert (result == 1);
634 
635   gcc_assert (result >= 1 && result <= ARRAY_SIZE (decoded->canonical_option));
636   decoded->canonical_option_num_elements = result;
637   total_len = 0;
638   for (i = 0; i < ARRAY_SIZE (decoded->canonical_option); i++)
639     {
640       if (i < result)
641 	{
642 	  size_t len;
643 	  if (opt_index == OPT_SPECIAL_unknown)
644 	    decoded->canonical_option[i] = argv[i];
645 	  else
646 	    decoded->canonical_option[i] = NULL;
647 	  len = strlen (argv[i]);
648 	  /* If the argument is an empty string, we will print it as "" in
649 	     orig_option_with_args_text.  */
650 	  total_len += (len != 0 ? len : 2) + 1;
651 	}
652       else
653 	decoded->canonical_option[i] = NULL;
654     }
655   if (opt_index != OPT_SPECIAL_unknown && opt_index != OPT_SPECIAL_ignore)
656     {
657       generate_canonical_option (opt_index, arg, value, decoded);
658       if (separate_args > 1)
659 	{
660 	  for (i = 0; i < separate_args; i++)
661 	    {
662 	      if (argv[extra_args + 1 + i] == NULL)
663 		  break;
664 	      else
665 		decoded->canonical_option[1 + i] = argv[extra_args + 1 + i];
666 	    }
667 	  gcc_assert (result == 1 + i);
668 	  decoded->canonical_option_num_elements = result;
669 	}
670     }
671   decoded->orig_option_with_args_text
672     = p = XOBNEWVEC (&opts_obstack, char, total_len);
673   for (i = 0; i < result; i++)
674     {
675       size_t len = strlen (argv[i]);
676 
677       /* Print the empty string verbally.  */
678       if (len == 0)
679 	{
680 	  *p++ = '"';
681 	  *p++ = '"';
682 	}
683       else
684 	memcpy (p, argv[i], len);
685       p += len;
686       if (i == result - 1)
687 	*p++ = 0;
688       else
689 	*p++ = ' ';
690     }
691 
692   return result;
693 }
694 
695 /* Obstack for option strings.  */
696 
697 struct obstack opts_obstack;
698 
699 /* Like libiberty concat, but allocate using opts_obstack.  */
700 
701 char *
opts_concat(const char * first,...)702 opts_concat (const char *first, ...)
703 {
704   char *newstr, *end;
705   size_t length = 0;
706   const char *arg;
707   va_list ap;
708 
709   /* First compute the size of the result and get sufficient memory.  */
710   va_start (ap, first);
711   for (arg = first; arg; arg = va_arg (ap, const char *))
712     length += strlen (arg);
713   newstr = XOBNEWVEC (&opts_obstack, char, length + 1);
714   va_end (ap);
715 
716   /* Now copy the individual pieces to the result string. */
717   va_start (ap, first);
718   for (arg = first, end = newstr; arg; arg = va_arg (ap, const char *))
719     {
720       length = strlen (arg);
721       memcpy (end, arg, length);
722       end += length;
723     }
724   *end = '\0';
725   va_end (ap);
726   return newstr;
727 }
728 
729 /* Decode command-line options (ARGC and ARGV being the arguments of
730    main) into an array, setting *DECODED_OPTIONS to a pointer to that
731    array and *DECODED_OPTIONS_COUNT to the number of entries in the
732    array.  The first entry in the array is always one for the program
733    name (OPT_SPECIAL_program_name).  LANG_MASK indicates the language
734    flags applicable for decoding (including CL_COMMON and CL_TARGET if
735    those options should be considered applicable).  Do not produce any
736    diagnostics or set state outside of these variables.  */
737 
738 void
decode_cmdline_options_to_array(unsigned int argc,const char ** argv,unsigned int lang_mask,struct cl_decoded_option ** decoded_options,unsigned int * decoded_options_count)739 decode_cmdline_options_to_array (unsigned int argc, const char **argv,
740 				 unsigned int lang_mask,
741 				 struct cl_decoded_option **decoded_options,
742 				 unsigned int *decoded_options_count)
743 {
744   unsigned int n, i;
745   struct cl_decoded_option *opt_array;
746   unsigned int num_decoded_options;
747 
748   opt_array = XNEWVEC (struct cl_decoded_option, argc);
749 
750   opt_array[0].opt_index = OPT_SPECIAL_program_name;
751   opt_array[0].warn_message = NULL;
752   opt_array[0].arg = argv[0];
753   opt_array[0].orig_option_with_args_text = argv[0];
754   opt_array[0].canonical_option_num_elements = 1;
755   opt_array[0].canonical_option[0] = argv[0];
756   opt_array[0].canonical_option[1] = NULL;
757   opt_array[0].canonical_option[2] = NULL;
758   opt_array[0].canonical_option[3] = NULL;
759   opt_array[0].value = 1;
760   opt_array[0].errors = 0;
761   num_decoded_options = 1;
762 
763   for (i = 1; i < argc; i += n)
764     {
765       const char *opt = argv[i];
766 
767       /* Interpret "-" or a non-switch as a file name.  */
768       if (opt[0] != '-' || opt[1] == '\0')
769 	{
770 	  generate_option_input_file (opt, &opt_array[num_decoded_options]);
771 	  num_decoded_options++;
772 	  n = 1;
773 	  continue;
774 	}
775 
776       n = decode_cmdline_option (argv + i, lang_mask,
777 				 &opt_array[num_decoded_options]);
778       num_decoded_options++;
779     }
780 
781   *decoded_options = opt_array;
782   *decoded_options_count = num_decoded_options;
783   prune_options (decoded_options, decoded_options_count);
784 }
785 
786 /* Return true if NEXT_OPT_IDX cancels OPT_IDX.  Return false if the
787    next one is the same as ORIG_NEXT_OPT_IDX.  */
788 
789 static bool
cancel_option(int opt_idx,int next_opt_idx,int orig_next_opt_idx)790 cancel_option (int opt_idx, int next_opt_idx, int orig_next_opt_idx)
791 {
792   /* An option can be canceled by the same option or an option with
793      Negative.  */
794   if (cl_options [next_opt_idx].neg_index == opt_idx)
795     return true;
796 
797   if (cl_options [next_opt_idx].neg_index != orig_next_opt_idx)
798     return cancel_option (opt_idx, cl_options [next_opt_idx].neg_index,
799 			  orig_next_opt_idx);
800 
801   return false;
802 }
803 
804 /* Filter out options canceled by the ones after them.  */
805 
806 static void
prune_options(struct cl_decoded_option ** decoded_options,unsigned int * decoded_options_count)807 prune_options (struct cl_decoded_option **decoded_options,
808 	       unsigned int *decoded_options_count)
809 {
810   unsigned int old_decoded_options_count = *decoded_options_count;
811   struct cl_decoded_option *old_decoded_options = *decoded_options;
812   unsigned int new_decoded_options_count;
813   struct cl_decoded_option *new_decoded_options
814     = XNEWVEC (struct cl_decoded_option, old_decoded_options_count);
815   unsigned int i;
816   const struct cl_option *option;
817 
818   /* Remove arguments which are negated by others after them.  */
819   new_decoded_options_count = 0;
820   for (i = 0; i < old_decoded_options_count; i++)
821     {
822       unsigned int j, opt_idx, next_opt_idx;
823 
824       if (old_decoded_options[i].errors & ~CL_ERR_WRONG_LANG)
825 	goto keep;
826 
827       opt_idx = old_decoded_options[i].opt_index;
828       switch (opt_idx)
829 	{
830 	case OPT_SPECIAL_unknown:
831 	case OPT_SPECIAL_ignore:
832 	case OPT_SPECIAL_program_name:
833 	case OPT_SPECIAL_input_file:
834 	  goto keep;
835 
836 	default:
837 	  gcc_assert (opt_idx < cl_options_count);
838 	  option = &cl_options[opt_idx];
839 	  if (option->neg_index < 0)
840 	    goto keep;
841 
842 	  /* Skip joined switches.  */
843 	  if ((option->flags & CL_JOINED))
844 	    goto keep;
845 
846 	  for (j = i + 1; j < old_decoded_options_count; j++)
847 	    {
848 	      if (old_decoded_options[j].errors & ~CL_ERR_WRONG_LANG)
849 		continue;
850 	      next_opt_idx = old_decoded_options[j].opt_index;
851 	      if (next_opt_idx >= cl_options_count)
852 		continue;
853 	      if (cl_options[next_opt_idx].neg_index < 0)
854 		continue;
855 	      if ((cl_options[next_opt_idx].flags & CL_JOINED))
856 		  continue;
857 	      if (cancel_option (opt_idx, next_opt_idx, next_opt_idx))
858 		break;
859 	    }
860 	  if (j == old_decoded_options_count)
861 	    {
862 keep:
863 	      new_decoded_options[new_decoded_options_count]
864 		= old_decoded_options[i];
865 	      new_decoded_options_count++;
866 	    }
867 	  break;
868 	}
869     }
870 
871   free (old_decoded_options);
872   new_decoded_options = XRESIZEVEC (struct cl_decoded_option,
873 				    new_decoded_options,
874 				    new_decoded_options_count);
875   *decoded_options = new_decoded_options;
876   *decoded_options_count = new_decoded_options_count;
877 }
878 
879 /* Handle option DECODED for the language indicated by LANG_MASK,
880    using the handlers in HANDLERS and setting fields in OPTS and
881    OPTS_SET.  KIND is the diagnostic_t if this is a diagnostics
882    option, DK_UNSPECIFIED otherwise, and LOC is the location of the
883    option for options from the source file, UNKNOWN_LOCATION
884    otherwise.  GENERATED_P is true for an option generated as part of
885    processing another option or otherwise generated internally, false
886    for one explicitly passed by the user.  Returns false if the switch
887    was invalid.  DC is the diagnostic context for options affecting
888    diagnostics state, or NULL.  */
889 
890 static bool
handle_option(struct gcc_options * opts,struct gcc_options * opts_set,const struct cl_decoded_option * decoded,unsigned int lang_mask,int kind,location_t loc,const struct cl_option_handlers * handlers,bool generated_p,diagnostic_context * dc)891 handle_option (struct gcc_options *opts,
892 	       struct gcc_options *opts_set,
893 	       const struct cl_decoded_option *decoded,
894 	       unsigned int lang_mask, int kind, location_t loc,
895 	       const struct cl_option_handlers *handlers,
896 	       bool generated_p, diagnostic_context *dc)
897 {
898   size_t opt_index = decoded->opt_index;
899   const char *arg = decoded->arg;
900   int value = decoded->value;
901   const struct cl_option *option = &cl_options[opt_index];
902   void *flag_var = option_flag_var (opt_index, opts);
903   size_t i;
904 
905   if (flag_var)
906     set_option (opts, (generated_p ? NULL : opts_set),
907 		opt_index, value, arg, kind, loc, dc);
908 
909   for (i = 0; i < handlers->num_handlers; i++)
910     if (option->flags & handlers->handlers[i].mask)
911       {
912 	if (!handlers->handlers[i].handler (opts, opts_set, decoded,
913 					    lang_mask, kind, loc,
914 					    handlers, dc))
915 	  return false;
916       }
917 
918   return true;
919 }
920 
921 /* Like handle_option, but OPT_INDEX, ARG and VALUE describe the
922    option instead of DECODED.  This is used for callbacks when one
923    option implies another instead of an option being decoded from the
924    command line.  */
925 
926 bool
handle_generated_option(struct gcc_options * opts,struct gcc_options * opts_set,size_t opt_index,const char * arg,int value,unsigned int lang_mask,int kind,location_t loc,const struct cl_option_handlers * handlers,diagnostic_context * dc)927 handle_generated_option (struct gcc_options *opts,
928 			 struct gcc_options *opts_set,
929 			 size_t opt_index, const char *arg, int value,
930 			 unsigned int lang_mask, int kind, location_t loc,
931 			 const struct cl_option_handlers *handlers,
932 			 diagnostic_context *dc)
933 {
934   struct cl_decoded_option decoded;
935 
936   generate_option (opt_index, arg, value, lang_mask, &decoded);
937   return handle_option (opts, opts_set, &decoded, lang_mask, kind, loc,
938 			handlers, true, dc);
939 }
940 
941 /* Fill in *DECODED with an option described by OPT_INDEX, ARG and
942    VALUE for a front end using LANG_MASK.  This is used when the
943    compiler generates options internally.  */
944 
945 void
generate_option(size_t opt_index,const char * arg,int value,unsigned int lang_mask,struct cl_decoded_option * decoded)946 generate_option (size_t opt_index, const char *arg, int value,
947 		 unsigned int lang_mask, struct cl_decoded_option *decoded)
948 {
949   const struct cl_option *option = &cl_options[opt_index];
950 
951   decoded->opt_index = opt_index;
952   decoded->warn_message = NULL;
953   decoded->arg = arg;
954   decoded->value = value;
955   decoded->errors = (option_ok_for_language (option, lang_mask)
956 		     ? 0
957 		     : CL_ERR_WRONG_LANG);
958 
959   generate_canonical_option (opt_index, arg, value, decoded);
960   switch (decoded->canonical_option_num_elements)
961     {
962     case 1:
963       decoded->orig_option_with_args_text = decoded->canonical_option[0];
964       break;
965 
966     case 2:
967       decoded->orig_option_with_args_text
968 	= opts_concat (decoded->canonical_option[0], " ",
969 		       decoded->canonical_option[1], NULL);
970       break;
971 
972     default:
973       gcc_unreachable ();
974     }
975 }
976 
977 /* Fill in *DECODED with an option for input file FILE.  */
978 
979 void
generate_option_input_file(const char * file,struct cl_decoded_option * decoded)980 generate_option_input_file (const char *file,
981 			    struct cl_decoded_option *decoded)
982 {
983   decoded->opt_index = OPT_SPECIAL_input_file;
984   decoded->warn_message = NULL;
985   decoded->arg = file;
986   decoded->orig_option_with_args_text = file;
987   decoded->canonical_option_num_elements = 1;
988   decoded->canonical_option[0] = file;
989   decoded->canonical_option[1] = NULL;
990   decoded->canonical_option[2] = NULL;
991   decoded->canonical_option[3] = NULL;
992   decoded->value = 1;
993   decoded->errors = 0;
994 }
995 
996 /* Handle the switch DECODED (location LOC) for the language indicated
997    by LANG_MASK, using the handlers in *HANDLERS and setting fields in
998    OPTS and OPTS_SET and using diagnostic context DC (if not NULL) for
999    diagnostic options.  */
1000 
1001 void
read_cmdline_option(struct gcc_options * opts,struct gcc_options * opts_set,struct cl_decoded_option * decoded,location_t loc,unsigned int lang_mask,const struct cl_option_handlers * handlers,diagnostic_context * dc)1002 read_cmdline_option (struct gcc_options *opts,
1003 		     struct gcc_options *opts_set,
1004 		     struct cl_decoded_option *decoded,
1005 		     location_t loc,
1006 		     unsigned int lang_mask,
1007 		     const struct cl_option_handlers *handlers,
1008 		     diagnostic_context *dc)
1009 {
1010   const struct cl_option *option;
1011   const char *opt = decoded->orig_option_with_args_text;
1012 
1013   if (decoded->warn_message)
1014     warning_at (loc, 0, decoded->warn_message, opt);
1015 
1016   if (decoded->opt_index == OPT_SPECIAL_unknown)
1017     {
1018       if (handlers->unknown_option_callback (decoded))
1019 	error_at (loc, "unrecognized command line option %qs", decoded->arg);
1020       return;
1021     }
1022 
1023   if (decoded->opt_index == OPT_SPECIAL_ignore)
1024     return;
1025 
1026   option = &cl_options[decoded->opt_index];
1027 
1028   if (decoded->errors & CL_ERR_DISABLED)
1029     {
1030       error_at (loc, "command line option %qs"
1031 		" is not supported by this configuration", opt);
1032       return;
1033     }
1034 
1035   if (decoded->errors & CL_ERR_MISSING_ARG)
1036     {
1037       if (option->missing_argument_error)
1038 	error_at (loc, option->missing_argument_error, opt);
1039       else
1040 	error_at (loc, "missing argument to %qs", opt);
1041       return;
1042     }
1043 
1044   if (decoded->errors & CL_ERR_UINT_ARG)
1045     {
1046       error_at (loc, "argument to %qs should be a non-negative integer",
1047 		option->opt_text);
1048       return;
1049     }
1050 
1051   if (decoded->errors & CL_ERR_ENUM_ARG)
1052     {
1053       const struct cl_enum *e = &cl_enums[option->var_enum];
1054       unsigned int i;
1055       size_t len;
1056       char *s, *p;
1057 
1058       if (e->unknown_error)
1059 	error_at (loc, e->unknown_error, decoded->arg);
1060       else
1061 	error_at (loc, "unrecognized argument in option %qs", opt);
1062 
1063       len = 0;
1064       for (i = 0; e->values[i].arg != NULL; i++)
1065 	len += strlen (e->values[i].arg) + 1;
1066 
1067       s = XALLOCAVEC (char, len);
1068       p = s;
1069       for (i = 0; e->values[i].arg != NULL; i++)
1070 	{
1071 	  size_t arglen = strlen (e->values[i].arg);
1072 	  memcpy (p, e->values[i].arg, arglen);
1073 	  p[arglen] = ' ';
1074 	  p += arglen + 1;
1075 	}
1076       p[-1] = 0;
1077       inform (loc, "valid arguments to %qs are: %s", option->opt_text, s);
1078       return;
1079     }
1080 
1081   if (decoded->errors & CL_ERR_WRONG_LANG)
1082     {
1083       handlers->wrong_lang_callback (decoded, lang_mask);
1084       return;
1085     }
1086 
1087   gcc_assert (!decoded->errors);
1088 
1089   if (!handle_option (opts, opts_set, decoded, lang_mask, DK_UNSPECIFIED,
1090 		      loc, handlers, false, dc))
1091     error_at (loc, "unrecognized command line option %qs", opt);
1092 }
1093 
1094 /* Set any field in OPTS, and OPTS_SET if not NULL, for option
1095    OPT_INDEX according to VALUE and ARG, diagnostic kind KIND,
1096    location LOC, using diagnostic context DC if not NULL for
1097    diagnostic classification.  */
1098 
1099 void
set_option(struct gcc_options * opts,struct gcc_options * opts_set,int opt_index,int value,const char * arg,int kind,location_t loc,diagnostic_context * dc)1100 set_option (struct gcc_options *opts, struct gcc_options *opts_set,
1101 	    int opt_index, int value, const char *arg, int kind,
1102 	    location_t loc, diagnostic_context *dc)
1103 {
1104   const struct cl_option *option = &cl_options[opt_index];
1105   void *flag_var = option_flag_var (opt_index, opts);
1106   void *set_flag_var = NULL;
1107 
1108   if (!flag_var)
1109     return;
1110 
1111   if (opts_set != NULL)
1112     set_flag_var = option_flag_var (opt_index, opts_set);
1113 
1114   switch (option->var_type)
1115     {
1116     case CLVC_BOOLEAN:
1117 	*(int *) flag_var = value;
1118 	if (set_flag_var)
1119 	  *(int *) set_flag_var = 1;
1120 	break;
1121 
1122     case CLVC_EQUAL:
1123 	if (option->cl_host_wide_int)
1124 	  *(HOST_WIDE_INT *) flag_var = (value
1125 					 ? option->var_value
1126 					 : !option->var_value);
1127 	else
1128 	  *(int *) flag_var = (value
1129 			       ? option->var_value
1130 			       : !option->var_value);
1131 	if (set_flag_var)
1132 	  *(int *) set_flag_var = 1;
1133 	break;
1134 
1135     case CLVC_BIT_CLEAR:
1136     case CLVC_BIT_SET:
1137 	if ((value != 0) == (option->var_type == CLVC_BIT_SET))
1138 	  {
1139 	    if (option->cl_host_wide_int)
1140 	      *(HOST_WIDE_INT *) flag_var |= option->var_value;
1141 	    else
1142 	      *(int *) flag_var |= option->var_value;
1143 	  }
1144 	else
1145 	  {
1146 	    if (option->cl_host_wide_int)
1147 	      *(HOST_WIDE_INT *) flag_var &= ~option->var_value;
1148 	    else
1149 	      *(int *) flag_var &= ~option->var_value;
1150 	  }
1151 	if (set_flag_var)
1152 	  {
1153 	    if (option->cl_host_wide_int)
1154 	      *(HOST_WIDE_INT *) set_flag_var |= option->var_value;
1155 	    else
1156 	      *(int *) set_flag_var |= option->var_value;
1157 	  }
1158 	break;
1159 
1160     case CLVC_STRING:
1161 	*(const char **) flag_var = arg;
1162 	if (set_flag_var)
1163 	  *(const char **) set_flag_var = "";
1164 	break;
1165 
1166     case CLVC_ENUM:
1167       {
1168 	const struct cl_enum *e = &cl_enums[option->var_enum];
1169 
1170 	e->set (flag_var, value);
1171 	if (set_flag_var)
1172 	  e->set (set_flag_var, 1);
1173       }
1174       break;
1175 
1176     case CLVC_DEFER:
1177 	{
1178 	  vec<cl_deferred_option> *v
1179 	    = (vec<cl_deferred_option> *) *(void **) flag_var;
1180 	  cl_deferred_option p = {opt_index, arg, value};
1181 	  if (!v)
1182 	    v = XCNEW (vec<cl_deferred_option>);
1183 	  v->safe_push (p);
1184 	  *(void **) flag_var = v;
1185 	  if (set_flag_var)
1186 	    *(void **) set_flag_var = v;
1187 	}
1188 	break;
1189     }
1190 
1191   if ((diagnostic_t) kind != DK_UNSPECIFIED
1192       && dc != NULL)
1193     diagnostic_classify_diagnostic (dc, opt_index, (diagnostic_t) kind, loc);
1194 }
1195 
1196 /* Return the address of the flag variable for option OPT_INDEX in
1197    options structure OPTS, or NULL if there is no flag variable.  */
1198 
1199 void *
option_flag_var(int opt_index,struct gcc_options * opts)1200 option_flag_var (int opt_index, struct gcc_options *opts)
1201 {
1202   const struct cl_option *option = &cl_options[opt_index];
1203 
1204   if (option->flag_var_offset == (unsigned short) -1)
1205     return NULL;
1206   return (void *)(((char *) opts) + option->flag_var_offset);
1207 }
1208 
1209 /* Return 1 if option OPT_IDX is enabled in OPTS, 0 if it is disabled,
1210    or -1 if it isn't a simple on-off switch.  */
1211 
1212 int
option_enabled(int opt_idx,void * opts)1213 option_enabled (int opt_idx, void *opts)
1214 {
1215   const struct cl_option *option = &(cl_options[opt_idx]);
1216   struct gcc_options *optsg = (struct gcc_options *) opts;
1217   void *flag_var = option_flag_var (opt_idx, optsg);
1218 
1219   if (flag_var)
1220     switch (option->var_type)
1221       {
1222       case CLVC_BOOLEAN:
1223 	return *(int *) flag_var != 0;
1224 
1225       case CLVC_EQUAL:
1226 	if (option->cl_host_wide_int)
1227 	  return *(HOST_WIDE_INT *) flag_var == option->var_value;
1228 	else
1229 	  return *(int *) flag_var == option->var_value;
1230 
1231       case CLVC_BIT_CLEAR:
1232 	if (option->cl_host_wide_int)
1233 	  return (*(HOST_WIDE_INT *) flag_var & option->var_value) == 0;
1234 	else
1235 	  return (*(int *) flag_var & option->var_value) == 0;
1236 
1237       case CLVC_BIT_SET:
1238 	if (option->cl_host_wide_int)
1239 	  return (*(HOST_WIDE_INT *) flag_var & option->var_value) != 0;
1240 	else
1241 	  return (*(int *) flag_var & option->var_value) != 0;
1242 
1243       case CLVC_STRING:
1244       case CLVC_ENUM:
1245       case CLVC_DEFER:
1246 	break;
1247       }
1248   return -1;
1249 }
1250 
1251 /* Fill STATE with the current state of option OPTION in OPTS.  Return
1252    true if there is some state to store.  */
1253 
1254 bool
get_option_state(struct gcc_options * opts,int option,struct cl_option_state * state)1255 get_option_state (struct gcc_options *opts, int option,
1256 		  struct cl_option_state *state)
1257 {
1258   void *flag_var = option_flag_var (option, opts);
1259 
1260   if (flag_var == 0)
1261     return false;
1262 
1263   switch (cl_options[option].var_type)
1264     {
1265     case CLVC_BOOLEAN:
1266     case CLVC_EQUAL:
1267       state->data = flag_var;
1268       state->size = (cl_options[option].cl_host_wide_int
1269 		     ? sizeof (HOST_WIDE_INT)
1270 		     : sizeof (int));
1271       break;
1272 
1273     case CLVC_BIT_CLEAR:
1274     case CLVC_BIT_SET:
1275       state->ch = option_enabled (option, opts);
1276       state->data = &state->ch;
1277       state->size = 1;
1278       break;
1279 
1280     case CLVC_STRING:
1281       state->data = *(const char **) flag_var;
1282       if (state->data == 0)
1283 	state->data = "";
1284       state->size = strlen ((const char *) state->data) + 1;
1285       break;
1286 
1287     case CLVC_ENUM:
1288       state->data = flag_var;
1289       state->size = cl_enums[cl_options[option].var_enum].var_size;
1290       break;
1291 
1292     case CLVC_DEFER:
1293       return false;
1294     }
1295   return true;
1296 }
1297 
1298 /* Set a warning option OPT_INDEX (language mask LANG_MASK, option
1299    handlers HANDLERS) to have diagnostic kind KIND for option
1300    structures OPTS and OPTS_SET and diagnostic context DC (possibly
1301    NULL), at location LOC (UNKNOWN_LOCATION for -Werror=).  If IMPLY,
1302    the warning option in question is implied at this point.  This is
1303    used by -Werror= and #pragma GCC diagnostic.  */
1304 
1305 void
control_warning_option(unsigned int opt_index,int kind,bool imply,location_t loc,unsigned int lang_mask,const struct cl_option_handlers * handlers,struct gcc_options * opts,struct gcc_options * opts_set,diagnostic_context * dc)1306 control_warning_option (unsigned int opt_index, int kind, bool imply,
1307 			location_t loc, unsigned int lang_mask,
1308 			const struct cl_option_handlers *handlers,
1309 			struct gcc_options *opts,
1310 			struct gcc_options *opts_set,
1311 			diagnostic_context *dc)
1312 {
1313   if (cl_options[opt_index].alias_target != N_OPTS)
1314     opt_index = cl_options[opt_index].alias_target;
1315   if (opt_index == OPT_SPECIAL_ignore)
1316     return;
1317   if (dc)
1318     diagnostic_classify_diagnostic (dc, opt_index, (diagnostic_t) kind, loc);
1319   if (imply)
1320     {
1321       /* -Werror=foo implies -Wfoo.  */
1322       if (cl_options[opt_index].var_type == CLVC_BOOLEAN)
1323 	handle_generated_option (opts, opts_set,
1324 				 opt_index, NULL, 1, lang_mask,
1325 				 kind, loc, handlers, dc);
1326     }
1327 }
1328