]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/opts-common.c
Introduce -fno-debug-types-section flag.
[thirdparty/gcc.git] / gcc / opts-common.c
CommitLineData
14c7833c 1/* Command line option handling.
eb50f63a 2 Copyright (C) 2006, 2007, 2008, 2010, 2011 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
5d4b393f
JM
150/* If ARG is a non-negative integer made up solely of digits, return its
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
164 return -1;
165}
166
d9d16a19
JM
167/* Return whether OPTION is OK for the language given by
168 LANG_MASK. */
169static bool
170option_ok_for_language (const struct cl_option *option,
171 unsigned int lang_mask)
172{
173 if (!(option->flags & lang_mask))
174 return false;
175 else if ((option->flags & CL_TARGET)
176 && (option->flags & (CL_LANG_ALL | CL_DRIVER))
177 && !(option->flags & (lang_mask & ~CL_COMMON & ~CL_TARGET)))
178 /* Complain for target flag language mismatches if any languages
179 are specified. */
180 return false;
181 return true;
182}
183
e6d4b984
JM
184/* Return whether ENUM_ARG is OK for the language given by
185 LANG_MASK. */
186
187static bool
188enum_arg_ok_for_language (const struct cl_enum_arg *enum_arg,
189 unsigned int lang_mask)
190{
191 return (lang_mask & CL_DRIVER) || !(enum_arg->flags & CL_ENUM_DRIVER_ONLY);
192}
193
194/* Look up ARG in ENUM_ARGS for language LANG_MASK, returning true and
195 storing the value in *VALUE if found, and returning false without
196 modifying *VALUE if not found. */
197
198static bool
199enum_arg_to_value (const struct cl_enum_arg *enum_args,
200 const char *arg, int *value, unsigned int lang_mask)
201{
202 unsigned int i;
203
204 for (i = 0; enum_args[i].arg != NULL; i++)
205 if (strcmp (arg, enum_args[i].arg) == 0
206 && enum_arg_ok_for_language (&enum_args[i], lang_mask))
207 {
208 *value = enum_args[i].value;
209 return true;
210 }
211
212 return false;
213}
214
215/* Look of VALUE in ENUM_ARGS for language LANG_MASK and store the
216 corresponding string in *ARGP, returning true if the found string
217 was marked as canonical, false otherwise. If VALUE is not found
218 (which may be the case for uninitialized values if the relevant
219 option has not been passed), set *ARGP to NULL and return
220 false. */
221
222bool
223enum_value_to_arg (const struct cl_enum_arg *enum_args,
224 const char **argp, int value, unsigned int lang_mask)
225{
226 unsigned int i;
227
228 for (i = 0; enum_args[i].arg != NULL; i++)
229 if (enum_args[i].value == value
230 && (enum_args[i].flags & CL_ENUM_CANONICAL)
231 && enum_arg_ok_for_language (&enum_args[i], lang_mask))
232 {
233 *argp = enum_args[i].arg;
234 return true;
235 }
236
237 for (i = 0; enum_args[i].arg != NULL; i++)
238 if (enum_args[i].value == value
239 && enum_arg_ok_for_language (&enum_args[i], lang_mask))
240 {
241 *argp = enum_args[i].arg;
242 return false;
243 }
244
245 *argp = NULL;
246 return false;
247}
5de8299c
JM
248
249/* Fill in the canonical option part of *DECODED with an option
250 described by OPT_INDEX, ARG and VALUE. */
251
252static void
253generate_canonical_option (size_t opt_index, const char *arg, int value,
254 struct cl_decoded_option *decoded)
255{
256 const struct cl_option *option = &cl_options[opt_index];
257 const char *opt_text = option->opt_text;
258
259 if (value == 0
260 && !(option->flags & CL_REJECT_NEGATIVE)
261 && (opt_text[1] == 'W' || opt_text[1] == 'f' || opt_text[1] == 'm'))
262 {
263 char *t = XNEWVEC (char, option->opt_len + 5);
264 t[0] = '-';
265 t[1] = opt_text[1];
266 t[2] = 'n';
267 t[3] = 'o';
268 t[4] = '-';
269 memcpy (t + 5, opt_text + 2, option->opt_len);
270 opt_text = t;
271 }
272
273 decoded->canonical_option[2] = NULL;
274 decoded->canonical_option[3] = NULL;
275
276 if (arg)
277 {
d1583032
JM
278 if ((option->flags & CL_SEPARATE)
279 && !(option->flags & CL_SEPARATE_ALIAS))
5de8299c
JM
280 {
281 decoded->canonical_option[0] = opt_text;
282 decoded->canonical_option[1] = arg;
283 decoded->canonical_option_num_elements = 2;
284 }
285 else
286 {
287 gcc_assert (option->flags & CL_JOINED);
288 decoded->canonical_option[0] = concat (opt_text, arg, NULL);
289 decoded->canonical_option[1] = NULL;
290 decoded->canonical_option_num_elements = 1;
291 }
292 }
293 else
294 {
295 decoded->canonical_option[0] = opt_text;
296 decoded->canonical_option[1] = NULL;
297 decoded->canonical_option_num_elements = 1;
298 }
299}
300
e200444e
JM
301/* Structure describing mappings from options on the command line to
302 options to look up with find_opt. */
303struct option_map
304{
305 /* Prefix of the option on the command line. */
306 const char *opt0;
307 /* If two argv elements are considered to be merged into one option,
308 prefix for the second element, otherwise NULL. */
309 const char *opt1;
310 /* The new prefix to map to. */
311 const char *new_prefix;
312 /* Whether at least one character is needed following opt1 or opt0
313 for this mapping to be used. (--optimize= is valid for -O, but
314 --warn- is not valid for -W.) */
315 bool another_char_needed;
316 /* Whether the original option is a negated form of the option
317 resulting from this map. */
318 bool negated;
319};
320static const struct option_map option_map[] =
321 {
322 { "-Wno-", NULL, "-W", false, true },
323 { "-fno-", NULL, "-f", false, true },
324 { "-mno-", NULL, "-m", false, true },
325 { "--debug=", NULL, "-g", false, false },
326 { "--machine-", NULL, "-m", true, false },
327 { "--machine-no-", NULL, "-m", false, true },
328 { "--machine=", NULL, "-m", false, false },
329 { "--machine=no-", NULL, "-m", false, true },
330 { "--machine", "", "-m", false, false },
331 { "--machine", "no-", "-m", false, true },
332 { "--optimize=", NULL, "-O", false, false },
333 { "--std=", NULL, "-std=", false, false },
334 { "--std", "", "-std=", false, false },
335 { "--warn-", NULL, "-W", true, false },
336 { "--warn-no-", NULL, "-W", false, true },
337 { "--", NULL, "-f", true, false },
338 { "--no-", NULL, "-f", false, true }
339 };
340
5d4b393f 341/* Decode the switch beginning at ARGV for the language indicated by
603349bf
JM
342 LANG_MASK (including CL_COMMON and CL_TARGET if applicable), into
343 the structure *DECODED. Returns the number of switches
344 consumed. */
5d4b393f 345
6e2f1956 346static unsigned int
5d4b393f
JM
347decode_cmdline_option (const char **argv, unsigned int lang_mask,
348 struct cl_decoded_option *decoded)
349{
350 size_t opt_index;
e200444e 351 const char *arg = 0;
5d4b393f 352 int value = 1;
c8967d95 353 unsigned int result = 1, i, extra_args, separate_args = 0;
e200444e 354 int adjust_len = 0;
eea13ead
JM
355 size_t total_len;
356 char *p;
5d4b393f
JM
357 const struct cl_option *option;
358 int errors = 0;
2d2bd949 359 const char *warn_message = NULL;
c878765b
JM
360 bool separate_arg_flag;
361 bool joined_arg_flag;
d1583032 362 bool have_separate_arg = false;
5d4b393f 363
e200444e 364 extra_args = 0;
5d4b393f 365
e200444e
JM
366 opt_index = find_opt (argv[0] + 1, lang_mask);
367 i = 0;
368 while (opt_index == OPT_SPECIAL_unknown
369 && i < ARRAY_SIZE (option_map))
5d4b393f 370 {
e200444e
JM
371 const char *opt0 = option_map[i].opt0;
372 const char *opt1 = option_map[i].opt1;
373 const char *new_prefix = option_map[i].new_prefix;
374 bool another_char_needed = option_map[i].another_char_needed;
375 size_t opt0_len = strlen (opt0);
376 size_t opt1_len = (opt1 == NULL ? 0 : strlen (opt1));
377 size_t optn_len = (opt1 == NULL ? opt0_len : opt1_len);
378 size_t new_prefix_len = strlen (new_prefix);
379
380 extra_args = (opt1 == NULL ? 0 : 1);
381 value = !option_map[i].negated;
382
383 if (strncmp (argv[0], opt0, opt0_len) == 0
384 && (opt1 == NULL
385 || (argv[1] != NULL && strncmp (argv[1], opt1, opt1_len) == 0))
386 && (!another_char_needed
387 || argv[extra_args][optn_len] != 0))
388 {
389 size_t arglen = strlen (argv[extra_args]);
390 char *dup;
391
392 adjust_len = (int) optn_len - (int) new_prefix_len;
393 dup = XNEWVEC (char, arglen + 1 - adjust_len);
394 memcpy (dup, new_prefix, new_prefix_len);
395 memcpy (dup + new_prefix_len, argv[extra_args] + optn_len,
396 arglen - optn_len + 1);
397 opt_index = find_opt (dup + 1, lang_mask);
398 free (dup);
399 }
400 i++;
5d4b393f
JM
401 }
402
6e2f1956
JM
403 if (opt_index == OPT_SPECIAL_unknown)
404 {
405 arg = argv[0];
e200444e
JM
406 extra_args = 0;
407 value = 1;
6e2f1956
JM
408 goto done;
409 }
5d4b393f
JM
410
411 option = &cl_options[opt_index];
412
413 /* Reject negative form of switches that don't take negatives as
414 unrecognized. */
415 if (!value && (option->flags & CL_REJECT_NEGATIVE))
416 {
6e2f1956 417 opt_index = OPT_SPECIAL_unknown;
184eb658 418 errors |= CL_ERR_NEGATIVE;
6e2f1956 419 arg = argv[0];
5d4b393f
JM
420 goto done;
421 }
422
e200444e 423 result = extra_args + 1;
2d2bd949
JM
424 warn_message = option->warn_message;
425
5d4b393f
JM
426 /* Check to see if the option is disabled for this configuration. */
427 if (option->flags & CL_DISABLED)
428 errors |= CL_ERR_DISABLED;
429
c878765b 430 /* Determine whether there may be a separate argument based on
c243beb0
JM
431 whether this option is being processed for the driver, and, if
432 so, how many such arguments. */
c878765b
JM
433 separate_arg_flag = ((option->flags & CL_SEPARATE)
434 && !((option->flags & CL_NO_DRIVER_ARG)
435 && (lang_mask & CL_DRIVER)));
c243beb0
JM
436 separate_args = (separate_arg_flag
437 ? ((option->flags & CL_SEPARATE_NARGS_MASK)
438 >> CL_SEPARATE_NARGS_SHIFT) + 1
439 : 0);
c878765b
JM
440 joined_arg_flag = (option->flags & CL_JOINED) != 0;
441
5d4b393f 442 /* Sort out any argument the switch takes. */
c878765b 443 if (joined_arg_flag)
5d4b393f
JM
444 {
445 /* Have arg point to the original switch. This is because
446 some code, such as disable_builtin_function, expects its
447 argument to be persistent until the program exits. */
e200444e 448 arg = argv[extra_args] + cl_options[opt_index].opt_len + 1 + adjust_len;
5d4b393f
JM
449
450 if (*arg == '\0' && !(option->flags & CL_MISSING_OK))
451 {
c878765b 452 if (separate_arg_flag)
5d4b393f 453 {
e200444e
JM
454 arg = argv[extra_args + 1];
455 result = extra_args + 2;
5d4b393f 456 if (arg == NULL)
e200444e 457 result = extra_args + 1;
d1583032
JM
458 else
459 have_separate_arg = true;
5d4b393f
JM
460 }
461 else
462 /* Missing argument. */
463 arg = NULL;
464 }
465 }
c878765b 466 else if (separate_arg_flag)
5d4b393f 467 {
e200444e 468 arg = argv[extra_args + 1];
c243beb0
JM
469 for (i = 0; i < separate_args; i++)
470 if (argv[extra_args + 1 + i] == NULL)
471 {
472 errors |= CL_ERR_MISSING_ARG;
473 break;
474 }
475 result = extra_args + 1 + i;
476 if (arg != NULL)
d1583032 477 have_separate_arg = true;
5d4b393f
JM
478 }
479
5de8299c
JM
480 if (arg == NULL && (separate_arg_flag || joined_arg_flag))
481 errors |= CL_ERR_MISSING_ARG;
482
2d2bd949
JM
483 /* Is this option an alias (or an ignored option, marked as an alias
484 of OPT_SPECIAL_ignore)? */
d1583032
JM
485 if (option->alias_target != N_OPTS
486 && (!(option->flags & CL_SEPARATE_ALIAS) || have_separate_arg))
5de8299c
JM
487 {
488 size_t new_opt_index = option->alias_target;
5de8299c 489
2d2bd949 490 if (new_opt_index == OPT_SPECIAL_ignore)
5de8299c 491 {
2d2bd949
JM
492 gcc_assert (option->alias_arg == NULL);
493 gcc_assert (option->neg_alias_arg == NULL);
494 opt_index = new_opt_index;
495 arg = NULL;
5de8299c
JM
496 value = 1;
497 }
2d2bd949 498 else
5de8299c 499 {
2d2bd949 500 const struct cl_option *new_option = &cl_options[new_opt_index];
5de8299c 501
2d2bd949 502 /* The new option must not be an alias itself. */
e200444e
JM
503 gcc_assert (new_option->alias_target == N_OPTS
504 || (new_option->flags & CL_SEPARATE_ALIAS));
5de8299c 505
2d2bd949
JM
506 if (option->neg_alias_arg)
507 {
508 gcc_assert (option->alias_arg != NULL);
509 gcc_assert (arg == NULL);
510 if (value)
511 arg = option->alias_arg;
512 else
513 arg = option->neg_alias_arg;
514 value = 1;
515 }
516 else if (option->alias_arg)
517 {
518 gcc_assert (value == 1);
519 gcc_assert (arg == NULL);
520 arg = option->alias_arg;
521 }
5de8299c 522
2d2bd949
JM
523 opt_index = new_opt_index;
524 option = new_option;
5de8299c 525
2d2bd949
JM
526 if (value == 0)
527 gcc_assert (!(option->flags & CL_REJECT_NEGATIVE));
528
529 /* Recompute what arguments are allowed. */
530 separate_arg_flag = ((option->flags & CL_SEPARATE)
531 && !((option->flags & CL_NO_DRIVER_ARG)
532 && (lang_mask & CL_DRIVER)));
533 joined_arg_flag = (option->flags & CL_JOINED) != 0;
534
c243beb0
JM
535 if (separate_args > 1 || (option->flags & CL_SEPARATE_NARGS_MASK))
536 gcc_assert (separate_args
537 == ((option->flags & CL_SEPARATE_NARGS_MASK)
538 >> CL_SEPARATE_NARGS_SHIFT) + 1);
539
2d2bd949
JM
540 if (!(errors & CL_ERR_MISSING_ARG))
541 {
542 if (separate_arg_flag || joined_arg_flag)
e200444e
JM
543 {
544 if ((option->flags & CL_MISSING_OK) && arg == NULL)
545 arg = "";
546 gcc_assert (arg != NULL);
547 }
2d2bd949
JM
548 else
549 gcc_assert (arg == NULL);
550 }
5de8299c 551
2d2bd949
JM
552 /* Recheck for warnings and disabled options. */
553 if (option->warn_message)
554 {
555 gcc_assert (warn_message == NULL);
556 warn_message = option->warn_message;
557 }
558 if (option->flags & CL_DISABLED)
559 errors |= CL_ERR_DISABLED;
560 }
5de8299c
JM
561 }
562
5d4b393f 563 /* Check if this is a switch for a different front end. */
d9d16a19 564 if (!option_ok_for_language (option, lang_mask))
5d4b393f 565 errors |= CL_ERR_WRONG_LANG;
5d4b393f 566
5d4b393f
JM
567 /* If the switch takes an integer, convert it. */
568 if (arg && (option->flags & CL_UINTEGER))
569 {
570 value = integral_argument (arg);
571 if (value == -1)
572 errors |= CL_ERR_UINT_ARG;
573 }
574
e6d4b984
JM
575 /* If the switch takes an enumerated argument, convert it. */
576 if (arg && (option->var_type == CLVC_ENUM))
577 {
578 const struct cl_enum *e = &cl_enums[option->var_enum];
579
580 gcc_assert (value == 1);
581 if (enum_arg_to_value (e->values, arg, &value, lang_mask))
582 {
583 const char *carg = NULL;
584
585 if (enum_value_to_arg (e->values, &carg, value, lang_mask))
586 arg = carg;
587 gcc_assert (carg != NULL);
588 }
589 else
590 errors |= CL_ERR_ENUM_ARG;
591 }
592
5d4b393f 593 done:
5d4b393f
JM
594 decoded->opt_index = opt_index;
595 decoded->arg = arg;
596 decoded->value = value;
597 decoded->errors = errors;
2d2bd949 598 decoded->warn_message = warn_message;
eea13ead
JM
599
600 if (opt_index == OPT_SPECIAL_unknown)
c243beb0 601 gcc_assert (result == 1);
eea13ead
JM
602
603 gcc_assert (result >= 1 && result <= ARRAY_SIZE (decoded->canonical_option));
604 decoded->canonical_option_num_elements = result;
605 total_len = 0;
606 for (i = 0; i < ARRAY_SIZE (decoded->canonical_option); i++)
607 {
608 if (i < result)
609 {
7fcf46f5 610 size_t len;
5de8299c
JM
611 if (opt_index == OPT_SPECIAL_unknown)
612 decoded->canonical_option[i] = argv[i];
613 else
614 decoded->canonical_option[i] = NULL;
7fcf46f5
JZ
615 len = strlen (argv[i]);
616 /* If the argument is an empty string, we will print it as "" in
617 orig_option_with_args_text. */
618 total_len += (len != 0 ? len : 2) + 1;
eea13ead
JM
619 }
620 else
621 decoded->canonical_option[i] = NULL;
622 }
2d2bd949 623 if (opt_index != OPT_SPECIAL_unknown && opt_index != OPT_SPECIAL_ignore)
c243beb0
JM
624 {
625 generate_canonical_option (opt_index, arg, value, decoded);
626 if (separate_args > 1)
627 {
628 for (i = 0; i < separate_args; i++)
629 {
630 if (argv[extra_args + 1 + i] == NULL)
631 break;
632 else
633 decoded->canonical_option[1 + i] = argv[extra_args + 1 + i];
634 }
635 gcc_assert (result == 1 + i);
636 decoded->canonical_option_num_elements = result;
637 }
638 }
eea13ead
JM
639 decoded->orig_option_with_args_text = p = XNEWVEC (char, total_len);
640 for (i = 0; i < result; i++)
641 {
642 size_t len = strlen (argv[i]);
643
7fcf46f5
JZ
644 /* Print the empty string verbally. */
645 if (len == 0)
646 {
647 *p++ = '"';
648 *p++ = '"';
649 }
650 else
651 memcpy (p, argv[i], len);
eea13ead
JM
652 p += len;
653 if (i == result - 1)
654 *p++ = 0;
655 else
656 *p++ = ' ';
657 }
658
5d4b393f
JM
659 return result;
660}
661
6e2f1956
JM
662/* Decode command-line options (ARGC and ARGV being the arguments of
663 main) into an array, setting *DECODED_OPTIONS to a pointer to that
664 array and *DECODED_OPTIONS_COUNT to the number of entries in the
665 array. The first entry in the array is always one for the program
666 name (OPT_SPECIAL_program_name). LANG_MASK indicates the language
603349bf
JM
667 flags applicable for decoding (including CL_COMMON and CL_TARGET if
668 those options should be considered applicable). Do not produce any
669 diagnostics or set state outside of these variables. */
6e2f1956
JM
670
671void
672decode_cmdline_options_to_array (unsigned int argc, const char **argv,
673 unsigned int lang_mask,
674 struct cl_decoded_option **decoded_options,
675 unsigned int *decoded_options_count)
676{
2be55a25 677 unsigned int n, i;
6e2f1956
JM
678 struct cl_decoded_option *opt_array;
679 unsigned int num_decoded_options;
e200444e 680 bool argv_copied = false;
6e2f1956
JM
681
682 opt_array = XNEWVEC (struct cl_decoded_option, argc);
683
684 opt_array[0].opt_index = OPT_SPECIAL_program_name;
2d2bd949 685 opt_array[0].warn_message = NULL;
6e2f1956
JM
686 opt_array[0].arg = argv[0];
687 opt_array[0].orig_option_with_args_text = argv[0];
eea13ead 688 opt_array[0].canonical_option_num_elements = 1;
7a9bf9a4
JM
689 opt_array[0].canonical_option[0] = argv[0];
690 opt_array[0].canonical_option[1] = NULL;
eea13ead
JM
691 opt_array[0].canonical_option[2] = NULL;
692 opt_array[0].canonical_option[3] = NULL;
6e2f1956
JM
693 opt_array[0].value = 1;
694 opt_array[0].errors = 0;
695 num_decoded_options = 1;
696
697 for (i = 1; i < argc; i += n)
698 {
699 const char *opt = argv[i];
700
701 /* Interpret "-" or a non-switch as a file name. */
702 if (opt[0] != '-' || opt[1] == '\0')
703 {
d9d16a19 704 generate_option_input_file (opt, &opt_array[num_decoded_options]);
6e2f1956
JM
705 num_decoded_options++;
706 n = 1;
707 continue;
708 }
709
710 n = decode_cmdline_option (argv + i, lang_mask,
711 &opt_array[num_decoded_options]);
712 num_decoded_options++;
713 }
714
e200444e
JM
715 if (argv_copied)
716 free (argv);
6e2f1956
JM
717 *decoded_options = opt_array;
718 *decoded_options_count = num_decoded_options;
60cf253a 719 prune_options (decoded_options, decoded_options_count);
6e2f1956
JM
720}
721
14c7833c
L
722/* Return true if NEXT_OPT_IDX cancels OPT_IDX. Return false if the
723 next one is the same as ORIG_NEXT_OPT_IDX. */
724
725static bool
726cancel_option (int opt_idx, int next_opt_idx, int orig_next_opt_idx)
727{
728 /* An option can be canceled by the same option or an option with
729 Negative. */
730 if (cl_options [next_opt_idx].neg_index == opt_idx)
731 return true;
732
733 if (cl_options [next_opt_idx].neg_index != orig_next_opt_idx)
734 return cancel_option (opt_idx, cl_options [next_opt_idx].neg_index,
735 orig_next_opt_idx);
b8698a0f 736
14c7833c
L
737 return false;
738}
739
740/* Filter out options canceled by the ones after them. */
741
60cf253a
JM
742static void
743prune_options (struct cl_decoded_option **decoded_options,
744 unsigned int *decoded_options_count)
14c7833c 745{
60cf253a
JM
746 unsigned int old_decoded_options_count = *decoded_options_count;
747 struct cl_decoded_option *old_decoded_options = *decoded_options;
748 unsigned int new_decoded_options_count;
749 struct cl_decoded_option *new_decoded_options
750 = XNEWVEC (struct cl_decoded_option, old_decoded_options_count);
751 unsigned int i;
14c7833c 752 const struct cl_option *option;
14c7833c
L
753
754 /* Remove arguments which are negated by others after them. */
60cf253a
JM
755 new_decoded_options_count = 0;
756 for (i = 0; i < old_decoded_options_count; i++)
14c7833c 757 {
60cf253a
JM
758 unsigned int j, opt_idx, next_opt_idx;
759
760 if (old_decoded_options[i].errors & ~CL_ERR_WRONG_LANG)
761 goto keep;
14c7833c 762
60cf253a
JM
763 opt_idx = old_decoded_options[i].opt_index;
764 switch (opt_idx)
14c7833c 765 {
60cf253a
JM
766 case OPT_SPECIAL_unknown:
767 case OPT_SPECIAL_ignore:
768 case OPT_SPECIAL_program_name:
769 case OPT_SPECIAL_input_file:
770 goto keep;
771
772 default:
773 gcc_assert (opt_idx < cl_options_count);
774 option = &cl_options[opt_idx];
775 if (option->neg_index < 0)
776 goto keep;
777
778 /* Skip joined switches. */
779 if ((option->flags & CL_JOINED))
780 goto keep;
781
782 for (j = i + 1; j < old_decoded_options_count; j++)
14c7833c 783 {
60cf253a
JM
784 if (old_decoded_options[j].errors & ~CL_ERR_WRONG_LANG)
785 continue;
786 next_opt_idx = old_decoded_options[j].opt_index;
787 if (next_opt_idx >= cl_options_count)
788 continue;
789 if (cl_options[next_opt_idx].neg_index < 0)
790 continue;
791 if ((cl_options[next_opt_idx].flags & CL_JOINED))
792 continue;
793 if (cancel_option (opt_idx, next_opt_idx, next_opt_idx))
14c7833c
L
794 break;
795 }
60cf253a
JM
796 if (j == old_decoded_options_count)
797 {
14c7833c 798keep:
60cf253a
JM
799 new_decoded_options[new_decoded_options_count]
800 = old_decoded_options[i];
801 new_decoded_options_count++;
802 }
803 break;
14c7833c
L
804 }
805 }
806
60cf253a
JM
807 free (old_decoded_options);
808 new_decoded_options = XRESIZEVEC (struct cl_decoded_option,
809 new_decoded_options,
810 new_decoded_options_count);
811 *decoded_options = new_decoded_options;
812 *decoded_options_count = new_decoded_options_count;
14c7833c 813}
5f20c657 814
481e1176 815/* Handle option DECODED for the language indicated by LANG_MASK,
d4d24ba4
JM
816 using the handlers in HANDLERS and setting fields in OPTS and
817 OPTS_SET. KIND is the diagnostic_t if this is a diagnostics
a4d8c676
JM
818 option, DK_UNSPECIFIED otherwise, and LOC is the location of the
819 option for options from the source file, UNKNOWN_LOCATION
820 otherwise. GENERATED_P is true for an option generated as part of
821 processing another option or otherwise generated internally, false
822 for one explicitly passed by the user. Returns false if the switch
823 was invalid. DC is the diagnostic context for options affecting
824 diagnostics state, or NULL. */
5f20c657 825
a4d8c676 826static bool
46625112 827handle_option (struct gcc_options *opts,
d4d24ba4 828 struct gcc_options *opts_set,
46625112 829 const struct cl_decoded_option *decoded,
a4d8c676 830 unsigned int lang_mask, int kind, location_t loc,
d4d24ba4 831 const struct cl_option_handlers *handlers,
1ebe4b4f 832 bool generated_p, diagnostic_context *dc)
5f20c657 833{
481e1176
JM
834 size_t opt_index = decoded->opt_index;
835 const char *arg = decoded->arg;
836 int value = decoded->value;
5f20c657 837 const struct cl_option *option = &cl_options[opt_index];
46625112 838 void *flag_var = option_flag_var (opt_index, opts);
5f20c657
JM
839 size_t i;
840
46625112 841 if (flag_var)
d4d24ba4 842 set_option (opts, (generated_p ? NULL : opts_set),
a4d8c676 843 opt_index, value, arg, kind, loc, dc);
5f20c657
JM
844
845 for (i = 0; i < handlers->num_handlers; i++)
846 if (option->flags & handlers->handlers[i].mask)
847 {
d4d24ba4 848 if (!handlers->handlers[i].handler (opts, opts_set, decoded,
a4d8c676
JM
849 lang_mask, kind, loc,
850 handlers, dc))
5f20c657
JM
851 return false;
852 else
481e1176 853 handlers->post_handling_callback (decoded,
5f20c657
JM
854 handlers->handlers[i].mask);
855 }
856
857 return true;
858}
859
481e1176
JM
860/* Like handle_option, but OPT_INDEX, ARG and VALUE describe the
861 option instead of DECODED. This is used for callbacks when one
862 option implies another instead of an option being decoded from the
863 command line. */
864
865bool
d4d24ba4
JM
866handle_generated_option (struct gcc_options *opts,
867 struct gcc_options *opts_set,
868 size_t opt_index, const char *arg, int value,
a4d8c676 869 unsigned int lang_mask, int kind, location_t loc,
1ebe4b4f
JM
870 const struct cl_option_handlers *handlers,
871 diagnostic_context *dc)
481e1176 872{
481e1176
JM
873 struct cl_decoded_option decoded;
874
d9d16a19 875 generate_option (opt_index, arg, value, lang_mask, &decoded);
a4d8c676
JM
876 return handle_option (opts, opts_set, &decoded, lang_mask, kind, loc,
877 handlers, true, dc);
d9d16a19
JM
878}
879
880/* Fill in *DECODED with an option described by OPT_INDEX, ARG and
881 VALUE for a front end using LANG_MASK. This is used when the
882 compiler generates options internally. */
883
884void
885generate_option (size_t opt_index, const char *arg, int value,
886 unsigned int lang_mask, struct cl_decoded_option *decoded)
887{
888 const struct cl_option *option = &cl_options[opt_index];
889
890 decoded->opt_index = opt_index;
2d2bd949 891 decoded->warn_message = NULL;
d9d16a19 892 decoded->arg = arg;
d9d16a19
JM
893 decoded->value = value;
894 decoded->errors = (option_ok_for_language (option, lang_mask)
895 ? 0
896 : CL_ERR_WRONG_LANG);
481e1176 897
5de8299c
JM
898 generate_canonical_option (opt_index, arg, value, decoded);
899 switch (decoded->canonical_option_num_elements)
481e1176 900 {
5de8299c
JM
901 case 1:
902 decoded->orig_option_with_args_text = decoded->canonical_option[0];
903 break;
904
905 case 2:
906 decoded->orig_option_with_args_text
907 = concat (decoded->canonical_option[0], " ",
908 decoded->canonical_option[1], NULL);
909 break;
910
911 default:
912 gcc_unreachable ();
481e1176 913 }
d9d16a19 914}
481e1176 915
d9d16a19
JM
916/* Fill in *DECODED with an option for input file FILE. */
917
918void
919generate_option_input_file (const char *file,
920 struct cl_decoded_option *decoded)
921{
922 decoded->opt_index = OPT_SPECIAL_input_file;
2d2bd949 923 decoded->warn_message = NULL;
d9d16a19
JM
924 decoded->arg = file;
925 decoded->orig_option_with_args_text = file;
926 decoded->canonical_option_num_elements = 1;
927 decoded->canonical_option[0] = file;
928 decoded->canonical_option[1] = NULL;
929 decoded->canonical_option[2] = NULL;
930 decoded->canonical_option[3] = NULL;
931 decoded->value = 1;
932 decoded->errors = 0;
481e1176
JM
933}
934
a4d8c676
JM
935/* Handle the switch DECODED (location LOC) for the language indicated
936 by LANG_MASK, using the handlers in *HANDLERS and setting fields in
937 OPTS and OPTS_SET and using diagnostic context DC (if not NULL) for
1ebe4b4f 938 diagnostic options. */
5f20c657
JM
939
940void
46625112 941read_cmdline_option (struct gcc_options *opts,
d4d24ba4 942 struct gcc_options *opts_set,
46625112 943 struct cl_decoded_option *decoded,
a4d8c676 944 location_t loc,
5f20c657 945 unsigned int lang_mask,
1ebe4b4f
JM
946 const struct cl_option_handlers *handlers,
947 diagnostic_context *dc)
5f20c657
JM
948{
949 const struct cl_option *option;
2d2bd949
JM
950 const char *opt = decoded->orig_option_with_args_text;
951
952 if (decoded->warn_message)
a4d8c676 953 warning_at (loc, 0, decoded->warn_message, opt);
5f20c657
JM
954
955 if (decoded->opt_index == OPT_SPECIAL_unknown)
956 {
481e1176 957 if (handlers->unknown_option_callback (decoded))
a4d8c676 958 error_at (loc, "unrecognized command line option %qs", decoded->arg);
5f20c657
JM
959 return;
960 }
961
2d2bd949
JM
962 if (decoded->opt_index == OPT_SPECIAL_ignore)
963 return;
964
5f20c657 965 option = &cl_options[decoded->opt_index];
5f20c657
JM
966
967 if (decoded->errors & CL_ERR_DISABLED)
968 {
a4d8c676
JM
969 error_at (loc, "command line option %qs"
970 " is not supported by this configuration", opt);
5f20c657
JM
971 return;
972 }
973
5f20c657
JM
974 if (decoded->errors & CL_ERR_MISSING_ARG)
975 {
976 if (option->missing_argument_error)
a4d8c676 977 error_at (loc, option->missing_argument_error, opt);
5f20c657 978 else
a4d8c676 979 error_at (loc, "missing argument to %qs", opt);
5f20c657
JM
980 return;
981 }
982
983 if (decoded->errors & CL_ERR_UINT_ARG)
984 {
a4d8c676
JM
985 error_at (loc, "argument to %qs should be a non-negative integer",
986 option->opt_text);
5f20c657
JM
987 return;
988 }
989
e6d4b984
JM
990 if (decoded->errors & CL_ERR_ENUM_ARG)
991 {
992 const struct cl_enum *e = &cl_enums[option->var_enum];
993 unsigned int i;
994 size_t len;
995 char *s, *p;
996
997 if (e->unknown_error)
998 error_at (loc, e->unknown_error, decoded->arg);
999 else
1000 error_at (loc, "unrecognized argument in option %qs", opt);
1001
1002 len = 0;
1003 for (i = 0; e->values[i].arg != NULL; i++)
1004 len += strlen (e->values[i].arg) + 1;
1005
1006 s = XALLOCAVEC (char, len);
1007 p = s;
1008 for (i = 0; e->values[i].arg != NULL; i++)
1009 {
1010 size_t arglen = strlen (e->values[i].arg);
1011 memcpy (p, e->values[i].arg, arglen);
1012 p[arglen] = ' ';
1013 p += arglen + 1;
1014 }
1015 p[-1] = 0;
1016 inform (loc, "valid arguments to %qs are: %s", option->opt_text, s);
1017 return;
1018 }
1019
4df47bca
JM
1020 if (decoded->errors & CL_ERR_WRONG_LANG)
1021 {
1022 handlers->wrong_lang_callback (decoded, lang_mask);
1023 return;
1024 }
1025
5f20c657
JM
1026 gcc_assert (!decoded->errors);
1027
d4d24ba4 1028 if (!handle_option (opts, opts_set, decoded, lang_mask, DK_UNSPECIFIED,
a4d8c676
JM
1029 loc, handlers, false, dc))
1030 error_at (loc, "unrecognized command line option %qs", opt);
5f20c657
JM
1031}
1032
d4d24ba4 1033/* Set any field in OPTS, and OPTS_SET if not NULL, for option
a4d8c676
JM
1034 OPT_INDEX according to VALUE and ARG, diagnostic kind KIND,
1035 location LOC, using diagnostic context DC if not NULL for
1036 diagnostic classification. */
5f20c657
JM
1037
1038void
d4d24ba4 1039set_option (struct gcc_options *opts, struct gcc_options *opts_set,
1ebe4b4f 1040 int opt_index, int value, const char *arg, int kind,
a4d8c676 1041 location_t loc, diagnostic_context *dc)
5f20c657
JM
1042{
1043 const struct cl_option *option = &cl_options[opt_index];
46625112 1044 void *flag_var = option_flag_var (opt_index, opts);
d4d24ba4 1045 void *set_flag_var = NULL;
5f20c657 1046
46625112 1047 if (!flag_var)
5f20c657
JM
1048 return;
1049
d4d24ba4
JM
1050 if (opts_set != NULL)
1051 set_flag_var = option_flag_var (opt_index, opts_set);
1052
5f20c657
JM
1053 switch (option->var_type)
1054 {
1055 case CLVC_BOOLEAN:
46625112 1056 *(int *) flag_var = value;
d4d24ba4
JM
1057 if (set_flag_var)
1058 *(int *) set_flag_var = 1;
5f20c657
JM
1059 break;
1060
1061 case CLVC_EQUAL:
46625112
JM
1062 *(int *) flag_var = (value
1063 ? option->var_value
1064 : !option->var_value);
d4d24ba4
JM
1065 if (set_flag_var)
1066 *(int *) set_flag_var = 1;
5f20c657
JM
1067 break;
1068
1069 case CLVC_BIT_CLEAR:
1070 case CLVC_BIT_SET:
1071 if ((value != 0) == (option->var_type == CLVC_BIT_SET))
46625112 1072 *(int *) flag_var |= option->var_value;
5f20c657 1073 else
46625112 1074 *(int *) flag_var &= ~option->var_value;
d4d24ba4
JM
1075 if (set_flag_var)
1076 *(int *) set_flag_var |= option->var_value;
5f20c657
JM
1077 break;
1078
1079 case CLVC_STRING:
46625112 1080 *(const char **) flag_var = arg;
d4d24ba4
JM
1081 if (set_flag_var)
1082 *(const char **) set_flag_var = "";
5f20c657 1083 break;
21bf1558 1084
e6d4b984
JM
1085 case CLVC_ENUM:
1086 {
1087 const struct cl_enum *e = &cl_enums[option->var_enum];
1088
1089 e->set (flag_var, value);
1090 if (set_flag_var)
1091 e->set (set_flag_var, 1);
1092 }
1093 break;
1094
21bf1558
JM
1095 case CLVC_DEFER:
1096 {
1097 VEC(cl_deferred_option,heap) *vec
1098 = (VEC(cl_deferred_option,heap) *) *(void **) flag_var;
1099 cl_deferred_option *p;
1100
1101 p = VEC_safe_push (cl_deferred_option, heap, vec, NULL);
1102 p->opt_index = opt_index;
1103 p->arg = arg;
1104 p->value = value;
1105 *(void **) flag_var = vec;
1106 if (set_flag_var)
1107 *(void **) set_flag_var = vec;
1108 }
1109 break;
5f20c657
JM
1110 }
1111
1ebe4b4f
JM
1112 if ((diagnostic_t) kind != DK_UNSPECIFIED
1113 && dc != NULL)
a4d8c676 1114 diagnostic_classify_diagnostic (dc, opt_index, (diagnostic_t) kind, loc);
5f20c657 1115}
46625112
JM
1116
1117/* Return the address of the flag variable for option OPT_INDEX in
1118 options structure OPTS, or NULL if there is no flag variable. */
1119
1120void *
1121option_flag_var (int opt_index, struct gcc_options *opts)
1122{
1123 const struct cl_option *option = &cl_options[opt_index];
1124
1125 if (option->flag_var_offset == (unsigned short) -1)
1126 return NULL;
1127 return (void *)(((char *) opts) + option->flag_var_offset);
1128}
c5fa0890 1129
c98cd5bf
JM
1130/* Return 1 if option OPT_IDX is enabled in OPTS, 0 if it is disabled,
1131 or -1 if it isn't a simple on-off switch. */
1132
1133int
1134option_enabled (int opt_idx, void *opts)
1135{
1136 const struct cl_option *option = &(cl_options[opt_idx]);
1137 struct gcc_options *optsg = (struct gcc_options *) opts;
1138 void *flag_var = option_flag_var (opt_idx, optsg);
1139
1140 if (flag_var)
1141 switch (option->var_type)
1142 {
1143 case CLVC_BOOLEAN:
1144 return *(int *) flag_var != 0;
1145
1146 case CLVC_EQUAL:
1147 return *(int *) flag_var == option->var_value;
1148
1149 case CLVC_BIT_CLEAR:
1150 return (*(int *) flag_var & option->var_value) == 0;
1151
1152 case CLVC_BIT_SET:
1153 return (*(int *) flag_var & option->var_value) != 0;
1154
1155 case CLVC_STRING:
e6d4b984 1156 case CLVC_ENUM:
c98cd5bf
JM
1157 case CLVC_DEFER:
1158 break;
1159 }
1160 return -1;
1161}
1162
1163/* Fill STATE with the current state of option OPTION in OPTS. Return
1164 true if there is some state to store. */
1165
1166bool
1167get_option_state (struct gcc_options *opts, int option,
1168 struct cl_option_state *state)
1169{
1170 void *flag_var = option_flag_var (option, opts);
1171
1172 if (flag_var == 0)
1173 return false;
1174
1175 switch (cl_options[option].var_type)
1176 {
1177 case CLVC_BOOLEAN:
1178 case CLVC_EQUAL:
1179 state->data = flag_var;
1180 state->size = sizeof (int);
1181 break;
1182
1183 case CLVC_BIT_CLEAR:
1184 case CLVC_BIT_SET:
1185 state->ch = option_enabled (option, opts);
1186 state->data = &state->ch;
1187 state->size = 1;
1188 break;
1189
1190 case CLVC_STRING:
1191 state->data = *(const char **) flag_var;
1192 if (state->data == 0)
1193 state->data = "";
1194 state->size = strlen ((const char *) state->data) + 1;
1195 break;
1196
e6d4b984
JM
1197 case CLVC_ENUM:
1198 state->data = flag_var;
1199 state->size = cl_enums[cl_options[option].var_enum].var_size;
1200 break;
1201
c98cd5bf
JM
1202 case CLVC_DEFER:
1203 return false;
1204 }
1205 return true;
1206}
1207
c5fa0890
JM
1208/* Set a warning option OPT_INDEX (language mask LANG_MASK, option
1209 handlers HANDLERS) to have diagnostic kind KIND for option
1210 structures OPTS and OPTS_SET and diagnostic context DC (possibly
1211 NULL), at location LOC (UNKNOWN_LOCATION for -Werror=). If IMPLY,
1212 the warning option in question is implied at this point. This is
1213 used by -Werror= and #pragma GCC diagnostic. */
1214
1215void
1216control_warning_option (unsigned int opt_index, int kind, bool imply,
1217 location_t loc, unsigned int lang_mask,
1218 const struct cl_option_handlers *handlers,
1219 struct gcc_options *opts,
1220 struct gcc_options *opts_set,
1221 diagnostic_context *dc)
1222{
1223 if (cl_options[opt_index].alias_target != N_OPTS)
1224 opt_index = cl_options[opt_index].alias_target;
1225 if (opt_index == OPT_SPECIAL_ignore)
1226 return;
1227 if (dc)
1228 diagnostic_classify_diagnostic (dc, opt_index, (diagnostic_t) kind, loc);
1229 if (imply)
1230 {
1231 /* -Werror=foo implies -Wfoo. */
1232 if (cl_options[opt_index].var_type == CLVC_BOOLEAN)
1233 handle_generated_option (opts, opts_set,
1234 opt_index, NULL, 1, lang_mask,
1235 kind, loc, handlers, dc);
1236 }
1237}