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