d: Merge upstream dmd 56589f0f4, druntime 651389b5, phobos 1516ecad9.
[official-gcc.git] / gcc / opts.cc
blobfe0293e4283df41248dfdfb572c60b9ae9b6e437
1 /* Command line option handling.
2 Copyright (C) 2002-2022 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, DBX_DEBUG, DWARF2_DEBUG, XCOFF_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 #ifdef INSN_SCHEDULING
662 /* Only run the pre-regalloc scheduling pass if optimizing for speed. */
663 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_fschedule_insns, NULL, 1 },
664 #endif
666 /* -O3 and -Os optimizations. */
668 /* -O3 optimizations. */
669 { OPT_LEVELS_3_PLUS, OPT_fgcse_after_reload, NULL, 1 },
670 { OPT_LEVELS_3_PLUS, OPT_fipa_cp_clone, NULL, 1 },
671 { OPT_LEVELS_3_PLUS, OPT_floop_interchange, NULL, 1 },
672 { OPT_LEVELS_3_PLUS, OPT_floop_unroll_and_jam, NULL, 1 },
673 { OPT_LEVELS_3_PLUS, OPT_fpeel_loops, NULL, 1 },
674 { OPT_LEVELS_3_PLUS, OPT_fpredictive_commoning, NULL, 1 },
675 { OPT_LEVELS_3_PLUS, OPT_fsplit_loops, NULL, 1 },
676 { OPT_LEVELS_3_PLUS, OPT_fsplit_paths, NULL, 1 },
677 { OPT_LEVELS_3_PLUS, OPT_ftree_loop_distribution, NULL, 1 },
678 { OPT_LEVELS_3_PLUS, OPT_ftree_partial_pre, NULL, 1 },
679 { OPT_LEVELS_3_PLUS, OPT_funswitch_loops, NULL, 1 },
680 { OPT_LEVELS_3_PLUS, OPT_fvect_cost_model_, NULL, VECT_COST_MODEL_DYNAMIC },
681 { OPT_LEVELS_3_PLUS, OPT_fversion_loops_for_strides, NULL, 1 },
683 /* -O3 parameters. */
684 { OPT_LEVELS_3_PLUS, OPT__param_max_inline_insns_auto_, NULL, 30 },
685 { OPT_LEVELS_3_PLUS, OPT__param_early_inlining_insns_, NULL, 14 },
686 { OPT_LEVELS_3_PLUS, OPT__param_inline_heuristics_hint_percent_, NULL, 600 },
687 { OPT_LEVELS_3_PLUS, OPT__param_inline_min_speedup_, NULL, 15 },
688 { OPT_LEVELS_3_PLUS, OPT__param_max_inline_insns_single_, NULL, 200 },
690 /* -Ofast adds optimizations to -O3. */
691 { OPT_LEVELS_FAST, OPT_ffast_math, NULL, 1 },
692 { OPT_LEVELS_FAST, OPT_fallow_store_data_races, NULL, 1 },
693 { OPT_LEVELS_FAST, OPT_fsemantic_interposition, NULL, 0 },
695 { OPT_LEVELS_NONE, 0, NULL, 0 }
698 /* Default the options in OPTS and OPTS_SET based on the optimization
699 settings in DECODED_OPTIONS and DECODED_OPTIONS_COUNT. */
700 void
701 default_options_optimization (struct gcc_options *opts,
702 struct gcc_options *opts_set,
703 struct cl_decoded_option *decoded_options,
704 unsigned int decoded_options_count,
705 location_t loc,
706 unsigned int lang_mask,
707 const struct cl_option_handlers *handlers,
708 diagnostic_context *dc)
710 unsigned int i;
711 int opt2;
712 bool openacc_mode = false;
714 /* Scan to see what optimization level has been specified. That will
715 determine the default value of many flags. */
716 for (i = 1; i < decoded_options_count; i++)
718 struct cl_decoded_option *opt = &decoded_options[i];
719 switch (opt->opt_index)
721 case OPT_O:
722 if (*opt->arg == '\0')
724 opts->x_optimize = 1;
725 opts->x_optimize_size = 0;
726 opts->x_optimize_fast = 0;
727 opts->x_optimize_debug = 0;
729 else
731 const int optimize_val = integral_argument (opt->arg);
732 if (optimize_val == -1)
733 error_at (loc, "argument to %<-O%> should be a non-negative "
734 "integer, %<g%>, %<s%>, %<z%> or %<fast%>");
735 else
737 opts->x_optimize = optimize_val;
738 if ((unsigned int) opts->x_optimize > 255)
739 opts->x_optimize = 255;
740 opts->x_optimize_size = 0;
741 opts->x_optimize_fast = 0;
742 opts->x_optimize_debug = 0;
745 break;
747 case OPT_Os:
748 opts->x_optimize_size = 1;
750 /* Optimizing for size forces optimize to be 2. */
751 opts->x_optimize = 2;
752 opts->x_optimize_fast = 0;
753 opts->x_optimize_debug = 0;
754 break;
756 case OPT_Oz:
757 opts->x_optimize_size = 2;
759 /* Optimizing for size forces optimize to be 2. */
760 opts->x_optimize = 2;
761 opts->x_optimize_fast = 0;
762 opts->x_optimize_debug = 0;
763 break;
765 case OPT_Ofast:
766 /* -Ofast only adds flags to -O3. */
767 opts->x_optimize_size = 0;
768 opts->x_optimize = 3;
769 opts->x_optimize_fast = 1;
770 opts->x_optimize_debug = 0;
771 break;
773 case OPT_Og:
774 /* -Og selects optimization level 1. */
775 opts->x_optimize_size = 0;
776 opts->x_optimize = 1;
777 opts->x_optimize_fast = 0;
778 opts->x_optimize_debug = 1;
779 break;
781 case OPT_fopenacc:
782 if (opt->value)
783 openacc_mode = true;
784 break;
786 default:
787 /* Ignore other options in this prescan. */
788 break;
792 maybe_default_options (opts, opts_set, default_options_table,
793 opts->x_optimize, opts->x_optimize_size,
794 opts->x_optimize_fast, opts->x_optimize_debug,
795 lang_mask, handlers, loc, dc);
797 /* -O2 param settings. */
798 opt2 = (opts->x_optimize >= 2);
800 if (openacc_mode)
801 SET_OPTION_IF_UNSET (opts, opts_set, flag_ipa_pta, true);
803 /* Track fields in field-sensitive alias analysis. */
804 if (opt2)
805 SET_OPTION_IF_UNSET (opts, opts_set, param_max_fields_for_field_sensitive,
806 100);
808 if (opts->x_optimize_size)
809 /* We want to crossjump as much as possible. */
810 SET_OPTION_IF_UNSET (opts, opts_set, param_min_crossjump_insns, 1);
812 /* Restrict the amount of work combine does at -Og while retaining
813 most of its useful transforms. */
814 if (opts->x_optimize_debug)
815 SET_OPTION_IF_UNSET (opts, opts_set, param_max_combine_insns, 2);
817 /* Allow default optimizations to be specified on a per-machine basis. */
818 maybe_default_options (opts, opts_set,
819 targetm_common.option_optimization_table,
820 opts->x_optimize, opts->x_optimize_size,
821 opts->x_optimize_fast, opts->x_optimize_debug,
822 lang_mask, handlers, loc, dc);
825 /* Control IPA optimizations based on different live patching LEVEL. */
826 static void
827 control_options_for_live_patching (struct gcc_options *opts,
828 struct gcc_options *opts_set,
829 enum live_patching_level level,
830 location_t loc)
832 gcc_assert (level > LIVE_PATCHING_NONE);
834 switch (level)
836 case LIVE_PATCHING_INLINE_ONLY_STATIC:
837 #define LIVE_PATCHING_OPTION "-flive-patching=inline-only-static"
838 if (opts_set->x_flag_ipa_cp_clone && opts->x_flag_ipa_cp_clone)
839 error_at (loc, "%qs is incompatible with %qs",
840 "-fipa-cp-clone", LIVE_PATCHING_OPTION);
841 else
842 opts->x_flag_ipa_cp_clone = 0;
844 if (opts_set->x_flag_ipa_sra && opts->x_flag_ipa_sra)
845 error_at (loc, "%qs is incompatible with %qs",
846 "-fipa-sra", LIVE_PATCHING_OPTION);
847 else
848 opts->x_flag_ipa_sra = 0;
850 if (opts_set->x_flag_partial_inlining && opts->x_flag_partial_inlining)
851 error_at (loc, "%qs is incompatible with %qs",
852 "-fpartial-inlining", LIVE_PATCHING_OPTION);
853 else
854 opts->x_flag_partial_inlining = 0;
856 if (opts_set->x_flag_ipa_cp && opts->x_flag_ipa_cp)
857 error_at (loc, "%qs is incompatible with %qs",
858 "-fipa-cp", LIVE_PATCHING_OPTION);
859 else
860 opts->x_flag_ipa_cp = 0;
862 /* FALLTHROUGH. */
863 case LIVE_PATCHING_INLINE_CLONE:
864 #undef LIVE_PATCHING_OPTION
865 #define LIVE_PATCHING_OPTION "-flive-patching=inline-only-static|inline-clone"
866 /* live patching should disable whole-program optimization. */
867 if (opts_set->x_flag_whole_program && opts->x_flag_whole_program)
868 error_at (loc, "%qs is incompatible with %qs",
869 "-fwhole-program", LIVE_PATCHING_OPTION);
870 else
871 opts->x_flag_whole_program = 0;
873 /* visibility change should be excluded by !flag_whole_program
874 && !in_lto_p && !flag_ipa_cp_clone && !flag_ipa_sra
875 && !flag_partial_inlining. */
877 if (opts_set->x_flag_ipa_pta && opts->x_flag_ipa_pta)
878 error_at (loc, "%qs is incompatible with %qs",
879 "-fipa-pta", LIVE_PATCHING_OPTION);
880 else
881 opts->x_flag_ipa_pta = 0;
883 if (opts_set->x_flag_ipa_reference && opts->x_flag_ipa_reference)
884 error_at (loc, "%qs is incompatible with %qs",
885 "-fipa-reference", LIVE_PATCHING_OPTION);
886 else
887 opts->x_flag_ipa_reference = 0;
889 if (opts_set->x_flag_ipa_ra && opts->x_flag_ipa_ra)
890 error_at (loc, "%qs is incompatible with %qs",
891 "-fipa-ra", LIVE_PATCHING_OPTION);
892 else
893 opts->x_flag_ipa_ra = 0;
895 if (opts_set->x_flag_ipa_icf && opts->x_flag_ipa_icf)
896 error_at (loc, "%qs is incompatible with %qs",
897 "-fipa-icf", LIVE_PATCHING_OPTION);
898 else
899 opts->x_flag_ipa_icf = 0;
901 if (opts_set->x_flag_ipa_icf_functions && opts->x_flag_ipa_icf_functions)
902 error_at (loc, "%qs is incompatible with %qs",
903 "-fipa-icf-functions", LIVE_PATCHING_OPTION);
904 else
905 opts->x_flag_ipa_icf_functions = 0;
907 if (opts_set->x_flag_ipa_icf_variables && opts->x_flag_ipa_icf_variables)
908 error_at (loc, "%qs is incompatible with %qs",
909 "-fipa-icf-variables", LIVE_PATCHING_OPTION);
910 else
911 opts->x_flag_ipa_icf_variables = 0;
913 if (opts_set->x_flag_ipa_bit_cp && opts->x_flag_ipa_bit_cp)
914 error_at (loc, "%qs is incompatible with %qs",
915 "-fipa-bit-cp", LIVE_PATCHING_OPTION);
916 else
917 opts->x_flag_ipa_bit_cp = 0;
919 if (opts_set->x_flag_ipa_vrp && opts->x_flag_ipa_vrp)
920 error_at (loc, "%qs is incompatible with %qs",
921 "-fipa-vrp", LIVE_PATCHING_OPTION);
922 else
923 opts->x_flag_ipa_vrp = 0;
925 if (opts_set->x_flag_ipa_pure_const && opts->x_flag_ipa_pure_const)
926 error_at (loc, "%qs is incompatible with %qs",
927 "-fipa-pure-const", LIVE_PATCHING_OPTION);
928 else
929 opts->x_flag_ipa_pure_const = 0;
931 if (opts_set->x_flag_ipa_modref && opts->x_flag_ipa_modref)
932 error_at (loc,
933 "%<-fipa-modref%> is incompatible with %qs",
934 LIVE_PATCHING_OPTION);
935 else
936 opts->x_flag_ipa_modref = 0;
938 /* FIXME: disable unreachable code removal. */
940 /* discovery of functions/variables with no address taken. */
941 if (opts_set->x_flag_ipa_reference_addressable
942 && opts->x_flag_ipa_reference_addressable)
943 error_at (loc, "%qs is incompatible with %qs",
944 "-fipa-reference-addressable", LIVE_PATCHING_OPTION);
945 else
946 opts->x_flag_ipa_reference_addressable = 0;
948 /* ipa stack alignment propagation. */
949 if (opts_set->x_flag_ipa_stack_alignment
950 && opts->x_flag_ipa_stack_alignment)
951 error_at (loc, "%qs is incompatible with %qs",
952 "-fipa-stack-alignment", LIVE_PATCHING_OPTION);
953 else
954 opts->x_flag_ipa_stack_alignment = 0;
955 break;
956 default:
957 gcc_unreachable ();
960 #undef LIVE_PATCHING_OPTION
963 /* --help option argument if set. */
964 vec<const char *> help_option_arguments;
966 /* Return the string name describing a sanitizer argument which has been
967 provided on the command line and has set this particular flag. */
968 const char *
969 find_sanitizer_argument (struct gcc_options *opts, unsigned int flags)
971 for (int i = 0; sanitizer_opts[i].name != NULL; ++i)
973 /* Need to find the sanitizer_opts element which:
974 a) Could have set the flags requested.
975 b) Has been set on the command line.
977 Can have (a) without (b) if the flag requested is e.g.
978 SANITIZE_ADDRESS, since both -fsanitize=address and
979 -fsanitize=kernel-address set this flag.
981 Can have (b) without (a) by requesting more than one sanitizer on the
982 command line. */
983 if ((sanitizer_opts[i].flag & opts->x_flag_sanitize)
984 != sanitizer_opts[i].flag)
985 continue;
986 if ((sanitizer_opts[i].flag & flags) != flags)
987 continue;
988 return sanitizer_opts[i].name;
990 return NULL;
994 /* Report an error to the user about sanitizer options they have requested
995 which have set conflicting flags.
997 LEFT and RIGHT indicate sanitizer flags which conflict with each other, this
998 function reports an error if both have been set in OPTS->x_flag_sanitize and
999 ensures the error identifies the requested command line options that have
1000 set these flags. */
1001 static void
1002 report_conflicting_sanitizer_options (struct gcc_options *opts, location_t loc,
1003 unsigned int left, unsigned int right)
1005 unsigned int left_seen = (opts->x_flag_sanitize & left);
1006 unsigned int right_seen = (opts->x_flag_sanitize & right);
1007 if (left_seen && right_seen)
1009 const char* left_arg = find_sanitizer_argument (opts, left_seen);
1010 const char* right_arg = find_sanitizer_argument (opts, right_seen);
1011 gcc_assert (left_arg && right_arg);
1012 error_at (loc,
1013 "%<-fsanitize=%s%> is incompatible with %<-fsanitize=%s%>",
1014 left_arg, right_arg);
1018 /* After all options at LOC have been read into OPTS and OPTS_SET,
1019 finalize settings of those options and diagnose incompatible
1020 combinations. */
1021 void
1022 finish_options (struct gcc_options *opts, struct gcc_options *opts_set,
1023 location_t loc)
1025 if (opts->x_dump_base_name
1026 && ! opts->x_dump_base_name_prefixed)
1028 const char *sep = opts->x_dump_base_name;
1030 for (; *sep; sep++)
1031 if (IS_DIR_SEPARATOR (*sep))
1032 break;
1034 if (*sep)
1035 /* If dump_base_path contains subdirectories, don't prepend
1036 anything. */;
1037 else if (opts->x_dump_dir_name)
1038 /* We have a DUMP_DIR_NAME, prepend that. */
1039 opts->x_dump_base_name = opts_concat (opts->x_dump_dir_name,
1040 opts->x_dump_base_name, NULL);
1042 /* It is definitely prefixed now. */
1043 opts->x_dump_base_name_prefixed = true;
1046 /* Handle related options for unit-at-a-time, toplevel-reorder, and
1047 section-anchors. */
1048 if (!opts->x_flag_unit_at_a_time)
1050 if (opts->x_flag_section_anchors && opts_set->x_flag_section_anchors)
1051 error_at (loc, "section anchors must be disabled when unit-at-a-time "
1052 "is disabled");
1053 opts->x_flag_section_anchors = 0;
1054 if (opts->x_flag_toplevel_reorder == 1)
1055 error_at (loc, "toplevel reorder must be disabled when unit-at-a-time "
1056 "is disabled");
1057 opts->x_flag_toplevel_reorder = 0;
1060 /* -fself-test depends on the state of the compiler prior to
1061 compiling anything. Ideally it should be run on an empty source
1062 file. However, in case we get run with actual source, assume
1063 -fsyntax-only which will inhibit any compiler initialization
1064 which may confuse the self tests. */
1065 if (opts->x_flag_self_test)
1066 opts->x_flag_syntax_only = 1;
1068 if (opts->x_flag_tm && opts->x_flag_non_call_exceptions)
1069 sorry ("transactional memory is not supported with non-call exceptions");
1071 /* Unless the user has asked for section anchors, we disable toplevel
1072 reordering at -O0 to disable transformations that might be surprising
1073 to end users and to get -fno-toplevel-reorder tested. */
1074 if (!opts->x_optimize
1075 && opts->x_flag_toplevel_reorder == 2
1076 && !(opts->x_flag_section_anchors && opts_set->x_flag_section_anchors))
1078 opts->x_flag_toplevel_reorder = 0;
1079 opts->x_flag_section_anchors = 0;
1081 if (!opts->x_flag_toplevel_reorder)
1083 if (opts->x_flag_section_anchors && opts_set->x_flag_section_anchors)
1084 error_at (loc, "section anchors must be disabled when toplevel reorder"
1085 " is disabled");
1086 opts->x_flag_section_anchors = 0;
1089 if (!opts->x_flag_opts_finished)
1091 /* We initialize opts->x_flag_pie to -1 so that targets can set a
1092 default value. */
1093 if (opts->x_flag_pie == -1)
1095 /* We initialize opts->x_flag_pic to -1 so that we can tell if
1096 -fpic, -fPIC, -fno-pic or -fno-PIC is used. */
1097 if (opts->x_flag_pic == -1)
1098 opts->x_flag_pie = DEFAULT_FLAG_PIE;
1099 else
1100 opts->x_flag_pie = 0;
1102 /* If -fPIE or -fpie is used, turn on PIC. */
1103 if (opts->x_flag_pie)
1104 opts->x_flag_pic = opts->x_flag_pie;
1105 else if (opts->x_flag_pic == -1)
1106 opts->x_flag_pic = 0;
1107 if (opts->x_flag_pic && !opts->x_flag_pie)
1108 opts->x_flag_shlib = 1;
1109 opts->x_flag_opts_finished = true;
1112 /* We initialize opts->x_flag_stack_protect to -1 so that targets
1113 can set a default value. */
1114 if (opts->x_flag_stack_protect == -1)
1115 opts->x_flag_stack_protect = DEFAULT_FLAG_SSP;
1117 if (opts->x_optimize == 0)
1119 /* Inlining does not work if not optimizing,
1120 so force it not to be done. */
1121 opts->x_warn_inline = 0;
1122 opts->x_flag_no_inline = 1;
1125 /* At -O0 or -Og, turn __builtin_unreachable into a trap. */
1126 if (!opts->x_optimize || opts->x_optimize_debug)
1127 SET_OPTION_IF_UNSET (opts, opts_set, flag_unreachable_traps, true);
1129 /* Pipelining of outer loops is only possible when general pipelining
1130 capabilities are requested. */
1131 if (!opts->x_flag_sel_sched_pipelining)
1132 opts->x_flag_sel_sched_pipelining_outer_loops = 0;
1134 if (opts->x_flag_conserve_stack)
1136 SET_OPTION_IF_UNSET (opts, opts_set, param_large_stack_frame, 100);
1137 SET_OPTION_IF_UNSET (opts, opts_set, param_stack_frame_growth, 40);
1140 if (opts->x_flag_lto)
1142 #ifdef ENABLE_LTO
1143 opts->x_flag_generate_lto = 1;
1145 /* When generating IL, do not operate in whole-program mode.
1146 Otherwise, symbols will be privatized too early, causing link
1147 errors later. */
1148 opts->x_flag_whole_program = 0;
1149 #else
1150 error_at (loc, "LTO support has not been enabled in this configuration");
1151 #endif
1152 if (!opts->x_flag_fat_lto_objects
1153 && (!HAVE_LTO_PLUGIN
1154 || (opts_set->x_flag_use_linker_plugin
1155 && !opts->x_flag_use_linker_plugin)))
1157 if (opts_set->x_flag_fat_lto_objects)
1158 error_at (loc, "%<-fno-fat-lto-objects%> are supported only with "
1159 "linker plugin");
1160 opts->x_flag_fat_lto_objects = 1;
1163 /* -gsplit-dwarf isn't compatible with LTO, see PR88389. */
1164 if (opts->x_dwarf_split_debug_info)
1166 inform (loc, "%<-gsplit-dwarf%> is not supported with LTO,"
1167 " disabling");
1168 opts->x_dwarf_split_debug_info = 0;
1172 /* We initialize opts->x_flag_split_stack to -1 so that targets can set a
1173 default value if they choose based on other options. */
1174 if (opts->x_flag_split_stack == -1)
1175 opts->x_flag_split_stack = 0;
1176 else if (opts->x_flag_split_stack)
1178 if (!targetm_common.supports_split_stack (true, opts))
1180 error_at (loc, "%<-fsplit-stack%> is not supported by "
1181 "this compiler configuration");
1182 opts->x_flag_split_stack = 0;
1186 /* If stack splitting is turned on, and the user did not explicitly
1187 request function partitioning, turn off partitioning, as it
1188 confuses the linker when trying to handle partitioned split-stack
1189 code that calls a non-split-stack functions. But if partitioning
1190 was turned on explicitly just hope for the best. */
1191 if (opts->x_flag_split_stack
1192 && opts->x_flag_reorder_blocks_and_partition)
1193 SET_OPTION_IF_UNSET (opts, opts_set, flag_reorder_blocks_and_partition, 0);
1195 if (opts->x_flag_reorder_blocks_and_partition)
1196 SET_OPTION_IF_UNSET (opts, opts_set, flag_reorder_functions, 1);
1198 /* The -gsplit-dwarf option requires -ggnu-pubnames. */
1199 if (opts->x_dwarf_split_debug_info)
1200 opts->x_debug_generate_pub_sections = 2;
1202 if ((opts->x_flag_sanitize
1203 & (SANITIZE_USER_ADDRESS | SANITIZE_KERNEL_ADDRESS)) == 0)
1205 if (opts->x_flag_sanitize & SANITIZE_POINTER_COMPARE)
1206 error_at (loc,
1207 "%<-fsanitize=pointer-compare%> must be combined with "
1208 "%<-fsanitize=address%> or %<-fsanitize=kernel-address%>");
1209 if (opts->x_flag_sanitize & SANITIZE_POINTER_SUBTRACT)
1210 error_at (loc,
1211 "%<-fsanitize=pointer-subtract%> must be combined with "
1212 "%<-fsanitize=address%> or %<-fsanitize=kernel-address%>");
1215 /* Address sanitizers conflict with the thread sanitizer. */
1216 report_conflicting_sanitizer_options (opts, loc, SANITIZE_THREAD,
1217 SANITIZE_ADDRESS | SANITIZE_HWADDRESS);
1218 /* The leak sanitizer conflicts with the thread sanitizer. */
1219 report_conflicting_sanitizer_options (opts, loc, SANITIZE_LEAK,
1220 SANITIZE_THREAD);
1222 /* No combination of HWASAN and ASAN work together. */
1223 report_conflicting_sanitizer_options (opts, loc,
1224 SANITIZE_HWADDRESS, SANITIZE_ADDRESS);
1226 /* The userspace and kernel address sanitizers conflict with each other. */
1227 report_conflicting_sanitizer_options (opts, loc, SANITIZE_USER_HWADDRESS,
1228 SANITIZE_KERNEL_HWADDRESS);
1229 report_conflicting_sanitizer_options (opts, loc, SANITIZE_USER_ADDRESS,
1230 SANITIZE_KERNEL_ADDRESS);
1232 /* Check error recovery for -fsanitize-recover option. */
1233 for (int i = 0; sanitizer_opts[i].name != NULL; ++i)
1234 if ((opts->x_flag_sanitize_recover & sanitizer_opts[i].flag)
1235 && !sanitizer_opts[i].can_recover)
1236 error_at (loc, "%<-fsanitize-recover=%s%> is not supported",
1237 sanitizer_opts[i].name);
1239 /* Check -fsanitize-trap option. */
1240 for (int i = 0; sanitizer_opts[i].name != NULL; ++i)
1241 if ((opts->x_flag_sanitize_trap & sanitizer_opts[i].flag)
1242 && !sanitizer_opts[i].can_trap
1243 /* Allow -fsanitize-trap=all or -fsanitize-trap=undefined
1244 to set flag_sanitize_trap & SANITIZE_VPTR bit which will
1245 effectively disable -fsanitize=vptr, just disallow
1246 explicit -fsanitize-trap=vptr. */
1247 && sanitizer_opts[i].flag != SANITIZE_VPTR)
1248 error_at (loc, "%<-fsanitize-trap=%s%> is not supported",
1249 sanitizer_opts[i].name);
1251 /* When instrumenting the pointers, we don't want to remove
1252 the null pointer checks. */
1253 if (opts->x_flag_sanitize & (SANITIZE_NULL | SANITIZE_NONNULL_ATTRIBUTE
1254 | SANITIZE_RETURNS_NONNULL_ATTRIBUTE))
1255 opts->x_flag_delete_null_pointer_checks = 0;
1257 /* Aggressive compiler optimizations may cause false negatives. */
1258 if (opts->x_flag_sanitize & ~(SANITIZE_LEAK | SANITIZE_UNREACHABLE))
1259 opts->x_flag_aggressive_loop_optimizations = 0;
1261 /* Enable -fsanitize-address-use-after-scope if either address sanitizer is
1262 enabled. */
1263 if (opts->x_flag_sanitize
1264 & (SANITIZE_USER_ADDRESS | SANITIZE_USER_HWADDRESS))
1265 SET_OPTION_IF_UNSET (opts, opts_set, flag_sanitize_address_use_after_scope,
1266 true);
1268 /* Force -fstack-reuse=none in case -fsanitize-address-use-after-scope
1269 is enabled. */
1270 if (opts->x_flag_sanitize_address_use_after_scope)
1272 if (opts->x_flag_stack_reuse != SR_NONE
1273 && opts_set->x_flag_stack_reuse != SR_NONE)
1274 error_at (loc,
1275 "%<-fsanitize-address-use-after-scope%> requires "
1276 "%<-fstack-reuse=none%> option");
1278 opts->x_flag_stack_reuse = SR_NONE;
1281 if ((opts->x_flag_sanitize & SANITIZE_USER_ADDRESS) && opts->x_flag_tm)
1282 sorry ("transactional memory is not supported with %<-fsanitize=address%>");
1284 if ((opts->x_flag_sanitize & SANITIZE_KERNEL_ADDRESS) && opts->x_flag_tm)
1285 sorry ("transactional memory is not supported with "
1286 "%<-fsanitize=kernel-address%>");
1288 /* Currently live patching is not support for LTO. */
1289 if (opts->x_flag_live_patching && opts->x_flag_lto)
1290 sorry ("live patching is not supported with LTO");
1292 /* Currently vtable verification is not supported for LTO */
1293 if (opts->x_flag_vtable_verify && opts->x_flag_lto)
1294 sorry ("vtable verification is not supported with LTO");
1296 /* Control IPA optimizations based on different -flive-patching level. */
1297 if (opts->x_flag_live_patching)
1298 control_options_for_live_patching (opts, opts_set,
1299 opts->x_flag_live_patching,
1300 loc);
1302 /* Allow cunroll to grow size accordingly. */
1303 if (!opts_set->x_flag_cunroll_grow_size)
1304 opts->x_flag_cunroll_grow_size
1305 = (opts->x_flag_unroll_loops
1306 || opts->x_flag_peel_loops
1307 || opts->x_optimize >= 3);
1309 /* With -fcx-limited-range, we do cheap and quick complex arithmetic. */
1310 if (opts->x_flag_cx_limited_range)
1311 opts->x_flag_complex_method = 0;
1312 else if (opts_set->x_flag_cx_limited_range)
1313 opts->x_flag_complex_method = opts->x_flag_default_complex_method;
1315 /* With -fcx-fortran-rules, we do something in-between cheap and C99. */
1316 if (opts->x_flag_cx_fortran_rules)
1317 opts->x_flag_complex_method = 1;
1318 else if (opts_set->x_flag_cx_fortran_rules)
1319 opts->x_flag_complex_method = opts->x_flag_default_complex_method;
1321 /* Use -fvect-cost-model=cheap instead of -fvect-cost-mode=very-cheap
1322 by default with explicit -ftree-{loop,slp}-vectorize. */
1323 if (opts->x_optimize == 2
1324 && (opts_set->x_flag_tree_loop_vectorize
1325 || opts_set->x_flag_tree_vectorize))
1326 SET_OPTION_IF_UNSET (opts, opts_set, flag_vect_cost_model,
1327 VECT_COST_MODEL_CHEAP);
1329 if (opts->x_flag_gtoggle)
1331 /* Make sure to process -gtoggle only once. */
1332 opts->x_flag_gtoggle = false;
1333 if (opts->x_debug_info_level == DINFO_LEVEL_NONE)
1335 opts->x_debug_info_level = DINFO_LEVEL_NORMAL;
1337 if (opts->x_write_symbols == NO_DEBUG)
1338 opts->x_write_symbols = PREFERRED_DEBUGGING_TYPE;
1340 else
1341 opts->x_debug_info_level = DINFO_LEVEL_NONE;
1344 if (!opts_set->x_debug_nonbind_markers_p)
1345 opts->x_debug_nonbind_markers_p
1346 = (opts->x_optimize
1347 && opts->x_debug_info_level >= DINFO_LEVEL_NORMAL
1348 && dwarf_debuginfo_p (opts)
1349 && !(opts->x_flag_selective_scheduling
1350 || opts->x_flag_selective_scheduling2));
1352 /* We know which debug output will be used so we can set flag_var_tracking
1353 and flag_var_tracking_uninit if the user has not specified them. */
1354 if (opts->x_debug_info_level < DINFO_LEVEL_NORMAL
1355 || !dwarf_debuginfo_p (opts)
1356 /* We have not yet initialized debug hooks so match that to check
1357 whether we're only doing DWARF2_LINENO_DEBUGGING_INFO. */
1358 #ifndef DWARF2_DEBUGGING_INFO
1359 || true
1360 #endif
1363 if ((opts_set->x_flag_var_tracking && opts->x_flag_var_tracking == 1)
1364 || (opts_set->x_flag_var_tracking_uninit
1365 && opts->x_flag_var_tracking_uninit == 1))
1367 if (opts->x_debug_info_level < DINFO_LEVEL_NORMAL)
1368 warning_at (UNKNOWN_LOCATION, 0,
1369 "variable tracking requested, but useless unless "
1370 "producing debug info");
1371 else
1372 warning_at (UNKNOWN_LOCATION, 0,
1373 "variable tracking requested, but not supported "
1374 "by this debug format");
1376 opts->x_flag_var_tracking = 0;
1377 opts->x_flag_var_tracking_uninit = 0;
1380 /* One could use EnabledBy, but it would lead to a circular dependency. */
1381 if (!opts_set->x_flag_var_tracking_uninit)
1382 opts->x_flag_var_tracking_uninit = opts->x_flag_var_tracking;
1384 if (!opts_set->x_flag_var_tracking_assignments)
1385 opts->x_flag_var_tracking_assignments
1386 = (opts->x_flag_var_tracking
1387 && !(opts->x_flag_selective_scheduling
1388 || opts->x_flag_selective_scheduling2));
1390 if (opts->x_flag_var_tracking_assignments_toggle)
1391 opts->x_flag_var_tracking_assignments
1392 = !opts->x_flag_var_tracking_assignments;
1394 if (opts->x_flag_var_tracking_assignments && !opts->x_flag_var_tracking)
1395 opts->x_flag_var_tracking = opts->x_flag_var_tracking_assignments = -1;
1397 if (opts->x_flag_var_tracking_assignments
1398 && (opts->x_flag_selective_scheduling
1399 || opts->x_flag_selective_scheduling2))
1400 warning_at (loc, 0,
1401 "var-tracking-assignments changes selective scheduling");
1403 if (opts->x_flag_syntax_only)
1405 opts->x_write_symbols = NO_DEBUG;
1406 opts->x_profile_flag = 0;
1410 diagnose_options (opts, opts_set, loc);
1413 /* The function diagnoses incompatible combinations for provided options
1414 (OPTS and OPTS_SET) at a given LOCation. The function is called both
1415 when command line is parsed (after the target optimization hook) and
1416 when an optimize/target attribute (or pragma) is used. */
1418 void diagnose_options (gcc_options *opts, gcc_options *opts_set,
1419 location_t loc)
1421 /* The optimization to partition hot and cold basic blocks into separate
1422 sections of the .o and executable files does not work (currently)
1423 with exception handling. This is because there is no support for
1424 generating unwind info. If opts->x_flag_exceptions is turned on
1425 we need to turn off the partitioning optimization. */
1427 enum unwind_info_type ui_except
1428 = targetm_common.except_unwind_info (opts);
1430 if (opts->x_flag_exceptions
1431 && opts->x_flag_reorder_blocks_and_partition
1432 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))
1434 if (opts_set->x_flag_reorder_blocks_and_partition)
1435 inform (loc,
1436 "%<-freorder-blocks-and-partition%> does not work "
1437 "with exceptions on this architecture");
1438 opts->x_flag_reorder_blocks_and_partition = 0;
1439 opts->x_flag_reorder_blocks = 1;
1442 /* If user requested unwind info, then turn off the partitioning
1443 optimization. */
1445 if (opts->x_flag_unwind_tables
1446 && !targetm_common.unwind_tables_default
1447 && opts->x_flag_reorder_blocks_and_partition
1448 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))
1450 if (opts_set->x_flag_reorder_blocks_and_partition)
1451 inform (loc,
1452 "%<-freorder-blocks-and-partition%> does not support "
1453 "unwind info on this architecture");
1454 opts->x_flag_reorder_blocks_and_partition = 0;
1455 opts->x_flag_reorder_blocks = 1;
1458 /* If the target requested unwind info, then turn off the partitioning
1459 optimization with a different message. Likewise, if the target does not
1460 support named sections. */
1462 if (opts->x_flag_reorder_blocks_and_partition
1463 && (!targetm_common.have_named_sections
1464 || (opts->x_flag_unwind_tables
1465 && targetm_common.unwind_tables_default
1466 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))))
1468 if (opts_set->x_flag_reorder_blocks_and_partition)
1469 inform (loc,
1470 "%<-freorder-blocks-and-partition%> does not work "
1471 "on this architecture");
1472 opts->x_flag_reorder_blocks_and_partition = 0;
1473 opts->x_flag_reorder_blocks = 1;
1479 #define LEFT_COLUMN 27
1481 /* Output ITEM, of length ITEM_WIDTH, in the left column,
1482 followed by word-wrapped HELP in a second column. */
1483 static void
1484 wrap_help (const char *help,
1485 const char *item,
1486 unsigned int item_width,
1487 unsigned int columns)
1489 unsigned int col_width = LEFT_COLUMN;
1490 unsigned int remaining, room, len;
1492 remaining = strlen (help);
1496 room = columns - 3 - MAX (col_width, item_width);
1497 if (room > columns)
1498 room = 0;
1499 len = remaining;
1501 if (room < len)
1503 unsigned int i;
1505 for (i = 0; help[i]; i++)
1507 if (i >= room && len != remaining)
1508 break;
1509 if (help[i] == ' ')
1510 len = i;
1511 else if ((help[i] == '-' || help[i] == '/')
1512 && help[i + 1] != ' '
1513 && i > 0 && ISALPHA (help[i - 1]))
1514 len = i + 1;
1518 printf (" %-*.*s %.*s\n", col_width, item_width, item, len, help);
1519 item_width = 0;
1520 while (help[len] == ' ')
1521 len++;
1522 help += len;
1523 remaining -= len;
1525 while (remaining);
1528 /* Data structure used to print list of valid option values. */
1530 class option_help_tuple
1532 public:
1533 option_help_tuple (int code, vec<const char *> values):
1534 m_code (code), m_values (values)
1537 /* Code of an option. */
1538 int m_code;
1540 /* List of possible values. */
1541 vec<const char *> m_values;
1544 /* Print help for a specific front-end, etc. */
1545 static void
1546 print_filtered_help (unsigned int include_flags,
1547 unsigned int exclude_flags,
1548 unsigned int any_flags,
1549 unsigned int columns,
1550 struct gcc_options *opts,
1551 unsigned int lang_mask)
1553 unsigned int i;
1554 const char *help;
1555 bool found = false;
1556 bool displayed = false;
1557 char new_help[256];
1559 if (!opts->x_help_printed)
1560 opts->x_help_printed = XCNEWVAR (char, cl_options_count);
1562 if (!opts->x_help_enum_printed)
1563 opts->x_help_enum_printed = XCNEWVAR (char, cl_enums_count);
1565 auto_vec<option_help_tuple> help_tuples;
1567 for (i = 0; i < cl_options_count; i++)
1569 const struct cl_option *option = cl_options + i;
1570 unsigned int len;
1571 const char *opt;
1572 const char *tab;
1574 if (include_flags == 0
1575 || ((option->flags & include_flags) != include_flags))
1577 if ((option->flags & any_flags) == 0)
1578 continue;
1581 /* Skip unwanted switches. */
1582 if ((option->flags & exclude_flags) != 0)
1583 continue;
1585 /* The driver currently prints its own help text. */
1586 if ((option->flags & CL_DRIVER) != 0
1587 && (option->flags & (((1U << cl_lang_count) - 1)
1588 | CL_COMMON | CL_TARGET)) == 0)
1589 continue;
1591 /* If an option contains a language specification,
1592 exclude it from common unless all languages are present. */
1593 if ((include_flags & CL_COMMON)
1594 && !(option->flags & CL_DRIVER)
1595 && (option->flags & CL_LANG_ALL)
1596 && (option->flags & CL_LANG_ALL) != CL_LANG_ALL)
1597 continue;
1599 found = true;
1600 /* Skip switches that have already been printed. */
1601 if (opts->x_help_printed[i])
1602 continue;
1604 opts->x_help_printed[i] = true;
1606 help = option->help;
1607 if (help == NULL)
1609 if (exclude_flags & CL_UNDOCUMENTED)
1610 continue;
1612 help = undocumented_msg;
1615 /* Get the translation. */
1616 help = _(help);
1618 if (option->alias_target < N_OPTS
1619 && cl_options [option->alias_target].help)
1621 const struct cl_option *target = cl_options + option->alias_target;
1622 if (option->help == NULL)
1624 /* The option is undocumented but is an alias for an option that
1625 is documented. If the option has alias arguments, then its
1626 purpose is to provide certain arguments to the other option, so
1627 inform the reader of this. Otherwise, point the reader to the
1628 other option in preference to the former. */
1630 if (option->alias_arg)
1632 if (option->neg_alias_arg)
1633 snprintf (new_help, sizeof new_help,
1634 _("Same as %s%s (or, in negated form, %s%s)."),
1635 target->opt_text, option->alias_arg,
1636 target->opt_text, option->neg_alias_arg);
1637 else
1638 snprintf (new_help, sizeof new_help,
1639 _("Same as %s%s."),
1640 target->opt_text, option->alias_arg);
1642 else
1643 snprintf (new_help, sizeof new_help,
1644 _("Same as %s."),
1645 target->opt_text);
1647 else
1649 /* For documented options with aliases, mention the aliased
1650 option's name for reference. */
1651 snprintf (new_help, sizeof new_help,
1652 _("%s Same as %s."),
1653 help, cl_options [option->alias_target].opt_text);
1656 help = new_help;
1659 if (option->warn_message)
1661 /* Mention that the use of the option will trigger a warning. */
1662 if (help == new_help)
1663 snprintf (new_help + strlen (new_help),
1664 sizeof new_help - strlen (new_help),
1665 " %s", _(use_diagnosed_msg));
1666 else
1667 snprintf (new_help, sizeof new_help,
1668 "%s %s", help, _(use_diagnosed_msg));
1670 help = new_help;
1673 /* Find the gap between the name of the
1674 option and its descriptive text. */
1675 tab = strchr (help, '\t');
1676 if (tab)
1678 len = tab - help;
1679 opt = help;
1680 help = tab + 1;
1682 else
1684 opt = option->opt_text;
1685 len = strlen (opt);
1688 /* With the -Q option enabled we change the descriptive text associated
1689 with an option to be an indication of its current setting. */
1690 if (!opts->x_quiet_flag)
1692 void *flag_var = option_flag_var (i, opts);
1694 if (len < (LEFT_COLUMN + 2))
1695 strcpy (new_help, "\t\t");
1696 else
1697 strcpy (new_help, "\t");
1699 /* Set to print whether the option is enabled or disabled,
1700 or, if it's an alias for another option, the name of
1701 the aliased option. */
1702 bool print_state = false;
1704 if (flag_var != NULL
1705 && option->var_type != CLVC_DEFER)
1707 /* If OPTION is only available for a specific subset
1708 of languages other than this one, mention them. */
1709 bool avail_for_lang = true;
1710 if (unsigned langset = option->flags & CL_LANG_ALL)
1712 if (!(langset & lang_mask))
1714 avail_for_lang = false;
1715 strcat (new_help, _("[available in "));
1716 for (unsigned i = 0, n = 0; (1U << i) < CL_LANG_ALL; ++i)
1717 if (langset & (1U << i))
1719 if (n++)
1720 strcat (new_help, ", ");
1721 strcat (new_help, lang_names[i]);
1723 strcat (new_help, "]");
1726 if (!avail_for_lang)
1727 ; /* Print nothing else if the option is not available
1728 in the current language. */
1729 else if (option->flags & CL_JOINED)
1731 if (option->var_type == CLVC_STRING)
1733 if (* (const char **) flag_var != NULL)
1734 snprintf (new_help + strlen (new_help),
1735 sizeof (new_help) - strlen (new_help),
1736 "%s", * (const char **) flag_var);
1738 else if (option->var_type == CLVC_ENUM)
1740 const struct cl_enum *e = &cl_enums[option->var_enum];
1741 int value;
1742 const char *arg = NULL;
1744 value = e->get (flag_var);
1745 enum_value_to_arg (e->values, &arg, value, lang_mask);
1746 if (arg == NULL)
1747 arg = _("[default]");
1748 snprintf (new_help + strlen (new_help),
1749 sizeof (new_help) - strlen (new_help),
1750 "%s", arg);
1752 else
1754 if (option->cl_host_wide_int)
1755 sprintf (new_help + strlen (new_help),
1756 _("%llu bytes"), (unsigned long long)
1757 *(unsigned HOST_WIDE_INT *) flag_var);
1758 else
1759 sprintf (new_help + strlen (new_help),
1760 "%i", * (int *) flag_var);
1763 else
1764 print_state = true;
1766 else
1767 /* When there is no argument, print the option state only
1768 if the option takes no argument. */
1769 print_state = !(option->flags & CL_JOINED);
1771 if (print_state)
1773 if (option->alias_target < N_OPTS
1774 && option->alias_target != OPT_SPECIAL_warn_removed
1775 && option->alias_target != OPT_SPECIAL_ignore
1776 && option->alias_target != OPT_SPECIAL_input_file
1777 && option->alias_target != OPT_SPECIAL_program_name
1778 && option->alias_target != OPT_SPECIAL_unknown)
1780 const struct cl_option *target
1781 = &cl_options[option->alias_target];
1782 sprintf (new_help + strlen (new_help), "%s%s",
1783 target->opt_text,
1784 option->alias_arg ? option->alias_arg : "");
1786 else if (option->alias_target == OPT_SPECIAL_ignore)
1787 strcat (new_help, ("[ignored]"));
1788 else
1790 /* Print the state for an on/off option. */
1791 int ena = option_enabled (i, lang_mask, opts);
1792 if (ena > 0)
1793 strcat (new_help, _("[enabled]"));
1794 else if (ena == 0)
1795 strcat (new_help, _("[disabled]"));
1799 help = new_help;
1802 if (option->range_max != -1)
1804 char b[128];
1805 snprintf (b, sizeof (b), "<%d,%d>", option->range_min,
1806 option->range_max);
1807 opt = concat (opt, b, NULL);
1808 len += strlen (b);
1811 wrap_help (help, opt, len, columns);
1812 displayed = true;
1814 if (option->var_type == CLVC_ENUM
1815 && opts->x_help_enum_printed[option->var_enum] != 2)
1816 opts->x_help_enum_printed[option->var_enum] = 1;
1817 else
1819 vec<const char *> option_values
1820 = targetm_common.get_valid_option_values (i, NULL);
1821 if (!option_values.is_empty ())
1822 help_tuples.safe_push (option_help_tuple (i, option_values));
1826 if (! found)
1828 unsigned int langs = include_flags & CL_LANG_ALL;
1830 if (langs == 0)
1831 printf (_(" No options with the desired characteristics were found\n"));
1832 else
1834 unsigned int i;
1836 /* PR 31349: Tell the user how to see all of the
1837 options supported by a specific front end. */
1838 for (i = 0; (1U << i) < CL_LANG_ALL; i ++)
1839 if ((1U << i) & langs)
1840 printf (_(" None found. Use --help=%s to show *all* the options supported by the %s front-end.\n"),
1841 lang_names[i], lang_names[i]);
1845 else if (! displayed)
1846 printf (_(" All options with the desired characteristics have already been displayed\n"));
1848 putchar ('\n');
1850 /* Print details of enumerated option arguments, if those
1851 enumerations have help text headings provided. If no help text
1852 is provided, presume that the possible values are listed in the
1853 help text for the relevant options. */
1854 for (i = 0; i < cl_enums_count; i++)
1856 unsigned int j, pos;
1858 if (opts->x_help_enum_printed[i] != 1)
1859 continue;
1860 if (cl_enums[i].help == NULL)
1861 continue;
1862 printf (" %s\n ", _(cl_enums[i].help));
1863 pos = 4;
1864 for (j = 0; cl_enums[i].values[j].arg != NULL; j++)
1866 unsigned int len = strlen (cl_enums[i].values[j].arg);
1868 if (pos > 4 && pos + 1 + len <= columns)
1870 printf (" %s", cl_enums[i].values[j].arg);
1871 pos += 1 + len;
1873 else
1875 if (pos > 4)
1877 printf ("\n ");
1878 pos = 4;
1880 printf ("%s", cl_enums[i].values[j].arg);
1881 pos += len;
1884 printf ("\n\n");
1885 opts->x_help_enum_printed[i] = 2;
1888 for (unsigned i = 0; i < help_tuples.length (); i++)
1890 const struct cl_option *option = cl_options + help_tuples[i].m_code;
1891 printf (_(" Known valid arguments for %s option:\n "),
1892 option->opt_text);
1893 for (unsigned j = 0; j < help_tuples[i].m_values.length (); j++)
1894 printf (" %s", help_tuples[i].m_values[j]);
1895 printf ("\n\n");
1899 /* Display help for a specified type of option.
1900 The options must have ALL of the INCLUDE_FLAGS set
1901 ANY of the flags in the ANY_FLAGS set
1902 and NONE of the EXCLUDE_FLAGS set. The current option state is in
1903 OPTS; LANG_MASK is used for interpreting enumerated option state. */
1904 static void
1905 print_specific_help (unsigned int include_flags,
1906 unsigned int exclude_flags,
1907 unsigned int any_flags,
1908 struct gcc_options *opts,
1909 unsigned int lang_mask)
1911 unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1912 const char * description = NULL;
1913 const char * descrip_extra = "";
1914 size_t i;
1915 unsigned int flag;
1917 /* Sanity check: Make sure that we do not have more
1918 languages than we have bits available to enumerate them. */
1919 gcc_assert ((1U << cl_lang_count) <= CL_MIN_OPTION_CLASS);
1921 /* If we have not done so already, obtain
1922 the desired maximum width of the output. */
1923 if (opts->x_help_columns == 0)
1925 opts->x_help_columns = get_terminal_width ();
1926 if (opts->x_help_columns == INT_MAX)
1927 /* Use a reasonable default. */
1928 opts->x_help_columns = 80;
1931 /* Decide upon the title for the options that we are going to display. */
1932 for (i = 0, flag = 1; flag <= CL_MAX_OPTION_CLASS; flag <<= 1, i ++)
1934 switch (flag & include_flags)
1936 case 0:
1937 case CL_DRIVER:
1938 break;
1940 case CL_TARGET:
1941 description = _("The following options are target specific");
1942 break;
1943 case CL_WARNING:
1944 description = _("The following options control compiler warning messages");
1945 break;
1946 case CL_OPTIMIZATION:
1947 description = _("The following options control optimizations");
1948 break;
1949 case CL_COMMON:
1950 description = _("The following options are language-independent");
1951 break;
1952 case CL_PARAMS:
1953 description = _("The following options control parameters");
1954 break;
1955 default:
1956 if (i >= cl_lang_count)
1957 break;
1958 if (exclude_flags & all_langs_mask)
1959 description = _("The following options are specific to just the language ");
1960 else
1961 description = _("The following options are supported by the language ");
1962 descrip_extra = lang_names [i];
1963 break;
1967 if (description == NULL)
1969 if (any_flags == 0)
1971 if (include_flags & CL_UNDOCUMENTED)
1972 description = _("The following options are not documented");
1973 else if (include_flags & CL_SEPARATE)
1974 description = _("The following options take separate arguments");
1975 else if (include_flags & CL_JOINED)
1976 description = _("The following options take joined arguments");
1977 else
1979 internal_error ("unrecognized %<include_flags 0x%x%> passed "
1980 "to %<print_specific_help%>",
1981 include_flags);
1982 return;
1985 else
1987 if (any_flags & all_langs_mask)
1988 description = _("The following options are language-related");
1989 else
1990 description = _("The following options are language-independent");
1994 printf ("%s%s:\n", description, descrip_extra);
1995 print_filtered_help (include_flags, exclude_flags, any_flags,
1996 opts->x_help_columns, opts, lang_mask);
1999 /* Enable FDO-related flags. */
2001 static void
2002 enable_fdo_optimizations (struct gcc_options *opts,
2003 struct gcc_options *opts_set,
2004 int value)
2006 SET_OPTION_IF_UNSET (opts, opts_set, flag_branch_probabilities, value);
2007 SET_OPTION_IF_UNSET (opts, opts_set, flag_profile_values, value);
2008 SET_OPTION_IF_UNSET (opts, opts_set, flag_unroll_loops, value);
2009 SET_OPTION_IF_UNSET (opts, opts_set, flag_peel_loops, value);
2010 SET_OPTION_IF_UNSET (opts, opts_set, flag_tracer, value);
2011 SET_OPTION_IF_UNSET (opts, opts_set, flag_value_profile_transformations,
2012 value);
2013 SET_OPTION_IF_UNSET (opts, opts_set, flag_inline_functions, value);
2014 SET_OPTION_IF_UNSET (opts, opts_set, flag_ipa_cp, value);
2015 if (value)
2017 SET_OPTION_IF_UNSET (opts, opts_set, flag_ipa_cp_clone, 1);
2018 SET_OPTION_IF_UNSET (opts, opts_set, flag_ipa_bit_cp, 1);
2020 SET_OPTION_IF_UNSET (opts, opts_set, flag_predictive_commoning, value);
2021 SET_OPTION_IF_UNSET (opts, opts_set, flag_split_loops, value);
2022 SET_OPTION_IF_UNSET (opts, opts_set, flag_unswitch_loops, value);
2023 SET_OPTION_IF_UNSET (opts, opts_set, flag_gcse_after_reload, value);
2024 SET_OPTION_IF_UNSET (opts, opts_set, flag_tree_loop_vectorize, value);
2025 SET_OPTION_IF_UNSET (opts, opts_set, flag_tree_slp_vectorize, value);
2026 SET_OPTION_IF_UNSET (opts, opts_set, flag_version_loops_for_strides, value);
2027 SET_OPTION_IF_UNSET (opts, opts_set, flag_vect_cost_model,
2028 VECT_COST_MODEL_DYNAMIC);
2029 SET_OPTION_IF_UNSET (opts, opts_set, flag_tree_loop_distribute_patterns,
2030 value);
2031 SET_OPTION_IF_UNSET (opts, opts_set, flag_loop_interchange, value);
2032 SET_OPTION_IF_UNSET (opts, opts_set, flag_unroll_jam, value);
2033 SET_OPTION_IF_UNSET (opts, opts_set, flag_tree_loop_distribution, value);
2036 /* -f{,no-}sanitize{,-recover}= suboptions. */
2037 const struct sanitizer_opts_s sanitizer_opts[] =
2039 #define SANITIZER_OPT(name, flags, recover, trap) \
2040 { #name, flags, sizeof #name - 1, recover, trap }
2041 SANITIZER_OPT (address, (SANITIZE_ADDRESS | SANITIZE_USER_ADDRESS), true,
2042 false),
2043 SANITIZER_OPT (hwaddress, (SANITIZE_HWADDRESS | SANITIZE_USER_HWADDRESS),
2044 true, false),
2045 SANITIZER_OPT (kernel-address, (SANITIZE_ADDRESS | SANITIZE_KERNEL_ADDRESS),
2046 true, false),
2047 SANITIZER_OPT (kernel-hwaddress,
2048 (SANITIZE_HWADDRESS | SANITIZE_KERNEL_HWADDRESS),
2049 true, false),
2050 SANITIZER_OPT (pointer-compare, SANITIZE_POINTER_COMPARE, true, false),
2051 SANITIZER_OPT (pointer-subtract, SANITIZE_POINTER_SUBTRACT, true, false),
2052 SANITIZER_OPT (thread, SANITIZE_THREAD, false, false),
2053 SANITIZER_OPT (leak, SANITIZE_LEAK, false, false),
2054 SANITIZER_OPT (shift, SANITIZE_SHIFT, true, true),
2055 SANITIZER_OPT (shift-base, SANITIZE_SHIFT_BASE, true, true),
2056 SANITIZER_OPT (shift-exponent, SANITIZE_SHIFT_EXPONENT, true, true),
2057 SANITIZER_OPT (integer-divide-by-zero, SANITIZE_DIVIDE, true, true),
2058 SANITIZER_OPT (undefined, SANITIZE_UNDEFINED, true, true),
2059 SANITIZER_OPT (unreachable, SANITIZE_UNREACHABLE, false, true),
2060 SANITIZER_OPT (vla-bound, SANITIZE_VLA, true, true),
2061 SANITIZER_OPT (return, SANITIZE_RETURN, false, true),
2062 SANITIZER_OPT (null, SANITIZE_NULL, true, true),
2063 SANITIZER_OPT (signed-integer-overflow, SANITIZE_SI_OVERFLOW, true, true),
2064 SANITIZER_OPT (bool, SANITIZE_BOOL, true, true),
2065 SANITIZER_OPT (enum, SANITIZE_ENUM, true, true),
2066 SANITIZER_OPT (float-divide-by-zero, SANITIZE_FLOAT_DIVIDE, true, true),
2067 SANITIZER_OPT (float-cast-overflow, SANITIZE_FLOAT_CAST, true, true),
2068 SANITIZER_OPT (bounds, SANITIZE_BOUNDS, true, true),
2069 SANITIZER_OPT (bounds-strict, SANITIZE_BOUNDS | SANITIZE_BOUNDS_STRICT, true,
2070 true),
2071 SANITIZER_OPT (alignment, SANITIZE_ALIGNMENT, true, true),
2072 SANITIZER_OPT (nonnull-attribute, SANITIZE_NONNULL_ATTRIBUTE, true, true),
2073 SANITIZER_OPT (returns-nonnull-attribute, SANITIZE_RETURNS_NONNULL_ATTRIBUTE,
2074 true, true),
2075 SANITIZER_OPT (object-size, SANITIZE_OBJECT_SIZE, true, true),
2076 SANITIZER_OPT (vptr, SANITIZE_VPTR, true, false),
2077 SANITIZER_OPT (pointer-overflow, SANITIZE_POINTER_OVERFLOW, true, true),
2078 SANITIZER_OPT (builtin, SANITIZE_BUILTIN, true, true),
2079 SANITIZER_OPT (shadow-call-stack, SANITIZE_SHADOW_CALL_STACK, false, false),
2080 SANITIZER_OPT (all, ~0U, true, true),
2081 #undef SANITIZER_OPT
2082 { NULL, 0U, 0UL, false, false }
2085 /* -fzero-call-used-regs= suboptions. */
2086 const struct zero_call_used_regs_opts_s zero_call_used_regs_opts[] =
2088 #define ZERO_CALL_USED_REGS_OPT(name, flags) \
2089 { #name, flags }
2090 ZERO_CALL_USED_REGS_OPT (skip, zero_regs_flags::SKIP),
2091 ZERO_CALL_USED_REGS_OPT (used-gpr-arg, zero_regs_flags::USED_GPR_ARG),
2092 ZERO_CALL_USED_REGS_OPT (used-gpr, zero_regs_flags::USED_GPR),
2093 ZERO_CALL_USED_REGS_OPT (used-arg, zero_regs_flags::USED_ARG),
2094 ZERO_CALL_USED_REGS_OPT (used, zero_regs_flags::USED),
2095 ZERO_CALL_USED_REGS_OPT (all-gpr-arg, zero_regs_flags::ALL_GPR_ARG),
2096 ZERO_CALL_USED_REGS_OPT (all-gpr, zero_regs_flags::ALL_GPR),
2097 ZERO_CALL_USED_REGS_OPT (all-arg, zero_regs_flags::ALL_ARG),
2098 ZERO_CALL_USED_REGS_OPT (all, zero_regs_flags::ALL),
2099 #undef ZERO_CALL_USED_REGS_OPT
2100 {NULL, 0U}
2103 /* A struct for describing a run of chars within a string. */
2105 class string_fragment
2107 public:
2108 string_fragment (const char *start, size_t len)
2109 : m_start (start), m_len (len) {}
2111 const char *m_start;
2112 size_t m_len;
2115 /* Specialization of edit_distance_traits for string_fragment,
2116 for use by get_closest_sanitizer_option. */
2118 template <>
2119 struct edit_distance_traits<const string_fragment &>
2121 static size_t get_length (const string_fragment &fragment)
2123 return fragment.m_len;
2126 static const char *get_string (const string_fragment &fragment)
2128 return fragment.m_start;
2132 /* Given ARG, an unrecognized sanitizer option, return the best
2133 matching sanitizer option, or NULL if there isn't one.
2134 OPTS is array of candidate sanitizer options.
2135 CODE is OPT_fsanitize_, OPT_fsanitize_recover_ or OPT_fsanitize_trap_.
2136 VALUE is non-zero for the regular form of the option, zero
2137 for the "no-" form (e.g. "-fno-sanitize-recover="). */
2139 static const char *
2140 get_closest_sanitizer_option (const string_fragment &arg,
2141 const struct sanitizer_opts_s *opts,
2142 enum opt_code code, int value)
2144 best_match <const string_fragment &, const char*> bm (arg);
2145 for (int i = 0; opts[i].name != NULL; ++i)
2147 /* -fsanitize=all is not valid, so don't offer it. */
2148 if (code == OPT_fsanitize_
2149 && opts[i].flag == ~0U
2150 && value)
2151 continue;
2153 /* For -fsanitize-recover= (and not -fno-sanitize-recover=),
2154 don't offer the non-recoverable options. */
2155 if (code == OPT_fsanitize_recover_
2156 && !opts[i].can_recover
2157 && value)
2158 continue;
2160 /* For -fsanitize-trap= (and not -fno-sanitize-trap=),
2161 don't offer the non-trapping options. */
2162 if (code == OPT_fsanitize_trap_
2163 && !opts[i].can_trap
2164 && value)
2165 continue;
2167 bm.consider (opts[i].name);
2169 return bm.get_best_meaningful_candidate ();
2172 /* Parse comma separated sanitizer suboptions from P for option SCODE,
2173 adjust previous FLAGS and return new ones. If COMPLAIN is false,
2174 don't issue diagnostics. */
2176 unsigned int
2177 parse_sanitizer_options (const char *p, location_t loc, int scode,
2178 unsigned int flags, int value, bool complain)
2180 enum opt_code code = (enum opt_code) scode;
2182 while (*p != 0)
2184 size_t len, i;
2185 bool found = false;
2186 const char *comma = strchr (p, ',');
2188 if (comma == NULL)
2189 len = strlen (p);
2190 else
2191 len = comma - p;
2192 if (len == 0)
2194 p = comma + 1;
2195 continue;
2198 /* Check to see if the string matches an option class name. */
2199 for (i = 0; sanitizer_opts[i].name != NULL; ++i)
2200 if (len == sanitizer_opts[i].len
2201 && memcmp (p, sanitizer_opts[i].name, len) == 0)
2203 /* Handle both -fsanitize and -fno-sanitize cases. */
2204 if (value && sanitizer_opts[i].flag == ~0U)
2206 if (code == OPT_fsanitize_)
2208 if (complain)
2209 error_at (loc, "%<-fsanitize=all%> option is not valid");
2211 else if (code == OPT_fsanitize_recover_)
2212 flags |= ~(SANITIZE_THREAD | SANITIZE_LEAK
2213 | SANITIZE_UNREACHABLE | SANITIZE_RETURN
2214 | SANITIZE_SHADOW_CALL_STACK);
2215 else /* if (code == OPT_fsanitize_trap_) */
2216 flags |= (SANITIZE_UNDEFINED
2217 | SANITIZE_UNDEFINED_NONDEFAULT);
2219 else if (value)
2221 /* Do not enable -fsanitize-recover=unreachable and
2222 -fsanitize-recover=return if -fsanitize-recover=undefined
2223 is selected. */
2224 if (code == OPT_fsanitize_recover_
2225 && sanitizer_opts[i].flag == SANITIZE_UNDEFINED)
2226 flags |= (SANITIZE_UNDEFINED
2227 & ~(SANITIZE_UNREACHABLE | SANITIZE_RETURN));
2228 else if (code == OPT_fsanitize_trap_
2229 && sanitizer_opts[i].flag == SANITIZE_VPTR)
2230 error_at (loc, "%<-fsanitize-trap=%s%> is not supported",
2231 sanitizer_opts[i].name);
2232 else
2233 flags |= sanitizer_opts[i].flag;
2235 else
2236 flags &= ~sanitizer_opts[i].flag;
2237 found = true;
2238 break;
2241 if (! found && complain)
2243 const char *hint
2244 = get_closest_sanitizer_option (string_fragment (p, len),
2245 sanitizer_opts, code, value);
2247 const char *suffix;
2248 if (code == OPT_fsanitize_recover_)
2249 suffix = "-recover";
2250 else if (code == OPT_fsanitize_trap_)
2251 suffix = "-trap";
2252 else
2253 suffix = "";
2255 if (hint)
2256 error_at (loc,
2257 "unrecognized argument to %<-f%ssanitize%s=%> "
2258 "option: %q.*s; did you mean %qs?",
2259 value ? "" : "no-",
2260 suffix, (int) len, p, hint);
2261 else
2262 error_at (loc,
2263 "unrecognized argument to %<-f%ssanitize%s=%> option: "
2264 "%q.*s", value ? "" : "no-",
2265 suffix, (int) len, p);
2268 if (comma == NULL)
2269 break;
2270 p = comma + 1;
2272 return flags;
2275 /* Parse string values of no_sanitize attribute passed in VALUE.
2276 Values are separated with comma. */
2278 unsigned int
2279 parse_no_sanitize_attribute (char *value)
2281 unsigned int flags = 0;
2282 unsigned int i;
2283 char *q = strtok (value, ",");
2285 while (q != NULL)
2287 for (i = 0; sanitizer_opts[i].name != NULL; ++i)
2288 if (strcmp (sanitizer_opts[i].name, q) == 0)
2290 flags |= sanitizer_opts[i].flag;
2291 if (sanitizer_opts[i].flag == SANITIZE_UNDEFINED)
2292 flags |= SANITIZE_UNDEFINED_NONDEFAULT;
2293 break;
2296 if (sanitizer_opts[i].name == NULL)
2297 warning (OPT_Wattributes,
2298 "%qs attribute directive ignored", q);
2300 q = strtok (NULL, ",");
2303 return flags;
2306 /* Parse -fzero-call-used-regs suboptions from ARG, return the FLAGS. */
2308 unsigned int
2309 parse_zero_call_used_regs_options (const char *arg)
2311 unsigned int flags = 0;
2313 /* Check to see if the string matches a sub-option name. */
2314 for (unsigned int i = 0; zero_call_used_regs_opts[i].name != NULL; ++i)
2315 if (strcmp (arg, zero_call_used_regs_opts[i].name) == 0)
2317 flags = zero_call_used_regs_opts[i].flag;
2318 break;
2321 if (!flags)
2322 error ("unrecognized argument to %<-fzero-call-used-regs=%>: %qs", arg);
2324 return flags;
2327 /* Parse -falign-NAME format for a FLAG value. Return individual
2328 parsed integer values into RESULT_VALUES array. If REPORT_ERROR is
2329 set, print error message at LOC location. */
2331 bool
2332 parse_and_check_align_values (const char *flag,
2333 const char *name,
2334 auto_vec<unsigned> &result_values,
2335 bool report_error,
2336 location_t loc)
2338 char *str = xstrdup (flag);
2339 for (char *p = strtok (str, ":"); p; p = strtok (NULL, ":"))
2341 char *end;
2342 int v = strtol (p, &end, 10);
2343 if (*end != '\0' || v < 0)
2345 if (report_error)
2346 error_at (loc, "invalid arguments for %<-falign-%s%> option: %qs",
2347 name, flag);
2349 return false;
2352 result_values.safe_push ((unsigned)v);
2355 free (str);
2357 /* Check that we have a correct number of values. */
2358 if (result_values.is_empty () || result_values.length () > 4)
2360 if (report_error)
2361 error_at (loc, "invalid number of arguments for %<-falign-%s%> "
2362 "option: %qs", name, flag);
2363 return false;
2366 for (unsigned i = 0; i < result_values.length (); i++)
2367 if (result_values[i] > MAX_CODE_ALIGN_VALUE)
2369 if (report_error)
2370 error_at (loc, "%<-falign-%s%> is not between 0 and %d",
2371 name, MAX_CODE_ALIGN_VALUE);
2372 return false;
2375 return true;
2378 /* Check that alignment value FLAG for -falign-NAME is valid at a given
2379 location LOC. OPT_STR points to the stored -falign-NAME=argument and
2380 OPT_FLAG points to the associated -falign-NAME on/off flag. */
2382 static void
2383 check_alignment_argument (location_t loc, const char *flag, const char *name,
2384 int *opt_flag, const char **opt_str)
2386 auto_vec<unsigned> align_result;
2387 parse_and_check_align_values (flag, name, align_result, true, loc);
2389 if (align_result.length() >= 1 && align_result[0] == 0)
2391 *opt_flag = 1;
2392 *opt_str = NULL;
2396 /* Parse argument of -fpatchable-function-entry option ARG and store
2397 corresponding values to PATCH_AREA_SIZE and PATCH_AREA_START.
2398 If REPORT_ERROR is set to true, generate error for a problematic
2399 option arguments. */
2401 void
2402 parse_and_check_patch_area (const char *arg, bool report_error,
2403 HOST_WIDE_INT *patch_area_size,
2404 HOST_WIDE_INT *patch_area_start)
2406 *patch_area_size = 0;
2407 *patch_area_start = 0;
2409 if (arg == NULL)
2410 return;
2412 char *patch_area_arg = xstrdup (arg);
2413 char *comma = strchr (patch_area_arg, ',');
2414 if (comma)
2416 *comma = '\0';
2417 *patch_area_size = integral_argument (patch_area_arg);
2418 *patch_area_start = integral_argument (comma + 1);
2420 else
2421 *patch_area_size = integral_argument (patch_area_arg);
2423 if (*patch_area_size < 0
2424 || *patch_area_size > USHRT_MAX
2425 || *patch_area_start < 0
2426 || *patch_area_start > USHRT_MAX
2427 || *patch_area_size < *patch_area_start)
2428 if (report_error)
2429 error ("invalid arguments for %<-fpatchable-function-entry%>");
2431 free (patch_area_arg);
2434 /* Print help when OPT__help_ is set. */
2436 void
2437 print_help (struct gcc_options *opts, unsigned int lang_mask,
2438 const char *help_option_argument)
2440 const char *a = help_option_argument;
2441 unsigned int include_flags = 0;
2442 /* Note - by default we include undocumented options when listing
2443 specific classes. If you only want to see documented options
2444 then add ",^undocumented" to the --help= option. E.g.:
2446 --help=target,^undocumented */
2447 unsigned int exclude_flags = 0;
2449 if (lang_mask == CL_DRIVER)
2450 return;
2452 /* Walk along the argument string, parsing each word in turn.
2453 The format is:
2454 arg = [^]{word}[,{arg}]
2455 word = {optimizers|target|warnings|undocumented|
2456 params|common|<language>} */
2457 while (*a != 0)
2459 static const struct
2461 const char *string;
2462 unsigned int flag;
2464 specifics[] =
2466 { "optimizers", CL_OPTIMIZATION },
2467 { "target", CL_TARGET },
2468 { "warnings", CL_WARNING },
2469 { "undocumented", CL_UNDOCUMENTED },
2470 { "params", CL_PARAMS },
2471 { "joined", CL_JOINED },
2472 { "separate", CL_SEPARATE },
2473 { "common", CL_COMMON },
2474 { NULL, 0 }
2476 unsigned int *pflags;
2477 const char *comma;
2478 unsigned int lang_flag, specific_flag;
2479 unsigned int len;
2480 unsigned int i;
2482 if (*a == '^')
2484 ++a;
2485 if (*a == '\0')
2487 error ("missing argument to %qs", "--help=^");
2488 break;
2490 pflags = &exclude_flags;
2492 else
2493 pflags = &include_flags;
2495 comma = strchr (a, ',');
2496 if (comma == NULL)
2497 len = strlen (a);
2498 else
2499 len = comma - a;
2500 if (len == 0)
2502 a = comma + 1;
2503 continue;
2506 /* Check to see if the string matches an option class name. */
2507 for (i = 0, specific_flag = 0; specifics[i].string != NULL; i++)
2508 if (strncasecmp (a, specifics[i].string, len) == 0)
2510 specific_flag = specifics[i].flag;
2511 break;
2514 /* Check to see if the string matches a language name.
2515 Note - we rely upon the alpha-sorted nature of the entries in
2516 the lang_names array, specifically that shorter names appear
2517 before their longer variants. (i.e. C before C++). That way
2518 when we are attempting to match --help=c for example we will
2519 match with C first and not C++. */
2520 for (i = 0, lang_flag = 0; i < cl_lang_count; i++)
2521 if (strncasecmp (a, lang_names[i], len) == 0)
2523 lang_flag = 1U << i;
2524 break;
2527 if (specific_flag != 0)
2529 if (lang_flag == 0)
2530 *pflags |= specific_flag;
2531 else
2533 /* The option's argument matches both the start of a
2534 language name and the start of an option class name.
2535 We have a special case for when the user has
2536 specified "--help=c", but otherwise we have to issue
2537 a warning. */
2538 if (strncasecmp (a, "c", len) == 0)
2539 *pflags |= lang_flag;
2540 else
2541 warning (0,
2542 "%<--help%> argument %q.*s is ambiguous, "
2543 "please be more specific",
2544 len, a);
2547 else if (lang_flag != 0)
2548 *pflags |= lang_flag;
2549 else
2550 warning (0,
2551 "unrecognized argument to %<--help=%> option: %q.*s",
2552 len, a);
2554 if (comma == NULL)
2555 break;
2556 a = comma + 1;
2559 /* We started using PerFunction/Optimization for parameters and
2560 a warning. We should exclude these from optimization options. */
2561 if (include_flags & CL_OPTIMIZATION)
2562 exclude_flags |= CL_WARNING;
2563 if (!(include_flags & CL_PARAMS))
2564 exclude_flags |= CL_PARAMS;
2566 if (include_flags)
2567 print_specific_help (include_flags, exclude_flags, 0, opts,
2568 lang_mask);
2571 /* Handle target- and language-independent options. Return zero to
2572 generate an "unknown option" message. Only options that need
2573 extra handling need to be listed here; if you simply want
2574 DECODED->value assigned to a variable, it happens automatically. */
2576 bool
2577 common_handle_option (struct gcc_options *opts,
2578 struct gcc_options *opts_set,
2579 const struct cl_decoded_option *decoded,
2580 unsigned int lang_mask, int kind ATTRIBUTE_UNUSED,
2581 location_t loc,
2582 const struct cl_option_handlers *handlers,
2583 diagnostic_context *dc,
2584 void (*target_option_override_hook) (void))
2586 size_t scode = decoded->opt_index;
2587 const char *arg = decoded->arg;
2588 HOST_WIDE_INT value = decoded->value;
2589 enum opt_code code = (enum opt_code) scode;
2591 gcc_assert (decoded->canonical_option_num_elements <= 2);
2593 switch (code)
2595 case OPT__help:
2597 unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
2598 unsigned int undoc_mask;
2599 unsigned int i;
2601 if (lang_mask == CL_DRIVER)
2602 break;
2604 undoc_mask = ((opts->x_verbose_flag | opts->x_extra_warnings)
2606 : CL_UNDOCUMENTED);
2607 target_option_override_hook ();
2608 /* First display any single language specific options. */
2609 for (i = 0; i < cl_lang_count; i++)
2610 print_specific_help
2611 (1U << i, (all_langs_mask & (~ (1U << i))) | undoc_mask, 0, opts,
2612 lang_mask);
2613 /* Next display any multi language specific options. */
2614 print_specific_help (0, undoc_mask, all_langs_mask, opts, lang_mask);
2615 /* Then display any remaining, non-language options. */
2616 for (i = CL_MIN_OPTION_CLASS; i <= CL_MAX_OPTION_CLASS; i <<= 1)
2617 if (i != CL_DRIVER)
2618 print_specific_help (i, undoc_mask, 0, opts, lang_mask);
2619 opts->x_exit_after_options = true;
2620 break;
2623 case OPT__target_help:
2624 if (lang_mask == CL_DRIVER)
2625 break;
2627 target_option_override_hook ();
2628 print_specific_help (CL_TARGET, 0, 0, opts, lang_mask);
2629 opts->x_exit_after_options = true;
2630 break;
2632 case OPT__help_:
2634 help_option_arguments.safe_push (arg);
2635 opts->x_exit_after_options = true;
2636 break;
2639 case OPT__version:
2640 if (lang_mask == CL_DRIVER)
2641 break;
2643 opts->x_exit_after_options = true;
2644 break;
2646 case OPT__completion_:
2647 break;
2649 case OPT_fsanitize_:
2650 opts_set->x_flag_sanitize = true;
2651 opts->x_flag_sanitize
2652 = parse_sanitizer_options (arg, loc, code,
2653 opts->x_flag_sanitize, value, true);
2655 /* Kernel ASan implies normal ASan but does not yet support
2656 all features. */
2657 if (opts->x_flag_sanitize & SANITIZE_KERNEL_ADDRESS)
2659 SET_OPTION_IF_UNSET (opts, opts_set,
2660 param_asan_instrumentation_with_call_threshold,
2662 SET_OPTION_IF_UNSET (opts, opts_set, param_asan_globals, 0);
2663 SET_OPTION_IF_UNSET (opts, opts_set, param_asan_stack, 0);
2664 SET_OPTION_IF_UNSET (opts, opts_set, param_asan_protect_allocas, 0);
2665 SET_OPTION_IF_UNSET (opts, opts_set, param_asan_use_after_return, 0);
2667 if (opts->x_flag_sanitize & SANITIZE_KERNEL_HWADDRESS)
2669 SET_OPTION_IF_UNSET (opts, opts_set,
2670 param_hwasan_instrument_stack, 0);
2671 SET_OPTION_IF_UNSET (opts, opts_set,
2672 param_hwasan_random_frame_tag, 0);
2673 SET_OPTION_IF_UNSET (opts, opts_set,
2674 param_hwasan_instrument_allocas, 0);
2676 break;
2678 case OPT_fsanitize_recover_:
2679 opts->x_flag_sanitize_recover
2680 = parse_sanitizer_options (arg, loc, code,
2681 opts->x_flag_sanitize_recover, value, true);
2682 break;
2684 case OPT_fsanitize_trap_:
2685 opts->x_flag_sanitize_trap
2686 = parse_sanitizer_options (arg, loc, code,
2687 opts->x_flag_sanitize_trap, value, true);
2688 break;
2690 case OPT_fasan_shadow_offset_:
2691 /* Deferred. */
2692 break;
2694 case OPT_fsanitize_address_use_after_scope:
2695 opts->x_flag_sanitize_address_use_after_scope = value;
2696 break;
2698 case OPT_fsanitize_recover:
2699 if (value)
2700 opts->x_flag_sanitize_recover
2701 |= (SANITIZE_UNDEFINED | SANITIZE_UNDEFINED_NONDEFAULT)
2702 & ~(SANITIZE_UNREACHABLE | SANITIZE_RETURN);
2703 else
2704 opts->x_flag_sanitize_recover
2705 &= ~(SANITIZE_UNDEFINED | SANITIZE_UNDEFINED_NONDEFAULT);
2706 break;
2708 case OPT_fsanitize_trap:
2709 if (value)
2710 opts->x_flag_sanitize_trap
2711 |= (SANITIZE_UNDEFINED | SANITIZE_UNDEFINED_NONDEFAULT);
2712 else
2713 opts->x_flag_sanitize_trap
2714 &= ~(SANITIZE_UNDEFINED | SANITIZE_UNDEFINED_NONDEFAULT);
2715 break;
2717 case OPT_O:
2718 case OPT_Os:
2719 case OPT_Ofast:
2720 case OPT_Og:
2721 case OPT_Oz:
2722 /* Currently handled in a prescan. */
2723 break;
2725 case OPT_Wattributes_:
2726 if (lang_mask == CL_DRIVER)
2727 break;
2729 if (value)
2731 error_at (loc, "arguments ignored for %<-Wattributes=%>; use "
2732 "%<-Wno-attributes=%> instead");
2733 break;
2735 else if (arg[strlen (arg) - 1] == ',')
2737 error_at (loc, "trailing %<,%> in arguments for "
2738 "%<-Wno-attributes=%>");
2739 break;
2742 add_comma_separated_to_vector (&opts->x_flag_ignored_attributes, arg);
2743 break;
2745 case OPT_Werror:
2746 dc->warning_as_error_requested = value;
2747 break;
2749 case OPT_Werror_:
2750 if (lang_mask == CL_DRIVER)
2751 break;
2753 enable_warning_as_error (arg, value, lang_mask, handlers,
2754 opts, opts_set, loc, dc);
2755 break;
2757 case OPT_Wfatal_errors:
2758 dc->fatal_errors = value;
2759 break;
2761 case OPT_Wstack_usage_:
2762 opts->x_flag_stack_usage_info = value != -1;
2763 break;
2765 case OPT_Wstrict_aliasing:
2766 set_Wstrict_aliasing (opts, value);
2767 break;
2769 case OPT_Wstrict_overflow:
2770 opts->x_warn_strict_overflow = (value
2771 ? (int) WARN_STRICT_OVERFLOW_CONDITIONAL
2772 : 0);
2773 break;
2775 case OPT_Wsystem_headers:
2776 dc->dc_warn_system_headers = value;
2777 break;
2779 case OPT_aux_info:
2780 opts->x_flag_gen_aux_info = 1;
2781 break;
2783 case OPT_d:
2784 decode_d_option (arg, opts, loc, dc);
2785 break;
2787 case OPT_fcall_used_:
2788 case OPT_fcall_saved_:
2789 /* Deferred. */
2790 break;
2792 case OPT_fdbg_cnt_:
2793 /* Deferred. */
2794 break;
2796 case OPT_fdebug_prefix_map_:
2797 case OPT_ffile_prefix_map_:
2798 case OPT_fprofile_prefix_map_:
2799 /* Deferred. */
2800 break;
2802 case OPT_fcallgraph_info:
2803 opts->x_flag_callgraph_info = CALLGRAPH_INFO_NAKED;
2804 break;
2806 case OPT_fcallgraph_info_:
2808 char *my_arg, *p;
2809 my_arg = xstrdup (arg);
2810 p = strtok (my_arg, ",");
2811 while (p)
2813 if (strcmp (p, "su") == 0)
2815 opts->x_flag_callgraph_info |= CALLGRAPH_INFO_STACK_USAGE;
2816 opts->x_flag_stack_usage_info = true;
2818 else if (strcmp (p, "da") == 0)
2819 opts->x_flag_callgraph_info |= CALLGRAPH_INFO_DYNAMIC_ALLOC;
2820 else
2821 return 0;
2822 p = strtok (NULL, ",");
2824 free (my_arg);
2826 break;
2828 case OPT_fdiagnostics_show_location_:
2829 diagnostic_prefixing_rule (dc) = (diagnostic_prefixing_rule_t) value;
2830 break;
2832 case OPT_fdiagnostics_show_caret:
2833 dc->show_caret = value;
2834 break;
2836 case OPT_fdiagnostics_show_labels:
2837 dc->show_labels_p = value;
2838 break;
2840 case OPT_fdiagnostics_show_line_numbers:
2841 dc->show_line_numbers_p = value;
2842 break;
2844 case OPT_fdiagnostics_color_:
2845 diagnostic_color_init (dc, value);
2846 break;
2848 case OPT_fdiagnostics_urls_:
2849 diagnostic_urls_init (dc, value);
2850 break;
2852 case OPT_fdiagnostics_format_:
2853 diagnostic_output_format_init (dc, opts->x_dump_base_name,
2854 (enum diagnostics_output_format)value);
2855 break;
2857 case OPT_fdiagnostics_parseable_fixits:
2858 dc->extra_output_kind = (value
2859 ? EXTRA_DIAGNOSTIC_OUTPUT_fixits_v1
2860 : EXTRA_DIAGNOSTIC_OUTPUT_none);
2861 break;
2863 case OPT_fdiagnostics_column_unit_:
2864 dc->column_unit = (enum diagnostics_column_unit)value;
2865 break;
2867 case OPT_fdiagnostics_column_origin_:
2868 dc->column_origin = value;
2869 break;
2871 case OPT_fdiagnostics_escape_format_:
2872 dc->escape_format = (enum diagnostics_escape_format)value;
2873 break;
2875 case OPT_fdiagnostics_show_cwe:
2876 dc->show_cwe = value;
2877 break;
2879 case OPT_fdiagnostics_show_rules:
2880 dc->show_rules = value;
2881 break;
2883 case OPT_fdiagnostics_path_format_:
2884 dc->path_format = (enum diagnostic_path_format)value;
2885 break;
2887 case OPT_fdiagnostics_show_path_depths:
2888 dc->show_path_depths = value;
2889 break;
2891 case OPT_fdiagnostics_show_option:
2892 dc->show_option_requested = value;
2893 break;
2895 case OPT_fdiagnostics_minimum_margin_width_:
2896 dc->min_margin_width = value;
2897 break;
2899 case OPT_fdump_:
2900 /* Deferred. */
2901 break;
2903 case OPT_ffast_math:
2904 set_fast_math_flags (opts, value);
2905 break;
2907 case OPT_funsafe_math_optimizations:
2908 set_unsafe_math_optimizations_flags (opts, value);
2909 break;
2911 case OPT_ffixed_:
2912 /* Deferred. */
2913 break;
2915 case OPT_finline_limit_:
2916 SET_OPTION_IF_UNSET (opts, opts_set, param_max_inline_insns_single,
2917 value / 2);
2918 SET_OPTION_IF_UNSET (opts, opts_set, param_max_inline_insns_auto,
2919 value / 2);
2920 break;
2922 case OPT_finstrument_functions_exclude_function_list_:
2923 add_comma_separated_to_vector
2924 (&opts->x_flag_instrument_functions_exclude_functions, arg);
2925 break;
2927 case OPT_finstrument_functions_exclude_file_list_:
2928 add_comma_separated_to_vector
2929 (&opts->x_flag_instrument_functions_exclude_files, arg);
2930 break;
2932 case OPT_fmessage_length_:
2933 pp_set_line_maximum_length (dc->printer, value);
2934 diagnostic_set_caret_max_width (dc, value);
2935 break;
2937 case OPT_fopt_info:
2938 case OPT_fopt_info_:
2939 /* Deferred. */
2940 break;
2942 case OPT_foffload_options_:
2943 /* Deferred. */
2944 break;
2946 case OPT_foffload_abi_:
2947 #ifdef ACCEL_COMPILER
2948 /* Handled in the 'mkoffload's. */
2949 #else
2950 error_at (loc, "%<-foffload-abi%> option can be specified only for "
2951 "offload compiler");
2952 #endif
2953 break;
2955 case OPT_fpack_struct_:
2956 if (value <= 0 || (value & (value - 1)) || value > 16)
2957 error_at (loc,
2958 "structure alignment must be a small power of two, not %wu",
2959 value);
2960 else
2961 opts->x_initial_max_fld_align = value;
2962 break;
2964 case OPT_fplugin_:
2965 case OPT_fplugin_arg_:
2966 /* Deferred. */
2967 break;
2969 case OPT_fprofile_use_:
2970 opts->x_profile_data_prefix = xstrdup (arg);
2971 opts->x_flag_profile_use = true;
2972 value = true;
2973 /* No break here - do -fprofile-use processing. */
2974 /* FALLTHRU */
2975 case OPT_fprofile_use:
2976 enable_fdo_optimizations (opts, opts_set, value);
2977 SET_OPTION_IF_UNSET (opts, opts_set, flag_profile_reorder_functions,
2978 value);
2979 /* Indirect call profiling should do all useful transformations
2980 speculative devirtualization does. */
2981 if (opts->x_flag_value_profile_transformations)
2982 SET_OPTION_IF_UNSET (opts, opts_set, flag_devirtualize_speculatively,
2983 false);
2984 break;
2986 case OPT_fauto_profile_:
2987 opts->x_auto_profile_file = xstrdup (arg);
2988 opts->x_flag_auto_profile = true;
2989 value = true;
2990 /* No break here - do -fauto-profile processing. */
2991 /* FALLTHRU */
2992 case OPT_fauto_profile:
2993 enable_fdo_optimizations (opts, opts_set, value);
2994 SET_OPTION_IF_UNSET (opts, opts_set, flag_profile_correction, value);
2995 break;
2997 case OPT_fprofile_generate_:
2998 opts->x_profile_data_prefix = xstrdup (arg);
2999 value = true;
3000 /* No break here - do -fprofile-generate processing. */
3001 /* FALLTHRU */
3002 case OPT_fprofile_generate:
3003 SET_OPTION_IF_UNSET (opts, opts_set, profile_arc_flag, value);
3004 SET_OPTION_IF_UNSET (opts, opts_set, flag_profile_values, value);
3005 SET_OPTION_IF_UNSET (opts, opts_set, flag_inline_functions, value);
3006 SET_OPTION_IF_UNSET (opts, opts_set, flag_ipa_bit_cp, value);
3007 break;
3009 case OPT_fprofile_info_section:
3010 opts->x_profile_info_section = ".gcov_info";
3011 break;
3013 case OPT_fpatchable_function_entry_:
3015 HOST_WIDE_INT patch_area_size, patch_area_start;
3016 parse_and_check_patch_area (arg, true, &patch_area_size,
3017 &patch_area_start);
3019 break;
3021 case OPT_ftree_vectorize:
3022 /* Automatically sets -ftree-loop-vectorize and
3023 -ftree-slp-vectorize. Nothing more to do here. */
3024 break;
3025 case OPT_fzero_call_used_regs_:
3026 opts->x_flag_zero_call_used_regs
3027 = parse_zero_call_used_regs_options (arg);
3028 break;
3030 case OPT_fshow_column:
3031 dc->show_column = value;
3032 break;
3034 case OPT_frandom_seed:
3035 /* The real switch is -fno-random-seed. */
3036 if (value)
3037 return false;
3038 /* Deferred. */
3039 break;
3041 case OPT_frandom_seed_:
3042 /* Deferred. */
3043 break;
3045 case OPT_fsched_verbose_:
3046 #ifdef INSN_SCHEDULING
3047 /* Handled with Var in common.opt. */
3048 break;
3049 #else
3050 return false;
3051 #endif
3053 case OPT_fsched_stalled_insns_:
3054 opts->x_flag_sched_stalled_insns = value;
3055 if (opts->x_flag_sched_stalled_insns == 0)
3056 opts->x_flag_sched_stalled_insns = -1;
3057 break;
3059 case OPT_fsched_stalled_insns_dep_:
3060 opts->x_flag_sched_stalled_insns_dep = value;
3061 break;
3063 case OPT_fstack_check_:
3064 if (!strcmp (arg, "no"))
3065 opts->x_flag_stack_check = NO_STACK_CHECK;
3066 else if (!strcmp (arg, "generic"))
3067 /* This is the old stack checking method. */
3068 opts->x_flag_stack_check = STACK_CHECK_BUILTIN
3069 ? FULL_BUILTIN_STACK_CHECK
3070 : GENERIC_STACK_CHECK;
3071 else if (!strcmp (arg, "specific"))
3072 /* This is the new stack checking method. */
3073 opts->x_flag_stack_check = STACK_CHECK_BUILTIN
3074 ? FULL_BUILTIN_STACK_CHECK
3075 : STACK_CHECK_STATIC_BUILTIN
3076 ? STATIC_BUILTIN_STACK_CHECK
3077 : GENERIC_STACK_CHECK;
3078 else
3079 warning_at (loc, 0, "unknown stack check parameter %qs", arg);
3080 break;
3082 case OPT_fstack_limit:
3083 /* The real switch is -fno-stack-limit. */
3084 if (value)
3085 return false;
3086 /* Deferred. */
3087 break;
3089 case OPT_fstack_limit_register_:
3090 case OPT_fstack_limit_symbol_:
3091 /* Deferred. */
3092 break;
3094 case OPT_fstack_usage:
3095 opts->x_flag_stack_usage = value;
3096 opts->x_flag_stack_usage_info = value != 0;
3097 break;
3099 case OPT_g:
3100 set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, arg, opts, opts_set,
3101 loc);
3102 break;
3104 case OPT_gbtf:
3105 set_debug_level (BTF_DEBUG, false, arg, opts, opts_set, loc);
3106 /* set the debug level to level 2, but if already at level 3,
3107 don't lower it. */
3108 if (opts->x_debug_info_level < DINFO_LEVEL_NORMAL)
3109 opts->x_debug_info_level = DINFO_LEVEL_NORMAL;
3110 break;
3112 case OPT_gctf:
3113 set_debug_level (CTF_DEBUG, false, arg, opts, opts_set, loc);
3114 /* CTF generation feeds off DWARF dies. For optimal CTF, switch debug
3115 info level to 2. If off or at level 1, set it to level 2, but if
3116 already at level 3, don't lower it. */
3117 if (opts->x_debug_info_level < DINFO_LEVEL_NORMAL
3118 && opts->x_ctf_debug_info_level > CTFINFO_LEVEL_NONE)
3119 opts->x_debug_info_level = DINFO_LEVEL_NORMAL;
3120 break;
3122 case OPT_gdwarf:
3123 if (arg && strlen (arg) != 0)
3125 error_at (loc, "%<-gdwarf%s%> is ambiguous; "
3126 "use %<-gdwarf-%s%> for DWARF version "
3127 "or %<-gdwarf%> %<-g%s%> for debug level", arg, arg, arg);
3128 break;
3130 else
3131 value = opts->x_dwarf_version;
3133 /* FALLTHRU */
3134 case OPT_gdwarf_:
3135 if (value < 2 || value > 5)
3136 error_at (loc, "dwarf version %wu is not supported", value);
3137 else
3138 opts->x_dwarf_version = value;
3139 set_debug_level (DWARF2_DEBUG, false, "", opts, opts_set, loc);
3140 break;
3142 case OPT_ggdb:
3143 set_debug_level (NO_DEBUG, 2, arg, opts, opts_set, loc);
3144 break;
3146 case OPT_gstabs:
3147 case OPT_gstabs_:
3148 set_debug_level (DBX_DEBUG, code == OPT_gstabs_, arg, opts, opts_set,
3149 loc);
3150 break;
3152 case OPT_gvms:
3153 set_debug_level (VMS_DEBUG, false, arg, opts, opts_set, loc);
3154 break;
3156 case OPT_gxcoff:
3157 case OPT_gxcoff_:
3158 set_debug_level (XCOFF_DEBUG, code == OPT_gxcoff_, arg, opts, opts_set,
3159 loc);
3160 break;
3162 case OPT_gz:
3163 case OPT_gz_:
3164 /* Handled completely via specs. */
3165 break;
3167 case OPT_pedantic_errors:
3168 dc->pedantic_errors = 1;
3169 control_warning_option (OPT_Wpedantic, DK_ERROR, NULL, value,
3170 loc, lang_mask,
3171 handlers, opts, opts_set,
3172 dc);
3173 break;
3175 case OPT_flto:
3176 opts->x_flag_lto = value ? "" : NULL;
3177 break;
3179 case OPT_flto_:
3180 if (strcmp (arg, "none") != 0
3181 && strcmp (arg, "jobserver") != 0
3182 && strcmp (arg, "auto") != 0
3183 && atoi (arg) == 0)
3184 error_at (loc,
3185 "unrecognized argument to %<-flto=%> option: %qs", arg);
3186 break;
3188 case OPT_w:
3189 dc->dc_inhibit_warnings = true;
3190 break;
3192 case OPT_fmax_errors_:
3193 dc->max_errors = value;
3194 break;
3196 case OPT_fuse_ld_bfd:
3197 case OPT_fuse_ld_gold:
3198 case OPT_fuse_ld_lld:
3199 case OPT_fuse_ld_mold:
3200 case OPT_fuse_linker_plugin:
3201 /* No-op. Used by the driver and passed to us because it starts with f.*/
3202 break;
3204 case OPT_fwrapv:
3205 if (value)
3206 opts->x_flag_trapv = 0;
3207 break;
3209 case OPT_ftrapv:
3210 if (value)
3211 opts->x_flag_wrapv = 0;
3212 break;
3214 case OPT_fstrict_overflow:
3215 opts->x_flag_wrapv = !value;
3216 opts->x_flag_wrapv_pointer = !value;
3217 if (!value)
3218 opts->x_flag_trapv = 0;
3219 break;
3221 case OPT_fipa_icf:
3222 opts->x_flag_ipa_icf_functions = value;
3223 opts->x_flag_ipa_icf_variables = value;
3224 break;
3226 case OPT_falign_loops_:
3227 check_alignment_argument (loc, arg, "loops",
3228 &opts->x_flag_align_loops,
3229 &opts->x_str_align_loops);
3230 break;
3232 case OPT_falign_jumps_:
3233 check_alignment_argument (loc, arg, "jumps",
3234 &opts->x_flag_align_jumps,
3235 &opts->x_str_align_jumps);
3236 break;
3238 case OPT_falign_labels_:
3239 check_alignment_argument (loc, arg, "labels",
3240 &opts->x_flag_align_labels,
3241 &opts->x_str_align_labels);
3242 break;
3244 case OPT_falign_functions_:
3245 check_alignment_argument (loc, arg, "functions",
3246 &opts->x_flag_align_functions,
3247 &opts->x_str_align_functions);
3248 break;
3250 case OPT_ftabstop_:
3251 /* It is documented that we silently ignore silly values. */
3252 if (value >= 1 && value <= 100)
3253 dc->tabstop = value;
3254 break;
3256 case OPT_freport_bug:
3257 dc->report_bug = value;
3258 break;
3260 default:
3261 /* If the flag was handled in a standard way, assume the lack of
3262 processing here is intentional. */
3263 gcc_assert (option_flag_var (scode, opts));
3264 break;
3267 common_handle_option_auto (opts, opts_set, decoded, lang_mask, kind,
3268 loc, handlers, dc);
3269 return true;
3272 /* Used to set the level of strict aliasing warnings in OPTS,
3273 when no level is specified (i.e., when -Wstrict-aliasing, and not
3274 -Wstrict-aliasing=level was given).
3275 ONOFF is assumed to take value 1 when -Wstrict-aliasing is specified,
3276 and 0 otherwise. After calling this function, wstrict_aliasing will be
3277 set to the default value of -Wstrict_aliasing=level, currently 3. */
3278 static void
3279 set_Wstrict_aliasing (struct gcc_options *opts, int onoff)
3281 gcc_assert (onoff == 0 || onoff == 1);
3282 if (onoff != 0)
3283 opts->x_warn_strict_aliasing = 3;
3284 else
3285 opts->x_warn_strict_aliasing = 0;
3288 /* The following routines are useful in setting all the flags that
3289 -ffast-math and -fno-fast-math imply. */
3290 static void
3291 set_fast_math_flags (struct gcc_options *opts, int set)
3293 if (!opts->frontend_set_flag_unsafe_math_optimizations)
3295 opts->x_flag_unsafe_math_optimizations = set;
3296 set_unsafe_math_optimizations_flags (opts, set);
3298 if (!opts->frontend_set_flag_finite_math_only)
3299 opts->x_flag_finite_math_only = set;
3300 if (!opts->frontend_set_flag_errno_math)
3301 opts->x_flag_errno_math = !set;
3302 if (set)
3304 if (opts->frontend_set_flag_excess_precision == EXCESS_PRECISION_DEFAULT)
3305 opts->x_flag_excess_precision
3306 = set ? EXCESS_PRECISION_FAST : EXCESS_PRECISION_DEFAULT;
3307 if (!opts->frontend_set_flag_signaling_nans)
3308 opts->x_flag_signaling_nans = 0;
3309 if (!opts->frontend_set_flag_rounding_math)
3310 opts->x_flag_rounding_math = 0;
3311 if (!opts->frontend_set_flag_cx_limited_range)
3312 opts->x_flag_cx_limited_range = 1;
3316 /* When -funsafe-math-optimizations is set the following
3317 flags are set as well. */
3318 static void
3319 set_unsafe_math_optimizations_flags (struct gcc_options *opts, int set)
3321 if (!opts->frontend_set_flag_trapping_math)
3322 opts->x_flag_trapping_math = !set;
3323 if (!opts->frontend_set_flag_signed_zeros)
3324 opts->x_flag_signed_zeros = !set;
3325 if (!opts->frontend_set_flag_associative_math)
3326 opts->x_flag_associative_math = set;
3327 if (!opts->frontend_set_flag_reciprocal_math)
3328 opts->x_flag_reciprocal_math = set;
3331 /* Return true iff flags in OPTS are set as if -ffast-math. */
3332 bool
3333 fast_math_flags_set_p (const struct gcc_options *opts)
3335 return (!opts->x_flag_trapping_math
3336 && opts->x_flag_unsafe_math_optimizations
3337 && opts->x_flag_finite_math_only
3338 && !opts->x_flag_signed_zeros
3339 && !opts->x_flag_errno_math
3340 && opts->x_flag_excess_precision == EXCESS_PRECISION_FAST);
3343 /* Return true iff flags are set as if -ffast-math but using the flags stored
3344 in the struct cl_optimization structure. */
3345 bool
3346 fast_math_flags_struct_set_p (struct cl_optimization *opt)
3348 return (!opt->x_flag_trapping_math
3349 && opt->x_flag_unsafe_math_optimizations
3350 && opt->x_flag_finite_math_only
3351 && !opt->x_flag_signed_zeros
3352 && !opt->x_flag_errno_math);
3355 /* Handle a debug output -g switch for options OPTS
3356 (OPTS_SET->x_write_symbols storing whether a debug format was passed
3357 explicitly), location LOC. EXTENDED is true or false to support
3358 extended output (2 is special and means "-ggdb" was given). */
3359 static void
3360 set_debug_level (uint32_t dinfo, int extended, const char *arg,
3361 struct gcc_options *opts, struct gcc_options *opts_set,
3362 location_t loc)
3364 opts->x_use_gnu_debug_info_extensions = extended;
3366 if (dinfo == NO_DEBUG)
3368 if (opts->x_write_symbols == NO_DEBUG)
3370 opts->x_write_symbols = PREFERRED_DEBUGGING_TYPE;
3372 if (extended == 2)
3374 #if defined DWARF2_DEBUGGING_INFO || defined DWARF2_LINENO_DEBUGGING_INFO
3375 if (opts->x_write_symbols & CTF_DEBUG)
3376 opts->x_write_symbols |= DWARF2_DEBUG;
3377 else
3378 opts->x_write_symbols = DWARF2_DEBUG;
3379 #elif defined DBX_DEBUGGING_INFO
3380 opts->x_write_symbols = DBX_DEBUG;
3381 #endif
3384 if (opts->x_write_symbols == NO_DEBUG)
3385 warning_at (loc, 0, "target system does not support debug output");
3387 else if ((opts->x_write_symbols & CTF_DEBUG)
3388 || (opts->x_write_symbols & BTF_DEBUG))
3390 opts->x_write_symbols |= DWARF2_DEBUG;
3391 opts_set->x_write_symbols |= DWARF2_DEBUG;
3394 else
3396 /* Make and retain the choice if both CTF and DWARF debug info are to
3397 be generated. */
3398 if (((dinfo == DWARF2_DEBUG) || (dinfo == CTF_DEBUG))
3399 && ((opts->x_write_symbols == (DWARF2_DEBUG|CTF_DEBUG))
3400 || (opts->x_write_symbols == DWARF2_DEBUG)
3401 || (opts->x_write_symbols == CTF_DEBUG)))
3403 opts->x_write_symbols |= dinfo;
3404 opts_set->x_write_symbols |= dinfo;
3406 /* However, CTF and BTF are not allowed together at this time. */
3407 else if (((dinfo == DWARF2_DEBUG) || (dinfo == BTF_DEBUG))
3408 && ((opts->x_write_symbols == (DWARF2_DEBUG|BTF_DEBUG))
3409 || (opts->x_write_symbols == DWARF2_DEBUG)
3410 || (opts->x_write_symbols == BTF_DEBUG)))
3412 opts->x_write_symbols |= dinfo;
3413 opts_set->x_write_symbols |= dinfo;
3415 else
3417 /* Does it conflict with an already selected debug format? */
3418 if (opts_set->x_write_symbols != NO_DEBUG
3419 && opts->x_write_symbols != NO_DEBUG
3420 && dinfo != opts->x_write_symbols)
3422 gcc_assert (debug_set_count (dinfo) <= 1);
3423 error_at (loc, "debug format %qs conflicts with prior selection",
3424 debug_type_names[debug_set_to_format (dinfo)]);
3426 opts->x_write_symbols = dinfo;
3427 opts_set->x_write_symbols = dinfo;
3431 if (dinfo != BTF_DEBUG)
3433 /* A debug flag without a level defaults to level 2.
3434 If off or at level 1, set it to level 2, but if already
3435 at level 3, don't lower it. */
3436 if (*arg == '\0')
3438 if (dinfo == CTF_DEBUG)
3439 opts->x_ctf_debug_info_level = CTFINFO_LEVEL_NORMAL;
3440 else if (opts->x_debug_info_level < DINFO_LEVEL_NORMAL)
3441 opts->x_debug_info_level = DINFO_LEVEL_NORMAL;
3443 else
3445 int argval = integral_argument (arg);
3446 if (argval == -1)
3447 error_at (loc, "unrecognized debug output level %qs", arg);
3448 else if (argval > 3)
3449 error_at (loc, "debug output level %qs is too high", arg);
3450 else
3452 if (dinfo == CTF_DEBUG)
3453 opts->x_ctf_debug_info_level
3454 = (enum ctf_debug_info_levels) argval;
3455 else
3456 opts->x_debug_info_level = (enum debug_info_levels) argval;
3460 else if (*arg != '\0')
3461 error_at (loc, "unrecognized btf debug output level %qs", arg);
3464 /* Arrange to dump core on error for diagnostic context DC. (The
3465 regular error message is still printed first, except in the case of
3466 abort ().) */
3468 static void
3469 setup_core_dumping (diagnostic_context *dc)
3471 #ifdef SIGABRT
3472 signal (SIGABRT, SIG_DFL);
3473 #endif
3474 #if defined(HAVE_SETRLIMIT)
3476 struct rlimit rlim;
3477 if (getrlimit (RLIMIT_CORE, &rlim) != 0)
3478 fatal_error (input_location, "getting core file size maximum limit: %m");
3479 rlim.rlim_cur = rlim.rlim_max;
3480 if (setrlimit (RLIMIT_CORE, &rlim) != 0)
3481 fatal_error (input_location,
3482 "setting core file size limit to maximum: %m");
3484 #endif
3485 diagnostic_abort_on_error (dc);
3488 /* Parse a -d<ARG> command line switch for OPTS, location LOC,
3489 diagnostic context DC. */
3491 static void
3492 decode_d_option (const char *arg, struct gcc_options *opts,
3493 location_t loc, diagnostic_context *dc)
3495 int c;
3497 while (*arg)
3498 switch (c = *arg++)
3500 case 'A':
3501 opts->x_flag_debug_asm = 1;
3502 break;
3503 case 'p':
3504 opts->x_flag_print_asm_name = 1;
3505 break;
3506 case 'P':
3507 opts->x_flag_dump_rtl_in_asm = 1;
3508 opts->x_flag_print_asm_name = 1;
3509 break;
3510 case 'x':
3511 opts->x_rtl_dump_and_exit = 1;
3512 break;
3513 case 'D': /* These are handled by the preprocessor. */
3514 case 'I':
3515 case 'M':
3516 case 'N':
3517 case 'U':
3518 break;
3519 case 'H':
3520 setup_core_dumping (dc);
3521 break;
3522 case 'a':
3523 opts->x_flag_dump_all_passed = true;
3524 break;
3526 default:
3527 warning_at (loc, 0, "unrecognized gcc debugging option: %c", c);
3528 break;
3532 /* Enable (or disable if VALUE is 0) a warning option ARG (language
3533 mask LANG_MASK, option handlers HANDLERS) as an error for option
3534 structures OPTS and OPTS_SET, diagnostic context DC (possibly
3535 NULL), location LOC. This is used by -Werror=. */
3537 static void
3538 enable_warning_as_error (const char *arg, int value, unsigned int lang_mask,
3539 const struct cl_option_handlers *handlers,
3540 struct gcc_options *opts,
3541 struct gcc_options *opts_set,
3542 location_t loc, diagnostic_context *dc)
3544 char *new_option;
3545 int option_index;
3547 new_option = XNEWVEC (char, strlen (arg) + 2);
3548 new_option[0] = 'W';
3549 strcpy (new_option + 1, arg);
3550 option_index = find_opt (new_option, lang_mask);
3551 if (option_index == OPT_SPECIAL_unknown)
3553 option_proposer op;
3554 const char *hint = op.suggest_option (new_option);
3555 if (hint)
3556 error_at (loc, "%<-W%serror=%s%>: no option %<-%s%>;"
3557 " did you mean %<-%s%>?", value ? "" : "no-",
3558 arg, new_option, hint);
3559 else
3560 error_at (loc, "%<-W%serror=%s%>: no option %<-%s%>",
3561 value ? "" : "no-", arg, new_option);
3563 else if (!(cl_options[option_index].flags & CL_WARNING))
3564 error_at (loc, "%<-Werror=%s%>: %<-%s%> is not an option that "
3565 "controls warnings", arg, new_option);
3566 else
3568 const diagnostic_t kind = value ? DK_ERROR : DK_WARNING;
3569 const char *arg = NULL;
3571 if (cl_options[option_index].flags & CL_JOINED)
3572 arg = new_option + cl_options[option_index].opt_len;
3573 control_warning_option (option_index, (int) kind, arg, value,
3574 loc, lang_mask,
3575 handlers, opts, opts_set, dc);
3577 free (new_option);
3580 /* Return malloced memory for the name of the option OPTION_INDEX
3581 which enabled a diagnostic (context CONTEXT), originally of type
3582 ORIG_DIAG_KIND but possibly converted to DIAG_KIND by options such
3583 as -Werror. */
3585 char *
3586 option_name (diagnostic_context *context, int option_index,
3587 diagnostic_t orig_diag_kind, diagnostic_t diag_kind)
3589 if (option_index)
3591 /* A warning classified as an error. */
3592 if ((orig_diag_kind == DK_WARNING || orig_diag_kind == DK_PEDWARN)
3593 && diag_kind == DK_ERROR)
3594 return concat (cl_options[OPT_Werror_].opt_text,
3595 /* Skip over "-W". */
3596 cl_options[option_index].opt_text + 2,
3597 NULL);
3598 /* A warning with option. */
3599 else
3600 return xstrdup (cl_options[option_index].opt_text);
3602 /* A warning without option classified as an error. */
3603 else if ((orig_diag_kind == DK_WARNING || orig_diag_kind == DK_PEDWARN
3604 || diag_kind == DK_WARNING)
3605 && context->warning_as_error_requested)
3606 return xstrdup (cl_options[OPT_Werror].opt_text);
3607 else
3608 return NULL;
3611 /* Get the page within the documentation for this option. */
3613 static const char *
3614 get_option_html_page (int option_index)
3616 const cl_option *cl_opt = &cl_options[option_index];
3618 /* Analyzer options are on their own page. */
3619 if (strstr (cl_opt->opt_text, "analyzer-"))
3620 return "gcc/Static-Analyzer-Options.html";
3622 /* Handle -flto= option. */
3623 if (strstr (cl_opt->opt_text, "flto"))
3624 return "gcc/Optimize-Options.html";
3626 #ifdef CL_Fortran
3627 if ((cl_opt->flags & CL_Fortran) != 0
3628 /* If it is option common to both C/C++ and Fortran, it is documented
3629 in gcc/ rather than gfortran/ docs. */
3630 && (cl_opt->flags & CL_C) == 0
3631 #ifdef CL_CXX
3632 && (cl_opt->flags & CL_CXX) == 0
3633 #endif
3635 return "gfortran/Error-and-Warning-Options.html";
3636 #endif
3638 return "gcc/Warning-Options.html";
3641 /* Return malloced memory for a URL describing the option OPTION_INDEX
3642 which enabled a diagnostic (context CONTEXT). */
3644 char *
3645 get_option_url (diagnostic_context *, int option_index)
3647 if (option_index)
3648 return concat (/* DOCUMENTATION_ROOT_URL should be supplied via -D by
3649 the Makefile (see --with-documentation-root-url), and
3650 should have a trailing slash. */
3651 DOCUMENTATION_ROOT_URL,
3653 /* get_option_html_page will return something like
3654 "gcc/Warning-Options.html". */
3655 get_option_html_page (option_index),
3657 /* Expect an anchor of the form "index-Wfoo" e.g.
3658 <a name="index-Wformat"></a>, and thus an id within
3659 the URL of "#index-Wformat". */
3660 "#index", cl_options[option_index].opt_text,
3661 NULL);
3662 else
3663 return NULL;
3666 /* Return a heap allocated producer with command line options. */
3668 char *
3669 gen_command_line_string (cl_decoded_option *options,
3670 unsigned int options_count)
3672 auto_vec<const char *> switches;
3673 char *options_string, *tail;
3674 const char *p;
3675 size_t len = 0;
3677 for (unsigned i = 0; i < options_count; i++)
3678 switch (options[i].opt_index)
3680 case OPT_o:
3681 case OPT_d:
3682 case OPT_dumpbase:
3683 case OPT_dumpbase_ext:
3684 case OPT_dumpdir:
3685 case OPT_quiet:
3686 case OPT_version:
3687 case OPT_v:
3688 case OPT_w:
3689 case OPT_L:
3690 case OPT_D:
3691 case OPT_I:
3692 case OPT_U:
3693 case OPT_SPECIAL_unknown:
3694 case OPT_SPECIAL_ignore:
3695 case OPT_SPECIAL_warn_removed:
3696 case OPT_SPECIAL_program_name:
3697 case OPT_SPECIAL_input_file:
3698 case OPT_grecord_gcc_switches:
3699 case OPT_frecord_gcc_switches:
3700 case OPT__output_pch:
3701 case OPT_fdiagnostics_show_location_:
3702 case OPT_fdiagnostics_show_option:
3703 case OPT_fdiagnostics_show_caret:
3704 case OPT_fdiagnostics_show_labels:
3705 case OPT_fdiagnostics_show_line_numbers:
3706 case OPT_fdiagnostics_color_:
3707 case OPT_fdiagnostics_format_:
3708 case OPT_fverbose_asm:
3709 case OPT____:
3710 case OPT__sysroot_:
3711 case OPT_nostdinc:
3712 case OPT_nostdinc__:
3713 case OPT_fpreprocessed:
3714 case OPT_fltrans_output_list_:
3715 case OPT_fresolution_:
3716 case OPT_fdebug_prefix_map_:
3717 case OPT_fmacro_prefix_map_:
3718 case OPT_ffile_prefix_map_:
3719 case OPT_fprofile_prefix_map_:
3720 case OPT_fcompare_debug:
3721 case OPT_fchecking:
3722 case OPT_fchecking_:
3723 /* Ignore these. */
3724 continue;
3725 case OPT_flto_:
3727 const char *lto_canonical = "-flto";
3728 switches.safe_push (lto_canonical);
3729 len += strlen (lto_canonical) + 1;
3730 break;
3732 default:
3733 if (cl_options[options[i].opt_index].flags
3734 & CL_NO_DWARF_RECORD)
3735 continue;
3736 gcc_checking_assert (options[i].canonical_option[0][0] == '-');
3737 switch (options[i].canonical_option[0][1])
3739 case 'M':
3740 case 'i':
3741 case 'W':
3742 continue;
3743 case 'f':
3744 if (strncmp (options[i].canonical_option[0] + 2,
3745 "dump", 4) == 0)
3746 continue;
3747 break;
3748 default:
3749 break;
3751 switches.safe_push (options[i].orig_option_with_args_text);
3752 len += strlen (options[i].orig_option_with_args_text) + 1;
3753 break;
3756 options_string = XNEWVEC (char, len + 1);
3757 tail = options_string;
3759 unsigned i;
3760 FOR_EACH_VEC_ELT (switches, i, p)
3762 len = strlen (p);
3763 memcpy (tail, p, len);
3764 tail += len;
3765 if (i != switches.length () - 1)
3767 *tail = ' ';
3768 ++tail;
3772 *tail = '\0';
3773 return options_string;
3776 /* Return a heap allocated producer string including command line options. */
3778 char *
3779 gen_producer_string (const char *language_string, cl_decoded_option *options,
3780 unsigned int options_count)
3782 char *cmdline = gen_command_line_string (options, options_count);
3783 char *combined = concat (language_string, " ", version_string, " ",
3784 cmdline, NULL);
3785 free (cmdline);
3786 return combined;
3789 #if CHECKING_P
3791 namespace selftest {
3793 /* Verify that get_option_html_page works as expected. */
3795 static void
3796 test_get_option_html_page ()
3798 ASSERT_STREQ (get_option_html_page (OPT_Wcpp), "gcc/Warning-Options.html");
3799 ASSERT_STREQ (get_option_html_page (OPT_Wanalyzer_double_free),
3800 "gcc/Static-Analyzer-Options.html");
3801 #ifdef CL_Fortran
3802 ASSERT_STREQ (get_option_html_page (OPT_Wline_truncation),
3803 "gfortran/Error-and-Warning-Options.html");
3804 #endif
3807 /* Verify EnumSet and EnumBitSet requirements. */
3809 static void
3810 test_enum_sets ()
3812 for (unsigned i = 0; i < cl_options_count; ++i)
3813 if (cl_options[i].var_type == CLVC_ENUM
3814 && cl_options[i].var_value != CLEV_NORMAL)
3816 const struct cl_enum *e = &cl_enums[cl_options[i].var_enum];
3817 unsigned HOST_WIDE_INT used_sets = 0;
3818 unsigned HOST_WIDE_INT mask = 0;
3819 unsigned highest_set = 0;
3820 for (unsigned j = 0; e->values[j].arg; ++j)
3822 unsigned set = e->values[j].flags >> CL_ENUM_SET_SHIFT;
3823 if (cl_options[i].var_value == CLEV_BITSET)
3825 /* For EnumBitSet Set shouldn't be used and Value should
3826 be a power of two. */
3827 ASSERT_TRUE (set == 0);
3828 ASSERT_TRUE (pow2p_hwi (e->values[j].value));
3829 continue;
3831 /* Test that enumerators referenced in EnumSet have all
3832 Set(n) on them within the valid range. */
3833 ASSERT_TRUE (set >= 1 && set <= HOST_BITS_PER_WIDE_INT);
3834 highest_set = MAX (set, highest_set);
3835 used_sets |= HOST_WIDE_INT_1U << (set - 1);
3837 if (cl_options[i].var_value == CLEV_BITSET)
3838 continue;
3839 /* If there is just one set, no point to using EnumSet. */
3840 ASSERT_TRUE (highest_set >= 2);
3841 /* Test that there are no gaps in between the sets. */
3842 if (highest_set == HOST_BITS_PER_WIDE_INT)
3843 ASSERT_TRUE (used_sets == HOST_WIDE_INT_M1U);
3844 else
3845 ASSERT_TRUE (used_sets == (HOST_WIDE_INT_1U << highest_set) - 1);
3846 for (unsigned int j = 1; j <= highest_set; ++j)
3848 unsigned HOST_WIDE_INT this_mask = 0;
3849 for (unsigned k = 0; e->values[k].arg; ++k)
3851 unsigned set = e->values[j].flags >> CL_ENUM_SET_SHIFT;
3852 if (set == j)
3853 this_mask |= e->values[j].value;
3855 ASSERT_TRUE ((mask & this_mask) == 0);
3856 mask |= this_mask;
3861 /* Run all of the selftests within this file. */
3863 void
3864 opts_cc_tests ()
3866 test_get_option_html_page ();
3867 test_enum_sets ();
3870 } // namespace selftest
3872 #endif /* #if CHECKING_P */