struct / union in initializer, RFE #901.
[sdcc.git] / sdcc / support / cpp / gcc / opts-common.cc
blob3abaff3f885c34bfd6faa8c4b2520b88e3888ca0
1 /* Command line option handling.
2 Copyright (C) 2006-2022 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 #define untested() { fprintf (stderr, "@@#\n@@@:%s:%d:%s\n", __FILE__, __LINE__, __func__); }
32 static void prune_options (struct cl_decoded_option **, unsigned int *);
34 /* An option that is undocumented, that takes a joined argument, and
35 that doesn't fit any of the classes of uses (language/common,
36 driver, target) is assumed to be a prefix used to catch
37 e.g. negated options, and stop them from being further shortened to
38 a prefix that could use the negated option as an argument. For
39 example, we want -gno-statement-frontiers to be taken as a negation
40 of -gstatement-frontiers, but without catching the gno- prefix and
41 signaling it's to be used for option remapping, it would end up
42 backtracked to g with no-statemnet-frontiers as the debug level. */
44 static bool
45 remapping_prefix_p (const struct cl_option *opt)
47 return opt->flags & CL_UNDOCUMENTED
48 && opt->flags & CL_JOINED
49 && !(opt->flags & (CL_DRIVER | CL_TARGET | CL_COMMON | CL_LANG_ALL));
52 /* Perform a binary search to find which option the command-line INPUT
53 matches. Returns its index in the option array, and
54 OPT_SPECIAL_unknown on failure.
56 This routine is quite subtle. A normal binary search is not good
57 enough because some options can be suffixed with an argument, and
58 multiple sub-matches can occur, e.g. input of "-pedantic" matching
59 the initial substring of "-pedantic-errors".
61 A more complicated example is -gstabs. It should match "-g" with
62 an argument of "stabs". Suppose, however, that the number and list
63 of switches are such that the binary search tests "-gen-decls"
64 before having tested "-g". This doesn't match, and as "-gen-decls"
65 is less than "-gstabs", it will become the lower bound of the
66 binary search range, and "-g" will never be seen. To resolve this
67 issue, 'optc-gen.awk' makes "-gen-decls" point, via the back_chain member,
68 to "-g" so that failed searches that end between "-gen-decls" and
69 the lexicographically subsequent switch know to go back and see if
70 "-g" causes a match (which it does in this example).
72 This search is done in such a way that the longest match for the
73 front end in question wins. If there is no match for the current
74 front end, the longest match for a different front end is returned
75 (or N_OPTS if none) and the caller emits an error message. */
76 size_t
77 find_opt (const char *input, unsigned int lang_mask)
79 size_t mn, mn_orig, mx, md, opt_len;
80 size_t match_wrong_lang;
81 int comp;
83 mn = 0;
84 mx = cl_options_count;
86 /* Find mn such this lexicographical inequality holds:
87 cl_options[mn] <= input < cl_options[mn + 1]. */
88 while (mx - mn > 1)
90 md = (mn + mx) / 2;
91 opt_len = cl_options[md].opt_len;
92 comp = strncmp (input, cl_options[md].opt_text + 1, opt_len);
94 if (comp < 0)
95 mx = md;
96 else
97 mn = md;
100 mn_orig = mn;
102 /* This is the switch that is the best match but for a different
103 front end, or OPT_SPECIAL_unknown if there is no match at all. */
104 match_wrong_lang = OPT_SPECIAL_unknown;
106 /* Backtrace the chain of possible matches, returning the longest
107 one, if any, that fits best. With current GCC switches, this
108 loop executes at most twice. */
111 const struct cl_option *opt = &cl_options[mn];
113 /* Is the input either an exact match or a prefix that takes a
114 joined argument? */
115 if (!strncmp (input, opt->opt_text + 1, opt->opt_len)
116 && (input[opt->opt_len] == '\0' || (opt->flags & CL_JOINED)))
118 /* If language is OK, return it. */
119 if (opt->flags & lang_mask){
120 return mn;
121 }else if (remapping_prefix_p (opt)) {untested();
122 return OPT_SPECIAL_unknown;
124 /* If we haven't remembered a prior match, remember this
125 one. Any prior match is necessarily better. */
126 }else if (match_wrong_lang == OPT_SPECIAL_unknown){
127 match_wrong_lang = mn;
128 }else{ untested();
132 /* Try the next possibility. This is cl_options_count if there
133 are no more. */
134 mn = opt->back_chain;
136 while (mn != cl_options_count);
138 if (match_wrong_lang == OPT_SPECIAL_unknown && input[0] == '-')
139 { untested();
140 /* Long options, starting "--", may be abbreviated if the
141 abbreviation is unambiguous. This only applies to options
142 not taking a joined argument, and abbreviations of "--option"
143 are permitted even if there is a variant "--option=". */
144 size_t mnc = mn_orig + 1;
145 size_t cmp_len = strlen (input);
146 while (mnc < cl_options_count
147 && strncmp (input, cl_options[mnc].opt_text + 1, cmp_len) == 0)
148 { untested();
149 /* Option matching this abbreviation. OK if it is the first
150 match and that does not take a joined argument, or the
151 second match, taking a joined argument and with only '='
152 added to the first match; otherwise considered
153 ambiguous. */
154 if (mnc == mn_orig + 1
155 && !(cl_options[mnc].flags & CL_JOINED))
156 match_wrong_lang = mnc;
157 else if (mnc == mn_orig + 2
158 && match_wrong_lang == mn_orig + 1
159 && (cl_options[mnc].flags & CL_JOINED)
160 && (cl_options[mnc].opt_len
161 == cl_options[mn_orig + 1].opt_len + 1)
162 && strncmp (cl_options[mnc].opt_text + 1,
163 cl_options[mn_orig + 1].opt_text + 1,
164 cl_options[mn_orig + 1].opt_len) == 0)
165 ; /* OK, as long as there are no more matches. */
166 else
167 return OPT_SPECIAL_unknown;
168 mnc++;
172 /* Return the best wrong match, or OPT_SPECIAL_unknown if none. */
173 return match_wrong_lang;
176 /* If ARG is a non-negative decimal or hexadecimal integer representable
177 in HOST_WIDE_INT return its value, otherwise return -1. If ERR is not
178 null set *ERR to zero on success or to EINVAL or to the value of errno
179 otherwise. */
181 HOST_WIDE_INT
182 integral_argument (const char *arg, int *err, bool byte_size_suffix)
183 { untested();
184 if (!err)
185 err = &errno;
187 if (!ISDIGIT (*arg))
188 { untested();
189 *err = EINVAL;
190 return -1;
193 *err = 0;
194 errno = 0;
196 char *end = NULL;
197 unsigned HOST_WIDE_INT unit = 1;
198 unsigned HOST_WIDE_INT value = strtoull (arg, &end, 10);
200 /* If the value is too large to be represented use the maximum
201 representable value that strtoull sets VALUE to (setting
202 errno to ERANGE). */
204 if (end && *end)
205 { untested();
206 if (!byte_size_suffix)
207 { untested();
208 errno = 0;
209 value = strtoull (arg, &end, 0);
210 if (*end)
211 { untested();
212 if (errno)
213 *err = errno;
214 else
215 *err = EINVAL;
216 return -1;
219 return value;
222 /* Numeric option arguments are at most INT_MAX. Make it
223 possible to specify a larger value by accepting common
224 suffixes. */
225 if (!strcmp (end, "kB"))
226 unit = 1000;
227 else if (!strcasecmp (end, "KiB") || !strcmp (end, "KB"))
228 unit = 1024;
229 else if (!strcmp (end, "MB"))
230 unit = HOST_WIDE_INT_UC (1000) * 1000;
231 else if (!strcasecmp (end, "MiB"))
232 unit = HOST_WIDE_INT_UC (1024) * 1024;
233 else if (!strcasecmp (end, "GB"))
234 unit = HOST_WIDE_INT_UC (1000) * 1000 * 1000;
235 else if (!strcasecmp (end, "GiB"))
236 unit = HOST_WIDE_INT_UC (1024) * 1024 * 1024;
237 else if (!strcasecmp (end, "TB"))
238 unit = HOST_WIDE_INT_UC (1000) * 1000 * 1000 * 1000;
239 else if (!strcasecmp (end, "TiB"))
240 unit = HOST_WIDE_INT_UC (1024) * 1024 * 1024 * 1024;
241 else if (!strcasecmp (end, "PB"))
242 unit = HOST_WIDE_INT_UC (1000) * 1000 * 1000 * 1000 * 1000;
243 else if (!strcasecmp (end, "PiB"))
244 unit = HOST_WIDE_INT_UC (1024) * 1024 * 1024 * 1024 * 1024;
245 else if (!strcasecmp (end, "EB"))
246 unit = HOST_WIDE_INT_UC (1000) * 1000 * 1000 * 1000 * 1000
247 * 1000;
248 else if (!strcasecmp (end, "EiB"))
249 unit = HOST_WIDE_INT_UC (1024) * 1024 * 1024 * 1024 * 1024
250 * 1024;
251 else
252 { untested();
253 /* This could mean an unknown suffix or a bad prefix, like
254 "+-1". */
255 *err = EINVAL;
256 return -1;
260 if (unit)
261 { untested();
262 unsigned HOST_WIDE_INT prod = value * unit;
263 value = prod < value ? HOST_WIDE_INT_M1U : prod;
266 return value;
269 /* Return whether OPTION is OK for the language given by
270 LANG_MASK. */
271 static bool
272 option_ok_for_language (const struct cl_option *option,
273 unsigned int lang_mask)
275 if (!(option->flags & lang_mask))
276 return false;
277 else if ((option->flags & CL_TARGET)
278 && (option->flags & (CL_LANG_ALL | CL_DRIVER))
279 && !(option->flags & (lang_mask & ~CL_COMMON & ~CL_TARGET)))
280 /* Complain for target flag language mismatches if any languages
281 are specified. */
282 return false;
283 return true;
286 /* Return whether ENUM_ARG is OK for the language given by
287 LANG_MASK. */
289 static bool
290 enum_arg_ok_for_language (const struct cl_enum_arg *enum_arg,
291 unsigned int lang_mask)
292 { untested();
293 return (lang_mask & CL_DRIVER) || !(enum_arg->flags & CL_ENUM_DRIVER_ONLY);
296 /* Look up ARG in ENUM_ARGS for language LANG_MASK, returning the cl_enum_arg
297 index and storing the value in *VALUE if found, and returning -1 without
298 modifying *VALUE if not found. */
300 static int
301 enum_arg_to_value (const struct cl_enum_arg *enum_args,
302 const char *arg, size_t len, HOST_WIDE_INT *value,
303 unsigned int lang_mask)
304 { untested();
305 unsigned int i;
307 for (i = 0; enum_args[i].arg != NULL; i++)
308 if ((len
309 ? (strncmp (arg, enum_args[i].arg, len) == 0
310 && enum_args[i].arg[len] == '\0')
311 : strcmp (arg, enum_args[i].arg) == 0)
312 && enum_arg_ok_for_language (&enum_args[i], lang_mask))
313 { untested();
314 *value = enum_args[i].value;
315 return i;
318 return -1;
321 /* Look up ARG in the enum used by option OPT_INDEX for language
322 LANG_MASK, returning true and storing the value in *VALUE if found,
323 and returning false without modifying *VALUE if not found. */
325 bool
326 opt_enum_arg_to_value (size_t opt_index, const char *arg,
327 int *value, unsigned int lang_mask)
328 { untested();
329 const struct cl_option *option = &cl_options[opt_index];
331 gcc_assert (option->var_type == CLVC_ENUM);
333 HOST_WIDE_INT wideval;
334 if (enum_arg_to_value (cl_enums[option->var_enum].values, arg, 0,
335 &wideval, lang_mask) >= 0)
336 { untested();
337 *value = wideval;
338 return true;
341 return false;
344 /* Look of VALUE in ENUM_ARGS for language LANG_MASK and store the
345 corresponding string in *ARGP, returning true if the found string
346 was marked as canonical, false otherwise. If VALUE is not found
347 (which may be the case for uninitialized values if the relevant
348 option has not been passed), set *ARGP to NULL and return
349 false. */
351 bool
352 enum_value_to_arg (const struct cl_enum_arg *enum_args,
353 const char **argp, int value, unsigned int lang_mask)
354 { untested();
355 unsigned int i;
357 for (i = 0; enum_args[i].arg != NULL; i++)
358 if (enum_args[i].value == value
359 && (enum_args[i].flags & CL_ENUM_CANONICAL)
360 && enum_arg_ok_for_language (&enum_args[i], lang_mask))
361 { untested();
362 *argp = enum_args[i].arg;
363 return true;
366 for (i = 0; enum_args[i].arg != NULL; i++)
367 if (enum_args[i].value == value
368 && enum_arg_ok_for_language (&enum_args[i], lang_mask))
369 { untested();
370 *argp = enum_args[i].arg;
371 return false;
374 *argp = NULL;
375 return false;
378 /* Fill in the canonical option part of *DECODED with an option
379 described by OPT_INDEX, ARG and VALUE. */
381 static void
382 generate_canonical_option (size_t opt_index, const char *arg,
383 HOST_WIDE_INT value,
384 struct cl_decoded_option *decoded)
386 const struct cl_option *option = &cl_options[opt_index];
387 const char *opt_text = option->opt_text;
389 if (value == 0
390 && !option->cl_reject_negative
391 && (opt_text[1] == 'W' || opt_text[1] == 'f'
392 || opt_text[1] == 'g' || opt_text[1] == 'm'))
394 char *t = XOBNEWVEC (&opts_obstack, char, option->opt_len + 5);
395 t[0] = '-';
396 t[1] = opt_text[1];
397 t[2] = 'n';
398 t[3] = 'o';
399 t[4] = '-';
400 memcpy (t + 5, opt_text + 2, option->opt_len);
401 opt_text = t;
404 decoded->canonical_option[2] = NULL;
405 decoded->canonical_option[3] = NULL;
407 if (arg)
409 if ((option->flags & CL_SEPARATE)
410 && !option->cl_separate_alias)
412 decoded->canonical_option[0] = opt_text;
413 decoded->canonical_option[1] = arg;
414 decoded->canonical_option_num_elements = 2;
416 else
418 gcc_assert (option->flags & CL_JOINED);
419 decoded->canonical_option[0] = opts_concat (opt_text, arg, NULL);
420 decoded->canonical_option[1] = NULL;
421 decoded->canonical_option_num_elements = 1;
424 else
426 decoded->canonical_option[0] = opt_text;
427 decoded->canonical_option[1] = NULL;
428 decoded->canonical_option_num_elements = 1;
432 /* Structure describing mappings from options on the command line to
433 options to look up with find_opt. */
434 struct option_map
436 /* Prefix of the option on the command line. */
437 const char *opt0;
438 /* If two argv elements are considered to be merged into one option,
439 prefix for the second element, otherwise NULL. */
440 const char *opt1;
441 /* The new prefix to map to. */
442 const char *new_prefix;
443 /* Whether at least one character is needed following opt1 or opt0
444 for this mapping to be used. (--optimize= is valid for -O, but
445 --warn- is not valid for -W.) */
446 bool another_char_needed;
447 /* Whether the original option is a negated form of the option
448 resulting from this map. */
449 bool negated;
451 static const struct option_map option_map[] =
453 { "-Wno-", NULL, "-W", false, true },
454 { "-fno-", NULL, "-f", false, true },
455 { "-gno-", NULL, "-g", false, true },
456 { "-mno-", NULL, "-m", false, true },
457 { "--debug=", NULL, "-g", false, false },
458 { "--machine-", NULL, "-m", true, false },
459 { "--machine-no-", NULL, "-m", false, true },
460 { "--machine=", NULL, "-m", false, false },
461 { "--machine=no-", NULL, "-m", false, true },
462 { "--machine", "", "-m", false, false },
463 { "--machine", "no-", "-m", false, true },
464 { "--optimize=", NULL, "-O", false, false },
465 { "--std=", NULL, "-std=", false, false },
466 { "--std", "", "-std=", false, false },
467 { "--warn-", NULL, "-W", true, false },
468 { "--warn-no-", NULL, "-W", false, true },
469 { "--", NULL, "-f", true, false },
470 { "--no-", NULL, "-f", false, true }
473 /* Helper function for gcc.cc's driver::suggest_option, for populating the
474 vec of suggestions for misspelled options.
476 option_map above provides various prefixes for spelling command-line
477 options, which decode_cmdline_option uses to map spellings of options
478 to specific options. We want to do the reverse: to find all the ways
479 that a user could validly spell an option.
481 Given valid OPT_TEXT (with a leading dash) for OPTION, add it and all
482 of its valid variant spellings to CANDIDATES, each without a leading
483 dash.
485 For example, given "-Wabi-tag", the following are added to CANDIDATES:
486 "Wabi-tag"
487 "Wno-abi-tag"
488 "-warn-abi-tag"
489 "-warn-no-abi-tag".
491 The added strings must be freed using free. */
493 void
494 add_misspelling_candidates (auto_vec<char *> *candidates,
495 const struct cl_option *option,
496 const char *opt_text)
497 { untested();
498 gcc_assert (candidates);
499 gcc_assert (option);
500 gcc_assert (opt_text);
501 if (remapping_prefix_p (option))
502 return;
503 candidates->safe_push (xstrdup (opt_text + 1));
504 for (unsigned i = 0; i < ARRAY_SIZE (option_map); i++)
505 { untested();
506 const char *opt0 = option_map[i].opt0;
507 const char *new_prefix = option_map[i].new_prefix;
508 size_t new_prefix_len = strlen (new_prefix);
510 if (option->cl_reject_negative && option_map[i].negated)
511 continue;
513 if (strncmp (opt_text, new_prefix, new_prefix_len) == 0)
514 { untested();
515 char *alternative = concat (opt0 + 1, opt_text + new_prefix_len,
516 NULL);
517 candidates->safe_push (alternative);
521 /* For all params (e.g. --param=key=value),
522 include also '--param key=value'. */
523 const char *prefix = "--param=";
524 if (strstr (opt_text, prefix) == opt_text)
525 { untested();
526 char *param = xstrdup (opt_text + 1);
527 gcc_assert (param[6] == '=');
528 param[6] = ' ';
529 candidates->safe_push (param);
533 /* Decode the switch beginning at ARGV for the language indicated by
534 LANG_MASK (including CL_COMMON and CL_TARGET if applicable), into
535 the structure *DECODED. Returns the number of switches
536 consumed. */
538 static unsigned int
539 decode_cmdline_option (const char *const *argv, unsigned int lang_mask,
540 struct cl_decoded_option *decoded)
542 size_t opt_index;
543 const char *arg = 0;
544 HOST_WIDE_INT value = 1, mask = 0;
545 unsigned int result = 1, i, extra_args, separate_args = 0;
546 int adjust_len = 0;
547 size_t total_len;
548 char *p;
549 const struct cl_option *option;
550 int errors = 0;
551 const char *warn_message = NULL;
552 bool separate_arg_flag;
553 bool joined_arg_flag;
554 bool have_separate_arg = false;
556 extra_args = 0;
558 const char *opt_value = argv[0] + 1;
559 opt_index = find_opt (opt_value, lang_mask);
560 i = 0;
561 while (opt_index == OPT_SPECIAL_unknown
562 && i < ARRAY_SIZE (option_map))
564 const char *opt0 = option_map[i].opt0;
565 const char *opt1 = option_map[i].opt1;
566 const char *new_prefix = option_map[i].new_prefix;
567 bool another_char_needed = option_map[i].another_char_needed;
568 size_t opt0_len = strlen (opt0);
569 size_t opt1_len = (opt1 == NULL ? 0 : strlen (opt1));
570 size_t optn_len = (opt1 == NULL ? opt0_len : opt1_len);
571 size_t new_prefix_len = strlen (new_prefix);
573 extra_args = (opt1 == NULL ? 0 : 1);
574 value = !option_map[i].negated;
576 if (strncmp (argv[0], opt0, opt0_len) == 0
577 && (opt1 == NULL
578 || (argv[1] != NULL && strncmp (argv[1], opt1, opt1_len) == 0))
579 && (!another_char_needed
580 || argv[extra_args][optn_len] != 0))
581 { untested();
582 size_t arglen = strlen (argv[extra_args]);
583 char *dup;
585 adjust_len = (int) optn_len - (int) new_prefix_len;
586 dup = XNEWVEC (char, arglen + 1 - adjust_len);
587 memcpy (dup, new_prefix, new_prefix_len);
588 memcpy (dup + new_prefix_len, argv[extra_args] + optn_len,
589 arglen - optn_len + 1);
590 opt_index = find_opt (dup + 1, lang_mask);
591 free (dup);
593 i++;
596 if (opt_index == OPT_SPECIAL_unknown)
598 arg = argv[0];
599 extra_args = 0;
600 value = 1;
601 goto done;
604 option = &cl_options[opt_index];
606 /* Reject negative form of switches that don't take negatives as
607 unrecognized. */
608 if (!value && option->cl_reject_negative)
609 { untested();
610 opt_index = OPT_SPECIAL_unknown;
611 errors |= CL_ERR_NEGATIVE;
612 arg = argv[0];
613 goto done;
616 /* Clear the initial value for size options (it will be overwritten
617 later based on the Init(value) specification in the opt file. */
618 if (option->var_type == CLVC_SIZE)
619 value = 0;
621 result = extra_args + 1;
622 warn_message = option->warn_message;
624 /* Check to see if the option is disabled for this configuration. */
625 if (option->cl_disabled)
626 errors |= CL_ERR_DISABLED;
628 /* Determine whether there may be a separate argument based on
629 whether this option is being processed for the driver, and, if
630 so, how many such arguments. */
631 separate_arg_flag = ((option->flags & CL_SEPARATE)
632 && !(option->cl_no_driver_arg
633 && (lang_mask & CL_DRIVER)));
634 separate_args = (separate_arg_flag
635 ? option->cl_separate_nargs + 1
636 : 0);
637 joined_arg_flag = (option->flags & CL_JOINED) != 0;
639 /* Sort out any argument the switch takes. */
640 if (joined_arg_flag)
642 /* Have arg point to the original switch. This is because
643 some code, such as disable_builtin_function, expects its
644 argument to be persistent until the program exits. */
645 arg = argv[extra_args] + cl_options[opt_index].opt_len + 1 + adjust_len;
647 if (*arg == '\0' && !option->cl_missing_ok)
649 if (separate_arg_flag)
651 arg = argv[extra_args + 1];
652 result = extra_args + 2;
653 if (arg == NULL)
654 result = extra_args + 1;
655 else
656 have_separate_arg = true;
658 else
659 /* Missing argument. */
660 arg = NULL;
663 else if (separate_arg_flag)
665 arg = argv[extra_args + 1];
666 for (i = 0; i < separate_args; i++)
667 if (argv[extra_args + 1 + i] == NULL)
668 { untested();
669 errors |= CL_ERR_MISSING_ARG;
670 break;
672 result = extra_args + 1 + i;
673 if (arg != NULL)
674 have_separate_arg = true;
677 if (arg == NULL && (separate_arg_flag || joined_arg_flag))
678 errors |= CL_ERR_MISSING_ARG;
680 /* Is this option an alias (or an ignored option, marked as an alias
681 of OPT_SPECIAL_ignore)? */
682 if (option->alias_target != N_OPTS
683 && (!option->cl_separate_alias || have_separate_arg))
685 size_t new_opt_index = option->alias_target;
687 if (new_opt_index == OPT_SPECIAL_ignore
688 || new_opt_index == OPT_SPECIAL_warn_removed)
689 { untested();
690 gcc_assert (option->alias_arg == NULL);
691 gcc_assert (option->neg_alias_arg == NULL);
692 opt_index = new_opt_index;
693 arg = NULL;
695 else
697 const struct cl_option *new_option = &cl_options[new_opt_index];
699 /* The new option must not be an alias itself. */
700 gcc_assert (new_option->alias_target == N_OPTS
701 || new_option->cl_separate_alias);
703 if (option->neg_alias_arg)
704 { untested();
705 gcc_assert (option->alias_arg != NULL);
706 gcc_assert (arg == NULL);
707 gcc_assert (!option->cl_negative_alias);
708 if (value)
709 arg = option->alias_arg;
710 else
711 arg = option->neg_alias_arg;
712 value = 1;
714 else if (option->alias_arg)
715 { untested();
716 gcc_assert (value == 1);
717 gcc_assert (arg == NULL);
718 gcc_assert (!option->cl_negative_alias);
719 arg = option->alias_arg;
722 if (option->cl_negative_alias)
723 value = !value;
725 opt_index = new_opt_index;
726 option = new_option;
728 if (value == 0)
729 gcc_assert (!option->cl_reject_negative);
731 /* Recompute what arguments are allowed. */
732 separate_arg_flag = ((option->flags & CL_SEPARATE)
733 && !(option->cl_no_driver_arg
734 && (lang_mask & CL_DRIVER)));
735 joined_arg_flag = (option->flags & CL_JOINED) != 0;
737 if (separate_args > 1 || option->cl_separate_nargs)
738 gcc_assert (separate_args
739 == (unsigned int) option->cl_separate_nargs + 1);
741 if (!(errors & CL_ERR_MISSING_ARG))
743 if (separate_arg_flag || joined_arg_flag)
745 if (option->cl_missing_ok && arg == NULL)
746 arg = "";
747 gcc_assert (arg != NULL);
749 else
750 gcc_assert (arg == NULL);
753 /* Recheck for warnings and disabled options. */
754 if (option->warn_message)
755 { untested();
756 gcc_assert (warn_message == NULL);
757 warn_message = option->warn_message;
759 if (option->cl_disabled)
760 errors |= CL_ERR_DISABLED;
764 /* Check if this is a switch for a different front end. */
765 if (!option_ok_for_language (option, lang_mask))
766 errors |= CL_ERR_WRONG_LANG;
767 else if (strcmp (option->opt_text, "-Werror=") == 0
768 && strchr (opt_value, ',') == NULL)
769 { untested();
770 /* Verify that -Werror argument is a valid warning
771 for a language. */
772 char *werror_arg = xstrdup (opt_value + 6);
773 werror_arg[0] = 'W';
775 size_t warning_index = find_opt (werror_arg, lang_mask);
776 free (werror_arg);
777 if (warning_index != OPT_SPECIAL_unknown)
778 { untested();
779 const struct cl_option *warning_option
780 = &cl_options[warning_index];
781 if (!option_ok_for_language (warning_option, lang_mask))
782 errors |= CL_ERR_WRONG_LANG;
786 /* Convert the argument to lowercase if appropriate. */
787 if (arg && option->cl_tolower)
788 { untested();
789 size_t j;
790 size_t len = strlen (arg);
791 char *arg_lower = XOBNEWVEC (&opts_obstack, char, len + 1);
793 for (j = 0; j < len; j++)
794 arg_lower[j] = TOLOWER ((unsigned char) arg[j]);
795 arg_lower[len] = 0;
796 arg = arg_lower;
799 /* If the switch takes an integer argument, convert it. */
800 if (arg && (option->cl_uinteger || option->cl_host_wide_int))
801 { untested();
802 int error = 0;
803 value = *arg ? integral_argument (arg, &error, option->cl_byte_size) : 0;
804 if (error)
805 errors |= CL_ERR_UINT_ARG;
807 /* Reject value out of a range. */
808 if (option->range_max != -1
809 && (value < option->range_min || value > option->range_max))
810 errors |= CL_ERR_INT_RANGE_ARG;
813 /* If the switch takes an enumerated argument, convert it. */
814 if (arg && (option->var_type == CLVC_ENUM))
815 { untested();
816 const struct cl_enum *e = &cl_enums[option->var_enum];
818 gcc_assert (option->var_value != CLEV_NORMAL || value == 1);
819 if (option->var_value != CLEV_NORMAL)
820 { untested();
821 const char *p = arg;
822 HOST_WIDE_INT sum_value = 0;
823 unsigned HOST_WIDE_INT used_sets = 0;
825 { untested();
826 const char *q = strchr (p, ',');
827 HOST_WIDE_INT this_value = 0;
828 if (q && q == p)
829 { untested();
830 errors |= CL_ERR_ENUM_SET_ARG;
831 break;
833 int idx = enum_arg_to_value (e->values, p, q ? q - p : 0,
834 &this_value, lang_mask);
835 if (idx < 0)
836 { untested();
837 errors |= CL_ERR_ENUM_SET_ARG;
838 break;
841 HOST_WIDE_INT this_mask = 0;
842 if (option->var_value == CLEV_SET)
843 { untested();
844 unsigned set = e->values[idx].flags >> CL_ENUM_SET_SHIFT;
845 gcc_checking_assert (set >= 1
846 && set <= HOST_BITS_PER_WIDE_INT);
847 if ((used_sets & (HOST_WIDE_INT_1U << (set - 1))) != 0)
848 { untested();
849 errors |= CL_ERR_ENUM_SET_ARG;
850 break;
852 used_sets |= HOST_WIDE_INT_1U << (set - 1);
854 for (int i = 0; e->values[i].arg != NULL; i++)
855 if (set == (e->values[i].flags >> CL_ENUM_SET_SHIFT))
856 this_mask |= e->values[i].value;
858 else
859 { untested();
860 gcc_assert (option->var_value == CLEV_BITSET
861 && ((e->values[idx].flags >> CL_ENUM_SET_SHIFT)
862 == 0));
863 this_mask = this_value;
866 sum_value |= this_value;
867 mask |= this_mask;
868 if (q == NULL)
869 break;
870 p = q + 1;
872 while (1);
873 if (value == 1)
874 value = sum_value;
875 else
876 gcc_checking_assert (value == 0);
878 else if (enum_arg_to_value (e->values, arg, 0, &value, lang_mask) >= 0)
879 { untested();
880 const char *carg = NULL;
882 if (enum_value_to_arg (e->values, &carg, value, lang_mask))
883 arg = carg;
884 gcc_assert (carg != NULL);
886 else
887 errors |= CL_ERR_ENUM_ARG;
890 done:
891 decoded->opt_index = opt_index;
892 decoded->arg = arg;
893 decoded->value = value;
894 decoded->mask = mask;
895 decoded->errors = errors;
896 decoded->warn_message = warn_message;
898 if (opt_index == OPT_SPECIAL_unknown)
899 gcc_assert (result == 1);
901 gcc_assert (result >= 1 && result <= ARRAY_SIZE (decoded->canonical_option));
902 decoded->canonical_option_num_elements = result;
903 total_len = 0;
904 for (i = 0; i < ARRAY_SIZE (decoded->canonical_option); i++)
906 if (i < result)
908 size_t len;
909 if (opt_index == OPT_SPECIAL_unknown)
910 decoded->canonical_option[i] = argv[i];
911 else
912 decoded->canonical_option[i] = NULL;
913 len = strlen (argv[i]);
914 /* If the argument is an empty string, we will print it as "" in
915 orig_option_with_args_text. */
916 total_len += (len != 0 ? len : 2) + 1;
918 else
919 decoded->canonical_option[i] = NULL;
921 if (opt_index != OPT_SPECIAL_unknown && opt_index != OPT_SPECIAL_ignore
922 && opt_index != OPT_SPECIAL_warn_removed)
924 generate_canonical_option (opt_index, arg, value, decoded);
925 if (separate_args > 1)
926 { untested();
927 for (i = 0; i < separate_args; i++)
928 { untested();
929 if (argv[extra_args + 1 + i] == NULL)
930 break;
931 else
932 decoded->canonical_option[1 + i] = argv[extra_args + 1 + i];
934 gcc_assert (result == 1 + i);
935 decoded->canonical_option_num_elements = result;
938 decoded->orig_option_with_args_text
939 = p = XOBNEWVEC (&opts_obstack, char, total_len);
940 for (i = 0; i < result; i++)
942 size_t len = strlen (argv[i]);
944 /* Print the empty string verbally. */
945 if (len == 0)
946 { untested();
947 *p++ = '"';
948 *p++ = '"';
950 else
951 memcpy (p, argv[i], len);
952 p += len;
953 if (i == result - 1)
954 *p++ = 0;
955 else
956 *p++ = ' ';
959 return result;
962 /* Obstack for option strings. */
964 struct obstack opts_obstack;
966 /* Like libiberty concat, but allocate using opts_obstack. */
968 char *
969 opts_concat (const char *first, ...)
971 char *newstr, *end;
972 size_t length = 0;
973 const char *arg;
974 va_list ap;
976 /* First compute the size of the result and get sufficient memory. */
977 va_start (ap, first);
978 for (arg = first; arg; arg = va_arg (ap, const char *))
979 length += strlen (arg);
980 newstr = XOBNEWVEC (&opts_obstack, char, length + 1);
981 va_end (ap);
983 /* Now copy the individual pieces to the result string. */
984 va_start (ap, first);
985 for (arg = first, end = newstr; arg; arg = va_arg (ap, const char *))
987 length = strlen (arg);
988 memcpy (end, arg, length);
989 end += length;
991 *end = '\0';
992 va_end (ap);
993 return newstr;
996 /* Decode command-line options (ARGC and ARGV being the arguments of
997 main) into an array, setting *DECODED_OPTIONS to a pointer to that
998 array and *DECODED_OPTIONS_COUNT to the number of entries in the
999 array. The first entry in the array is always one for the program
1000 name (OPT_SPECIAL_program_name). LANG_MASK indicates the language
1001 flags applicable for decoding (including CL_COMMON and CL_TARGET if
1002 those options should be considered applicable). Do not produce any
1003 diagnostics or set state outside of these variables. */
1005 void
1006 decode_cmdline_options_to_array (unsigned int argc, const char **argv,
1007 unsigned int lang_mask,
1008 struct cl_decoded_option **decoded_options,
1009 unsigned int *decoded_options_count)
1011 unsigned int n, i;
1012 struct cl_decoded_option *opt_array;
1013 unsigned int num_decoded_options;
1015 int opt_array_len = argc;
1016 opt_array = XNEWVEC (struct cl_decoded_option, opt_array_len);
1018 opt_array[0].opt_index = OPT_SPECIAL_program_name;
1019 opt_array[0].warn_message = NULL;
1020 opt_array[0].arg = argv[0];
1021 opt_array[0].orig_option_with_args_text = argv[0];
1022 opt_array[0].canonical_option_num_elements = 1;
1023 opt_array[0].canonical_option[0] = argv[0];
1024 opt_array[0].canonical_option[1] = NULL;
1025 opt_array[0].canonical_option[2] = NULL;
1026 opt_array[0].canonical_option[3] = NULL;
1027 opt_array[0].value = 1;
1028 opt_array[0].mask = 0;
1029 opt_array[0].errors = 0;
1030 num_decoded_options = 1;
1032 for (i = 1; i < argc; i += n)
1034 const char *opt = argv[i];
1036 /* Interpret "-" or a non-switch as a file name. */
1037 if (opt[0] != '-' || opt[1] == '\0')
1039 generate_option_input_file (opt, &opt_array[num_decoded_options]);
1040 num_decoded_options++;
1041 n = 1;
1042 continue;
1045 /* Interpret "--param" "key=name" as "--param=key=name". */
1046 const char *needle = "--param";
1047 if (i + 1 < argc && strcmp (opt, needle) == 0)
1048 { untested();
1049 const char *replacement
1050 = opts_concat (needle, "=", argv[i + 1], NULL);
1051 argv[++i] = replacement;
1054 /* Expand -fdiagnostics-plain-output to its constituents. This needs
1055 to happen here so that prune_options can handle -fdiagnostics-color
1056 specially. */
1057 if (!strcmp (opt, "-fdiagnostics-plain-output"))
1058 { untested();
1059 /* If you have changed the default diagnostics output, and this new
1060 output is not appropriately "plain" (e.g., the change needs to be
1061 undone in order for the testsuite to work properly), then please do
1062 the following:
1063 1. Add the necessary option to undo the new behavior to
1064 the array below.
1065 2. Update the documentation for -fdiagnostics-plain-output
1066 in invoke.texi. */
1067 const char *const expanded_args[] = {
1068 "-fno-diagnostics-show-caret",
1069 "-fno-diagnostics-show-line-numbers",
1070 "-fdiagnostics-color=never",
1071 "-fdiagnostics-urls=never",
1072 "-fdiagnostics-path-format=separate-events",
1074 const int num_expanded = ARRAY_SIZE (expanded_args);
1075 opt_array_len += num_expanded - 1;
1076 opt_array = XRESIZEVEC (struct cl_decoded_option,
1077 opt_array, opt_array_len);
1078 for (int j = 0, nj; j < num_expanded; j += nj)
1079 { untested();
1080 nj = decode_cmdline_option (expanded_args + j, lang_mask,
1081 &opt_array[num_decoded_options]);
1082 num_decoded_options++;
1085 n = 1;
1086 continue;
1089 n = decode_cmdline_option (argv + i, lang_mask,
1090 &opt_array[num_decoded_options]);
1091 num_decoded_options++;
1094 *decoded_options = opt_array;
1095 *decoded_options_count = num_decoded_options;
1096 prune_options (decoded_options, decoded_options_count);
1099 /* Return true if NEXT_OPT_IDX cancels OPT_IDX. Return false if the
1100 next one is the same as ORIG_NEXT_OPT_IDX. */
1102 static bool
1103 cancel_option (int opt_idx, int next_opt_idx, int orig_next_opt_idx)
1105 /* An option can be canceled by the same option or an option with
1106 Negative. */
1107 if (cl_options [next_opt_idx].neg_index == opt_idx)
1108 return true;
1110 if (cl_options [next_opt_idx].neg_index != orig_next_opt_idx)
1111 return cancel_option (opt_idx, cl_options [next_opt_idx].neg_index,
1112 orig_next_opt_idx);
1114 return false;
1117 /* Filter out options canceled by the ones after them. */
1119 static void
1120 prune_options (struct cl_decoded_option **decoded_options,
1121 unsigned int *decoded_options_count)
1123 unsigned int old_decoded_options_count = *decoded_options_count;
1124 struct cl_decoded_option *old_decoded_options = *decoded_options;
1125 unsigned int new_decoded_options_count;
1126 struct cl_decoded_option *new_decoded_options
1127 = XNEWVEC (struct cl_decoded_option, old_decoded_options_count);
1128 unsigned int i;
1129 const struct cl_option *option;
1130 unsigned int fdiagnostics_color_idx = 0;
1132 /* Remove arguments which are negated by others after them. */
1133 new_decoded_options_count = 0;
1134 for (i = 0; i < old_decoded_options_count; i++)
1136 unsigned int j, opt_idx, next_opt_idx;
1138 if (old_decoded_options[i].errors & ~CL_ERR_WRONG_LANG)
1139 goto keep;
1141 opt_idx = old_decoded_options[i].opt_index;
1142 switch (opt_idx)
1144 case OPT_SPECIAL_unknown:
1145 case OPT_SPECIAL_ignore:
1146 case OPT_SPECIAL_warn_removed:
1147 case OPT_SPECIAL_program_name:
1148 case OPT_SPECIAL_input_file:
1149 goto keep;
1151 /* Do not save OPT_fdiagnostics_color_, just remember the last one. */
1152 case OPT_fdiagnostics_color_:
1153 fdiagnostics_color_idx = i;
1154 continue;
1156 default:
1157 gcc_assert (opt_idx < cl_options_count);
1158 option = &cl_options[opt_idx];
1159 if (option->neg_index < 0)
1160 goto keep;
1162 /* Skip joined switches. */
1163 if ((option->flags & CL_JOINED)
1164 && (!option->cl_reject_negative
1165 || (unsigned int) option->neg_index != opt_idx))
1166 goto keep;
1168 for (j = i + 1; j < old_decoded_options_count; j++)
1170 if (old_decoded_options[j].errors & ~CL_ERR_WRONG_LANG)
1171 continue;
1172 next_opt_idx = old_decoded_options[j].opt_index;
1173 if (next_opt_idx >= cl_options_count)
1174 continue;
1175 if (cl_options[next_opt_idx].neg_index < 0)
1176 continue;
1177 if ((cl_options[next_opt_idx].flags & CL_JOINED)
1178 && (!cl_options[next_opt_idx].cl_reject_negative
1179 || ((unsigned int) cl_options[next_opt_idx].neg_index
1180 != next_opt_idx)))
1181 continue;
1182 if (cancel_option (opt_idx, next_opt_idx, next_opt_idx))
1183 break;
1185 if (j == old_decoded_options_count)
1187 keep:
1188 new_decoded_options[new_decoded_options_count]
1189 = old_decoded_options[i];
1190 new_decoded_options_count++;
1192 break;
1196 if (fdiagnostics_color_idx >= 1)
1197 { untested();
1198 /* We put the last -fdiagnostics-color= at the first position
1199 after argv[0] so it can take effect immediately. */
1200 memmove (new_decoded_options + 2, new_decoded_options + 1,
1201 sizeof (struct cl_decoded_option)
1202 * (new_decoded_options_count - 1));
1203 new_decoded_options[1] = old_decoded_options[fdiagnostics_color_idx];
1204 new_decoded_options_count++;
1207 free (old_decoded_options);
1208 new_decoded_options = XRESIZEVEC (struct cl_decoded_option,
1209 new_decoded_options,
1210 new_decoded_options_count);
1211 *decoded_options = new_decoded_options;
1212 *decoded_options_count = new_decoded_options_count;
1215 /* Handle option DECODED for the language indicated by LANG_MASK,
1216 using the handlers in HANDLERS and setting fields in OPTS and
1217 OPTS_SET. KIND is the diagnostic_t if this is a diagnostics
1218 option, DK_UNSPECIFIED otherwise, and LOC is the location of the
1219 option for options from the source file, UNKNOWN_LOCATION
1220 otherwise. GENERATED_P is true for an option generated as part of
1221 processing another option or otherwise generated internally, false
1222 for one explicitly passed by the user. control_warning_option
1223 generated options are considered explicitly passed by the user.
1224 Returns false if the switch was invalid. DC is the diagnostic
1225 context for options affecting diagnostics state, or NULL. */
1227 static bool
1228 handle_option (struct gcc_options *opts,
1229 struct gcc_options *opts_set,
1230 const struct cl_decoded_option *decoded,
1231 unsigned int lang_mask, int kind, location_t loc,
1232 const struct cl_option_handlers *handlers,
1233 bool generated_p, diagnostic_context *dc)
1235 size_t opt_index = decoded->opt_index;
1236 const char *arg = decoded->arg;
1237 HOST_WIDE_INT value = decoded->value;
1238 HOST_WIDE_INT mask = decoded->mask;
1239 const struct cl_option *option = &cl_options[opt_index];
1240 void *flag_var = option_flag_var (opt_index, opts);
1241 size_t i;
1243 if (flag_var)
1244 set_option (opts, (generated_p ? NULL : opts_set),
1245 opt_index, value, arg, kind, loc, dc, mask);
1247 for (i = 0; i < handlers->num_handlers; i++)
1248 if (option->flags & handlers->handlers[i].mask)
1250 if(!handlers->handlers[i].handler){
1251 return false;
1252 }else if (!handlers->handlers[i].handler (opts, opts_set, decoded,
1253 lang_mask, kind, loc,
1254 handlers, dc,
1255 handlers->target_option_override_hook))
1256 return false;
1259 return true;
1262 /* Like handle_option, but OPT_INDEX, ARG and VALUE describe the
1263 option instead of DECODED. This is used for callbacks when one
1264 option implies another instead of an option being decoded from the
1265 command line. */
1267 bool
1268 handle_generated_option (struct gcc_options *opts,
1269 struct gcc_options *opts_set,
1270 size_t opt_index, const char *arg, HOST_WIDE_INT value,
1271 unsigned int lang_mask, int kind, location_t loc,
1272 const struct cl_option_handlers *handlers,
1273 bool generated_p, diagnostic_context *dc)
1275 struct cl_decoded_option decoded;
1277 generate_option (opt_index, arg, value, lang_mask, &decoded);
1278 return handle_option (opts, opts_set, &decoded, lang_mask, kind, loc,
1279 handlers, generated_p, dc);
1282 /* Fill in *DECODED with an option described by OPT_INDEX, ARG and
1283 VALUE for a front end using LANG_MASK. This is used when the
1284 compiler generates options internally. */
1286 void
1287 generate_option (size_t opt_index, const char *arg, HOST_WIDE_INT value,
1288 unsigned int lang_mask, struct cl_decoded_option *decoded)
1290 const struct cl_option *option = &cl_options[opt_index];
1292 decoded->opt_index = opt_index;
1293 decoded->warn_message = NULL;
1294 decoded->arg = arg;
1295 decoded->value = value;
1296 decoded->mask = 0;
1297 decoded->errors = (option_ok_for_language (option, lang_mask)
1299 : CL_ERR_WRONG_LANG);
1301 generate_canonical_option (opt_index, arg, value, decoded);
1302 switch (decoded->canonical_option_num_elements)
1304 case 1:
1305 decoded->orig_option_with_args_text = decoded->canonical_option[0];
1306 break;
1308 case 2:
1309 decoded->orig_option_with_args_text
1310 = opts_concat (decoded->canonical_option[0], " ",
1311 decoded->canonical_option[1], NULL);
1312 break;
1314 default:
1315 gcc_unreachable ();
1319 /* Fill in *DECODED with an option for input file FILE. */
1321 void
1322 generate_option_input_file (const char *file,
1323 struct cl_decoded_option *decoded)
1325 decoded->opt_index = OPT_SPECIAL_input_file;
1326 decoded->warn_message = NULL;
1327 decoded->arg = file;
1328 decoded->orig_option_with_args_text = file;
1329 decoded->canonical_option_num_elements = 1;
1330 decoded->canonical_option[0] = file;
1331 decoded->canonical_option[1] = NULL;
1332 decoded->canonical_option[2] = NULL;
1333 decoded->canonical_option[3] = NULL;
1334 decoded->value = 1;
1335 decoded->mask = 0;
1336 decoded->errors = 0;
1339 /* Helper function for listing valid choices and hint for misspelled
1340 value. CANDIDATES is a vector containing all valid strings,
1341 STR is set to a heap allocated string that contains all those
1342 strings concatenated, separated by spaces, and the return value
1343 is the closest string from those to ARG, or NULL if nothing is
1344 close enough. Callers should XDELETEVEC (STR) after using it
1345 to avoid memory leaks. */
1347 const char *
1348 candidates_list_and_hint (const char *arg, char *&str,
1349 const auto_vec <const char *> &candidates)
1350 { untested();
1351 size_t len = 0;
1352 int i;
1353 const char *candidate;
1354 char *p;
1356 FOR_EACH_VEC_ELT (candidates, i, candidate)
1357 len += strlen (candidate) + 1;
1359 str = p = XNEWVEC (char, len);
1360 FOR_EACH_VEC_ELT (candidates, i, candidate)
1361 { untested();
1362 len = strlen (candidate);
1363 memcpy (p, candidate, len);
1364 p[len] = ' ';
1365 p += len + 1;
1367 p[-1] = '\0';
1368 return find_closest_string (arg, &candidates);
1371 /* Perform diagnostics for read_cmdline_option and control_warning_option
1372 functions. Returns true if an error has been diagnosed.
1373 LOC and LANG_MASK arguments like in read_cmdline_option.
1374 OPTION is the option to report diagnostics for, OPT the name
1375 of the option as text, ARG the argument of the option (for joined
1376 options), ERRORS is bitmask of CL_ERR_* values. */
1378 static bool
1379 cmdline_handle_error (location_t loc, const struct cl_option *option,
1380 const char *opt, const char *arg, int errors,
1381 unsigned int lang_mask)
1383 if (errors & CL_ERR_DISABLED)
1384 { untested();
1385 error_at (loc, "command-line option %qs"
1386 " is not supported by this configuration", opt);
1387 return true;
1390 if (errors & CL_ERR_MISSING_ARG)
1391 { untested();
1392 if (option->missing_argument_error)
1393 error_at (loc, option->missing_argument_error, opt);
1394 else
1395 error_at (loc, "missing argument to %qs", opt);
1396 return true;
1399 if (errors & CL_ERR_UINT_ARG)
1400 { untested();
1401 if (option->cl_byte_size)
1402 error_at (loc, "argument to %qs should be a non-negative integer "
1403 "optionally followed by a size unit",
1404 option->opt_text);
1405 else
1406 error_at (loc, "argument to %qs should be a non-negative integer",
1407 option->opt_text);
1408 return true;
1411 if (errors & CL_ERR_INT_RANGE_ARG)
1412 { untested();
1413 error_at (loc, "argument to %qs is not between %d and %d",
1414 option->opt_text, option->range_min, option->range_max);
1415 return true;
1418 if (errors & CL_ERR_ENUM_SET_ARG)
1419 { untested();
1420 const struct cl_enum *e = &cl_enums[option->var_enum];
1421 const char *p = arg;
1422 unsigned HOST_WIDE_INT used_sets = 0;
1423 const char *second_opt = NULL;
1424 size_t second_opt_len = 0;
1425 errors = 0;
1427 { untested();
1428 const char *q = strchr (p, ',');
1429 HOST_WIDE_INT this_value = 0;
1430 if (q && q == p)
1431 { untested();
1432 arg = "";
1433 errors = CL_ERR_ENUM_ARG;
1434 break;
1436 int idx = enum_arg_to_value (e->values, p, q ? q - p : 0,
1437 &this_value, lang_mask);
1438 if (idx < 0)
1439 { untested();
1440 if (q == NULL)
1441 q = strchr (p, '\0');
1442 char *narg = XALLOCAVEC (char, (q - p) + 1);
1443 memcpy (narg, p, q - p);
1444 narg[q - p] = '\0';
1445 arg = narg;
1446 errors = CL_ERR_ENUM_ARG;
1447 break;
1450 if (option->var_value == CLEV_BITSET)
1451 { untested();
1452 if (q == NULL)
1453 break;
1454 p = q + 1;
1455 continue;
1458 unsigned set = e->values[idx].flags >> CL_ENUM_SET_SHIFT;
1459 gcc_checking_assert (set >= 1 && set <= HOST_BITS_PER_WIDE_INT);
1460 if ((used_sets & (HOST_WIDE_INT_1U << (set - 1))) != 0)
1461 { untested();
1462 if (q == NULL)
1463 q = strchr (p, '\0');
1464 if (second_opt == NULL)
1465 { untested();
1466 used_sets = HOST_WIDE_INT_1U << (set - 1);
1467 second_opt = p;
1468 second_opt_len = q - p;
1469 p = arg;
1470 continue;
1472 char *args = XALLOCAVEC (char, (q - p) + 1 + second_opt_len + 1);
1473 memcpy (args, p, q - p);
1474 args[q - p] = '\0';
1475 memcpy (args + (q - p) + 1, second_opt, second_opt_len);
1476 args[(q - p) + 1 + second_opt_len] = '\0';
1477 error_at (loc, "invalid argument in option %qs", opt);
1478 if (strcmp (args, args + (q - p) + 1) == 0)
1479 inform (loc, "%qs specified multiple times in the same option",
1480 args);
1481 else
1482 inform (loc, "%qs is mutually exclusive with %qs and cannot be"
1483 " specified together", args, args + (q - p) + 1);
1484 return true;
1486 used_sets |= HOST_WIDE_INT_1U << (set - 1);
1487 if (q == NULL)
1488 break;
1489 p = q + 1;
1491 while (1);
1494 if (errors & CL_ERR_ENUM_ARG)
1495 { untested();
1496 const struct cl_enum *e = &cl_enums[option->var_enum];
1497 unsigned int i;
1498 char *s;
1500 auto_diagnostic_group d;
1501 if (e->unknown_error)
1502 error_at (loc, e->unknown_error, arg);
1503 else
1504 error_at (loc, "unrecognized argument in option %qs", opt);
1506 auto_vec <const char *> candidates;
1507 for (i = 0; e->values[i].arg != NULL; i++)
1508 { untested();
1509 if (!enum_arg_ok_for_language (&e->values[i], lang_mask))
1510 continue;
1511 candidates.safe_push (e->values[i].arg);
1513 const char *hint = candidates_list_and_hint (arg, s, candidates);
1514 if (hint)
1515 inform (loc, "valid arguments to %qs are: %s; did you mean %qs?",
1516 option->opt_text, s, hint);
1517 else
1518 inform (loc, "valid arguments to %qs are: %s", option->opt_text, s);
1519 XDELETEVEC (s);
1521 return true;
1524 return false;
1527 /* Handle the switch DECODED (location LOC) for the language indicated
1528 by LANG_MASK, using the handlers in *HANDLERS and setting fields in
1529 OPTS and OPTS_SET and using diagnostic context DC (if not NULL) for
1530 diagnostic options. */
1532 void
1533 read_cmdline_option (struct gcc_options *opts,
1534 struct gcc_options *opts_set,
1535 struct cl_decoded_option *decoded,
1536 location_t loc,
1537 unsigned int lang_mask,
1538 const struct cl_option_handlers *handlers,
1539 diagnostic_context *dc)
1541 const struct cl_option *option;
1542 const char *opt = decoded->orig_option_with_args_text;
1544 if (decoded->warn_message)
1545 warning_at (loc, 0, decoded->warn_message, opt);
1547 if (decoded->opt_index == OPT_SPECIAL_unknown)
1549 if (handlers->unknown_option_callback (decoded)){ untested();
1550 error_at (loc, "unrecognized command-line option %qs", decoded->arg);
1551 }else{
1553 return;
1554 }else{
1557 if (decoded->opt_index == OPT_SPECIAL_ignore)
1558 return;
1560 if (decoded->opt_index == OPT_SPECIAL_warn_removed)
1561 { untested();
1562 /* Warn only about positive ignored options. */
1563 if (decoded->value)
1564 warning_at (loc, 0, "switch %qs is no longer supported", opt);
1565 return;
1566 }else{
1569 option = &cl_options[decoded->opt_index];
1571 if (decoded->errors
1572 && cmdline_handle_error (loc, option, opt, decoded->arg,
1573 decoded->errors, lang_mask))
1574 return;
1576 if (decoded->errors & CL_ERR_WRONG_LANG)
1578 handlers->wrong_lang_callback (decoded, lang_mask);
1579 return;
1582 gcc_assert (!decoded->errors);
1584 if (!handle_option (opts, opts_set, decoded, lang_mask, DK_UNSPECIFIED,
1585 loc, handlers, false, dc))
1586 error_at (loc, "unrecognized command-line option %qs", opt);
1589 /* Set any field in OPTS, and OPTS_SET if not NULL, for option
1590 OPT_INDEX according to VALUE and ARG, diagnostic kind KIND,
1591 location LOC, using diagnostic context DC if not NULL for
1592 diagnostic classification. */
1594 void
1595 set_option (struct gcc_options *opts, struct gcc_options *opts_set,
1596 int opt_index, HOST_WIDE_INT value, const char *arg, int kind,
1597 location_t loc, diagnostic_context *dc,
1598 HOST_WIDE_INT mask /* = 0 */)
1600 const struct cl_option *option = &cl_options[opt_index];
1601 void *flag_var = option_flag_var (opt_index, opts);
1602 void *set_flag_var = NULL;
1604 if (!flag_var)
1605 return;
1607 if ((diagnostic_t) kind != DK_UNSPECIFIED && dc != NULL)
1608 diagnostic_classify_diagnostic (dc, opt_index, (diagnostic_t) kind, loc);
1610 if (opts_set != NULL)
1611 set_flag_var = option_flag_var (opt_index, opts_set);
1613 switch (option->var_type)
1615 case CLVC_INTEGER:
1616 if (option->cl_host_wide_int)
1617 { untested();
1618 *(HOST_WIDE_INT *) flag_var = value;
1619 if (set_flag_var)
1620 *(HOST_WIDE_INT *) set_flag_var = 1;
1622 else
1624 if (value > INT_MAX)
1625 error_at (loc, "argument to %qs is bigger than %d",
1626 option->opt_text, INT_MAX);
1627 else
1629 *(int *) flag_var = value;
1630 if (set_flag_var)
1631 *(int *) set_flag_var = 1;
1635 break;
1637 case CLVC_SIZE:
1638 if (option->cl_host_wide_int)
1639 { untested();
1640 *(HOST_WIDE_INT *) flag_var = value;
1641 if (set_flag_var)
1642 *(HOST_WIDE_INT *) set_flag_var = value;
1644 else
1645 { untested();
1646 *(int *) flag_var = value;
1647 if (set_flag_var)
1648 *(int *) set_flag_var = value;
1651 break;
1653 case CLVC_EQUAL:
1654 if (option->cl_host_wide_int)
1655 { untested();
1656 *(HOST_WIDE_INT *) flag_var = (value
1657 ? option->var_value
1658 : !option->var_value);
1659 if (set_flag_var)
1660 *(HOST_WIDE_INT *) set_flag_var = 1;
1662 else
1663 { untested();
1664 *(int *) flag_var = (value
1665 ? option->var_value
1666 : !option->var_value);
1667 if (set_flag_var)
1668 *(int *) set_flag_var = 1;
1670 break;
1672 case CLVC_BIT_CLEAR:
1673 case CLVC_BIT_SET:
1674 if ((value != 0) == (option->var_type == CLVC_BIT_SET))
1675 { untested();
1676 if (option->cl_host_wide_int)
1677 *(HOST_WIDE_INT *) flag_var |= option->var_value;
1678 else
1679 *(int *) flag_var |= option->var_value;
1681 else
1682 { untested();
1683 if (option->cl_host_wide_int)
1684 *(HOST_WIDE_INT *) flag_var &= ~option->var_value;
1685 else
1686 *(int *) flag_var &= ~option->var_value;
1688 if (set_flag_var)
1689 { untested();
1690 if (option->cl_host_wide_int)
1691 *(HOST_WIDE_INT *) set_flag_var |= option->var_value;
1692 else
1693 *(int *) set_flag_var |= option->var_value;
1695 break;
1697 case CLVC_STRING:
1698 *(const char **) flag_var = arg;
1699 if (set_flag_var)
1700 *(const char **) set_flag_var = "";
1701 break;
1703 case CLVC_ENUM:
1704 { untested();
1705 const struct cl_enum *e = &cl_enums[option->var_enum];
1707 if (mask)
1708 e->set (flag_var, value | (e->get (flag_var) & ~mask));
1709 else
1710 e->set (flag_var, value);
1711 if (set_flag_var)
1712 e->set (set_flag_var, 1);
1714 break;
1716 case CLVC_DEFER:
1717 { untested();
1718 vec<cl_deferred_option> *v
1719 = (vec<cl_deferred_option> *) *(void **) flag_var;
1720 cl_deferred_option p = {opt_index, arg, value};
1721 if (!v)
1722 v = XCNEW (vec<cl_deferred_option>);
1723 v->safe_push (p);
1724 *(void **) flag_var = v;
1725 if (set_flag_var)
1726 *(void **) set_flag_var = v;
1728 break;
1732 /* Return the address of the flag variable for option OPT_INDEX in
1733 options structure OPTS, or NULL if there is no flag variable. */
1735 void *
1736 option_flag_var (int opt_index, struct gcc_options *opts)
1738 const struct cl_option *option = &cl_options[opt_index];
1740 if (option->flag_var_offset == (unsigned short) -1)
1741 return NULL;
1742 return (void *)(((char *) opts) + option->flag_var_offset);
1745 /* Return 1 if option OPT_IDX is enabled in OPTS, 0 if it is disabled,
1746 or -1 if it isn't a simple on-off switch
1747 (or if the value is unknown, typically set later in target). */
1750 option_enabled (int opt_idx, unsigned lang_mask, void *opts)
1752 const struct cl_option *option = &(cl_options[opt_idx]);
1754 /* A language-specific option can only be considered enabled when it's
1755 valid for the current language. */
1756 if (!(option->flags & CL_COMMON)
1757 && (option->flags & CL_LANG_ALL)
1758 && !(option->flags & lang_mask))
1759 return 0;
1761 struct gcc_options *optsg = (struct gcc_options *) opts;
1762 void *flag_var = option_flag_var (opt_idx, optsg);
1764 if (flag_var)
1765 switch (option->var_type)
1767 case CLVC_INTEGER:
1768 if (option->cl_host_wide_int)
1769 { untested();
1770 HOST_WIDE_INT v = *(HOST_WIDE_INT *) flag_var;
1771 return v != 0 ? (v < 0 ? -1 : 1) : 0;
1773 else
1775 int v = *(int *) flag_var;
1776 return v != 0 ? (v < 0 ? -1 : 1) : 0;
1779 case CLVC_EQUAL:
1780 if (option->cl_host_wide_int)
1781 return *(HOST_WIDE_INT *) flag_var == option->var_value;
1782 else
1783 return *(int *) flag_var == option->var_value;
1785 case CLVC_BIT_CLEAR:
1786 if (option->cl_host_wide_int)
1787 return (*(HOST_WIDE_INT *) flag_var & option->var_value) == 0;
1788 else
1789 return (*(int *) flag_var & option->var_value) == 0;
1791 case CLVC_BIT_SET:
1792 if (option->cl_host_wide_int)
1793 return (*(HOST_WIDE_INT *) flag_var & option->var_value) != 0;
1794 else
1795 return (*(int *) flag_var & option->var_value) != 0;
1797 case CLVC_SIZE:
1798 if (option->cl_host_wide_int)
1799 return *(HOST_WIDE_INT *) flag_var != -1;
1800 else
1801 return *(int *) flag_var != -1;
1803 case CLVC_STRING:
1804 case CLVC_ENUM:
1805 case CLVC_DEFER:
1806 break;
1808 return -1;
1811 /* Fill STATE with the current state of option OPTION in OPTS. Return
1812 true if there is some state to store. */
1814 bool
1815 get_option_state (struct gcc_options *opts, int option,
1816 struct cl_option_state *state)
1817 { untested();
1818 void *flag_var = option_flag_var (option, opts);
1820 if (flag_var == 0)
1821 return false;
1823 switch (cl_options[option].var_type)
1825 case CLVC_INTEGER:
1826 case CLVC_EQUAL:
1827 case CLVC_SIZE:
1828 state->data = flag_var;
1829 state->size = (cl_options[option].cl_host_wide_int
1830 ? sizeof (HOST_WIDE_INT)
1831 : sizeof (int));
1832 break;
1834 case CLVC_BIT_CLEAR:
1835 case CLVC_BIT_SET:
1836 state->ch = option_enabled (option, -1, opts);
1837 state->data = &state->ch;
1838 state->size = 1;
1839 break;
1841 case CLVC_STRING:
1842 state->data = *(const char **) flag_var;
1843 if (state->data == 0)
1844 state->data = "";
1845 state->size = strlen ((const char *) state->data) + 1;
1846 break;
1848 case CLVC_ENUM:
1849 state->data = flag_var;
1850 state->size = cl_enums[cl_options[option].var_enum].var_size;
1851 break;
1853 case CLVC_DEFER:
1854 return false;
1856 return true;
1859 /* Set a warning option OPT_INDEX (language mask LANG_MASK, option
1860 handlers HANDLERS) to have diagnostic kind KIND for option
1861 structures OPTS and OPTS_SET and diagnostic context DC (possibly
1862 NULL), at location LOC (UNKNOWN_LOCATION for -Werror=). ARG is the
1863 argument of the option for joined options, or NULL otherwise. If IMPLY,
1864 the warning option in question is implied at this point. This is
1865 used by -Werror= and #pragma GCC diagnostic. */
1867 void
1868 control_warning_option (unsigned int opt_index, int kind, const char *arg,
1869 bool imply, location_t loc, unsigned int lang_mask,
1870 const struct cl_option_handlers *handlers,
1871 struct gcc_options *opts,
1872 struct gcc_options *opts_set,
1873 diagnostic_context *dc)
1874 { untested();
1875 if (cl_options[opt_index].alias_target != N_OPTS)
1876 { untested();
1877 gcc_assert (!cl_options[opt_index].cl_separate_alias
1878 && !cl_options[opt_index].cl_negative_alias);
1879 if (cl_options[opt_index].alias_arg)
1880 arg = cl_options[opt_index].alias_arg;
1881 opt_index = cl_options[opt_index].alias_target;
1883 if (opt_index == OPT_SPECIAL_ignore || opt_index == OPT_SPECIAL_warn_removed)
1884 return;
1885 if (dc)
1886 diagnostic_classify_diagnostic (dc, opt_index, (diagnostic_t) kind, loc);
1887 if (imply)
1888 { untested();
1889 const struct cl_option *option = &cl_options[opt_index];
1891 /* -Werror=foo implies -Wfoo. */
1892 if (option->var_type == CLVC_INTEGER
1893 || option->var_type == CLVC_ENUM
1894 || option->var_type == CLVC_SIZE)
1895 { untested();
1896 HOST_WIDE_INT value = 1;
1898 if (arg && *arg == '\0' && !option->cl_missing_ok)
1899 arg = NULL;
1901 if ((option->flags & CL_JOINED) && arg == NULL)
1902 { untested();
1903 cmdline_handle_error (loc, option, option->opt_text, arg,
1904 CL_ERR_MISSING_ARG, lang_mask);
1905 return;
1908 /* If the switch takes an integer argument, convert it. */
1909 if (arg && (option->cl_uinteger || option->cl_host_wide_int))
1910 { untested();
1911 int error = 0;
1912 value = *arg ? integral_argument (arg, &error,
1913 option->cl_byte_size) : 0;
1914 if (error)
1915 { untested();
1916 cmdline_handle_error (loc, option, option->opt_text, arg,
1917 CL_ERR_UINT_ARG, lang_mask);
1918 return;
1922 /* If the switch takes an enumerated argument, convert it. */
1923 if (arg && option->var_type == CLVC_ENUM)
1924 { untested();
1925 const struct cl_enum *e = &cl_enums[option->var_enum];
1927 if (enum_arg_to_value (e->values, arg, 0, &value,
1928 lang_mask) >= 0)
1929 { untested();
1930 const char *carg = NULL;
1932 if (enum_value_to_arg (e->values, &carg, value, lang_mask))
1933 arg = carg;
1934 gcc_assert (carg != NULL);
1936 else
1937 { untested();
1938 cmdline_handle_error (loc, option, option->opt_text, arg,
1939 CL_ERR_ENUM_ARG, lang_mask);
1940 return;
1944 handle_generated_option (opts, opts_set,
1945 opt_index, arg, value, lang_mask,
1946 kind, loc, handlers, false, dc);
1951 /* Parse options in COLLECT_GCC_OPTIONS and push them on ARGV_OBSTACK.
1952 Store number of arguments into ARGC_P. */
1954 void
1955 parse_options_from_collect_gcc_options (const char *collect_gcc_options,
1956 obstack *argv_obstack,
1957 int *argc_p)
1958 { untested();
1959 char *argv_storage = xstrdup (collect_gcc_options);
1960 int j, k;
1962 for (j = 0, k = 0; argv_storage[j] != '\0'; ++j)
1963 { untested();
1964 if (argv_storage[j] == '\'')
1965 { untested();
1966 obstack_ptr_grow (argv_obstack, &argv_storage[k]);
1967 ++j;
1969 { untested();
1970 if (argv_storage[j] == '\0')
1971 fatal_error (input_location,
1972 "malformed %<COLLECT_GCC_OPTIONS%>");
1973 else if (startswith (&argv_storage[j], "'\\''"))
1974 { untested();
1975 argv_storage[k++] = '\'';
1976 j += 4;
1978 else if (argv_storage[j] == '\'')
1979 break;
1980 else
1981 argv_storage[k++] = argv_storage[j++];
1983 while (1);
1984 argv_storage[k++] = '\0';
1988 obstack_ptr_grow (argv_obstack, NULL);
1989 *argc_p = obstack_object_size (argv_obstack) / sizeof (void *) - 1;
1992 /* Prepend -Xassembler for each option in COLLECT_AS_OPTIONS,
1993 and push on O. */
1995 #if 0 //sdcpp
1996 void prepend_xassembler_to_collect_as_options (const char *collect_as_options,
1997 obstack *o)
1998 { untested();
1999 obstack opts_obstack;
2000 int opts_count;
2002 obstack_init (&opts_obstack);
2003 parse_options_from_collect_gcc_options (collect_as_options,
2004 &opts_obstack, &opts_count);
2005 const char **assembler_opts = XOBFINISH (&opts_obstack, const char **);
2007 for (int i = 0; i < opts_count; i++)
2008 { untested();
2009 obstack_grow (o, " '-Xassembler' ",
2010 strlen (" '-Xassembler' "));
2011 const char *opt = assembler_opts[i];
2012 obstack_1grow (o, '\'');
2013 obstack_grow (o, opt, strlen (opt));
2014 obstack_1grow (o, '\'');
2017 #endif