[39/77] Two changes to the get_best_mode interface
[official-gcc.git] / gcc / opts-common.c
blobd756814576851cb66871cca5375d9d3605ab10dc
1 /* Command line option handling.
2 Copyright (C) 2006-2017 Free Software Foundation, Inc.
4 This file is part of GCC.
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.
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.
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/>. */
20 #include "config.h"
21 #include "system.h"
22 #include "intl.h"
23 #include "coretypes.h"
24 #include "opts.h"
25 #include "options.h"
26 #include "diagnostic.h"
27 #include "spellcheck.h"
29 static void prune_options (struct cl_decoded_option **, unsigned int *);
31 /* Perform a binary search to find which option the command-line INPUT
32 matches. Returns its index in the option array, and
33 OPT_SPECIAL_unknown on failure.
35 This routine is quite subtle. A normal binary search is not good
36 enough because some options can be suffixed with an argument, and
37 multiple sub-matches can occur, e.g. input of "-pedantic" matching
38 the initial substring of "-pedantic-errors".
40 A more complicated example is -gstabs. It should match "-g" with
41 an argument of "stabs". Suppose, however, that the number and list
42 of switches are such that the binary search tests "-gen-decls"
43 before having tested "-g". This doesn't match, and as "-gen-decls"
44 is less than "-gstabs", it will become the lower bound of the
45 binary search range, and "-g" will never be seen. To resolve this
46 issue, 'optc-gen.awk' makes "-gen-decls" point, via the back_chain member,
47 to "-g" so that failed searches that end between "-gen-decls" and
48 the lexicographically subsequent switch know to go back and see if
49 "-g" causes a match (which it does in this example).
51 This search is done in such a way that the longest match for the
52 front end in question wins. If there is no match for the current
53 front end, the longest match for a different front end is returned
54 (or N_OPTS if none) and the caller emits an error message. */
55 size_t
56 find_opt (const char *input, unsigned int lang_mask)
58 size_t mn, mn_orig, mx, md, opt_len;
59 size_t match_wrong_lang;
60 int comp;
62 mn = 0;
63 mx = cl_options_count;
65 /* Find mn such this lexicographical inequality holds:
66 cl_options[mn] <= input < cl_options[mn + 1]. */
67 while (mx - mn > 1)
69 md = (mn + mx) / 2;
70 opt_len = cl_options[md].opt_len;
71 comp = strncmp (input, cl_options[md].opt_text + 1, opt_len);
73 if (comp < 0)
74 mx = md;
75 else
76 mn = md;
79 mn_orig = mn;
81 /* This is the switch that is the best match but for a different
82 front end, or OPT_SPECIAL_unknown if there is no match at all. */
83 match_wrong_lang = OPT_SPECIAL_unknown;
85 /* Backtrace the chain of possible matches, returning the longest
86 one, if any, that fits best. With current GCC switches, this
87 loop executes at most twice. */
90 const struct cl_option *opt = &cl_options[mn];
92 /* Is the input either an exact match or a prefix that takes a
93 joined argument? */
94 if (!strncmp (input, opt->opt_text + 1, opt->opt_len)
95 && (input[opt->opt_len] == '\0' || (opt->flags & CL_JOINED)))
97 /* If language is OK, return it. */
98 if (opt->flags & lang_mask)
99 return mn;
101 /* If we haven't remembered a prior match, remember this
102 one. Any prior match is necessarily better. */
103 if (match_wrong_lang == OPT_SPECIAL_unknown)
104 match_wrong_lang = mn;
107 /* Try the next possibility. This is cl_options_count if there
108 are no more. */
109 mn = opt->back_chain;
111 while (mn != cl_options_count);
113 if (match_wrong_lang == OPT_SPECIAL_unknown && input[0] == '-')
115 /* Long options, starting "--", may be abbreviated if the
116 abbreviation is unambiguous. This only applies to options
117 not taking a joined argument, and abbreviations of "--option"
118 are permitted even if there is a variant "--option=". */
119 size_t mnc = mn_orig + 1;
120 size_t cmp_len = strlen (input);
121 while (mnc < cl_options_count
122 && strncmp (input, cl_options[mnc].opt_text + 1, cmp_len) == 0)
124 /* Option matching this abbreviation. OK if it is the first
125 match and that does not take a joined argument, or the
126 second match, taking a joined argument and with only '='
127 added to the first match; otherwise considered
128 ambiguous. */
129 if (mnc == mn_orig + 1
130 && !(cl_options[mnc].flags & CL_JOINED))
131 match_wrong_lang = mnc;
132 else if (mnc == mn_orig + 2
133 && match_wrong_lang == mn_orig + 1
134 && (cl_options[mnc].flags & CL_JOINED)
135 && (cl_options[mnc].opt_len
136 == cl_options[mn_orig + 1].opt_len + 1)
137 && strncmp (cl_options[mnc].opt_text + 1,
138 cl_options[mn_orig + 1].opt_text + 1,
139 cl_options[mn_orig + 1].opt_len) == 0)
140 ; /* OK, as long as there are no more matches. */
141 else
142 return OPT_SPECIAL_unknown;
143 mnc++;
147 /* Return the best wrong match, or OPT_SPECIAL_unknown if none. */
148 return match_wrong_lang;
151 /* If ARG is a non-negative decimal or hexadecimal integer, return its
152 value, otherwise return -1. */
155 integral_argument (const char *arg)
157 const char *p = arg;
159 while (*p && ISDIGIT (*p))
160 p++;
162 if (*p == '\0')
163 return atoi (arg);
165 /* It wasn't a decimal number - try hexadecimal. */
166 if (arg[0] == '0' && (arg[1] == 'x' || arg[1] == 'X'))
168 p = arg + 2;
169 while (*p && ISXDIGIT (*p))
170 p++;
172 if (p != arg + 2 && *p == '\0')
173 return strtol (arg, NULL, 16);
176 return -1;
179 /* Return whether OPTION is OK for the language given by
180 LANG_MASK. */
181 static bool
182 option_ok_for_language (const struct cl_option *option,
183 unsigned int lang_mask)
185 if (!(option->flags & lang_mask))
186 return false;
187 else if ((option->flags & CL_TARGET)
188 && (option->flags & (CL_LANG_ALL | CL_DRIVER))
189 && !(option->flags & (lang_mask & ~CL_COMMON & ~CL_TARGET)))
190 /* Complain for target flag language mismatches if any languages
191 are specified. */
192 return false;
193 return true;
196 /* Return whether ENUM_ARG is OK for the language given by
197 LANG_MASK. */
199 static bool
200 enum_arg_ok_for_language (const struct cl_enum_arg *enum_arg,
201 unsigned int lang_mask)
203 return (lang_mask & CL_DRIVER) || !(enum_arg->flags & CL_ENUM_DRIVER_ONLY);
206 /* Look up ARG in ENUM_ARGS for language LANG_MASK, returning true and
207 storing the value in *VALUE if found, and returning false without
208 modifying *VALUE if not found. */
210 static bool
211 enum_arg_to_value (const struct cl_enum_arg *enum_args,
212 const char *arg, int *value, unsigned int lang_mask)
214 unsigned int i;
216 for (i = 0; enum_args[i].arg != NULL; i++)
217 if (strcmp (arg, enum_args[i].arg) == 0
218 && enum_arg_ok_for_language (&enum_args[i], lang_mask))
220 *value = enum_args[i].value;
221 return true;
224 return false;
227 /* Look up ARG in the enum used by option OPT_INDEX for language
228 LANG_MASK, returning true and storing the value in *VALUE if found,
229 and returning false without modifying *VALUE if not found. */
231 bool
232 opt_enum_arg_to_value (size_t opt_index, const char *arg, int *value,
233 unsigned int lang_mask)
235 const struct cl_option *option = &cl_options[opt_index];
237 gcc_assert (option->var_type == CLVC_ENUM);
239 return enum_arg_to_value (cl_enums[option->var_enum].values, arg,
240 value, lang_mask);
243 /* Look of VALUE in ENUM_ARGS for language LANG_MASK and store the
244 corresponding string in *ARGP, returning true if the found string
245 was marked as canonical, false otherwise. If VALUE is not found
246 (which may be the case for uninitialized values if the relevant
247 option has not been passed), set *ARGP to NULL and return
248 false. */
250 bool
251 enum_value_to_arg (const struct cl_enum_arg *enum_args,
252 const char **argp, int value, unsigned int lang_mask)
254 unsigned int i;
256 for (i = 0; enum_args[i].arg != NULL; i++)
257 if (enum_args[i].value == value
258 && (enum_args[i].flags & CL_ENUM_CANONICAL)
259 && enum_arg_ok_for_language (&enum_args[i], lang_mask))
261 *argp = enum_args[i].arg;
262 return true;
265 for (i = 0; enum_args[i].arg != NULL; i++)
266 if (enum_args[i].value == value
267 && enum_arg_ok_for_language (&enum_args[i], lang_mask))
269 *argp = enum_args[i].arg;
270 return false;
273 *argp = NULL;
274 return false;
277 /* Fill in the canonical option part of *DECODED with an option
278 described by OPT_INDEX, ARG and VALUE. */
280 static void
281 generate_canonical_option (size_t opt_index, const char *arg, int value,
282 struct cl_decoded_option *decoded)
284 const struct cl_option *option = &cl_options[opt_index];
285 const char *opt_text = option->opt_text;
287 if (value == 0
288 && !option->cl_reject_negative
289 && (opt_text[1] == 'W' || opt_text[1] == 'f' || opt_text[1] == 'm'))
291 char *t = XOBNEWVEC (&opts_obstack, char, option->opt_len + 5);
292 t[0] = '-';
293 t[1] = opt_text[1];
294 t[2] = 'n';
295 t[3] = 'o';
296 t[4] = '-';
297 memcpy (t + 5, opt_text + 2, option->opt_len);
298 opt_text = t;
301 decoded->canonical_option[2] = NULL;
302 decoded->canonical_option[3] = NULL;
304 if (arg)
306 if ((option->flags & CL_SEPARATE)
307 && !option->cl_separate_alias)
309 decoded->canonical_option[0] = opt_text;
310 decoded->canonical_option[1] = arg;
311 decoded->canonical_option_num_elements = 2;
313 else
315 gcc_assert (option->flags & CL_JOINED);
316 decoded->canonical_option[0] = opts_concat (opt_text, arg, NULL);
317 decoded->canonical_option[1] = NULL;
318 decoded->canonical_option_num_elements = 1;
321 else
323 decoded->canonical_option[0] = opt_text;
324 decoded->canonical_option[1] = NULL;
325 decoded->canonical_option_num_elements = 1;
329 /* Structure describing mappings from options on the command line to
330 options to look up with find_opt. */
331 struct option_map
333 /* Prefix of the option on the command line. */
334 const char *opt0;
335 /* If two argv elements are considered to be merged into one option,
336 prefix for the second element, otherwise NULL. */
337 const char *opt1;
338 /* The new prefix to map to. */
339 const char *new_prefix;
340 /* Whether at least one character is needed following opt1 or opt0
341 for this mapping to be used. (--optimize= is valid for -O, but
342 --warn- is not valid for -W.) */
343 bool another_char_needed;
344 /* Whether the original option is a negated form of the option
345 resulting from this map. */
346 bool negated;
348 static const struct option_map option_map[] =
350 { "-Wno-", NULL, "-W", false, true },
351 { "-fno-", NULL, "-f", false, true },
352 { "-mno-", NULL, "-m", false, true },
353 { "--debug=", NULL, "-g", false, false },
354 { "--machine-", NULL, "-m", true, false },
355 { "--machine-no-", NULL, "-m", false, true },
356 { "--machine=", NULL, "-m", false, false },
357 { "--machine=no-", NULL, "-m", false, true },
358 { "--machine", "", "-m", false, false },
359 { "--machine", "no-", "-m", false, true },
360 { "--optimize=", NULL, "-O", false, false },
361 { "--std=", NULL, "-std=", false, false },
362 { "--std", "", "-std=", false, false },
363 { "--warn-", NULL, "-W", true, false },
364 { "--warn-no-", NULL, "-W", false, true },
365 { "--", NULL, "-f", true, false },
366 { "--no-", NULL, "-f", false, true }
369 /* Helper function for gcc.c's driver::suggest_option, for populating the
370 vec of suggestions for misspelled options.
372 option_map above provides various prefixes for spelling command-line
373 options, which decode_cmdline_option uses to map spellings of options
374 to specific options. We want to do the reverse: to find all the ways
375 that a user could validly spell an option.
377 Given valid OPT_TEXT (with a leading dash) for OPTION, add it and all
378 of its valid variant spellings to CANDIDATES, each without a leading
379 dash.
381 For example, given "-Wabi-tag", the following are added to CANDIDATES:
382 "Wabi-tag"
383 "Wno-abi-tag"
384 "-warn-abi-tag"
385 "-warn-no-abi-tag".
387 The added strings must be freed using free. */
389 void
390 add_misspelling_candidates (auto_vec<char *> *candidates,
391 const struct cl_option *option,
392 const char *opt_text)
394 gcc_assert (candidates);
395 gcc_assert (option);
396 gcc_assert (opt_text);
397 candidates->safe_push (xstrdup (opt_text + 1));
398 for (unsigned i = 0; i < ARRAY_SIZE (option_map); i++)
400 const char *opt0 = option_map[i].opt0;
401 const char *new_prefix = option_map[i].new_prefix;
402 size_t new_prefix_len = strlen (new_prefix);
404 if (option->cl_reject_negative && option_map[i].negated)
405 continue;
407 if (strncmp (opt_text, new_prefix, new_prefix_len) == 0)
409 char *alternative = concat (opt0 + 1, opt_text + new_prefix_len,
410 NULL);
411 candidates->safe_push (alternative);
416 /* Decode the switch beginning at ARGV for the language indicated by
417 LANG_MASK (including CL_COMMON and CL_TARGET if applicable), into
418 the structure *DECODED. Returns the number of switches
419 consumed. */
421 static unsigned int
422 decode_cmdline_option (const char **argv, unsigned int lang_mask,
423 struct cl_decoded_option *decoded)
425 size_t opt_index;
426 const char *arg = 0;
427 int value = 1;
428 unsigned int result = 1, i, extra_args, separate_args = 0;
429 int adjust_len = 0;
430 size_t total_len;
431 char *p;
432 const struct cl_option *option;
433 int errors = 0;
434 const char *warn_message = NULL;
435 bool separate_arg_flag;
436 bool joined_arg_flag;
437 bool have_separate_arg = false;
439 extra_args = 0;
441 opt_index = find_opt (argv[0] + 1, lang_mask);
442 i = 0;
443 while (opt_index == OPT_SPECIAL_unknown
444 && i < ARRAY_SIZE (option_map))
446 const char *opt0 = option_map[i].opt0;
447 const char *opt1 = option_map[i].opt1;
448 const char *new_prefix = option_map[i].new_prefix;
449 bool another_char_needed = option_map[i].another_char_needed;
450 size_t opt0_len = strlen (opt0);
451 size_t opt1_len = (opt1 == NULL ? 0 : strlen (opt1));
452 size_t optn_len = (opt1 == NULL ? opt0_len : opt1_len);
453 size_t new_prefix_len = strlen (new_prefix);
455 extra_args = (opt1 == NULL ? 0 : 1);
456 value = !option_map[i].negated;
458 if (strncmp (argv[0], opt0, opt0_len) == 0
459 && (opt1 == NULL
460 || (argv[1] != NULL && strncmp (argv[1], opt1, opt1_len) == 0))
461 && (!another_char_needed
462 || argv[extra_args][optn_len] != 0))
464 size_t arglen = strlen (argv[extra_args]);
465 char *dup;
467 adjust_len = (int) optn_len - (int) new_prefix_len;
468 dup = XNEWVEC (char, arglen + 1 - adjust_len);
469 memcpy (dup, new_prefix, new_prefix_len);
470 memcpy (dup + new_prefix_len, argv[extra_args] + optn_len,
471 arglen - optn_len + 1);
472 opt_index = find_opt (dup + 1, lang_mask);
473 free (dup);
475 i++;
478 if (opt_index == OPT_SPECIAL_unknown)
480 arg = argv[0];
481 extra_args = 0;
482 value = 1;
483 goto done;
486 option = &cl_options[opt_index];
488 /* Reject negative form of switches that don't take negatives as
489 unrecognized. */
490 if (!value && option->cl_reject_negative)
492 opt_index = OPT_SPECIAL_unknown;
493 errors |= CL_ERR_NEGATIVE;
494 arg = argv[0];
495 goto done;
498 result = extra_args + 1;
499 warn_message = option->warn_message;
501 /* Check to see if the option is disabled for this configuration. */
502 if (option->cl_disabled)
503 errors |= CL_ERR_DISABLED;
505 /* Determine whether there may be a separate argument based on
506 whether this option is being processed for the driver, and, if
507 so, how many such arguments. */
508 separate_arg_flag = ((option->flags & CL_SEPARATE)
509 && !(option->cl_no_driver_arg
510 && (lang_mask & CL_DRIVER)));
511 separate_args = (separate_arg_flag
512 ? option->cl_separate_nargs + 1
513 : 0);
514 joined_arg_flag = (option->flags & CL_JOINED) != 0;
516 /* Sort out any argument the switch takes. */
517 if (joined_arg_flag)
519 /* Have arg point to the original switch. This is because
520 some code, such as disable_builtin_function, expects its
521 argument to be persistent until the program exits. */
522 arg = argv[extra_args] + cl_options[opt_index].opt_len + 1 + adjust_len;
524 if (*arg == '\0' && !option->cl_missing_ok)
526 if (separate_arg_flag)
528 arg = argv[extra_args + 1];
529 result = extra_args + 2;
530 if (arg == NULL)
531 result = extra_args + 1;
532 else
533 have_separate_arg = true;
535 else
536 /* Missing argument. */
537 arg = NULL;
540 else if (separate_arg_flag)
542 arg = argv[extra_args + 1];
543 for (i = 0; i < separate_args; i++)
544 if (argv[extra_args + 1 + i] == NULL)
546 errors |= CL_ERR_MISSING_ARG;
547 break;
549 result = extra_args + 1 + i;
550 if (arg != NULL)
551 have_separate_arg = true;
554 if (arg == NULL && (separate_arg_flag || joined_arg_flag))
555 errors |= CL_ERR_MISSING_ARG;
557 /* Is this option an alias (or an ignored option, marked as an alias
558 of OPT_SPECIAL_ignore)? */
559 if (option->alias_target != N_OPTS
560 && (!option->cl_separate_alias || have_separate_arg))
562 size_t new_opt_index = option->alias_target;
564 if (new_opt_index == OPT_SPECIAL_ignore)
566 gcc_assert (option->alias_arg == NULL);
567 gcc_assert (option->neg_alias_arg == NULL);
568 opt_index = new_opt_index;
569 arg = NULL;
570 value = 1;
572 else
574 const struct cl_option *new_option = &cl_options[new_opt_index];
576 /* The new option must not be an alias itself. */
577 gcc_assert (new_option->alias_target == N_OPTS
578 || new_option->cl_separate_alias);
580 if (option->neg_alias_arg)
582 gcc_assert (option->alias_arg != NULL);
583 gcc_assert (arg == NULL);
584 gcc_assert (!option->cl_negative_alias);
585 if (value)
586 arg = option->alias_arg;
587 else
588 arg = option->neg_alias_arg;
589 value = 1;
591 else if (option->alias_arg)
593 gcc_assert (value == 1);
594 gcc_assert (arg == NULL);
595 gcc_assert (!option->cl_negative_alias);
596 arg = option->alias_arg;
599 if (option->cl_negative_alias)
600 value = !value;
602 opt_index = new_opt_index;
603 option = new_option;
605 if (value == 0)
606 gcc_assert (!option->cl_reject_negative);
608 /* Recompute what arguments are allowed. */
609 separate_arg_flag = ((option->flags & CL_SEPARATE)
610 && !(option->cl_no_driver_arg
611 && (lang_mask & CL_DRIVER)));
612 joined_arg_flag = (option->flags & CL_JOINED) != 0;
614 if (separate_args > 1 || option->cl_separate_nargs)
615 gcc_assert (separate_args
616 == (unsigned int) option->cl_separate_nargs + 1);
618 if (!(errors & CL_ERR_MISSING_ARG))
620 if (separate_arg_flag || joined_arg_flag)
622 if (option->cl_missing_ok && arg == NULL)
623 arg = "";
624 gcc_assert (arg != NULL);
626 else
627 gcc_assert (arg == NULL);
630 /* Recheck for warnings and disabled options. */
631 if (option->warn_message)
633 gcc_assert (warn_message == NULL);
634 warn_message = option->warn_message;
636 if (option->cl_disabled)
637 errors |= CL_ERR_DISABLED;
641 /* Check if this is a switch for a different front end. */
642 if (!option_ok_for_language (option, lang_mask))
643 errors |= CL_ERR_WRONG_LANG;
645 /* Convert the argument to lowercase if appropriate. */
646 if (arg && option->cl_tolower)
648 size_t j;
649 size_t len = strlen (arg);
650 char *arg_lower = XOBNEWVEC (&opts_obstack, char, len + 1);
652 for (j = 0; j < len; j++)
653 arg_lower[j] = TOLOWER ((unsigned char) arg[j]);
654 arg_lower[len] = 0;
655 arg = arg_lower;
658 /* If the switch takes an integer, convert it. */
659 if (arg && option->cl_uinteger)
661 value = integral_argument (arg);
662 if (value == -1)
663 errors |= CL_ERR_UINT_ARG;
665 /* Reject value out of a range. */
666 if (option->range_max != -1
667 && (value < option->range_min || value > option->range_max))
668 errors |= CL_ERR_INT_RANGE_ARG;
671 /* If the switch takes an enumerated argument, convert it. */
672 if (arg && (option->var_type == CLVC_ENUM))
674 const struct cl_enum *e = &cl_enums[option->var_enum];
676 gcc_assert (value == 1);
677 if (enum_arg_to_value (e->values, arg, &value, lang_mask))
679 const char *carg = NULL;
681 if (enum_value_to_arg (e->values, &carg, value, lang_mask))
682 arg = carg;
683 gcc_assert (carg != NULL);
685 else
686 errors |= CL_ERR_ENUM_ARG;
689 done:
690 decoded->opt_index = opt_index;
691 decoded->arg = arg;
692 decoded->value = value;
693 decoded->errors = errors;
694 decoded->warn_message = warn_message;
696 if (opt_index == OPT_SPECIAL_unknown)
697 gcc_assert (result == 1);
699 gcc_assert (result >= 1 && result <= ARRAY_SIZE (decoded->canonical_option));
700 decoded->canonical_option_num_elements = result;
701 total_len = 0;
702 for (i = 0; i < ARRAY_SIZE (decoded->canonical_option); i++)
704 if (i < result)
706 size_t len;
707 if (opt_index == OPT_SPECIAL_unknown)
708 decoded->canonical_option[i] = argv[i];
709 else
710 decoded->canonical_option[i] = NULL;
711 len = strlen (argv[i]);
712 /* If the argument is an empty string, we will print it as "" in
713 orig_option_with_args_text. */
714 total_len += (len != 0 ? len : 2) + 1;
716 else
717 decoded->canonical_option[i] = NULL;
719 if (opt_index != OPT_SPECIAL_unknown && opt_index != OPT_SPECIAL_ignore)
721 generate_canonical_option (opt_index, arg, value, decoded);
722 if (separate_args > 1)
724 for (i = 0; i < separate_args; i++)
726 if (argv[extra_args + 1 + i] == NULL)
727 break;
728 else
729 decoded->canonical_option[1 + i] = argv[extra_args + 1 + i];
731 gcc_assert (result == 1 + i);
732 decoded->canonical_option_num_elements = result;
735 decoded->orig_option_with_args_text
736 = p = XOBNEWVEC (&opts_obstack, char, total_len);
737 for (i = 0; i < result; i++)
739 size_t len = strlen (argv[i]);
741 /* Print the empty string verbally. */
742 if (len == 0)
744 *p++ = '"';
745 *p++ = '"';
747 else
748 memcpy (p, argv[i], len);
749 p += len;
750 if (i == result - 1)
751 *p++ = 0;
752 else
753 *p++ = ' ';
756 return result;
759 /* Obstack for option strings. */
761 struct obstack opts_obstack;
763 /* Like libiberty concat, but allocate using opts_obstack. */
765 char *
766 opts_concat (const char *first, ...)
768 char *newstr, *end;
769 size_t length = 0;
770 const char *arg;
771 va_list ap;
773 /* First compute the size of the result and get sufficient memory. */
774 va_start (ap, first);
775 for (arg = first; arg; arg = va_arg (ap, const char *))
776 length += strlen (arg);
777 newstr = XOBNEWVEC (&opts_obstack, char, length + 1);
778 va_end (ap);
780 /* Now copy the individual pieces to the result string. */
781 va_start (ap, first);
782 for (arg = first, end = newstr; arg; arg = va_arg (ap, const char *))
784 length = strlen (arg);
785 memcpy (end, arg, length);
786 end += length;
788 *end = '\0';
789 va_end (ap);
790 return newstr;
793 /* Decode command-line options (ARGC and ARGV being the arguments of
794 main) into an array, setting *DECODED_OPTIONS to a pointer to that
795 array and *DECODED_OPTIONS_COUNT to the number of entries in the
796 array. The first entry in the array is always one for the program
797 name (OPT_SPECIAL_program_name). LANG_MASK indicates the language
798 flags applicable for decoding (including CL_COMMON and CL_TARGET if
799 those options should be considered applicable). Do not produce any
800 diagnostics or set state outside of these variables. */
802 void
803 decode_cmdline_options_to_array (unsigned int argc, const char **argv,
804 unsigned int lang_mask,
805 struct cl_decoded_option **decoded_options,
806 unsigned int *decoded_options_count)
808 unsigned int n, i;
809 struct cl_decoded_option *opt_array;
810 unsigned int num_decoded_options;
812 opt_array = XNEWVEC (struct cl_decoded_option, argc);
814 opt_array[0].opt_index = OPT_SPECIAL_program_name;
815 opt_array[0].warn_message = NULL;
816 opt_array[0].arg = argv[0];
817 opt_array[0].orig_option_with_args_text = argv[0];
818 opt_array[0].canonical_option_num_elements = 1;
819 opt_array[0].canonical_option[0] = argv[0];
820 opt_array[0].canonical_option[1] = NULL;
821 opt_array[0].canonical_option[2] = NULL;
822 opt_array[0].canonical_option[3] = NULL;
823 opt_array[0].value = 1;
824 opt_array[0].errors = 0;
825 num_decoded_options = 1;
827 for (i = 1; i < argc; i += n)
829 const char *opt = argv[i];
831 /* Interpret "-" or a non-switch as a file name. */
832 if (opt[0] != '-' || opt[1] == '\0')
834 generate_option_input_file (opt, &opt_array[num_decoded_options]);
835 num_decoded_options++;
836 n = 1;
837 continue;
840 n = decode_cmdline_option (argv + i, lang_mask,
841 &opt_array[num_decoded_options]);
842 num_decoded_options++;
845 *decoded_options = opt_array;
846 *decoded_options_count = num_decoded_options;
847 prune_options (decoded_options, decoded_options_count);
850 /* Return true if NEXT_OPT_IDX cancels OPT_IDX. Return false if the
851 next one is the same as ORIG_NEXT_OPT_IDX. */
853 static bool
854 cancel_option (int opt_idx, int next_opt_idx, int orig_next_opt_idx)
856 /* An option can be canceled by the same option or an option with
857 Negative. */
858 if (cl_options [next_opt_idx].neg_index == opt_idx)
859 return true;
861 if (cl_options [next_opt_idx].neg_index != orig_next_opt_idx)
862 return cancel_option (opt_idx, cl_options [next_opt_idx].neg_index,
863 orig_next_opt_idx);
865 return false;
868 /* Filter out options canceled by the ones after them. */
870 static void
871 prune_options (struct cl_decoded_option **decoded_options,
872 unsigned int *decoded_options_count)
874 unsigned int old_decoded_options_count = *decoded_options_count;
875 struct cl_decoded_option *old_decoded_options = *decoded_options;
876 unsigned int new_decoded_options_count;
877 struct cl_decoded_option *new_decoded_options
878 = XNEWVEC (struct cl_decoded_option, old_decoded_options_count);
879 unsigned int i;
880 const struct cl_option *option;
881 unsigned int fdiagnostics_color_idx = 0;
883 /* Remove arguments which are negated by others after them. */
884 new_decoded_options_count = 0;
885 for (i = 0; i < old_decoded_options_count; i++)
887 unsigned int j, opt_idx, next_opt_idx;
889 if (old_decoded_options[i].errors & ~CL_ERR_WRONG_LANG)
890 goto keep;
892 opt_idx = old_decoded_options[i].opt_index;
893 switch (opt_idx)
895 case OPT_SPECIAL_unknown:
896 case OPT_SPECIAL_ignore:
897 case OPT_SPECIAL_program_name:
898 case OPT_SPECIAL_input_file:
899 goto keep;
901 /* Do not save OPT_fdiagnostics_color_, just remember the last one. */
902 case OPT_fdiagnostics_color_:
903 fdiagnostics_color_idx = i;
904 continue;
906 default:
907 gcc_assert (opt_idx < cl_options_count);
908 option = &cl_options[opt_idx];
909 if (option->neg_index < 0)
910 goto keep;
912 /* Skip joined switches. */
913 if ((option->flags & CL_JOINED))
914 goto keep;
916 for (j = i + 1; j < old_decoded_options_count; j++)
918 if (old_decoded_options[j].errors & ~CL_ERR_WRONG_LANG)
919 continue;
920 next_opt_idx = old_decoded_options[j].opt_index;
921 if (next_opt_idx >= cl_options_count)
922 continue;
923 if (cl_options[next_opt_idx].neg_index < 0)
924 continue;
925 if ((cl_options[next_opt_idx].flags & CL_JOINED))
926 continue;
927 if (cancel_option (opt_idx, next_opt_idx, next_opt_idx))
928 break;
930 if (j == old_decoded_options_count)
932 keep:
933 new_decoded_options[new_decoded_options_count]
934 = old_decoded_options[i];
935 new_decoded_options_count++;
937 break;
941 if (fdiagnostics_color_idx >= 1)
943 /* We put the last -fdiagnostics-color= at the first position
944 after argv[0] so it can take effect immediately. */
945 memmove (new_decoded_options + 2, new_decoded_options + 1,
946 sizeof (struct cl_decoded_option)
947 * (new_decoded_options_count - 1));
948 new_decoded_options[1] = old_decoded_options[fdiagnostics_color_idx];
949 new_decoded_options_count++;
952 free (old_decoded_options);
953 new_decoded_options = XRESIZEVEC (struct cl_decoded_option,
954 new_decoded_options,
955 new_decoded_options_count);
956 *decoded_options = new_decoded_options;
957 *decoded_options_count = new_decoded_options_count;
960 /* Handle option DECODED for the language indicated by LANG_MASK,
961 using the handlers in HANDLERS and setting fields in OPTS and
962 OPTS_SET. KIND is the diagnostic_t if this is a diagnostics
963 option, DK_UNSPECIFIED otherwise, and LOC is the location of the
964 option for options from the source file, UNKNOWN_LOCATION
965 otherwise. GENERATED_P is true for an option generated as part of
966 processing another option or otherwise generated internally, false
967 for one explicitly passed by the user. control_warning_option
968 generated options are considered explicitly passed by the user.
969 Returns false if the switch was invalid. DC is the diagnostic
970 context for options affecting diagnostics state, or NULL. */
972 static bool
973 handle_option (struct gcc_options *opts,
974 struct gcc_options *opts_set,
975 const struct cl_decoded_option *decoded,
976 unsigned int lang_mask, int kind, location_t loc,
977 const struct cl_option_handlers *handlers,
978 bool generated_p, diagnostic_context *dc)
980 size_t opt_index = decoded->opt_index;
981 const char *arg = decoded->arg;
982 int value = decoded->value;
983 const struct cl_option *option = &cl_options[opt_index];
984 void *flag_var = option_flag_var (opt_index, opts);
985 size_t i;
987 if (flag_var)
988 set_option (opts, (generated_p ? NULL : opts_set),
989 opt_index, value, arg, kind, loc, dc);
991 for (i = 0; i < handlers->num_handlers; i++)
992 if (option->flags & handlers->handlers[i].mask)
994 if (!handlers->handlers[i].handler (opts, opts_set, decoded,
995 lang_mask, kind, loc,
996 handlers, dc,
997 handlers->target_option_override_hook))
998 return false;
1001 return true;
1004 /* Like handle_option, but OPT_INDEX, ARG and VALUE describe the
1005 option instead of DECODED. This is used for callbacks when one
1006 option implies another instead of an option being decoded from the
1007 command line. */
1009 bool
1010 handle_generated_option (struct gcc_options *opts,
1011 struct gcc_options *opts_set,
1012 size_t opt_index, const char *arg, int value,
1013 unsigned int lang_mask, int kind, location_t loc,
1014 const struct cl_option_handlers *handlers,
1015 bool generated_p, diagnostic_context *dc)
1017 struct cl_decoded_option decoded;
1019 generate_option (opt_index, arg, value, lang_mask, &decoded);
1020 return handle_option (opts, opts_set, &decoded, lang_mask, kind, loc,
1021 handlers, generated_p, dc);
1024 /* Fill in *DECODED with an option described by OPT_INDEX, ARG and
1025 VALUE for a front end using LANG_MASK. This is used when the
1026 compiler generates options internally. */
1028 void
1029 generate_option (size_t opt_index, const char *arg, int value,
1030 unsigned int lang_mask, struct cl_decoded_option *decoded)
1032 const struct cl_option *option = &cl_options[opt_index];
1034 decoded->opt_index = opt_index;
1035 decoded->warn_message = NULL;
1036 decoded->arg = arg;
1037 decoded->value = value;
1038 decoded->errors = (option_ok_for_language (option, lang_mask)
1040 : CL_ERR_WRONG_LANG);
1042 generate_canonical_option (opt_index, arg, value, decoded);
1043 switch (decoded->canonical_option_num_elements)
1045 case 1:
1046 decoded->orig_option_with_args_text = decoded->canonical_option[0];
1047 break;
1049 case 2:
1050 decoded->orig_option_with_args_text
1051 = opts_concat (decoded->canonical_option[0], " ",
1052 decoded->canonical_option[1], NULL);
1053 break;
1055 default:
1056 gcc_unreachable ();
1060 /* Fill in *DECODED with an option for input file FILE. */
1062 void
1063 generate_option_input_file (const char *file,
1064 struct cl_decoded_option *decoded)
1066 decoded->opt_index = OPT_SPECIAL_input_file;
1067 decoded->warn_message = NULL;
1068 decoded->arg = file;
1069 decoded->orig_option_with_args_text = file;
1070 decoded->canonical_option_num_elements = 1;
1071 decoded->canonical_option[0] = file;
1072 decoded->canonical_option[1] = NULL;
1073 decoded->canonical_option[2] = NULL;
1074 decoded->canonical_option[3] = NULL;
1075 decoded->value = 1;
1076 decoded->errors = 0;
1079 /* Helper function for listing valid choices and hint for misspelled
1080 value. CANDIDATES is a vector containing all valid strings,
1081 STR is set to a heap allocated string that contains all those
1082 strings concatenated, separated by spaces, and the return value
1083 is the closest string from those to ARG, or NULL if nothing is
1084 close enough. Callers should XDELETEVEC (STR) after using it
1085 to avoid memory leaks. */
1087 const char *
1088 candidates_list_and_hint (const char *arg, char *&str,
1089 const auto_vec <const char *> &candidates)
1091 size_t len = 0;
1092 int i;
1093 const char *candidate;
1094 char *p;
1096 FOR_EACH_VEC_ELT (candidates, i, candidate)
1097 len += strlen (candidate) + 1;
1099 str = p = XNEWVEC (char, len);
1100 FOR_EACH_VEC_ELT (candidates, i, candidate)
1102 len = strlen (candidate);
1103 memcpy (p, candidate, len);
1104 p[len] = ' ';
1105 p += len + 1;
1107 p[-1] = '\0';
1108 return find_closest_string (arg, &candidates);
1111 /* Perform diagnostics for read_cmdline_option and control_warning_option
1112 functions. Returns true if an error has been diagnosed.
1113 LOC and LANG_MASK arguments like in read_cmdline_option.
1114 OPTION is the option to report diagnostics for, OPT the name
1115 of the option as text, ARG the argument of the option (for joined
1116 options), ERRORS is bitmask of CL_ERR_* values. */
1118 static bool
1119 cmdline_handle_error (location_t loc, const struct cl_option *option,
1120 const char *opt, const char *arg, int errors,
1121 unsigned int lang_mask)
1123 if (errors & CL_ERR_DISABLED)
1125 error_at (loc, "command line option %qs"
1126 " is not supported by this configuration", opt);
1127 return true;
1130 if (errors & CL_ERR_MISSING_ARG)
1132 if (option->missing_argument_error)
1133 error_at (loc, option->missing_argument_error, opt);
1134 else
1135 error_at (loc, "missing argument to %qs", opt);
1136 return true;
1139 if (errors & CL_ERR_UINT_ARG)
1141 error_at (loc, "argument to %qs should be a non-negative integer",
1142 option->opt_text);
1143 return true;
1146 if (errors & CL_ERR_INT_RANGE_ARG)
1148 error_at (loc, "argument to %qs is not between %d and %d",
1149 option->opt_text, option->range_min, option->range_max);
1150 return true;
1153 if (errors & CL_ERR_ENUM_ARG)
1155 const struct cl_enum *e = &cl_enums[option->var_enum];
1156 unsigned int i;
1157 char *s;
1159 if (e->unknown_error)
1160 error_at (loc, e->unknown_error, arg);
1161 else
1162 error_at (loc, "unrecognized argument in option %qs", opt);
1164 auto_vec <const char *> candidates;
1165 for (i = 0; e->values[i].arg != NULL; i++)
1167 if (!enum_arg_ok_for_language (&e->values[i], lang_mask))
1168 continue;
1169 candidates.safe_push (e->values[i].arg);
1171 const char *hint = candidates_list_and_hint (arg, s, candidates);
1172 if (hint)
1173 inform (loc, "valid arguments to %qs are: %s; did you mean %qs?",
1174 option->opt_text, s, hint);
1175 else
1176 inform (loc, "valid arguments to %qs are: %s", option->opt_text, s);
1177 XDELETEVEC (s);
1179 return true;
1182 return false;
1185 /* Handle the switch DECODED (location LOC) for the language indicated
1186 by LANG_MASK, using the handlers in *HANDLERS and setting fields in
1187 OPTS and OPTS_SET and using diagnostic context DC (if not NULL) for
1188 diagnostic options. */
1190 void
1191 read_cmdline_option (struct gcc_options *opts,
1192 struct gcc_options *opts_set,
1193 struct cl_decoded_option *decoded,
1194 location_t loc,
1195 unsigned int lang_mask,
1196 const struct cl_option_handlers *handlers,
1197 diagnostic_context *dc)
1199 const struct cl_option *option;
1200 const char *opt = decoded->orig_option_with_args_text;
1202 if (decoded->warn_message)
1203 warning_at (loc, 0, decoded->warn_message, opt);
1205 if (decoded->opt_index == OPT_SPECIAL_unknown)
1207 if (handlers->unknown_option_callback (decoded))
1208 error_at (loc, "unrecognized command line option %qs", decoded->arg);
1209 return;
1212 if (decoded->opt_index == OPT_SPECIAL_ignore)
1213 return;
1215 option = &cl_options[decoded->opt_index];
1217 if (decoded->errors
1218 && cmdline_handle_error (loc, option, opt, decoded->arg,
1219 decoded->errors, lang_mask))
1220 return;
1222 if (decoded->errors & CL_ERR_WRONG_LANG)
1224 handlers->wrong_lang_callback (decoded, lang_mask);
1225 return;
1228 gcc_assert (!decoded->errors);
1230 if (!handle_option (opts, opts_set, decoded, lang_mask, DK_UNSPECIFIED,
1231 loc, handlers, false, dc))
1232 error_at (loc, "unrecognized command line option %qs", opt);
1235 /* Set any field in OPTS, and OPTS_SET if not NULL, for option
1236 OPT_INDEX according to VALUE and ARG, diagnostic kind KIND,
1237 location LOC, using diagnostic context DC if not NULL for
1238 diagnostic classification. */
1240 void
1241 set_option (struct gcc_options *opts, struct gcc_options *opts_set,
1242 int opt_index, int value, const char *arg, int kind,
1243 location_t loc, diagnostic_context *dc)
1245 const struct cl_option *option = &cl_options[opt_index];
1246 void *flag_var = option_flag_var (opt_index, opts);
1247 void *set_flag_var = NULL;
1249 if (!flag_var)
1250 return;
1252 if ((diagnostic_t) kind != DK_UNSPECIFIED && dc != NULL)
1253 diagnostic_classify_diagnostic (dc, opt_index, (diagnostic_t) kind, loc);
1255 if (opts_set != NULL)
1256 set_flag_var = option_flag_var (opt_index, opts_set);
1258 switch (option->var_type)
1260 case CLVC_BOOLEAN:
1261 *(int *) flag_var = value;
1262 if (set_flag_var)
1263 *(int *) set_flag_var = 1;
1264 break;
1266 case CLVC_EQUAL:
1267 if (option->cl_host_wide_int)
1268 *(HOST_WIDE_INT *) flag_var = (value
1269 ? option->var_value
1270 : !option->var_value);
1271 else
1272 *(int *) flag_var = (value
1273 ? option->var_value
1274 : !option->var_value);
1275 if (set_flag_var)
1276 *(int *) set_flag_var = 1;
1277 break;
1279 case CLVC_BIT_CLEAR:
1280 case CLVC_BIT_SET:
1281 if ((value != 0) == (option->var_type == CLVC_BIT_SET))
1283 if (option->cl_host_wide_int)
1284 *(HOST_WIDE_INT *) flag_var |= option->var_value;
1285 else
1286 *(int *) flag_var |= option->var_value;
1288 else
1290 if (option->cl_host_wide_int)
1291 *(HOST_WIDE_INT *) flag_var &= ~option->var_value;
1292 else
1293 *(int *) flag_var &= ~option->var_value;
1295 if (set_flag_var)
1297 if (option->cl_host_wide_int)
1298 *(HOST_WIDE_INT *) set_flag_var |= option->var_value;
1299 else
1300 *(int *) set_flag_var |= option->var_value;
1302 break;
1304 case CLVC_STRING:
1305 *(const char **) flag_var = arg;
1306 if (set_flag_var)
1307 *(const char **) set_flag_var = "";
1308 break;
1310 case CLVC_ENUM:
1312 const struct cl_enum *e = &cl_enums[option->var_enum];
1314 e->set (flag_var, value);
1315 if (set_flag_var)
1316 e->set (set_flag_var, 1);
1318 break;
1320 case CLVC_DEFER:
1322 vec<cl_deferred_option> *v
1323 = (vec<cl_deferred_option> *) *(void **) flag_var;
1324 cl_deferred_option p = {opt_index, arg, value};
1325 if (!v)
1326 v = XCNEW (vec<cl_deferred_option>);
1327 v->safe_push (p);
1328 *(void **) flag_var = v;
1329 if (set_flag_var)
1330 *(void **) set_flag_var = v;
1332 break;
1336 /* Return the address of the flag variable for option OPT_INDEX in
1337 options structure OPTS, or NULL if there is no flag variable. */
1339 void *
1340 option_flag_var (int opt_index, struct gcc_options *opts)
1342 const struct cl_option *option = &cl_options[opt_index];
1344 if (option->flag_var_offset == (unsigned short) -1)
1345 return NULL;
1346 return (void *)(((char *) opts) + option->flag_var_offset);
1349 /* Return 1 if option OPT_IDX is enabled in OPTS, 0 if it is disabled,
1350 or -1 if it isn't a simple on-off switch. */
1353 option_enabled (int opt_idx, void *opts)
1355 const struct cl_option *option = &(cl_options[opt_idx]);
1356 struct gcc_options *optsg = (struct gcc_options *) opts;
1357 void *flag_var = option_flag_var (opt_idx, optsg);
1359 if (flag_var)
1360 switch (option->var_type)
1362 case CLVC_BOOLEAN:
1363 return *(int *) flag_var != 0;
1365 case CLVC_EQUAL:
1366 if (option->cl_host_wide_int)
1367 return *(HOST_WIDE_INT *) flag_var == option->var_value;
1368 else
1369 return *(int *) flag_var == option->var_value;
1371 case CLVC_BIT_CLEAR:
1372 if (option->cl_host_wide_int)
1373 return (*(HOST_WIDE_INT *) flag_var & option->var_value) == 0;
1374 else
1375 return (*(int *) flag_var & option->var_value) == 0;
1377 case CLVC_BIT_SET:
1378 if (option->cl_host_wide_int)
1379 return (*(HOST_WIDE_INT *) flag_var & option->var_value) != 0;
1380 else
1381 return (*(int *) flag_var & option->var_value) != 0;
1383 case CLVC_STRING:
1384 case CLVC_ENUM:
1385 case CLVC_DEFER:
1386 break;
1388 return -1;
1391 /* Fill STATE with the current state of option OPTION in OPTS. Return
1392 true if there is some state to store. */
1394 bool
1395 get_option_state (struct gcc_options *opts, int option,
1396 struct cl_option_state *state)
1398 void *flag_var = option_flag_var (option, opts);
1400 if (flag_var == 0)
1401 return false;
1403 switch (cl_options[option].var_type)
1405 case CLVC_BOOLEAN:
1406 case CLVC_EQUAL:
1407 state->data = flag_var;
1408 state->size = (cl_options[option].cl_host_wide_int
1409 ? sizeof (HOST_WIDE_INT)
1410 : sizeof (int));
1411 break;
1413 case CLVC_BIT_CLEAR:
1414 case CLVC_BIT_SET:
1415 state->ch = option_enabled (option, opts);
1416 state->data = &state->ch;
1417 state->size = 1;
1418 break;
1420 case CLVC_STRING:
1421 state->data = *(const char **) flag_var;
1422 if (state->data == 0)
1423 state->data = "";
1424 state->size = strlen ((const char *) state->data) + 1;
1425 break;
1427 case CLVC_ENUM:
1428 state->data = flag_var;
1429 state->size = cl_enums[cl_options[option].var_enum].var_size;
1430 break;
1432 case CLVC_DEFER:
1433 return false;
1435 return true;
1438 /* Set a warning option OPT_INDEX (language mask LANG_MASK, option
1439 handlers HANDLERS) to have diagnostic kind KIND for option
1440 structures OPTS and OPTS_SET and diagnostic context DC (possibly
1441 NULL), at location LOC (UNKNOWN_LOCATION for -Werror=). ARG is the
1442 argument of the option for joined options, or NULL otherwise. If IMPLY,
1443 the warning option in question is implied at this point. This is
1444 used by -Werror= and #pragma GCC diagnostic. */
1446 void
1447 control_warning_option (unsigned int opt_index, int kind, const char *arg,
1448 bool imply, location_t loc, unsigned int lang_mask,
1449 const struct cl_option_handlers *handlers,
1450 struct gcc_options *opts,
1451 struct gcc_options *opts_set,
1452 diagnostic_context *dc)
1454 if (cl_options[opt_index].alias_target != N_OPTS)
1456 gcc_assert (!cl_options[opt_index].cl_separate_alias
1457 && !cl_options[opt_index].cl_negative_alias);
1458 if (cl_options[opt_index].alias_arg)
1459 arg = cl_options[opt_index].alias_arg;
1460 opt_index = cl_options[opt_index].alias_target;
1462 if (opt_index == OPT_SPECIAL_ignore)
1463 return;
1464 if (dc)
1465 diagnostic_classify_diagnostic (dc, opt_index, (diagnostic_t) kind, loc);
1466 if (imply)
1468 const struct cl_option *option = &cl_options[opt_index];
1470 /* -Werror=foo implies -Wfoo. */
1471 if (option->var_type == CLVC_BOOLEAN || option->var_type == CLVC_ENUM)
1473 int value = 1;
1475 if (arg && *arg == '\0' && !option->cl_missing_ok)
1476 arg = NULL;
1478 if ((option->flags & CL_JOINED) && arg == NULL)
1480 cmdline_handle_error (loc, option, option->opt_text, arg,
1481 CL_ERR_MISSING_ARG, lang_mask);
1482 return;
1485 /* If the switch takes an integer, convert it. */
1486 if (arg && option->cl_uinteger)
1488 value = integral_argument (arg);
1489 if (value == -1)
1491 cmdline_handle_error (loc, option, option->opt_text, arg,
1492 CL_ERR_UINT_ARG, lang_mask);
1493 return;
1497 /* If the switch takes an enumerated argument, convert it. */
1498 if (arg && option->var_type == CLVC_ENUM)
1500 const struct cl_enum *e = &cl_enums[option->var_enum];
1502 if (enum_arg_to_value (e->values, arg, &value, lang_mask))
1504 const char *carg = NULL;
1506 if (enum_value_to_arg (e->values, &carg, value, lang_mask))
1507 arg = carg;
1508 gcc_assert (carg != NULL);
1510 else
1512 cmdline_handle_error (loc, option, option->opt_text, arg,
1513 CL_ERR_ENUM_ARG, lang_mask);
1514 return;
1518 handle_generated_option (opts, opts_set,
1519 opt_index, arg, value, lang_mask,
1520 kind, loc, handlers, false, dc);