]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/opts-common.c
Put the CL into the right dir.
[thirdparty/gcc.git] / gcc / opts-common.c
CommitLineData
a1baa5f1 1/* Command line option handling.
fbd26352 2 Copyright (C) 2006-2019 Free Software Foundation, Inc.
a1baa5f1 3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
8c4c00c1 8Software Foundation; either version 3, or (at your option) any later
a1baa5f1 9version.
10
11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14for more details.
15
16You should have received a copy of the GNU General Public License
8c4c00c1 17along with GCC; see the file COPYING3. If not see
18<http://www.gnu.org/licenses/>. */
a1baa5f1 19
20#include "config.h"
21#include "system.h"
22#include "intl.h"
23#include "coretypes.h"
24#include "opts.h"
1eacc14a 25#include "options.h"
b78351e5 26#include "diagnostic.h"
56f34f03 27#include "spellcheck.h"
a1baa5f1 28
e62df35b 29static void prune_options (struct cl_decoded_option **, unsigned int *);
30
a1408eb3 31/* An option that is undocumented, that takes a joined argument, and
32 that doesn't fit any of the classes of uses (language/common,
33 driver, target) is assumed to be a prefix used to catch
34 e.g. negated options, and stop them from being further shortened to
35 a prefix that could use the negated option as an argument. For
36 example, we want -gno-statement-frontiers to be taken as a negation
37 of -gstatement-frontiers, but without catching the gno- prefix and
38 signaling it's to be used for option remapping, it would end up
39 backtracked to g with no-statemnet-frontiers as the debug level. */
40
41static bool
42remapping_prefix_p (const struct cl_option *opt)
43{
44 return opt->flags & CL_UNDOCUMENTED
45 && opt->flags & CL_JOINED
46 && !(opt->flags & (CL_DRIVER | CL_TARGET | CL_COMMON | CL_LANG_ALL));
47}
48
a1baa5f1 49/* Perform a binary search to find which option the command-line INPUT
615ef0bb 50 matches. Returns its index in the option array, and
51 OPT_SPECIAL_unknown on failure.
a1baa5f1 52
53 This routine is quite subtle. A normal binary search is not good
54 enough because some options can be suffixed with an argument, and
55 multiple sub-matches can occur, e.g. input of "-pedantic" matching
56 the initial substring of "-pedantic-errors".
57
58 A more complicated example is -gstabs. It should match "-g" with
59 an argument of "stabs". Suppose, however, that the number and list
60 of switches are such that the binary search tests "-gen-decls"
61 before having tested "-g". This doesn't match, and as "-gen-decls"
62 is less than "-gstabs", it will become the lower bound of the
63 binary search range, and "-g" will never be seen. To resolve this
30b0f428 64 issue, 'optc-gen.awk' makes "-gen-decls" point, via the back_chain member,
a1baa5f1 65 to "-g" so that failed searches that end between "-gen-decls" and
66 the lexicographically subsequent switch know to go back and see if
67 "-g" causes a match (which it does in this example).
68
69 This search is done in such a way that the longest match for the
70 front end in question wins. If there is no match for the current
71 front end, the longest match for a different front end is returned
72 (or N_OPTS if none) and the caller emits an error message. */
73size_t
607eb2c8 74find_opt (const char *input, unsigned int lang_mask)
a1baa5f1 75{
5789e05b 76 size_t mn, mn_orig, mx, md, opt_len;
a1baa5f1 77 size_t match_wrong_lang;
78 int comp;
79
80 mn = 0;
81 mx = cl_options_count;
82
83 /* Find mn such this lexicographical inequality holds:
84 cl_options[mn] <= input < cl_options[mn + 1]. */
85 while (mx - mn > 1)
86 {
87 md = (mn + mx) / 2;
88 opt_len = cl_options[md].opt_len;
89 comp = strncmp (input, cl_options[md].opt_text + 1, opt_len);
90
91 if (comp < 0)
92 mx = md;
93 else
94 mn = md;
95 }
96
5789e05b 97 mn_orig = mn;
98
a1baa5f1 99 /* This is the switch that is the best match but for a different
615ef0bb 100 front end, or OPT_SPECIAL_unknown if there is no match at all. */
101 match_wrong_lang = OPT_SPECIAL_unknown;
a1baa5f1 102
103 /* Backtrace the chain of possible matches, returning the longest
104 one, if any, that fits best. With current GCC switches, this
105 loop executes at most twice. */
106 do
107 {
108 const struct cl_option *opt = &cl_options[mn];
109
110 /* Is the input either an exact match or a prefix that takes a
111 joined argument? */
112 if (!strncmp (input, opt->opt_text + 1, opt->opt_len)
113 && (input[opt->opt_len] == '\0' || (opt->flags & CL_JOINED)))
114 {
115 /* If language is OK, return it. */
116 if (opt->flags & lang_mask)
117 return mn;
118
a1408eb3 119 if (remapping_prefix_p (opt))
120 return OPT_SPECIAL_unknown;
121
a1baa5f1 122 /* If we haven't remembered a prior match, remember this
123 one. Any prior match is necessarily better. */
615ef0bb 124 if (match_wrong_lang == OPT_SPECIAL_unknown)
a1baa5f1 125 match_wrong_lang = mn;
126 }
127
128 /* Try the next possibility. This is cl_options_count if there
129 are no more. */
130 mn = opt->back_chain;
131 }
132 while (mn != cl_options_count);
133
5789e05b 134 if (match_wrong_lang == OPT_SPECIAL_unknown && input[0] == '-')
135 {
136 /* Long options, starting "--", may be abbreviated if the
137 abbreviation is unambiguous. This only applies to options
138 not taking a joined argument, and abbreviations of "--option"
139 are permitted even if there is a variant "--option=". */
140 size_t mnc = mn_orig + 1;
141 size_t cmp_len = strlen (input);
142 while (mnc < cl_options_count
143 && strncmp (input, cl_options[mnc].opt_text + 1, cmp_len) == 0)
144 {
145 /* Option matching this abbreviation. OK if it is the first
146 match and that does not take a joined argument, or the
147 second match, taking a joined argument and with only '='
148 added to the first match; otherwise considered
149 ambiguous. */
150 if (mnc == mn_orig + 1
151 && !(cl_options[mnc].flags & CL_JOINED))
152 match_wrong_lang = mnc;
153 else if (mnc == mn_orig + 2
154 && match_wrong_lang == mn_orig + 1
155 && (cl_options[mnc].flags & CL_JOINED)
156 && (cl_options[mnc].opt_len
157 == cl_options[mn_orig + 1].opt_len + 1)
158 && strncmp (cl_options[mnc].opt_text + 1,
159 cl_options[mn_orig + 1].opt_text + 1,
160 cl_options[mn_orig + 1].opt_len) == 0)
161 ; /* OK, as long as there are no more matches. */
162 else
163 return OPT_SPECIAL_unknown;
164 mnc++;
165 }
166 }
167
615ef0bb 168 /* Return the best wrong match, or OPT_SPECIAL_unknown if none. */
a1baa5f1 169 return match_wrong_lang;
170}
171
8e18705e 172/* If ARG is a non-negative decimal or hexadecimal integer representable
173 in HOST_WIDE_INT return its value, otherwise return -1. If ERR is not
174 null set *ERR to zero on success or to EINVAL or to the value of errno
175 otherwise. */
06907f25 176
8e18705e 177HOST_WIDE_INT
178integral_argument (const char *arg, int *err, bool byte_size_suffix)
06907f25 179{
8e18705e 180 if (!err)
181 err = &errno;
182
183 if (!ISDIGIT (*arg))
184 {
185 *err = EINVAL;
186 return -1;
187 }
188
189 *err = 0;
190 errno = 0;
06907f25 191
8e18705e 192 char *end = NULL;
193 unsigned HOST_WIDE_INT unit = 1;
194 unsigned HOST_WIDE_INT value = strtoull (arg, &end, 10);
06907f25 195
8e18705e 196 /* If the value is too large to be represented use the maximum
197 representable value that strtoull sets VALUE to (setting
198 errno to ERANGE). */
06907f25 199
8e18705e 200 if (end && *end)
de42969d 201 {
8e18705e 202 if (!byte_size_suffix)
203 {
204 errno = 0;
205 value = strtoull (arg, &end, 0);
206 if (*end)
207 {
2d3cf878 208 if (errno)
209 *err = errno;
210 else
211 *err = EINVAL;
8e18705e 212 return -1;
213 }
214
215 return value;
216 }
217
218 /* Numeric option arguments are at most INT_MAX. Make it
219 possible to specify a larger value by accepting common
220 suffixes. */
221 if (!strcmp (end, "kB"))
222 unit = 1000;
223 else if (!strcasecmp (end, "KiB") || !strcmp (end, "KB"))
224 unit = 1024;
225 else if (!strcmp (end, "MB"))
226 unit = HOST_WIDE_INT_UC (1000) * 1000;
227 else if (!strcasecmp (end, "MiB"))
228 unit = HOST_WIDE_INT_UC (1024) * 1024;
229 else if (!strcasecmp (end, "GB"))
230 unit = HOST_WIDE_INT_UC (1000) * 1000 * 1000;
231 else if (!strcasecmp (end, "GiB"))
232 unit = HOST_WIDE_INT_UC (1024) * 1024 * 1024;
233 else if (!strcasecmp (end, "TB"))
234 unit = HOST_WIDE_INT_UC (1000) * 1000 * 1000 * 1000;
235 else if (!strcasecmp (end, "TiB"))
236 unit = HOST_WIDE_INT_UC (1024) * 1024 * 1024 * 1024;
237 else if (!strcasecmp (end, "PB"))
238 unit = HOST_WIDE_INT_UC (1000) * 1000 * 1000 * 1000 * 1000;
239 else if (!strcasecmp (end, "PiB"))
240 unit = HOST_WIDE_INT_UC (1024) * 1024 * 1024 * 1024 * 1024;
241 else if (!strcasecmp (end, "EB"))
242 unit = HOST_WIDE_INT_UC (1000) * 1000 * 1000 * 1000 * 1000
243 * 1000;
244 else if (!strcasecmp (end, "EiB"))
245 unit = HOST_WIDE_INT_UC (1024) * 1024 * 1024 * 1024 * 1024
246 * 1024;
247 else
248 {
249 /* This could mean an unknown suffix or a bad prefix, like
250 "+-1". */
251 *err = EINVAL;
252 return -1;
253 }
254 }
de42969d 255
8e18705e 256 if (unit)
257 {
258 unsigned HOST_WIDE_INT prod = value * unit;
259 value = prod < value ? HOST_WIDE_INT_M1U : prod;
de42969d 260 }
261
8e18705e 262 return value;
06907f25 263}
264
cb22f930 265/* Return whether OPTION is OK for the language given by
266 LANG_MASK. */
267static bool
268option_ok_for_language (const struct cl_option *option,
269 unsigned int lang_mask)
270{
271 if (!(option->flags & lang_mask))
272 return false;
273 else if ((option->flags & CL_TARGET)
274 && (option->flags & (CL_LANG_ALL | CL_DRIVER))
275 && !(option->flags & (lang_mask & ~CL_COMMON & ~CL_TARGET)))
276 /* Complain for target flag language mismatches if any languages
277 are specified. */
278 return false;
279 return true;
280}
281
d62a5950 282/* Return whether ENUM_ARG is OK for the language given by
283 LANG_MASK. */
284
285static bool
286enum_arg_ok_for_language (const struct cl_enum_arg *enum_arg,
287 unsigned int lang_mask)
288{
289 return (lang_mask & CL_DRIVER) || !(enum_arg->flags & CL_ENUM_DRIVER_ONLY);
290}
291
292/* Look up ARG in ENUM_ARGS for language LANG_MASK, returning true and
293 storing the value in *VALUE if found, and returning false without
294 modifying *VALUE if not found. */
295
296static bool
297enum_arg_to_value (const struct cl_enum_arg *enum_args,
8e18705e 298 const char *arg, HOST_WIDE_INT *value,
299 unsigned int lang_mask)
d62a5950 300{
301 unsigned int i;
302
303 for (i = 0; enum_args[i].arg != NULL; i++)
304 if (strcmp (arg, enum_args[i].arg) == 0
305 && enum_arg_ok_for_language (&enum_args[i], lang_mask))
306 {
307 *value = enum_args[i].value;
308 return true;
309 }
310
311 return false;
312}
313
9105695c 314/* Look up ARG in the enum used by option OPT_INDEX for language
315 LANG_MASK, returning true and storing the value in *VALUE if found,
316 and returning false without modifying *VALUE if not found. */
317
318bool
8e18705e 319opt_enum_arg_to_value (size_t opt_index, const char *arg,
320 int *value, unsigned int lang_mask)
9105695c 321{
322 const struct cl_option *option = &cl_options[opt_index];
323
324 gcc_assert (option->var_type == CLVC_ENUM);
325
8e18705e 326 HOST_WIDE_INT wideval;
327 if (enum_arg_to_value (cl_enums[option->var_enum].values, arg,
328 &wideval, lang_mask))
329 {
330 *value = wideval;
331 return true;
332 }
333
334 return false;
9105695c 335}
336
d62a5950 337/* Look of VALUE in ENUM_ARGS for language LANG_MASK and store the
338 corresponding string in *ARGP, returning true if the found string
339 was marked as canonical, false otherwise. If VALUE is not found
340 (which may be the case for uninitialized values if the relevant
341 option has not been passed), set *ARGP to NULL and return
342 false. */
343
344bool
345enum_value_to_arg (const struct cl_enum_arg *enum_args,
346 const char **argp, int value, unsigned int lang_mask)
347{
348 unsigned int i;
349
350 for (i = 0; enum_args[i].arg != NULL; i++)
351 if (enum_args[i].value == value
352 && (enum_args[i].flags & CL_ENUM_CANONICAL)
353 && enum_arg_ok_for_language (&enum_args[i], lang_mask))
354 {
355 *argp = enum_args[i].arg;
356 return true;
357 }
358
359 for (i = 0; enum_args[i].arg != NULL; i++)
360 if (enum_args[i].value == value
361 && enum_arg_ok_for_language (&enum_args[i], lang_mask))
362 {
363 *argp = enum_args[i].arg;
364 return false;
365 }
366
367 *argp = NULL;
368 return false;
369}
67089c6b 370
371/* Fill in the canonical option part of *DECODED with an option
372 described by OPT_INDEX, ARG and VALUE. */
373
374static void
8e18705e 375generate_canonical_option (size_t opt_index, const char *arg,
376 HOST_WIDE_INT value,
67089c6b 377 struct cl_decoded_option *decoded)
378{
379 const struct cl_option *option = &cl_options[opt_index];
380 const char *opt_text = option->opt_text;
381
382 if (value == 0
ec840af4 383 && !option->cl_reject_negative
a1408eb3 384 && (opt_text[1] == 'W' || opt_text[1] == 'f'
385 || opt_text[1] == 'g' || opt_text[1] == 'm'))
67089c6b 386 {
ba30d337 387 char *t = XOBNEWVEC (&opts_obstack, char, option->opt_len + 5);
67089c6b 388 t[0] = '-';
389 t[1] = opt_text[1];
390 t[2] = 'n';
391 t[3] = 'o';
392 t[4] = '-';
393 memcpy (t + 5, opt_text + 2, option->opt_len);
394 opt_text = t;
395 }
396
397 decoded->canonical_option[2] = NULL;
398 decoded->canonical_option[3] = NULL;
399
400 if (arg)
401 {
0b1d266f 402 if ((option->flags & CL_SEPARATE)
ec840af4 403 && !option->cl_separate_alias)
67089c6b 404 {
405 decoded->canonical_option[0] = opt_text;
406 decoded->canonical_option[1] = arg;
407 decoded->canonical_option_num_elements = 2;
408 }
409 else
410 {
411 gcc_assert (option->flags & CL_JOINED);
ba30d337 412 decoded->canonical_option[0] = opts_concat (opt_text, arg, NULL);
67089c6b 413 decoded->canonical_option[1] = NULL;
414 decoded->canonical_option_num_elements = 1;
415 }
416 }
417 else
418 {
419 decoded->canonical_option[0] = opt_text;
420 decoded->canonical_option[1] = NULL;
421 decoded->canonical_option_num_elements = 1;
422 }
423}
424
5789e05b 425/* Structure describing mappings from options on the command line to
426 options to look up with find_opt. */
427struct option_map
428{
429 /* Prefix of the option on the command line. */
430 const char *opt0;
431 /* If two argv elements are considered to be merged into one option,
432 prefix for the second element, otherwise NULL. */
433 const char *opt1;
434 /* The new prefix to map to. */
435 const char *new_prefix;
436 /* Whether at least one character is needed following opt1 or opt0
437 for this mapping to be used. (--optimize= is valid for -O, but
438 --warn- is not valid for -W.) */
439 bool another_char_needed;
440 /* Whether the original option is a negated form of the option
441 resulting from this map. */
442 bool negated;
443};
444static const struct option_map option_map[] =
445 {
446 { "-Wno-", NULL, "-W", false, true },
447 { "-fno-", NULL, "-f", false, true },
a1408eb3 448 { "-gno-", NULL, "-g", false, true },
5789e05b 449 { "-mno-", NULL, "-m", false, true },
450 { "--debug=", NULL, "-g", false, false },
451 { "--machine-", NULL, "-m", true, false },
452 { "--machine-no-", NULL, "-m", false, true },
453 { "--machine=", NULL, "-m", false, false },
454 { "--machine=no-", NULL, "-m", false, true },
455 { "--machine", "", "-m", false, false },
456 { "--machine", "no-", "-m", false, true },
457 { "--optimize=", NULL, "-O", false, false },
458 { "--std=", NULL, "-std=", false, false },
459 { "--std", "", "-std=", false, false },
460 { "--warn-", NULL, "-W", true, false },
461 { "--warn-no-", NULL, "-W", false, true },
462 { "--", NULL, "-f", true, false },
463 { "--no-", NULL, "-f", false, true }
464 };
465
da7d5066 466/* Helper function for gcc.c's driver::suggest_option, for populating the
467 vec of suggestions for misspelled options.
468
469 option_map above provides various prefixes for spelling command-line
470 options, which decode_cmdline_option uses to map spellings of options
471 to specific options. We want to do the reverse: to find all the ways
472 that a user could validly spell an option.
473
413c4f6c 474 Given valid OPT_TEXT (with a leading dash) for OPTION, add it and all
475 of its valid variant spellings to CANDIDATES, each without a leading
476 dash.
da7d5066 477
478 For example, given "-Wabi-tag", the following are added to CANDIDATES:
479 "Wabi-tag"
480 "Wno-abi-tag"
481 "-warn-abi-tag"
482 "-warn-no-abi-tag".
483
484 The added strings must be freed using free. */
485
486void
487add_misspelling_candidates (auto_vec<char *> *candidates,
413c4f6c 488 const struct cl_option *option,
da7d5066 489 const char *opt_text)
490{
491 gcc_assert (candidates);
413c4f6c 492 gcc_assert (option);
da7d5066 493 gcc_assert (opt_text);
a1408eb3 494 if (remapping_prefix_p (option))
495 return;
da7d5066 496 candidates->safe_push (xstrdup (opt_text + 1));
497 for (unsigned i = 0; i < ARRAY_SIZE (option_map); i++)
498 {
499 const char *opt0 = option_map[i].opt0;
500 const char *new_prefix = option_map[i].new_prefix;
501 size_t new_prefix_len = strlen (new_prefix);
502
413c4f6c 503 if (option->cl_reject_negative && option_map[i].negated)
504 continue;
505
da7d5066 506 if (strncmp (opt_text, new_prefix, new_prefix_len) == 0)
507 {
508 char *alternative = concat (opt0 + 1, opt_text + new_prefix_len,
509 NULL);
510 candidates->safe_push (alternative);
511 }
512 }
513}
514
06907f25 515/* Decode the switch beginning at ARGV for the language indicated by
e28aa114 516 LANG_MASK (including CL_COMMON and CL_TARGET if applicable), into
517 the structure *DECODED. Returns the number of switches
518 consumed. */
06907f25 519
615ef0bb 520static unsigned int
06907f25 521decode_cmdline_option (const char **argv, unsigned int lang_mask,
522 struct cl_decoded_option *decoded)
523{
524 size_t opt_index;
5789e05b 525 const char *arg = 0;
8e18705e 526 HOST_WIDE_INT value = 1;
b904552d 527 unsigned int result = 1, i, extra_args, separate_args = 0;
5789e05b 528 int adjust_len = 0;
71a2f35e 529 size_t total_len;
530 char *p;
06907f25 531 const struct cl_option *option;
532 int errors = 0;
3b0273a1 533 const char *warn_message = NULL;
89c69892 534 bool separate_arg_flag;
535 bool joined_arg_flag;
0b1d266f 536 bool have_separate_arg = false;
06907f25 537
5789e05b 538 extra_args = 0;
06907f25 539
2a245bc8 540 const char *opt_value = argv[0] + 1;
541 opt_index = find_opt (opt_value, lang_mask);
5789e05b 542 i = 0;
543 while (opt_index == OPT_SPECIAL_unknown
544 && i < ARRAY_SIZE (option_map))
06907f25 545 {
5789e05b 546 const char *opt0 = option_map[i].opt0;
547 const char *opt1 = option_map[i].opt1;
548 const char *new_prefix = option_map[i].new_prefix;
549 bool another_char_needed = option_map[i].another_char_needed;
550 size_t opt0_len = strlen (opt0);
551 size_t opt1_len = (opt1 == NULL ? 0 : strlen (opt1));
552 size_t optn_len = (opt1 == NULL ? opt0_len : opt1_len);
553 size_t new_prefix_len = strlen (new_prefix);
554
555 extra_args = (opt1 == NULL ? 0 : 1);
556 value = !option_map[i].negated;
557
558 if (strncmp (argv[0], opt0, opt0_len) == 0
559 && (opt1 == NULL
560 || (argv[1] != NULL && strncmp (argv[1], opt1, opt1_len) == 0))
561 && (!another_char_needed
562 || argv[extra_args][optn_len] != 0))
563 {
564 size_t arglen = strlen (argv[extra_args]);
565 char *dup;
566
567 adjust_len = (int) optn_len - (int) new_prefix_len;
568 dup = XNEWVEC (char, arglen + 1 - adjust_len);
569 memcpy (dup, new_prefix, new_prefix_len);
570 memcpy (dup + new_prefix_len, argv[extra_args] + optn_len,
571 arglen - optn_len + 1);
572 opt_index = find_opt (dup + 1, lang_mask);
573 free (dup);
574 }
575 i++;
06907f25 576 }
577
615ef0bb 578 if (opt_index == OPT_SPECIAL_unknown)
579 {
580 arg = argv[0];
5789e05b 581 extra_args = 0;
582 value = 1;
615ef0bb 583 goto done;
584 }
06907f25 585
586 option = &cl_options[opt_index];
587
588 /* Reject negative form of switches that don't take negatives as
589 unrecognized. */
ec840af4 590 if (!value && option->cl_reject_negative)
06907f25 591 {
615ef0bb 592 opt_index = OPT_SPECIAL_unknown;
19c8675b 593 errors |= CL_ERR_NEGATIVE;
615ef0bb 594 arg = argv[0];
06907f25 595 goto done;
596 }
597
8e18705e 598 /* Clear the initial value for size options (it will be overwritten
599 later based on the Init(value) specification in the opt file. */
600 if (option->var_type == CLVC_SIZE)
601 value = 0;
602
5789e05b 603 result = extra_args + 1;
3b0273a1 604 warn_message = option->warn_message;
605
06907f25 606 /* Check to see if the option is disabled for this configuration. */
ec840af4 607 if (option->cl_disabled)
06907f25 608 errors |= CL_ERR_DISABLED;
609
89c69892 610 /* Determine whether there may be a separate argument based on
e2028bfa 611 whether this option is being processed for the driver, and, if
612 so, how many such arguments. */
89c69892 613 separate_arg_flag = ((option->flags & CL_SEPARATE)
ec840af4 614 && !(option->cl_no_driver_arg
89c69892 615 && (lang_mask & CL_DRIVER)));
e2028bfa 616 separate_args = (separate_arg_flag
ec840af4 617 ? option->cl_separate_nargs + 1
e2028bfa 618 : 0);
89c69892 619 joined_arg_flag = (option->flags & CL_JOINED) != 0;
620
06907f25 621 /* Sort out any argument the switch takes. */
89c69892 622 if (joined_arg_flag)
06907f25 623 {
624 /* Have arg point to the original switch. This is because
625 some code, such as disable_builtin_function, expects its
626 argument to be persistent until the program exits. */
5789e05b 627 arg = argv[extra_args] + cl_options[opt_index].opt_len + 1 + adjust_len;
06907f25 628
ec840af4 629 if (*arg == '\0' && !option->cl_missing_ok)
06907f25 630 {
89c69892 631 if (separate_arg_flag)
06907f25 632 {
5789e05b 633 arg = argv[extra_args + 1];
634 result = extra_args + 2;
06907f25 635 if (arg == NULL)
5789e05b 636 result = extra_args + 1;
0b1d266f 637 else
638 have_separate_arg = true;
06907f25 639 }
640 else
641 /* Missing argument. */
642 arg = NULL;
643 }
644 }
89c69892 645 else if (separate_arg_flag)
06907f25 646 {
5789e05b 647 arg = argv[extra_args + 1];
e2028bfa 648 for (i = 0; i < separate_args; i++)
649 if (argv[extra_args + 1 + i] == NULL)
650 {
651 errors |= CL_ERR_MISSING_ARG;
652 break;
653 }
654 result = extra_args + 1 + i;
655 if (arg != NULL)
0b1d266f 656 have_separate_arg = true;
06907f25 657 }
658
67089c6b 659 if (arg == NULL && (separate_arg_flag || joined_arg_flag))
660 errors |= CL_ERR_MISSING_ARG;
661
3b0273a1 662 /* Is this option an alias (or an ignored option, marked as an alias
663 of OPT_SPECIAL_ignore)? */
0b1d266f 664 if (option->alias_target != N_OPTS
ec840af4 665 && (!option->cl_separate_alias || have_separate_arg))
67089c6b 666 {
667 size_t new_opt_index = option->alias_target;
67089c6b 668
0c46a085 669 if (new_opt_index == OPT_SPECIAL_ignore
670 || new_opt_index == OPT_SPECIAL_deprecated)
67089c6b 671 {
3b0273a1 672 gcc_assert (option->alias_arg == NULL);
673 gcc_assert (option->neg_alias_arg == NULL);
674 opt_index = new_opt_index;
675 arg = NULL;
67089c6b 676 }
3b0273a1 677 else
67089c6b 678 {
3b0273a1 679 const struct cl_option *new_option = &cl_options[new_opt_index];
67089c6b 680
3b0273a1 681 /* The new option must not be an alias itself. */
5789e05b 682 gcc_assert (new_option->alias_target == N_OPTS
ec840af4 683 || new_option->cl_separate_alias);
67089c6b 684
3b0273a1 685 if (option->neg_alias_arg)
686 {
687 gcc_assert (option->alias_arg != NULL);
688 gcc_assert (arg == NULL);
ec840af4 689 gcc_assert (!option->cl_negative_alias);
3b0273a1 690 if (value)
691 arg = option->alias_arg;
692 else
693 arg = option->neg_alias_arg;
694 value = 1;
695 }
696 else if (option->alias_arg)
697 {
698 gcc_assert (value == 1);
699 gcc_assert (arg == NULL);
ec840af4 700 gcc_assert (!option->cl_negative_alias);
3b0273a1 701 arg = option->alias_arg;
702 }
67089c6b 703
ec840af4 704 if (option->cl_negative_alias)
4e775b8e 705 value = !value;
706
3b0273a1 707 opt_index = new_opt_index;
708 option = new_option;
67089c6b 709
3b0273a1 710 if (value == 0)
ec840af4 711 gcc_assert (!option->cl_reject_negative);
3b0273a1 712
713 /* Recompute what arguments are allowed. */
714 separate_arg_flag = ((option->flags & CL_SEPARATE)
ec840af4 715 && !(option->cl_no_driver_arg
3b0273a1 716 && (lang_mask & CL_DRIVER)));
717 joined_arg_flag = (option->flags & CL_JOINED) != 0;
718
ec840af4 719 if (separate_args > 1 || option->cl_separate_nargs)
e2028bfa 720 gcc_assert (separate_args
ec840af4 721 == (unsigned int) option->cl_separate_nargs + 1);
e2028bfa 722
3b0273a1 723 if (!(errors & CL_ERR_MISSING_ARG))
724 {
725 if (separate_arg_flag || joined_arg_flag)
5789e05b 726 {
ec840af4 727 if (option->cl_missing_ok && arg == NULL)
5789e05b 728 arg = "";
729 gcc_assert (arg != NULL);
730 }
3b0273a1 731 else
732 gcc_assert (arg == NULL);
733 }
67089c6b 734
3b0273a1 735 /* Recheck for warnings and disabled options. */
736 if (option->warn_message)
737 {
738 gcc_assert (warn_message == NULL);
739 warn_message = option->warn_message;
740 }
ec840af4 741 if (option->cl_disabled)
3b0273a1 742 errors |= CL_ERR_DISABLED;
743 }
67089c6b 744 }
745
06907f25 746 /* Check if this is a switch for a different front end. */
cb22f930 747 if (!option_ok_for_language (option, lang_mask))
06907f25 748 errors |= CL_ERR_WRONG_LANG;
2a245bc8 749 else if (strcmp (option->opt_text, "-Werror=") == 0
750 && strchr (opt_value, ',') == NULL)
751 {
752 /* Verify that -Werror argument is a valid warning
753 for a language. */
754 char *werror_arg = xstrdup (opt_value + 6);
755 werror_arg[0] = 'W';
756
757 size_t warning_index = find_opt (werror_arg, lang_mask);
758 if (warning_index != OPT_SPECIAL_unknown)
759 {
760 const struct cl_option *warning_option
761 = &cl_options[warning_index];
762 if (!option_ok_for_language (warning_option, lang_mask))
763 errors |= CL_ERR_WRONG_LANG;
764 }
765 }
06907f25 766
cb14e058 767 /* Convert the argument to lowercase if appropriate. */
768 if (arg && option->cl_tolower)
769 {
770 size_t j;
771 size_t len = strlen (arg);
ba30d337 772 char *arg_lower = XOBNEWVEC (&opts_obstack, char, len + 1);
cb14e058 773
774 for (j = 0; j < len; j++)
775 arg_lower[j] = TOLOWER ((unsigned char) arg[j]);
776 arg_lower[len] = 0;
777 arg = arg_lower;
778 }
779
8e18705e 780 /* If the switch takes an integer argument, convert it. */
781 if (arg && (option->cl_uinteger || option->cl_host_wide_int))
06907f25 782 {
8e18705e 783 int error = 0;
784 value = *arg ? integral_argument (arg, &error, option->cl_byte_size) : 0;
785 if (error)
06907f25 786 errors |= CL_ERR_UINT_ARG;
52368c34 787
788 /* Reject value out of a range. */
789 if (option->range_max != -1
790 && (value < option->range_min || value > option->range_max))
791 errors |= CL_ERR_INT_RANGE_ARG;
06907f25 792 }
793
d62a5950 794 /* If the switch takes an enumerated argument, convert it. */
795 if (arg && (option->var_type == CLVC_ENUM))
796 {
797 const struct cl_enum *e = &cl_enums[option->var_enum];
798
799 gcc_assert (value == 1);
800 if (enum_arg_to_value (e->values, arg, &value, lang_mask))
801 {
802 const char *carg = NULL;
803
804 if (enum_value_to_arg (e->values, &carg, value, lang_mask))
805 arg = carg;
806 gcc_assert (carg != NULL);
807 }
808 else
809 errors |= CL_ERR_ENUM_ARG;
810 }
811
06907f25 812 done:
06907f25 813 decoded->opt_index = opt_index;
814 decoded->arg = arg;
815 decoded->value = value;
816 decoded->errors = errors;
3b0273a1 817 decoded->warn_message = warn_message;
71a2f35e 818
819 if (opt_index == OPT_SPECIAL_unknown)
e2028bfa 820 gcc_assert (result == 1);
71a2f35e 821
822 gcc_assert (result >= 1 && result <= ARRAY_SIZE (decoded->canonical_option));
823 decoded->canonical_option_num_elements = result;
824 total_len = 0;
825 for (i = 0; i < ARRAY_SIZE (decoded->canonical_option); i++)
826 {
827 if (i < result)
828 {
fde5bd5c 829 size_t len;
67089c6b 830 if (opt_index == OPT_SPECIAL_unknown)
831 decoded->canonical_option[i] = argv[i];
832 else
833 decoded->canonical_option[i] = NULL;
fde5bd5c 834 len = strlen (argv[i]);
835 /* If the argument is an empty string, we will print it as "" in
836 orig_option_with_args_text. */
837 total_len += (len != 0 ? len : 2) + 1;
71a2f35e 838 }
839 else
840 decoded->canonical_option[i] = NULL;
841 }
0c46a085 842 if (opt_index != OPT_SPECIAL_unknown && opt_index != OPT_SPECIAL_ignore
843 && opt_index != OPT_SPECIAL_deprecated)
e2028bfa 844 {
845 generate_canonical_option (opt_index, arg, value, decoded);
846 if (separate_args > 1)
847 {
848 for (i = 0; i < separate_args; i++)
849 {
850 if (argv[extra_args + 1 + i] == NULL)
851 break;
852 else
853 decoded->canonical_option[1 + i] = argv[extra_args + 1 + i];
854 }
855 gcc_assert (result == 1 + i);
856 decoded->canonical_option_num_elements = result;
857 }
858 }
ba30d337 859 decoded->orig_option_with_args_text
860 = p = XOBNEWVEC (&opts_obstack, char, total_len);
71a2f35e 861 for (i = 0; i < result; i++)
862 {
863 size_t len = strlen (argv[i]);
864
fde5bd5c 865 /* Print the empty string verbally. */
866 if (len == 0)
867 {
868 *p++ = '"';
869 *p++ = '"';
870 }
871 else
872 memcpy (p, argv[i], len);
71a2f35e 873 p += len;
874 if (i == result - 1)
875 *p++ = 0;
876 else
877 *p++ = ' ';
878 }
879
06907f25 880 return result;
881}
882
70639a9d 883/* Obstack for option strings. */
884
885struct obstack opts_obstack;
886
887/* Like libiberty concat, but allocate using opts_obstack. */
888
889char *
890opts_concat (const char *first, ...)
891{
892 char *newstr, *end;
893 size_t length = 0;
894 const char *arg;
895 va_list ap;
896
897 /* First compute the size of the result and get sufficient memory. */
898 va_start (ap, first);
899 for (arg = first; arg; arg = va_arg (ap, const char *))
900 length += strlen (arg);
901 newstr = XOBNEWVEC (&opts_obstack, char, length + 1);
902 va_end (ap);
903
904 /* Now copy the individual pieces to the result string. */
905 va_start (ap, first);
906 for (arg = first, end = newstr; arg; arg = va_arg (ap, const char *))
907 {
908 length = strlen (arg);
909 memcpy (end, arg, length);
910 end += length;
911 }
912 *end = '\0';
913 va_end (ap);
914 return newstr;
915}
916
615ef0bb 917/* Decode command-line options (ARGC and ARGV being the arguments of
918 main) into an array, setting *DECODED_OPTIONS to a pointer to that
919 array and *DECODED_OPTIONS_COUNT to the number of entries in the
920 array. The first entry in the array is always one for the program
921 name (OPT_SPECIAL_program_name). LANG_MASK indicates the language
e28aa114 922 flags applicable for decoding (including CL_COMMON and CL_TARGET if
923 those options should be considered applicable). Do not produce any
924 diagnostics or set state outside of these variables. */
615ef0bb 925
926void
927decode_cmdline_options_to_array (unsigned int argc, const char **argv,
928 unsigned int lang_mask,
929 struct cl_decoded_option **decoded_options,
930 unsigned int *decoded_options_count)
931{
2c2747c3 932 unsigned int n, i;
615ef0bb 933 struct cl_decoded_option *opt_array;
934 unsigned int num_decoded_options;
935
936 opt_array = XNEWVEC (struct cl_decoded_option, argc);
937
938 opt_array[0].opt_index = OPT_SPECIAL_program_name;
3b0273a1 939 opt_array[0].warn_message = NULL;
615ef0bb 940 opt_array[0].arg = argv[0];
941 opt_array[0].orig_option_with_args_text = argv[0];
71a2f35e 942 opt_array[0].canonical_option_num_elements = 1;
e88d34f6 943 opt_array[0].canonical_option[0] = argv[0];
944 opt_array[0].canonical_option[1] = NULL;
71a2f35e 945 opt_array[0].canonical_option[2] = NULL;
946 opt_array[0].canonical_option[3] = NULL;
615ef0bb 947 opt_array[0].value = 1;
948 opt_array[0].errors = 0;
949 num_decoded_options = 1;
950
951 for (i = 1; i < argc; i += n)
952 {
953 const char *opt = argv[i];
954
955 /* Interpret "-" or a non-switch as a file name. */
956 if (opt[0] != '-' || opt[1] == '\0')
957 {
cb22f930 958 generate_option_input_file (opt, &opt_array[num_decoded_options]);
615ef0bb 959 num_decoded_options++;
960 n = 1;
961 continue;
962 }
963
964 n = decode_cmdline_option (argv + i, lang_mask,
965 &opt_array[num_decoded_options]);
966 num_decoded_options++;
967 }
968
615ef0bb 969 *decoded_options = opt_array;
970 *decoded_options_count = num_decoded_options;
e62df35b 971 prune_options (decoded_options, decoded_options_count);
615ef0bb 972}
973
a1baa5f1 974/* Return true if NEXT_OPT_IDX cancels OPT_IDX. Return false if the
975 next one is the same as ORIG_NEXT_OPT_IDX. */
976
977static bool
978cancel_option (int opt_idx, int next_opt_idx, int orig_next_opt_idx)
979{
980 /* An option can be canceled by the same option or an option with
981 Negative. */
982 if (cl_options [next_opt_idx].neg_index == opt_idx)
983 return true;
984
985 if (cl_options [next_opt_idx].neg_index != orig_next_opt_idx)
986 return cancel_option (opt_idx, cl_options [next_opt_idx].neg_index,
987 orig_next_opt_idx);
48e1416a 988
a1baa5f1 989 return false;
990}
991
992/* Filter out options canceled by the ones after them. */
993
e62df35b 994static void
995prune_options (struct cl_decoded_option **decoded_options,
996 unsigned int *decoded_options_count)
a1baa5f1 997{
e62df35b 998 unsigned int old_decoded_options_count = *decoded_options_count;
999 struct cl_decoded_option *old_decoded_options = *decoded_options;
1000 unsigned int new_decoded_options_count;
1001 struct cl_decoded_option *new_decoded_options
1002 = XNEWVEC (struct cl_decoded_option, old_decoded_options_count);
1003 unsigned int i;
a1baa5f1 1004 const struct cl_option *option;
1b3e7760 1005 unsigned int fdiagnostics_color_idx = 0;
a1baa5f1 1006
1007 /* Remove arguments which are negated by others after them. */
e62df35b 1008 new_decoded_options_count = 0;
1009 for (i = 0; i < old_decoded_options_count; i++)
a1baa5f1 1010 {
e62df35b 1011 unsigned int j, opt_idx, next_opt_idx;
1012
1013 if (old_decoded_options[i].errors & ~CL_ERR_WRONG_LANG)
1014 goto keep;
a1baa5f1 1015
e62df35b 1016 opt_idx = old_decoded_options[i].opt_index;
1017 switch (opt_idx)
a1baa5f1 1018 {
e62df35b 1019 case OPT_SPECIAL_unknown:
1020 case OPT_SPECIAL_ignore:
0c46a085 1021 case OPT_SPECIAL_deprecated:
e62df35b 1022 case OPT_SPECIAL_program_name:
1023 case OPT_SPECIAL_input_file:
1024 goto keep;
1025
1b3e7760 1026 /* Do not save OPT_fdiagnostics_color_, just remember the last one. */
1027 case OPT_fdiagnostics_color_:
1028 fdiagnostics_color_idx = i;
1029 continue;
1030
e62df35b 1031 default:
1032 gcc_assert (opt_idx < cl_options_count);
1033 option = &cl_options[opt_idx];
1034 if (option->neg_index < 0)
1035 goto keep;
1036
1037 /* Skip joined switches. */
8c0f695d 1038 if ((option->flags & CL_JOINED)
1039 && (!option->cl_reject_negative
1040 || (unsigned int) option->neg_index != opt_idx))
e62df35b 1041 goto keep;
1042
1043 for (j = i + 1; j < old_decoded_options_count; j++)
a1baa5f1 1044 {
e62df35b 1045 if (old_decoded_options[j].errors & ~CL_ERR_WRONG_LANG)
1046 continue;
1047 next_opt_idx = old_decoded_options[j].opt_index;
1048 if (next_opt_idx >= cl_options_count)
1049 continue;
1050 if (cl_options[next_opt_idx].neg_index < 0)
1051 continue;
8c0f695d 1052 if ((cl_options[next_opt_idx].flags & CL_JOINED)
1053 && (!cl_options[next_opt_idx].cl_reject_negative
1054 || ((unsigned int) cl_options[next_opt_idx].neg_index
1055 != next_opt_idx)))
1056 continue;
e62df35b 1057 if (cancel_option (opt_idx, next_opt_idx, next_opt_idx))
a1baa5f1 1058 break;
1059 }
e62df35b 1060 if (j == old_decoded_options_count)
1061 {
a1baa5f1 1062keep:
e62df35b 1063 new_decoded_options[new_decoded_options_count]
1064 = old_decoded_options[i];
1065 new_decoded_options_count++;
1066 }
1067 break;
a1baa5f1 1068 }
1069 }
1070
160b0cdb 1071 if (fdiagnostics_color_idx >= 1)
1b3e7760 1072 {
1073 /* We put the last -fdiagnostics-color= at the first position
1074 after argv[0] so it can take effect immediately. */
1075 memmove (new_decoded_options + 2, new_decoded_options + 1,
1076 sizeof (struct cl_decoded_option)
1077 * (new_decoded_options_count - 1));
1078 new_decoded_options[1] = old_decoded_options[fdiagnostics_color_idx];
1079 new_decoded_options_count++;
1080 }
1081
e62df35b 1082 free (old_decoded_options);
1083 new_decoded_options = XRESIZEVEC (struct cl_decoded_option,
1084 new_decoded_options,
1085 new_decoded_options_count);
1086 *decoded_options = new_decoded_options;
1087 *decoded_options_count = new_decoded_options_count;
a1baa5f1 1088}
b78351e5 1089
666f4bf0 1090/* Handle option DECODED for the language indicated by LANG_MASK,
f83b64ca 1091 using the handlers in HANDLERS and setting fields in OPTS and
1092 OPTS_SET. KIND is the diagnostic_t if this is a diagnostics
3c6c0e40 1093 option, DK_UNSPECIFIED otherwise, and LOC is the location of the
1094 option for options from the source file, UNKNOWN_LOCATION
1095 otherwise. GENERATED_P is true for an option generated as part of
1096 processing another option or otherwise generated internally, false
09fd09eb 1097 for one explicitly passed by the user. control_warning_option
1098 generated options are considered explicitly passed by the user.
1099 Returns false if the switch was invalid. DC is the diagnostic
1100 context for options affecting diagnostics state, or NULL. */
b78351e5 1101
3c6c0e40 1102static bool
2c5d2e39 1103handle_option (struct gcc_options *opts,
f83b64ca 1104 struct gcc_options *opts_set,
2c5d2e39 1105 const struct cl_decoded_option *decoded,
3c6c0e40 1106 unsigned int lang_mask, int kind, location_t loc,
f83b64ca 1107 const struct cl_option_handlers *handlers,
24ca3b4e 1108 bool generated_p, diagnostic_context *dc)
b78351e5 1109{
666f4bf0 1110 size_t opt_index = decoded->opt_index;
1111 const char *arg = decoded->arg;
8e18705e 1112 HOST_WIDE_INT value = decoded->value;
b78351e5 1113 const struct cl_option *option = &cl_options[opt_index];
2c5d2e39 1114 void *flag_var = option_flag_var (opt_index, opts);
b78351e5 1115 size_t i;
1116
2c5d2e39 1117 if (flag_var)
f83b64ca 1118 set_option (opts, (generated_p ? NULL : opts_set),
3c6c0e40 1119 opt_index, value, arg, kind, loc, dc);
b78351e5 1120
1121 for (i = 0; i < handlers->num_handlers; i++)
1122 if (option->flags & handlers->handlers[i].mask)
1123 {
f83b64ca 1124 if (!handlers->handlers[i].handler (opts, opts_set, decoded,
3c6c0e40 1125 lang_mask, kind, loc,
98102386 1126 handlers, dc,
1127 handlers->target_option_override_hook))
b78351e5 1128 return false;
b78351e5 1129 }
1130
1131 return true;
1132}
1133
666f4bf0 1134/* Like handle_option, but OPT_INDEX, ARG and VALUE describe the
1135 option instead of DECODED. This is used for callbacks when one
1136 option implies another instead of an option being decoded from the
1137 command line. */
1138
1139bool
f83b64ca 1140handle_generated_option (struct gcc_options *opts,
1141 struct gcc_options *opts_set,
8e18705e 1142 size_t opt_index, const char *arg, HOST_WIDE_INT value,
3c6c0e40 1143 unsigned int lang_mask, int kind, location_t loc,
24ca3b4e 1144 const struct cl_option_handlers *handlers,
09fd09eb 1145 bool generated_p, diagnostic_context *dc)
666f4bf0 1146{
666f4bf0 1147 struct cl_decoded_option decoded;
1148
cb22f930 1149 generate_option (opt_index, arg, value, lang_mask, &decoded);
3c6c0e40 1150 return handle_option (opts, opts_set, &decoded, lang_mask, kind, loc,
09fd09eb 1151 handlers, generated_p, dc);
cb22f930 1152}
1153
1154/* Fill in *DECODED with an option described by OPT_INDEX, ARG and
1155 VALUE for a front end using LANG_MASK. This is used when the
1156 compiler generates options internally. */
1157
1158void
8e18705e 1159generate_option (size_t opt_index, const char *arg, HOST_WIDE_INT value,
cb22f930 1160 unsigned int lang_mask, struct cl_decoded_option *decoded)
1161{
1162 const struct cl_option *option = &cl_options[opt_index];
1163
1164 decoded->opt_index = opt_index;
3b0273a1 1165 decoded->warn_message = NULL;
cb22f930 1166 decoded->arg = arg;
cb22f930 1167 decoded->value = value;
1168 decoded->errors = (option_ok_for_language (option, lang_mask)
1169 ? 0
1170 : CL_ERR_WRONG_LANG);
666f4bf0 1171
67089c6b 1172 generate_canonical_option (opt_index, arg, value, decoded);
1173 switch (decoded->canonical_option_num_elements)
666f4bf0 1174 {
67089c6b 1175 case 1:
1176 decoded->orig_option_with_args_text = decoded->canonical_option[0];
1177 break;
1178
1179 case 2:
1180 decoded->orig_option_with_args_text
ba30d337 1181 = opts_concat (decoded->canonical_option[0], " ",
1182 decoded->canonical_option[1], NULL);
67089c6b 1183 break;
1184
1185 default:
1186 gcc_unreachable ();
666f4bf0 1187 }
cb22f930 1188}
666f4bf0 1189
cb22f930 1190/* Fill in *DECODED with an option for input file FILE. */
1191
1192void
1193generate_option_input_file (const char *file,
1194 struct cl_decoded_option *decoded)
1195{
1196 decoded->opt_index = OPT_SPECIAL_input_file;
3b0273a1 1197 decoded->warn_message = NULL;
cb22f930 1198 decoded->arg = file;
1199 decoded->orig_option_with_args_text = file;
1200 decoded->canonical_option_num_elements = 1;
1201 decoded->canonical_option[0] = file;
1202 decoded->canonical_option[1] = NULL;
1203 decoded->canonical_option[2] = NULL;
1204 decoded->canonical_option[3] = NULL;
1205 decoded->value = 1;
1206 decoded->errors = 0;
666f4bf0 1207}
1208
afbacb06 1209/* Helper function for listing valid choices and hint for misspelled
1210 value. CANDIDATES is a vector containing all valid strings,
1211 STR is set to a heap allocated string that contains all those
1212 strings concatenated, separated by spaces, and the return value
1213 is the closest string from those to ARG, or NULL if nothing is
1214 close enough. Callers should XDELETEVEC (STR) after using it
1215 to avoid memory leaks. */
1216
1217const char *
1218candidates_list_and_hint (const char *arg, char *&str,
1219 const auto_vec <const char *> &candidates)
1220{
1221 size_t len = 0;
1222 int i;
1223 const char *candidate;
1224 char *p;
1225
1226 FOR_EACH_VEC_ELT (candidates, i, candidate)
1227 len += strlen (candidate) + 1;
1228
1229 str = p = XNEWVEC (char, len);
1230 FOR_EACH_VEC_ELT (candidates, i, candidate)
1231 {
1232 len = strlen (candidate);
1233 memcpy (p, candidate, len);
1234 p[len] = ' ';
1235 p += len + 1;
1236 }
1237 p[-1] = '\0';
1238 return find_closest_string (arg, &candidates);
1239}
1240
31ba81bd 1241/* Perform diagnostics for read_cmdline_option and control_warning_option
1242 functions. Returns true if an error has been diagnosed.
1243 LOC and LANG_MASK arguments like in read_cmdline_option.
1244 OPTION is the option to report diagnostics for, OPT the name
1245 of the option as text, ARG the argument of the option (for joined
1246 options), ERRORS is bitmask of CL_ERR_* values. */
b78351e5 1247
31ba81bd 1248static bool
1249cmdline_handle_error (location_t loc, const struct cl_option *option,
1250 const char *opt, const char *arg, int errors,
1251 unsigned int lang_mask)
b78351e5 1252{
31ba81bd 1253 if (errors & CL_ERR_DISABLED)
b78351e5 1254 {
62c34df8 1255 error_at (loc, "command-line option %qs"
31ba81bd 1256 " is not supported by this configuration", opt);
1257 return true;
b78351e5 1258 }
1259
31ba81bd 1260 if (errors & CL_ERR_MISSING_ARG)
b78351e5 1261 {
1262 if (option->missing_argument_error)
3c6c0e40 1263 error_at (loc, option->missing_argument_error, opt);
b78351e5 1264 else
3c6c0e40 1265 error_at (loc, "missing argument to %qs", opt);
31ba81bd 1266 return true;
b78351e5 1267 }
1268
31ba81bd 1269 if (errors & CL_ERR_UINT_ARG)
b78351e5 1270 {
8e18705e 1271 if (option->cl_byte_size)
1272 error_at (loc, "argument to %qs should be a non-negative integer "
1273 "optionally followed by a size unit",
1274 option->opt_text);
1275 else
1276 error_at (loc, "argument to %qs should be a non-negative integer",
1277 option->opt_text);
31ba81bd 1278 return true;
b78351e5 1279 }
1280
52368c34 1281 if (errors & CL_ERR_INT_RANGE_ARG)
1282 {
1283 error_at (loc, "argument to %qs is not between %d and %d",
1284 option->opt_text, option->range_min, option->range_max);
1285 return true;
1286 }
1287
31ba81bd 1288 if (errors & CL_ERR_ENUM_ARG)
d62a5950 1289 {
1290 const struct cl_enum *e = &cl_enums[option->var_enum];
1291 unsigned int i;
afbacb06 1292 char *s;
d62a5950 1293
bc35ef65 1294 auto_diagnostic_group d;
d62a5950 1295 if (e->unknown_error)
31ba81bd 1296 error_at (loc, e->unknown_error, arg);
d62a5950 1297 else
1298 error_at (loc, "unrecognized argument in option %qs", opt);
1299
56f34f03 1300 auto_vec <const char *> candidates;
d62a5950 1301 for (i = 0; e->values[i].arg != NULL; i++)
1302 {
60a45807 1303 if (!enum_arg_ok_for_language (&e->values[i], lang_mask))
1304 continue;
56f34f03 1305 candidates.safe_push (e->values[i].arg);
d62a5950 1306 }
afbacb06 1307 const char *hint = candidates_list_and_hint (arg, s, candidates);
56f34f03 1308 if (hint)
1309 inform (loc, "valid arguments to %qs are: %s; did you mean %qs?",
1310 option->opt_text, s, hint);
1311 else
1312 inform (loc, "valid arguments to %qs are: %s", option->opt_text, s);
afbacb06 1313 XDELETEVEC (s);
56f34f03 1314
31ba81bd 1315 return true;
1316 }
1317
1318 return false;
1319}
1320
1321/* Handle the switch DECODED (location LOC) for the language indicated
1322 by LANG_MASK, using the handlers in *HANDLERS and setting fields in
1323 OPTS and OPTS_SET and using diagnostic context DC (if not NULL) for
1324 diagnostic options. */
1325
1326void
1327read_cmdline_option (struct gcc_options *opts,
1328 struct gcc_options *opts_set,
1329 struct cl_decoded_option *decoded,
1330 location_t loc,
1331 unsigned int lang_mask,
1332 const struct cl_option_handlers *handlers,
1333 diagnostic_context *dc)
1334{
1335 const struct cl_option *option;
1336 const char *opt = decoded->orig_option_with_args_text;
1337
1338 if (decoded->warn_message)
1339 warning_at (loc, 0, decoded->warn_message, opt);
1340
1341 if (decoded->opt_index == OPT_SPECIAL_unknown)
1342 {
1343 if (handlers->unknown_option_callback (decoded))
62c34df8 1344 error_at (loc, "unrecognized command-line option %qs", decoded->arg);
d62a5950 1345 return;
1346 }
1347
31ba81bd 1348 if (decoded->opt_index == OPT_SPECIAL_ignore)
1349 return;
1350
0c46a085 1351 if (decoded->opt_index == OPT_SPECIAL_deprecated)
1352 {
1353 /* Warn only about positive ignored options. */
1354 if (decoded->value)
1355 warning_at (loc, 0, "switch %qs is no longer supported", opt);
1356 return;
1357 }
1358
31ba81bd 1359 option = &cl_options[decoded->opt_index];
1360
1361 if (decoded->errors
1362 && cmdline_handle_error (loc, option, opt, decoded->arg,
1363 decoded->errors, lang_mask))
1364 return;
1365
5585cfe8 1366 if (decoded->errors & CL_ERR_WRONG_LANG)
1367 {
1368 handlers->wrong_lang_callback (decoded, lang_mask);
1369 return;
1370 }
1371
b78351e5 1372 gcc_assert (!decoded->errors);
1373
f83b64ca 1374 if (!handle_option (opts, opts_set, decoded, lang_mask, DK_UNSPECIFIED,
3c6c0e40 1375 loc, handlers, false, dc))
62c34df8 1376 error_at (loc, "unrecognized command-line option %qs", opt);
b78351e5 1377}
1378
f83b64ca 1379/* Set any field in OPTS, and OPTS_SET if not NULL, for option
3c6c0e40 1380 OPT_INDEX according to VALUE and ARG, diagnostic kind KIND,
1381 location LOC, using diagnostic context DC if not NULL for
1382 diagnostic classification. */
b78351e5 1383
1384void
f83b64ca 1385set_option (struct gcc_options *opts, struct gcc_options *opts_set,
8e18705e 1386 int opt_index, HOST_WIDE_INT value, const char *arg, int kind,
3c6c0e40 1387 location_t loc, diagnostic_context *dc)
b78351e5 1388{
1389 const struct cl_option *option = &cl_options[opt_index];
2c5d2e39 1390 void *flag_var = option_flag_var (opt_index, opts);
f83b64ca 1391 void *set_flag_var = NULL;
b78351e5 1392
2c5d2e39 1393 if (!flag_var)
b78351e5 1394 return;
1395
e472ce46 1396 if ((diagnostic_t) kind != DK_UNSPECIFIED && dc != NULL)
1397 diagnostic_classify_diagnostic (dc, opt_index, (diagnostic_t) kind, loc);
1398
f83b64ca 1399 if (opts_set != NULL)
1400 set_flag_var = option_flag_var (opt_index, opts_set);
1401
b78351e5 1402 switch (option->var_type)
1403 {
1404 case CLVC_BOOLEAN:
8e18705e 1405 if (option->cl_host_wide_int)
1406 {
1407 *(HOST_WIDE_INT *) flag_var = value;
1408 if (set_flag_var)
1409 *(HOST_WIDE_INT *) set_flag_var = 1;
1410 }
1411 else
1412 {
1413 *(int *) flag_var = value;
1414 if (set_flag_var)
1415 *(int *) set_flag_var = 1;
1416 }
1417
1418 break;
1419
1420 case CLVC_SIZE:
1421 if (option->cl_host_wide_int)
1422 {
1423 *(HOST_WIDE_INT *) flag_var = value;
1424 if (set_flag_var)
1425 *(HOST_WIDE_INT *) set_flag_var = value;
1426 }
1427 else
1428 {
1429 *(int *) flag_var = value;
1430 if (set_flag_var)
1431 *(int *) set_flag_var = value;
1432 }
1433
b78351e5 1434 break;
1435
1436 case CLVC_EQUAL:
8e18705e 1437 if (option->cl_host_wide_int)
1438 {
1439 *(HOST_WIDE_INT *) flag_var = (value
1440 ? option->var_value
1441 : !option->var_value);
1442 if (set_flag_var)
1443 *(HOST_WIDE_INT *) set_flag_var = 1;
1444 }
72ec6882 1445 else
8e18705e 1446 {
1447 *(int *) flag_var = (value
1448 ? option->var_value
1449 : !option->var_value);
1450 if (set_flag_var)
1451 *(int *) set_flag_var = 1;
1452 }
b78351e5 1453 break;
1454
1455 case CLVC_BIT_CLEAR:
1456 case CLVC_BIT_SET:
1457 if ((value != 0) == (option->var_type == CLVC_BIT_SET))
72ec6882 1458 {
1459 if (option->cl_host_wide_int)
1460 *(HOST_WIDE_INT *) flag_var |= option->var_value;
1461 else
1462 *(int *) flag_var |= option->var_value;
1463 }
b78351e5 1464 else
72ec6882 1465 {
1466 if (option->cl_host_wide_int)
1467 *(HOST_WIDE_INT *) flag_var &= ~option->var_value;
1468 else
1469 *(int *) flag_var &= ~option->var_value;
1470 }
f83b64ca 1471 if (set_flag_var)
72ec6882 1472 {
1473 if (option->cl_host_wide_int)
1474 *(HOST_WIDE_INT *) set_flag_var |= option->var_value;
1475 else
1476 *(int *) set_flag_var |= option->var_value;
1477 }
b78351e5 1478 break;
1479
1480 case CLVC_STRING:
2c5d2e39 1481 *(const char **) flag_var = arg;
f83b64ca 1482 if (set_flag_var)
1483 *(const char **) set_flag_var = "";
b78351e5 1484 break;
f0da0668 1485
d62a5950 1486 case CLVC_ENUM:
1487 {
1488 const struct cl_enum *e = &cl_enums[option->var_enum];
1489
1490 e->set (flag_var, value);
1491 if (set_flag_var)
1492 e->set (set_flag_var, 1);
1493 }
1494 break;
1495
f0da0668 1496 case CLVC_DEFER:
1497 {
f1f41a6c 1498 vec<cl_deferred_option> *v
1499 = (vec<cl_deferred_option> *) *(void **) flag_var;
e82e4eb5 1500 cl_deferred_option p = {opt_index, arg, value};
f1f41a6c 1501 if (!v)
1502 v = XCNEW (vec<cl_deferred_option>);
1503 v->safe_push (p);
1504 *(void **) flag_var = v;
f0da0668 1505 if (set_flag_var)
f1f41a6c 1506 *(void **) set_flag_var = v;
f0da0668 1507 }
1508 break;
b78351e5 1509 }
b78351e5 1510}
2c5d2e39 1511
1512/* Return the address of the flag variable for option OPT_INDEX in
1513 options structure OPTS, or NULL if there is no flag variable. */
1514
1515void *
1516option_flag_var (int opt_index, struct gcc_options *opts)
1517{
1518 const struct cl_option *option = &cl_options[opt_index];
1519
1520 if (option->flag_var_offset == (unsigned short) -1)
1521 return NULL;
1522 return (void *)(((char *) opts) + option->flag_var_offset);
1523}
c123f04d 1524
79396169 1525/* Return 1 if option OPT_IDX is enabled in OPTS, 0 if it is disabled,
1526 or -1 if it isn't a simple on-off switch. */
1527
1528int
a02d8e72 1529option_enabled (int opt_idx, unsigned lang_mask, void *opts)
79396169 1530{
1531 const struct cl_option *option = &(cl_options[opt_idx]);
a02d8e72 1532
1533 /* A language-specific option can only be considered enabled when it's
1534 valid for the current language. */
1535 if (option->flags & CL_LANG_ALL && !(option->flags | lang_mask))
1536 return 0;
1537
79396169 1538 struct gcc_options *optsg = (struct gcc_options *) opts;
1539 void *flag_var = option_flag_var (opt_idx, optsg);
1540
1541 if (flag_var)
1542 switch (option->var_type)
1543 {
1544 case CLVC_BOOLEAN:
8e18705e 1545 if (option->cl_host_wide_int)
1546 return *(HOST_WIDE_INT *) flag_var != 0;
1547 else
1548 return *(int *) flag_var != 0;
79396169 1549
1550 case CLVC_EQUAL:
72ec6882 1551 if (option->cl_host_wide_int)
1552 return *(HOST_WIDE_INT *) flag_var == option->var_value;
1553 else
1554 return *(int *) flag_var == option->var_value;
79396169 1555
1556 case CLVC_BIT_CLEAR:
72ec6882 1557 if (option->cl_host_wide_int)
1558 return (*(HOST_WIDE_INT *) flag_var & option->var_value) == 0;
1559 else
1560 return (*(int *) flag_var & option->var_value) == 0;
79396169 1561
1562 case CLVC_BIT_SET:
72ec6882 1563 if (option->cl_host_wide_int)
1564 return (*(HOST_WIDE_INT *) flag_var & option->var_value) != 0;
1565 else
1566 return (*(int *) flag_var & option->var_value) != 0;
79396169 1567
8e18705e 1568 case CLVC_SIZE:
1569 if (option->cl_host_wide_int)
1570 return *(HOST_WIDE_INT *) flag_var != -1;
1571 else
1572 return *(int *) flag_var != -1;
1573
79396169 1574 case CLVC_STRING:
d62a5950 1575 case CLVC_ENUM:
79396169 1576 case CLVC_DEFER:
1577 break;
1578 }
1579 return -1;
1580}
1581
1582/* Fill STATE with the current state of option OPTION in OPTS. Return
1583 true if there is some state to store. */
1584
1585bool
1586get_option_state (struct gcc_options *opts, int option,
1587 struct cl_option_state *state)
1588{
1589 void *flag_var = option_flag_var (option, opts);
1590
1591 if (flag_var == 0)
1592 return false;
1593
1594 switch (cl_options[option].var_type)
1595 {
1596 case CLVC_BOOLEAN:
1597 case CLVC_EQUAL:
8e18705e 1598 case CLVC_SIZE:
79396169 1599 state->data = flag_var;
72ec6882 1600 state->size = (cl_options[option].cl_host_wide_int
1601 ? sizeof (HOST_WIDE_INT)
1602 : sizeof (int));
79396169 1603 break;
1604
1605 case CLVC_BIT_CLEAR:
1606 case CLVC_BIT_SET:
a02d8e72 1607 state->ch = option_enabled (option, -1, opts);
79396169 1608 state->data = &state->ch;
1609 state->size = 1;
1610 break;
1611
1612 case CLVC_STRING:
1613 state->data = *(const char **) flag_var;
1614 if (state->data == 0)
1615 state->data = "";
1616 state->size = strlen ((const char *) state->data) + 1;
1617 break;
1618
d62a5950 1619 case CLVC_ENUM:
1620 state->data = flag_var;
1621 state->size = cl_enums[cl_options[option].var_enum].var_size;
1622 break;
1623
79396169 1624 case CLVC_DEFER:
1625 return false;
1626 }
1627 return true;
1628}
1629
c123f04d 1630/* Set a warning option OPT_INDEX (language mask LANG_MASK, option
1631 handlers HANDLERS) to have diagnostic kind KIND for option
1632 structures OPTS and OPTS_SET and diagnostic context DC (possibly
31ba81bd 1633 NULL), at location LOC (UNKNOWN_LOCATION for -Werror=). ARG is the
1634 argument of the option for joined options, or NULL otherwise. If IMPLY,
c123f04d 1635 the warning option in question is implied at this point. This is
1636 used by -Werror= and #pragma GCC diagnostic. */
1637
1638void
31ba81bd 1639control_warning_option (unsigned int opt_index, int kind, const char *arg,
1640 bool imply, location_t loc, unsigned int lang_mask,
c123f04d 1641 const struct cl_option_handlers *handlers,
1642 struct gcc_options *opts,
1643 struct gcc_options *opts_set,
1644 diagnostic_context *dc)
1645{
1646 if (cl_options[opt_index].alias_target != N_OPTS)
7ca909c6 1647 {
1648 gcc_assert (!cl_options[opt_index].cl_separate_alias
1649 && !cl_options[opt_index].cl_negative_alias);
1650 if (cl_options[opt_index].alias_arg)
1651 arg = cl_options[opt_index].alias_arg;
1652 opt_index = cl_options[opt_index].alias_target;
1653 }
0c46a085 1654 if (opt_index == OPT_SPECIAL_ignore || opt_index == OPT_SPECIAL_deprecated)
c123f04d 1655 return;
1656 if (dc)
1657 diagnostic_classify_diagnostic (dc, opt_index, (diagnostic_t) kind, loc);
1658 if (imply)
1659 {
31ba81bd 1660 const struct cl_option *option = &cl_options[opt_index];
1661
c123f04d 1662 /* -Werror=foo implies -Wfoo. */
8e18705e 1663 if (option->var_type == CLVC_BOOLEAN
1664 || option->var_type == CLVC_ENUM
1665 || option->var_type == CLVC_SIZE)
31ba81bd 1666 {
8e18705e 1667 HOST_WIDE_INT value = 1;
31ba81bd 1668
1669 if (arg && *arg == '\0' && !option->cl_missing_ok)
1670 arg = NULL;
1671
1672 if ((option->flags & CL_JOINED) && arg == NULL)
1673 {
1674 cmdline_handle_error (loc, option, option->opt_text, arg,
1675 CL_ERR_MISSING_ARG, lang_mask);
1676 return;
1677 }
1678
8e18705e 1679 /* If the switch takes an integer argument, convert it. */
1680 if (arg && (option->cl_uinteger || option->cl_host_wide_int))
31ba81bd 1681 {
8e18705e 1682 int error = 0;
1683 value = *arg ? integral_argument (arg, &error,
1684 option->cl_byte_size) : 0;
1685 if (error)
31ba81bd 1686 {
1687 cmdline_handle_error (loc, option, option->opt_text, arg,
1688 CL_ERR_UINT_ARG, lang_mask);
1689 return;
1690 }
1691 }
1692
1693 /* If the switch takes an enumerated argument, convert it. */
1694 if (arg && option->var_type == CLVC_ENUM)
1695 {
1696 const struct cl_enum *e = &cl_enums[option->var_enum];
1697
1698 if (enum_arg_to_value (e->values, arg, &value, lang_mask))
1699 {
1700 const char *carg = NULL;
1701
1702 if (enum_value_to_arg (e->values, &carg, value, lang_mask))
1703 arg = carg;
1704 gcc_assert (carg != NULL);
1705 }
1706 else
1707 {
1708 cmdline_handle_error (loc, option, option->opt_text, arg,
1709 CL_ERR_ENUM_ARG, lang_mask);
1710 return;
1711 }
1712 }
1713
1714 handle_generated_option (opts, opts_set,
1715 opt_index, arg, value, lang_mask,
09fd09eb 1716 kind, loc, handlers, false, dc);
31ba81bd 1717 }
c123f04d 1718 }
1719}