d: Add test for PR d/108167 to the testsuite [PR108167]
[official-gcc.git] / gcc / opts.cc
bloba032cd4ce5821bac5b4f10d5ec961d8c4b4c4d2a
1 /* Command line option handling.
2 Copyright (C) 2002-2023 Free Software Foundation, Inc.
3 Contributed by Neil Booth.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 #include "config.h"
22 #include "system.h"
23 #include "intl.h"
24 #include "coretypes.h"
25 #include "opts.h"
26 #include "tm.h"
27 #include "flags.h"
28 #include "diagnostic.h"
29 #include "opts-diagnostic.h"
30 #include "insn-attr-common.h"
31 #include "common/common-target.h"
32 #include "spellcheck.h"
33 #include "opt-suggestions.h"
34 #include "diagnostic-color.h"
35 #include "version.h"
36 #include "selftest.h"
38 /* In this file all option sets are explicit. */
39 #undef OPTION_SET_P
41 static void set_Wstrict_aliasing (struct gcc_options *opts, int onoff);
43 /* Names of fundamental debug info formats indexed by enum
44 debug_info_type. */
46 const char *const debug_type_names[] =
48 "none", "stabs", "dwarf-2", "xcoff", "vms", "ctf", "btf"
51 /* Bitmasks of fundamental debug info formats indexed by enum
52 debug_info_type. */
54 static uint32_t debug_type_masks[] =
56 NO_DEBUG, DWARF2_DEBUG, VMS_DEBUG,
57 CTF_DEBUG, BTF_DEBUG
60 /* Names of the set of debug formats requested by user. Updated and accessed
61 via debug_set_names. */
63 static char df_set_names[sizeof "none stabs dwarf-2 xcoff vms ctf btf"];
65 /* Get enum debug_info_type of the specified debug format, for error messages.
66 Can be used only for individual debug format types. */
68 enum debug_info_type
69 debug_set_to_format (uint32_t debug_info_set)
71 int idx = 0;
72 enum debug_info_type dinfo_type = DINFO_TYPE_NONE;
73 /* Find first set bit. */
74 if (debug_info_set)
75 idx = exact_log2 (debug_info_set & - debug_info_set);
76 /* Check that only one bit is set, if at all. This function is meant to be
77 used only for vanilla debug_info_set bitmask values, i.e. for individual
78 debug format types upto DINFO_TYPE_MAX. */
79 gcc_assert ((debug_info_set & (debug_info_set - 1)) == 0);
80 dinfo_type = (enum debug_info_type)idx;
81 gcc_assert (dinfo_type <= DINFO_TYPE_MAX);
82 return dinfo_type;
85 /* Get the number of debug formats enabled for output. */
87 unsigned int
88 debug_set_count (uint32_t w_symbols)
90 unsigned int count = 0;
91 while (w_symbols)
93 ++ count;
94 w_symbols &= ~ (w_symbols & - w_symbols);
96 return count;
99 /* Get the names of the debug formats enabled for output. */
101 const char *
102 debug_set_names (uint32_t w_symbols)
104 uint32_t df_mask = 0;
105 /* Reset the string to be returned. */
106 memset (df_set_names, 0, sizeof (df_set_names));
107 /* Get the popcount. */
108 int num_set_df = debug_set_count (w_symbols);
109 /* Iterate over the debug formats. Add name string for those enabled. */
110 for (int i = DINFO_TYPE_NONE; i <= DINFO_TYPE_MAX; i++)
112 df_mask = debug_type_masks[i];
113 if (w_symbols & df_mask)
115 strcat (df_set_names, debug_type_names[i]);
116 num_set_df--;
117 if (num_set_df)
118 strcat (df_set_names, " ");
119 else
120 break;
122 else if (!w_symbols)
124 /* No debug formats enabled. */
125 gcc_assert (i == DINFO_TYPE_NONE);
126 strcat (df_set_names, debug_type_names[i]);
127 break;
130 return df_set_names;
133 /* Return TRUE iff BTF debug info is enabled. */
135 bool
136 btf_debuginfo_p ()
138 return (write_symbols & BTF_DEBUG);
141 /* Return TRUE iff BTF with CO-RE debug info is enabled. */
143 bool
144 btf_with_core_debuginfo_p ()
146 return (write_symbols & BTF_WITH_CORE_DEBUG);
149 /* Return TRUE iff CTF debug info is enabled. */
151 bool
152 ctf_debuginfo_p ()
154 return (write_symbols & CTF_DEBUG);
157 /* Return TRUE iff dwarf2 debug info is enabled. */
159 bool
160 dwarf_debuginfo_p (struct gcc_options *opts)
162 return (opts->x_write_symbols & DWARF2_DEBUG);
165 /* Return true iff the debug info format is to be generated based on DWARF
166 DIEs (like CTF and BTF debug info formats). */
168 bool dwarf_based_debuginfo_p ()
170 return ((write_symbols & CTF_DEBUG)
171 || (write_symbols & BTF_DEBUG));
174 /* All flag uses below need to explicitely reference the option sets
175 to operate on. */
176 #define global_options DO_NOT_USE
177 #define global_options_set DO_NOT_USE
179 /* Parse the -femit-struct-debug-detailed option value
180 and set the flag variables. */
182 #define MATCH( prefix, string ) \
183 ((strncmp (prefix, string, sizeof prefix - 1) == 0) \
184 ? ((string += sizeof prefix - 1), 1) : 0)
186 void
187 set_struct_debug_option (struct gcc_options *opts, location_t loc,
188 const char *spec)
190 /* various labels for comparison */
191 static const char dfn_lbl[] = "dfn:", dir_lbl[] = "dir:", ind_lbl[] = "ind:";
192 static const char ord_lbl[] = "ord:", gen_lbl[] = "gen:";
193 static const char none_lbl[] = "none", any_lbl[] = "any";
194 static const char base_lbl[] = "base", sys_lbl[] = "sys";
196 enum debug_struct_file files = DINFO_STRUCT_FILE_ANY;
197 /* Default is to apply to as much as possible. */
198 enum debug_info_usage usage = DINFO_USAGE_NUM_ENUMS;
199 int ord = 1, gen = 1;
201 /* What usage? */
202 if (MATCH (dfn_lbl, spec))
203 usage = DINFO_USAGE_DFN;
204 else if (MATCH (dir_lbl, spec))
205 usage = DINFO_USAGE_DIR_USE;
206 else if (MATCH (ind_lbl, spec))
207 usage = DINFO_USAGE_IND_USE;
209 /* Generics or not? */
210 if (MATCH (ord_lbl, spec))
211 gen = 0;
212 else if (MATCH (gen_lbl, spec))
213 ord = 0;
215 /* What allowable environment? */
216 if (MATCH (none_lbl, spec))
217 files = DINFO_STRUCT_FILE_NONE;
218 else if (MATCH (any_lbl, spec))
219 files = DINFO_STRUCT_FILE_ANY;
220 else if (MATCH (sys_lbl, spec))
221 files = DINFO_STRUCT_FILE_SYS;
222 else if (MATCH (base_lbl, spec))
223 files = DINFO_STRUCT_FILE_BASE;
224 else
225 error_at (loc,
226 "argument %qs to %<-femit-struct-debug-detailed%> "
227 "not recognized",
228 spec);
230 /* Effect the specification. */
231 if (usage == DINFO_USAGE_NUM_ENUMS)
233 if (ord)
235 opts->x_debug_struct_ordinary[DINFO_USAGE_DFN] = files;
236 opts->x_debug_struct_ordinary[DINFO_USAGE_DIR_USE] = files;
237 opts->x_debug_struct_ordinary[DINFO_USAGE_IND_USE] = files;
239 if (gen)
241 opts->x_debug_struct_generic[DINFO_USAGE_DFN] = files;
242 opts->x_debug_struct_generic[DINFO_USAGE_DIR_USE] = files;
243 opts->x_debug_struct_generic[DINFO_USAGE_IND_USE] = files;
246 else
248 if (ord)
249 opts->x_debug_struct_ordinary[usage] = files;
250 if (gen)
251 opts->x_debug_struct_generic[usage] = files;
254 if (*spec == ',')
255 set_struct_debug_option (opts, loc, spec+1);
256 else
258 /* No more -femit-struct-debug-detailed specifications.
259 Do final checks. */
260 if (*spec != '\0')
261 error_at (loc,
262 "argument %qs to %<-femit-struct-debug-detailed%> unknown",
263 spec);
264 if (opts->x_debug_struct_ordinary[DINFO_USAGE_DIR_USE]
265 < opts->x_debug_struct_ordinary[DINFO_USAGE_IND_USE]
266 || opts->x_debug_struct_generic[DINFO_USAGE_DIR_USE]
267 < opts->x_debug_struct_generic[DINFO_USAGE_IND_USE])
268 error_at (loc,
269 "%<-femit-struct-debug-detailed=dir:...%> must allow "
270 "at least as much as "
271 "%<-femit-struct-debug-detailed=ind:...%>");
275 /* Strip off a legitimate source ending from the input string NAME of
276 length LEN. Rather than having to know the names used by all of
277 our front ends, we strip off an ending of a period followed by
278 up to fource characters. (C++ uses ".cpp".) */
280 void
281 strip_off_ending (char *name, int len)
283 int i;
284 for (i = 2; i < 5 && len > i; i++)
286 if (name[len - i] == '.')
288 name[len - i] = '\0';
289 break;
294 /* Find the base name of a path, stripping off both directories and
295 a single final extension. */
297 base_of_path (const char *path, const char **base_out)
299 const char *base = path;
300 const char *dot = 0;
301 const char *p = path;
302 char c = *p;
303 while (c)
305 if (IS_DIR_SEPARATOR (c))
307 base = p + 1;
308 dot = 0;
310 else if (c == '.')
311 dot = p;
312 c = *++p;
314 if (!dot)
315 dot = p;
316 *base_out = base;
317 return dot - base;
320 /* What to print when a switch has no documentation. */
321 static const char undocumented_msg[] = N_("This option lacks documentation.");
322 static const char use_diagnosed_msg[] = N_("Uses of this option are diagnosed.");
324 typedef char *char_p; /* For DEF_VEC_P. */
326 static void set_debug_level (uint32_t dinfo, int extended,
327 const char *arg, struct gcc_options *opts,
328 struct gcc_options *opts_set,
329 location_t loc);
330 static void set_fast_math_flags (struct gcc_options *opts, int set);
331 static void decode_d_option (const char *arg, struct gcc_options *opts,
332 location_t loc, diagnostic_context *dc);
333 static void set_unsafe_math_optimizations_flags (struct gcc_options *opts,
334 int set);
335 static void enable_warning_as_error (const char *arg, int value,
336 unsigned int lang_mask,
337 const struct cl_option_handlers *handlers,
338 struct gcc_options *opts,
339 struct gcc_options *opts_set,
340 location_t loc,
341 diagnostic_context *dc);
343 /* Handle a back-end option; arguments and return value as for
344 handle_option. */
346 bool
347 target_handle_option (struct gcc_options *opts,
348 struct gcc_options *opts_set,
349 const struct cl_decoded_option *decoded,
350 unsigned int lang_mask ATTRIBUTE_UNUSED, int kind,
351 location_t loc,
352 const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED,
353 diagnostic_context *dc, void (*) (void))
355 gcc_assert (dc == global_dc);
356 gcc_assert (kind == DK_UNSPECIFIED);
357 return targetm_common.handle_option (opts, opts_set, decoded, loc);
360 /* Add comma-separated strings to a char_p vector. */
362 static void
363 add_comma_separated_to_vector (void **pvec, const char *arg)
365 char *tmp;
366 char *r;
367 char *w;
368 char *token_start;
369 vec<char_p> *v = (vec<char_p> *) *pvec;
371 vec_check_alloc (v, 1);
373 /* We never free this string. */
374 tmp = xstrdup (arg);
376 r = tmp;
377 w = tmp;
378 token_start = tmp;
380 while (*r != '\0')
382 if (*r == ',')
384 *w++ = '\0';
385 ++r;
386 v->safe_push (token_start);
387 token_start = w;
389 if (*r == '\\' && r[1] == ',')
391 *w++ = ',';
392 r += 2;
394 else
395 *w++ = *r++;
398 *w = '\0';
399 if (*token_start != '\0')
400 v->safe_push (token_start);
402 *pvec = v;
405 /* Initialize opts_obstack. */
407 void
408 init_opts_obstack (void)
410 gcc_obstack_init (&opts_obstack);
413 /* Initialize OPTS and OPTS_SET before using them in parsing options. */
415 void
416 init_options_struct (struct gcc_options *opts, struct gcc_options *opts_set)
418 /* Ensure that opts_obstack has already been initialized by the time
419 that we initialize any gcc_options instances (PR jit/68446). */
420 gcc_assert (opts_obstack.chunk_size > 0);
422 *opts = global_options_init;
424 if (opts_set)
425 memset (opts_set, 0, sizeof (*opts_set));
427 /* Initialize whether `char' is signed. */
428 opts->x_flag_signed_char = DEFAULT_SIGNED_CHAR;
429 /* Set this to a special "uninitialized" value. The actual default
430 is set after target options have been processed. */
431 opts->x_flag_short_enums = 2;
433 /* Initialize target_flags before default_options_optimization
434 so the latter can modify it. */
435 opts->x_target_flags = targetm_common.default_target_flags;
437 /* Some targets have ABI-specified unwind tables. */
438 opts->x_flag_unwind_tables = targetm_common.unwind_tables_default;
440 /* Some targets have other target-specific initialization. */
441 targetm_common.option_init_struct (opts);
444 /* If indicated by the optimization level LEVEL (-Os if SIZE is set,
445 -Ofast if FAST is set, -Og if DEBUG is set), apply the option DEFAULT_OPT
446 to OPTS and OPTS_SET, diagnostic context DC, location LOC, with language
447 mask LANG_MASK and option handlers HANDLERS. */
449 static void
450 maybe_default_option (struct gcc_options *opts,
451 struct gcc_options *opts_set,
452 const struct default_options *default_opt,
453 int level, bool size, bool fast, bool debug,
454 unsigned int lang_mask,
455 const struct cl_option_handlers *handlers,
456 location_t loc,
457 diagnostic_context *dc)
459 const struct cl_option *option = &cl_options[default_opt->opt_index];
460 bool enabled;
462 if (size)
463 gcc_assert (level == 2);
464 if (fast)
465 gcc_assert (level == 3);
466 if (debug)
467 gcc_assert (level == 1);
469 switch (default_opt->levels)
471 case OPT_LEVELS_ALL:
472 enabled = true;
473 break;
475 case OPT_LEVELS_0_ONLY:
476 enabled = (level == 0);
477 break;
479 case OPT_LEVELS_1_PLUS:
480 enabled = (level >= 1);
481 break;
483 case OPT_LEVELS_1_PLUS_SPEED_ONLY:
484 enabled = (level >= 1 && !size && !debug);
485 break;
487 case OPT_LEVELS_1_PLUS_NOT_DEBUG:
488 enabled = (level >= 1 && !debug);
489 break;
491 case OPT_LEVELS_2_PLUS:
492 enabled = (level >= 2);
493 break;
495 case OPT_LEVELS_2_PLUS_SPEED_ONLY:
496 enabled = (level >= 2 && !size && !debug);
497 break;
499 case OPT_LEVELS_3_PLUS:
500 enabled = (level >= 3);
501 break;
503 case OPT_LEVELS_3_PLUS_AND_SIZE:
504 enabled = (level >= 3 || size);
505 break;
507 case OPT_LEVELS_SIZE:
508 enabled = size;
509 break;
511 case OPT_LEVELS_FAST:
512 enabled = fast;
513 break;
515 case OPT_LEVELS_NONE:
516 default:
517 gcc_unreachable ();
520 if (enabled)
521 handle_generated_option (opts, opts_set, default_opt->opt_index,
522 default_opt->arg, default_opt->value,
523 lang_mask, DK_UNSPECIFIED, loc,
524 handlers, true, dc);
525 else if (default_opt->arg == NULL
526 && !option->cl_reject_negative
527 && !(option->flags & CL_PARAMS))
528 handle_generated_option (opts, opts_set, default_opt->opt_index,
529 default_opt->arg, !default_opt->value,
530 lang_mask, DK_UNSPECIFIED, loc,
531 handlers, true, dc);
534 /* As indicated by the optimization level LEVEL (-Os if SIZE is set,
535 -Ofast if FAST is set), apply the options in array DEFAULT_OPTS to
536 OPTS and OPTS_SET, diagnostic context DC, location LOC, with
537 language mask LANG_MASK and option handlers HANDLERS. */
539 static void
540 maybe_default_options (struct gcc_options *opts,
541 struct gcc_options *opts_set,
542 const struct default_options *default_opts,
543 int level, bool size, bool fast, bool debug,
544 unsigned int lang_mask,
545 const struct cl_option_handlers *handlers,
546 location_t loc,
547 diagnostic_context *dc)
549 size_t i;
551 for (i = 0; default_opts[i].levels != OPT_LEVELS_NONE; i++)
552 maybe_default_option (opts, opts_set, &default_opts[i],
553 level, size, fast, debug,
554 lang_mask, handlers, loc, dc);
557 /* Table of options enabled by default at different levels.
558 Please keep this list sorted by level and alphabetized within
559 each level; this makes it easier to keep the documentation
560 in sync. */
562 static const struct default_options default_options_table[] =
564 /* -O1 and -Og optimizations. */
565 { OPT_LEVELS_1_PLUS, OPT_fcombine_stack_adjustments, NULL, 1 },
566 { OPT_LEVELS_1_PLUS, OPT_fcompare_elim, NULL, 1 },
567 { OPT_LEVELS_1_PLUS, OPT_fcprop_registers, NULL, 1 },
568 { OPT_LEVELS_1_PLUS, OPT_fdefer_pop, NULL, 1 },
569 { OPT_LEVELS_1_PLUS, OPT_fforward_propagate, NULL, 1 },
570 { OPT_LEVELS_1_PLUS, OPT_fguess_branch_probability, NULL, 1 },
571 { OPT_LEVELS_1_PLUS, OPT_fipa_profile, NULL, 1 },
572 { OPT_LEVELS_1_PLUS, OPT_fipa_pure_const, NULL, 1 },
573 { OPT_LEVELS_1_PLUS, OPT_fipa_reference, NULL, 1 },
574 { OPT_LEVELS_1_PLUS, OPT_fipa_reference_addressable, NULL, 1 },
575 { OPT_LEVELS_1_PLUS, OPT_fmerge_constants, NULL, 1 },
576 { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
577 { OPT_LEVELS_1_PLUS, OPT_freorder_blocks, NULL, 1 },
578 { OPT_LEVELS_1_PLUS, OPT_fshrink_wrap, NULL, 1 },
579 { OPT_LEVELS_1_PLUS, OPT_fsplit_wide_types, NULL, 1 },
580 { OPT_LEVELS_1_PLUS, OPT_fthread_jumps, NULL, 1 },
581 { OPT_LEVELS_1_PLUS, OPT_ftree_builtin_call_dce, NULL, 1 },
582 { OPT_LEVELS_1_PLUS, OPT_ftree_ccp, NULL, 1 },
583 { OPT_LEVELS_1_PLUS, OPT_ftree_ch, NULL, 1 },
584 { OPT_LEVELS_1_PLUS, OPT_ftree_coalesce_vars, NULL, 1 },
585 { OPT_LEVELS_1_PLUS, OPT_ftree_copy_prop, NULL, 1 },
586 { OPT_LEVELS_1_PLUS, OPT_ftree_dce, NULL, 1 },
587 { OPT_LEVELS_1_PLUS, OPT_ftree_dominator_opts, NULL, 1 },
588 { OPT_LEVELS_1_PLUS, OPT_ftree_fre, NULL, 1 },
589 { OPT_LEVELS_1_PLUS, OPT_ftree_sink, NULL, 1 },
590 { OPT_LEVELS_1_PLUS, OPT_ftree_slsr, NULL, 1 },
591 { OPT_LEVELS_1_PLUS, OPT_ftree_ter, NULL, 1 },
592 { OPT_LEVELS_1_PLUS, OPT_fvar_tracking, NULL, 1 },
594 /* -O1 (and not -Og) optimizations. */
595 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fbranch_count_reg, NULL, 1 },
596 #if DELAY_SLOTS
597 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fdelayed_branch, NULL, 1 },
598 #endif
599 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fdse, NULL, 1 },
600 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fif_conversion, NULL, 1 },
601 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fif_conversion2, NULL, 1 },
602 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_finline_functions_called_once, NULL, 1 },
603 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fmove_loop_invariants, NULL, 1 },
604 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fmove_loop_stores, NULL, 1 },
605 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fssa_phiopt, NULL, 1 },
606 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fipa_modref, NULL, 1 },
607 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_bit_ccp, NULL, 1 },
608 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_dse, NULL, 1 },
609 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_pta, NULL, 1 },
610 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_sra, NULL, 1 },
612 /* -O2 and -Os optimizations. */
613 { OPT_LEVELS_2_PLUS, OPT_fcaller_saves, NULL, 1 },
614 { OPT_LEVELS_2_PLUS, OPT_fcode_hoisting, NULL, 1 },
615 { OPT_LEVELS_2_PLUS, OPT_fcrossjumping, NULL, 1 },
616 { OPT_LEVELS_2_PLUS, OPT_fcse_follow_jumps, NULL, 1 },
617 { OPT_LEVELS_2_PLUS, OPT_fdevirtualize, NULL, 1 },
618 { OPT_LEVELS_2_PLUS, OPT_fdevirtualize_speculatively, NULL, 1 },
619 { OPT_LEVELS_2_PLUS, OPT_fexpensive_optimizations, NULL, 1 },
620 { OPT_LEVELS_2_PLUS, OPT_fgcse, NULL, 1 },
621 { OPT_LEVELS_2_PLUS, OPT_fhoist_adjacent_loads, NULL, 1 },
622 { OPT_LEVELS_2_PLUS, OPT_findirect_inlining, NULL, 1 },
623 { OPT_LEVELS_2_PLUS, OPT_finline_small_functions, NULL, 1 },
624 { OPT_LEVELS_2_PLUS, OPT_fipa_bit_cp, NULL, 1 },
625 { OPT_LEVELS_2_PLUS, OPT_fipa_cp, NULL, 1 },
626 { OPT_LEVELS_2_PLUS, OPT_fipa_icf, NULL, 1 },
627 { OPT_LEVELS_2_PLUS, OPT_fipa_ra, NULL, 1 },
628 { OPT_LEVELS_2_PLUS, OPT_fipa_sra, NULL, 1 },
629 { OPT_LEVELS_2_PLUS, OPT_fipa_vrp, NULL, 1 },
630 { OPT_LEVELS_2_PLUS, OPT_fisolate_erroneous_paths_dereference, NULL, 1 },
631 { OPT_LEVELS_2_PLUS, OPT_flra_remat, NULL, 1 },
632 { OPT_LEVELS_2_PLUS, OPT_foptimize_sibling_calls, NULL, 1 },
633 { OPT_LEVELS_2_PLUS, OPT_fpartial_inlining, NULL, 1 },
634 { OPT_LEVELS_2_PLUS, OPT_fpeephole2, NULL, 1 },
635 { OPT_LEVELS_2_PLUS, OPT_freorder_functions, NULL, 1 },
636 { OPT_LEVELS_2_PLUS, OPT_frerun_cse_after_loop, NULL, 1 },
637 #ifdef INSN_SCHEDULING
638 { OPT_LEVELS_2_PLUS, OPT_fschedule_insns2, NULL, 1 },
639 #endif
640 { OPT_LEVELS_2_PLUS, OPT_fstrict_aliasing, NULL, 1 },
641 { OPT_LEVELS_2_PLUS, OPT_fstore_merging, NULL, 1 },
642 { OPT_LEVELS_2_PLUS, OPT_ftree_pre, NULL, 1 },
643 { OPT_LEVELS_2_PLUS, OPT_ftree_switch_conversion, NULL, 1 },
644 { OPT_LEVELS_2_PLUS, OPT_ftree_tail_merge, NULL, 1 },
645 { OPT_LEVELS_2_PLUS, OPT_ftree_vrp, NULL, 1 },
646 { OPT_LEVELS_2_PLUS, OPT_fvect_cost_model_, NULL,
647 VECT_COST_MODEL_VERY_CHEAP },
648 { OPT_LEVELS_2_PLUS, OPT_finline_functions, NULL, 1 },
649 { OPT_LEVELS_2_PLUS, OPT_ftree_loop_distribute_patterns, NULL, 1 },
651 /* -O2 and above optimizations, but not -Os or -Og. */
652 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_falign_functions, NULL, 1 },
653 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_falign_jumps, NULL, 1 },
654 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_falign_labels, NULL, 1 },
655 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_falign_loops, NULL, 1 },
656 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_foptimize_strlen, NULL, 1 },
657 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_freorder_blocks_algorithm_, NULL,
658 REORDER_BLOCKS_ALGORITHM_STC },
659 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_ftree_loop_vectorize, NULL, 1 },
660 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_ftree_slp_vectorize, NULL, 1 },
661 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_fopenmp_target_simd_clone_, NULL,
662 OMP_TARGET_SIMD_CLONE_NOHOST },
663 #ifdef INSN_SCHEDULING
664 /* Only run the pre-regalloc scheduling pass if optimizing for speed. */
665 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_fschedule_insns, NULL, 1 },
666 #endif
668 /* -O3 and -Os optimizations. */
670 /* -O3 optimizations. */
671 { OPT_LEVELS_3_PLUS, OPT_fgcse_after_reload, NULL, 1 },
672 { OPT_LEVELS_3_PLUS, OPT_fipa_cp_clone, NULL, 1 },
673 { OPT_LEVELS_3_PLUS, OPT_floop_interchange, NULL, 1 },
674 { OPT_LEVELS_3_PLUS, OPT_floop_unroll_and_jam, NULL, 1 },
675 { OPT_LEVELS_3_PLUS, OPT_fpeel_loops, NULL, 1 },
676 { OPT_LEVELS_3_PLUS, OPT_fpredictive_commoning, NULL, 1 },
677 { OPT_LEVELS_3_PLUS, OPT_fsplit_loops, NULL, 1 },
678 { OPT_LEVELS_3_PLUS, OPT_fsplit_paths, NULL, 1 },
679 { OPT_LEVELS_3_PLUS, OPT_ftree_loop_distribution, NULL, 1 },
680 { OPT_LEVELS_3_PLUS, OPT_ftree_partial_pre, NULL, 1 },
681 { OPT_LEVELS_3_PLUS, OPT_funswitch_loops, NULL, 1 },
682 { OPT_LEVELS_3_PLUS, OPT_fvect_cost_model_, NULL, VECT_COST_MODEL_DYNAMIC },
683 { OPT_LEVELS_3_PLUS, OPT_fversion_loops_for_strides, NULL, 1 },
685 /* -O3 parameters. */
686 { OPT_LEVELS_3_PLUS, OPT__param_max_inline_insns_auto_, NULL, 30 },
687 { OPT_LEVELS_3_PLUS, OPT__param_early_inlining_insns_, NULL, 14 },
688 { OPT_LEVELS_3_PLUS, OPT__param_inline_heuristics_hint_percent_, NULL, 600 },
689 { OPT_LEVELS_3_PLUS, OPT__param_inline_min_speedup_, NULL, 15 },
690 { OPT_LEVELS_3_PLUS, OPT__param_max_inline_insns_single_, NULL, 200 },
692 /* -Ofast adds optimizations to -O3. */
693 { OPT_LEVELS_FAST, OPT_ffast_math, NULL, 1 },
694 { OPT_LEVELS_FAST, OPT_fallow_store_data_races, NULL, 1 },
695 { OPT_LEVELS_FAST, OPT_fsemantic_interposition, NULL, 0 },
697 { OPT_LEVELS_NONE, 0, NULL, 0 }
700 /* Default the options in OPTS and OPTS_SET based on the optimization
701 settings in DECODED_OPTIONS and DECODED_OPTIONS_COUNT. */
702 void
703 default_options_optimization (struct gcc_options *opts,
704 struct gcc_options *opts_set,
705 struct cl_decoded_option *decoded_options,
706 unsigned int decoded_options_count,
707 location_t loc,
708 unsigned int lang_mask,
709 const struct cl_option_handlers *handlers,
710 diagnostic_context *dc)
712 unsigned int i;
713 int opt2;
714 bool openacc_mode = false;
716 /* Scan to see what optimization level has been specified. That will
717 determine the default value of many flags. */
718 for (i = 1; i < decoded_options_count; i++)
720 struct cl_decoded_option *opt = &decoded_options[i];
721 switch (opt->opt_index)
723 case OPT_O:
724 if (*opt->arg == '\0')
726 opts->x_optimize = 1;
727 opts->x_optimize_size = 0;
728 opts->x_optimize_fast = 0;
729 opts->x_optimize_debug = 0;
731 else
733 const int optimize_val = integral_argument (opt->arg);
734 if (optimize_val == -1)
735 error_at (loc, "argument to %<-O%> should be a non-negative "
736 "integer, %<g%>, %<s%>, %<z%> or %<fast%>");
737 else
739 opts->x_optimize = optimize_val;
740 if ((unsigned int) opts->x_optimize > 255)
741 opts->x_optimize = 255;
742 opts->x_optimize_size = 0;
743 opts->x_optimize_fast = 0;
744 opts->x_optimize_debug = 0;
747 break;
749 case OPT_Os:
750 opts->x_optimize_size = 1;
752 /* Optimizing for size forces optimize to be 2. */
753 opts->x_optimize = 2;
754 opts->x_optimize_fast = 0;
755 opts->x_optimize_debug = 0;
756 break;
758 case OPT_Oz:
759 opts->x_optimize_size = 2;
761 /* Optimizing for size forces optimize to be 2. */
762 opts->x_optimize = 2;
763 opts->x_optimize_fast = 0;
764 opts->x_optimize_debug = 0;
765 break;
767 case OPT_Ofast:
768 /* -Ofast only adds flags to -O3. */
769 opts->x_optimize_size = 0;
770 opts->x_optimize = 3;
771 opts->x_optimize_fast = 1;
772 opts->x_optimize_debug = 0;
773 break;
775 case OPT_Og:
776 /* -Og selects optimization level 1. */
777 opts->x_optimize_size = 0;
778 opts->x_optimize = 1;
779 opts->x_optimize_fast = 0;
780 opts->x_optimize_debug = 1;
781 break;
783 case OPT_fopenacc:
784 if (opt->value)
785 openacc_mode = true;
786 break;
788 default:
789 /* Ignore other options in this prescan. */
790 break;
794 maybe_default_options (opts, opts_set, default_options_table,
795 opts->x_optimize, opts->x_optimize_size,
796 opts->x_optimize_fast, opts->x_optimize_debug,
797 lang_mask, handlers, loc, dc);
799 /* -O2 param settings. */
800 opt2 = (opts->x_optimize >= 2);
802 if (openacc_mode)
803 SET_OPTION_IF_UNSET (opts, opts_set, flag_ipa_pta, true);
805 /* Track fields in field-sensitive alias analysis. */
806 if (opt2)
807 SET_OPTION_IF_UNSET (opts, opts_set, param_max_fields_for_field_sensitive,
808 100);
810 if (opts->x_optimize_size)
811 /* We want to crossjump as much as possible. */
812 SET_OPTION_IF_UNSET (opts, opts_set, param_min_crossjump_insns, 1);
814 /* Restrict the amount of work combine does at -Og while retaining
815 most of its useful transforms. */
816 if (opts->x_optimize_debug)
817 SET_OPTION_IF_UNSET (opts, opts_set, param_max_combine_insns, 2);
819 /* Allow default optimizations to be specified on a per-machine basis. */
820 maybe_default_options (opts, opts_set,
821 targetm_common.option_optimization_table,
822 opts->x_optimize, opts->x_optimize_size,
823 opts->x_optimize_fast, opts->x_optimize_debug,
824 lang_mask, handlers, loc, dc);
827 /* Control IPA optimizations based on different live patching LEVEL. */
828 static void
829 control_options_for_live_patching (struct gcc_options *opts,
830 struct gcc_options *opts_set,
831 enum live_patching_level level,
832 location_t loc)
834 gcc_assert (level > LIVE_PATCHING_NONE);
836 switch (level)
838 case LIVE_PATCHING_INLINE_ONLY_STATIC:
839 #define LIVE_PATCHING_OPTION "-flive-patching=inline-only-static"
840 if (opts_set->x_flag_ipa_cp_clone && opts->x_flag_ipa_cp_clone)
841 error_at (loc, "%qs is incompatible with %qs",
842 "-fipa-cp-clone", LIVE_PATCHING_OPTION);
843 else
844 opts->x_flag_ipa_cp_clone = 0;
846 if (opts_set->x_flag_ipa_sra && opts->x_flag_ipa_sra)
847 error_at (loc, "%qs is incompatible with %qs",
848 "-fipa-sra", LIVE_PATCHING_OPTION);
849 else
850 opts->x_flag_ipa_sra = 0;
852 if (opts_set->x_flag_partial_inlining && opts->x_flag_partial_inlining)
853 error_at (loc, "%qs is incompatible with %qs",
854 "-fpartial-inlining", LIVE_PATCHING_OPTION);
855 else
856 opts->x_flag_partial_inlining = 0;
858 if (opts_set->x_flag_ipa_cp && opts->x_flag_ipa_cp)
859 error_at (loc, "%qs is incompatible with %qs",
860 "-fipa-cp", LIVE_PATCHING_OPTION);
861 else
862 opts->x_flag_ipa_cp = 0;
864 /* FALLTHROUGH. */
865 case LIVE_PATCHING_INLINE_CLONE:
866 #undef LIVE_PATCHING_OPTION
867 #define LIVE_PATCHING_OPTION "-flive-patching=inline-only-static|inline-clone"
868 /* live patching should disable whole-program optimization. */
869 if (opts_set->x_flag_whole_program && opts->x_flag_whole_program)
870 error_at (loc, "%qs is incompatible with %qs",
871 "-fwhole-program", LIVE_PATCHING_OPTION);
872 else
873 opts->x_flag_whole_program = 0;
875 /* visibility change should be excluded by !flag_whole_program
876 && !in_lto_p && !flag_ipa_cp_clone && !flag_ipa_sra
877 && !flag_partial_inlining. */
879 if (opts_set->x_flag_ipa_pta && opts->x_flag_ipa_pta)
880 error_at (loc, "%qs is incompatible with %qs",
881 "-fipa-pta", LIVE_PATCHING_OPTION);
882 else
883 opts->x_flag_ipa_pta = 0;
885 if (opts_set->x_flag_ipa_reference && opts->x_flag_ipa_reference)
886 error_at (loc, "%qs is incompatible with %qs",
887 "-fipa-reference", LIVE_PATCHING_OPTION);
888 else
889 opts->x_flag_ipa_reference = 0;
891 if (opts_set->x_flag_ipa_ra && opts->x_flag_ipa_ra)
892 error_at (loc, "%qs is incompatible with %qs",
893 "-fipa-ra", LIVE_PATCHING_OPTION);
894 else
895 opts->x_flag_ipa_ra = 0;
897 if (opts_set->x_flag_ipa_icf && opts->x_flag_ipa_icf)
898 error_at (loc, "%qs is incompatible with %qs",
899 "-fipa-icf", LIVE_PATCHING_OPTION);
900 else
901 opts->x_flag_ipa_icf = 0;
903 if (opts_set->x_flag_ipa_icf_functions && opts->x_flag_ipa_icf_functions)
904 error_at (loc, "%qs is incompatible with %qs",
905 "-fipa-icf-functions", LIVE_PATCHING_OPTION);
906 else
907 opts->x_flag_ipa_icf_functions = 0;
909 if (opts_set->x_flag_ipa_icf_variables && opts->x_flag_ipa_icf_variables)
910 error_at (loc, "%qs is incompatible with %qs",
911 "-fipa-icf-variables", LIVE_PATCHING_OPTION);
912 else
913 opts->x_flag_ipa_icf_variables = 0;
915 if (opts_set->x_flag_ipa_bit_cp && opts->x_flag_ipa_bit_cp)
916 error_at (loc, "%qs is incompatible with %qs",
917 "-fipa-bit-cp", LIVE_PATCHING_OPTION);
918 else
919 opts->x_flag_ipa_bit_cp = 0;
921 if (opts_set->x_flag_ipa_vrp && opts->x_flag_ipa_vrp)
922 error_at (loc, "%qs is incompatible with %qs",
923 "-fipa-vrp", LIVE_PATCHING_OPTION);
924 else
925 opts->x_flag_ipa_vrp = 0;
927 if (opts_set->x_flag_ipa_pure_const && opts->x_flag_ipa_pure_const)
928 error_at (loc, "%qs is incompatible with %qs",
929 "-fipa-pure-const", LIVE_PATCHING_OPTION);
930 else
931 opts->x_flag_ipa_pure_const = 0;
933 if (opts_set->x_flag_ipa_modref && opts->x_flag_ipa_modref)
934 error_at (loc,
935 "%<-fipa-modref%> is incompatible with %qs",
936 LIVE_PATCHING_OPTION);
937 else
938 opts->x_flag_ipa_modref = 0;
940 /* FIXME: disable unreachable code removal. */
942 /* discovery of functions/variables with no address taken. */
943 if (opts_set->x_flag_ipa_reference_addressable
944 && opts->x_flag_ipa_reference_addressable)
945 error_at (loc, "%qs is incompatible with %qs",
946 "-fipa-reference-addressable", LIVE_PATCHING_OPTION);
947 else
948 opts->x_flag_ipa_reference_addressable = 0;
950 /* ipa stack alignment propagation. */
951 if (opts_set->x_flag_ipa_stack_alignment
952 && opts->x_flag_ipa_stack_alignment)
953 error_at (loc, "%qs is incompatible with %qs",
954 "-fipa-stack-alignment", LIVE_PATCHING_OPTION);
955 else
956 opts->x_flag_ipa_stack_alignment = 0;
957 break;
958 default:
959 gcc_unreachable ();
962 #undef LIVE_PATCHING_OPTION
965 /* --help option argument if set. */
966 vec<const char *> help_option_arguments;
968 /* Return the string name describing a sanitizer argument which has been
969 provided on the command line and has set this particular flag. */
970 const char *
971 find_sanitizer_argument (struct gcc_options *opts, unsigned int flags)
973 for (int i = 0; sanitizer_opts[i].name != NULL; ++i)
975 /* Need to find the sanitizer_opts element which:
976 a) Could have set the flags requested.
977 b) Has been set on the command line.
979 Can have (a) without (b) if the flag requested is e.g.
980 SANITIZE_ADDRESS, since both -fsanitize=address and
981 -fsanitize=kernel-address set this flag.
983 Can have (b) without (a) by requesting more than one sanitizer on the
984 command line. */
985 if ((sanitizer_opts[i].flag & opts->x_flag_sanitize)
986 != sanitizer_opts[i].flag)
987 continue;
988 if ((sanitizer_opts[i].flag & flags) != flags)
989 continue;
990 return sanitizer_opts[i].name;
992 return NULL;
996 /* Report an error to the user about sanitizer options they have requested
997 which have set conflicting flags.
999 LEFT and RIGHT indicate sanitizer flags which conflict with each other, this
1000 function reports an error if both have been set in OPTS->x_flag_sanitize and
1001 ensures the error identifies the requested command line options that have
1002 set these flags. */
1003 static void
1004 report_conflicting_sanitizer_options (struct gcc_options *opts, location_t loc,
1005 unsigned int left, unsigned int right)
1007 unsigned int left_seen = (opts->x_flag_sanitize & left);
1008 unsigned int right_seen = (opts->x_flag_sanitize & right);
1009 if (left_seen && right_seen)
1011 const char* left_arg = find_sanitizer_argument (opts, left_seen);
1012 const char* right_arg = find_sanitizer_argument (opts, right_seen);
1013 gcc_assert (left_arg && right_arg);
1014 error_at (loc,
1015 "%<-fsanitize=%s%> is incompatible with %<-fsanitize=%s%>",
1016 left_arg, right_arg);
1020 /* After all options at LOC have been read into OPTS and OPTS_SET,
1021 finalize settings of those options and diagnose incompatible
1022 combinations. */
1023 void
1024 finish_options (struct gcc_options *opts, struct gcc_options *opts_set,
1025 location_t loc)
1027 if (opts->x_dump_base_name
1028 && ! opts->x_dump_base_name_prefixed)
1030 const char *sep = opts->x_dump_base_name;
1032 for (; *sep; sep++)
1033 if (IS_DIR_SEPARATOR (*sep))
1034 break;
1036 if (*sep)
1037 /* If dump_base_path contains subdirectories, don't prepend
1038 anything. */;
1039 else if (opts->x_dump_dir_name)
1040 /* We have a DUMP_DIR_NAME, prepend that. */
1041 opts->x_dump_base_name = opts_concat (opts->x_dump_dir_name,
1042 opts->x_dump_base_name, NULL);
1044 /* It is definitely prefixed now. */
1045 opts->x_dump_base_name_prefixed = true;
1048 /* Handle related options for unit-at-a-time, toplevel-reorder, and
1049 section-anchors. */
1050 if (!opts->x_flag_unit_at_a_time)
1052 if (opts->x_flag_section_anchors && opts_set->x_flag_section_anchors)
1053 error_at (loc, "section anchors must be disabled when unit-at-a-time "
1054 "is disabled");
1055 opts->x_flag_section_anchors = 0;
1056 if (opts->x_flag_toplevel_reorder == 1)
1057 error_at (loc, "toplevel reorder must be disabled when unit-at-a-time "
1058 "is disabled");
1059 opts->x_flag_toplevel_reorder = 0;
1062 /* -fself-test depends on the state of the compiler prior to
1063 compiling anything. Ideally it should be run on an empty source
1064 file. However, in case we get run with actual source, assume
1065 -fsyntax-only which will inhibit any compiler initialization
1066 which may confuse the self tests. */
1067 if (opts->x_flag_self_test)
1068 opts->x_flag_syntax_only = 1;
1070 if (opts->x_flag_tm && opts->x_flag_non_call_exceptions)
1071 sorry ("transactional memory is not supported with non-call exceptions");
1073 /* Unless the user has asked for section anchors, we disable toplevel
1074 reordering at -O0 to disable transformations that might be surprising
1075 to end users and to get -fno-toplevel-reorder tested. */
1076 if (!opts->x_optimize
1077 && opts->x_flag_toplevel_reorder == 2
1078 && !(opts->x_flag_section_anchors && opts_set->x_flag_section_anchors))
1080 opts->x_flag_toplevel_reorder = 0;
1081 opts->x_flag_section_anchors = 0;
1083 if (!opts->x_flag_toplevel_reorder)
1085 if (opts->x_flag_section_anchors && opts_set->x_flag_section_anchors)
1086 error_at (loc, "section anchors must be disabled when toplevel reorder"
1087 " is disabled");
1088 opts->x_flag_section_anchors = 0;
1091 if (!opts->x_flag_opts_finished)
1093 /* We initialize opts->x_flag_pie to -1 so that targets can set a
1094 default value. */
1095 if (opts->x_flag_pie == -1)
1097 /* We initialize opts->x_flag_pic to -1 so that we can tell if
1098 -fpic, -fPIC, -fno-pic or -fno-PIC is used. */
1099 if (opts->x_flag_pic == -1)
1100 opts->x_flag_pie = DEFAULT_FLAG_PIE;
1101 else
1102 opts->x_flag_pie = 0;
1104 /* If -fPIE or -fpie is used, turn on PIC. */
1105 if (opts->x_flag_pie)
1106 opts->x_flag_pic = opts->x_flag_pie;
1107 else if (opts->x_flag_pic == -1)
1108 opts->x_flag_pic = 0;
1109 if (opts->x_flag_pic && !opts->x_flag_pie)
1110 opts->x_flag_shlib = 1;
1111 opts->x_flag_opts_finished = true;
1114 /* We initialize opts->x_flag_stack_protect to -1 so that targets
1115 can set a default value. */
1116 if (opts->x_flag_stack_protect == -1)
1117 opts->x_flag_stack_protect = DEFAULT_FLAG_SSP;
1119 if (opts->x_optimize == 0)
1121 /* Inlining does not work if not optimizing,
1122 so force it not to be done. */
1123 opts->x_warn_inline = 0;
1124 opts->x_flag_no_inline = 1;
1127 /* At -O0 or -Og, turn __builtin_unreachable into a trap. */
1128 if (!opts->x_optimize || opts->x_optimize_debug)
1129 SET_OPTION_IF_UNSET (opts, opts_set, flag_unreachable_traps, true);
1131 /* Pipelining of outer loops is only possible when general pipelining
1132 capabilities are requested. */
1133 if (!opts->x_flag_sel_sched_pipelining)
1134 opts->x_flag_sel_sched_pipelining_outer_loops = 0;
1136 if (opts->x_flag_conserve_stack)
1138 SET_OPTION_IF_UNSET (opts, opts_set, param_large_stack_frame, 100);
1139 SET_OPTION_IF_UNSET (opts, opts_set, param_stack_frame_growth, 40);
1142 if (opts->x_flag_lto)
1144 #ifdef ENABLE_LTO
1145 opts->x_flag_generate_lto = 1;
1147 /* When generating IL, do not operate in whole-program mode.
1148 Otherwise, symbols will be privatized too early, causing link
1149 errors later. */
1150 opts->x_flag_whole_program = 0;
1151 #else
1152 error_at (loc, "LTO support has not been enabled in this configuration");
1153 #endif
1154 if (!opts->x_flag_fat_lto_objects
1155 && (!HAVE_LTO_PLUGIN
1156 || (opts_set->x_flag_use_linker_plugin
1157 && !opts->x_flag_use_linker_plugin)))
1159 if (opts_set->x_flag_fat_lto_objects)
1160 error_at (loc, "%<-fno-fat-lto-objects%> are supported only with "
1161 "linker plugin");
1162 opts->x_flag_fat_lto_objects = 1;
1165 /* -gsplit-dwarf isn't compatible with LTO, see PR88389. */
1166 if (opts->x_dwarf_split_debug_info)
1168 inform (loc, "%<-gsplit-dwarf%> is not supported with LTO,"
1169 " disabling");
1170 opts->x_dwarf_split_debug_info = 0;
1174 /* We initialize opts->x_flag_split_stack to -1 so that targets can set a
1175 default value if they choose based on other options. */
1176 if (opts->x_flag_split_stack == -1)
1177 opts->x_flag_split_stack = 0;
1178 else if (opts->x_flag_split_stack)
1180 if (!targetm_common.supports_split_stack (true, opts))
1182 error_at (loc, "%<-fsplit-stack%> is not supported by "
1183 "this compiler configuration");
1184 opts->x_flag_split_stack = 0;
1188 /* If stack splitting is turned on, and the user did not explicitly
1189 request function partitioning, turn off partitioning, as it
1190 confuses the linker when trying to handle partitioned split-stack
1191 code that calls a non-split-stack functions. But if partitioning
1192 was turned on explicitly just hope for the best. */
1193 if (opts->x_flag_split_stack
1194 && opts->x_flag_reorder_blocks_and_partition)
1195 SET_OPTION_IF_UNSET (opts, opts_set, flag_reorder_blocks_and_partition, 0);
1197 if (opts->x_flag_reorder_blocks_and_partition)
1198 SET_OPTION_IF_UNSET (opts, opts_set, flag_reorder_functions, 1);
1200 /* The -gsplit-dwarf option requires -ggnu-pubnames. */
1201 if (opts->x_dwarf_split_debug_info)
1202 opts->x_debug_generate_pub_sections = 2;
1204 if ((opts->x_flag_sanitize
1205 & (SANITIZE_USER_ADDRESS | SANITIZE_KERNEL_ADDRESS)) == 0)
1207 if (opts->x_flag_sanitize & SANITIZE_POINTER_COMPARE)
1208 error_at (loc,
1209 "%<-fsanitize=pointer-compare%> must be combined with "
1210 "%<-fsanitize=address%> or %<-fsanitize=kernel-address%>");
1211 if (opts->x_flag_sanitize & SANITIZE_POINTER_SUBTRACT)
1212 error_at (loc,
1213 "%<-fsanitize=pointer-subtract%> must be combined with "
1214 "%<-fsanitize=address%> or %<-fsanitize=kernel-address%>");
1217 /* Address sanitizers conflict with the thread sanitizer. */
1218 report_conflicting_sanitizer_options (opts, loc, SANITIZE_THREAD,
1219 SANITIZE_ADDRESS);
1220 report_conflicting_sanitizer_options (opts, loc, SANITIZE_THREAD,
1221 SANITIZE_HWADDRESS);
1222 /* The leak sanitizer conflicts with the thread sanitizer. */
1223 report_conflicting_sanitizer_options (opts, loc, SANITIZE_LEAK,
1224 SANITIZE_THREAD);
1226 /* No combination of HWASAN and ASAN work together. */
1227 report_conflicting_sanitizer_options (opts, loc,
1228 SANITIZE_HWADDRESS, SANITIZE_ADDRESS);
1230 /* The userspace and kernel address sanitizers conflict with each other. */
1231 report_conflicting_sanitizer_options (opts, loc, SANITIZE_USER_HWADDRESS,
1232 SANITIZE_KERNEL_HWADDRESS);
1233 report_conflicting_sanitizer_options (opts, loc, SANITIZE_USER_ADDRESS,
1234 SANITIZE_KERNEL_ADDRESS);
1236 /* Check error recovery for -fsanitize-recover option. */
1237 for (int i = 0; sanitizer_opts[i].name != NULL; ++i)
1238 if ((opts->x_flag_sanitize_recover & sanitizer_opts[i].flag)
1239 && !sanitizer_opts[i].can_recover)
1240 error_at (loc, "%<-fsanitize-recover=%s%> is not supported",
1241 sanitizer_opts[i].name);
1243 /* Check -fsanitize-trap option. */
1244 for (int i = 0; sanitizer_opts[i].name != NULL; ++i)
1245 if ((opts->x_flag_sanitize_trap & sanitizer_opts[i].flag)
1246 && !sanitizer_opts[i].can_trap
1247 /* Allow -fsanitize-trap=all or -fsanitize-trap=undefined
1248 to set flag_sanitize_trap & SANITIZE_VPTR bit which will
1249 effectively disable -fsanitize=vptr, just disallow
1250 explicit -fsanitize-trap=vptr. */
1251 && sanitizer_opts[i].flag != SANITIZE_VPTR)
1252 error_at (loc, "%<-fsanitize-trap=%s%> is not supported",
1253 sanitizer_opts[i].name);
1255 /* When instrumenting the pointers, we don't want to remove
1256 the null pointer checks. */
1257 if (opts->x_flag_sanitize & (SANITIZE_NULL | SANITIZE_NONNULL_ATTRIBUTE
1258 | SANITIZE_RETURNS_NONNULL_ATTRIBUTE))
1259 opts->x_flag_delete_null_pointer_checks = 0;
1261 /* Aggressive compiler optimizations may cause false negatives. */
1262 if (opts->x_flag_sanitize & ~(SANITIZE_LEAK | SANITIZE_UNREACHABLE))
1263 opts->x_flag_aggressive_loop_optimizations = 0;
1265 /* Enable -fsanitize-address-use-after-scope if either address sanitizer is
1266 enabled. */
1267 if (opts->x_flag_sanitize
1268 & (SANITIZE_USER_ADDRESS | SANITIZE_USER_HWADDRESS))
1269 SET_OPTION_IF_UNSET (opts, opts_set, flag_sanitize_address_use_after_scope,
1270 true);
1272 /* Force -fstack-reuse=none in case -fsanitize-address-use-after-scope
1273 is enabled. */
1274 if (opts->x_flag_sanitize_address_use_after_scope)
1276 if (opts->x_flag_stack_reuse != SR_NONE
1277 && opts_set->x_flag_stack_reuse != SR_NONE)
1278 error_at (loc,
1279 "%<-fsanitize-address-use-after-scope%> requires "
1280 "%<-fstack-reuse=none%> option");
1282 opts->x_flag_stack_reuse = SR_NONE;
1285 if ((opts->x_flag_sanitize & SANITIZE_USER_ADDRESS) && opts->x_flag_tm)
1286 sorry ("transactional memory is not supported with %<-fsanitize=address%>");
1288 if ((opts->x_flag_sanitize & SANITIZE_KERNEL_ADDRESS) && opts->x_flag_tm)
1289 sorry ("transactional memory is not supported with "
1290 "%<-fsanitize=kernel-address%>");
1292 /* Currently live patching is not support for LTO. */
1293 if (opts->x_flag_live_patching == LIVE_PATCHING_INLINE_ONLY_STATIC && opts->x_flag_lto)
1294 sorry ("live patching (with %qs) is not supported with LTO",
1295 "inline-only-static");
1297 /* Currently vtable verification is not supported for LTO */
1298 if (opts->x_flag_vtable_verify && opts->x_flag_lto)
1299 sorry ("vtable verification is not supported with LTO");
1301 /* Control IPA optimizations based on different -flive-patching level. */
1302 if (opts->x_flag_live_patching)
1303 control_options_for_live_patching (opts, opts_set,
1304 opts->x_flag_live_patching,
1305 loc);
1307 /* Allow cunroll to grow size accordingly. */
1308 if (!opts_set->x_flag_cunroll_grow_size)
1309 opts->x_flag_cunroll_grow_size
1310 = (opts->x_flag_unroll_loops
1311 || opts->x_flag_peel_loops
1312 || opts->x_optimize >= 3);
1314 /* With -fcx-limited-range, we do cheap and quick complex arithmetic. */
1315 if (opts->x_flag_cx_limited_range)
1316 opts->x_flag_complex_method = 0;
1317 else if (opts_set->x_flag_cx_limited_range)
1318 opts->x_flag_complex_method = opts->x_flag_default_complex_method;
1320 /* With -fcx-fortran-rules, we do something in-between cheap and C99. */
1321 if (opts->x_flag_cx_fortran_rules)
1322 opts->x_flag_complex_method = 1;
1323 else if (opts_set->x_flag_cx_fortran_rules)
1324 opts->x_flag_complex_method = opts->x_flag_default_complex_method;
1326 /* Use -fvect-cost-model=cheap instead of -fvect-cost-mode=very-cheap
1327 by default with explicit -ftree-{loop,slp}-vectorize. */
1328 if (opts->x_optimize == 2
1329 && (opts_set->x_flag_tree_loop_vectorize
1330 || opts_set->x_flag_tree_vectorize))
1331 SET_OPTION_IF_UNSET (opts, opts_set, flag_vect_cost_model,
1332 VECT_COST_MODEL_CHEAP);
1334 if (opts->x_flag_gtoggle)
1336 /* Make sure to process -gtoggle only once. */
1337 opts->x_flag_gtoggle = false;
1338 if (opts->x_debug_info_level == DINFO_LEVEL_NONE)
1340 opts->x_debug_info_level = DINFO_LEVEL_NORMAL;
1342 if (opts->x_write_symbols == NO_DEBUG)
1343 opts->x_write_symbols = PREFERRED_DEBUGGING_TYPE;
1345 else
1346 opts->x_debug_info_level = DINFO_LEVEL_NONE;
1349 if (!opts_set->x_debug_nonbind_markers_p)
1350 opts->x_debug_nonbind_markers_p
1351 = (opts->x_optimize
1352 && opts->x_debug_info_level >= DINFO_LEVEL_NORMAL
1353 && dwarf_debuginfo_p (opts)
1354 && !(opts->x_flag_selective_scheduling
1355 || opts->x_flag_selective_scheduling2));
1357 /* We know which debug output will be used so we can set flag_var_tracking
1358 and flag_var_tracking_uninit if the user has not specified them. */
1359 if (opts->x_debug_info_level < DINFO_LEVEL_NORMAL
1360 || !dwarf_debuginfo_p (opts)
1361 /* We have not yet initialized debug hooks so match that to check
1362 whether we're only doing DWARF2_LINENO_DEBUGGING_INFO. */
1363 #ifndef DWARF2_DEBUGGING_INFO
1364 || true
1365 #endif
1368 if ((opts_set->x_flag_var_tracking && opts->x_flag_var_tracking == 1)
1369 || (opts_set->x_flag_var_tracking_uninit
1370 && opts->x_flag_var_tracking_uninit == 1))
1372 if (opts->x_debug_info_level < DINFO_LEVEL_NORMAL)
1373 warning_at (UNKNOWN_LOCATION, 0,
1374 "variable tracking requested, but useless unless "
1375 "producing debug info");
1376 else
1377 warning_at (UNKNOWN_LOCATION, 0,
1378 "variable tracking requested, but not supported "
1379 "by this debug format");
1381 opts->x_flag_var_tracking = 0;
1382 opts->x_flag_var_tracking_uninit = 0;
1385 /* One could use EnabledBy, but it would lead to a circular dependency. */
1386 if (!opts_set->x_flag_var_tracking_uninit)
1387 opts->x_flag_var_tracking_uninit = opts->x_flag_var_tracking;
1389 if (!opts_set->x_flag_var_tracking_assignments)
1390 opts->x_flag_var_tracking_assignments
1391 = (opts->x_flag_var_tracking
1392 && !(opts->x_flag_selective_scheduling
1393 || opts->x_flag_selective_scheduling2));
1395 if (opts->x_flag_var_tracking_assignments_toggle)
1396 opts->x_flag_var_tracking_assignments
1397 = !opts->x_flag_var_tracking_assignments;
1399 if (opts->x_flag_var_tracking_assignments && !opts->x_flag_var_tracking)
1400 opts->x_flag_var_tracking = opts->x_flag_var_tracking_assignments = -1;
1402 if (opts->x_flag_var_tracking_assignments
1403 && (opts->x_flag_selective_scheduling
1404 || opts->x_flag_selective_scheduling2))
1405 warning_at (loc, 0,
1406 "var-tracking-assignments changes selective scheduling");
1408 if (opts->x_flag_syntax_only)
1410 opts->x_write_symbols = NO_DEBUG;
1411 opts->x_profile_flag = 0;
1414 if (opts->x_warn_strict_flex_arrays)
1415 if (opts->x_flag_strict_flex_arrays == 0)
1417 opts->x_warn_strict_flex_arrays = 0;
1418 warning_at (UNKNOWN_LOCATION, 0,
1419 "%<-Wstrict-flex-arrays%> is ignored when"
1420 " %<-fstrict-flex-arrays%> is not present");
1423 diagnose_options (opts, opts_set, loc);
1426 /* The function diagnoses incompatible combinations for provided options
1427 (OPTS and OPTS_SET) at a given LOCation. The function is called both
1428 when command line is parsed (after the target optimization hook) and
1429 when an optimize/target attribute (or pragma) is used. */
1431 void diagnose_options (gcc_options *opts, gcc_options *opts_set,
1432 location_t loc)
1434 /* The optimization to partition hot and cold basic blocks into separate
1435 sections of the .o and executable files does not work (currently)
1436 with exception handling. This is because there is no support for
1437 generating unwind info. If opts->x_flag_exceptions is turned on
1438 we need to turn off the partitioning optimization. */
1440 enum unwind_info_type ui_except
1441 = targetm_common.except_unwind_info (opts);
1443 if (opts->x_flag_exceptions
1444 && opts->x_flag_reorder_blocks_and_partition
1445 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))
1447 if (opts_set->x_flag_reorder_blocks_and_partition)
1448 inform (loc,
1449 "%<-freorder-blocks-and-partition%> does not work "
1450 "with exceptions on this architecture");
1451 opts->x_flag_reorder_blocks_and_partition = 0;
1452 opts->x_flag_reorder_blocks = 1;
1455 /* If user requested unwind info, then turn off the partitioning
1456 optimization. */
1458 if (opts->x_flag_unwind_tables
1459 && !targetm_common.unwind_tables_default
1460 && opts->x_flag_reorder_blocks_and_partition
1461 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))
1463 if (opts_set->x_flag_reorder_blocks_and_partition)
1464 inform (loc,
1465 "%<-freorder-blocks-and-partition%> does not support "
1466 "unwind info on this architecture");
1467 opts->x_flag_reorder_blocks_and_partition = 0;
1468 opts->x_flag_reorder_blocks = 1;
1471 /* If the target requested unwind info, then turn off the partitioning
1472 optimization with a different message. Likewise, if the target does not
1473 support named sections. */
1475 if (opts->x_flag_reorder_blocks_and_partition
1476 && (!targetm_common.have_named_sections
1477 || (opts->x_flag_unwind_tables
1478 && targetm_common.unwind_tables_default
1479 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))))
1481 if (opts_set->x_flag_reorder_blocks_and_partition)
1482 inform (loc,
1483 "%<-freorder-blocks-and-partition%> does not work "
1484 "on this architecture");
1485 opts->x_flag_reorder_blocks_and_partition = 0;
1486 opts->x_flag_reorder_blocks = 1;
1492 #define LEFT_COLUMN 27
1494 /* Output ITEM, of length ITEM_WIDTH, in the left column,
1495 followed by word-wrapped HELP in a second column. */
1496 static void
1497 wrap_help (const char *help,
1498 const char *item,
1499 unsigned int item_width,
1500 unsigned int columns)
1502 unsigned int col_width = LEFT_COLUMN;
1503 unsigned int remaining, room, len;
1505 remaining = strlen (help);
1509 room = columns - 3 - MAX (col_width, item_width);
1510 if (room > columns)
1511 room = 0;
1512 len = remaining;
1514 if (room < len)
1516 unsigned int i;
1518 for (i = 0; help[i]; i++)
1520 if (i >= room && len != remaining)
1521 break;
1522 if (help[i] == ' ')
1523 len = i;
1524 else if ((help[i] == '-' || help[i] == '/')
1525 && help[i + 1] != ' '
1526 && i > 0 && ISALPHA (help[i - 1]))
1527 len = i + 1;
1531 printf (" %-*.*s %.*s\n", col_width, item_width, item, len, help);
1532 item_width = 0;
1533 while (help[len] == ' ')
1534 len++;
1535 help += len;
1536 remaining -= len;
1538 while (remaining);
1541 /* Data structure used to print list of valid option values. */
1543 class option_help_tuple
1545 public:
1546 option_help_tuple (int code, vec<const char *> values):
1547 m_code (code), m_values (values)
1550 /* Code of an option. */
1551 int m_code;
1553 /* List of possible values. */
1554 vec<const char *> m_values;
1557 /* Print help for a specific front-end, etc. */
1558 static void
1559 print_filtered_help (unsigned int include_flags,
1560 unsigned int exclude_flags,
1561 unsigned int any_flags,
1562 unsigned int columns,
1563 struct gcc_options *opts,
1564 unsigned int lang_mask)
1566 unsigned int i;
1567 const char *help;
1568 bool found = false;
1569 bool displayed = false;
1570 char new_help[256];
1572 if (!opts->x_help_printed)
1573 opts->x_help_printed = XCNEWVAR (char, cl_options_count);
1575 if (!opts->x_help_enum_printed)
1576 opts->x_help_enum_printed = XCNEWVAR (char, cl_enums_count);
1578 auto_vec<option_help_tuple> help_tuples;
1580 for (i = 0; i < cl_options_count; i++)
1582 const struct cl_option *option = cl_options + i;
1583 unsigned int len;
1584 const char *opt;
1585 const char *tab;
1587 if (include_flags == 0
1588 || ((option->flags & include_flags) != include_flags))
1590 if ((option->flags & any_flags) == 0)
1591 continue;
1594 /* Skip unwanted switches. */
1595 if ((option->flags & exclude_flags) != 0)
1596 continue;
1598 /* The driver currently prints its own help text. */
1599 if ((option->flags & CL_DRIVER) != 0
1600 && (option->flags & (((1U << cl_lang_count) - 1)
1601 | CL_COMMON | CL_TARGET)) == 0)
1602 continue;
1604 /* If an option contains a language specification,
1605 exclude it from common unless all languages are present. */
1606 if ((include_flags & CL_COMMON)
1607 && !(option->flags & CL_DRIVER)
1608 && (option->flags & CL_LANG_ALL)
1609 && (option->flags & CL_LANG_ALL) != CL_LANG_ALL)
1610 continue;
1612 found = true;
1613 /* Skip switches that have already been printed. */
1614 if (opts->x_help_printed[i])
1615 continue;
1617 opts->x_help_printed[i] = true;
1619 help = option->help;
1620 if (help == NULL)
1622 if (exclude_flags & CL_UNDOCUMENTED)
1623 continue;
1625 help = undocumented_msg;
1628 /* Get the translation. */
1629 help = _(help);
1631 if (option->alias_target < N_OPTS
1632 && cl_options [option->alias_target].help)
1634 const struct cl_option *target = cl_options + option->alias_target;
1635 if (option->help == NULL)
1637 /* The option is undocumented but is an alias for an option that
1638 is documented. If the option has alias arguments, then its
1639 purpose is to provide certain arguments to the other option, so
1640 inform the reader of this. Otherwise, point the reader to the
1641 other option in preference to the former. */
1643 if (option->alias_arg)
1645 if (option->neg_alias_arg)
1646 snprintf (new_help, sizeof new_help,
1647 _("Same as %s%s (or, in negated form, %s%s)."),
1648 target->opt_text, option->alias_arg,
1649 target->opt_text, option->neg_alias_arg);
1650 else
1651 snprintf (new_help, sizeof new_help,
1652 _("Same as %s%s."),
1653 target->opt_text, option->alias_arg);
1655 else
1656 snprintf (new_help, sizeof new_help,
1657 _("Same as %s."),
1658 target->opt_text);
1660 else
1662 /* For documented options with aliases, mention the aliased
1663 option's name for reference. */
1664 snprintf (new_help, sizeof new_help,
1665 _("%s Same as %s."),
1666 help, cl_options [option->alias_target].opt_text);
1669 help = new_help;
1672 if (option->warn_message)
1674 /* Mention that the use of the option will trigger a warning. */
1675 if (help == new_help)
1676 snprintf (new_help + strlen (new_help),
1677 sizeof new_help - strlen (new_help),
1678 " %s", _(use_diagnosed_msg));
1679 else
1680 snprintf (new_help, sizeof new_help,
1681 "%s %s", help, _(use_diagnosed_msg));
1683 help = new_help;
1686 /* Find the gap between the name of the
1687 option and its descriptive text. */
1688 tab = strchr (help, '\t');
1689 if (tab)
1691 len = tab - help;
1692 opt = help;
1693 help = tab + 1;
1695 else
1697 opt = option->opt_text;
1698 len = strlen (opt);
1701 /* With the -Q option enabled we change the descriptive text associated
1702 with an option to be an indication of its current setting. */
1703 if (!opts->x_quiet_flag)
1705 void *flag_var = option_flag_var (i, opts);
1707 if (len < (LEFT_COLUMN + 2))
1708 strcpy (new_help, "\t\t");
1709 else
1710 strcpy (new_help, "\t");
1712 /* Set to print whether the option is enabled or disabled,
1713 or, if it's an alias for another option, the name of
1714 the aliased option. */
1715 bool print_state = false;
1717 if (flag_var != NULL
1718 && option->var_type != CLVC_DEFER)
1720 /* If OPTION is only available for a specific subset
1721 of languages other than this one, mention them. */
1722 bool avail_for_lang = true;
1723 if (unsigned langset = option->flags & CL_LANG_ALL)
1725 if (!(langset & lang_mask))
1727 avail_for_lang = false;
1728 strcat (new_help, _("[available in "));
1729 for (unsigned i = 0, n = 0; (1U << i) < CL_LANG_ALL; ++i)
1730 if (langset & (1U << i))
1732 if (n++)
1733 strcat (new_help, ", ");
1734 strcat (new_help, lang_names[i]);
1736 strcat (new_help, "]");
1739 if (!avail_for_lang)
1740 ; /* Print nothing else if the option is not available
1741 in the current language. */
1742 else if (option->flags & CL_JOINED)
1744 if (option->var_type == CLVC_STRING)
1746 if (* (const char **) flag_var != NULL)
1747 snprintf (new_help + strlen (new_help),
1748 sizeof (new_help) - strlen (new_help),
1749 "%s", * (const char **) flag_var);
1751 else if (option->var_type == CLVC_ENUM)
1753 const struct cl_enum *e = &cl_enums[option->var_enum];
1754 int value;
1755 const char *arg = NULL;
1757 value = e->get (flag_var);
1758 enum_value_to_arg (e->values, &arg, value, lang_mask);
1759 if (arg == NULL)
1760 arg = _("[default]");
1761 snprintf (new_help + strlen (new_help),
1762 sizeof (new_help) - strlen (new_help),
1763 "%s", arg);
1765 else
1767 if (option->cl_host_wide_int)
1768 sprintf (new_help + strlen (new_help),
1769 _("%llu bytes"), (unsigned long long)
1770 *(unsigned HOST_WIDE_INT *) flag_var);
1771 else
1772 sprintf (new_help + strlen (new_help),
1773 "%i", * (int *) flag_var);
1776 else
1777 print_state = true;
1779 else
1780 /* When there is no argument, print the option state only
1781 if the option takes no argument. */
1782 print_state = !(option->flags & CL_JOINED);
1784 if (print_state)
1786 if (option->alias_target < N_OPTS
1787 && option->alias_target != OPT_SPECIAL_warn_removed
1788 && option->alias_target != OPT_SPECIAL_ignore
1789 && option->alias_target != OPT_SPECIAL_input_file
1790 && option->alias_target != OPT_SPECIAL_program_name
1791 && option->alias_target != OPT_SPECIAL_unknown)
1793 const struct cl_option *target
1794 = &cl_options[option->alias_target];
1795 sprintf (new_help + strlen (new_help), "%s%s",
1796 target->opt_text,
1797 option->alias_arg ? option->alias_arg : "");
1799 else if (option->alias_target == OPT_SPECIAL_ignore)
1800 strcat (new_help, ("[ignored]"));
1801 else
1803 /* Print the state for an on/off option. */
1804 int ena = option_enabled (i, lang_mask, opts);
1805 if (ena > 0)
1806 strcat (new_help, _("[enabled]"));
1807 else if (ena == 0)
1808 strcat (new_help, _("[disabled]"));
1812 help = new_help;
1815 if (option->range_max != -1 && tab == NULL)
1817 char b[128];
1818 snprintf (b, sizeof (b), "<%d,%d>", option->range_min,
1819 option->range_max);
1820 opt = concat (opt, b, NULL);
1821 len += strlen (b);
1824 wrap_help (help, opt, len, columns);
1825 displayed = true;
1827 if (option->var_type == CLVC_ENUM
1828 && opts->x_help_enum_printed[option->var_enum] != 2)
1829 opts->x_help_enum_printed[option->var_enum] = 1;
1830 else
1832 vec<const char *> option_values
1833 = targetm_common.get_valid_option_values (i, NULL);
1834 if (!option_values.is_empty ())
1835 help_tuples.safe_push (option_help_tuple (i, option_values));
1839 if (! found)
1841 unsigned int langs = include_flags & CL_LANG_ALL;
1843 if (langs == 0)
1844 printf (_(" No options with the desired characteristics were found\n"));
1845 else
1847 unsigned int i;
1849 /* PR 31349: Tell the user how to see all of the
1850 options supported by a specific front end. */
1851 for (i = 0; (1U << i) < CL_LANG_ALL; i ++)
1852 if ((1U << i) & langs)
1853 printf (_(" None found. Use --help=%s to show *all* the options supported by the %s front-end.\n"),
1854 lang_names[i], lang_names[i]);
1858 else if (! displayed)
1859 printf (_(" All options with the desired characteristics have already been displayed\n"));
1861 putchar ('\n');
1863 /* Print details of enumerated option arguments, if those
1864 enumerations have help text headings provided. If no help text
1865 is provided, presume that the possible values are listed in the
1866 help text for the relevant options. */
1867 for (i = 0; i < cl_enums_count; i++)
1869 unsigned int j, pos;
1871 if (opts->x_help_enum_printed[i] != 1)
1872 continue;
1873 if (cl_enums[i].help == NULL)
1874 continue;
1875 printf (" %s\n ", _(cl_enums[i].help));
1876 pos = 4;
1877 for (j = 0; cl_enums[i].values[j].arg != NULL; j++)
1879 unsigned int len = strlen (cl_enums[i].values[j].arg);
1881 if (pos > 4 && pos + 1 + len <= columns)
1883 printf (" %s", cl_enums[i].values[j].arg);
1884 pos += 1 + len;
1886 else
1888 if (pos > 4)
1890 printf ("\n ");
1891 pos = 4;
1893 printf ("%s", cl_enums[i].values[j].arg);
1894 pos += len;
1897 printf ("\n\n");
1898 opts->x_help_enum_printed[i] = 2;
1901 for (unsigned i = 0; i < help_tuples.length (); i++)
1903 const struct cl_option *option = cl_options + help_tuples[i].m_code;
1904 printf (_(" Known valid arguments for %s option:\n "),
1905 option->opt_text);
1906 for (unsigned j = 0; j < help_tuples[i].m_values.length (); j++)
1907 printf (" %s", help_tuples[i].m_values[j]);
1908 printf ("\n\n");
1912 /* Display help for a specified type of option.
1913 The options must have ALL of the INCLUDE_FLAGS set
1914 ANY of the flags in the ANY_FLAGS set
1915 and NONE of the EXCLUDE_FLAGS set. The current option state is in
1916 OPTS; LANG_MASK is used for interpreting enumerated option state. */
1917 static void
1918 print_specific_help (unsigned int include_flags,
1919 unsigned int exclude_flags,
1920 unsigned int any_flags,
1921 struct gcc_options *opts,
1922 unsigned int lang_mask)
1924 unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1925 const char * description = NULL;
1926 const char * descrip_extra = "";
1927 size_t i;
1928 unsigned int flag;
1930 /* Sanity check: Make sure that we do not have more
1931 languages than we have bits available to enumerate them. */
1932 gcc_assert ((1U << cl_lang_count) <= CL_MIN_OPTION_CLASS);
1934 /* If we have not done so already, obtain
1935 the desired maximum width of the output. */
1936 if (opts->x_help_columns == 0)
1938 opts->x_help_columns = get_terminal_width ();
1939 if (opts->x_help_columns == INT_MAX)
1940 /* Use a reasonable default. */
1941 opts->x_help_columns = 80;
1944 /* Decide upon the title for the options that we are going to display. */
1945 for (i = 0, flag = 1; flag <= CL_MAX_OPTION_CLASS; flag <<= 1, i ++)
1947 switch (flag & include_flags)
1949 case 0:
1950 case CL_DRIVER:
1951 break;
1953 case CL_TARGET:
1954 description = _("The following options are target specific");
1955 break;
1956 case CL_WARNING:
1957 description = _("The following options control compiler warning messages");
1958 break;
1959 case CL_OPTIMIZATION:
1960 description = _("The following options control optimizations");
1961 break;
1962 case CL_COMMON:
1963 description = _("The following options are language-independent");
1964 break;
1965 case CL_PARAMS:
1966 description = _("The following options control parameters");
1967 break;
1968 default:
1969 if (i >= cl_lang_count)
1970 break;
1971 if (exclude_flags & all_langs_mask)
1972 description = _("The following options are specific to just the language ");
1973 else
1974 description = _("The following options are supported by the language ");
1975 descrip_extra = lang_names [i];
1976 break;
1980 if (description == NULL)
1982 if (any_flags == 0)
1984 if (include_flags & CL_UNDOCUMENTED)
1985 description = _("The following options are not documented");
1986 else if (include_flags & CL_SEPARATE)
1987 description = _("The following options take separate arguments");
1988 else if (include_flags & CL_JOINED)
1989 description = _("The following options take joined arguments");
1990 else
1992 internal_error ("unrecognized %<include_flags 0x%x%> passed "
1993 "to %<print_specific_help%>",
1994 include_flags);
1995 return;
1998 else
2000 if (any_flags & all_langs_mask)
2001 description = _("The following options are language-related");
2002 else
2003 description = _("The following options are language-independent");
2007 printf ("%s%s:\n", description, descrip_extra);
2008 print_filtered_help (include_flags, exclude_flags, any_flags,
2009 opts->x_help_columns, opts, lang_mask);
2012 /* Enable FDO-related flags. */
2014 static void
2015 enable_fdo_optimizations (struct gcc_options *opts,
2016 struct gcc_options *opts_set,
2017 int value)
2019 SET_OPTION_IF_UNSET (opts, opts_set, flag_branch_probabilities, value);
2020 SET_OPTION_IF_UNSET (opts, opts_set, flag_profile_values, value);
2021 SET_OPTION_IF_UNSET (opts, opts_set, flag_unroll_loops, value);
2022 SET_OPTION_IF_UNSET (opts, opts_set, flag_peel_loops, value);
2023 SET_OPTION_IF_UNSET (opts, opts_set, flag_tracer, value);
2024 SET_OPTION_IF_UNSET (opts, opts_set, flag_value_profile_transformations,
2025 value);
2026 SET_OPTION_IF_UNSET (opts, opts_set, flag_inline_functions, value);
2027 SET_OPTION_IF_UNSET (opts, opts_set, flag_ipa_cp, value);
2028 if (value)
2030 SET_OPTION_IF_UNSET (opts, opts_set, flag_ipa_cp_clone, 1);
2031 SET_OPTION_IF_UNSET (opts, opts_set, flag_ipa_bit_cp, 1);
2033 SET_OPTION_IF_UNSET (opts, opts_set, flag_predictive_commoning, value);
2034 SET_OPTION_IF_UNSET (opts, opts_set, flag_split_loops, value);
2035 SET_OPTION_IF_UNSET (opts, opts_set, flag_unswitch_loops, value);
2036 SET_OPTION_IF_UNSET (opts, opts_set, flag_gcse_after_reload, value);
2037 SET_OPTION_IF_UNSET (opts, opts_set, flag_tree_loop_vectorize, value);
2038 SET_OPTION_IF_UNSET (opts, opts_set, flag_tree_slp_vectorize, value);
2039 SET_OPTION_IF_UNSET (opts, opts_set, flag_version_loops_for_strides, value);
2040 SET_OPTION_IF_UNSET (opts, opts_set, flag_vect_cost_model,
2041 VECT_COST_MODEL_DYNAMIC);
2042 SET_OPTION_IF_UNSET (opts, opts_set, flag_tree_loop_distribute_patterns,
2043 value);
2044 SET_OPTION_IF_UNSET (opts, opts_set, flag_loop_interchange, value);
2045 SET_OPTION_IF_UNSET (opts, opts_set, flag_unroll_jam, value);
2046 SET_OPTION_IF_UNSET (opts, opts_set, flag_tree_loop_distribution, value);
2049 /* -f{,no-}sanitize{,-recover}= suboptions. */
2050 const struct sanitizer_opts_s sanitizer_opts[] =
2052 #define SANITIZER_OPT(name, flags, recover, trap) \
2053 { #name, flags, sizeof #name - 1, recover, trap }
2054 SANITIZER_OPT (address, (SANITIZE_ADDRESS | SANITIZE_USER_ADDRESS), true,
2055 false),
2056 SANITIZER_OPT (hwaddress, (SANITIZE_HWADDRESS | SANITIZE_USER_HWADDRESS),
2057 true, false),
2058 SANITIZER_OPT (kernel-address, (SANITIZE_ADDRESS | SANITIZE_KERNEL_ADDRESS),
2059 true, false),
2060 SANITIZER_OPT (kernel-hwaddress,
2061 (SANITIZE_HWADDRESS | SANITIZE_KERNEL_HWADDRESS),
2062 true, false),
2063 SANITIZER_OPT (pointer-compare, SANITIZE_POINTER_COMPARE, true, false),
2064 SANITIZER_OPT (pointer-subtract, SANITIZE_POINTER_SUBTRACT, true, false),
2065 SANITIZER_OPT (thread, SANITIZE_THREAD, false, false),
2066 SANITIZER_OPT (leak, SANITIZE_LEAK, false, false),
2067 SANITIZER_OPT (shift, SANITIZE_SHIFT, true, true),
2068 SANITIZER_OPT (shift-base, SANITIZE_SHIFT_BASE, true, true),
2069 SANITIZER_OPT (shift-exponent, SANITIZE_SHIFT_EXPONENT, true, true),
2070 SANITIZER_OPT (integer-divide-by-zero, SANITIZE_DIVIDE, true, true),
2071 SANITIZER_OPT (undefined, SANITIZE_UNDEFINED, true, true),
2072 SANITIZER_OPT (unreachable, SANITIZE_UNREACHABLE, false, true),
2073 SANITIZER_OPT (vla-bound, SANITIZE_VLA, true, true),
2074 SANITIZER_OPT (return, SANITIZE_RETURN, false, true),
2075 SANITIZER_OPT (null, SANITIZE_NULL, true, true),
2076 SANITIZER_OPT (signed-integer-overflow, SANITIZE_SI_OVERFLOW, true, true),
2077 SANITIZER_OPT (bool, SANITIZE_BOOL, true, true),
2078 SANITIZER_OPT (enum, SANITIZE_ENUM, true, true),
2079 SANITIZER_OPT (float-divide-by-zero, SANITIZE_FLOAT_DIVIDE, true, true),
2080 SANITIZER_OPT (float-cast-overflow, SANITIZE_FLOAT_CAST, true, true),
2081 SANITIZER_OPT (bounds, SANITIZE_BOUNDS, true, true),
2082 SANITIZER_OPT (bounds-strict, SANITIZE_BOUNDS | SANITIZE_BOUNDS_STRICT, true,
2083 true),
2084 SANITIZER_OPT (alignment, SANITIZE_ALIGNMENT, true, true),
2085 SANITIZER_OPT (nonnull-attribute, SANITIZE_NONNULL_ATTRIBUTE, true, true),
2086 SANITIZER_OPT (returns-nonnull-attribute, SANITIZE_RETURNS_NONNULL_ATTRIBUTE,
2087 true, true),
2088 SANITIZER_OPT (object-size, SANITIZE_OBJECT_SIZE, true, true),
2089 SANITIZER_OPT (vptr, SANITIZE_VPTR, true, false),
2090 SANITIZER_OPT (pointer-overflow, SANITIZE_POINTER_OVERFLOW, true, true),
2091 SANITIZER_OPT (builtin, SANITIZE_BUILTIN, true, true),
2092 SANITIZER_OPT (shadow-call-stack, SANITIZE_SHADOW_CALL_STACK, false, false),
2093 SANITIZER_OPT (all, ~0U, true, true),
2094 #undef SANITIZER_OPT
2095 { NULL, 0U, 0UL, false, false }
2098 /* -fzero-call-used-regs= suboptions. */
2099 const struct zero_call_used_regs_opts_s zero_call_used_regs_opts[] =
2101 #define ZERO_CALL_USED_REGS_OPT(name, flags) \
2102 { #name, flags }
2103 ZERO_CALL_USED_REGS_OPT (skip, zero_regs_flags::SKIP),
2104 ZERO_CALL_USED_REGS_OPT (used-gpr-arg, zero_regs_flags::USED_GPR_ARG),
2105 ZERO_CALL_USED_REGS_OPT (used-gpr, zero_regs_flags::USED_GPR),
2106 ZERO_CALL_USED_REGS_OPT (used-arg, zero_regs_flags::USED_ARG),
2107 ZERO_CALL_USED_REGS_OPT (used, zero_regs_flags::USED),
2108 ZERO_CALL_USED_REGS_OPT (all-gpr-arg, zero_regs_flags::ALL_GPR_ARG),
2109 ZERO_CALL_USED_REGS_OPT (all-gpr, zero_regs_flags::ALL_GPR),
2110 ZERO_CALL_USED_REGS_OPT (all-arg, zero_regs_flags::ALL_ARG),
2111 ZERO_CALL_USED_REGS_OPT (all, zero_regs_flags::ALL),
2112 #undef ZERO_CALL_USED_REGS_OPT
2113 {NULL, 0U}
2116 /* A struct for describing a run of chars within a string. */
2118 class string_fragment
2120 public:
2121 string_fragment (const char *start, size_t len)
2122 : m_start (start), m_len (len) {}
2124 const char *m_start;
2125 size_t m_len;
2128 /* Specialization of edit_distance_traits for string_fragment,
2129 for use by get_closest_sanitizer_option. */
2131 template <>
2132 struct edit_distance_traits<const string_fragment &>
2134 static size_t get_length (const string_fragment &fragment)
2136 return fragment.m_len;
2139 static const char *get_string (const string_fragment &fragment)
2141 return fragment.m_start;
2145 /* Given ARG, an unrecognized sanitizer option, return the best
2146 matching sanitizer option, or NULL if there isn't one.
2147 OPTS is array of candidate sanitizer options.
2148 CODE is OPT_fsanitize_, OPT_fsanitize_recover_ or OPT_fsanitize_trap_.
2149 VALUE is non-zero for the regular form of the option, zero
2150 for the "no-" form (e.g. "-fno-sanitize-recover="). */
2152 static const char *
2153 get_closest_sanitizer_option (const string_fragment &arg,
2154 const struct sanitizer_opts_s *opts,
2155 enum opt_code code, int value)
2157 best_match <const string_fragment &, const char*> bm (arg);
2158 for (int i = 0; opts[i].name != NULL; ++i)
2160 /* -fsanitize=all is not valid, so don't offer it. */
2161 if (code == OPT_fsanitize_
2162 && opts[i].flag == ~0U
2163 && value)
2164 continue;
2166 /* For -fsanitize-recover= (and not -fno-sanitize-recover=),
2167 don't offer the non-recoverable options. */
2168 if (code == OPT_fsanitize_recover_
2169 && !opts[i].can_recover
2170 && value)
2171 continue;
2173 /* For -fsanitize-trap= (and not -fno-sanitize-trap=),
2174 don't offer the non-trapping options. */
2175 if (code == OPT_fsanitize_trap_
2176 && !opts[i].can_trap
2177 && value)
2178 continue;
2180 bm.consider (opts[i].name);
2182 return bm.get_best_meaningful_candidate ();
2185 /* Parse comma separated sanitizer suboptions from P for option SCODE,
2186 adjust previous FLAGS and return new ones. If COMPLAIN is false,
2187 don't issue diagnostics. */
2189 unsigned int
2190 parse_sanitizer_options (const char *p, location_t loc, int scode,
2191 unsigned int flags, int value, bool complain)
2193 enum opt_code code = (enum opt_code) scode;
2195 while (*p != 0)
2197 size_t len, i;
2198 bool found = false;
2199 const char *comma = strchr (p, ',');
2201 if (comma == NULL)
2202 len = strlen (p);
2203 else
2204 len = comma - p;
2205 if (len == 0)
2207 p = comma + 1;
2208 continue;
2211 /* Check to see if the string matches an option class name. */
2212 for (i = 0; sanitizer_opts[i].name != NULL; ++i)
2213 if (len == sanitizer_opts[i].len
2214 && memcmp (p, sanitizer_opts[i].name, len) == 0)
2216 /* Handle both -fsanitize and -fno-sanitize cases. */
2217 if (value && sanitizer_opts[i].flag == ~0U)
2219 if (code == OPT_fsanitize_)
2221 if (complain)
2222 error_at (loc, "%<-fsanitize=all%> option is not valid");
2224 else if (code == OPT_fsanitize_recover_)
2225 flags |= ~(SANITIZE_THREAD | SANITIZE_LEAK
2226 | SANITIZE_UNREACHABLE | SANITIZE_RETURN
2227 | SANITIZE_SHADOW_CALL_STACK);
2228 else /* if (code == OPT_fsanitize_trap_) */
2229 flags |= (SANITIZE_UNDEFINED
2230 | SANITIZE_UNDEFINED_NONDEFAULT);
2232 else if (value)
2234 /* Do not enable -fsanitize-recover=unreachable and
2235 -fsanitize-recover=return if -fsanitize-recover=undefined
2236 is selected. */
2237 if (code == OPT_fsanitize_recover_
2238 && sanitizer_opts[i].flag == SANITIZE_UNDEFINED)
2239 flags |= (SANITIZE_UNDEFINED
2240 & ~(SANITIZE_UNREACHABLE | SANITIZE_RETURN));
2241 else if (code == OPT_fsanitize_trap_
2242 && sanitizer_opts[i].flag == SANITIZE_VPTR)
2243 error_at (loc, "%<-fsanitize-trap=%s%> is not supported",
2244 sanitizer_opts[i].name);
2245 else
2246 flags |= sanitizer_opts[i].flag;
2248 else
2250 flags &= ~sanitizer_opts[i].flag;
2251 /* Don't always clear SANITIZE_ADDRESS if it was previously
2252 set: -fsanitize=address -fno-sanitize=kernel-address should
2253 leave SANITIZE_ADDRESS set. */
2254 if (flags & (SANITIZE_KERNEL_ADDRESS | SANITIZE_USER_ADDRESS))
2255 flags |= SANITIZE_ADDRESS;
2257 found = true;
2258 break;
2261 if (! found && complain)
2263 const char *hint
2264 = get_closest_sanitizer_option (string_fragment (p, len),
2265 sanitizer_opts, code, value);
2267 const char *suffix;
2268 if (code == OPT_fsanitize_recover_)
2269 suffix = "-recover";
2270 else if (code == OPT_fsanitize_trap_)
2271 suffix = "-trap";
2272 else
2273 suffix = "";
2275 if (hint)
2276 error_at (loc,
2277 "unrecognized argument to %<-f%ssanitize%s=%> "
2278 "option: %q.*s; did you mean %qs?",
2279 value ? "" : "no-",
2280 suffix, (int) len, p, hint);
2281 else
2282 error_at (loc,
2283 "unrecognized argument to %<-f%ssanitize%s=%> option: "
2284 "%q.*s", value ? "" : "no-",
2285 suffix, (int) len, p);
2288 if (comma == NULL)
2289 break;
2290 p = comma + 1;
2292 return flags;
2295 /* Parse string values of no_sanitize attribute passed in VALUE.
2296 Values are separated with comma. */
2298 unsigned int
2299 parse_no_sanitize_attribute (char *value)
2301 unsigned int flags = 0;
2302 unsigned int i;
2303 char *q = strtok (value, ",");
2305 while (q != NULL)
2307 for (i = 0; sanitizer_opts[i].name != NULL; ++i)
2308 if (strcmp (sanitizer_opts[i].name, q) == 0)
2310 flags |= sanitizer_opts[i].flag;
2311 if (sanitizer_opts[i].flag == SANITIZE_UNDEFINED)
2312 flags |= SANITIZE_UNDEFINED_NONDEFAULT;
2313 break;
2316 if (sanitizer_opts[i].name == NULL)
2317 warning (OPT_Wattributes,
2318 "%qs attribute directive ignored", q);
2320 q = strtok (NULL, ",");
2323 return flags;
2326 /* Parse -fzero-call-used-regs suboptions from ARG, return the FLAGS. */
2328 unsigned int
2329 parse_zero_call_used_regs_options (const char *arg)
2331 unsigned int flags = 0;
2333 /* Check to see if the string matches a sub-option name. */
2334 for (unsigned int i = 0; zero_call_used_regs_opts[i].name != NULL; ++i)
2335 if (strcmp (arg, zero_call_used_regs_opts[i].name) == 0)
2337 flags = zero_call_used_regs_opts[i].flag;
2338 break;
2341 if (!flags)
2342 error ("unrecognized argument to %<-fzero-call-used-regs=%>: %qs", arg);
2344 return flags;
2347 /* Parse -falign-NAME format for a FLAG value. Return individual
2348 parsed integer values into RESULT_VALUES array. If REPORT_ERROR is
2349 set, print error message at LOC location. */
2351 bool
2352 parse_and_check_align_values (const char *flag,
2353 const char *name,
2354 auto_vec<unsigned> &result_values,
2355 bool report_error,
2356 location_t loc)
2358 char *str = xstrdup (flag);
2359 for (char *p = strtok (str, ":"); p; p = strtok (NULL, ":"))
2361 char *end;
2362 int v = strtol (p, &end, 10);
2363 if (*end != '\0' || v < 0)
2365 if (report_error)
2366 error_at (loc, "invalid arguments for %<-falign-%s%> option: %qs",
2367 name, flag);
2369 return false;
2372 result_values.safe_push ((unsigned)v);
2375 free (str);
2377 /* Check that we have a correct number of values. */
2378 if (result_values.is_empty () || result_values.length () > 4)
2380 if (report_error)
2381 error_at (loc, "invalid number of arguments for %<-falign-%s%> "
2382 "option: %qs", name, flag);
2383 return false;
2386 for (unsigned i = 0; i < result_values.length (); i++)
2387 if (result_values[i] > MAX_CODE_ALIGN_VALUE)
2389 if (report_error)
2390 error_at (loc, "%<-falign-%s%> is not between 0 and %d",
2391 name, MAX_CODE_ALIGN_VALUE);
2392 return false;
2395 return true;
2398 /* Check that alignment value FLAG for -falign-NAME is valid at a given
2399 location LOC. OPT_STR points to the stored -falign-NAME=argument and
2400 OPT_FLAG points to the associated -falign-NAME on/off flag. */
2402 static void
2403 check_alignment_argument (location_t loc, const char *flag, const char *name,
2404 int *opt_flag, const char **opt_str)
2406 auto_vec<unsigned> align_result;
2407 parse_and_check_align_values (flag, name, align_result, true, loc);
2409 if (align_result.length() >= 1 && align_result[0] == 0)
2411 *opt_flag = 1;
2412 *opt_str = NULL;
2416 /* Parse argument of -fpatchable-function-entry option ARG and store
2417 corresponding values to PATCH_AREA_SIZE and PATCH_AREA_START.
2418 If REPORT_ERROR is set to true, generate error for a problematic
2419 option arguments. */
2421 void
2422 parse_and_check_patch_area (const char *arg, bool report_error,
2423 HOST_WIDE_INT *patch_area_size,
2424 HOST_WIDE_INT *patch_area_start)
2426 *patch_area_size = 0;
2427 *patch_area_start = 0;
2429 if (arg == NULL)
2430 return;
2432 char *patch_area_arg = xstrdup (arg);
2433 char *comma = strchr (patch_area_arg, ',');
2434 if (comma)
2436 *comma = '\0';
2437 *patch_area_size = integral_argument (patch_area_arg);
2438 *patch_area_start = integral_argument (comma + 1);
2440 else
2441 *patch_area_size = integral_argument (patch_area_arg);
2443 if (*patch_area_size < 0
2444 || *patch_area_size > USHRT_MAX
2445 || *patch_area_start < 0
2446 || *patch_area_start > USHRT_MAX
2447 || *patch_area_size < *patch_area_start)
2448 if (report_error)
2449 error ("invalid arguments for %<-fpatchable-function-entry%>");
2451 free (patch_area_arg);
2454 /* Print help when OPT__help_ is set. */
2456 void
2457 print_help (struct gcc_options *opts, unsigned int lang_mask,
2458 const char *help_option_argument)
2460 const char *a = help_option_argument;
2461 unsigned int include_flags = 0;
2462 /* Note - by default we include undocumented options when listing
2463 specific classes. If you only want to see documented options
2464 then add ",^undocumented" to the --help= option. E.g.:
2466 --help=target,^undocumented */
2467 unsigned int exclude_flags = 0;
2469 if (lang_mask == CL_DRIVER)
2470 return;
2472 /* Walk along the argument string, parsing each word in turn.
2473 The format is:
2474 arg = [^]{word}[,{arg}]
2475 word = {optimizers|target|warnings|undocumented|
2476 params|common|<language>} */
2477 while (*a != 0)
2479 static const struct
2481 const char *string;
2482 unsigned int flag;
2484 specifics[] =
2486 { "optimizers", CL_OPTIMIZATION },
2487 { "target", CL_TARGET },
2488 { "warnings", CL_WARNING },
2489 { "undocumented", CL_UNDOCUMENTED },
2490 { "params", CL_PARAMS },
2491 { "joined", CL_JOINED },
2492 { "separate", CL_SEPARATE },
2493 { "common", CL_COMMON },
2494 { NULL, 0 }
2496 unsigned int *pflags;
2497 const char *comma;
2498 unsigned int lang_flag, specific_flag;
2499 unsigned int len;
2500 unsigned int i;
2502 if (*a == '^')
2504 ++a;
2505 if (*a == '\0')
2507 error ("missing argument to %qs", "--help=^");
2508 break;
2510 pflags = &exclude_flags;
2512 else
2513 pflags = &include_flags;
2515 comma = strchr (a, ',');
2516 if (comma == NULL)
2517 len = strlen (a);
2518 else
2519 len = comma - a;
2520 if (len == 0)
2522 a = comma + 1;
2523 continue;
2526 /* Check to see if the string matches an option class name. */
2527 for (i = 0, specific_flag = 0; specifics[i].string != NULL; i++)
2528 if (strncasecmp (a, specifics[i].string, len) == 0)
2530 specific_flag = specifics[i].flag;
2531 break;
2534 /* Check to see if the string matches a language name.
2535 Note - we rely upon the alpha-sorted nature of the entries in
2536 the lang_names array, specifically that shorter names appear
2537 before their longer variants. (i.e. C before C++). That way
2538 when we are attempting to match --help=c for example we will
2539 match with C first and not C++. */
2540 for (i = 0, lang_flag = 0; i < cl_lang_count; i++)
2541 if (strncasecmp (a, lang_names[i], len) == 0)
2543 lang_flag = 1U << i;
2544 break;
2547 if (specific_flag != 0)
2549 if (lang_flag == 0)
2550 *pflags |= specific_flag;
2551 else
2553 /* The option's argument matches both the start of a
2554 language name and the start of an option class name.
2555 We have a special case for when the user has
2556 specified "--help=c", but otherwise we have to issue
2557 a warning. */
2558 if (strncasecmp (a, "c", len) == 0)
2559 *pflags |= lang_flag;
2560 else
2561 warning (0,
2562 "%<--help%> argument %q.*s is ambiguous, "
2563 "please be more specific",
2564 len, a);
2567 else if (lang_flag != 0)
2568 *pflags |= lang_flag;
2569 else
2570 warning (0,
2571 "unrecognized argument to %<--help=%> option: %q.*s",
2572 len, a);
2574 if (comma == NULL)
2575 break;
2576 a = comma + 1;
2579 /* We started using PerFunction/Optimization for parameters and
2580 a warning. We should exclude these from optimization options. */
2581 if (include_flags & CL_OPTIMIZATION)
2582 exclude_flags |= CL_WARNING;
2583 if (!(include_flags & CL_PARAMS))
2584 exclude_flags |= CL_PARAMS;
2586 if (include_flags)
2587 print_specific_help (include_flags, exclude_flags, 0, opts,
2588 lang_mask);
2591 /* Handle target- and language-independent options. Return zero to
2592 generate an "unknown option" message. Only options that need
2593 extra handling need to be listed here; if you simply want
2594 DECODED->value assigned to a variable, it happens automatically. */
2596 bool
2597 common_handle_option (struct gcc_options *opts,
2598 struct gcc_options *opts_set,
2599 const struct cl_decoded_option *decoded,
2600 unsigned int lang_mask, int kind ATTRIBUTE_UNUSED,
2601 location_t loc,
2602 const struct cl_option_handlers *handlers,
2603 diagnostic_context *dc,
2604 void (*target_option_override_hook) (void))
2606 size_t scode = decoded->opt_index;
2607 const char *arg = decoded->arg;
2608 HOST_WIDE_INT value = decoded->value;
2609 enum opt_code code = (enum opt_code) scode;
2611 gcc_assert (decoded->canonical_option_num_elements <= 2);
2613 switch (code)
2615 case OPT__help:
2617 unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
2618 unsigned int undoc_mask;
2619 unsigned int i;
2621 if (lang_mask == CL_DRIVER)
2622 break;
2624 undoc_mask = ((opts->x_verbose_flag | opts->x_extra_warnings)
2626 : CL_UNDOCUMENTED);
2627 target_option_override_hook ();
2628 /* First display any single language specific options. */
2629 for (i = 0; i < cl_lang_count; i++)
2630 print_specific_help
2631 (1U << i, (all_langs_mask & (~ (1U << i))) | undoc_mask, 0, opts,
2632 lang_mask);
2633 /* Next display any multi language specific options. */
2634 print_specific_help (0, undoc_mask, all_langs_mask, opts, lang_mask);
2635 /* Then display any remaining, non-language options. */
2636 for (i = CL_MIN_OPTION_CLASS; i <= CL_MAX_OPTION_CLASS; i <<= 1)
2637 if (i != CL_DRIVER)
2638 print_specific_help (i, undoc_mask, 0, opts, lang_mask);
2639 opts->x_exit_after_options = true;
2640 break;
2643 case OPT__target_help:
2644 if (lang_mask == CL_DRIVER)
2645 break;
2647 target_option_override_hook ();
2648 print_specific_help (CL_TARGET, 0, 0, opts, lang_mask);
2649 opts->x_exit_after_options = true;
2650 break;
2652 case OPT__help_:
2654 help_option_arguments.safe_push (arg);
2655 opts->x_exit_after_options = true;
2656 break;
2659 case OPT__version:
2660 if (lang_mask == CL_DRIVER)
2661 break;
2663 opts->x_exit_after_options = true;
2664 break;
2666 case OPT__completion_:
2667 break;
2669 case OPT_fsanitize_:
2670 opts_set->x_flag_sanitize = true;
2671 opts->x_flag_sanitize
2672 = parse_sanitizer_options (arg, loc, code,
2673 opts->x_flag_sanitize, value, true);
2675 /* Kernel ASan implies normal ASan but does not yet support
2676 all features. */
2677 if (opts->x_flag_sanitize & SANITIZE_KERNEL_ADDRESS)
2679 SET_OPTION_IF_UNSET (opts, opts_set,
2680 param_asan_instrumentation_with_call_threshold,
2682 SET_OPTION_IF_UNSET (opts, opts_set, param_asan_globals, 0);
2683 SET_OPTION_IF_UNSET (opts, opts_set, param_asan_stack, 0);
2684 SET_OPTION_IF_UNSET (opts, opts_set, param_asan_protect_allocas, 0);
2685 SET_OPTION_IF_UNSET (opts, opts_set, param_asan_use_after_return, 0);
2687 if (opts->x_flag_sanitize & SANITIZE_KERNEL_HWADDRESS)
2689 SET_OPTION_IF_UNSET (opts, opts_set,
2690 param_hwasan_instrument_stack, 0);
2691 SET_OPTION_IF_UNSET (opts, opts_set,
2692 param_hwasan_random_frame_tag, 0);
2693 SET_OPTION_IF_UNSET (opts, opts_set,
2694 param_hwasan_instrument_allocas, 0);
2696 break;
2698 case OPT_fsanitize_recover_:
2699 opts->x_flag_sanitize_recover
2700 = parse_sanitizer_options (arg, loc, code,
2701 opts->x_flag_sanitize_recover, value, true);
2702 break;
2704 case OPT_fsanitize_trap_:
2705 opts->x_flag_sanitize_trap
2706 = parse_sanitizer_options (arg, loc, code,
2707 opts->x_flag_sanitize_trap, value, true);
2708 break;
2710 case OPT_fasan_shadow_offset_:
2711 /* Deferred. */
2712 break;
2714 case OPT_fsanitize_address_use_after_scope:
2715 opts->x_flag_sanitize_address_use_after_scope = value;
2716 break;
2718 case OPT_fsanitize_recover:
2719 if (value)
2720 opts->x_flag_sanitize_recover
2721 |= (SANITIZE_UNDEFINED | SANITIZE_UNDEFINED_NONDEFAULT)
2722 & ~(SANITIZE_UNREACHABLE | SANITIZE_RETURN);
2723 else
2724 opts->x_flag_sanitize_recover
2725 &= ~(SANITIZE_UNDEFINED | SANITIZE_UNDEFINED_NONDEFAULT);
2726 break;
2728 case OPT_fsanitize_trap:
2729 if (value)
2730 opts->x_flag_sanitize_trap
2731 |= (SANITIZE_UNDEFINED | SANITIZE_UNDEFINED_NONDEFAULT);
2732 else
2733 opts->x_flag_sanitize_trap
2734 &= ~(SANITIZE_UNDEFINED | SANITIZE_UNDEFINED_NONDEFAULT);
2735 break;
2737 case OPT_O:
2738 case OPT_Os:
2739 case OPT_Ofast:
2740 case OPT_Og:
2741 case OPT_Oz:
2742 /* Currently handled in a prescan. */
2743 break;
2745 case OPT_Wattributes_:
2746 if (lang_mask == CL_DRIVER)
2747 break;
2749 if (value)
2751 error_at (loc, "arguments ignored for %<-Wattributes=%>; use "
2752 "%<-Wno-attributes=%> instead");
2753 break;
2755 else if (arg[strlen (arg) - 1] == ',')
2757 error_at (loc, "trailing %<,%> in arguments for "
2758 "%<-Wno-attributes=%>");
2759 break;
2762 add_comma_separated_to_vector (&opts->x_flag_ignored_attributes, arg);
2763 break;
2765 case OPT_Werror:
2766 dc->warning_as_error_requested = value;
2767 break;
2769 case OPT_Werror_:
2770 if (lang_mask == CL_DRIVER)
2771 break;
2773 enable_warning_as_error (arg, value, lang_mask, handlers,
2774 opts, opts_set, loc, dc);
2775 break;
2777 case OPT_Wfatal_errors:
2778 dc->fatal_errors = value;
2779 break;
2781 case OPT_Wstack_usage_:
2782 opts->x_flag_stack_usage_info = value != -1;
2783 break;
2785 case OPT_Wstrict_aliasing:
2786 set_Wstrict_aliasing (opts, value);
2787 break;
2789 case OPT_Wstrict_overflow:
2790 opts->x_warn_strict_overflow = (value
2791 ? (int) WARN_STRICT_OVERFLOW_CONDITIONAL
2792 : 0);
2793 break;
2795 case OPT_Wsystem_headers:
2796 dc->dc_warn_system_headers = value;
2797 break;
2799 case OPT_aux_info:
2800 opts->x_flag_gen_aux_info = 1;
2801 break;
2803 case OPT_d:
2804 decode_d_option (arg, opts, loc, dc);
2805 break;
2807 case OPT_fcall_used_:
2808 case OPT_fcall_saved_:
2809 /* Deferred. */
2810 break;
2812 case OPT_fdbg_cnt_:
2813 /* Deferred. */
2814 break;
2816 case OPT_fdebug_prefix_map_:
2817 case OPT_ffile_prefix_map_:
2818 case OPT_fprofile_prefix_map_:
2819 /* Deferred. */
2820 break;
2822 case OPT_fcallgraph_info:
2823 opts->x_flag_callgraph_info = CALLGRAPH_INFO_NAKED;
2824 break;
2826 case OPT_fcallgraph_info_:
2828 char *my_arg, *p;
2829 my_arg = xstrdup (arg);
2830 p = strtok (my_arg, ",");
2831 while (p)
2833 if (strcmp (p, "su") == 0)
2835 opts->x_flag_callgraph_info |= CALLGRAPH_INFO_STACK_USAGE;
2836 opts->x_flag_stack_usage_info = true;
2838 else if (strcmp (p, "da") == 0)
2839 opts->x_flag_callgraph_info |= CALLGRAPH_INFO_DYNAMIC_ALLOC;
2840 else
2841 return 0;
2842 p = strtok (NULL, ",");
2844 free (my_arg);
2846 break;
2848 case OPT_fdiagnostics_show_location_:
2849 diagnostic_prefixing_rule (dc) = (diagnostic_prefixing_rule_t) value;
2850 break;
2852 case OPT_fdiagnostics_show_caret:
2853 dc->show_caret = value;
2854 break;
2856 case OPT_fdiagnostics_show_labels:
2857 dc->show_labels_p = value;
2858 break;
2860 case OPT_fdiagnostics_show_line_numbers:
2861 dc->show_line_numbers_p = value;
2862 break;
2864 case OPT_fdiagnostics_color_:
2865 diagnostic_color_init (dc, value);
2866 break;
2868 case OPT_fdiagnostics_urls_:
2869 diagnostic_urls_init (dc, value);
2870 break;
2872 case OPT_fdiagnostics_format_:
2873 diagnostic_output_format_init (dc, opts->x_dump_base_name,
2874 (enum diagnostics_output_format)value);
2875 break;
2877 case OPT_fdiagnostics_parseable_fixits:
2878 dc->extra_output_kind = (value
2879 ? EXTRA_DIAGNOSTIC_OUTPUT_fixits_v1
2880 : EXTRA_DIAGNOSTIC_OUTPUT_none);
2881 break;
2883 case OPT_fdiagnostics_column_unit_:
2884 dc->column_unit = (enum diagnostics_column_unit)value;
2885 break;
2887 case OPT_fdiagnostics_column_origin_:
2888 dc->column_origin = value;
2889 break;
2891 case OPT_fdiagnostics_escape_format_:
2892 dc->escape_format = (enum diagnostics_escape_format)value;
2893 break;
2895 case OPT_fdiagnostics_show_cwe:
2896 dc->show_cwe = value;
2897 break;
2899 case OPT_fdiagnostics_show_rules:
2900 dc->show_rules = value;
2901 break;
2903 case OPT_fdiagnostics_path_format_:
2904 dc->path_format = (enum diagnostic_path_format)value;
2905 break;
2907 case OPT_fdiagnostics_show_path_depths:
2908 dc->show_path_depths = value;
2909 break;
2911 case OPT_fdiagnostics_show_option:
2912 dc->show_option_requested = value;
2913 break;
2915 case OPT_fdiagnostics_minimum_margin_width_:
2916 dc->min_margin_width = value;
2917 break;
2919 case OPT_fdump_:
2920 /* Deferred. */
2921 break;
2923 case OPT_ffast_math:
2924 set_fast_math_flags (opts, value);
2925 break;
2927 case OPT_funsafe_math_optimizations:
2928 set_unsafe_math_optimizations_flags (opts, value);
2929 break;
2931 case OPT_ffixed_:
2932 /* Deferred. */
2933 break;
2935 case OPT_finline_limit_:
2936 SET_OPTION_IF_UNSET (opts, opts_set, param_max_inline_insns_single,
2937 value / 2);
2938 SET_OPTION_IF_UNSET (opts, opts_set, param_max_inline_insns_auto,
2939 value / 2);
2940 break;
2942 case OPT_finstrument_functions_exclude_function_list_:
2943 add_comma_separated_to_vector
2944 (&opts->x_flag_instrument_functions_exclude_functions, arg);
2945 break;
2947 case OPT_finstrument_functions_exclude_file_list_:
2948 add_comma_separated_to_vector
2949 (&opts->x_flag_instrument_functions_exclude_files, arg);
2950 break;
2952 case OPT_fmessage_length_:
2953 pp_set_line_maximum_length (dc->printer, value);
2954 diagnostic_set_caret_max_width (dc, value);
2955 break;
2957 case OPT_fopt_info:
2958 case OPT_fopt_info_:
2959 /* Deferred. */
2960 break;
2962 case OPT_foffload_options_:
2963 /* Deferred. */
2964 break;
2966 case OPT_foffload_abi_:
2967 #ifdef ACCEL_COMPILER
2968 /* Handled in the 'mkoffload's. */
2969 #else
2970 error_at (loc, "%<-foffload-abi%> option can be specified only for "
2971 "offload compiler");
2972 #endif
2973 break;
2975 case OPT_fpack_struct_:
2976 if (value <= 0 || (value & (value - 1)) || value > 16)
2977 error_at (loc,
2978 "structure alignment must be a small power of two, not %wu",
2979 value);
2980 else
2981 opts->x_initial_max_fld_align = value;
2982 break;
2984 case OPT_fplugin_:
2985 case OPT_fplugin_arg_:
2986 /* Deferred. */
2987 break;
2989 case OPT_fprofile_use_:
2990 opts->x_profile_data_prefix = xstrdup (arg);
2991 opts->x_flag_profile_use = true;
2992 value = true;
2993 /* No break here - do -fprofile-use processing. */
2994 /* FALLTHRU */
2995 case OPT_fprofile_use:
2996 enable_fdo_optimizations (opts, opts_set, value);
2997 SET_OPTION_IF_UNSET (opts, opts_set, flag_profile_reorder_functions,
2998 value);
2999 /* Indirect call profiling should do all useful transformations
3000 speculative devirtualization does. */
3001 if (opts->x_flag_value_profile_transformations)
3002 SET_OPTION_IF_UNSET (opts, opts_set, flag_devirtualize_speculatively,
3003 false);
3004 break;
3006 case OPT_fauto_profile_:
3007 opts->x_auto_profile_file = xstrdup (arg);
3008 opts->x_flag_auto_profile = true;
3009 value = true;
3010 /* No break here - do -fauto-profile processing. */
3011 /* FALLTHRU */
3012 case OPT_fauto_profile:
3013 enable_fdo_optimizations (opts, opts_set, value);
3014 SET_OPTION_IF_UNSET (opts, opts_set, flag_profile_correction, value);
3015 break;
3017 case OPT_fprofile_generate_:
3018 opts->x_profile_data_prefix = xstrdup (arg);
3019 value = true;
3020 /* No break here - do -fprofile-generate processing. */
3021 /* FALLTHRU */
3022 case OPT_fprofile_generate:
3023 SET_OPTION_IF_UNSET (opts, opts_set, profile_arc_flag, value);
3024 SET_OPTION_IF_UNSET (opts, opts_set, flag_profile_values, value);
3025 SET_OPTION_IF_UNSET (opts, opts_set, flag_inline_functions, value);
3026 SET_OPTION_IF_UNSET (opts, opts_set, flag_ipa_bit_cp, value);
3027 break;
3029 case OPT_fprofile_info_section:
3030 opts->x_profile_info_section = ".gcov_info";
3031 break;
3033 case OPT_fpatchable_function_entry_:
3035 HOST_WIDE_INT patch_area_size, patch_area_start;
3036 parse_and_check_patch_area (arg, true, &patch_area_size,
3037 &patch_area_start);
3039 break;
3041 case OPT_ftree_vectorize:
3042 /* Automatically sets -ftree-loop-vectorize and
3043 -ftree-slp-vectorize. Nothing more to do here. */
3044 break;
3045 case OPT_fzero_call_used_regs_:
3046 opts->x_flag_zero_call_used_regs
3047 = parse_zero_call_used_regs_options (arg);
3048 break;
3050 case OPT_fshow_column:
3051 dc->show_column = value;
3052 break;
3054 case OPT_frandom_seed:
3055 /* The real switch is -fno-random-seed. */
3056 if (value)
3057 return false;
3058 /* Deferred. */
3059 break;
3061 case OPT_frandom_seed_:
3062 /* Deferred. */
3063 break;
3065 case OPT_fsched_verbose_:
3066 #ifdef INSN_SCHEDULING
3067 /* Handled with Var in common.opt. */
3068 break;
3069 #else
3070 return false;
3071 #endif
3073 case OPT_fsched_stalled_insns_:
3074 opts->x_flag_sched_stalled_insns = value;
3075 if (opts->x_flag_sched_stalled_insns == 0)
3076 opts->x_flag_sched_stalled_insns = -1;
3077 break;
3079 case OPT_fsched_stalled_insns_dep_:
3080 opts->x_flag_sched_stalled_insns_dep = value;
3081 break;
3083 case OPT_fstack_check_:
3084 if (!strcmp (arg, "no"))
3085 opts->x_flag_stack_check = NO_STACK_CHECK;
3086 else if (!strcmp (arg, "generic"))
3087 /* This is the old stack checking method. */
3088 opts->x_flag_stack_check = STACK_CHECK_BUILTIN
3089 ? FULL_BUILTIN_STACK_CHECK
3090 : GENERIC_STACK_CHECK;
3091 else if (!strcmp (arg, "specific"))
3092 /* This is the new stack checking method. */
3093 opts->x_flag_stack_check = STACK_CHECK_BUILTIN
3094 ? FULL_BUILTIN_STACK_CHECK
3095 : STACK_CHECK_STATIC_BUILTIN
3096 ? STATIC_BUILTIN_STACK_CHECK
3097 : GENERIC_STACK_CHECK;
3098 else
3099 warning_at (loc, 0, "unknown stack check parameter %qs", arg);
3100 break;
3102 case OPT_fstack_limit:
3103 /* The real switch is -fno-stack-limit. */
3104 if (value)
3105 return false;
3106 /* Deferred. */
3107 break;
3109 case OPT_fstack_limit_register_:
3110 case OPT_fstack_limit_symbol_:
3111 /* Deferred. */
3112 break;
3114 case OPT_fstack_usage:
3115 opts->x_flag_stack_usage = value;
3116 opts->x_flag_stack_usage_info = value != 0;
3117 break;
3119 case OPT_g:
3120 set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, arg, opts, opts_set,
3121 loc);
3122 break;
3124 case OPT_gbtf:
3125 set_debug_level (BTF_DEBUG, false, arg, opts, opts_set, loc);
3126 /* set the debug level to level 2, but if already at level 3,
3127 don't lower it. */
3128 if (opts->x_debug_info_level < DINFO_LEVEL_NORMAL)
3129 opts->x_debug_info_level = DINFO_LEVEL_NORMAL;
3130 break;
3132 case OPT_gctf:
3133 set_debug_level (CTF_DEBUG, false, arg, opts, opts_set, loc);
3134 /* CTF generation feeds off DWARF dies. For optimal CTF, switch debug
3135 info level to 2. If off or at level 1, set it to level 2, but if
3136 already at level 3, don't lower it. */
3137 if (opts->x_debug_info_level < DINFO_LEVEL_NORMAL
3138 && opts->x_ctf_debug_info_level > CTFINFO_LEVEL_NONE)
3139 opts->x_debug_info_level = DINFO_LEVEL_NORMAL;
3140 break;
3142 case OPT_gdwarf:
3143 if (arg && strlen (arg) != 0)
3145 error_at (loc, "%<-gdwarf%s%> is ambiguous; "
3146 "use %<-gdwarf-%s%> for DWARF version "
3147 "or %<-gdwarf%> %<-g%s%> for debug level", arg, arg, arg);
3148 break;
3150 else
3151 value = opts->x_dwarf_version;
3153 /* FALLTHRU */
3154 case OPT_gdwarf_:
3155 if (value < 2 || value > 5)
3156 error_at (loc, "dwarf version %wu is not supported", value);
3157 else
3158 opts->x_dwarf_version = value;
3159 set_debug_level (DWARF2_DEBUG, false, "", opts, opts_set, loc);
3160 break;
3162 case OPT_ggdb:
3163 set_debug_level (NO_DEBUG, 2, arg, opts, opts_set, loc);
3164 break;
3166 case OPT_gvms:
3167 set_debug_level (VMS_DEBUG, false, arg, opts, opts_set, loc);
3168 break;
3170 case OPT_gz:
3171 case OPT_gz_:
3172 /* Handled completely via specs. */
3173 break;
3175 case OPT_pedantic_errors:
3176 dc->pedantic_errors = 1;
3177 control_warning_option (OPT_Wpedantic, DK_ERROR, NULL, value,
3178 loc, lang_mask,
3179 handlers, opts, opts_set,
3180 dc);
3181 break;
3183 case OPT_flto:
3184 opts->x_flag_lto = value ? "" : NULL;
3185 break;
3187 case OPT_flto_:
3188 if (strcmp (arg, "none") != 0
3189 && strcmp (arg, "jobserver") != 0
3190 && strcmp (arg, "auto") != 0
3191 && atoi (arg) == 0)
3192 error_at (loc,
3193 "unrecognized argument to %<-flto=%> option: %qs", arg);
3194 break;
3196 case OPT_w:
3197 dc->dc_inhibit_warnings = true;
3198 break;
3200 case OPT_fmax_errors_:
3201 dc->max_errors = value;
3202 break;
3204 case OPT_fuse_ld_bfd:
3205 case OPT_fuse_ld_gold:
3206 case OPT_fuse_ld_lld:
3207 case OPT_fuse_ld_mold:
3208 case OPT_fuse_linker_plugin:
3209 /* No-op. Used by the driver and passed to us because it starts with f.*/
3210 break;
3212 case OPT_fwrapv:
3213 if (value)
3214 opts->x_flag_trapv = 0;
3215 break;
3217 case OPT_ftrapv:
3218 if (value)
3219 opts->x_flag_wrapv = 0;
3220 break;
3222 case OPT_fstrict_overflow:
3223 opts->x_flag_wrapv = !value;
3224 opts->x_flag_wrapv_pointer = !value;
3225 if (!value)
3226 opts->x_flag_trapv = 0;
3227 break;
3229 case OPT_fipa_icf:
3230 opts->x_flag_ipa_icf_functions = value;
3231 opts->x_flag_ipa_icf_variables = value;
3232 break;
3234 case OPT_falign_loops_:
3235 check_alignment_argument (loc, arg, "loops",
3236 &opts->x_flag_align_loops,
3237 &opts->x_str_align_loops);
3238 break;
3240 case OPT_falign_jumps_:
3241 check_alignment_argument (loc, arg, "jumps",
3242 &opts->x_flag_align_jumps,
3243 &opts->x_str_align_jumps);
3244 break;
3246 case OPT_falign_labels_:
3247 check_alignment_argument (loc, arg, "labels",
3248 &opts->x_flag_align_labels,
3249 &opts->x_str_align_labels);
3250 break;
3252 case OPT_falign_functions_:
3253 check_alignment_argument (loc, arg, "functions",
3254 &opts->x_flag_align_functions,
3255 &opts->x_str_align_functions);
3256 break;
3258 case OPT_ftabstop_:
3259 /* It is documented that we silently ignore silly values. */
3260 if (value >= 1 && value <= 100)
3261 dc->tabstop = value;
3262 break;
3264 case OPT_freport_bug:
3265 dc->report_bug = value;
3266 break;
3268 case OPT_fmultiflags:
3269 gcc_checking_assert (lang_mask == CL_DRIVER);
3270 break;
3272 default:
3273 /* If the flag was handled in a standard way, assume the lack of
3274 processing here is intentional. */
3275 gcc_assert (option_flag_var (scode, opts));
3276 break;
3279 common_handle_option_auto (opts, opts_set, decoded, lang_mask, kind,
3280 loc, handlers, dc);
3281 return true;
3284 /* Used to set the level of strict aliasing warnings in OPTS,
3285 when no level is specified (i.e., when -Wstrict-aliasing, and not
3286 -Wstrict-aliasing=level was given).
3287 ONOFF is assumed to take value 1 when -Wstrict-aliasing is specified,
3288 and 0 otherwise. After calling this function, wstrict_aliasing will be
3289 set to the default value of -Wstrict_aliasing=level, currently 3. */
3290 static void
3291 set_Wstrict_aliasing (struct gcc_options *opts, int onoff)
3293 gcc_assert (onoff == 0 || onoff == 1);
3294 if (onoff != 0)
3295 opts->x_warn_strict_aliasing = 3;
3296 else
3297 opts->x_warn_strict_aliasing = 0;
3300 /* The following routines are useful in setting all the flags that
3301 -ffast-math and -fno-fast-math imply. */
3302 static void
3303 set_fast_math_flags (struct gcc_options *opts, int set)
3305 if (!opts->frontend_set_flag_unsafe_math_optimizations)
3307 opts->x_flag_unsafe_math_optimizations = set;
3308 set_unsafe_math_optimizations_flags (opts, set);
3310 if (!opts->frontend_set_flag_finite_math_only)
3311 opts->x_flag_finite_math_only = set;
3312 if (!opts->frontend_set_flag_errno_math)
3313 opts->x_flag_errno_math = !set;
3314 if (set)
3316 if (opts->frontend_set_flag_excess_precision == EXCESS_PRECISION_DEFAULT)
3317 opts->x_flag_excess_precision
3318 = set ? EXCESS_PRECISION_FAST : EXCESS_PRECISION_DEFAULT;
3319 if (!opts->frontend_set_flag_signaling_nans)
3320 opts->x_flag_signaling_nans = 0;
3321 if (!opts->frontend_set_flag_rounding_math)
3322 opts->x_flag_rounding_math = 0;
3323 if (!opts->frontend_set_flag_cx_limited_range)
3324 opts->x_flag_cx_limited_range = 1;
3328 /* When -funsafe-math-optimizations is set the following
3329 flags are set as well. */
3330 static void
3331 set_unsafe_math_optimizations_flags (struct gcc_options *opts, int set)
3333 if (!opts->frontend_set_flag_trapping_math)
3334 opts->x_flag_trapping_math = !set;
3335 if (!opts->frontend_set_flag_signed_zeros)
3336 opts->x_flag_signed_zeros = !set;
3337 if (!opts->frontend_set_flag_associative_math)
3338 opts->x_flag_associative_math = set;
3339 if (!opts->frontend_set_flag_reciprocal_math)
3340 opts->x_flag_reciprocal_math = set;
3343 /* Return true iff flags in OPTS are set as if -ffast-math. */
3344 bool
3345 fast_math_flags_set_p (const struct gcc_options *opts)
3347 return (!opts->x_flag_trapping_math
3348 && opts->x_flag_unsafe_math_optimizations
3349 && opts->x_flag_finite_math_only
3350 && !opts->x_flag_signed_zeros
3351 && !opts->x_flag_errno_math
3352 && opts->x_flag_excess_precision == EXCESS_PRECISION_FAST);
3355 /* Return true iff flags are set as if -ffast-math but using the flags stored
3356 in the struct cl_optimization structure. */
3357 bool
3358 fast_math_flags_struct_set_p (struct cl_optimization *opt)
3360 return (!opt->x_flag_trapping_math
3361 && opt->x_flag_unsafe_math_optimizations
3362 && opt->x_flag_finite_math_only
3363 && !opt->x_flag_signed_zeros
3364 && !opt->x_flag_errno_math);
3367 /* Handle a debug output -g switch for options OPTS
3368 (OPTS_SET->x_write_symbols storing whether a debug format was passed
3369 explicitly), location LOC. EXTENDED is true or false to support
3370 extended output (2 is special and means "-ggdb" was given). */
3371 static void
3372 set_debug_level (uint32_t dinfo, int extended, const char *arg,
3373 struct gcc_options *opts, struct gcc_options *opts_set,
3374 location_t loc)
3376 if (dinfo == NO_DEBUG)
3378 if (opts->x_write_symbols == NO_DEBUG)
3380 opts->x_write_symbols = PREFERRED_DEBUGGING_TYPE;
3382 if (extended == 2)
3384 #if defined DWARF2_DEBUGGING_INFO || defined DWARF2_LINENO_DEBUGGING_INFO
3385 if (opts->x_write_symbols & CTF_DEBUG)
3386 opts->x_write_symbols |= DWARF2_DEBUG;
3387 else
3388 opts->x_write_symbols = DWARF2_DEBUG;
3389 #endif
3392 if (opts->x_write_symbols == NO_DEBUG)
3393 warning_at (loc, 0, "target system does not support debug output");
3395 else if ((opts->x_write_symbols & CTF_DEBUG)
3396 || (opts->x_write_symbols & BTF_DEBUG))
3398 opts->x_write_symbols |= DWARF2_DEBUG;
3399 opts_set->x_write_symbols |= DWARF2_DEBUG;
3402 else
3404 /* Make and retain the choice if both CTF and DWARF debug info are to
3405 be generated. */
3406 if (((dinfo == DWARF2_DEBUG) || (dinfo == CTF_DEBUG))
3407 && ((opts->x_write_symbols == (DWARF2_DEBUG|CTF_DEBUG))
3408 || (opts->x_write_symbols == DWARF2_DEBUG)
3409 || (opts->x_write_symbols == CTF_DEBUG)))
3411 opts->x_write_symbols |= dinfo;
3412 opts_set->x_write_symbols |= dinfo;
3414 /* However, CTF and BTF are not allowed together at this time. */
3415 else if (((dinfo == DWARF2_DEBUG) || (dinfo == BTF_DEBUG))
3416 && ((opts->x_write_symbols == (DWARF2_DEBUG|BTF_DEBUG))
3417 || (opts->x_write_symbols == DWARF2_DEBUG)
3418 || (opts->x_write_symbols == BTF_DEBUG)))
3420 opts->x_write_symbols |= dinfo;
3421 opts_set->x_write_symbols |= dinfo;
3423 else
3425 /* Does it conflict with an already selected debug format? */
3426 if (opts_set->x_write_symbols != NO_DEBUG
3427 && opts->x_write_symbols != NO_DEBUG
3428 && dinfo != opts->x_write_symbols)
3430 gcc_assert (debug_set_count (dinfo) <= 1);
3431 error_at (loc, "debug format %qs conflicts with prior selection",
3432 debug_type_names[debug_set_to_format (dinfo)]);
3434 opts->x_write_symbols = dinfo;
3435 opts_set->x_write_symbols = dinfo;
3439 if (dinfo != BTF_DEBUG)
3441 /* A debug flag without a level defaults to level 2.
3442 If off or at level 1, set it to level 2, but if already
3443 at level 3, don't lower it. */
3444 if (*arg == '\0')
3446 if (dinfo == CTF_DEBUG)
3447 opts->x_ctf_debug_info_level = CTFINFO_LEVEL_NORMAL;
3448 else if (opts->x_debug_info_level < DINFO_LEVEL_NORMAL)
3449 opts->x_debug_info_level = DINFO_LEVEL_NORMAL;
3451 else
3453 int argval = integral_argument (arg);
3454 if (argval == -1)
3455 error_at (loc, "unrecognized debug output level %qs", arg);
3456 else if (argval > 3)
3457 error_at (loc, "debug output level %qs is too high", arg);
3458 else
3460 if (dinfo == CTF_DEBUG)
3461 opts->x_ctf_debug_info_level
3462 = (enum ctf_debug_info_levels) argval;
3463 else
3464 opts->x_debug_info_level = (enum debug_info_levels) argval;
3468 else if (*arg != '\0')
3469 error_at (loc, "unrecognized btf debug output level %qs", arg);
3472 /* Arrange to dump core on error for diagnostic context DC. (The
3473 regular error message is still printed first, except in the case of
3474 abort ().) */
3476 static void
3477 setup_core_dumping (diagnostic_context *dc)
3479 #ifdef SIGABRT
3480 signal (SIGABRT, SIG_DFL);
3481 #endif
3482 #if defined(HAVE_SETRLIMIT)
3484 struct rlimit rlim;
3485 if (getrlimit (RLIMIT_CORE, &rlim) != 0)
3486 fatal_error (input_location, "getting core file size maximum limit: %m");
3487 rlim.rlim_cur = rlim.rlim_max;
3488 if (setrlimit (RLIMIT_CORE, &rlim) != 0)
3489 fatal_error (input_location,
3490 "setting core file size limit to maximum: %m");
3492 #endif
3493 diagnostic_abort_on_error (dc);
3496 /* Parse a -d<ARG> command line switch for OPTS, location LOC,
3497 diagnostic context DC. */
3499 static void
3500 decode_d_option (const char *arg, struct gcc_options *opts,
3501 location_t loc, diagnostic_context *dc)
3503 int c;
3505 while (*arg)
3506 switch (c = *arg++)
3508 case 'A':
3509 opts->x_flag_debug_asm = 1;
3510 break;
3511 case 'p':
3512 opts->x_flag_print_asm_name = 1;
3513 break;
3514 case 'P':
3515 opts->x_flag_dump_rtl_in_asm = 1;
3516 opts->x_flag_print_asm_name = 1;
3517 break;
3518 case 'x':
3519 opts->x_rtl_dump_and_exit = 1;
3520 break;
3521 case 'D': /* These are handled by the preprocessor. */
3522 case 'I':
3523 case 'M':
3524 case 'N':
3525 case 'U':
3526 break;
3527 case 'H':
3528 setup_core_dumping (dc);
3529 break;
3530 case 'a':
3531 opts->x_flag_dump_all_passed = true;
3532 break;
3534 default:
3535 warning_at (loc, 0, "unrecognized gcc debugging option: %c", c);
3536 break;
3540 /* Enable (or disable if VALUE is 0) a warning option ARG (language
3541 mask LANG_MASK, option handlers HANDLERS) as an error for option
3542 structures OPTS and OPTS_SET, diagnostic context DC (possibly
3543 NULL), location LOC. This is used by -Werror=. */
3545 static void
3546 enable_warning_as_error (const char *arg, int value, unsigned int lang_mask,
3547 const struct cl_option_handlers *handlers,
3548 struct gcc_options *opts,
3549 struct gcc_options *opts_set,
3550 location_t loc, diagnostic_context *dc)
3552 char *new_option;
3553 int option_index;
3555 new_option = XNEWVEC (char, strlen (arg) + 2);
3556 new_option[0] = 'W';
3557 strcpy (new_option + 1, arg);
3558 option_index = find_opt (new_option, lang_mask);
3559 if (option_index == OPT_SPECIAL_unknown)
3561 option_proposer op;
3562 const char *hint = op.suggest_option (new_option);
3563 if (hint)
3564 error_at (loc, "%<-W%serror=%s%>: no option %<-%s%>;"
3565 " did you mean %<-%s%>?", value ? "" : "no-",
3566 arg, new_option, hint);
3567 else
3568 error_at (loc, "%<-W%serror=%s%>: no option %<-%s%>",
3569 value ? "" : "no-", arg, new_option);
3571 else if (!(cl_options[option_index].flags & CL_WARNING))
3572 error_at (loc, "%<-Werror=%s%>: %<-%s%> is not an option that "
3573 "controls warnings", arg, new_option);
3574 else
3576 const diagnostic_t kind = value ? DK_ERROR : DK_WARNING;
3577 const char *arg = NULL;
3579 if (cl_options[option_index].flags & CL_JOINED)
3580 arg = new_option + cl_options[option_index].opt_len;
3581 control_warning_option (option_index, (int) kind, arg, value,
3582 loc, lang_mask,
3583 handlers, opts, opts_set, dc);
3585 free (new_option);
3588 /* Return malloced memory for the name of the option OPTION_INDEX
3589 which enabled a diagnostic (context CONTEXT), originally of type
3590 ORIG_DIAG_KIND but possibly converted to DIAG_KIND by options such
3591 as -Werror. */
3593 char *
3594 option_name (diagnostic_context *context, int option_index,
3595 diagnostic_t orig_diag_kind, diagnostic_t diag_kind)
3597 if (option_index)
3599 /* A warning classified as an error. */
3600 if ((orig_diag_kind == DK_WARNING || orig_diag_kind == DK_PEDWARN)
3601 && diag_kind == DK_ERROR)
3602 return concat (cl_options[OPT_Werror_].opt_text,
3603 /* Skip over "-W". */
3604 cl_options[option_index].opt_text + 2,
3605 NULL);
3606 /* A warning with option. */
3607 else
3608 return xstrdup (cl_options[option_index].opt_text);
3610 /* A warning without option classified as an error. */
3611 else if ((orig_diag_kind == DK_WARNING || orig_diag_kind == DK_PEDWARN
3612 || diag_kind == DK_WARNING)
3613 && context->warning_as_error_requested)
3614 return xstrdup (cl_options[OPT_Werror].opt_text);
3615 else
3616 return NULL;
3619 /* Get the page within the documentation for this option. */
3621 static const char *
3622 get_option_html_page (int option_index)
3624 const cl_option *cl_opt = &cl_options[option_index];
3626 /* Analyzer options are on their own page. */
3627 if (strstr (cl_opt->opt_text, "analyzer-"))
3628 return "gcc/Static-Analyzer-Options.html";
3630 /* Handle -flto= option. */
3631 if (strstr (cl_opt->opt_text, "flto"))
3632 return "gcc/Optimize-Options.html";
3634 #ifdef CL_Fortran
3635 if ((cl_opt->flags & CL_Fortran) != 0
3636 /* If it is option common to both C/C++ and Fortran, it is documented
3637 in gcc/ rather than gfortran/ docs. */
3638 && (cl_opt->flags & CL_C) == 0
3639 #ifdef CL_CXX
3640 && (cl_opt->flags & CL_CXX) == 0
3641 #endif
3643 return "gfortran/Error-and-Warning-Options.html";
3644 #endif
3646 return "gcc/Warning-Options.html";
3649 /* Return malloced memory for a URL describing the option OPTION_INDEX
3650 which enabled a diagnostic (context CONTEXT). */
3652 char *
3653 get_option_url (diagnostic_context *, int option_index)
3655 if (option_index)
3656 return concat (/* DOCUMENTATION_ROOT_URL should be supplied via -D by
3657 the Makefile (see --with-documentation-root-url), and
3658 should have a trailing slash. */
3659 DOCUMENTATION_ROOT_URL,
3661 /* get_option_html_page will return something like
3662 "gcc/Warning-Options.html". */
3663 get_option_html_page (option_index),
3665 /* Expect an anchor of the form "index-Wfoo" e.g.
3666 <a name="index-Wformat"></a>, and thus an id within
3667 the URL of "#index-Wformat". */
3668 "#index", cl_options[option_index].opt_text,
3669 NULL);
3670 else
3671 return NULL;
3674 /* Return a heap allocated producer with command line options. */
3676 char *
3677 gen_command_line_string (cl_decoded_option *options,
3678 unsigned int options_count)
3680 auto_vec<const char *> switches;
3681 char *options_string, *tail;
3682 const char *p;
3683 size_t len = 0;
3685 for (unsigned i = 0; i < options_count; i++)
3686 switch (options[i].opt_index)
3688 case OPT_o:
3689 case OPT_d:
3690 case OPT_dumpbase:
3691 case OPT_dumpbase_ext:
3692 case OPT_dumpdir:
3693 case OPT_quiet:
3694 case OPT_version:
3695 case OPT_v:
3696 case OPT_w:
3697 case OPT_L:
3698 case OPT_D:
3699 case OPT_I:
3700 case OPT_U:
3701 case OPT_SPECIAL_unknown:
3702 case OPT_SPECIAL_ignore:
3703 case OPT_SPECIAL_warn_removed:
3704 case OPT_SPECIAL_program_name:
3705 case OPT_SPECIAL_input_file:
3706 case OPT_grecord_gcc_switches:
3707 case OPT_frecord_gcc_switches:
3708 case OPT__output_pch:
3709 case OPT_fdiagnostics_show_location_:
3710 case OPT_fdiagnostics_show_option:
3711 case OPT_fdiagnostics_show_caret:
3712 case OPT_fdiagnostics_show_labels:
3713 case OPT_fdiagnostics_show_line_numbers:
3714 case OPT_fdiagnostics_color_:
3715 case OPT_fdiagnostics_format_:
3716 case OPT_fverbose_asm:
3717 case OPT____:
3718 case OPT__sysroot_:
3719 case OPT_nostdinc:
3720 case OPT_nostdinc__:
3721 case OPT_fpreprocessed:
3722 case OPT_fltrans_output_list_:
3723 case OPT_fresolution_:
3724 case OPT_fdebug_prefix_map_:
3725 case OPT_fmacro_prefix_map_:
3726 case OPT_ffile_prefix_map_:
3727 case OPT_fprofile_prefix_map_:
3728 case OPT_fcompare_debug:
3729 case OPT_fchecking:
3730 case OPT_fchecking_:
3731 /* Ignore these. */
3732 continue;
3733 case OPT_flto_:
3735 const char *lto_canonical = "-flto";
3736 switches.safe_push (lto_canonical);
3737 len += strlen (lto_canonical) + 1;
3738 break;
3740 default:
3741 if (cl_options[options[i].opt_index].flags
3742 & CL_NO_DWARF_RECORD)
3743 continue;
3744 gcc_checking_assert (options[i].canonical_option[0][0] == '-');
3745 switch (options[i].canonical_option[0][1])
3747 case 'M':
3748 case 'i':
3749 case 'W':
3750 continue;
3751 case 'f':
3752 if (strncmp (options[i].canonical_option[0] + 2,
3753 "dump", 4) == 0)
3754 continue;
3755 break;
3756 default:
3757 break;
3759 switches.safe_push (options[i].orig_option_with_args_text);
3760 len += strlen (options[i].orig_option_with_args_text) + 1;
3761 break;
3764 options_string = XNEWVEC (char, len + 1);
3765 tail = options_string;
3767 unsigned i;
3768 FOR_EACH_VEC_ELT (switches, i, p)
3770 len = strlen (p);
3771 memcpy (tail, p, len);
3772 tail += len;
3773 if (i != switches.length () - 1)
3775 *tail = ' ';
3776 ++tail;
3780 *tail = '\0';
3781 return options_string;
3784 /* Return a heap allocated producer string including command line options. */
3786 char *
3787 gen_producer_string (const char *language_string, cl_decoded_option *options,
3788 unsigned int options_count)
3790 char *cmdline = gen_command_line_string (options, options_count);
3791 char *combined = concat (language_string, " ", version_string, " ",
3792 cmdline, NULL);
3793 free (cmdline);
3794 return combined;
3797 #if CHECKING_P
3799 namespace selftest {
3801 /* Verify that get_option_html_page works as expected. */
3803 static void
3804 test_get_option_html_page ()
3806 ASSERT_STREQ (get_option_html_page (OPT_Wcpp), "gcc/Warning-Options.html");
3807 ASSERT_STREQ (get_option_html_page (OPT_Wanalyzer_double_free),
3808 "gcc/Static-Analyzer-Options.html");
3809 #ifdef CL_Fortran
3810 ASSERT_STREQ (get_option_html_page (OPT_Wline_truncation),
3811 "gfortran/Error-and-Warning-Options.html");
3812 #endif
3815 /* Verify EnumSet and EnumBitSet requirements. */
3817 static void
3818 test_enum_sets ()
3820 for (unsigned i = 0; i < cl_options_count; ++i)
3821 if (cl_options[i].var_type == CLVC_ENUM
3822 && cl_options[i].var_value != CLEV_NORMAL)
3824 const struct cl_enum *e = &cl_enums[cl_options[i].var_enum];
3825 unsigned HOST_WIDE_INT used_sets = 0;
3826 unsigned HOST_WIDE_INT mask = 0;
3827 unsigned highest_set = 0;
3828 for (unsigned j = 0; e->values[j].arg; ++j)
3830 unsigned set = e->values[j].flags >> CL_ENUM_SET_SHIFT;
3831 if (cl_options[i].var_value == CLEV_BITSET)
3833 /* For EnumBitSet Set shouldn't be used and Value should
3834 be a power of two. */
3835 ASSERT_TRUE (set == 0);
3836 ASSERT_TRUE (pow2p_hwi (e->values[j].value));
3837 continue;
3839 /* Test that enumerators referenced in EnumSet have all
3840 Set(n) on them within the valid range. */
3841 ASSERT_TRUE (set >= 1 && set <= HOST_BITS_PER_WIDE_INT);
3842 highest_set = MAX (set, highest_set);
3843 used_sets |= HOST_WIDE_INT_1U << (set - 1);
3845 if (cl_options[i].var_value == CLEV_BITSET)
3846 continue;
3847 /* If there is just one set, no point to using EnumSet. */
3848 ASSERT_TRUE (highest_set >= 2);
3849 /* Test that there are no gaps in between the sets. */
3850 if (highest_set == HOST_BITS_PER_WIDE_INT)
3851 ASSERT_TRUE (used_sets == HOST_WIDE_INT_M1U);
3852 else
3853 ASSERT_TRUE (used_sets == (HOST_WIDE_INT_1U << highest_set) - 1);
3854 for (unsigned int j = 1; j <= highest_set; ++j)
3856 unsigned HOST_WIDE_INT this_mask = 0;
3857 for (unsigned k = 0; e->values[k].arg; ++k)
3859 unsigned set = e->values[j].flags >> CL_ENUM_SET_SHIFT;
3860 if (set == j)
3861 this_mask |= e->values[j].value;
3863 ASSERT_TRUE ((mask & this_mask) == 0);
3864 mask |= this_mask;
3869 /* Run all of the selftests within this file. */
3871 void
3872 opts_cc_tests ()
3874 test_get_option_html_page ();
3875 test_enum_sets ();
3878 } // namespace selftest
3880 #endif /* #if CHECKING_P */