1 /* Command line option handling.
2 Copyright (C) 2006-2022 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
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/>. */
20 #define INCLUDE_STRING
24 #include "coretypes.h"
27 #include "diagnostic.h"
28 #include "spellcheck.h"
29 #include "opts-jobserver.h"
31 static void prune_options (struct cl_decoded_option
**, unsigned int *);
33 /* An option that is undocumented, that takes a joined argument, and
34 that doesn't fit any of the classes of uses (language/common,
35 driver, target) is assumed to be a prefix used to catch
36 e.g. negated options, and stop them from being further shortened to
37 a prefix that could use the negated option as an argument. For
38 example, we want -gno-statement-frontiers to be taken as a negation
39 of -gstatement-frontiers, but without catching the gno- prefix and
40 signaling it's to be used for option remapping, it would end up
41 backtracked to g with no-statemnet-frontiers as the debug level. */
44 remapping_prefix_p (const struct cl_option
*opt
)
46 return opt
->flags
& CL_UNDOCUMENTED
47 && opt
->flags
& CL_JOINED
48 && !(opt
->flags
& (CL_DRIVER
| CL_TARGET
| CL_COMMON
| CL_LANG_ALL
));
51 /* Perform a binary search to find which option the command-line INPUT
52 matches. Returns its index in the option array, and
53 OPT_SPECIAL_unknown on failure.
55 This routine is quite subtle. A normal binary search is not good
56 enough because some options can be suffixed with an argument, and
57 multiple sub-matches can occur, e.g. input of "-pedantic" matching
58 the initial substring of "-pedantic-errors".
60 A more complicated example is -gstabs. It should match "-g" with
61 an argument of "stabs". Suppose, however, that the number and list
62 of switches are such that the binary search tests "-gen-decls"
63 before having tested "-g". This doesn't match, and as "-gen-decls"
64 is less than "-gstabs", it will become the lower bound of the
65 binary search range, and "-g" will never be seen. To resolve this
66 issue, 'optc-gen.awk' makes "-gen-decls" point, via the back_chain member,
67 to "-g" so that failed searches that end between "-gen-decls" and
68 the lexicographically subsequent switch know to go back and see if
69 "-g" causes a match (which it does in this example).
71 This search is done in such a way that the longest match for the
72 front end in question wins. If there is no match for the current
73 front end, the longest match for a different front end is returned
74 (or N_OPTS if none) and the caller emits an error message. */
76 find_opt (const char *input
, unsigned int lang_mask
)
78 size_t mn
, mn_orig
, mx
, md
, opt_len
;
79 size_t match_wrong_lang
;
83 mx
= cl_options_count
;
85 /* Find mn such this lexicographical inequality holds:
86 cl_options[mn] <= input < cl_options[mn + 1]. */
90 opt_len
= cl_options
[md
].opt_len
;
91 comp
= strncmp (input
, cl_options
[md
].opt_text
+ 1, opt_len
);
101 /* This is the switch that is the best match but for a different
102 front end, or OPT_SPECIAL_unknown if there is no match at all. */
103 match_wrong_lang
= OPT_SPECIAL_unknown
;
105 /* Backtrace the chain of possible matches, returning the longest
106 one, if any, that fits best. With current GCC switches, this
107 loop executes at most twice. */
110 const struct cl_option
*opt
= &cl_options
[mn
];
112 /* Is the input either an exact match or a prefix that takes a
114 if (!strncmp (input
, opt
->opt_text
+ 1, opt
->opt_len
)
115 && (input
[opt
->opt_len
] == '\0' || (opt
->flags
& CL_JOINED
)))
117 /* If language is OK, return it. */
118 if (opt
->flags
& lang_mask
)
121 if (remapping_prefix_p (opt
))
122 return OPT_SPECIAL_unknown
;
124 /* If we haven't remembered a prior match, remember this
125 one. Any prior match is necessarily better. */
126 if (match_wrong_lang
== OPT_SPECIAL_unknown
)
127 match_wrong_lang
= mn
;
130 /* Try the next possibility. This is cl_options_count if there
132 mn
= opt
->back_chain
;
134 while (mn
!= cl_options_count
);
136 if (match_wrong_lang
== OPT_SPECIAL_unknown
&& input
[0] == '-')
138 /* Long options, starting "--", may be abbreviated if the
139 abbreviation is unambiguous. This only applies to options
140 not taking a joined argument, and abbreviations of "--option"
141 are permitted even if there is a variant "--option=". */
142 size_t mnc
= mn_orig
+ 1;
143 size_t cmp_len
= strlen (input
);
144 while (mnc
< cl_options_count
145 && strncmp (input
, cl_options
[mnc
].opt_text
+ 1, cmp_len
) == 0)
147 /* Option matching this abbreviation. OK if it is the first
148 match and that does not take a joined argument, or the
149 second match, taking a joined argument and with only '='
150 added to the first match; otherwise considered
152 if (mnc
== mn_orig
+ 1
153 && !(cl_options
[mnc
].flags
& CL_JOINED
))
154 match_wrong_lang
= mnc
;
155 else if (mnc
== mn_orig
+ 2
156 && match_wrong_lang
== mn_orig
+ 1
157 && (cl_options
[mnc
].flags
& CL_JOINED
)
158 && (cl_options
[mnc
].opt_len
159 == cl_options
[mn_orig
+ 1].opt_len
+ 1)
160 && strncmp (cl_options
[mnc
].opt_text
+ 1,
161 cl_options
[mn_orig
+ 1].opt_text
+ 1,
162 cl_options
[mn_orig
+ 1].opt_len
) == 0)
163 ; /* OK, as long as there are no more matches. */
165 return OPT_SPECIAL_unknown
;
170 /* Return the best wrong match, or OPT_SPECIAL_unknown if none. */
171 return match_wrong_lang
;
174 /* If ARG is a non-negative decimal or hexadecimal integer representable
175 in HOST_WIDE_INT return its value, otherwise return -1. If ERR is not
176 null set *ERR to zero on success or to EINVAL or to the value of errno
180 integral_argument (const char *arg
, int *err
, bool byte_size_suffix
)
195 unsigned HOST_WIDE_INT unit
= 1;
196 unsigned HOST_WIDE_INT value
= strtoull (arg
, &end
, 10);
198 /* If the value is too large to be represented use the maximum
199 representable value that strtoull sets VALUE to (setting
204 if (!byte_size_suffix
)
207 value
= strtoull (arg
, &end
, 0);
220 /* Numeric option arguments are at most INT_MAX. Make it
221 possible to specify a larger value by accepting common
223 if (!strcmp (end
, "kB"))
225 else if (!strcasecmp (end
, "KiB") || !strcmp (end
, "KB"))
227 else if (!strcmp (end
, "MB"))
228 unit
= HOST_WIDE_INT_UC (1000) * 1000;
229 else if (!strcasecmp (end
, "MiB"))
230 unit
= HOST_WIDE_INT_UC (1024) * 1024;
231 else if (!strcasecmp (end
, "GB"))
232 unit
= HOST_WIDE_INT_UC (1000) * 1000 * 1000;
233 else if (!strcasecmp (end
, "GiB"))
234 unit
= HOST_WIDE_INT_UC (1024) * 1024 * 1024;
235 else if (!strcasecmp (end
, "TB"))
236 unit
= HOST_WIDE_INT_UC (1000) * 1000 * 1000 * 1000;
237 else if (!strcasecmp (end
, "TiB"))
238 unit
= HOST_WIDE_INT_UC (1024) * 1024 * 1024 * 1024;
239 else if (!strcasecmp (end
, "PB"))
240 unit
= HOST_WIDE_INT_UC (1000) * 1000 * 1000 * 1000 * 1000;
241 else if (!strcasecmp (end
, "PiB"))
242 unit
= HOST_WIDE_INT_UC (1024) * 1024 * 1024 * 1024 * 1024;
243 else if (!strcasecmp (end
, "EB"))
244 unit
= HOST_WIDE_INT_UC (1000) * 1000 * 1000 * 1000 * 1000
246 else if (!strcasecmp (end
, "EiB"))
247 unit
= HOST_WIDE_INT_UC (1024) * 1024 * 1024 * 1024 * 1024
251 /* This could mean an unknown suffix or a bad prefix, like
260 unsigned HOST_WIDE_INT prod
= value
* unit
;
261 value
= prod
< value
? HOST_WIDE_INT_M1U
: prod
;
267 /* Return whether OPTION is OK for the language given by
270 option_ok_for_language (const struct cl_option
*option
,
271 unsigned int lang_mask
)
273 if (!(option
->flags
& lang_mask
))
275 else if ((option
->flags
& CL_TARGET
)
276 && (option
->flags
& (CL_LANG_ALL
| CL_DRIVER
))
277 && !(option
->flags
& (lang_mask
& ~CL_COMMON
& ~CL_TARGET
)))
278 /* Complain for target flag language mismatches if any languages
284 /* Return whether ENUM_ARG is OK for the language given by
288 enum_arg_ok_for_language (const struct cl_enum_arg
*enum_arg
,
289 unsigned int lang_mask
)
291 return (lang_mask
& CL_DRIVER
) || !(enum_arg
->flags
& CL_ENUM_DRIVER_ONLY
);
294 /* Look up ARG in ENUM_ARGS for language LANG_MASK, returning the cl_enum_arg
295 index and storing the value in *VALUE if found, and returning -1 without
296 modifying *VALUE if not found. */
299 enum_arg_to_value (const struct cl_enum_arg
*enum_args
,
300 const char *arg
, size_t len
, HOST_WIDE_INT
*value
,
301 unsigned int lang_mask
)
305 for (i
= 0; enum_args
[i
].arg
!= NULL
; i
++)
307 ? (strncmp (arg
, enum_args
[i
].arg
, len
) == 0
308 && enum_args
[i
].arg
[len
] == '\0')
309 : strcmp (arg
, enum_args
[i
].arg
) == 0)
310 && enum_arg_ok_for_language (&enum_args
[i
], lang_mask
))
312 *value
= enum_args
[i
].value
;
319 /* Look up ARG in the enum used by option OPT_INDEX for language
320 LANG_MASK, returning true and storing the value in *VALUE if found,
321 and returning false without modifying *VALUE if not found. */
324 opt_enum_arg_to_value (size_t opt_index
, const char *arg
,
325 int *value
, unsigned int lang_mask
)
327 const struct cl_option
*option
= &cl_options
[opt_index
];
329 gcc_assert (option
->var_type
== CLVC_ENUM
);
331 HOST_WIDE_INT wideval
;
332 if (enum_arg_to_value (cl_enums
[option
->var_enum
].values
, arg
, 0,
333 &wideval
, lang_mask
) >= 0)
342 /* Look of VALUE in ENUM_ARGS for language LANG_MASK and store the
343 corresponding string in *ARGP, returning true if the found string
344 was marked as canonical, false otherwise. If VALUE is not found
345 (which may be the case for uninitialized values if the relevant
346 option has not been passed), set *ARGP to NULL and return
350 enum_value_to_arg (const struct cl_enum_arg
*enum_args
,
351 const char **argp
, int value
, unsigned int lang_mask
)
355 for (i
= 0; enum_args
[i
].arg
!= NULL
; i
++)
356 if (enum_args
[i
].value
== value
357 && (enum_args
[i
].flags
& CL_ENUM_CANONICAL
)
358 && enum_arg_ok_for_language (&enum_args
[i
], lang_mask
))
360 *argp
= enum_args
[i
].arg
;
364 for (i
= 0; enum_args
[i
].arg
!= NULL
; i
++)
365 if (enum_args
[i
].value
== value
366 && enum_arg_ok_for_language (&enum_args
[i
], lang_mask
))
368 *argp
= enum_args
[i
].arg
;
376 /* Fill in the canonical option part of *DECODED with an option
377 described by OPT_INDEX, ARG and VALUE. */
380 generate_canonical_option (size_t opt_index
, const char *arg
,
382 struct cl_decoded_option
*decoded
)
384 const struct cl_option
*option
= &cl_options
[opt_index
];
385 const char *opt_text
= option
->opt_text
;
388 && !option
->cl_reject_negative
389 && (opt_text
[1] == 'W' || opt_text
[1] == 'f'
390 || opt_text
[1] == 'g' || opt_text
[1] == 'm'))
392 char *t
= XOBNEWVEC (&opts_obstack
, char, option
->opt_len
+ 5);
398 memcpy (t
+ 5, opt_text
+ 2, option
->opt_len
);
402 decoded
->canonical_option
[2] = NULL
;
403 decoded
->canonical_option
[3] = NULL
;
407 if ((option
->flags
& CL_SEPARATE
)
408 && !option
->cl_separate_alias
)
410 decoded
->canonical_option
[0] = opt_text
;
411 decoded
->canonical_option
[1] = arg
;
412 decoded
->canonical_option_num_elements
= 2;
416 gcc_assert (option
->flags
& CL_JOINED
);
417 decoded
->canonical_option
[0] = opts_concat (opt_text
, arg
, NULL
);
418 decoded
->canonical_option
[1] = NULL
;
419 decoded
->canonical_option_num_elements
= 1;
424 decoded
->canonical_option
[0] = opt_text
;
425 decoded
->canonical_option
[1] = NULL
;
426 decoded
->canonical_option_num_elements
= 1;
430 /* Structure describing mappings from options on the command line to
431 options to look up with find_opt. */
434 /* Prefix of the option on the command line. */
436 /* If two argv elements are considered to be merged into one option,
437 prefix for the second element, otherwise NULL. */
439 /* The new prefix to map to. */
440 const char *new_prefix
;
441 /* Whether at least one character is needed following opt1 or opt0
442 for this mapping to be used. (--optimize= is valid for -O, but
443 --warn- is not valid for -W.) */
444 bool another_char_needed
;
445 /* Whether the original option is a negated form of the option
446 resulting from this map. */
449 static const struct option_map option_map
[] =
451 { "-Wno-", NULL
, "-W", false, true },
452 { "-fno-", NULL
, "-f", false, true },
453 { "-gno-", NULL
, "-g", false, true },
454 { "-mno-", NULL
, "-m", false, true },
455 { "--debug=", NULL
, "-g", false, false },
456 { "--machine-", NULL
, "-m", true, false },
457 { "--machine-no-", NULL
, "-m", false, true },
458 { "--machine=", NULL
, "-m", false, false },
459 { "--machine=no-", NULL
, "-m", false, true },
460 { "--machine", "", "-m", false, false },
461 { "--machine", "no-", "-m", false, true },
462 { "--optimize=", NULL
, "-O", false, false },
463 { "--std=", NULL
, "-std=", false, false },
464 { "--std", "", "-std=", false, false },
465 { "--warn-", NULL
, "-W", true, false },
466 { "--warn-no-", NULL
, "-W", false, true },
467 { "--", NULL
, "-f", true, false },
468 { "--no-", NULL
, "-f", false, true }
471 /* Helper function for gcc.cc's driver::suggest_option, for populating the
472 vec of suggestions for misspelled options.
474 option_map above provides various prefixes for spelling command-line
475 options, which decode_cmdline_option uses to map spellings of options
476 to specific options. We want to do the reverse: to find all the ways
477 that a user could validly spell an option.
479 Given valid OPT_TEXT (with a leading dash) for OPTION, add it and all
480 of its valid variant spellings to CANDIDATES, each without a leading
483 For example, given "-Wabi-tag", the following are added to CANDIDATES:
489 The added strings must be freed using free. */
492 add_misspelling_candidates (auto_vec
<char *> *candidates
,
493 const struct cl_option
*option
,
494 const char *opt_text
)
496 gcc_assert (candidates
);
498 gcc_assert (opt_text
);
499 if (remapping_prefix_p (option
))
501 candidates
->safe_push (xstrdup (opt_text
+ 1));
502 for (unsigned i
= 0; i
< ARRAY_SIZE (option_map
); i
++)
504 const char *opt0
= option_map
[i
].opt0
;
505 const char *new_prefix
= option_map
[i
].new_prefix
;
506 size_t new_prefix_len
= strlen (new_prefix
);
508 if (option
->cl_reject_negative
&& option_map
[i
].negated
)
511 if (strncmp (opt_text
, new_prefix
, new_prefix_len
) == 0)
513 char *alternative
= concat (opt0
+ 1, opt_text
+ new_prefix_len
,
515 candidates
->safe_push (alternative
);
519 /* For all params (e.g. --param=key=value),
520 include also '--param key=value'. */
521 const char *prefix
= "--param=";
522 if (strstr (opt_text
, prefix
) == opt_text
)
524 char *param
= xstrdup (opt_text
+ 1);
525 gcc_assert (param
[6] == '=');
527 candidates
->safe_push (param
);
531 /* Decode the switch beginning at ARGV for the language indicated by
532 LANG_MASK (including CL_COMMON and CL_TARGET if applicable), into
533 the structure *DECODED. Returns the number of switches
537 decode_cmdline_option (const char *const *argv
, unsigned int lang_mask
,
538 struct cl_decoded_option
*decoded
)
542 HOST_WIDE_INT value
= 1, mask
= 0;
543 unsigned int result
= 1, i
, extra_args
, separate_args
= 0;
547 const struct cl_option
*option
;
549 const char *warn_message
= NULL
;
550 bool separate_arg_flag
;
551 bool joined_arg_flag
;
552 bool have_separate_arg
= false;
556 const char *opt_value
= argv
[0] + 1;
557 opt_index
= find_opt (opt_value
, lang_mask
);
559 while (opt_index
== OPT_SPECIAL_unknown
560 && i
< ARRAY_SIZE (option_map
))
562 const char *opt0
= option_map
[i
].opt0
;
563 const char *opt1
= option_map
[i
].opt1
;
564 const char *new_prefix
= option_map
[i
].new_prefix
;
565 bool another_char_needed
= option_map
[i
].another_char_needed
;
566 size_t opt0_len
= strlen (opt0
);
567 size_t opt1_len
= (opt1
== NULL
? 0 : strlen (opt1
));
568 size_t optn_len
= (opt1
== NULL
? opt0_len
: opt1_len
);
569 size_t new_prefix_len
= strlen (new_prefix
);
571 extra_args
= (opt1
== NULL
? 0 : 1);
572 value
= !option_map
[i
].negated
;
574 if (strncmp (argv
[0], opt0
, opt0_len
) == 0
576 || (argv
[1] != NULL
&& strncmp (argv
[1], opt1
, opt1_len
) == 0))
577 && (!another_char_needed
578 || argv
[extra_args
][optn_len
] != 0))
580 size_t arglen
= strlen (argv
[extra_args
]);
583 adjust_len
= (int) optn_len
- (int) new_prefix_len
;
584 dup
= XNEWVEC (char, arglen
+ 1 - adjust_len
);
585 memcpy (dup
, new_prefix
, new_prefix_len
);
586 memcpy (dup
+ new_prefix_len
, argv
[extra_args
] + optn_len
,
587 arglen
- optn_len
+ 1);
588 opt_index
= find_opt (dup
+ 1, lang_mask
);
594 if (opt_index
== OPT_SPECIAL_unknown
)
602 option
= &cl_options
[opt_index
];
604 /* Reject negative form of switches that don't take negatives as
606 if (!value
&& option
->cl_reject_negative
)
608 opt_index
= OPT_SPECIAL_unknown
;
609 errors
|= CL_ERR_NEGATIVE
;
614 /* Clear the initial value for size options (it will be overwritten
615 later based on the Init(value) specification in the opt file. */
616 if (option
->var_type
== CLVC_SIZE
)
619 result
= extra_args
+ 1;
620 warn_message
= option
->warn_message
;
622 /* Check to see if the option is disabled for this configuration. */
623 if (option
->cl_disabled
)
624 errors
|= CL_ERR_DISABLED
;
626 /* Determine whether there may be a separate argument based on
627 whether this option is being processed for the driver, and, if
628 so, how many such arguments. */
629 separate_arg_flag
= ((option
->flags
& CL_SEPARATE
)
630 && !(option
->cl_no_driver_arg
631 && (lang_mask
& CL_DRIVER
)));
632 separate_args
= (separate_arg_flag
633 ? option
->cl_separate_nargs
+ 1
635 joined_arg_flag
= (option
->flags
& CL_JOINED
) != 0;
637 /* Sort out any argument the switch takes. */
640 /* Have arg point to the original switch. This is because
641 some code, such as disable_builtin_function, expects its
642 argument to be persistent until the program exits. */
643 arg
= argv
[extra_args
] + cl_options
[opt_index
].opt_len
+ 1 + adjust_len
;
645 if (*arg
== '\0' && !option
->cl_missing_ok
)
647 if (separate_arg_flag
)
649 arg
= argv
[extra_args
+ 1];
650 result
= extra_args
+ 2;
652 result
= extra_args
+ 1;
654 have_separate_arg
= true;
657 /* Missing argument. */
661 else if (separate_arg_flag
)
663 arg
= argv
[extra_args
+ 1];
664 for (i
= 0; i
< separate_args
; i
++)
665 if (argv
[extra_args
+ 1 + i
] == NULL
)
667 errors
|= CL_ERR_MISSING_ARG
;
670 result
= extra_args
+ 1 + i
;
672 have_separate_arg
= true;
675 if (arg
== NULL
&& (separate_arg_flag
|| joined_arg_flag
))
676 errors
|= CL_ERR_MISSING_ARG
;
678 /* Is this option an alias (or an ignored option, marked as an alias
679 of OPT_SPECIAL_ignore)? */
680 if (option
->alias_target
!= N_OPTS
681 && (!option
->cl_separate_alias
|| have_separate_arg
))
683 size_t new_opt_index
= option
->alias_target
;
685 if (new_opt_index
== OPT_SPECIAL_ignore
686 || new_opt_index
== OPT_SPECIAL_warn_removed
)
688 gcc_assert (option
->alias_arg
== NULL
);
689 gcc_assert (option
->neg_alias_arg
== NULL
);
690 opt_index
= new_opt_index
;
695 const struct cl_option
*new_option
= &cl_options
[new_opt_index
];
697 /* The new option must not be an alias itself. */
698 gcc_assert (new_option
->alias_target
== N_OPTS
699 || new_option
->cl_separate_alias
);
701 if (option
->neg_alias_arg
)
703 gcc_assert (option
->alias_arg
!= NULL
);
704 gcc_assert (arg
== NULL
);
705 gcc_assert (!option
->cl_negative_alias
);
707 arg
= option
->alias_arg
;
709 arg
= option
->neg_alias_arg
;
712 else if (option
->alias_arg
)
714 gcc_assert (value
== 1);
715 gcc_assert (arg
== NULL
);
716 gcc_assert (!option
->cl_negative_alias
);
717 arg
= option
->alias_arg
;
720 if (option
->cl_negative_alias
)
723 opt_index
= new_opt_index
;
727 gcc_assert (!option
->cl_reject_negative
);
729 /* Recompute what arguments are allowed. */
730 separate_arg_flag
= ((option
->flags
& CL_SEPARATE
)
731 && !(option
->cl_no_driver_arg
732 && (lang_mask
& CL_DRIVER
)));
733 joined_arg_flag
= (option
->flags
& CL_JOINED
) != 0;
735 if (separate_args
> 1 || option
->cl_separate_nargs
)
736 gcc_assert (separate_args
737 == (unsigned int) option
->cl_separate_nargs
+ 1);
739 if (!(errors
& CL_ERR_MISSING_ARG
))
741 if (separate_arg_flag
|| joined_arg_flag
)
743 if (option
->cl_missing_ok
&& arg
== NULL
)
745 gcc_assert (arg
!= NULL
);
748 gcc_assert (arg
== NULL
);
751 /* Recheck for warnings and disabled options. */
752 if (option
->warn_message
)
754 gcc_assert (warn_message
== NULL
);
755 warn_message
= option
->warn_message
;
757 if (option
->cl_disabled
)
758 errors
|= CL_ERR_DISABLED
;
762 /* Check if this is a switch for a different front end. */
763 if (!option_ok_for_language (option
, lang_mask
))
764 errors
|= CL_ERR_WRONG_LANG
;
765 else if (strcmp (option
->opt_text
, "-Werror=") == 0
766 && strchr (opt_value
, ',') == NULL
)
768 /* Verify that -Werror argument is a valid warning
770 char *werror_arg
= xstrdup (opt_value
+ 6);
773 size_t warning_index
= find_opt (werror_arg
, lang_mask
);
775 if (warning_index
!= OPT_SPECIAL_unknown
)
777 const struct cl_option
*warning_option
778 = &cl_options
[warning_index
];
779 if (!option_ok_for_language (warning_option
, lang_mask
))
780 errors
|= CL_ERR_WRONG_LANG
;
784 /* Convert the argument to lowercase if appropriate. */
785 if (arg
&& option
->cl_tolower
)
788 size_t len
= strlen (arg
);
789 char *arg_lower
= XOBNEWVEC (&opts_obstack
, char, len
+ 1);
791 for (j
= 0; j
< len
; j
++)
792 arg_lower
[j
] = TOLOWER ((unsigned char) arg
[j
]);
797 /* If the switch takes an integer argument, convert it. */
798 if (arg
&& (option
->cl_uinteger
|| option
->cl_host_wide_int
))
801 value
= *arg
? integral_argument (arg
, &error
, option
->cl_byte_size
) : 0;
803 errors
|= CL_ERR_UINT_ARG
;
805 /* Reject value out of a range. */
806 if (option
->range_max
!= -1
807 && (value
< option
->range_min
|| value
> option
->range_max
))
808 errors
|= CL_ERR_INT_RANGE_ARG
;
811 /* If the switch takes an enumerated argument, convert it. */
812 if (arg
&& (option
->var_type
== CLVC_ENUM
))
814 const struct cl_enum
*e
= &cl_enums
[option
->var_enum
];
816 gcc_assert (option
->var_value
!= CLEV_NORMAL
|| value
== 1);
817 if (option
->var_value
!= CLEV_NORMAL
)
820 HOST_WIDE_INT sum_value
= 0;
821 unsigned HOST_WIDE_INT used_sets
= 0;
824 const char *q
= strchr (p
, ',');
825 HOST_WIDE_INT this_value
= 0;
828 errors
|= CL_ERR_ENUM_SET_ARG
;
831 int idx
= enum_arg_to_value (e
->values
, p
, q
? q
- p
: 0,
832 &this_value
, lang_mask
);
835 errors
|= CL_ERR_ENUM_SET_ARG
;
839 HOST_WIDE_INT this_mask
= 0;
840 if (option
->var_value
== CLEV_SET
)
842 unsigned set
= e
->values
[idx
].flags
>> CL_ENUM_SET_SHIFT
;
843 gcc_checking_assert (set
>= 1
844 && set
<= HOST_BITS_PER_WIDE_INT
);
845 if ((used_sets
& (HOST_WIDE_INT_1U
<< (set
- 1))) != 0)
847 errors
|= CL_ERR_ENUM_SET_ARG
;
850 used_sets
|= HOST_WIDE_INT_1U
<< (set
- 1);
852 for (int i
= 0; e
->values
[i
].arg
!= NULL
; i
++)
853 if (set
== (e
->values
[i
].flags
>> CL_ENUM_SET_SHIFT
))
854 this_mask
|= e
->values
[i
].value
;
858 gcc_assert (option
->var_value
== CLEV_BITSET
859 && ((e
->values
[idx
].flags
>> CL_ENUM_SET_SHIFT
)
861 this_mask
= this_value
;
864 sum_value
|= this_value
;
874 gcc_checking_assert (value
== 0);
876 else if (enum_arg_to_value (e
->values
, arg
, 0, &value
, lang_mask
) >= 0)
878 const char *carg
= NULL
;
880 if (enum_value_to_arg (e
->values
, &carg
, value
, lang_mask
))
882 gcc_assert (carg
!= NULL
);
885 errors
|= CL_ERR_ENUM_ARG
;
889 decoded
->opt_index
= opt_index
;
891 decoded
->value
= value
;
892 decoded
->mask
= mask
;
893 decoded
->errors
= errors
;
894 decoded
->warn_message
= warn_message
;
896 if (opt_index
== OPT_SPECIAL_unknown
)
897 gcc_assert (result
== 1);
899 gcc_assert (result
>= 1 && result
<= ARRAY_SIZE (decoded
->canonical_option
));
900 decoded
->canonical_option_num_elements
= result
;
902 for (i
= 0; i
< ARRAY_SIZE (decoded
->canonical_option
); i
++)
907 if (opt_index
== OPT_SPECIAL_unknown
)
908 decoded
->canonical_option
[i
] = argv
[i
];
910 decoded
->canonical_option
[i
] = NULL
;
911 len
= strlen (argv
[i
]);
912 /* If the argument is an empty string, we will print it as "" in
913 orig_option_with_args_text. */
914 total_len
+= (len
!= 0 ? len
: 2) + 1;
917 decoded
->canonical_option
[i
] = NULL
;
919 if (opt_index
!= OPT_SPECIAL_unknown
&& opt_index
!= OPT_SPECIAL_ignore
920 && opt_index
!= OPT_SPECIAL_warn_removed
)
922 generate_canonical_option (opt_index
, arg
, value
, decoded
);
923 if (separate_args
> 1)
925 for (i
= 0; i
< separate_args
; i
++)
927 if (argv
[extra_args
+ 1 + i
] == NULL
)
930 decoded
->canonical_option
[1 + i
] = argv
[extra_args
+ 1 + i
];
932 gcc_assert (result
== 1 + i
);
933 decoded
->canonical_option_num_elements
= result
;
936 decoded
->orig_option_with_args_text
937 = p
= XOBNEWVEC (&opts_obstack
, char, total_len
);
938 for (i
= 0; i
< result
; i
++)
940 size_t len
= strlen (argv
[i
]);
942 /* Print the empty string verbally. */
949 memcpy (p
, argv
[i
], len
);
960 /* Obstack for option strings. */
962 struct obstack opts_obstack
;
964 /* Like libiberty concat, but allocate using opts_obstack. */
967 opts_concat (const char *first
, ...)
974 /* First compute the size of the result and get sufficient memory. */
975 va_start (ap
, first
);
976 for (arg
= first
; arg
; arg
= va_arg (ap
, const char *))
977 length
+= strlen (arg
);
978 newstr
= XOBNEWVEC (&opts_obstack
, char, length
+ 1);
981 /* Now copy the individual pieces to the result string. */
982 va_start (ap
, first
);
983 for (arg
= first
, end
= newstr
; arg
; arg
= va_arg (ap
, const char *))
985 length
= strlen (arg
);
986 memcpy (end
, arg
, length
);
994 /* Decode command-line options (ARGC and ARGV being the arguments of
995 main) into an array, setting *DECODED_OPTIONS to a pointer to that
996 array and *DECODED_OPTIONS_COUNT to the number of entries in the
997 array. The first entry in the array is always one for the program
998 name (OPT_SPECIAL_program_name). LANG_MASK indicates the language
999 flags applicable for decoding (including CL_COMMON and CL_TARGET if
1000 those options should be considered applicable). Do not produce any
1001 diagnostics or set state outside of these variables. */
1004 decode_cmdline_options_to_array (unsigned int argc
, const char **argv
,
1005 unsigned int lang_mask
,
1006 struct cl_decoded_option
**decoded_options
,
1007 unsigned int *decoded_options_count
)
1010 struct cl_decoded_option
*opt_array
;
1011 unsigned int num_decoded_options
;
1013 int opt_array_len
= argc
;
1014 opt_array
= XNEWVEC (struct cl_decoded_option
, opt_array_len
);
1016 opt_array
[0].opt_index
= OPT_SPECIAL_program_name
;
1017 opt_array
[0].warn_message
= NULL
;
1018 opt_array
[0].arg
= argv
[0];
1019 opt_array
[0].orig_option_with_args_text
= argv
[0];
1020 opt_array
[0].canonical_option_num_elements
= 1;
1021 opt_array
[0].canonical_option
[0] = argv
[0];
1022 opt_array
[0].canonical_option
[1] = NULL
;
1023 opt_array
[0].canonical_option
[2] = NULL
;
1024 opt_array
[0].canonical_option
[3] = NULL
;
1025 opt_array
[0].value
= 1;
1026 opt_array
[0].mask
= 0;
1027 opt_array
[0].errors
= 0;
1028 num_decoded_options
= 1;
1030 for (i
= 1; i
< argc
; i
+= n
)
1032 const char *opt
= argv
[i
];
1034 /* Interpret "-" or a non-switch as a file name. */
1035 if (opt
[0] != '-' || opt
[1] == '\0')
1037 generate_option_input_file (opt
, &opt_array
[num_decoded_options
]);
1038 num_decoded_options
++;
1043 /* Interpret "--param" "key=name" as "--param=key=name". */
1044 const char *needle
= "--param";
1045 if (i
+ 1 < argc
&& strcmp (opt
, needle
) == 0)
1047 const char *replacement
1048 = opts_concat (needle
, "=", argv
[i
+ 1], NULL
);
1049 argv
[++i
] = replacement
;
1052 /* Expand -fdiagnostics-plain-output to its constituents. This needs
1053 to happen here so that prune_options can handle -fdiagnostics-color
1055 if (!strcmp (opt
, "-fdiagnostics-plain-output"))
1057 /* If you have changed the default diagnostics output, and this new
1058 output is not appropriately "plain" (e.g., the change needs to be
1059 undone in order for the testsuite to work properly), then please do
1061 1. Add the necessary option to undo the new behavior to
1063 2. Update the documentation for -fdiagnostics-plain-output
1065 const char *const expanded_args
[] = {
1066 "-fno-diagnostics-show-caret",
1067 "-fno-diagnostics-show-line-numbers",
1068 "-fdiagnostics-color=never",
1069 "-fdiagnostics-urls=never",
1070 "-fdiagnostics-path-format=separate-events",
1072 const int num_expanded
= ARRAY_SIZE (expanded_args
);
1073 opt_array_len
+= num_expanded
- 1;
1074 opt_array
= XRESIZEVEC (struct cl_decoded_option
,
1075 opt_array
, opt_array_len
);
1076 for (int j
= 0, nj
; j
< num_expanded
; j
+= nj
)
1078 nj
= decode_cmdline_option (expanded_args
+ j
, lang_mask
,
1079 &opt_array
[num_decoded_options
]);
1080 num_decoded_options
++;
1087 n
= decode_cmdline_option (argv
+ i
, lang_mask
,
1088 &opt_array
[num_decoded_options
]);
1089 num_decoded_options
++;
1092 *decoded_options
= opt_array
;
1093 *decoded_options_count
= num_decoded_options
;
1094 prune_options (decoded_options
, decoded_options_count
);
1097 /* Return true if NEXT_OPT_IDX cancels OPT_IDX. Return false if the
1098 next one is the same as ORIG_NEXT_OPT_IDX. */
1101 cancel_option (int opt_idx
, int next_opt_idx
, int orig_next_opt_idx
)
1103 /* An option can be canceled by the same option or an option with
1105 if (cl_options
[next_opt_idx
].neg_index
== opt_idx
)
1108 if (cl_options
[next_opt_idx
].neg_index
!= orig_next_opt_idx
)
1109 return cancel_option (opt_idx
, cl_options
[next_opt_idx
].neg_index
,
1115 /* Filter out options canceled by the ones after them. */
1118 prune_options (struct cl_decoded_option
**decoded_options
,
1119 unsigned int *decoded_options_count
)
1121 unsigned int old_decoded_options_count
= *decoded_options_count
;
1122 struct cl_decoded_option
*old_decoded_options
= *decoded_options
;
1123 unsigned int new_decoded_options_count
;
1124 struct cl_decoded_option
*new_decoded_options
1125 = XNEWVEC (struct cl_decoded_option
, old_decoded_options_count
);
1127 const struct cl_option
*option
;
1128 unsigned int fdiagnostics_color_idx
= 0;
1130 /* Remove arguments which are negated by others after them. */
1131 new_decoded_options_count
= 0;
1132 for (i
= 0; i
< old_decoded_options_count
; i
++)
1134 unsigned int j
, opt_idx
, next_opt_idx
;
1136 if (old_decoded_options
[i
].errors
& ~CL_ERR_WRONG_LANG
)
1139 opt_idx
= old_decoded_options
[i
].opt_index
;
1142 case OPT_SPECIAL_unknown
:
1143 case OPT_SPECIAL_ignore
:
1144 case OPT_SPECIAL_warn_removed
:
1145 case OPT_SPECIAL_program_name
:
1146 case OPT_SPECIAL_input_file
:
1149 /* Do not save OPT_fdiagnostics_color_, just remember the last one. */
1150 case OPT_fdiagnostics_color_
:
1151 fdiagnostics_color_idx
= i
;
1155 gcc_assert (opt_idx
< cl_options_count
);
1156 option
= &cl_options
[opt_idx
];
1157 if (option
->neg_index
< 0)
1160 /* Skip joined switches. */
1161 if ((option
->flags
& CL_JOINED
)
1162 && (!option
->cl_reject_negative
1163 || (unsigned int) option
->neg_index
!= opt_idx
))
1166 for (j
= i
+ 1; j
< old_decoded_options_count
; j
++)
1168 if (old_decoded_options
[j
].errors
& ~CL_ERR_WRONG_LANG
)
1170 next_opt_idx
= old_decoded_options
[j
].opt_index
;
1171 if (next_opt_idx
>= cl_options_count
)
1173 if (cl_options
[next_opt_idx
].neg_index
< 0)
1175 if ((cl_options
[next_opt_idx
].flags
& CL_JOINED
)
1176 && (!cl_options
[next_opt_idx
].cl_reject_negative
1177 || ((unsigned int) cl_options
[next_opt_idx
].neg_index
1180 if (cancel_option (opt_idx
, next_opt_idx
, next_opt_idx
))
1183 if (j
== old_decoded_options_count
)
1186 new_decoded_options
[new_decoded_options_count
]
1187 = old_decoded_options
[i
];
1188 new_decoded_options_count
++;
1194 if (fdiagnostics_color_idx
>= 1)
1196 /* We put the last -fdiagnostics-color= at the first position
1197 after argv[0] so it can take effect immediately. */
1198 memmove (new_decoded_options
+ 2, new_decoded_options
+ 1,
1199 sizeof (struct cl_decoded_option
)
1200 * (new_decoded_options_count
- 1));
1201 new_decoded_options
[1] = old_decoded_options
[fdiagnostics_color_idx
];
1202 new_decoded_options_count
++;
1205 free (old_decoded_options
);
1206 new_decoded_options
= XRESIZEVEC (struct cl_decoded_option
,
1207 new_decoded_options
,
1208 new_decoded_options_count
);
1209 *decoded_options
= new_decoded_options
;
1210 *decoded_options_count
= new_decoded_options_count
;
1213 /* Handle option DECODED for the language indicated by LANG_MASK,
1214 using the handlers in HANDLERS and setting fields in OPTS and
1215 OPTS_SET. KIND is the diagnostic_t if this is a diagnostics
1216 option, DK_UNSPECIFIED otherwise, and LOC is the location of the
1217 option for options from the source file, UNKNOWN_LOCATION
1218 otherwise. GENERATED_P is true for an option generated as part of
1219 processing another option or otherwise generated internally, false
1220 for one explicitly passed by the user. control_warning_option
1221 generated options are considered explicitly passed by the user.
1222 Returns false if the switch was invalid. DC is the diagnostic
1223 context for options affecting diagnostics state, or NULL. */
1226 handle_option (struct gcc_options
*opts
,
1227 struct gcc_options
*opts_set
,
1228 const struct cl_decoded_option
*decoded
,
1229 unsigned int lang_mask
, int kind
, location_t loc
,
1230 const struct cl_option_handlers
*handlers
,
1231 bool generated_p
, diagnostic_context
*dc
)
1233 size_t opt_index
= decoded
->opt_index
;
1234 const char *arg
= decoded
->arg
;
1235 HOST_WIDE_INT value
= decoded
->value
;
1236 HOST_WIDE_INT mask
= decoded
->mask
;
1237 const struct cl_option
*option
= &cl_options
[opt_index
];
1238 void *flag_var
= option_flag_var (opt_index
, opts
);
1242 set_option (opts
, (generated_p
? NULL
: opts_set
),
1243 opt_index
, value
, arg
, kind
, loc
, dc
, mask
);
1245 for (i
= 0; i
< handlers
->num_handlers
; i
++)
1246 if (option
->flags
& handlers
->handlers
[i
].mask
)
1248 if (!handlers
->handlers
[i
].handler (opts
, opts_set
, decoded
,
1249 lang_mask
, kind
, loc
,
1251 handlers
->target_option_override_hook
))
1258 /* Like handle_option, but OPT_INDEX, ARG and VALUE describe the
1259 option instead of DECODED. This is used for callbacks when one
1260 option implies another instead of an option being decoded from the
1264 handle_generated_option (struct gcc_options
*opts
,
1265 struct gcc_options
*opts_set
,
1266 size_t opt_index
, const char *arg
, HOST_WIDE_INT value
,
1267 unsigned int lang_mask
, int kind
, location_t loc
,
1268 const struct cl_option_handlers
*handlers
,
1269 bool generated_p
, diagnostic_context
*dc
)
1271 struct cl_decoded_option decoded
;
1273 generate_option (opt_index
, arg
, value
, lang_mask
, &decoded
);
1274 return handle_option (opts
, opts_set
, &decoded
, lang_mask
, kind
, loc
,
1275 handlers
, generated_p
, dc
);
1278 /* Fill in *DECODED with an option described by OPT_INDEX, ARG and
1279 VALUE for a front end using LANG_MASK. This is used when the
1280 compiler generates options internally. */
1283 generate_option (size_t opt_index
, const char *arg
, HOST_WIDE_INT value
,
1284 unsigned int lang_mask
, struct cl_decoded_option
*decoded
)
1286 const struct cl_option
*option
= &cl_options
[opt_index
];
1288 decoded
->opt_index
= opt_index
;
1289 decoded
->warn_message
= NULL
;
1291 decoded
->value
= value
;
1293 decoded
->errors
= (option_ok_for_language (option
, lang_mask
)
1295 : CL_ERR_WRONG_LANG
);
1297 generate_canonical_option (opt_index
, arg
, value
, decoded
);
1298 switch (decoded
->canonical_option_num_elements
)
1301 decoded
->orig_option_with_args_text
= decoded
->canonical_option
[0];
1305 decoded
->orig_option_with_args_text
1306 = opts_concat (decoded
->canonical_option
[0], " ",
1307 decoded
->canonical_option
[1], NULL
);
1315 /* Fill in *DECODED with an option for input file FILE. */
1318 generate_option_input_file (const char *file
,
1319 struct cl_decoded_option
*decoded
)
1321 decoded
->opt_index
= OPT_SPECIAL_input_file
;
1322 decoded
->warn_message
= NULL
;
1323 decoded
->arg
= file
;
1324 decoded
->orig_option_with_args_text
= file
;
1325 decoded
->canonical_option_num_elements
= 1;
1326 decoded
->canonical_option
[0] = file
;
1327 decoded
->canonical_option
[1] = NULL
;
1328 decoded
->canonical_option
[2] = NULL
;
1329 decoded
->canonical_option
[3] = NULL
;
1332 decoded
->errors
= 0;
1335 /* Helper function for listing valid choices and hint for misspelled
1336 value. CANDIDATES is a vector containing all valid strings,
1337 STR is set to a heap allocated string that contains all those
1338 strings concatenated, separated by spaces, and the return value
1339 is the closest string from those to ARG, or NULL if nothing is
1340 close enough. Callers should XDELETEVEC (STR) after using it
1341 to avoid memory leaks. */
1344 candidates_list_and_hint (const char *arg
, char *&str
,
1345 const auto_vec
<const char *> &candidates
)
1349 const char *candidate
;
1352 gcc_assert (!candidates
.is_empty ());
1354 FOR_EACH_VEC_ELT (candidates
, i
, candidate
)
1355 len
+= strlen (candidate
) + 1;
1357 str
= p
= XNEWVEC (char, len
);
1358 FOR_EACH_VEC_ELT (candidates
, i
, candidate
)
1360 len
= strlen (candidate
);
1361 memcpy (p
, candidate
, len
);
1366 return find_closest_string (arg
, &candidates
);
1369 /* Perform diagnostics for read_cmdline_option and control_warning_option
1370 functions. Returns true if an error has been diagnosed.
1371 LOC and LANG_MASK arguments like in read_cmdline_option.
1372 OPTION is the option to report diagnostics for, OPT the name
1373 of the option as text, ARG the argument of the option (for joined
1374 options), ERRORS is bitmask of CL_ERR_* values. */
1377 cmdline_handle_error (location_t loc
, const struct cl_option
*option
,
1378 const char *opt
, const char *arg
, int errors
,
1379 unsigned int lang_mask
)
1381 if (errors
& CL_ERR_DISABLED
)
1383 error_at (loc
, "command-line option %qs"
1384 " is not supported by this configuration", opt
);
1388 if (errors
& CL_ERR_MISSING_ARG
)
1390 if (option
->missing_argument_error
)
1391 error_at (loc
, option
->missing_argument_error
, opt
);
1393 error_at (loc
, "missing argument to %qs", opt
);
1397 if (errors
& CL_ERR_UINT_ARG
)
1399 if (option
->cl_byte_size
)
1400 error_at (loc
, "argument to %qs should be a non-negative integer "
1401 "optionally followed by a size unit",
1404 error_at (loc
, "argument to %qs should be a non-negative integer",
1409 if (errors
& CL_ERR_INT_RANGE_ARG
)
1411 error_at (loc
, "argument to %qs is not between %d and %d",
1412 option
->opt_text
, option
->range_min
, option
->range_max
);
1416 if (errors
& CL_ERR_ENUM_SET_ARG
)
1418 const struct cl_enum
*e
= &cl_enums
[option
->var_enum
];
1419 const char *p
= arg
;
1420 unsigned HOST_WIDE_INT used_sets
= 0;
1421 const char *second_opt
= NULL
;
1422 size_t second_opt_len
= 0;
1426 const char *q
= strchr (p
, ',');
1427 HOST_WIDE_INT this_value
= 0;
1431 errors
= CL_ERR_ENUM_ARG
;
1434 int idx
= enum_arg_to_value (e
->values
, p
, q
? q
- p
: 0,
1435 &this_value
, lang_mask
);
1439 q
= strchr (p
, '\0');
1440 char *narg
= XALLOCAVEC (char, (q
- p
) + 1);
1441 memcpy (narg
, p
, q
- p
);
1444 errors
= CL_ERR_ENUM_ARG
;
1448 if (option
->var_value
== CLEV_BITSET
)
1456 unsigned set
= e
->values
[idx
].flags
>> CL_ENUM_SET_SHIFT
;
1457 gcc_checking_assert (set
>= 1 && set
<= HOST_BITS_PER_WIDE_INT
);
1458 if ((used_sets
& (HOST_WIDE_INT_1U
<< (set
- 1))) != 0)
1461 q
= strchr (p
, '\0');
1462 if (second_opt
== NULL
)
1464 used_sets
= HOST_WIDE_INT_1U
<< (set
- 1);
1466 second_opt_len
= q
- p
;
1470 char *args
= XALLOCAVEC (char, (q
- p
) + 1 + second_opt_len
+ 1);
1471 memcpy (args
, p
, q
- p
);
1473 memcpy (args
+ (q
- p
) + 1, second_opt
, second_opt_len
);
1474 args
[(q
- p
) + 1 + second_opt_len
] = '\0';
1475 error_at (loc
, "invalid argument in option %qs", opt
);
1476 if (strcmp (args
, args
+ (q
- p
) + 1) == 0)
1477 inform (loc
, "%qs specified multiple times in the same option",
1480 inform (loc
, "%qs is mutually exclusive with %qs and cannot be"
1481 " specified together", args
, args
+ (q
- p
) + 1);
1484 used_sets
|= HOST_WIDE_INT_1U
<< (set
- 1);
1492 if (errors
& CL_ERR_ENUM_ARG
)
1494 const struct cl_enum
*e
= &cl_enums
[option
->var_enum
];
1498 auto_diagnostic_group d
;
1499 if (e
->unknown_error
)
1500 error_at (loc
, e
->unknown_error
, arg
);
1502 error_at (loc
, "unrecognized argument in option %qs", opt
);
1504 auto_vec
<const char *> candidates
;
1505 for (i
= 0; e
->values
[i
].arg
!= NULL
; i
++)
1507 if (!enum_arg_ok_for_language (&e
->values
[i
], lang_mask
))
1509 candidates
.safe_push (e
->values
[i
].arg
);
1511 const char *hint
= candidates_list_and_hint (arg
, s
, candidates
);
1513 inform (loc
, "valid arguments to %qs are: %s; did you mean %qs?",
1514 option
->opt_text
, s
, hint
);
1516 inform (loc
, "valid arguments to %qs are: %s", option
->opt_text
, s
);
1525 /* Handle the switch DECODED (location LOC) for the language indicated
1526 by LANG_MASK, using the handlers in *HANDLERS and setting fields in
1527 OPTS and OPTS_SET and using diagnostic context DC (if not NULL) for
1528 diagnostic options. */
1531 read_cmdline_option (struct gcc_options
*opts
,
1532 struct gcc_options
*opts_set
,
1533 struct cl_decoded_option
*decoded
,
1535 unsigned int lang_mask
,
1536 const struct cl_option_handlers
*handlers
,
1537 diagnostic_context
*dc
)
1539 const struct cl_option
*option
;
1540 const char *opt
= decoded
->orig_option_with_args_text
;
1542 if (decoded
->warn_message
)
1543 warning_at (loc
, 0, decoded
->warn_message
, opt
);
1545 if (decoded
->opt_index
== OPT_SPECIAL_unknown
)
1547 if (handlers
->unknown_option_callback (decoded
))
1548 error_at (loc
, "unrecognized command-line option %qs", decoded
->arg
);
1552 if (decoded
->opt_index
== OPT_SPECIAL_ignore
)
1555 if (decoded
->opt_index
== OPT_SPECIAL_warn_removed
)
1557 /* Warn only about positive ignored options. */
1559 warning_at (loc
, 0, "switch %qs is no longer supported", opt
);
1563 option
= &cl_options
[decoded
->opt_index
];
1566 && cmdline_handle_error (loc
, option
, opt
, decoded
->arg
,
1567 decoded
->errors
, lang_mask
))
1570 if (decoded
->errors
& CL_ERR_WRONG_LANG
)
1572 handlers
->wrong_lang_callback (decoded
, lang_mask
);
1576 gcc_assert (!decoded
->errors
);
1578 if (!handle_option (opts
, opts_set
, decoded
, lang_mask
, DK_UNSPECIFIED
,
1579 loc
, handlers
, false, dc
))
1580 error_at (loc
, "unrecognized command-line option %qs", opt
);
1583 /* Set any field in OPTS, and OPTS_SET if not NULL, for option
1584 OPT_INDEX according to VALUE and ARG, diagnostic kind KIND,
1585 location LOC, using diagnostic context DC if not NULL for
1586 diagnostic classification. */
1589 set_option (struct gcc_options
*opts
, struct gcc_options
*opts_set
,
1590 int opt_index
, HOST_WIDE_INT value
, const char *arg
, int kind
,
1591 location_t loc
, diagnostic_context
*dc
,
1592 HOST_WIDE_INT mask
/* = 0 */)
1594 const struct cl_option
*option
= &cl_options
[opt_index
];
1595 void *flag_var
= option_flag_var (opt_index
, opts
);
1596 void *set_flag_var
= NULL
;
1601 if ((diagnostic_t
) kind
!= DK_UNSPECIFIED
&& dc
!= NULL
)
1602 diagnostic_classify_diagnostic (dc
, opt_index
, (diagnostic_t
) kind
, loc
);
1604 if (opts_set
!= NULL
)
1605 set_flag_var
= option_flag_var (opt_index
, opts_set
);
1607 switch (option
->var_type
)
1610 if (option
->cl_host_wide_int
)
1612 *(HOST_WIDE_INT
*) flag_var
= value
;
1614 *(HOST_WIDE_INT
*) set_flag_var
= 1;
1618 if (value
> INT_MAX
)
1619 error_at (loc
, "argument to %qs is bigger than %d",
1620 option
->opt_text
, INT_MAX
);
1623 *(int *) flag_var
= value
;
1625 *(int *) set_flag_var
= 1;
1632 if (option
->cl_host_wide_int
)
1634 *(HOST_WIDE_INT
*) flag_var
= value
;
1636 *(HOST_WIDE_INT
*) set_flag_var
= value
;
1640 *(int *) flag_var
= value
;
1642 *(int *) set_flag_var
= value
;
1648 if (option
->cl_host_wide_int
)
1650 *(HOST_WIDE_INT
*) flag_var
= (value
1652 : !option
->var_value
);
1654 *(HOST_WIDE_INT
*) set_flag_var
= 1;
1658 *(int *) flag_var
= (value
1660 : !option
->var_value
);
1662 *(int *) set_flag_var
= 1;
1666 case CLVC_BIT_CLEAR
:
1668 if ((value
!= 0) == (option
->var_type
== CLVC_BIT_SET
))
1670 if (option
->cl_host_wide_int
)
1671 *(HOST_WIDE_INT
*) flag_var
|= option
->var_value
;
1673 *(int *) flag_var
|= option
->var_value
;
1677 if (option
->cl_host_wide_int
)
1678 *(HOST_WIDE_INT
*) flag_var
&= ~option
->var_value
;
1680 *(int *) flag_var
&= ~option
->var_value
;
1684 if (option
->cl_host_wide_int
)
1685 *(HOST_WIDE_INT
*) set_flag_var
|= option
->var_value
;
1687 *(int *) set_flag_var
|= option
->var_value
;
1692 *(const char **) flag_var
= arg
;
1694 *(const char **) set_flag_var
= "";
1699 const struct cl_enum
*e
= &cl_enums
[option
->var_enum
];
1702 e
->set (flag_var
, value
| (e
->get (flag_var
) & ~mask
));
1704 e
->set (flag_var
, value
);
1706 e
->set (set_flag_var
, 1);
1712 vec
<cl_deferred_option
> *v
1713 = (vec
<cl_deferred_option
> *) *(void **) flag_var
;
1714 cl_deferred_option p
= {opt_index
, arg
, value
};
1716 v
= XCNEW (vec
<cl_deferred_option
>);
1718 *(void **) flag_var
= v
;
1720 *(void **) set_flag_var
= v
;
1726 /* Return the address of the flag variable for option OPT_INDEX in
1727 options structure OPTS, or NULL if there is no flag variable. */
1730 option_flag_var (int opt_index
, struct gcc_options
*opts
)
1732 const struct cl_option
*option
= &cl_options
[opt_index
];
1734 if (option
->flag_var_offset
== (unsigned short) -1)
1736 return (void *)(((char *) opts
) + option
->flag_var_offset
);
1739 /* Return 1 if option OPT_IDX is enabled in OPTS, 0 if it is disabled,
1740 or -1 if it isn't a simple on-off switch
1741 (or if the value is unknown, typically set later in target). */
1744 option_enabled (int opt_idx
, unsigned lang_mask
, void *opts
)
1746 const struct cl_option
*option
= &(cl_options
[opt_idx
]);
1748 /* A language-specific option can only be considered enabled when it's
1749 valid for the current language. */
1750 if (!(option
->flags
& CL_COMMON
)
1751 && (option
->flags
& CL_LANG_ALL
)
1752 && !(option
->flags
& lang_mask
))
1755 struct gcc_options
*optsg
= (struct gcc_options
*) opts
;
1756 void *flag_var
= option_flag_var (opt_idx
, optsg
);
1759 switch (option
->var_type
)
1762 if (option
->cl_host_wide_int
)
1764 HOST_WIDE_INT v
= *(HOST_WIDE_INT
*) flag_var
;
1765 return v
!= 0 ? (v
< 0 ? -1 : 1) : 0;
1769 int v
= *(int *) flag_var
;
1770 return v
!= 0 ? (v
< 0 ? -1 : 1) : 0;
1774 if (option
->cl_host_wide_int
)
1775 return *(HOST_WIDE_INT
*) flag_var
== option
->var_value
;
1777 return *(int *) flag_var
== option
->var_value
;
1779 case CLVC_BIT_CLEAR
:
1780 if (option
->cl_host_wide_int
)
1781 return (*(HOST_WIDE_INT
*) flag_var
& option
->var_value
) == 0;
1783 return (*(int *) flag_var
& option
->var_value
) == 0;
1786 if (option
->cl_host_wide_int
)
1787 return (*(HOST_WIDE_INT
*) flag_var
& option
->var_value
) != 0;
1789 return (*(int *) flag_var
& option
->var_value
) != 0;
1792 if (option
->cl_host_wide_int
)
1793 return *(HOST_WIDE_INT
*) flag_var
!= -1;
1795 return *(int *) flag_var
!= -1;
1805 /* Fill STATE with the current state of option OPTION in OPTS. Return
1806 true if there is some state to store. */
1809 get_option_state (struct gcc_options
*opts
, int option
,
1810 struct cl_option_state
*state
)
1812 void *flag_var
= option_flag_var (option
, opts
);
1817 switch (cl_options
[option
].var_type
)
1822 state
->data
= flag_var
;
1823 state
->size
= (cl_options
[option
].cl_host_wide_int
1824 ? sizeof (HOST_WIDE_INT
)
1828 case CLVC_BIT_CLEAR
:
1830 state
->ch
= option_enabled (option
, -1, opts
);
1831 state
->data
= &state
->ch
;
1836 state
->data
= *(const char **) flag_var
;
1837 if (state
->data
== 0)
1839 state
->size
= strlen ((const char *) state
->data
) + 1;
1843 state
->data
= flag_var
;
1844 state
->size
= cl_enums
[cl_options
[option
].var_enum
].var_size
;
1853 /* Set a warning option OPT_INDEX (language mask LANG_MASK, option
1854 handlers HANDLERS) to have diagnostic kind KIND for option
1855 structures OPTS and OPTS_SET and diagnostic context DC (possibly
1856 NULL), at location LOC (UNKNOWN_LOCATION for -Werror=). ARG is the
1857 argument of the option for joined options, or NULL otherwise. If IMPLY,
1858 the warning option in question is implied at this point. This is
1859 used by -Werror= and #pragma GCC diagnostic. */
1862 control_warning_option (unsigned int opt_index
, int kind
, const char *arg
,
1863 bool imply
, location_t loc
, unsigned int lang_mask
,
1864 const struct cl_option_handlers
*handlers
,
1865 struct gcc_options
*opts
,
1866 struct gcc_options
*opts_set
,
1867 diagnostic_context
*dc
)
1869 if (cl_options
[opt_index
].alias_target
!= N_OPTS
)
1871 gcc_assert (!cl_options
[opt_index
].cl_separate_alias
1872 && !cl_options
[opt_index
].cl_negative_alias
);
1873 if (cl_options
[opt_index
].alias_arg
)
1874 arg
= cl_options
[opt_index
].alias_arg
;
1875 opt_index
= cl_options
[opt_index
].alias_target
;
1877 if (opt_index
== OPT_SPECIAL_ignore
|| opt_index
== OPT_SPECIAL_warn_removed
)
1880 diagnostic_classify_diagnostic (dc
, opt_index
, (diagnostic_t
) kind
, loc
);
1883 const struct cl_option
*option
= &cl_options
[opt_index
];
1885 /* -Werror=foo implies -Wfoo. */
1886 if (option
->var_type
== CLVC_INTEGER
1887 || option
->var_type
== CLVC_ENUM
1888 || option
->var_type
== CLVC_SIZE
)
1890 HOST_WIDE_INT value
= 1;
1892 if (arg
&& *arg
== '\0' && !option
->cl_missing_ok
)
1895 if ((option
->flags
& CL_JOINED
) && arg
== NULL
)
1897 cmdline_handle_error (loc
, option
, option
->opt_text
, arg
,
1898 CL_ERR_MISSING_ARG
, lang_mask
);
1902 /* If the switch takes an integer argument, convert it. */
1903 if (arg
&& (option
->cl_uinteger
|| option
->cl_host_wide_int
))
1906 value
= *arg
? integral_argument (arg
, &error
,
1907 option
->cl_byte_size
) : 0;
1910 cmdline_handle_error (loc
, option
, option
->opt_text
, arg
,
1911 CL_ERR_UINT_ARG
, lang_mask
);
1916 /* If the switch takes an enumerated argument, convert it. */
1917 if (arg
&& option
->var_type
== CLVC_ENUM
)
1919 const struct cl_enum
*e
= &cl_enums
[option
->var_enum
];
1921 if (enum_arg_to_value (e
->values
, arg
, 0, &value
,
1924 const char *carg
= NULL
;
1926 if (enum_value_to_arg (e
->values
, &carg
, value
, lang_mask
))
1928 gcc_assert (carg
!= NULL
);
1932 cmdline_handle_error (loc
, option
, option
->opt_text
, arg
,
1933 CL_ERR_ENUM_ARG
, lang_mask
);
1938 handle_generated_option (opts
, opts_set
,
1939 opt_index
, arg
, value
, lang_mask
,
1940 kind
, loc
, handlers
, false, dc
);
1945 /* Parse options in COLLECT_GCC_OPTIONS and push them on ARGV_OBSTACK.
1946 Store number of arguments into ARGC_P. */
1949 parse_options_from_collect_gcc_options (const char *collect_gcc_options
,
1950 obstack
*argv_obstack
,
1953 char *argv_storage
= xstrdup (collect_gcc_options
);
1956 for (j
= 0, k
= 0; argv_storage
[j
] != '\0'; ++j
)
1958 if (argv_storage
[j
] == '\'')
1960 obstack_ptr_grow (argv_obstack
, &argv_storage
[k
]);
1964 if (argv_storage
[j
] == '\0')
1965 fatal_error (input_location
,
1966 "malformed %<COLLECT_GCC_OPTIONS%>");
1967 else if (startswith (&argv_storage
[j
], "'\\''"))
1969 argv_storage
[k
++] = '\'';
1972 else if (argv_storage
[j
] == '\'')
1975 argv_storage
[k
++] = argv_storage
[j
++];
1978 argv_storage
[k
++] = '\0';
1982 obstack_ptr_grow (argv_obstack
, NULL
);
1983 *argc_p
= obstack_object_size (argv_obstack
) / sizeof (void *) - 1;
1986 /* Prepend -Xassembler for each option in COLLECT_AS_OPTIONS,
1989 void prepend_xassembler_to_collect_as_options (const char *collect_as_options
,
1992 obstack opts_obstack
;
1995 obstack_init (&opts_obstack
);
1996 parse_options_from_collect_gcc_options (collect_as_options
,
1997 &opts_obstack
, &opts_count
);
1998 const char **assembler_opts
= XOBFINISH (&opts_obstack
, const char **);
2000 for (int i
= 0; i
< opts_count
; i
++)
2002 obstack_grow (o
, " '-Xassembler' ",
2003 strlen (" '-Xassembler' "));
2004 const char *opt
= assembler_opts
[i
];
2005 obstack_1grow (o
, '\'');
2006 obstack_grow (o
, opt
, strlen (opt
));
2007 obstack_1grow (o
, '\'');
2011 jobserver_info::jobserver_info ()
2013 /* Traditionally, GNU make uses opened pipes for jobserver-auth,
2014 e.g. --jobserver-auth=3,4.
2015 Starting with GNU make 4.4, one can use --jobserver-style=fifo
2016 and then named pipe is used: --jobserver-auth=fifo:/tmp/hcsparta. */
2018 /* Detect jobserver and drop it if it's not working. */
2019 string js_needle
= "--jobserver-auth=";
2020 string fifo_prefix
= "fifo:";
2022 const char *envval
= getenv ("MAKEFLAGS");
2025 string makeflags
= envval
;
2026 size_t n
= makeflags
.rfind (js_needle
);
2027 if (n
!= string::npos
)
2029 string ending
= makeflags
.substr (n
+ js_needle
.size ());
2030 if (ending
.find (fifo_prefix
) == 0)
2032 ending
= ending
.substr (fifo_prefix
.size ());
2033 pipe_path
= ending
.substr (0, ending
.find (' '));
2036 else if (sscanf (makeflags
.c_str () + n
+ js_needle
.size (),
2037 "%d,%d", &rfd
, &wfd
) == 2
2040 && is_valid_fd (rfd
)
2041 && is_valid_fd (wfd
))
2045 string dup
= makeflags
.substr (0, n
);
2046 size_t pos
= makeflags
.find (' ', n
);
2047 if (pos
!= string::npos
)
2048 dup
+= makeflags
.substr (pos
);
2049 skipped_makeflags
= "MAKEFLAGS=" + dup
;
2051 = "cannot access %<" + js_needle
+ "%> file descriptors";
2054 error_msg
= "%<" + js_needle
+ "%> is not present in %<MAKEFLAGS%>";
2057 error_msg
= "%<MAKEFLAGS%> environment variable is unset";
2059 if (!error_msg
.empty ())
2060 error_msg
= "jobserver is not available: " + error_msg
;
2064 jobserver_info::connect ()
2066 if (!pipe_path
.empty ())
2068 #if HOST_HAS_O_NONBLOCK
2069 pipefd
= open (pipe_path
.c_str (), O_RDWR
| O_NONBLOCK
);
2070 is_connected
= true;
2072 is_connected
= false;
2076 is_connected
= true;
2080 jobserver_info::disconnect ()
2082 if (!pipe_path
.empty ())
2084 gcc_assert (close (pipefd
) == 0);
2090 jobserver_info::get_token ()
2092 int fd
= pipe_path
.empty () ? rfd
: pipefd
;
2094 unsigned n
= read (fd
, &c
, 1);
2097 gcc_assert (errno
== EAGAIN
);
2105 jobserver_info::return_token ()
2107 int fd
= pipe_path
.empty () ? wfd
: pipefd
;
2109 gcc_assert (write (fd
, &c
, 1) == 1);