1 /* Command line option handling.
2 Copyright (C) 2006-2013 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
23 #include "coretypes.h"
26 #include "diagnostic.h"
28 static void prune_options (struct cl_decoded_option
**, unsigned int *);
30 /* Perform a binary search to find which option the command-line INPUT
31 matches. Returns its index in the option array, and
32 OPT_SPECIAL_unknown on failure.
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".
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
45 issue, 'optc-gen.awk' makes "-gen-decls" point, via the back_chain member,
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).
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. */
55 find_opt (const char *input
, unsigned int lang_mask
)
57 size_t mn
, mn_orig
, mx
, md
, opt_len
;
58 size_t match_wrong_lang
;
62 mx
= cl_options_count
;
64 /* Find mn such this lexicographical inequality holds:
65 cl_options[mn] <= input < cl_options[mn + 1]. */
69 opt_len
= cl_options
[md
].opt_len
;
70 comp
= strncmp (input
, cl_options
[md
].opt_text
+ 1, opt_len
);
80 /* This is the switch that is the best match but for a different
81 front end, or OPT_SPECIAL_unknown if there is no match at all. */
82 match_wrong_lang
= OPT_SPECIAL_unknown
;
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. */
89 const struct cl_option
*opt
= &cl_options
[mn
];
91 /* Is the input either an exact match or a prefix that takes a
93 if (!strncmp (input
, opt
->opt_text
+ 1, opt
->opt_len
)
94 && (input
[opt
->opt_len
] == '\0' || (opt
->flags
& CL_JOINED
)))
96 /* If language is OK, return it. */
97 if (opt
->flags
& lang_mask
)
100 /* If we haven't remembered a prior match, remember this
101 one. Any prior match is necessarily better. */
102 if (match_wrong_lang
== OPT_SPECIAL_unknown
)
103 match_wrong_lang
= mn
;
106 /* Try the next possibility. This is cl_options_count if there
108 mn
= opt
->back_chain
;
110 while (mn
!= cl_options_count
);
112 if (match_wrong_lang
== OPT_SPECIAL_unknown
&& input
[0] == '-')
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)
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
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. */
141 return OPT_SPECIAL_unknown
;
146 /* Return the best wrong match, or OPT_SPECIAL_unknown if none. */
147 return match_wrong_lang
;
150 /* If ARG is a non-negative integer made up solely of digits, return its
151 value, otherwise return -1. */
154 integral_argument (const char *arg
)
158 while (*p
&& ISDIGIT (*p
))
167 /* Return whether OPTION is OK for the language given by
170 option_ok_for_language (const struct cl_option
*option
,
171 unsigned int lang_mask
)
173 if (!(option
->flags
& lang_mask
))
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
184 /* Return whether ENUM_ARG is OK for the language given by
188 enum_arg_ok_for_language (const struct cl_enum_arg
*enum_arg
,
189 unsigned int lang_mask
)
191 return (lang_mask
& CL_DRIVER
) || !(enum_arg
->flags
& CL_ENUM_DRIVER_ONLY
);
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. */
199 enum_arg_to_value (const struct cl_enum_arg
*enum_args
,
200 const char *arg
, int *value
, unsigned int lang_mask
)
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
))
208 *value
= enum_args
[i
].value
;
215 /* Look up ARG in the enum used by option OPT_INDEX for language
216 LANG_MASK, returning true and storing the value in *VALUE if found,
217 and returning false without modifying *VALUE if not found. */
220 opt_enum_arg_to_value (size_t opt_index
, const char *arg
, int *value
,
221 unsigned int lang_mask
)
223 const struct cl_option
*option
= &cl_options
[opt_index
];
225 gcc_assert (option
->var_type
== CLVC_ENUM
);
227 return enum_arg_to_value (cl_enums
[option
->var_enum
].values
, arg
,
231 /* Look of VALUE in ENUM_ARGS for language LANG_MASK and store the
232 corresponding string in *ARGP, returning true if the found string
233 was marked as canonical, false otherwise. If VALUE is not found
234 (which may be the case for uninitialized values if the relevant
235 option has not been passed), set *ARGP to NULL and return
239 enum_value_to_arg (const struct cl_enum_arg
*enum_args
,
240 const char **argp
, int value
, unsigned int lang_mask
)
244 for (i
= 0; enum_args
[i
].arg
!= NULL
; i
++)
245 if (enum_args
[i
].value
== value
246 && (enum_args
[i
].flags
& CL_ENUM_CANONICAL
)
247 && enum_arg_ok_for_language (&enum_args
[i
], lang_mask
))
249 *argp
= enum_args
[i
].arg
;
253 for (i
= 0; enum_args
[i
].arg
!= NULL
; i
++)
254 if (enum_args
[i
].value
== value
255 && enum_arg_ok_for_language (&enum_args
[i
], lang_mask
))
257 *argp
= enum_args
[i
].arg
;
265 /* Fill in the canonical option part of *DECODED with an option
266 described by OPT_INDEX, ARG and VALUE. */
269 generate_canonical_option (size_t opt_index
, const char *arg
, int value
,
270 struct cl_decoded_option
*decoded
)
272 const struct cl_option
*option
= &cl_options
[opt_index
];
273 const char *opt_text
= option
->opt_text
;
276 && !option
->cl_reject_negative
277 && (opt_text
[1] == 'W' || opt_text
[1] == 'f' || opt_text
[1] == 'm'))
279 char *t
= XNEWVEC (char, option
->opt_len
+ 5);
285 memcpy (t
+ 5, opt_text
+ 2, option
->opt_len
);
289 decoded
->canonical_option
[2] = NULL
;
290 decoded
->canonical_option
[3] = NULL
;
294 if ((option
->flags
& CL_SEPARATE
)
295 && !option
->cl_separate_alias
)
297 decoded
->canonical_option
[0] = opt_text
;
298 decoded
->canonical_option
[1] = arg
;
299 decoded
->canonical_option_num_elements
= 2;
303 gcc_assert (option
->flags
& CL_JOINED
);
304 decoded
->canonical_option
[0] = concat (opt_text
, arg
, NULL
);
305 decoded
->canonical_option
[1] = NULL
;
306 decoded
->canonical_option_num_elements
= 1;
307 if (opt_text
!= option
->opt_text
)
308 free (CONST_CAST (char *, opt_text
));
313 decoded
->canonical_option
[0] = opt_text
;
314 decoded
->canonical_option
[1] = NULL
;
315 decoded
->canonical_option_num_elements
= 1;
319 /* Structure describing mappings from options on the command line to
320 options to look up with find_opt. */
323 /* Prefix of the option on the command line. */
325 /* If two argv elements are considered to be merged into one option,
326 prefix for the second element, otherwise NULL. */
328 /* The new prefix to map to. */
329 const char *new_prefix
;
330 /* Whether at least one character is needed following opt1 or opt0
331 for this mapping to be used. (--optimize= is valid for -O, but
332 --warn- is not valid for -W.) */
333 bool another_char_needed
;
334 /* Whether the original option is a negated form of the option
335 resulting from this map. */
338 static const struct option_map option_map
[] =
340 { "-Wno-", NULL
, "-W", false, true },
341 { "-fno-", NULL
, "-f", false, true },
342 { "-mno-", NULL
, "-m", false, true },
343 { "--debug=", NULL
, "-g", false, false },
344 { "--machine-", NULL
, "-m", true, false },
345 { "--machine-no-", NULL
, "-m", false, true },
346 { "--machine=", NULL
, "-m", false, false },
347 { "--machine=no-", NULL
, "-m", false, true },
348 { "--machine", "", "-m", false, false },
349 { "--machine", "no-", "-m", false, true },
350 { "--optimize=", NULL
, "-O", false, false },
351 { "--std=", NULL
, "-std=", false, false },
352 { "--std", "", "-std=", false, false },
353 { "--warn-", NULL
, "-W", true, false },
354 { "--warn-no-", NULL
, "-W", false, true },
355 { "--", NULL
, "-f", true, false },
356 { "--no-", NULL
, "-f", false, true }
359 /* Decode the switch beginning at ARGV for the language indicated by
360 LANG_MASK (including CL_COMMON and CL_TARGET if applicable), into
361 the structure *DECODED. Returns the number of switches
365 decode_cmdline_option (const char **argv
, unsigned int lang_mask
,
366 struct cl_decoded_option
*decoded
)
371 unsigned int result
= 1, i
, extra_args
, separate_args
= 0;
375 const struct cl_option
*option
;
377 const char *warn_message
= NULL
;
378 bool separate_arg_flag
;
379 bool joined_arg_flag
;
380 bool have_separate_arg
= false;
384 opt_index
= find_opt (argv
[0] + 1, lang_mask
);
386 while (opt_index
== OPT_SPECIAL_unknown
387 && i
< ARRAY_SIZE (option_map
))
389 const char *opt0
= option_map
[i
].opt0
;
390 const char *opt1
= option_map
[i
].opt1
;
391 const char *new_prefix
= option_map
[i
].new_prefix
;
392 bool another_char_needed
= option_map
[i
].another_char_needed
;
393 size_t opt0_len
= strlen (opt0
);
394 size_t opt1_len
= (opt1
== NULL
? 0 : strlen (opt1
));
395 size_t optn_len
= (opt1
== NULL
? opt0_len
: opt1_len
);
396 size_t new_prefix_len
= strlen (new_prefix
);
398 extra_args
= (opt1
== NULL
? 0 : 1);
399 value
= !option_map
[i
].negated
;
401 if (strncmp (argv
[0], opt0
, opt0_len
) == 0
403 || (argv
[1] != NULL
&& strncmp (argv
[1], opt1
, opt1_len
) == 0))
404 && (!another_char_needed
405 || argv
[extra_args
][optn_len
] != 0))
407 size_t arglen
= strlen (argv
[extra_args
]);
410 adjust_len
= (int) optn_len
- (int) new_prefix_len
;
411 dup
= XNEWVEC (char, arglen
+ 1 - adjust_len
);
412 memcpy (dup
, new_prefix
, new_prefix_len
);
413 memcpy (dup
+ new_prefix_len
, argv
[extra_args
] + optn_len
,
414 arglen
- optn_len
+ 1);
415 opt_index
= find_opt (dup
+ 1, lang_mask
);
421 if (opt_index
== OPT_SPECIAL_unknown
)
429 option
= &cl_options
[opt_index
];
431 /* Reject negative form of switches that don't take negatives as
433 if (!value
&& option
->cl_reject_negative
)
435 opt_index
= OPT_SPECIAL_unknown
;
436 errors
|= CL_ERR_NEGATIVE
;
441 result
= extra_args
+ 1;
442 warn_message
= option
->warn_message
;
444 /* Check to see if the option is disabled for this configuration. */
445 if (option
->cl_disabled
)
446 errors
|= CL_ERR_DISABLED
;
448 /* Determine whether there may be a separate argument based on
449 whether this option is being processed for the driver, and, if
450 so, how many such arguments. */
451 separate_arg_flag
= ((option
->flags
& CL_SEPARATE
)
452 && !(option
->cl_no_driver_arg
453 && (lang_mask
& CL_DRIVER
)));
454 separate_args
= (separate_arg_flag
455 ? option
->cl_separate_nargs
+ 1
457 joined_arg_flag
= (option
->flags
& CL_JOINED
) != 0;
459 /* Sort out any argument the switch takes. */
462 /* Have arg point to the original switch. This is because
463 some code, such as disable_builtin_function, expects its
464 argument to be persistent until the program exits. */
465 arg
= argv
[extra_args
] + cl_options
[opt_index
].opt_len
+ 1 + adjust_len
;
467 if (*arg
== '\0' && !option
->cl_missing_ok
)
469 if (separate_arg_flag
)
471 arg
= argv
[extra_args
+ 1];
472 result
= extra_args
+ 2;
474 result
= extra_args
+ 1;
476 have_separate_arg
= true;
479 /* Missing argument. */
483 else if (separate_arg_flag
)
485 arg
= argv
[extra_args
+ 1];
486 for (i
= 0; i
< separate_args
; i
++)
487 if (argv
[extra_args
+ 1 + i
] == NULL
)
489 errors
|= CL_ERR_MISSING_ARG
;
492 result
= extra_args
+ 1 + i
;
494 have_separate_arg
= true;
497 if (arg
== NULL
&& (separate_arg_flag
|| joined_arg_flag
))
498 errors
|= CL_ERR_MISSING_ARG
;
500 /* Is this option an alias (or an ignored option, marked as an alias
501 of OPT_SPECIAL_ignore)? */
502 if (option
->alias_target
!= N_OPTS
503 && (!option
->cl_separate_alias
|| have_separate_arg
))
505 size_t new_opt_index
= option
->alias_target
;
507 if (new_opt_index
== OPT_SPECIAL_ignore
)
509 gcc_assert (option
->alias_arg
== NULL
);
510 gcc_assert (option
->neg_alias_arg
== NULL
);
511 opt_index
= new_opt_index
;
517 const struct cl_option
*new_option
= &cl_options
[new_opt_index
];
519 /* The new option must not be an alias itself. */
520 gcc_assert (new_option
->alias_target
== N_OPTS
521 || new_option
->cl_separate_alias
);
523 if (option
->neg_alias_arg
)
525 gcc_assert (option
->alias_arg
!= NULL
);
526 gcc_assert (arg
== NULL
);
527 gcc_assert (!option
->cl_negative_alias
);
529 arg
= option
->alias_arg
;
531 arg
= option
->neg_alias_arg
;
534 else if (option
->alias_arg
)
536 gcc_assert (value
== 1);
537 gcc_assert (arg
== NULL
);
538 gcc_assert (!option
->cl_negative_alias
);
539 arg
= option
->alias_arg
;
542 if (option
->cl_negative_alias
)
545 opt_index
= new_opt_index
;
549 gcc_assert (!option
->cl_reject_negative
);
551 /* Recompute what arguments are allowed. */
552 separate_arg_flag
= ((option
->flags
& CL_SEPARATE
)
553 && !(option
->cl_no_driver_arg
554 && (lang_mask
& CL_DRIVER
)));
555 joined_arg_flag
= (option
->flags
& CL_JOINED
) != 0;
557 if (separate_args
> 1 || option
->cl_separate_nargs
)
558 gcc_assert (separate_args
559 == (unsigned int) option
->cl_separate_nargs
+ 1);
561 if (!(errors
& CL_ERR_MISSING_ARG
))
563 if (separate_arg_flag
|| joined_arg_flag
)
565 if (option
->cl_missing_ok
&& arg
== NULL
)
567 gcc_assert (arg
!= NULL
);
570 gcc_assert (arg
== NULL
);
573 /* Recheck for warnings and disabled options. */
574 if (option
->warn_message
)
576 gcc_assert (warn_message
== NULL
);
577 warn_message
= option
->warn_message
;
579 if (option
->cl_disabled
)
580 errors
|= CL_ERR_DISABLED
;
584 /* Check if this is a switch for a different front end. */
585 if (!option_ok_for_language (option
, lang_mask
))
586 errors
|= CL_ERR_WRONG_LANG
;
588 /* Convert the argument to lowercase if appropriate. */
589 if (arg
&& option
->cl_tolower
)
592 size_t len
= strlen (arg
);
593 char *arg_lower
= XNEWVEC (char, len
+ 1);
595 for (j
= 0; j
< len
; j
++)
596 arg_lower
[j
] = TOLOWER ((unsigned char) arg
[j
]);
601 /* If the switch takes an integer, convert it. */
602 if (arg
&& option
->cl_uinteger
)
604 value
= integral_argument (arg
);
606 errors
|= CL_ERR_UINT_ARG
;
609 /* If the switch takes an enumerated argument, convert it. */
610 if (arg
&& (option
->var_type
== CLVC_ENUM
))
612 const struct cl_enum
*e
= &cl_enums
[option
->var_enum
];
614 gcc_assert (value
== 1);
615 if (enum_arg_to_value (e
->values
, arg
, &value
, lang_mask
))
617 const char *carg
= NULL
;
619 if (enum_value_to_arg (e
->values
, &carg
, value
, lang_mask
))
621 gcc_assert (carg
!= NULL
);
624 errors
|= CL_ERR_ENUM_ARG
;
628 decoded
->opt_index
= opt_index
;
630 decoded
->value
= value
;
631 decoded
->errors
= errors
;
632 decoded
->warn_message
= warn_message
;
634 if (opt_index
== OPT_SPECIAL_unknown
)
635 gcc_assert (result
== 1);
637 gcc_assert (result
>= 1 && result
<= ARRAY_SIZE (decoded
->canonical_option
));
638 decoded
->canonical_option_num_elements
= result
;
640 for (i
= 0; i
< ARRAY_SIZE (decoded
->canonical_option
); i
++)
645 if (opt_index
== OPT_SPECIAL_unknown
)
646 decoded
->canonical_option
[i
] = argv
[i
];
648 decoded
->canonical_option
[i
] = NULL
;
649 len
= strlen (argv
[i
]);
650 /* If the argument is an empty string, we will print it as "" in
651 orig_option_with_args_text. */
652 total_len
+= (len
!= 0 ? len
: 2) + 1;
655 decoded
->canonical_option
[i
] = NULL
;
657 if (opt_index
!= OPT_SPECIAL_unknown
&& opt_index
!= OPT_SPECIAL_ignore
)
659 generate_canonical_option (opt_index
, arg
, value
, decoded
);
660 if (separate_args
> 1)
662 for (i
= 0; i
< separate_args
; i
++)
664 if (argv
[extra_args
+ 1 + i
] == NULL
)
667 decoded
->canonical_option
[1 + i
] = argv
[extra_args
+ 1 + i
];
669 gcc_assert (result
== 1 + i
);
670 decoded
->canonical_option_num_elements
= result
;
673 decoded
->orig_option_with_args_text
= p
= XNEWVEC (char, total_len
);
674 for (i
= 0; i
< result
; i
++)
676 size_t len
= strlen (argv
[i
]);
678 /* Print the empty string verbally. */
685 memcpy (p
, argv
[i
], len
);
696 /* Decode command-line options (ARGC and ARGV being the arguments of
697 main) into an array, setting *DECODED_OPTIONS to a pointer to that
698 array and *DECODED_OPTIONS_COUNT to the number of entries in the
699 array. The first entry in the array is always one for the program
700 name (OPT_SPECIAL_program_name). LANG_MASK indicates the language
701 flags applicable for decoding (including CL_COMMON and CL_TARGET if
702 those options should be considered applicable). Do not produce any
703 diagnostics or set state outside of these variables. */
706 decode_cmdline_options_to_array (unsigned int argc
, const char **argv
,
707 unsigned int lang_mask
,
708 struct cl_decoded_option
**decoded_options
,
709 unsigned int *decoded_options_count
)
712 struct cl_decoded_option
*opt_array
;
713 unsigned int num_decoded_options
;
715 opt_array
= XNEWVEC (struct cl_decoded_option
, argc
);
717 opt_array
[0].opt_index
= OPT_SPECIAL_program_name
;
718 opt_array
[0].warn_message
= NULL
;
719 opt_array
[0].arg
= argv
[0];
720 opt_array
[0].orig_option_with_args_text
= argv
[0];
721 opt_array
[0].canonical_option_num_elements
= 1;
722 opt_array
[0].canonical_option
[0] = argv
[0];
723 opt_array
[0].canonical_option
[1] = NULL
;
724 opt_array
[0].canonical_option
[2] = NULL
;
725 opt_array
[0].canonical_option
[3] = NULL
;
726 opt_array
[0].value
= 1;
727 opt_array
[0].errors
= 0;
728 num_decoded_options
= 1;
730 for (i
= 1; i
< argc
; i
+= n
)
732 const char *opt
= argv
[i
];
734 /* Interpret "-" or a non-switch as a file name. */
735 if (opt
[0] != '-' || opt
[1] == '\0')
737 generate_option_input_file (opt
, &opt_array
[num_decoded_options
]);
738 num_decoded_options
++;
743 n
= decode_cmdline_option (argv
+ i
, lang_mask
,
744 &opt_array
[num_decoded_options
]);
745 num_decoded_options
++;
748 *decoded_options
= opt_array
;
749 *decoded_options_count
= num_decoded_options
;
750 prune_options (decoded_options
, decoded_options_count
);
753 /* Return true if NEXT_OPT_IDX cancels OPT_IDX. Return false if the
754 next one is the same as ORIG_NEXT_OPT_IDX. */
757 cancel_option (int opt_idx
, int next_opt_idx
, int orig_next_opt_idx
)
759 /* An option can be canceled by the same option or an option with
761 if (cl_options
[next_opt_idx
].neg_index
== opt_idx
)
764 if (cl_options
[next_opt_idx
].neg_index
!= orig_next_opt_idx
)
765 return cancel_option (opt_idx
, cl_options
[next_opt_idx
].neg_index
,
771 /* Filter out options canceled by the ones after them. */
774 prune_options (struct cl_decoded_option
**decoded_options
,
775 unsigned int *decoded_options_count
)
777 unsigned int old_decoded_options_count
= *decoded_options_count
;
778 struct cl_decoded_option
*old_decoded_options
= *decoded_options
;
779 unsigned int new_decoded_options_count
;
780 struct cl_decoded_option
*new_decoded_options
781 = XNEWVEC (struct cl_decoded_option
, old_decoded_options_count
);
783 const struct cl_option
*option
;
785 /* Remove arguments which are negated by others after them. */
786 new_decoded_options_count
= 0;
787 for (i
= 0; i
< old_decoded_options_count
; i
++)
789 unsigned int j
, opt_idx
, next_opt_idx
;
791 if (old_decoded_options
[i
].errors
& ~CL_ERR_WRONG_LANG
)
794 opt_idx
= old_decoded_options
[i
].opt_index
;
797 case OPT_SPECIAL_unknown
:
798 case OPT_SPECIAL_ignore
:
799 case OPT_SPECIAL_program_name
:
800 case OPT_SPECIAL_input_file
:
804 gcc_assert (opt_idx
< cl_options_count
);
805 option
= &cl_options
[opt_idx
];
806 if (option
->neg_index
< 0)
809 /* Skip joined switches. */
810 if ((option
->flags
& CL_JOINED
))
813 for (j
= i
+ 1; j
< old_decoded_options_count
; j
++)
815 if (old_decoded_options
[j
].errors
& ~CL_ERR_WRONG_LANG
)
817 next_opt_idx
= old_decoded_options
[j
].opt_index
;
818 if (next_opt_idx
>= cl_options_count
)
820 if (cl_options
[next_opt_idx
].neg_index
< 0)
822 if ((cl_options
[next_opt_idx
].flags
& CL_JOINED
))
824 if (cancel_option (opt_idx
, next_opt_idx
, next_opt_idx
))
827 if (j
== old_decoded_options_count
)
830 new_decoded_options
[new_decoded_options_count
]
831 = old_decoded_options
[i
];
832 new_decoded_options_count
++;
838 free (old_decoded_options
);
839 new_decoded_options
= XRESIZEVEC (struct cl_decoded_option
,
841 new_decoded_options_count
);
842 *decoded_options
= new_decoded_options
;
843 *decoded_options_count
= new_decoded_options_count
;
846 /* Handle option DECODED for the language indicated by LANG_MASK,
847 using the handlers in HANDLERS and setting fields in OPTS and
848 OPTS_SET. KIND is the diagnostic_t if this is a diagnostics
849 option, DK_UNSPECIFIED otherwise, and LOC is the location of the
850 option for options from the source file, UNKNOWN_LOCATION
851 otherwise. GENERATED_P is true for an option generated as part of
852 processing another option or otherwise generated internally, false
853 for one explicitly passed by the user. Returns false if the switch
854 was invalid. DC is the diagnostic context for options affecting
855 diagnostics state, or NULL. */
858 handle_option (struct gcc_options
*opts
,
859 struct gcc_options
*opts_set
,
860 const struct cl_decoded_option
*decoded
,
861 unsigned int lang_mask
, int kind
, location_t loc
,
862 const struct cl_option_handlers
*handlers
,
863 bool generated_p
, diagnostic_context
*dc
)
865 size_t opt_index
= decoded
->opt_index
;
866 const char *arg
= decoded
->arg
;
867 int value
= decoded
->value
;
868 const struct cl_option
*option
= &cl_options
[opt_index
];
869 void *flag_var
= option_flag_var (opt_index
, opts
);
873 set_option (opts
, (generated_p
? NULL
: opts_set
),
874 opt_index
, value
, arg
, kind
, loc
, dc
);
876 for (i
= 0; i
< handlers
->num_handlers
; i
++)
877 if (option
->flags
& handlers
->handlers
[i
].mask
)
879 if (!handlers
->handlers
[i
].handler (opts
, opts_set
, decoded
,
880 lang_mask
, kind
, loc
,
888 /* Like handle_option, but OPT_INDEX, ARG and VALUE describe the
889 option instead of DECODED. This is used for callbacks when one
890 option implies another instead of an option being decoded from the
894 handle_generated_option (struct gcc_options
*opts
,
895 struct gcc_options
*opts_set
,
896 size_t opt_index
, const char *arg
, int value
,
897 unsigned int lang_mask
, int kind
, location_t loc
,
898 const struct cl_option_handlers
*handlers
,
899 diagnostic_context
*dc
)
901 struct cl_decoded_option decoded
;
903 generate_option (opt_index
, arg
, value
, lang_mask
, &decoded
);
904 return handle_option (opts
, opts_set
, &decoded
, lang_mask
, kind
, loc
,
908 /* Fill in *DECODED with an option described by OPT_INDEX, ARG and
909 VALUE for a front end using LANG_MASK. This is used when the
910 compiler generates options internally. */
913 generate_option (size_t opt_index
, const char *arg
, int value
,
914 unsigned int lang_mask
, struct cl_decoded_option
*decoded
)
916 const struct cl_option
*option
= &cl_options
[opt_index
];
918 decoded
->opt_index
= opt_index
;
919 decoded
->warn_message
= NULL
;
921 decoded
->value
= value
;
922 decoded
->errors
= (option_ok_for_language (option
, lang_mask
)
924 : CL_ERR_WRONG_LANG
);
926 generate_canonical_option (opt_index
, arg
, value
, decoded
);
927 switch (decoded
->canonical_option_num_elements
)
930 decoded
->orig_option_with_args_text
= decoded
->canonical_option
[0];
934 decoded
->orig_option_with_args_text
935 = concat (decoded
->canonical_option
[0], " ",
936 decoded
->canonical_option
[1], NULL
);
944 /* Fill in *DECODED with an option for input file FILE. */
947 generate_option_input_file (const char *file
,
948 struct cl_decoded_option
*decoded
)
950 decoded
->opt_index
= OPT_SPECIAL_input_file
;
951 decoded
->warn_message
= NULL
;
953 decoded
->orig_option_with_args_text
= file
;
954 decoded
->canonical_option_num_elements
= 1;
955 decoded
->canonical_option
[0] = file
;
956 decoded
->canonical_option
[1] = NULL
;
957 decoded
->canonical_option
[2] = NULL
;
958 decoded
->canonical_option
[3] = NULL
;
963 /* Handle the switch DECODED (location LOC) for the language indicated
964 by LANG_MASK, using the handlers in *HANDLERS and setting fields in
965 OPTS and OPTS_SET and using diagnostic context DC (if not NULL) for
966 diagnostic options. */
969 read_cmdline_option (struct gcc_options
*opts
,
970 struct gcc_options
*opts_set
,
971 struct cl_decoded_option
*decoded
,
973 unsigned int lang_mask
,
974 const struct cl_option_handlers
*handlers
,
975 diagnostic_context
*dc
)
977 const struct cl_option
*option
;
978 const char *opt
= decoded
->orig_option_with_args_text
;
980 if (decoded
->warn_message
)
981 warning_at (loc
, 0, decoded
->warn_message
, opt
);
983 if (decoded
->opt_index
== OPT_SPECIAL_unknown
)
985 if (handlers
->unknown_option_callback (decoded
))
986 error_at (loc
, "unrecognized command line option %qs", decoded
->arg
);
990 if (decoded
->opt_index
== OPT_SPECIAL_ignore
)
993 option
= &cl_options
[decoded
->opt_index
];
995 if (decoded
->errors
& CL_ERR_DISABLED
)
997 error_at (loc
, "command line option %qs"
998 " is not supported by this configuration", opt
);
1002 if (decoded
->errors
& CL_ERR_MISSING_ARG
)
1004 if (option
->missing_argument_error
)
1005 error_at (loc
, option
->missing_argument_error
, opt
);
1007 error_at (loc
, "missing argument to %qs", opt
);
1011 if (decoded
->errors
& CL_ERR_UINT_ARG
)
1013 error_at (loc
, "argument to %qs should be a non-negative integer",
1018 if (decoded
->errors
& CL_ERR_ENUM_ARG
)
1020 const struct cl_enum
*e
= &cl_enums
[option
->var_enum
];
1025 if (e
->unknown_error
)
1026 error_at (loc
, e
->unknown_error
, decoded
->arg
);
1028 error_at (loc
, "unrecognized argument in option %qs", opt
);
1031 for (i
= 0; e
->values
[i
].arg
!= NULL
; i
++)
1032 len
+= strlen (e
->values
[i
].arg
) + 1;
1034 s
= XALLOCAVEC (char, len
);
1036 for (i
= 0; e
->values
[i
].arg
!= NULL
; i
++)
1038 size_t arglen
= strlen (e
->values
[i
].arg
);
1039 memcpy (p
, e
->values
[i
].arg
, arglen
);
1044 inform (loc
, "valid arguments to %qs are: %s", option
->opt_text
, s
);
1048 if (decoded
->errors
& CL_ERR_WRONG_LANG
)
1050 handlers
->wrong_lang_callback (decoded
, lang_mask
);
1054 gcc_assert (!decoded
->errors
);
1056 if (!handle_option (opts
, opts_set
, decoded
, lang_mask
, DK_UNSPECIFIED
,
1057 loc
, handlers
, false, dc
))
1058 error_at (loc
, "unrecognized command line option %qs", opt
);
1061 /* Set any field in OPTS, and OPTS_SET if not NULL, for option
1062 OPT_INDEX according to VALUE and ARG, diagnostic kind KIND,
1063 location LOC, using diagnostic context DC if not NULL for
1064 diagnostic classification. */
1067 set_option (struct gcc_options
*opts
, struct gcc_options
*opts_set
,
1068 int opt_index
, int value
, const char *arg
, int kind
,
1069 location_t loc
, diagnostic_context
*dc
)
1071 const struct cl_option
*option
= &cl_options
[opt_index
];
1072 void *flag_var
= option_flag_var (opt_index
, opts
);
1073 void *set_flag_var
= NULL
;
1078 if (opts_set
!= NULL
)
1079 set_flag_var
= option_flag_var (opt_index
, opts_set
);
1081 switch (option
->var_type
)
1084 *(int *) flag_var
= value
;
1086 *(int *) set_flag_var
= 1;
1090 if (option
->cl_host_wide_int
)
1091 *(HOST_WIDE_INT
*) flag_var
= (value
1093 : !option
->var_value
);
1095 *(int *) flag_var
= (value
1097 : !option
->var_value
);
1099 *(int *) set_flag_var
= 1;
1102 case CLVC_BIT_CLEAR
:
1104 if ((value
!= 0) == (option
->var_type
== CLVC_BIT_SET
))
1106 if (option
->cl_host_wide_int
)
1107 *(HOST_WIDE_INT
*) flag_var
|= option
->var_value
;
1109 *(int *) flag_var
|= option
->var_value
;
1113 if (option
->cl_host_wide_int
)
1114 *(HOST_WIDE_INT
*) flag_var
&= ~option
->var_value
;
1116 *(int *) flag_var
&= ~option
->var_value
;
1120 if (option
->cl_host_wide_int
)
1121 *(HOST_WIDE_INT
*) set_flag_var
|= option
->var_value
;
1123 *(int *) set_flag_var
|= option
->var_value
;
1128 *(const char **) flag_var
= arg
;
1130 *(const char **) set_flag_var
= "";
1135 const struct cl_enum
*e
= &cl_enums
[option
->var_enum
];
1137 e
->set (flag_var
, value
);
1139 e
->set (set_flag_var
, 1);
1145 vec
<cl_deferred_option
> *v
1146 = (vec
<cl_deferred_option
> *) *(void **) flag_var
;
1147 cl_deferred_option p
= {opt_index
, arg
, value
};
1149 v
= XCNEW (vec
<cl_deferred_option
>);
1151 *(void **) flag_var
= v
;
1153 *(void **) set_flag_var
= v
;
1158 if ((diagnostic_t
) kind
!= DK_UNSPECIFIED
1160 diagnostic_classify_diagnostic (dc
, opt_index
, (diagnostic_t
) kind
, loc
);
1163 /* Return the address of the flag variable for option OPT_INDEX in
1164 options structure OPTS, or NULL if there is no flag variable. */
1167 option_flag_var (int opt_index
, struct gcc_options
*opts
)
1169 const struct cl_option
*option
= &cl_options
[opt_index
];
1171 if (option
->flag_var_offset
== (unsigned short) -1)
1173 return (void *)(((char *) opts
) + option
->flag_var_offset
);
1176 /* Return 1 if option OPT_IDX is enabled in OPTS, 0 if it is disabled,
1177 or -1 if it isn't a simple on-off switch. */
1180 option_enabled (int opt_idx
, void *opts
)
1182 const struct cl_option
*option
= &(cl_options
[opt_idx
]);
1183 struct gcc_options
*optsg
= (struct gcc_options
*) opts
;
1184 void *flag_var
= option_flag_var (opt_idx
, optsg
);
1187 switch (option
->var_type
)
1190 return *(int *) flag_var
!= 0;
1193 if (option
->cl_host_wide_int
)
1194 return *(HOST_WIDE_INT
*) flag_var
== option
->var_value
;
1196 return *(int *) flag_var
== option
->var_value
;
1198 case CLVC_BIT_CLEAR
:
1199 if (option
->cl_host_wide_int
)
1200 return (*(HOST_WIDE_INT
*) flag_var
& option
->var_value
) == 0;
1202 return (*(int *) flag_var
& option
->var_value
) == 0;
1205 if (option
->cl_host_wide_int
)
1206 return (*(HOST_WIDE_INT
*) flag_var
& option
->var_value
) != 0;
1208 return (*(int *) flag_var
& option
->var_value
) != 0;
1218 /* Fill STATE with the current state of option OPTION in OPTS. Return
1219 true if there is some state to store. */
1222 get_option_state (struct gcc_options
*opts
, int option
,
1223 struct cl_option_state
*state
)
1225 void *flag_var
= option_flag_var (option
, opts
);
1230 switch (cl_options
[option
].var_type
)
1234 state
->data
= flag_var
;
1235 state
->size
= (cl_options
[option
].cl_host_wide_int
1236 ? sizeof (HOST_WIDE_INT
)
1240 case CLVC_BIT_CLEAR
:
1242 state
->ch
= option_enabled (option
, opts
);
1243 state
->data
= &state
->ch
;
1248 state
->data
= *(const char **) flag_var
;
1249 if (state
->data
== 0)
1251 state
->size
= strlen ((const char *) state
->data
) + 1;
1255 state
->data
= flag_var
;
1256 state
->size
= cl_enums
[cl_options
[option
].var_enum
].var_size
;
1265 /* Set a warning option OPT_INDEX (language mask LANG_MASK, option
1266 handlers HANDLERS) to have diagnostic kind KIND for option
1267 structures OPTS and OPTS_SET and diagnostic context DC (possibly
1268 NULL), at location LOC (UNKNOWN_LOCATION for -Werror=). If IMPLY,
1269 the warning option in question is implied at this point. This is
1270 used by -Werror= and #pragma GCC diagnostic. */
1273 control_warning_option (unsigned int opt_index
, int kind
, bool imply
,
1274 location_t loc
, unsigned int lang_mask
,
1275 const struct cl_option_handlers
*handlers
,
1276 struct gcc_options
*opts
,
1277 struct gcc_options
*opts_set
,
1278 diagnostic_context
*dc
)
1280 if (cl_options
[opt_index
].alias_target
!= N_OPTS
)
1281 opt_index
= cl_options
[opt_index
].alias_target
;
1282 if (opt_index
== OPT_SPECIAL_ignore
)
1285 diagnostic_classify_diagnostic (dc
, opt_index
, (diagnostic_t
) kind
, loc
);
1288 /* -Werror=foo implies -Wfoo. */
1289 if (cl_options
[opt_index
].var_type
== CLVC_BOOLEAN
)
1290 handle_generated_option (opts
, opts_set
,
1291 opt_index
, NULL
, 1, lang_mask
,
1292 kind
, loc
, handlers
, dc
);