c++: ICE with alias in pack expansion [PR103769]
[official-gcc.git] / gcc / opts.cc
blobef5fe9b11cafde5e6cec3fc62ecf2a2528ab28fa
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 static void set_Wstrict_aliasing (struct gcc_options *opts, int onoff);
40 /* Names of fundamental debug info formats indexed by enum
41 debug_info_type. */
43 const char *const debug_type_names[] =
45 "none", "stabs", "dwarf-2", "xcoff", "vms", "ctf", "btf"
48 /* Bitmasks of fundamental debug info formats indexed by enum
49 debug_info_type. */
51 static uint32_t debug_type_masks[] =
53 NO_DEBUG, DBX_DEBUG, DWARF2_DEBUG, XCOFF_DEBUG, VMS_DEBUG,
54 CTF_DEBUG, BTF_DEBUG
57 /* Names of the set of debug formats requested by user. Updated and accessed
58 via debug_set_names. */
60 static char df_set_names[sizeof "none stabs dwarf-2 xcoff vms ctf btf"];
62 /* Get enum debug_info_type of the specified debug format, for error messages.
63 Can be used only for individual debug format types. */
65 enum debug_info_type
66 debug_set_to_format (uint32_t debug_info_set)
68 int idx = 0;
69 enum debug_info_type dinfo_type = DINFO_TYPE_NONE;
70 /* Find first set bit. */
71 if (debug_info_set)
72 idx = exact_log2 (debug_info_set & - debug_info_set);
73 /* Check that only one bit is set, if at all. This function is meant to be
74 used only for vanilla debug_info_set bitmask values, i.e. for individual
75 debug format types upto DINFO_TYPE_MAX. */
76 gcc_assert ((debug_info_set & (debug_info_set - 1)) == 0);
77 dinfo_type = (enum debug_info_type)idx;
78 gcc_assert (dinfo_type <= DINFO_TYPE_MAX);
79 return dinfo_type;
82 /* Get the number of debug formats enabled for output. */
84 unsigned int
85 debug_set_count (uint32_t w_symbols)
87 unsigned int count = 0;
88 while (w_symbols)
90 ++ count;
91 w_symbols &= ~ (w_symbols & - w_symbols);
93 return count;
96 /* Get the names of the debug formats enabled for output. */
98 const char *
99 debug_set_names (uint32_t w_symbols)
101 uint32_t df_mask = 0;
102 /* Reset the string to be returned. */
103 memset (df_set_names, 0, sizeof (df_set_names));
104 /* Get the popcount. */
105 int num_set_df = debug_set_count (w_symbols);
106 /* Iterate over the debug formats. Add name string for those enabled. */
107 for (int i = DINFO_TYPE_NONE; i <= DINFO_TYPE_MAX; i++)
109 df_mask = debug_type_masks[i];
110 if (w_symbols & df_mask)
112 strcat (df_set_names, debug_type_names[i]);
113 num_set_df--;
114 if (num_set_df)
115 strcat (df_set_names, " ");
116 else
117 break;
119 else if (!w_symbols)
121 /* No debug formats enabled. */
122 gcc_assert (i == DINFO_TYPE_NONE);
123 strcat (df_set_names, debug_type_names[i]);
124 break;
127 return df_set_names;
130 /* Return TRUE iff BTF debug info is enabled. */
132 bool
133 btf_debuginfo_p ()
135 return (write_symbols & BTF_DEBUG);
138 /* Return TRUE iff BTF with CO-RE debug info is enabled. */
140 bool
141 btf_with_core_debuginfo_p ()
143 return (write_symbols & BTF_WITH_CORE_DEBUG);
146 /* Return TRUE iff CTF debug info is enabled. */
148 bool
149 ctf_debuginfo_p ()
151 return (write_symbols & CTF_DEBUG);
154 /* Return TRUE iff dwarf2 debug info is enabled. */
156 bool
157 dwarf_debuginfo_p ()
159 return (write_symbols & DWARF2_DEBUG);
162 /* Return true iff the debug info format is to be generated based on DWARF
163 DIEs (like CTF and BTF debug info formats). */
165 bool dwarf_based_debuginfo_p ()
167 return ((write_symbols & CTF_DEBUG)
168 || (write_symbols & BTF_DEBUG));
171 /* Parse the -femit-struct-debug-detailed option value
172 and set the flag variables. */
174 #define MATCH( prefix, string ) \
175 ((strncmp (prefix, string, sizeof prefix - 1) == 0) \
176 ? ((string += sizeof prefix - 1), 1) : 0)
178 void
179 set_struct_debug_option (struct gcc_options *opts, location_t loc,
180 const char *spec)
182 /* various labels for comparison */
183 static const char dfn_lbl[] = "dfn:", dir_lbl[] = "dir:", ind_lbl[] = "ind:";
184 static const char ord_lbl[] = "ord:", gen_lbl[] = "gen:";
185 static const char none_lbl[] = "none", any_lbl[] = "any";
186 static const char base_lbl[] = "base", sys_lbl[] = "sys";
188 enum debug_struct_file files = DINFO_STRUCT_FILE_ANY;
189 /* Default is to apply to as much as possible. */
190 enum debug_info_usage usage = DINFO_USAGE_NUM_ENUMS;
191 int ord = 1, gen = 1;
193 /* What usage? */
194 if (MATCH (dfn_lbl, spec))
195 usage = DINFO_USAGE_DFN;
196 else if (MATCH (dir_lbl, spec))
197 usage = DINFO_USAGE_DIR_USE;
198 else if (MATCH (ind_lbl, spec))
199 usage = DINFO_USAGE_IND_USE;
201 /* Generics or not? */
202 if (MATCH (ord_lbl, spec))
203 gen = 0;
204 else if (MATCH (gen_lbl, spec))
205 ord = 0;
207 /* What allowable environment? */
208 if (MATCH (none_lbl, spec))
209 files = DINFO_STRUCT_FILE_NONE;
210 else if (MATCH (any_lbl, spec))
211 files = DINFO_STRUCT_FILE_ANY;
212 else if (MATCH (sys_lbl, spec))
213 files = DINFO_STRUCT_FILE_SYS;
214 else if (MATCH (base_lbl, spec))
215 files = DINFO_STRUCT_FILE_BASE;
216 else
217 error_at (loc,
218 "argument %qs to %<-femit-struct-debug-detailed%> "
219 "not recognized",
220 spec);
222 /* Effect the specification. */
223 if (usage == DINFO_USAGE_NUM_ENUMS)
225 if (ord)
227 opts->x_debug_struct_ordinary[DINFO_USAGE_DFN] = files;
228 opts->x_debug_struct_ordinary[DINFO_USAGE_DIR_USE] = files;
229 opts->x_debug_struct_ordinary[DINFO_USAGE_IND_USE] = files;
231 if (gen)
233 opts->x_debug_struct_generic[DINFO_USAGE_DFN] = files;
234 opts->x_debug_struct_generic[DINFO_USAGE_DIR_USE] = files;
235 opts->x_debug_struct_generic[DINFO_USAGE_IND_USE] = files;
238 else
240 if (ord)
241 opts->x_debug_struct_ordinary[usage] = files;
242 if (gen)
243 opts->x_debug_struct_generic[usage] = files;
246 if (*spec == ',')
247 set_struct_debug_option (opts, loc, spec+1);
248 else
250 /* No more -femit-struct-debug-detailed specifications.
251 Do final checks. */
252 if (*spec != '\0')
253 error_at (loc,
254 "argument %qs to %<-femit-struct-debug-detailed%> unknown",
255 spec);
256 if (opts->x_debug_struct_ordinary[DINFO_USAGE_DIR_USE]
257 < opts->x_debug_struct_ordinary[DINFO_USAGE_IND_USE]
258 || opts->x_debug_struct_generic[DINFO_USAGE_DIR_USE]
259 < opts->x_debug_struct_generic[DINFO_USAGE_IND_USE])
260 error_at (loc,
261 "%<-femit-struct-debug-detailed=dir:...%> must allow "
262 "at least as much as "
263 "%<-femit-struct-debug-detailed=ind:...%>");
267 /* Strip off a legitimate source ending from the input string NAME of
268 length LEN. Rather than having to know the names used by all of
269 our front ends, we strip off an ending of a period followed by
270 up to fource characters. (C++ uses ".cpp".) */
272 void
273 strip_off_ending (char *name, int len)
275 int i;
276 for (i = 2; i < 5 && len > i; i++)
278 if (name[len - i] == '.')
280 name[len - i] = '\0';
281 break;
286 /* Find the base name of a path, stripping off both directories and
287 a single final extension. */
289 base_of_path (const char *path, const char **base_out)
291 const char *base = path;
292 const char *dot = 0;
293 const char *p = path;
294 char c = *p;
295 while (c)
297 if (IS_DIR_SEPARATOR (c))
299 base = p + 1;
300 dot = 0;
302 else if (c == '.')
303 dot = p;
304 c = *++p;
306 if (!dot)
307 dot = p;
308 *base_out = base;
309 return dot - base;
312 /* What to print when a switch has no documentation. */
313 static const char undocumented_msg[] = N_("This option lacks documentation.");
314 static const char use_diagnosed_msg[] = N_("Uses of this option are diagnosed.");
316 typedef char *char_p; /* For DEF_VEC_P. */
318 static void set_debug_level (uint32_t dinfo, int extended,
319 const char *arg, struct gcc_options *opts,
320 struct gcc_options *opts_set,
321 location_t loc);
322 static void set_fast_math_flags (struct gcc_options *opts, int set);
323 static void decode_d_option (const char *arg, struct gcc_options *opts,
324 location_t loc, diagnostic_context *dc);
325 static void set_unsafe_math_optimizations_flags (struct gcc_options *opts,
326 int set);
327 static void enable_warning_as_error (const char *arg, int value,
328 unsigned int lang_mask,
329 const struct cl_option_handlers *handlers,
330 struct gcc_options *opts,
331 struct gcc_options *opts_set,
332 location_t loc,
333 diagnostic_context *dc);
335 /* Handle a back-end option; arguments and return value as for
336 handle_option. */
338 bool
339 target_handle_option (struct gcc_options *opts,
340 struct gcc_options *opts_set,
341 const struct cl_decoded_option *decoded,
342 unsigned int lang_mask ATTRIBUTE_UNUSED, int kind,
343 location_t loc,
344 const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED,
345 diagnostic_context *dc, void (*) (void))
347 gcc_assert (dc == global_dc);
348 gcc_assert (kind == DK_UNSPECIFIED);
349 return targetm_common.handle_option (opts, opts_set, decoded, loc);
352 /* Add comma-separated strings to a char_p vector. */
354 static void
355 add_comma_separated_to_vector (void **pvec, const char *arg)
357 char *tmp;
358 char *r;
359 char *w;
360 char *token_start;
361 vec<char_p> *v = (vec<char_p> *) *pvec;
363 vec_check_alloc (v, 1);
365 /* We never free this string. */
366 tmp = xstrdup (arg);
368 r = tmp;
369 w = tmp;
370 token_start = tmp;
372 while (*r != '\0')
374 if (*r == ',')
376 *w++ = '\0';
377 ++r;
378 v->safe_push (token_start);
379 token_start = w;
381 if (*r == '\\' && r[1] == ',')
383 *w++ = ',';
384 r += 2;
386 else
387 *w++ = *r++;
390 *w = '\0';
391 if (*token_start != '\0')
392 v->safe_push (token_start);
394 *pvec = v;
397 /* Initialize opts_obstack. */
399 void
400 init_opts_obstack (void)
402 gcc_obstack_init (&opts_obstack);
405 /* Initialize OPTS and OPTS_SET before using them in parsing options. */
407 void
408 init_options_struct (struct gcc_options *opts, struct gcc_options *opts_set)
410 /* Ensure that opts_obstack has already been initialized by the time
411 that we initialize any gcc_options instances (PR jit/68446). */
412 gcc_assert (opts_obstack.chunk_size > 0);
414 *opts = global_options_init;
416 if (opts_set)
417 memset (opts_set, 0, sizeof (*opts_set));
419 /* Initialize whether `char' is signed. */
420 opts->x_flag_signed_char = DEFAULT_SIGNED_CHAR;
421 /* Set this to a special "uninitialized" value. The actual default
422 is set after target options have been processed. */
423 opts->x_flag_short_enums = 2;
425 /* Initialize target_flags before default_options_optimization
426 so the latter can modify it. */
427 opts->x_target_flags = targetm_common.default_target_flags;
429 /* Some targets have ABI-specified unwind tables. */
430 opts->x_flag_unwind_tables = targetm_common.unwind_tables_default;
432 /* Some targets have other target-specific initialization. */
433 targetm_common.option_init_struct (opts);
436 /* If indicated by the optimization level LEVEL (-Os if SIZE is set,
437 -Ofast if FAST is set, -Og if DEBUG is set), apply the option DEFAULT_OPT
438 to OPTS and OPTS_SET, diagnostic context DC, location LOC, with language
439 mask LANG_MASK and option handlers HANDLERS. */
441 static void
442 maybe_default_option (struct gcc_options *opts,
443 struct gcc_options *opts_set,
444 const struct default_options *default_opt,
445 int level, bool size, bool fast, bool debug,
446 unsigned int lang_mask,
447 const struct cl_option_handlers *handlers,
448 location_t loc,
449 diagnostic_context *dc)
451 const struct cl_option *option = &cl_options[default_opt->opt_index];
452 bool enabled;
454 if (size)
455 gcc_assert (level == 2);
456 if (fast)
457 gcc_assert (level == 3);
458 if (debug)
459 gcc_assert (level == 1);
461 switch (default_opt->levels)
463 case OPT_LEVELS_ALL:
464 enabled = true;
465 break;
467 case OPT_LEVELS_0_ONLY:
468 enabled = (level == 0);
469 break;
471 case OPT_LEVELS_1_PLUS:
472 enabled = (level >= 1);
473 break;
475 case OPT_LEVELS_1_PLUS_SPEED_ONLY:
476 enabled = (level >= 1 && !size && !debug);
477 break;
479 case OPT_LEVELS_1_PLUS_NOT_DEBUG:
480 enabled = (level >= 1 && !debug);
481 break;
483 case OPT_LEVELS_2_PLUS:
484 enabled = (level >= 2);
485 break;
487 case OPT_LEVELS_2_PLUS_SPEED_ONLY:
488 enabled = (level >= 2 && !size && !debug);
489 break;
491 case OPT_LEVELS_3_PLUS:
492 enabled = (level >= 3);
493 break;
495 case OPT_LEVELS_3_PLUS_AND_SIZE:
496 enabled = (level >= 3 || size);
497 break;
499 case OPT_LEVELS_SIZE:
500 enabled = size;
501 break;
503 case OPT_LEVELS_FAST:
504 enabled = fast;
505 break;
507 case OPT_LEVELS_NONE:
508 default:
509 gcc_unreachable ();
512 if (enabled)
513 handle_generated_option (opts, opts_set, default_opt->opt_index,
514 default_opt->arg, default_opt->value,
515 lang_mask, DK_UNSPECIFIED, loc,
516 handlers, true, dc);
517 else if (default_opt->arg == NULL
518 && !option->cl_reject_negative
519 && !(option->flags & CL_PARAMS))
520 handle_generated_option (opts, opts_set, default_opt->opt_index,
521 default_opt->arg, !default_opt->value,
522 lang_mask, DK_UNSPECIFIED, loc,
523 handlers, true, dc);
526 /* As indicated by the optimization level LEVEL (-Os if SIZE is set,
527 -Ofast if FAST is set), apply the options in array DEFAULT_OPTS to
528 OPTS and OPTS_SET, diagnostic context DC, location LOC, with
529 language mask LANG_MASK and option handlers HANDLERS. */
531 static void
532 maybe_default_options (struct gcc_options *opts,
533 struct gcc_options *opts_set,
534 const struct default_options *default_opts,
535 int level, bool size, bool fast, bool debug,
536 unsigned int lang_mask,
537 const struct cl_option_handlers *handlers,
538 location_t loc,
539 diagnostic_context *dc)
541 size_t i;
543 for (i = 0; default_opts[i].levels != OPT_LEVELS_NONE; i++)
544 maybe_default_option (opts, opts_set, &default_opts[i],
545 level, size, fast, debug,
546 lang_mask, handlers, loc, dc);
549 /* Table of options enabled by default at different levels.
550 Please keep this list sorted by level and alphabetized within
551 each level; this makes it easier to keep the documentation
552 in sync. */
554 static const struct default_options default_options_table[] =
556 /* -O1 and -Og optimizations. */
557 { OPT_LEVELS_1_PLUS, OPT_fcombine_stack_adjustments, NULL, 1 },
558 { OPT_LEVELS_1_PLUS, OPT_fcompare_elim, NULL, 1 },
559 { OPT_LEVELS_1_PLUS, OPT_fcprop_registers, NULL, 1 },
560 { OPT_LEVELS_1_PLUS, OPT_fdefer_pop, NULL, 1 },
561 { OPT_LEVELS_1_PLUS, OPT_fforward_propagate, NULL, 1 },
562 { OPT_LEVELS_1_PLUS, OPT_fguess_branch_probability, NULL, 1 },
563 { OPT_LEVELS_1_PLUS, OPT_fipa_profile, NULL, 1 },
564 { OPT_LEVELS_1_PLUS, OPT_fipa_pure_const, NULL, 1 },
565 { OPT_LEVELS_1_PLUS, OPT_fipa_reference, NULL, 1 },
566 { OPT_LEVELS_1_PLUS, OPT_fipa_reference_addressable, NULL, 1 },
567 { OPT_LEVELS_1_PLUS, OPT_fmerge_constants, NULL, 1 },
568 { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
569 { OPT_LEVELS_1_PLUS, OPT_freorder_blocks, NULL, 1 },
570 { OPT_LEVELS_1_PLUS, OPT_fshrink_wrap, NULL, 1 },
571 { OPT_LEVELS_1_PLUS, OPT_fsplit_wide_types, NULL, 1 },
572 { OPT_LEVELS_1_PLUS, OPT_fthread_jumps, NULL, 1 },
573 { OPT_LEVELS_1_PLUS, OPT_ftree_builtin_call_dce, NULL, 1 },
574 { OPT_LEVELS_1_PLUS, OPT_ftree_ccp, NULL, 1 },
575 { OPT_LEVELS_1_PLUS, OPT_ftree_ch, NULL, 1 },
576 { OPT_LEVELS_1_PLUS, OPT_ftree_coalesce_vars, NULL, 1 },
577 { OPT_LEVELS_1_PLUS, OPT_ftree_copy_prop, NULL, 1 },
578 { OPT_LEVELS_1_PLUS, OPT_ftree_dce, NULL, 1 },
579 { OPT_LEVELS_1_PLUS, OPT_ftree_dominator_opts, NULL, 1 },
580 { OPT_LEVELS_1_PLUS, OPT_ftree_fre, NULL, 1 },
581 { OPT_LEVELS_1_PLUS, OPT_ftree_sink, NULL, 1 },
582 { OPT_LEVELS_1_PLUS, OPT_ftree_slsr, NULL, 1 },
583 { OPT_LEVELS_1_PLUS, OPT_ftree_ter, NULL, 1 },
584 { OPT_LEVELS_1_PLUS, OPT_fvar_tracking, NULL, 1 },
586 /* -O1 (and not -Og) optimizations. */
587 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fbranch_count_reg, NULL, 1 },
588 #if DELAY_SLOTS
589 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fdelayed_branch, NULL, 1 },
590 #endif
591 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fdse, NULL, 1 },
592 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fif_conversion, NULL, 1 },
593 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fif_conversion2, NULL, 1 },
594 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_finline_functions_called_once, NULL, 1 },
595 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fmove_loop_invariants, NULL, 1 },
596 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fmove_loop_stores, NULL, 1 },
597 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fssa_phiopt, NULL, 1 },
598 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fipa_modref, NULL, 1 },
599 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_bit_ccp, NULL, 1 },
600 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_dse, NULL, 1 },
601 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_pta, NULL, 1 },
602 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_sra, NULL, 1 },
604 /* -O2 and -Os optimizations. */
605 { OPT_LEVELS_2_PLUS, OPT_fcaller_saves, NULL, 1 },
606 { OPT_LEVELS_2_PLUS, OPT_fcode_hoisting, NULL, 1 },
607 { OPT_LEVELS_2_PLUS, OPT_fcrossjumping, NULL, 1 },
608 { OPT_LEVELS_2_PLUS, OPT_fcse_follow_jumps, NULL, 1 },
609 { OPT_LEVELS_2_PLUS, OPT_fdevirtualize, NULL, 1 },
610 { OPT_LEVELS_2_PLUS, OPT_fdevirtualize_speculatively, NULL, 1 },
611 { OPT_LEVELS_2_PLUS, OPT_fexpensive_optimizations, NULL, 1 },
612 { OPT_LEVELS_2_PLUS, OPT_fgcse, NULL, 1 },
613 { OPT_LEVELS_2_PLUS, OPT_fhoist_adjacent_loads, NULL, 1 },
614 { OPT_LEVELS_2_PLUS, OPT_findirect_inlining, NULL, 1 },
615 { OPT_LEVELS_2_PLUS, OPT_finline_small_functions, NULL, 1 },
616 { OPT_LEVELS_2_PLUS, OPT_fipa_bit_cp, NULL, 1 },
617 { OPT_LEVELS_2_PLUS, OPT_fipa_cp, NULL, 1 },
618 { OPT_LEVELS_2_PLUS, OPT_fipa_icf, NULL, 1 },
619 { OPT_LEVELS_2_PLUS, OPT_fipa_ra, NULL, 1 },
620 { OPT_LEVELS_2_PLUS, OPT_fipa_sra, NULL, 1 },
621 { OPT_LEVELS_2_PLUS, OPT_fipa_vrp, NULL, 1 },
622 { OPT_LEVELS_2_PLUS, OPT_fisolate_erroneous_paths_dereference, NULL, 1 },
623 { OPT_LEVELS_2_PLUS, OPT_flra_remat, NULL, 1 },
624 { OPT_LEVELS_2_PLUS, OPT_foptimize_sibling_calls, NULL, 1 },
625 { OPT_LEVELS_2_PLUS, OPT_fpartial_inlining, NULL, 1 },
626 { OPT_LEVELS_2_PLUS, OPT_fpeephole2, NULL, 1 },
627 { OPT_LEVELS_2_PLUS, OPT_freorder_functions, NULL, 1 },
628 { OPT_LEVELS_2_PLUS, OPT_frerun_cse_after_loop, NULL, 1 },
629 #ifdef INSN_SCHEDULING
630 { OPT_LEVELS_2_PLUS, OPT_fschedule_insns2, NULL, 1 },
631 #endif
632 { OPT_LEVELS_2_PLUS, OPT_fstrict_aliasing, NULL, 1 },
633 { OPT_LEVELS_2_PLUS, OPT_fstore_merging, NULL, 1 },
634 { OPT_LEVELS_2_PLUS, OPT_ftree_pre, NULL, 1 },
635 { OPT_LEVELS_2_PLUS, OPT_ftree_switch_conversion, NULL, 1 },
636 { OPT_LEVELS_2_PLUS, OPT_ftree_tail_merge, NULL, 1 },
637 { OPT_LEVELS_2_PLUS, OPT_ftree_vrp, NULL, 1 },
638 { OPT_LEVELS_2_PLUS, OPT_fvect_cost_model_, NULL,
639 VECT_COST_MODEL_VERY_CHEAP },
640 { OPT_LEVELS_2_PLUS, OPT_finline_functions, NULL, 1 },
641 { OPT_LEVELS_2_PLUS, OPT_ftree_loop_distribute_patterns, NULL, 1 },
643 /* -O2 and above optimizations, but not -Os or -Og. */
644 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_falign_functions, NULL, 1 },
645 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_falign_jumps, NULL, 1 },
646 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_falign_labels, NULL, 1 },
647 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_falign_loops, NULL, 1 },
648 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_foptimize_strlen, NULL, 1 },
649 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_freorder_blocks_algorithm_, NULL,
650 REORDER_BLOCKS_ALGORITHM_STC },
651 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_ftree_loop_vectorize, NULL, 1 },
652 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_ftree_slp_vectorize, NULL, 1 },
653 #ifdef INSN_SCHEDULING
654 /* Only run the pre-regalloc scheduling pass if optimizing for speed. */
655 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_fschedule_insns, NULL, 1 },
656 #endif
658 /* -O3 and -Os optimizations. */
660 /* -O3 optimizations. */
661 { OPT_LEVELS_3_PLUS, OPT_fgcse_after_reload, NULL, 1 },
662 { OPT_LEVELS_3_PLUS, OPT_fipa_cp_clone, NULL, 1 },
663 { OPT_LEVELS_3_PLUS, OPT_floop_interchange, NULL, 1 },
664 { OPT_LEVELS_3_PLUS, OPT_floop_unroll_and_jam, NULL, 1 },
665 { OPT_LEVELS_3_PLUS, OPT_fpeel_loops, NULL, 1 },
666 { OPT_LEVELS_3_PLUS, OPT_fpredictive_commoning, NULL, 1 },
667 { OPT_LEVELS_3_PLUS, OPT_fsplit_loops, NULL, 1 },
668 { OPT_LEVELS_3_PLUS, OPT_fsplit_paths, NULL, 1 },
669 { OPT_LEVELS_3_PLUS, OPT_ftree_loop_distribution, NULL, 1 },
670 { OPT_LEVELS_3_PLUS, OPT_ftree_partial_pre, NULL, 1 },
671 { OPT_LEVELS_3_PLUS, OPT_funswitch_loops, NULL, 1 },
672 { OPT_LEVELS_3_PLUS, OPT_fvect_cost_model_, NULL, VECT_COST_MODEL_DYNAMIC },
673 { OPT_LEVELS_3_PLUS, OPT_fversion_loops_for_strides, NULL, 1 },
675 /* -O3 parameters. */
676 { OPT_LEVELS_3_PLUS, OPT__param_max_inline_insns_auto_, NULL, 30 },
677 { OPT_LEVELS_3_PLUS, OPT__param_early_inlining_insns_, NULL, 14 },
678 { OPT_LEVELS_3_PLUS, OPT__param_inline_heuristics_hint_percent_, NULL, 600 },
679 { OPT_LEVELS_3_PLUS, OPT__param_inline_min_speedup_, NULL, 15 },
680 { OPT_LEVELS_3_PLUS, OPT__param_max_inline_insns_single_, NULL, 200 },
682 /* -Ofast adds optimizations to -O3. */
683 { OPT_LEVELS_FAST, OPT_ffast_math, NULL, 1 },
684 { OPT_LEVELS_FAST, OPT_fallow_store_data_races, NULL, 1 },
685 { OPT_LEVELS_FAST, OPT_fsemantic_interposition, NULL, 0 },
687 { OPT_LEVELS_NONE, 0, NULL, 0 }
690 /* Default the options in OPTS and OPTS_SET based on the optimization
691 settings in DECODED_OPTIONS and DECODED_OPTIONS_COUNT. */
692 void
693 default_options_optimization (struct gcc_options *opts,
694 struct gcc_options *opts_set,
695 struct cl_decoded_option *decoded_options,
696 unsigned int decoded_options_count,
697 location_t loc,
698 unsigned int lang_mask,
699 const struct cl_option_handlers *handlers,
700 diagnostic_context *dc)
702 unsigned int i;
703 int opt2;
704 bool openacc_mode = false;
706 /* Scan to see what optimization level has been specified. That will
707 determine the default value of many flags. */
708 for (i = 1; i < decoded_options_count; i++)
710 struct cl_decoded_option *opt = &decoded_options[i];
711 switch (opt->opt_index)
713 case OPT_O:
714 if (*opt->arg == '\0')
716 opts->x_optimize = 1;
717 opts->x_optimize_size = 0;
718 opts->x_optimize_fast = 0;
719 opts->x_optimize_debug = 0;
721 else
723 const int optimize_val = integral_argument (opt->arg);
724 if (optimize_val == -1)
725 error_at (loc, "argument to %<-O%> should be a non-negative "
726 "integer, %<g%>, %<s%>, %<z%> or %<fast%>");
727 else
729 opts->x_optimize = optimize_val;
730 if ((unsigned int) opts->x_optimize > 255)
731 opts->x_optimize = 255;
732 opts->x_optimize_size = 0;
733 opts->x_optimize_fast = 0;
734 opts->x_optimize_debug = 0;
737 break;
739 case OPT_Os:
740 opts->x_optimize_size = 1;
742 /* Optimizing for size forces optimize to be 2. */
743 opts->x_optimize = 2;
744 opts->x_optimize_fast = 0;
745 opts->x_optimize_debug = 0;
746 break;
748 case OPT_Oz:
749 opts->x_optimize_size = 2;
751 /* Optimizing for size forces optimize to be 2. */
752 opts->x_optimize = 2;
753 opts->x_optimize_fast = 0;
754 opts->x_optimize_debug = 0;
755 break;
757 case OPT_Ofast:
758 /* -Ofast only adds flags to -O3. */
759 opts->x_optimize_size = 0;
760 opts->x_optimize = 3;
761 opts->x_optimize_fast = 1;
762 opts->x_optimize_debug = 0;
763 break;
765 case OPT_Og:
766 /* -Og selects optimization level 1. */
767 opts->x_optimize_size = 0;
768 opts->x_optimize = 1;
769 opts->x_optimize_fast = 0;
770 opts->x_optimize_debug = 1;
771 break;
773 case OPT_fopenacc:
774 if (opt->value)
775 openacc_mode = true;
776 break;
778 default:
779 /* Ignore other options in this prescan. */
780 break;
784 maybe_default_options (opts, opts_set, default_options_table,
785 opts->x_optimize, opts->x_optimize_size,
786 opts->x_optimize_fast, opts->x_optimize_debug,
787 lang_mask, handlers, loc, dc);
789 /* -O2 param settings. */
790 opt2 = (opts->x_optimize >= 2);
792 if (openacc_mode)
793 SET_OPTION_IF_UNSET (opts, opts_set, flag_ipa_pta, true);
795 /* Track fields in field-sensitive alias analysis. */
796 if (opt2)
797 SET_OPTION_IF_UNSET (opts, opts_set, param_max_fields_for_field_sensitive,
798 100);
800 if (opts->x_optimize_size)
801 /* We want to crossjump as much as possible. */
802 SET_OPTION_IF_UNSET (opts, opts_set, param_min_crossjump_insns, 1);
804 /* Restrict the amount of work combine does at -Og while retaining
805 most of its useful transforms. */
806 if (opts->x_optimize_debug)
807 SET_OPTION_IF_UNSET (opts, opts_set, param_max_combine_insns, 2);
809 /* Allow default optimizations to be specified on a per-machine basis. */
810 maybe_default_options (opts, opts_set,
811 targetm_common.option_optimization_table,
812 opts->x_optimize, opts->x_optimize_size,
813 opts->x_optimize_fast, opts->x_optimize_debug,
814 lang_mask, handlers, loc, dc);
817 /* Control IPA optimizations based on different live patching LEVEL. */
818 static void
819 control_options_for_live_patching (struct gcc_options *opts,
820 struct gcc_options *opts_set,
821 enum live_patching_level level,
822 location_t loc)
824 gcc_assert (level > LIVE_PATCHING_NONE);
826 switch (level)
828 case LIVE_PATCHING_INLINE_ONLY_STATIC:
829 #define LIVE_PATCHING_OPTION "-flive-patching=inline-only-static"
830 if (opts_set->x_flag_ipa_cp_clone && opts->x_flag_ipa_cp_clone)
831 error_at (loc, "%qs is incompatible with %qs",
832 "-fipa-cp-clone", LIVE_PATCHING_OPTION);
833 else
834 opts->x_flag_ipa_cp_clone = 0;
836 if (opts_set->x_flag_ipa_sra && opts->x_flag_ipa_sra)
837 error_at (loc, "%qs is incompatible with %qs",
838 "-fipa-sra", LIVE_PATCHING_OPTION);
839 else
840 opts->x_flag_ipa_sra = 0;
842 if (opts_set->x_flag_partial_inlining && opts->x_flag_partial_inlining)
843 error_at (loc, "%qs is incompatible with %qs",
844 "-fpartial-inlining", LIVE_PATCHING_OPTION);
845 else
846 opts->x_flag_partial_inlining = 0;
848 if (opts_set->x_flag_ipa_cp && opts->x_flag_ipa_cp)
849 error_at (loc, "%qs is incompatible with %qs",
850 "-fipa-cp", LIVE_PATCHING_OPTION);
851 else
852 opts->x_flag_ipa_cp = 0;
854 /* FALLTHROUGH. */
855 case LIVE_PATCHING_INLINE_CLONE:
856 #undef LIVE_PATCHING_OPTION
857 #define LIVE_PATCHING_OPTION "-flive-patching=inline-only-static|inline-clone"
858 /* live patching should disable whole-program optimization. */
859 if (opts_set->x_flag_whole_program && opts->x_flag_whole_program)
860 error_at (loc, "%qs is incompatible with %qs",
861 "-fwhole-program", LIVE_PATCHING_OPTION);
862 else
863 opts->x_flag_whole_program = 0;
865 /* visibility change should be excluded by !flag_whole_program
866 && !in_lto_p && !flag_ipa_cp_clone && !flag_ipa_sra
867 && !flag_partial_inlining. */
869 if (opts_set->x_flag_ipa_pta && opts->x_flag_ipa_pta)
870 error_at (loc, "%qs is incompatible with %qs",
871 "-fipa-pta", LIVE_PATCHING_OPTION);
872 else
873 opts->x_flag_ipa_pta = 0;
875 if (opts_set->x_flag_ipa_reference && opts->x_flag_ipa_reference)
876 error_at (loc, "%qs is incompatible with %qs",
877 "-fipa-reference", LIVE_PATCHING_OPTION);
878 else
879 opts->x_flag_ipa_reference = 0;
881 if (opts_set->x_flag_ipa_ra && opts->x_flag_ipa_ra)
882 error_at (loc, "%qs is incompatible with %qs",
883 "-fipa-ra", LIVE_PATCHING_OPTION);
884 else
885 opts->x_flag_ipa_ra = 0;
887 if (opts_set->x_flag_ipa_icf && opts->x_flag_ipa_icf)
888 error_at (loc, "%qs is incompatible with %qs",
889 "-fipa-icf", LIVE_PATCHING_OPTION);
890 else
891 opts->x_flag_ipa_icf = 0;
893 if (opts_set->x_flag_ipa_icf_functions && opts->x_flag_ipa_icf_functions)
894 error_at (loc, "%qs is incompatible with %qs",
895 "-fipa-icf-functions", LIVE_PATCHING_OPTION);
896 else
897 opts->x_flag_ipa_icf_functions = 0;
899 if (opts_set->x_flag_ipa_icf_variables && opts->x_flag_ipa_icf_variables)
900 error_at (loc, "%qs is incompatible with %qs",
901 "-fipa-icf-variables", LIVE_PATCHING_OPTION);
902 else
903 opts->x_flag_ipa_icf_variables = 0;
905 if (opts_set->x_flag_ipa_bit_cp && opts->x_flag_ipa_bit_cp)
906 error_at (loc, "%qs is incompatible with %qs",
907 "-fipa-bit-cp", LIVE_PATCHING_OPTION);
908 else
909 opts->x_flag_ipa_bit_cp = 0;
911 if (opts_set->x_flag_ipa_vrp && opts->x_flag_ipa_vrp)
912 error_at (loc, "%qs is incompatible with %qs",
913 "-fipa-vrp", LIVE_PATCHING_OPTION);
914 else
915 opts->x_flag_ipa_vrp = 0;
917 if (opts_set->x_flag_ipa_pure_const && opts->x_flag_ipa_pure_const)
918 error_at (loc, "%qs is incompatible with %qs",
919 "-fipa-pure-const", LIVE_PATCHING_OPTION);
920 else
921 opts->x_flag_ipa_pure_const = 0;
923 if (opts_set->x_flag_ipa_modref && opts->x_flag_ipa_modref)
924 error_at (loc,
925 "%<-fipa-modref%> is incompatible with %qs",
926 LIVE_PATCHING_OPTION);
927 else
928 opts->x_flag_ipa_modref = 0;
930 /* FIXME: disable unreachable code removal. */
932 /* discovery of functions/variables with no address taken. */
933 if (opts_set->x_flag_ipa_reference_addressable
934 && opts->x_flag_ipa_reference_addressable)
935 error_at (loc, "%qs is incompatible with %qs",
936 "-fipa-reference-addressable", LIVE_PATCHING_OPTION);
937 else
938 opts->x_flag_ipa_reference_addressable = 0;
940 /* ipa stack alignment propagation. */
941 if (opts_set->x_flag_ipa_stack_alignment
942 && opts->x_flag_ipa_stack_alignment)
943 error_at (loc, "%qs is incompatible with %qs",
944 "-fipa-stack-alignment", LIVE_PATCHING_OPTION);
945 else
946 opts->x_flag_ipa_stack_alignment = 0;
947 break;
948 default:
949 gcc_unreachable ();
952 #undef LIVE_PATCHING_OPTION
955 /* --help option argument if set. */
956 vec<const char *> help_option_arguments;
958 /* Return the string name describing a sanitizer argument which has been
959 provided on the command line and has set this particular flag. */
960 const char *
961 find_sanitizer_argument (struct gcc_options *opts, unsigned int flags)
963 for (int i = 0; sanitizer_opts[i].name != NULL; ++i)
965 /* Need to find the sanitizer_opts element which:
966 a) Could have set the flags requested.
967 b) Has been set on the command line.
969 Can have (a) without (b) if the flag requested is e.g.
970 SANITIZE_ADDRESS, since both -fsanitize=address and
971 -fsanitize=kernel-address set this flag.
973 Can have (b) without (a) by requesting more than one sanitizer on the
974 command line. */
975 if ((sanitizer_opts[i].flag & opts->x_flag_sanitize)
976 != sanitizer_opts[i].flag)
977 continue;
978 if ((sanitizer_opts[i].flag & flags) != flags)
979 continue;
980 return sanitizer_opts[i].name;
982 return NULL;
986 /* Report an error to the user about sanitizer options they have requested
987 which have set conflicting flags.
989 LEFT and RIGHT indicate sanitizer flags which conflict with each other, this
990 function reports an error if both have been set in OPTS->x_flag_sanitize and
991 ensures the error identifies the requested command line options that have
992 set these flags. */
993 static void
994 report_conflicting_sanitizer_options (struct gcc_options *opts, location_t loc,
995 unsigned int left, unsigned int right)
997 unsigned int left_seen = (opts->x_flag_sanitize & left);
998 unsigned int right_seen = (opts->x_flag_sanitize & right);
999 if (left_seen && right_seen)
1001 const char* left_arg = find_sanitizer_argument (opts, left_seen);
1002 const char* right_arg = find_sanitizer_argument (opts, right_seen);
1003 gcc_assert (left_arg && right_arg);
1004 error_at (loc,
1005 "%<-fsanitize=%s%> is incompatible with %<-fsanitize=%s%>",
1006 left_arg, right_arg);
1010 /* After all options at LOC have been read into OPTS and OPTS_SET,
1011 finalize settings of those options and diagnose incompatible
1012 combinations. */
1013 void
1014 finish_options (struct gcc_options *opts, struct gcc_options *opts_set,
1015 location_t loc)
1017 if (opts->x_dump_base_name
1018 && ! opts->x_dump_base_name_prefixed)
1020 const char *sep = opts->x_dump_base_name;
1022 for (; *sep; sep++)
1023 if (IS_DIR_SEPARATOR (*sep))
1024 break;
1026 if (*sep)
1027 /* If dump_base_path contains subdirectories, don't prepend
1028 anything. */;
1029 else if (opts->x_dump_dir_name)
1030 /* We have a DUMP_DIR_NAME, prepend that. */
1031 opts->x_dump_base_name = opts_concat (opts->x_dump_dir_name,
1032 opts->x_dump_base_name, NULL);
1034 /* It is definitely prefixed now. */
1035 opts->x_dump_base_name_prefixed = true;
1038 /* Handle related options for unit-at-a-time, toplevel-reorder, and
1039 section-anchors. */
1040 if (!opts->x_flag_unit_at_a_time)
1042 if (opts->x_flag_section_anchors && opts_set->x_flag_section_anchors)
1043 error_at (loc, "section anchors must be disabled when unit-at-a-time "
1044 "is disabled");
1045 opts->x_flag_section_anchors = 0;
1046 if (opts->x_flag_toplevel_reorder == 1)
1047 error_at (loc, "toplevel reorder must be disabled when unit-at-a-time "
1048 "is disabled");
1049 opts->x_flag_toplevel_reorder = 0;
1052 /* -fself-test depends on the state of the compiler prior to
1053 compiling anything. Ideally it should be run on an empty source
1054 file. However, in case we get run with actual source, assume
1055 -fsyntax-only which will inhibit any compiler initialization
1056 which may confuse the self tests. */
1057 if (opts->x_flag_self_test)
1058 opts->x_flag_syntax_only = 1;
1060 if (opts->x_flag_tm && opts->x_flag_non_call_exceptions)
1061 sorry ("transactional memory is not supported with non-call exceptions");
1063 /* Unless the user has asked for section anchors, we disable toplevel
1064 reordering at -O0 to disable transformations that might be surprising
1065 to end users and to get -fno-toplevel-reorder tested. */
1066 if (!opts->x_optimize
1067 && opts->x_flag_toplevel_reorder == 2
1068 && !(opts->x_flag_section_anchors && opts_set->x_flag_section_anchors))
1070 opts->x_flag_toplevel_reorder = 0;
1071 opts->x_flag_section_anchors = 0;
1073 if (!opts->x_flag_toplevel_reorder)
1075 if (opts->x_flag_section_anchors && opts_set->x_flag_section_anchors)
1076 error_at (loc, "section anchors must be disabled when toplevel reorder"
1077 " is disabled");
1078 opts->x_flag_section_anchors = 0;
1081 if (!opts->x_flag_opts_finished)
1083 /* We initialize opts->x_flag_pie to -1 so that targets can set a
1084 default value. */
1085 if (opts->x_flag_pie == -1)
1087 /* We initialize opts->x_flag_pic to -1 so that we can tell if
1088 -fpic, -fPIC, -fno-pic or -fno-PIC is used. */
1089 if (opts->x_flag_pic == -1)
1090 opts->x_flag_pie = DEFAULT_FLAG_PIE;
1091 else
1092 opts->x_flag_pie = 0;
1094 /* If -fPIE or -fpie is used, turn on PIC. */
1095 if (opts->x_flag_pie)
1096 opts->x_flag_pic = opts->x_flag_pie;
1097 else if (opts->x_flag_pic == -1)
1098 opts->x_flag_pic = 0;
1099 if (opts->x_flag_pic && !opts->x_flag_pie)
1100 opts->x_flag_shlib = 1;
1101 opts->x_flag_opts_finished = true;
1104 /* We initialize opts->x_flag_stack_protect to -1 so that targets
1105 can set a default value. */
1106 if (opts->x_flag_stack_protect == -1)
1107 opts->x_flag_stack_protect = DEFAULT_FLAG_SSP;
1109 if (opts->x_optimize == 0)
1111 /* Inlining does not work if not optimizing,
1112 so force it not to be done. */
1113 opts->x_warn_inline = 0;
1114 opts->x_flag_no_inline = 1;
1117 /* Pipelining of outer loops is only possible when general pipelining
1118 capabilities are requested. */
1119 if (!opts->x_flag_sel_sched_pipelining)
1120 opts->x_flag_sel_sched_pipelining_outer_loops = 0;
1122 if (opts->x_flag_conserve_stack)
1124 SET_OPTION_IF_UNSET (opts, opts_set, param_large_stack_frame, 100);
1125 SET_OPTION_IF_UNSET (opts, opts_set, param_stack_frame_growth, 40);
1128 if (opts->x_flag_lto)
1130 #ifdef ENABLE_LTO
1131 opts->x_flag_generate_lto = 1;
1133 /* When generating IL, do not operate in whole-program mode.
1134 Otherwise, symbols will be privatized too early, causing link
1135 errors later. */
1136 opts->x_flag_whole_program = 0;
1137 #else
1138 error_at (loc, "LTO support has not been enabled in this configuration");
1139 #endif
1140 if (!opts->x_flag_fat_lto_objects
1141 && (!HAVE_LTO_PLUGIN
1142 || (opts_set->x_flag_use_linker_plugin
1143 && !opts->x_flag_use_linker_plugin)))
1145 if (opts_set->x_flag_fat_lto_objects)
1146 error_at (loc, "%<-fno-fat-lto-objects%> are supported only with "
1147 "linker plugin");
1148 opts->x_flag_fat_lto_objects = 1;
1151 /* -gsplit-dwarf isn't compatible with LTO, see PR88389. */
1152 if (opts->x_dwarf_split_debug_info)
1154 inform (loc, "%<-gsplit-dwarf%> is not supported with LTO,"
1155 " disabling");
1156 opts->x_dwarf_split_debug_info = 0;
1160 /* We initialize opts->x_flag_split_stack to -1 so that targets can set a
1161 default value if they choose based on other options. */
1162 if (opts->x_flag_split_stack == -1)
1163 opts->x_flag_split_stack = 0;
1164 else if (opts->x_flag_split_stack)
1166 if (!targetm_common.supports_split_stack (true, opts))
1168 error_at (loc, "%<-fsplit-stack%> is not supported by "
1169 "this compiler configuration");
1170 opts->x_flag_split_stack = 0;
1174 /* If stack splitting is turned on, and the user did not explicitly
1175 request function partitioning, turn off partitioning, as it
1176 confuses the linker when trying to handle partitioned split-stack
1177 code that calls a non-split-stack functions. But if partitioning
1178 was turned on explicitly just hope for the best. */
1179 if (opts->x_flag_split_stack
1180 && opts->x_flag_reorder_blocks_and_partition)
1181 SET_OPTION_IF_UNSET (opts, opts_set, flag_reorder_blocks_and_partition, 0);
1183 if (opts->x_flag_reorder_blocks_and_partition)
1184 SET_OPTION_IF_UNSET (opts, opts_set, flag_reorder_functions, 1);
1186 /* The -gsplit-dwarf option requires -ggnu-pubnames. */
1187 if (opts->x_dwarf_split_debug_info)
1188 opts->x_debug_generate_pub_sections = 2;
1190 if ((opts->x_flag_sanitize
1191 & (SANITIZE_USER_ADDRESS | SANITIZE_KERNEL_ADDRESS)) == 0)
1193 if (opts->x_flag_sanitize & SANITIZE_POINTER_COMPARE)
1194 error_at (loc,
1195 "%<-fsanitize=pointer-compare%> must be combined with "
1196 "%<-fsanitize=address%> or %<-fsanitize=kernel-address%>");
1197 if (opts->x_flag_sanitize & SANITIZE_POINTER_SUBTRACT)
1198 error_at (loc,
1199 "%<-fsanitize=pointer-subtract%> must be combined with "
1200 "%<-fsanitize=address%> or %<-fsanitize=kernel-address%>");
1203 /* Address sanitizers conflict with the thread sanitizer. */
1204 report_conflicting_sanitizer_options (opts, loc, SANITIZE_THREAD,
1205 SANITIZE_ADDRESS | SANITIZE_HWADDRESS);
1206 /* The leak sanitizer conflicts with the thread sanitizer. */
1207 report_conflicting_sanitizer_options (opts, loc, SANITIZE_LEAK,
1208 SANITIZE_THREAD);
1210 /* No combination of HWASAN and ASAN work together. */
1211 report_conflicting_sanitizer_options (opts, loc,
1212 SANITIZE_HWADDRESS, SANITIZE_ADDRESS);
1214 /* The userspace and kernel address sanitizers conflict with each other. */
1215 report_conflicting_sanitizer_options (opts, loc, SANITIZE_USER_HWADDRESS,
1216 SANITIZE_KERNEL_HWADDRESS);
1217 report_conflicting_sanitizer_options (opts, loc, SANITIZE_USER_ADDRESS,
1218 SANITIZE_KERNEL_ADDRESS);
1220 /* Check error recovery for -fsanitize-recover option. */
1221 for (int i = 0; sanitizer_opts[i].name != NULL; ++i)
1222 if ((opts->x_flag_sanitize_recover & sanitizer_opts[i].flag)
1223 && !sanitizer_opts[i].can_recover)
1224 error_at (loc, "%<-fsanitize-recover=%s%> is not supported",
1225 sanitizer_opts[i].name);
1227 /* When instrumenting the pointers, we don't want to remove
1228 the null pointer checks. */
1229 if (opts->x_flag_sanitize & (SANITIZE_NULL | SANITIZE_NONNULL_ATTRIBUTE
1230 | SANITIZE_RETURNS_NONNULL_ATTRIBUTE))
1231 opts->x_flag_delete_null_pointer_checks = 0;
1233 /* Aggressive compiler optimizations may cause false negatives. */
1234 if (opts->x_flag_sanitize & ~(SANITIZE_LEAK | SANITIZE_UNREACHABLE))
1235 opts->x_flag_aggressive_loop_optimizations = 0;
1237 /* Enable -fsanitize-address-use-after-scope if either address sanitizer is
1238 enabled. */
1239 if (opts->x_flag_sanitize
1240 & (SANITIZE_USER_ADDRESS | SANITIZE_USER_HWADDRESS))
1241 SET_OPTION_IF_UNSET (opts, opts_set, flag_sanitize_address_use_after_scope,
1242 true);
1244 /* Force -fstack-reuse=none in case -fsanitize-address-use-after-scope
1245 is enabled. */
1246 if (opts->x_flag_sanitize_address_use_after_scope)
1248 if (opts->x_flag_stack_reuse != SR_NONE
1249 && opts_set->x_flag_stack_reuse != SR_NONE)
1250 error_at (loc,
1251 "%<-fsanitize-address-use-after-scope%> requires "
1252 "%<-fstack-reuse=none%> option");
1254 opts->x_flag_stack_reuse = SR_NONE;
1257 if ((opts->x_flag_sanitize & SANITIZE_USER_ADDRESS) && opts->x_flag_tm)
1258 sorry ("transactional memory is not supported with %<-fsanitize=address%>");
1260 if ((opts->x_flag_sanitize & SANITIZE_KERNEL_ADDRESS) && opts->x_flag_tm)
1261 sorry ("transactional memory is not supported with "
1262 "%<-fsanitize=kernel-address%>");
1264 /* Currently live patching is not support for LTO. */
1265 if (opts->x_flag_live_patching && opts->x_flag_lto)
1266 sorry ("live patching is not supported with LTO");
1268 /* Currently vtable verification is not supported for LTO */
1269 if (opts->x_flag_vtable_verify && opts->x_flag_lto)
1270 sorry ("vtable verification is not supported with LTO");
1272 /* Control IPA optimizations based on different -flive-patching level. */
1273 if (opts->x_flag_live_patching)
1274 control_options_for_live_patching (opts, opts_set,
1275 opts->x_flag_live_patching,
1276 loc);
1278 /* Allow cunroll to grow size accordingly. */
1279 if (!opts_set->x_flag_cunroll_grow_size)
1280 opts->x_flag_cunroll_grow_size
1281 = (opts->x_flag_unroll_loops
1282 || opts->x_flag_peel_loops
1283 || opts->x_optimize >= 3);
1285 /* With -fcx-limited-range, we do cheap and quick complex arithmetic. */
1286 if (opts->x_flag_cx_limited_range)
1287 opts->x_flag_complex_method = 0;
1288 else if (opts_set->x_flag_cx_limited_range)
1289 opts->x_flag_complex_method = opts->x_flag_default_complex_method;
1291 /* With -fcx-fortran-rules, we do something in-between cheap and C99. */
1292 if (opts->x_flag_cx_fortran_rules)
1293 opts->x_flag_complex_method = 1;
1294 else if (opts_set->x_flag_cx_fortran_rules)
1295 opts->x_flag_complex_method = opts->x_flag_default_complex_method;
1297 /* Use -fvect-cost-model=cheap instead of -fvect-cost-mode=very-cheap
1298 by default with explicit -ftree-{loop,slp}-vectorize. */
1299 if (opts->x_optimize == 2
1300 && (opts_set->x_flag_tree_loop_vectorize
1301 || opts_set->x_flag_tree_vectorize))
1302 SET_OPTION_IF_UNSET (opts, opts_set, flag_vect_cost_model,
1303 VECT_COST_MODEL_CHEAP);
1305 if (flag_gtoggle)
1307 /* Make sure to process -gtoggle only once. */
1308 flag_gtoggle = false;
1309 if (debug_info_level == DINFO_LEVEL_NONE)
1311 debug_info_level = DINFO_LEVEL_NORMAL;
1313 if (write_symbols == NO_DEBUG)
1314 write_symbols = PREFERRED_DEBUGGING_TYPE;
1316 else
1317 debug_info_level = DINFO_LEVEL_NONE;
1320 if (!OPTION_SET_P (debug_nonbind_markers_p))
1321 debug_nonbind_markers_p
1322 = (optimize
1323 && debug_info_level >= DINFO_LEVEL_NORMAL
1324 && dwarf_debuginfo_p ()
1325 && !(flag_selective_scheduling || flag_selective_scheduling2));
1327 /* Note -fvar-tracking is enabled automatically with OPT_LEVELS_1_PLUS and
1328 so we need to drop it if we are called from optimize attribute. */
1329 if (debug_info_level == DINFO_LEVEL_NONE
1330 && !OPTION_SET_P (flag_var_tracking))
1331 flag_var_tracking = false;
1333 /* One could use EnabledBy, but it would lead to a circular dependency. */
1334 if (!OPTION_SET_P (flag_var_tracking_uninit))
1335 flag_var_tracking_uninit = flag_var_tracking;
1337 if (!OPTION_SET_P (flag_var_tracking_assignments))
1338 flag_var_tracking_assignments
1339 = (flag_var_tracking
1340 && !(flag_selective_scheduling || flag_selective_scheduling2));
1342 if (flag_var_tracking_assignments_toggle)
1343 flag_var_tracking_assignments = !flag_var_tracking_assignments;
1345 if (flag_var_tracking_assignments && !flag_var_tracking)
1346 flag_var_tracking = flag_var_tracking_assignments = -1;
1348 if (flag_var_tracking_assignments
1349 && (flag_selective_scheduling || flag_selective_scheduling2))
1350 warning_at (loc, 0,
1351 "var-tracking-assignments changes selective scheduling");
1353 if (flag_syntax_only)
1355 write_symbols = NO_DEBUG;
1356 profile_flag = 0;
1360 diagnose_options (opts, opts_set, loc);
1363 /* The function diagnoses incompatible combinations for provided options
1364 (OPTS and OPTS_SET) at a given LOCation. The function is called both
1365 when command line is parsed (after the target optimization hook) and
1366 when an optimize/target attribute (or pragma) is used. */
1368 void diagnose_options (gcc_options *opts, gcc_options *opts_set,
1369 location_t loc)
1371 /* The optimization to partition hot and cold basic blocks into separate
1372 sections of the .o and executable files does not work (currently)
1373 with exception handling. This is because there is no support for
1374 generating unwind info. If opts->x_flag_exceptions is turned on
1375 we need to turn off the partitioning optimization. */
1377 enum unwind_info_type ui_except
1378 = targetm_common.except_unwind_info (opts);
1380 if (opts->x_flag_exceptions
1381 && opts->x_flag_reorder_blocks_and_partition
1382 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))
1384 if (opts_set->x_flag_reorder_blocks_and_partition)
1385 inform (loc,
1386 "%<-freorder-blocks-and-partition%> does not work "
1387 "with exceptions on this architecture");
1388 opts->x_flag_reorder_blocks_and_partition = 0;
1389 opts->x_flag_reorder_blocks = 1;
1392 /* If user requested unwind info, then turn off the partitioning
1393 optimization. */
1395 if (opts->x_flag_unwind_tables
1396 && !targetm_common.unwind_tables_default
1397 && opts->x_flag_reorder_blocks_and_partition
1398 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))
1400 if (opts_set->x_flag_reorder_blocks_and_partition)
1401 inform (loc,
1402 "%<-freorder-blocks-and-partition%> does not support "
1403 "unwind info on this architecture");
1404 opts->x_flag_reorder_blocks_and_partition = 0;
1405 opts->x_flag_reorder_blocks = 1;
1408 /* If the target requested unwind info, then turn off the partitioning
1409 optimization with a different message. Likewise, if the target does not
1410 support named sections. */
1412 if (opts->x_flag_reorder_blocks_and_partition
1413 && (!targetm_common.have_named_sections
1414 || (opts->x_flag_unwind_tables
1415 && targetm_common.unwind_tables_default
1416 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))))
1418 if (opts_set->x_flag_reorder_blocks_and_partition)
1419 inform (loc,
1420 "%<-freorder-blocks-and-partition%> does not work "
1421 "on this architecture");
1422 opts->x_flag_reorder_blocks_and_partition = 0;
1423 opts->x_flag_reorder_blocks = 1;
1429 #define LEFT_COLUMN 27
1431 /* Output ITEM, of length ITEM_WIDTH, in the left column,
1432 followed by word-wrapped HELP in a second column. */
1433 static void
1434 wrap_help (const char *help,
1435 const char *item,
1436 unsigned int item_width,
1437 unsigned int columns)
1439 unsigned int col_width = LEFT_COLUMN;
1440 unsigned int remaining, room, len;
1442 remaining = strlen (help);
1446 room = columns - 3 - MAX (col_width, item_width);
1447 if (room > columns)
1448 room = 0;
1449 len = remaining;
1451 if (room < len)
1453 unsigned int i;
1455 for (i = 0; help[i]; i++)
1457 if (i >= room && len != remaining)
1458 break;
1459 if (help[i] == ' ')
1460 len = i;
1461 else if ((help[i] == '-' || help[i] == '/')
1462 && help[i + 1] != ' '
1463 && i > 0 && ISALPHA (help[i - 1]))
1464 len = i + 1;
1468 printf (" %-*.*s %.*s\n", col_width, item_width, item, len, help);
1469 item_width = 0;
1470 while (help[len] == ' ')
1471 len++;
1472 help += len;
1473 remaining -= len;
1475 while (remaining);
1478 /* Data structure used to print list of valid option values. */
1480 class option_help_tuple
1482 public:
1483 option_help_tuple (int code, vec<const char *> values):
1484 m_code (code), m_values (values)
1487 /* Code of an option. */
1488 int m_code;
1490 /* List of possible values. */
1491 vec<const char *> m_values;
1494 /* Print help for a specific front-end, etc. */
1495 static void
1496 print_filtered_help (unsigned int include_flags,
1497 unsigned int exclude_flags,
1498 unsigned int any_flags,
1499 unsigned int columns,
1500 struct gcc_options *opts,
1501 unsigned int lang_mask)
1503 unsigned int i;
1504 const char *help;
1505 bool found = false;
1506 bool displayed = false;
1507 char new_help[256];
1509 if (!opts->x_help_printed)
1510 opts->x_help_printed = XCNEWVAR (char, cl_options_count);
1512 if (!opts->x_help_enum_printed)
1513 opts->x_help_enum_printed = XCNEWVAR (char, cl_enums_count);
1515 auto_vec<option_help_tuple> help_tuples;
1517 for (i = 0; i < cl_options_count; i++)
1519 const struct cl_option *option = cl_options + i;
1520 unsigned int len;
1521 const char *opt;
1522 const char *tab;
1524 if (include_flags == 0
1525 || ((option->flags & include_flags) != include_flags))
1527 if ((option->flags & any_flags) == 0)
1528 continue;
1531 /* Skip unwanted switches. */
1532 if ((option->flags & exclude_flags) != 0)
1533 continue;
1535 /* The driver currently prints its own help text. */
1536 if ((option->flags & CL_DRIVER) != 0
1537 && (option->flags & (((1U << cl_lang_count) - 1)
1538 | CL_COMMON | CL_TARGET)) == 0)
1539 continue;
1541 /* If an option contains a language specification,
1542 exclude it from common unless all languages are present. */
1543 if ((include_flags & CL_COMMON)
1544 && !(option->flags & CL_DRIVER)
1545 && (option->flags & CL_LANG_ALL)
1546 && (option->flags & CL_LANG_ALL) != CL_LANG_ALL)
1547 continue;
1549 found = true;
1550 /* Skip switches that have already been printed. */
1551 if (opts->x_help_printed[i])
1552 continue;
1554 opts->x_help_printed[i] = true;
1556 help = option->help;
1557 if (help == NULL)
1559 if (exclude_flags & CL_UNDOCUMENTED)
1560 continue;
1562 help = undocumented_msg;
1565 /* Get the translation. */
1566 help = _(help);
1568 if (option->alias_target < N_OPTS
1569 && cl_options [option->alias_target].help)
1571 const struct cl_option *target = cl_options + option->alias_target;
1572 if (option->help == NULL)
1574 /* The option is undocumented but is an alias for an option that
1575 is documented. If the option has alias arguments, then its
1576 purpose is to provide certain arguments to the other option, so
1577 inform the reader of this. Otherwise, point the reader to the
1578 other option in preference to the former. */
1580 if (option->alias_arg)
1582 if (option->neg_alias_arg)
1583 snprintf (new_help, sizeof new_help,
1584 _("Same as %s%s (or, in negated form, %s%s)."),
1585 target->opt_text, option->alias_arg,
1586 target->opt_text, option->neg_alias_arg);
1587 else
1588 snprintf (new_help, sizeof new_help,
1589 _("Same as %s%s."),
1590 target->opt_text, option->alias_arg);
1592 else
1593 snprintf (new_help, sizeof new_help,
1594 _("Same as %s."),
1595 target->opt_text);
1597 else
1599 /* For documented options with aliases, mention the aliased
1600 option's name for reference. */
1601 snprintf (new_help, sizeof new_help,
1602 _("%s Same as %s."),
1603 help, cl_options [option->alias_target].opt_text);
1606 help = new_help;
1609 if (option->warn_message)
1611 /* Mention that the use of the option will trigger a warning. */
1612 if (help == new_help)
1613 snprintf (new_help + strlen (new_help),
1614 sizeof new_help - strlen (new_help),
1615 " %s", _(use_diagnosed_msg));
1616 else
1617 snprintf (new_help, sizeof new_help,
1618 "%s %s", help, _(use_diagnosed_msg));
1620 help = new_help;
1623 /* Find the gap between the name of the
1624 option and its descriptive text. */
1625 tab = strchr (help, '\t');
1626 if (tab)
1628 len = tab - help;
1629 opt = help;
1630 help = tab + 1;
1632 else
1634 opt = option->opt_text;
1635 len = strlen (opt);
1638 /* With the -Q option enabled we change the descriptive text associated
1639 with an option to be an indication of its current setting. */
1640 if (!opts->x_quiet_flag)
1642 void *flag_var = option_flag_var (i, opts);
1644 if (len < (LEFT_COLUMN + 2))
1645 strcpy (new_help, "\t\t");
1646 else
1647 strcpy (new_help, "\t");
1649 /* Set to print whether the option is enabled or disabled,
1650 or, if it's an alias for another option, the name of
1651 the aliased option. */
1652 bool print_state = false;
1654 if (flag_var != NULL
1655 && option->var_type != CLVC_DEFER)
1657 /* If OPTION is only available for a specific subset
1658 of languages other than this one, mention them. */
1659 bool avail_for_lang = true;
1660 if (unsigned langset = option->flags & CL_LANG_ALL)
1662 if (!(langset & lang_mask))
1664 avail_for_lang = false;
1665 strcat (new_help, _("[available in "));
1666 for (unsigned i = 0, n = 0; (1U << i) < CL_LANG_ALL; ++i)
1667 if (langset & (1U << i))
1669 if (n++)
1670 strcat (new_help, ", ");
1671 strcat (new_help, lang_names[i]);
1673 strcat (new_help, "]");
1676 if (!avail_for_lang)
1677 ; /* Print nothing else if the option is not available
1678 in the current language. */
1679 else if (option->flags & CL_JOINED)
1681 if (option->var_type == CLVC_STRING)
1683 if (* (const char **) flag_var != NULL)
1684 snprintf (new_help + strlen (new_help),
1685 sizeof (new_help) - strlen (new_help),
1686 "%s", * (const char **) flag_var);
1688 else if (option->var_type == CLVC_ENUM)
1690 const struct cl_enum *e = &cl_enums[option->var_enum];
1691 int value;
1692 const char *arg = NULL;
1694 value = e->get (flag_var);
1695 enum_value_to_arg (e->values, &arg, value, lang_mask);
1696 if (arg == NULL)
1697 arg = _("[default]");
1698 snprintf (new_help + strlen (new_help),
1699 sizeof (new_help) - strlen (new_help),
1700 "%s", arg);
1702 else
1704 if (option->cl_host_wide_int)
1705 sprintf (new_help + strlen (new_help),
1706 _("%llu bytes"), (unsigned long long)
1707 *(unsigned HOST_WIDE_INT *) flag_var);
1708 else
1709 sprintf (new_help + strlen (new_help),
1710 "%i", * (int *) flag_var);
1713 else
1714 print_state = true;
1716 else
1717 /* When there is no argument, print the option state only
1718 if the option takes no argument. */
1719 print_state = !(option->flags & CL_JOINED);
1721 if (print_state)
1723 if (option->alias_target < N_OPTS
1724 && option->alias_target != OPT_SPECIAL_warn_removed
1725 && option->alias_target != OPT_SPECIAL_ignore
1726 && option->alias_target != OPT_SPECIAL_input_file
1727 && option->alias_target != OPT_SPECIAL_program_name
1728 && option->alias_target != OPT_SPECIAL_unknown)
1730 const struct cl_option *target
1731 = &cl_options[option->alias_target];
1732 sprintf (new_help + strlen (new_help), "%s%s",
1733 target->opt_text,
1734 option->alias_arg ? option->alias_arg : "");
1736 else if (option->alias_target == OPT_SPECIAL_ignore)
1737 strcat (new_help, ("[ignored]"));
1738 else
1740 /* Print the state for an on/off option. */
1741 int ena = option_enabled (i, lang_mask, opts);
1742 if (ena > 0)
1743 strcat (new_help, _("[enabled]"));
1744 else if (ena == 0)
1745 strcat (new_help, _("[disabled]"));
1749 help = new_help;
1752 if (option->range_max != -1)
1754 char b[128];
1755 snprintf (b, sizeof (b), "<%d,%d>", option->range_min,
1756 option->range_max);
1757 opt = concat (opt, b, NULL);
1758 len += strlen (b);
1761 wrap_help (help, opt, len, columns);
1762 displayed = true;
1764 if (option->var_type == CLVC_ENUM
1765 && opts->x_help_enum_printed[option->var_enum] != 2)
1766 opts->x_help_enum_printed[option->var_enum] = 1;
1767 else
1769 vec<const char *> option_values
1770 = targetm_common.get_valid_option_values (i, NULL);
1771 if (!option_values.is_empty ())
1772 help_tuples.safe_push (option_help_tuple (i, option_values));
1776 if (! found)
1778 unsigned int langs = include_flags & CL_LANG_ALL;
1780 if (langs == 0)
1781 printf (_(" No options with the desired characteristics were found\n"));
1782 else
1784 unsigned int i;
1786 /* PR 31349: Tell the user how to see all of the
1787 options supported by a specific front end. */
1788 for (i = 0; (1U << i) < CL_LANG_ALL; i ++)
1789 if ((1U << i) & langs)
1790 printf (_(" None found. Use --help=%s to show *all* the options supported by the %s front-end.\n"),
1791 lang_names[i], lang_names[i]);
1795 else if (! displayed)
1796 printf (_(" All options with the desired characteristics have already been displayed\n"));
1798 putchar ('\n');
1800 /* Print details of enumerated option arguments, if those
1801 enumerations have help text headings provided. If no help text
1802 is provided, presume that the possible values are listed in the
1803 help text for the relevant options. */
1804 for (i = 0; i < cl_enums_count; i++)
1806 unsigned int j, pos;
1808 if (opts->x_help_enum_printed[i] != 1)
1809 continue;
1810 if (cl_enums[i].help == NULL)
1811 continue;
1812 printf (" %s\n ", _(cl_enums[i].help));
1813 pos = 4;
1814 for (j = 0; cl_enums[i].values[j].arg != NULL; j++)
1816 unsigned int len = strlen (cl_enums[i].values[j].arg);
1818 if (pos > 4 && pos + 1 + len <= columns)
1820 printf (" %s", cl_enums[i].values[j].arg);
1821 pos += 1 + len;
1823 else
1825 if (pos > 4)
1827 printf ("\n ");
1828 pos = 4;
1830 printf ("%s", cl_enums[i].values[j].arg);
1831 pos += len;
1834 printf ("\n\n");
1835 opts->x_help_enum_printed[i] = 2;
1838 for (unsigned i = 0; i < help_tuples.length (); i++)
1840 const struct cl_option *option = cl_options + help_tuples[i].m_code;
1841 printf (_(" Known valid arguments for %s option:\n "),
1842 option->opt_text);
1843 for (unsigned j = 0; j < help_tuples[i].m_values.length (); j++)
1844 printf (" %s", help_tuples[i].m_values[j]);
1845 printf ("\n\n");
1849 /* Display help for a specified type of option.
1850 The options must have ALL of the INCLUDE_FLAGS set
1851 ANY of the flags in the ANY_FLAGS set
1852 and NONE of the EXCLUDE_FLAGS set. The current option state is in
1853 OPTS; LANG_MASK is used for interpreting enumerated option state. */
1854 static void
1855 print_specific_help (unsigned int include_flags,
1856 unsigned int exclude_flags,
1857 unsigned int any_flags,
1858 struct gcc_options *opts,
1859 unsigned int lang_mask)
1861 unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1862 const char * description = NULL;
1863 const char * descrip_extra = "";
1864 size_t i;
1865 unsigned int flag;
1867 /* Sanity check: Make sure that we do not have more
1868 languages than we have bits available to enumerate them. */
1869 gcc_assert ((1U << cl_lang_count) <= CL_MIN_OPTION_CLASS);
1871 /* If we have not done so already, obtain
1872 the desired maximum width of the output. */
1873 if (opts->x_help_columns == 0)
1875 opts->x_help_columns = get_terminal_width ();
1876 if (opts->x_help_columns == INT_MAX)
1877 /* Use a reasonable default. */
1878 opts->x_help_columns = 80;
1881 /* Decide upon the title for the options that we are going to display. */
1882 for (i = 0, flag = 1; flag <= CL_MAX_OPTION_CLASS; flag <<= 1, i ++)
1884 switch (flag & include_flags)
1886 case 0:
1887 case CL_DRIVER:
1888 break;
1890 case CL_TARGET:
1891 description = _("The following options are target specific");
1892 break;
1893 case CL_WARNING:
1894 description = _("The following options control compiler warning messages");
1895 break;
1896 case CL_OPTIMIZATION:
1897 description = _("The following options control optimizations");
1898 break;
1899 case CL_COMMON:
1900 description = _("The following options are language-independent");
1901 break;
1902 case CL_PARAMS:
1903 description = _("The following options control parameters");
1904 break;
1905 default:
1906 if (i >= cl_lang_count)
1907 break;
1908 if (exclude_flags & all_langs_mask)
1909 description = _("The following options are specific to just the language ");
1910 else
1911 description = _("The following options are supported by the language ");
1912 descrip_extra = lang_names [i];
1913 break;
1917 if (description == NULL)
1919 if (any_flags == 0)
1921 if (include_flags & CL_UNDOCUMENTED)
1922 description = _("The following options are not documented");
1923 else if (include_flags & CL_SEPARATE)
1924 description = _("The following options take separate arguments");
1925 else if (include_flags & CL_JOINED)
1926 description = _("The following options take joined arguments");
1927 else
1929 internal_error ("unrecognized %<include_flags 0x%x%> passed "
1930 "to %<print_specific_help%>",
1931 include_flags);
1932 return;
1935 else
1937 if (any_flags & all_langs_mask)
1938 description = _("The following options are language-related");
1939 else
1940 description = _("The following options are language-independent");
1944 printf ("%s%s:\n", description, descrip_extra);
1945 print_filtered_help (include_flags, exclude_flags, any_flags,
1946 opts->x_help_columns, opts, lang_mask);
1949 /* Enable FDO-related flags. */
1951 static void
1952 enable_fdo_optimizations (struct gcc_options *opts,
1953 struct gcc_options *opts_set,
1954 int value)
1956 SET_OPTION_IF_UNSET (opts, opts_set, flag_branch_probabilities, value);
1957 SET_OPTION_IF_UNSET (opts, opts_set, flag_profile_values, value);
1958 SET_OPTION_IF_UNSET (opts, opts_set, flag_unroll_loops, value);
1959 SET_OPTION_IF_UNSET (opts, opts_set, flag_peel_loops, value);
1960 SET_OPTION_IF_UNSET (opts, opts_set, flag_tracer, value);
1961 SET_OPTION_IF_UNSET (opts, opts_set, flag_value_profile_transformations,
1962 value);
1963 SET_OPTION_IF_UNSET (opts, opts_set, flag_inline_functions, value);
1964 SET_OPTION_IF_UNSET (opts, opts_set, flag_ipa_cp, value);
1965 if (value)
1967 SET_OPTION_IF_UNSET (opts, opts_set, flag_ipa_cp_clone, 1);
1968 SET_OPTION_IF_UNSET (opts, opts_set, flag_ipa_bit_cp, 1);
1970 SET_OPTION_IF_UNSET (opts, opts_set, flag_predictive_commoning, value);
1971 SET_OPTION_IF_UNSET (opts, opts_set, flag_split_loops, value);
1972 SET_OPTION_IF_UNSET (opts, opts_set, flag_unswitch_loops, value);
1973 SET_OPTION_IF_UNSET (opts, opts_set, flag_gcse_after_reload, value);
1974 SET_OPTION_IF_UNSET (opts, opts_set, flag_tree_loop_vectorize, value);
1975 SET_OPTION_IF_UNSET (opts, opts_set, flag_tree_slp_vectorize, value);
1976 SET_OPTION_IF_UNSET (opts, opts_set, flag_version_loops_for_strides, value);
1977 SET_OPTION_IF_UNSET (opts, opts_set, flag_vect_cost_model,
1978 VECT_COST_MODEL_DYNAMIC);
1979 SET_OPTION_IF_UNSET (opts, opts_set, flag_tree_loop_distribute_patterns,
1980 value);
1981 SET_OPTION_IF_UNSET (opts, opts_set, flag_loop_interchange, value);
1982 SET_OPTION_IF_UNSET (opts, opts_set, flag_unroll_jam, value);
1983 SET_OPTION_IF_UNSET (opts, opts_set, flag_tree_loop_distribution, value);
1986 /* -f{,no-}sanitize{,-recover}= suboptions. */
1987 const struct sanitizer_opts_s sanitizer_opts[] =
1989 #define SANITIZER_OPT(name, flags, recover) \
1990 { #name, flags, sizeof #name - 1, recover }
1991 SANITIZER_OPT (address, (SANITIZE_ADDRESS | SANITIZE_USER_ADDRESS), true),
1992 SANITIZER_OPT (hwaddress, (SANITIZE_HWADDRESS | SANITIZE_USER_HWADDRESS),
1993 true),
1994 SANITIZER_OPT (kernel-address, (SANITIZE_ADDRESS | SANITIZE_KERNEL_ADDRESS),
1995 true),
1996 SANITIZER_OPT (kernel-hwaddress,
1997 (SANITIZE_HWADDRESS | SANITIZE_KERNEL_HWADDRESS),
1998 true),
1999 SANITIZER_OPT (pointer-compare, SANITIZE_POINTER_COMPARE, true),
2000 SANITIZER_OPT (pointer-subtract, SANITIZE_POINTER_SUBTRACT, true),
2001 SANITIZER_OPT (thread, SANITIZE_THREAD, false),
2002 SANITIZER_OPT (leak, SANITIZE_LEAK, false),
2003 SANITIZER_OPT (shift, SANITIZE_SHIFT, true),
2004 SANITIZER_OPT (shift-base, SANITIZE_SHIFT_BASE, true),
2005 SANITIZER_OPT (shift-exponent, SANITIZE_SHIFT_EXPONENT, true),
2006 SANITIZER_OPT (integer-divide-by-zero, SANITIZE_DIVIDE, true),
2007 SANITIZER_OPT (undefined, SANITIZE_UNDEFINED, true),
2008 SANITIZER_OPT (unreachable, SANITIZE_UNREACHABLE, false),
2009 SANITIZER_OPT (vla-bound, SANITIZE_VLA, true),
2010 SANITIZER_OPT (return, SANITIZE_RETURN, false),
2011 SANITIZER_OPT (null, SANITIZE_NULL, true),
2012 SANITIZER_OPT (signed-integer-overflow, SANITIZE_SI_OVERFLOW, true),
2013 SANITIZER_OPT (bool, SANITIZE_BOOL, true),
2014 SANITIZER_OPT (enum, SANITIZE_ENUM, true),
2015 SANITIZER_OPT (float-divide-by-zero, SANITIZE_FLOAT_DIVIDE, true),
2016 SANITIZER_OPT (float-cast-overflow, SANITIZE_FLOAT_CAST, true),
2017 SANITIZER_OPT (bounds, SANITIZE_BOUNDS, true),
2018 SANITIZER_OPT (bounds-strict, SANITIZE_BOUNDS | SANITIZE_BOUNDS_STRICT, true),
2019 SANITIZER_OPT (alignment, SANITIZE_ALIGNMENT, true),
2020 SANITIZER_OPT (nonnull-attribute, SANITIZE_NONNULL_ATTRIBUTE, true),
2021 SANITIZER_OPT (returns-nonnull-attribute, SANITIZE_RETURNS_NONNULL_ATTRIBUTE,
2022 true),
2023 SANITIZER_OPT (object-size, SANITIZE_OBJECT_SIZE, true),
2024 SANITIZER_OPT (vptr, SANITIZE_VPTR, true),
2025 SANITIZER_OPT (pointer-overflow, SANITIZE_POINTER_OVERFLOW, true),
2026 SANITIZER_OPT (builtin, SANITIZE_BUILTIN, true),
2027 SANITIZER_OPT (shadow-call-stack, SANITIZE_SHADOW_CALL_STACK, false),
2028 SANITIZER_OPT (all, ~0U, true),
2029 #undef SANITIZER_OPT
2030 { NULL, 0U, 0UL, false }
2033 /* -fzero-call-used-regs= suboptions. */
2034 const struct zero_call_used_regs_opts_s zero_call_used_regs_opts[] =
2036 #define ZERO_CALL_USED_REGS_OPT(name, flags) \
2037 { #name, flags }
2038 ZERO_CALL_USED_REGS_OPT (skip, zero_regs_flags::SKIP),
2039 ZERO_CALL_USED_REGS_OPT (used-gpr-arg, zero_regs_flags::USED_GPR_ARG),
2040 ZERO_CALL_USED_REGS_OPT (used-gpr, zero_regs_flags::USED_GPR),
2041 ZERO_CALL_USED_REGS_OPT (used-arg, zero_regs_flags::USED_ARG),
2042 ZERO_CALL_USED_REGS_OPT (used, zero_regs_flags::USED),
2043 ZERO_CALL_USED_REGS_OPT (all-gpr-arg, zero_regs_flags::ALL_GPR_ARG),
2044 ZERO_CALL_USED_REGS_OPT (all-gpr, zero_regs_flags::ALL_GPR),
2045 ZERO_CALL_USED_REGS_OPT (all-arg, zero_regs_flags::ALL_ARG),
2046 ZERO_CALL_USED_REGS_OPT (all, zero_regs_flags::ALL),
2047 #undef ZERO_CALL_USED_REGS_OPT
2048 {NULL, 0U}
2051 /* A struct for describing a run of chars within a string. */
2053 class string_fragment
2055 public:
2056 string_fragment (const char *start, size_t len)
2057 : m_start (start), m_len (len) {}
2059 const char *m_start;
2060 size_t m_len;
2063 /* Specialization of edit_distance_traits for string_fragment,
2064 for use by get_closest_sanitizer_option. */
2066 template <>
2067 struct edit_distance_traits<const string_fragment &>
2069 static size_t get_length (const string_fragment &fragment)
2071 return fragment.m_len;
2074 static const char *get_string (const string_fragment &fragment)
2076 return fragment.m_start;
2080 /* Given ARG, an unrecognized sanitizer option, return the best
2081 matching sanitizer option, or NULL if there isn't one.
2082 OPTS is array of candidate sanitizer options.
2083 CODE is OPT_fsanitize_ or OPT_fsanitize_recover_.
2084 VALUE is non-zero for the regular form of the option, zero
2085 for the "no-" form (e.g. "-fno-sanitize-recover="). */
2087 static const char *
2088 get_closest_sanitizer_option (const string_fragment &arg,
2089 const struct sanitizer_opts_s *opts,
2090 enum opt_code code, int value)
2092 best_match <const string_fragment &, const char*> bm (arg);
2093 for (int i = 0; opts[i].name != NULL; ++i)
2095 /* -fsanitize=all is not valid, so don't offer it. */
2096 if (code == OPT_fsanitize_
2097 && opts[i].flag == ~0U
2098 && value)
2099 continue;
2101 /* For -fsanitize-recover= (and not -fno-sanitize-recover=),
2102 don't offer the non-recoverable options. */
2103 if (code == OPT_fsanitize_recover_
2104 && !opts[i].can_recover
2105 && value)
2106 continue;
2108 bm.consider (opts[i].name);
2110 return bm.get_best_meaningful_candidate ();
2113 /* Parse comma separated sanitizer suboptions from P for option SCODE,
2114 adjust previous FLAGS and return new ones. If COMPLAIN is false,
2115 don't issue diagnostics. */
2117 unsigned int
2118 parse_sanitizer_options (const char *p, location_t loc, int scode,
2119 unsigned int flags, int value, bool complain)
2121 enum opt_code code = (enum opt_code) scode;
2123 while (*p != 0)
2125 size_t len, i;
2126 bool found = false;
2127 const char *comma = strchr (p, ',');
2129 if (comma == NULL)
2130 len = strlen (p);
2131 else
2132 len = comma - p;
2133 if (len == 0)
2135 p = comma + 1;
2136 continue;
2139 /* Check to see if the string matches an option class name. */
2140 for (i = 0; sanitizer_opts[i].name != NULL; ++i)
2141 if (len == sanitizer_opts[i].len
2142 && memcmp (p, sanitizer_opts[i].name, len) == 0)
2144 /* Handle both -fsanitize and -fno-sanitize cases. */
2145 if (value && sanitizer_opts[i].flag == ~0U)
2147 if (code == OPT_fsanitize_)
2149 if (complain)
2150 error_at (loc, "%<-fsanitize=all%> option is not valid");
2152 else
2153 flags |= ~(SANITIZE_THREAD | SANITIZE_LEAK
2154 | SANITIZE_UNREACHABLE | SANITIZE_RETURN
2155 | SANITIZE_SHADOW_CALL_STACK);
2157 else if (value)
2159 /* Do not enable -fsanitize-recover=unreachable and
2160 -fsanitize-recover=return if -fsanitize-recover=undefined
2161 is selected. */
2162 if (code == OPT_fsanitize_recover_
2163 && sanitizer_opts[i].flag == SANITIZE_UNDEFINED)
2164 flags |= (SANITIZE_UNDEFINED
2165 & ~(SANITIZE_UNREACHABLE | SANITIZE_RETURN));
2166 else
2167 flags |= sanitizer_opts[i].flag;
2169 else
2170 flags &= ~sanitizer_opts[i].flag;
2171 found = true;
2172 break;
2175 if (! found && complain)
2177 const char *hint
2178 = get_closest_sanitizer_option (string_fragment (p, len),
2179 sanitizer_opts, code, value);
2181 const char *suffix;
2182 if (code == OPT_fsanitize_recover_)
2183 suffix = "-recover";
2184 else
2185 suffix = "";
2187 if (hint)
2188 error_at (loc,
2189 "unrecognized argument to %<-f%ssanitize%s=%> "
2190 "option: %q.*s; did you mean %qs?",
2191 value ? "" : "no-",
2192 suffix, (int) len, p, hint);
2193 else
2194 error_at (loc,
2195 "unrecognized argument to %<-f%ssanitize%s=%> option: "
2196 "%q.*s", value ? "" : "no-",
2197 suffix, (int) len, p);
2200 if (comma == NULL)
2201 break;
2202 p = comma + 1;
2204 return flags;
2207 /* Parse string values of no_sanitize attribute passed in VALUE.
2208 Values are separated with comma. */
2210 unsigned int
2211 parse_no_sanitize_attribute (char *value)
2213 unsigned int flags = 0;
2214 unsigned int i;
2215 char *q = strtok (value, ",");
2217 while (q != NULL)
2219 for (i = 0; sanitizer_opts[i].name != NULL; ++i)
2220 if (strcmp (sanitizer_opts[i].name, q) == 0)
2222 flags |= sanitizer_opts[i].flag;
2223 if (sanitizer_opts[i].flag == SANITIZE_UNDEFINED)
2224 flags |= SANITIZE_UNDEFINED_NONDEFAULT;
2225 break;
2228 if (sanitizer_opts[i].name == NULL)
2229 warning (OPT_Wattributes,
2230 "%qs attribute directive ignored", q);
2232 q = strtok (NULL, ",");
2235 return flags;
2238 /* Parse -fzero-call-used-regs suboptions from ARG, return the FLAGS. */
2240 unsigned int
2241 parse_zero_call_used_regs_options (const char *arg)
2243 unsigned int flags = 0;
2245 /* Check to see if the string matches a sub-option name. */
2246 for (unsigned int i = 0; zero_call_used_regs_opts[i].name != NULL; ++i)
2247 if (strcmp (arg, zero_call_used_regs_opts[i].name) == 0)
2249 flags = zero_call_used_regs_opts[i].flag;
2250 break;
2253 if (!flags)
2254 error ("unrecognized argument to %<-fzero-call-used-regs=%>: %qs", arg);
2256 return flags;
2259 /* Parse -falign-NAME format for a FLAG value. Return individual
2260 parsed integer values into RESULT_VALUES array. If REPORT_ERROR is
2261 set, print error message at LOC location. */
2263 bool
2264 parse_and_check_align_values (const char *flag,
2265 const char *name,
2266 auto_vec<unsigned> &result_values,
2267 bool report_error,
2268 location_t loc)
2270 char *str = xstrdup (flag);
2271 for (char *p = strtok (str, ":"); p; p = strtok (NULL, ":"))
2273 char *end;
2274 int v = strtol (p, &end, 10);
2275 if (*end != '\0' || v < 0)
2277 if (report_error)
2278 error_at (loc, "invalid arguments for %<-falign-%s%> option: %qs",
2279 name, flag);
2281 return false;
2284 result_values.safe_push ((unsigned)v);
2287 free (str);
2289 /* Check that we have a correct number of values. */
2290 if (result_values.is_empty () || result_values.length () > 4)
2292 if (report_error)
2293 error_at (loc, "invalid number of arguments for %<-falign-%s%> "
2294 "option: %qs", name, flag);
2295 return false;
2298 for (unsigned i = 0; i < result_values.length (); i++)
2299 if (result_values[i] > MAX_CODE_ALIGN_VALUE)
2301 if (report_error)
2302 error_at (loc, "%<-falign-%s%> is not between 0 and %d",
2303 name, MAX_CODE_ALIGN_VALUE);
2304 return false;
2307 return true;
2310 /* Check that alignment value FLAG for -falign-NAME is valid at a given
2311 location LOC. OPT_STR points to the stored -falign-NAME=argument and
2312 OPT_FLAG points to the associated -falign-NAME on/off flag. */
2314 static void
2315 check_alignment_argument (location_t loc, const char *flag, const char *name,
2316 int *opt_flag, const char **opt_str)
2318 auto_vec<unsigned> align_result;
2319 parse_and_check_align_values (flag, name, align_result, true, loc);
2321 if (align_result.length() >= 1 && align_result[0] == 0)
2323 *opt_flag = 1;
2324 *opt_str = NULL;
2328 /* Parse argument of -fpatchable-function-entry option ARG and store
2329 corresponding values to PATCH_AREA_SIZE and PATCH_AREA_START.
2330 If REPORT_ERROR is set to true, generate error for a problematic
2331 option arguments. */
2333 void
2334 parse_and_check_patch_area (const char *arg, bool report_error,
2335 HOST_WIDE_INT *patch_area_size,
2336 HOST_WIDE_INT *patch_area_start)
2338 *patch_area_size = 0;
2339 *patch_area_start = 0;
2341 if (arg == NULL)
2342 return;
2344 char *patch_area_arg = xstrdup (arg);
2345 char *comma = strchr (patch_area_arg, ',');
2346 if (comma)
2348 *comma = '\0';
2349 *patch_area_size = integral_argument (patch_area_arg);
2350 *patch_area_start = integral_argument (comma + 1);
2352 else
2353 *patch_area_size = integral_argument (patch_area_arg);
2355 if (*patch_area_size < 0
2356 || *patch_area_size > USHRT_MAX
2357 || *patch_area_start < 0
2358 || *patch_area_start > USHRT_MAX
2359 || *patch_area_size < *patch_area_start)
2360 if (report_error)
2361 error ("invalid arguments for %<-fpatchable-function-entry%>");
2363 free (patch_area_arg);
2366 /* Print help when OPT__help_ is set. */
2368 void
2369 print_help (struct gcc_options *opts, unsigned int lang_mask,
2370 const char *help_option_argument)
2372 const char *a = help_option_argument;
2373 unsigned int include_flags = 0;
2374 /* Note - by default we include undocumented options when listing
2375 specific classes. If you only want to see documented options
2376 then add ",^undocumented" to the --help= option. E.g.:
2378 --help=target,^undocumented */
2379 unsigned int exclude_flags = 0;
2381 if (lang_mask == CL_DRIVER)
2382 return;
2384 /* Walk along the argument string, parsing each word in turn.
2385 The format is:
2386 arg = [^]{word}[,{arg}]
2387 word = {optimizers|target|warnings|undocumented|
2388 params|common|<language>} */
2389 while (*a != 0)
2391 static const struct
2393 const char *string;
2394 unsigned int flag;
2396 specifics[] =
2398 { "optimizers", CL_OPTIMIZATION },
2399 { "target", CL_TARGET },
2400 { "warnings", CL_WARNING },
2401 { "undocumented", CL_UNDOCUMENTED },
2402 { "params", CL_PARAMS },
2403 { "joined", CL_JOINED },
2404 { "separate", CL_SEPARATE },
2405 { "common", CL_COMMON },
2406 { NULL, 0 }
2408 unsigned int *pflags;
2409 const char *comma;
2410 unsigned int lang_flag, specific_flag;
2411 unsigned int len;
2412 unsigned int i;
2414 if (*a == '^')
2416 ++a;
2417 if (*a == '\0')
2419 error ("missing argument to %qs", "--help=^");
2420 break;
2422 pflags = &exclude_flags;
2424 else
2425 pflags = &include_flags;
2427 comma = strchr (a, ',');
2428 if (comma == NULL)
2429 len = strlen (a);
2430 else
2431 len = comma - a;
2432 if (len == 0)
2434 a = comma + 1;
2435 continue;
2438 /* Check to see if the string matches an option class name. */
2439 for (i = 0, specific_flag = 0; specifics[i].string != NULL; i++)
2440 if (strncasecmp (a, specifics[i].string, len) == 0)
2442 specific_flag = specifics[i].flag;
2443 break;
2446 /* Check to see if the string matches a language name.
2447 Note - we rely upon the alpha-sorted nature of the entries in
2448 the lang_names array, specifically that shorter names appear
2449 before their longer variants. (i.e. C before C++). That way
2450 when we are attempting to match --help=c for example we will
2451 match with C first and not C++. */
2452 for (i = 0, lang_flag = 0; i < cl_lang_count; i++)
2453 if (strncasecmp (a, lang_names[i], len) == 0)
2455 lang_flag = 1U << i;
2456 break;
2459 if (specific_flag != 0)
2461 if (lang_flag == 0)
2462 *pflags |= specific_flag;
2463 else
2465 /* The option's argument matches both the start of a
2466 language name and the start of an option class name.
2467 We have a special case for when the user has
2468 specified "--help=c", but otherwise we have to issue
2469 a warning. */
2470 if (strncasecmp (a, "c", len) == 0)
2471 *pflags |= lang_flag;
2472 else
2473 warning (0,
2474 "%<--help%> argument %q.*s is ambiguous, "
2475 "please be more specific",
2476 len, a);
2479 else if (lang_flag != 0)
2480 *pflags |= lang_flag;
2481 else
2482 warning (0,
2483 "unrecognized argument to %<--help=%> option: %q.*s",
2484 len, a);
2486 if (comma == NULL)
2487 break;
2488 a = comma + 1;
2491 /* We started using PerFunction/Optimization for parameters and
2492 a warning. We should exclude these from optimization options. */
2493 if (include_flags & CL_OPTIMIZATION)
2494 exclude_flags |= CL_WARNING;
2495 if (!(include_flags & CL_PARAMS))
2496 exclude_flags |= CL_PARAMS;
2498 if (include_flags)
2499 print_specific_help (include_flags, exclude_flags, 0, opts,
2500 lang_mask);
2503 /* Handle target- and language-independent options. Return zero to
2504 generate an "unknown option" message. Only options that need
2505 extra handling need to be listed here; if you simply want
2506 DECODED->value assigned to a variable, it happens automatically. */
2508 bool
2509 common_handle_option (struct gcc_options *opts,
2510 struct gcc_options *opts_set,
2511 const struct cl_decoded_option *decoded,
2512 unsigned int lang_mask, int kind ATTRIBUTE_UNUSED,
2513 location_t loc,
2514 const struct cl_option_handlers *handlers,
2515 diagnostic_context *dc,
2516 void (*target_option_override_hook) (void))
2518 size_t scode = decoded->opt_index;
2519 const char *arg = decoded->arg;
2520 HOST_WIDE_INT value = decoded->value;
2521 enum opt_code code = (enum opt_code) scode;
2523 gcc_assert (decoded->canonical_option_num_elements <= 2);
2525 switch (code)
2527 case OPT__help:
2529 unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
2530 unsigned int undoc_mask;
2531 unsigned int i;
2533 if (lang_mask == CL_DRIVER)
2534 break;
2536 undoc_mask = ((opts->x_verbose_flag | opts->x_extra_warnings)
2538 : CL_UNDOCUMENTED);
2539 target_option_override_hook ();
2540 /* First display any single language specific options. */
2541 for (i = 0; i < cl_lang_count; i++)
2542 print_specific_help
2543 (1U << i, (all_langs_mask & (~ (1U << i))) | undoc_mask, 0, opts,
2544 lang_mask);
2545 /* Next display any multi language specific options. */
2546 print_specific_help (0, undoc_mask, all_langs_mask, opts, lang_mask);
2547 /* Then display any remaining, non-language options. */
2548 for (i = CL_MIN_OPTION_CLASS; i <= CL_MAX_OPTION_CLASS; i <<= 1)
2549 if (i != CL_DRIVER)
2550 print_specific_help (i, undoc_mask, 0, opts, lang_mask);
2551 opts->x_exit_after_options = true;
2552 break;
2555 case OPT__target_help:
2556 if (lang_mask == CL_DRIVER)
2557 break;
2559 target_option_override_hook ();
2560 print_specific_help (CL_TARGET, CL_UNDOCUMENTED, 0, opts, lang_mask);
2561 opts->x_exit_after_options = true;
2562 break;
2564 case OPT__help_:
2566 help_option_arguments.safe_push (arg);
2567 opts->x_exit_after_options = true;
2568 break;
2571 case OPT__version:
2572 if (lang_mask == CL_DRIVER)
2573 break;
2575 opts->x_exit_after_options = true;
2576 break;
2578 case OPT__completion_:
2579 break;
2581 case OPT_fsanitize_:
2582 opts->x_flag_sanitize
2583 = parse_sanitizer_options (arg, loc, code,
2584 opts->x_flag_sanitize, value, true);
2586 /* Kernel ASan implies normal ASan but does not yet support
2587 all features. */
2588 if (opts->x_flag_sanitize & SANITIZE_KERNEL_ADDRESS)
2590 SET_OPTION_IF_UNSET (opts, opts_set,
2591 param_asan_instrumentation_with_call_threshold,
2593 SET_OPTION_IF_UNSET (opts, opts_set, param_asan_globals, 0);
2594 SET_OPTION_IF_UNSET (opts, opts_set, param_asan_stack, 0);
2595 SET_OPTION_IF_UNSET (opts, opts_set, param_asan_protect_allocas, 0);
2596 SET_OPTION_IF_UNSET (opts, opts_set, param_asan_use_after_return, 0);
2598 if (opts->x_flag_sanitize & SANITIZE_KERNEL_HWADDRESS)
2600 SET_OPTION_IF_UNSET (opts, opts_set,
2601 param_hwasan_instrument_stack, 0);
2602 SET_OPTION_IF_UNSET (opts, opts_set,
2603 param_hwasan_random_frame_tag, 0);
2604 SET_OPTION_IF_UNSET (opts, opts_set,
2605 param_hwasan_instrument_allocas, 0);
2607 break;
2609 case OPT_fsanitize_recover_:
2610 opts->x_flag_sanitize_recover
2611 = parse_sanitizer_options (arg, loc, code,
2612 opts->x_flag_sanitize_recover, value, true);
2613 break;
2615 case OPT_fasan_shadow_offset_:
2616 /* Deferred. */
2617 break;
2619 case OPT_fsanitize_address_use_after_scope:
2620 opts->x_flag_sanitize_address_use_after_scope = value;
2621 break;
2623 case OPT_fsanitize_recover:
2624 if (value)
2625 opts->x_flag_sanitize_recover
2626 |= (SANITIZE_UNDEFINED | SANITIZE_UNDEFINED_NONDEFAULT)
2627 & ~(SANITIZE_UNREACHABLE | SANITIZE_RETURN);
2628 else
2629 opts->x_flag_sanitize_recover
2630 &= ~(SANITIZE_UNDEFINED | SANITIZE_UNDEFINED_NONDEFAULT);
2631 break;
2633 case OPT_O:
2634 case OPT_Os:
2635 case OPT_Ofast:
2636 case OPT_Og:
2637 case OPT_Oz:
2638 /* Currently handled in a prescan. */
2639 break;
2641 case OPT_Wattributes_:
2642 if (lang_mask == CL_DRIVER)
2643 break;
2645 if (value)
2647 error_at (loc, "arguments ignored for %<-Wattributes=%>; use "
2648 "%<-Wno-attributes=%> instead");
2649 break;
2651 else if (arg[strlen (arg) - 1] == ',')
2653 error_at (loc, "trailing %<,%> in arguments for "
2654 "%<-Wno-attributes=%>");
2655 break;
2658 add_comma_separated_to_vector (&opts->x_flag_ignored_attributes, arg);
2659 break;
2661 case OPT_Werror:
2662 dc->warning_as_error_requested = value;
2663 break;
2665 case OPT_Werror_:
2666 if (lang_mask == CL_DRIVER)
2667 break;
2669 enable_warning_as_error (arg, value, lang_mask, handlers,
2670 opts, opts_set, loc, dc);
2671 break;
2673 case OPT_Wfatal_errors:
2674 dc->fatal_errors = value;
2675 break;
2677 case OPT_Wstack_usage_:
2678 opts->x_flag_stack_usage_info = value != -1;
2679 break;
2681 case OPT_Wstrict_aliasing:
2682 set_Wstrict_aliasing (opts, value);
2683 break;
2685 case OPT_Wstrict_overflow:
2686 opts->x_warn_strict_overflow = (value
2687 ? (int) WARN_STRICT_OVERFLOW_CONDITIONAL
2688 : 0);
2689 break;
2691 case OPT_Wsystem_headers:
2692 dc->dc_warn_system_headers = value;
2693 break;
2695 case OPT_aux_info:
2696 opts->x_flag_gen_aux_info = 1;
2697 break;
2699 case OPT_d:
2700 decode_d_option (arg, opts, loc, dc);
2701 break;
2703 case OPT_fcall_used_:
2704 case OPT_fcall_saved_:
2705 /* Deferred. */
2706 break;
2708 case OPT_fdbg_cnt_:
2709 /* Deferred. */
2710 break;
2712 case OPT_fdebug_prefix_map_:
2713 case OPT_ffile_prefix_map_:
2714 case OPT_fprofile_prefix_map_:
2715 /* Deferred. */
2716 break;
2718 case OPT_fcallgraph_info:
2719 opts->x_flag_callgraph_info = CALLGRAPH_INFO_NAKED;
2720 break;
2722 case OPT_fcallgraph_info_:
2724 char *my_arg, *p;
2725 my_arg = xstrdup (arg);
2726 p = strtok (my_arg, ",");
2727 while (p)
2729 if (strcmp (p, "su") == 0)
2731 opts->x_flag_callgraph_info |= CALLGRAPH_INFO_STACK_USAGE;
2732 opts->x_flag_stack_usage_info = true;
2734 else if (strcmp (p, "da") == 0)
2735 opts->x_flag_callgraph_info |= CALLGRAPH_INFO_DYNAMIC_ALLOC;
2736 else
2737 return 0;
2738 p = strtok (NULL, ",");
2740 free (my_arg);
2742 break;
2744 case OPT_fdiagnostics_show_location_:
2745 diagnostic_prefixing_rule (dc) = (diagnostic_prefixing_rule_t) value;
2746 break;
2748 case OPT_fdiagnostics_show_caret:
2749 dc->show_caret = value;
2750 break;
2752 case OPT_fdiagnostics_show_labels:
2753 dc->show_labels_p = value;
2754 break;
2756 case OPT_fdiagnostics_show_line_numbers:
2757 dc->show_line_numbers_p = value;
2758 break;
2760 case OPT_fdiagnostics_color_:
2761 diagnostic_color_init (dc, value);
2762 break;
2764 case OPT_fdiagnostics_urls_:
2765 diagnostic_urls_init (dc, value);
2766 break;
2768 case OPT_fdiagnostics_format_:
2769 diagnostic_output_format_init (dc,
2770 (enum diagnostics_output_format)value);
2771 break;
2773 case OPT_fdiagnostics_parseable_fixits:
2774 dc->extra_output_kind = (value
2775 ? EXTRA_DIAGNOSTIC_OUTPUT_fixits_v1
2776 : EXTRA_DIAGNOSTIC_OUTPUT_none);
2777 break;
2779 case OPT_fdiagnostics_column_unit_:
2780 dc->column_unit = (enum diagnostics_column_unit)value;
2781 break;
2783 case OPT_fdiagnostics_column_origin_:
2784 dc->column_origin = value;
2785 break;
2787 case OPT_fdiagnostics_escape_format_:
2788 dc->escape_format = (enum diagnostics_escape_format)value;
2789 break;
2791 case OPT_fdiagnostics_show_cwe:
2792 dc->show_cwe = value;
2793 break;
2795 case OPT_fdiagnostics_path_format_:
2796 dc->path_format = (enum diagnostic_path_format)value;
2797 break;
2799 case OPT_fdiagnostics_show_path_depths:
2800 dc->show_path_depths = value;
2801 break;
2803 case OPT_fdiagnostics_show_option:
2804 dc->show_option_requested = value;
2805 break;
2807 case OPT_fdiagnostics_minimum_margin_width_:
2808 dc->min_margin_width = value;
2809 break;
2811 case OPT_fdump_:
2812 /* Deferred. */
2813 break;
2815 case OPT_ffast_math:
2816 set_fast_math_flags (opts, value);
2817 break;
2819 case OPT_funsafe_math_optimizations:
2820 set_unsafe_math_optimizations_flags (opts, value);
2821 break;
2823 case OPT_ffixed_:
2824 /* Deferred. */
2825 break;
2827 case OPT_finline_limit_:
2828 SET_OPTION_IF_UNSET (opts, opts_set, param_max_inline_insns_single,
2829 value / 2);
2830 SET_OPTION_IF_UNSET (opts, opts_set, param_max_inline_insns_auto,
2831 value / 2);
2832 break;
2834 case OPT_finstrument_functions_exclude_function_list_:
2835 add_comma_separated_to_vector
2836 (&opts->x_flag_instrument_functions_exclude_functions, arg);
2837 break;
2839 case OPT_finstrument_functions_exclude_file_list_:
2840 add_comma_separated_to_vector
2841 (&opts->x_flag_instrument_functions_exclude_files, arg);
2842 break;
2844 case OPT_fmessage_length_:
2845 pp_set_line_maximum_length (dc->printer, value);
2846 diagnostic_set_caret_max_width (dc, value);
2847 break;
2849 case OPT_fopt_info:
2850 case OPT_fopt_info_:
2851 /* Deferred. */
2852 break;
2854 case OPT_foffload_options_:
2855 /* Deferred. */
2856 break;
2858 case OPT_foffload_abi_:
2859 #ifdef ACCEL_COMPILER
2860 /* Handled in the 'mkoffload's. */
2861 #else
2862 error_at (loc, "%<-foffload-abi%> option can be specified only for "
2863 "offload compiler");
2864 #endif
2865 break;
2867 case OPT_fpack_struct_:
2868 if (value <= 0 || (value & (value - 1)) || value > 16)
2869 error_at (loc,
2870 "structure alignment must be a small power of two, not %wu",
2871 value);
2872 else
2873 opts->x_initial_max_fld_align = value;
2874 break;
2876 case OPT_fplugin_:
2877 case OPT_fplugin_arg_:
2878 /* Deferred. */
2879 break;
2881 case OPT_fprofile_use_:
2882 opts->x_profile_data_prefix = xstrdup (arg);
2883 opts->x_flag_profile_use = true;
2884 value = true;
2885 /* No break here - do -fprofile-use processing. */
2886 /* FALLTHRU */
2887 case OPT_fprofile_use:
2888 enable_fdo_optimizations (opts, opts_set, value);
2889 SET_OPTION_IF_UNSET (opts, opts_set, flag_profile_reorder_functions,
2890 value);
2891 /* Indirect call profiling should do all useful transformations
2892 speculative devirtualization does. */
2893 if (opts->x_flag_value_profile_transformations)
2894 SET_OPTION_IF_UNSET (opts, opts_set, flag_devirtualize_speculatively,
2895 false);
2896 break;
2898 case OPT_fauto_profile_:
2899 opts->x_auto_profile_file = xstrdup (arg);
2900 opts->x_flag_auto_profile = true;
2901 value = true;
2902 /* No break here - do -fauto-profile processing. */
2903 /* FALLTHRU */
2904 case OPT_fauto_profile:
2905 enable_fdo_optimizations (opts, opts_set, value);
2906 SET_OPTION_IF_UNSET (opts, opts_set, flag_profile_correction, value);
2907 break;
2909 case OPT_fprofile_generate_:
2910 opts->x_profile_data_prefix = xstrdup (arg);
2911 value = true;
2912 /* No break here - do -fprofile-generate processing. */
2913 /* FALLTHRU */
2914 case OPT_fprofile_generate:
2915 SET_OPTION_IF_UNSET (opts, opts_set, profile_arc_flag, value);
2916 SET_OPTION_IF_UNSET (opts, opts_set, flag_profile_values, value);
2917 SET_OPTION_IF_UNSET (opts, opts_set, flag_inline_functions, value);
2918 SET_OPTION_IF_UNSET (opts, opts_set, flag_ipa_bit_cp, value);
2919 break;
2921 case OPT_fprofile_info_section:
2922 opts->x_profile_info_section = ".gcov_info";
2923 break;
2925 case OPT_fpatchable_function_entry_:
2927 HOST_WIDE_INT patch_area_size, patch_area_start;
2928 parse_and_check_patch_area (arg, true, &patch_area_size,
2929 &patch_area_start);
2931 break;
2933 case OPT_ftree_vectorize:
2934 /* Automatically sets -ftree-loop-vectorize and
2935 -ftree-slp-vectorize. Nothing more to do here. */
2936 break;
2937 case OPT_fzero_call_used_regs_:
2938 opts->x_flag_zero_call_used_regs
2939 = parse_zero_call_used_regs_options (arg);
2940 break;
2942 case OPT_fshow_column:
2943 dc->show_column = value;
2944 break;
2946 case OPT_frandom_seed:
2947 /* The real switch is -fno-random-seed. */
2948 if (value)
2949 return false;
2950 /* Deferred. */
2951 break;
2953 case OPT_frandom_seed_:
2954 /* Deferred. */
2955 break;
2957 case OPT_fsched_verbose_:
2958 #ifdef INSN_SCHEDULING
2959 /* Handled with Var in common.opt. */
2960 break;
2961 #else
2962 return false;
2963 #endif
2965 case OPT_fsched_stalled_insns_:
2966 opts->x_flag_sched_stalled_insns = value;
2967 if (opts->x_flag_sched_stalled_insns == 0)
2968 opts->x_flag_sched_stalled_insns = -1;
2969 break;
2971 case OPT_fsched_stalled_insns_dep_:
2972 opts->x_flag_sched_stalled_insns_dep = value;
2973 break;
2975 case OPT_fstack_check_:
2976 if (!strcmp (arg, "no"))
2977 opts->x_flag_stack_check = NO_STACK_CHECK;
2978 else if (!strcmp (arg, "generic"))
2979 /* This is the old stack checking method. */
2980 opts->x_flag_stack_check = STACK_CHECK_BUILTIN
2981 ? FULL_BUILTIN_STACK_CHECK
2982 : GENERIC_STACK_CHECK;
2983 else if (!strcmp (arg, "specific"))
2984 /* This is the new stack checking method. */
2985 opts->x_flag_stack_check = STACK_CHECK_BUILTIN
2986 ? FULL_BUILTIN_STACK_CHECK
2987 : STACK_CHECK_STATIC_BUILTIN
2988 ? STATIC_BUILTIN_STACK_CHECK
2989 : GENERIC_STACK_CHECK;
2990 else
2991 warning_at (loc, 0, "unknown stack check parameter %qs", arg);
2992 break;
2994 case OPT_fstack_limit:
2995 /* The real switch is -fno-stack-limit. */
2996 if (value)
2997 return false;
2998 /* Deferred. */
2999 break;
3001 case OPT_fstack_limit_register_:
3002 case OPT_fstack_limit_symbol_:
3003 /* Deferred. */
3004 break;
3006 case OPT_fstack_usage:
3007 opts->x_flag_stack_usage = value;
3008 opts->x_flag_stack_usage_info = value != 0;
3009 break;
3011 case OPT_g:
3012 set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, arg, opts, opts_set,
3013 loc);
3014 break;
3016 case OPT_gbtf:
3017 set_debug_level (BTF_DEBUG, false, arg, opts, opts_set, loc);
3018 /* set the debug level to level 2, but if already at level 3,
3019 don't lower it. */
3020 if (opts->x_debug_info_level < DINFO_LEVEL_NORMAL)
3021 opts->x_debug_info_level = DINFO_LEVEL_NORMAL;
3022 break;
3024 case OPT_gctf:
3025 set_debug_level (CTF_DEBUG, false, arg, opts, opts_set, loc);
3026 /* CTF generation feeds off DWARF dies. For optimal CTF, switch debug
3027 info level to 2. If off or at level 1, set it to level 2, but if
3028 already at level 3, don't lower it. */
3029 if (opts->x_debug_info_level < DINFO_LEVEL_NORMAL
3030 && opts->x_ctf_debug_info_level > CTFINFO_LEVEL_NONE)
3031 opts->x_debug_info_level = DINFO_LEVEL_NORMAL;
3032 break;
3034 case OPT_gdwarf:
3035 if (arg && strlen (arg) != 0)
3037 error_at (loc, "%<-gdwarf%s%> is ambiguous; "
3038 "use %<-gdwarf-%s%> for DWARF version "
3039 "or %<-gdwarf%> %<-g%s%> for debug level", arg, arg, arg);
3040 break;
3042 else
3043 value = opts->x_dwarf_version;
3045 /* FALLTHRU */
3046 case OPT_gdwarf_:
3047 if (value < 2 || value > 5)
3048 error_at (loc, "dwarf version %wu is not supported", value);
3049 else
3050 opts->x_dwarf_version = value;
3051 set_debug_level (DWARF2_DEBUG, false, "", opts, opts_set, loc);
3052 break;
3054 case OPT_ggdb:
3055 set_debug_level (NO_DEBUG, 2, arg, opts, opts_set, loc);
3056 break;
3058 case OPT_gstabs:
3059 case OPT_gstabs_:
3060 set_debug_level (DBX_DEBUG, code == OPT_gstabs_, arg, opts, opts_set,
3061 loc);
3062 break;
3064 case OPT_gvms:
3065 set_debug_level (VMS_DEBUG, false, arg, opts, opts_set, loc);
3066 break;
3068 case OPT_gxcoff:
3069 case OPT_gxcoff_:
3070 set_debug_level (XCOFF_DEBUG, code == OPT_gxcoff_, arg, opts, opts_set,
3071 loc);
3072 break;
3074 case OPT_gz:
3075 case OPT_gz_:
3076 /* Handled completely via specs. */
3077 break;
3079 case OPT_pedantic_errors:
3080 dc->pedantic_errors = 1;
3081 control_warning_option (OPT_Wpedantic, DK_ERROR, NULL, value,
3082 loc, lang_mask,
3083 handlers, opts, opts_set,
3084 dc);
3085 break;
3087 case OPT_flto:
3088 opts->x_flag_lto = value ? "" : NULL;
3089 break;
3091 case OPT_flto_:
3092 if (strcmp (arg, "none") != 0
3093 && strcmp (arg, "jobserver") != 0
3094 && strcmp (arg, "auto") != 0
3095 && atoi (arg) == 0)
3096 error_at (loc,
3097 "unrecognized argument to %<-flto=%> option: %qs", arg);
3098 break;
3100 case OPT_w:
3101 dc->dc_inhibit_warnings = true;
3102 break;
3104 case OPT_fmax_errors_:
3105 dc->max_errors = value;
3106 break;
3108 case OPT_fuse_ld_bfd:
3109 case OPT_fuse_ld_gold:
3110 case OPT_fuse_ld_lld:
3111 case OPT_fuse_ld_mold:
3112 case OPT_fuse_linker_plugin:
3113 /* No-op. Used by the driver and passed to us because it starts with f.*/
3114 break;
3116 case OPT_fwrapv:
3117 if (value)
3118 opts->x_flag_trapv = 0;
3119 break;
3121 case OPT_ftrapv:
3122 if (value)
3123 opts->x_flag_wrapv = 0;
3124 break;
3126 case OPT_fstrict_overflow:
3127 opts->x_flag_wrapv = !value;
3128 opts->x_flag_wrapv_pointer = !value;
3129 if (!value)
3130 opts->x_flag_trapv = 0;
3131 break;
3133 case OPT_fipa_icf:
3134 opts->x_flag_ipa_icf_functions = value;
3135 opts->x_flag_ipa_icf_variables = value;
3136 break;
3138 case OPT_falign_loops_:
3139 check_alignment_argument (loc, arg, "loops",
3140 &opts->x_flag_align_loops,
3141 &opts->x_str_align_loops);
3142 break;
3144 case OPT_falign_jumps_:
3145 check_alignment_argument (loc, arg, "jumps",
3146 &opts->x_flag_align_jumps,
3147 &opts->x_str_align_jumps);
3148 break;
3150 case OPT_falign_labels_:
3151 check_alignment_argument (loc, arg, "labels",
3152 &opts->x_flag_align_labels,
3153 &opts->x_str_align_labels);
3154 break;
3156 case OPT_falign_functions_:
3157 check_alignment_argument (loc, arg, "functions",
3158 &opts->x_flag_align_functions,
3159 &opts->x_str_align_functions);
3160 break;
3162 case OPT_ftabstop_:
3163 /* It is documented that we silently ignore silly values. */
3164 if (value >= 1 && value <= 100)
3165 dc->tabstop = value;
3166 break;
3168 case OPT_freport_bug:
3169 dc->report_bug = value;
3170 break;
3172 default:
3173 /* If the flag was handled in a standard way, assume the lack of
3174 processing here is intentional. */
3175 gcc_assert (option_flag_var (scode, opts));
3176 break;
3179 common_handle_option_auto (opts, opts_set, decoded, lang_mask, kind,
3180 loc, handlers, dc);
3181 return true;
3184 /* Used to set the level of strict aliasing warnings in OPTS,
3185 when no level is specified (i.e., when -Wstrict-aliasing, and not
3186 -Wstrict-aliasing=level was given).
3187 ONOFF is assumed to take value 1 when -Wstrict-aliasing is specified,
3188 and 0 otherwise. After calling this function, wstrict_aliasing will be
3189 set to the default value of -Wstrict_aliasing=level, currently 3. */
3190 static void
3191 set_Wstrict_aliasing (struct gcc_options *opts, int onoff)
3193 gcc_assert (onoff == 0 || onoff == 1);
3194 if (onoff != 0)
3195 opts->x_warn_strict_aliasing = 3;
3196 else
3197 opts->x_warn_strict_aliasing = 0;
3200 /* The following routines are useful in setting all the flags that
3201 -ffast-math and -fno-fast-math imply. */
3202 static void
3203 set_fast_math_flags (struct gcc_options *opts, int set)
3205 if (!opts->frontend_set_flag_unsafe_math_optimizations)
3207 opts->x_flag_unsafe_math_optimizations = set;
3208 set_unsafe_math_optimizations_flags (opts, set);
3210 if (!opts->frontend_set_flag_finite_math_only)
3211 opts->x_flag_finite_math_only = set;
3212 if (!opts->frontend_set_flag_errno_math)
3213 opts->x_flag_errno_math = !set;
3214 if (set)
3216 if (opts->frontend_set_flag_excess_precision == EXCESS_PRECISION_DEFAULT)
3217 opts->x_flag_excess_precision
3218 = set ? EXCESS_PRECISION_FAST : EXCESS_PRECISION_DEFAULT;
3219 if (!opts->frontend_set_flag_signaling_nans)
3220 opts->x_flag_signaling_nans = 0;
3221 if (!opts->frontend_set_flag_rounding_math)
3222 opts->x_flag_rounding_math = 0;
3223 if (!opts->frontend_set_flag_cx_limited_range)
3224 opts->x_flag_cx_limited_range = 1;
3228 /* When -funsafe-math-optimizations is set the following
3229 flags are set as well. */
3230 static void
3231 set_unsafe_math_optimizations_flags (struct gcc_options *opts, int set)
3233 if (!opts->frontend_set_flag_trapping_math)
3234 opts->x_flag_trapping_math = !set;
3235 if (!opts->frontend_set_flag_signed_zeros)
3236 opts->x_flag_signed_zeros = !set;
3237 if (!opts->frontend_set_flag_associative_math)
3238 opts->x_flag_associative_math = set;
3239 if (!opts->frontend_set_flag_reciprocal_math)
3240 opts->x_flag_reciprocal_math = set;
3243 /* Return true iff flags in OPTS are set as if -ffast-math. */
3244 bool
3245 fast_math_flags_set_p (const struct gcc_options *opts)
3247 return (!opts->x_flag_trapping_math
3248 && opts->x_flag_unsafe_math_optimizations
3249 && opts->x_flag_finite_math_only
3250 && !opts->x_flag_signed_zeros
3251 && !opts->x_flag_errno_math
3252 && opts->x_flag_excess_precision == EXCESS_PRECISION_FAST);
3255 /* Return true iff flags are set as if -ffast-math but using the flags stored
3256 in the struct cl_optimization structure. */
3257 bool
3258 fast_math_flags_struct_set_p (struct cl_optimization *opt)
3260 return (!opt->x_flag_trapping_math
3261 && opt->x_flag_unsafe_math_optimizations
3262 && opt->x_flag_finite_math_only
3263 && !opt->x_flag_signed_zeros
3264 && !opt->x_flag_errno_math);
3267 /* Handle a debug output -g switch for options OPTS
3268 (OPTS_SET->x_write_symbols storing whether a debug format was passed
3269 explicitly), location LOC. EXTENDED is true or false to support
3270 extended output (2 is special and means "-ggdb" was given). */
3271 static void
3272 set_debug_level (uint32_t dinfo, int extended, const char *arg,
3273 struct gcc_options *opts, struct gcc_options *opts_set,
3274 location_t loc)
3276 opts->x_use_gnu_debug_info_extensions = extended;
3278 if (dinfo == NO_DEBUG)
3280 if (opts->x_write_symbols == NO_DEBUG)
3282 opts->x_write_symbols = PREFERRED_DEBUGGING_TYPE;
3284 if (extended == 2)
3286 #if defined DWARF2_DEBUGGING_INFO || defined DWARF2_LINENO_DEBUGGING_INFO
3287 if (opts->x_write_symbols & CTF_DEBUG)
3288 opts->x_write_symbols |= DWARF2_DEBUG;
3289 else
3290 opts->x_write_symbols = DWARF2_DEBUG;
3291 #elif defined DBX_DEBUGGING_INFO
3292 opts->x_write_symbols = DBX_DEBUG;
3293 #endif
3296 if (opts->x_write_symbols == NO_DEBUG)
3297 warning_at (loc, 0, "target system does not support debug output");
3299 else if ((opts->x_write_symbols & CTF_DEBUG)
3300 || (opts->x_write_symbols & BTF_DEBUG))
3302 opts->x_write_symbols |= DWARF2_DEBUG;
3303 opts_set->x_write_symbols |= DWARF2_DEBUG;
3306 else
3308 /* Make and retain the choice if both CTF and DWARF debug info are to
3309 be generated. */
3310 if (((dinfo == DWARF2_DEBUG) || (dinfo == CTF_DEBUG))
3311 && ((opts->x_write_symbols == (DWARF2_DEBUG|CTF_DEBUG))
3312 || (opts->x_write_symbols == DWARF2_DEBUG)
3313 || (opts->x_write_symbols == CTF_DEBUG)))
3315 opts->x_write_symbols |= dinfo;
3316 opts_set->x_write_symbols |= dinfo;
3318 /* However, CTF and BTF are not allowed together at this time. */
3319 else if (((dinfo == DWARF2_DEBUG) || (dinfo == BTF_DEBUG))
3320 && ((opts->x_write_symbols == (DWARF2_DEBUG|BTF_DEBUG))
3321 || (opts->x_write_symbols == DWARF2_DEBUG)
3322 || (opts->x_write_symbols == BTF_DEBUG)))
3324 opts->x_write_symbols |= dinfo;
3325 opts_set->x_write_symbols |= dinfo;
3327 else
3329 /* Does it conflict with an already selected debug format? */
3330 if (opts_set->x_write_symbols != NO_DEBUG
3331 && opts->x_write_symbols != NO_DEBUG
3332 && dinfo != opts->x_write_symbols)
3334 gcc_assert (debug_set_count (dinfo) <= 1);
3335 error_at (loc, "debug format %qs conflicts with prior selection",
3336 debug_type_names[debug_set_to_format (dinfo)]);
3338 opts->x_write_symbols = dinfo;
3339 opts_set->x_write_symbols = dinfo;
3343 if (dinfo != BTF_DEBUG)
3345 /* A debug flag without a level defaults to level 2.
3346 If off or at level 1, set it to level 2, but if already
3347 at level 3, don't lower it. */
3348 if (*arg == '\0')
3350 if (dinfo == CTF_DEBUG)
3351 opts->x_ctf_debug_info_level = CTFINFO_LEVEL_NORMAL;
3352 else if (opts->x_debug_info_level < DINFO_LEVEL_NORMAL)
3353 opts->x_debug_info_level = DINFO_LEVEL_NORMAL;
3355 else
3357 int argval = integral_argument (arg);
3358 if (argval == -1)
3359 error_at (loc, "unrecognized debug output level %qs", arg);
3360 else if (argval > 3)
3361 error_at (loc, "debug output level %qs is too high", arg);
3362 else
3364 if (dinfo == CTF_DEBUG)
3365 opts->x_ctf_debug_info_level
3366 = (enum ctf_debug_info_levels) argval;
3367 else
3368 opts->x_debug_info_level = (enum debug_info_levels) argval;
3372 else if (*arg != '\0')
3373 error_at (loc, "unrecognized btf debug output level %qs", arg);
3376 /* Arrange to dump core on error for diagnostic context DC. (The
3377 regular error message is still printed first, except in the case of
3378 abort ().) */
3380 static void
3381 setup_core_dumping (diagnostic_context *dc)
3383 #ifdef SIGABRT
3384 signal (SIGABRT, SIG_DFL);
3385 #endif
3386 #if defined(HAVE_SETRLIMIT)
3388 struct rlimit rlim;
3389 if (getrlimit (RLIMIT_CORE, &rlim) != 0)
3390 fatal_error (input_location, "getting core file size maximum limit: %m");
3391 rlim.rlim_cur = rlim.rlim_max;
3392 if (setrlimit (RLIMIT_CORE, &rlim) != 0)
3393 fatal_error (input_location,
3394 "setting core file size limit to maximum: %m");
3396 #endif
3397 diagnostic_abort_on_error (dc);
3400 /* Parse a -d<ARG> command line switch for OPTS, location LOC,
3401 diagnostic context DC. */
3403 static void
3404 decode_d_option (const char *arg, struct gcc_options *opts,
3405 location_t loc, diagnostic_context *dc)
3407 int c;
3409 while (*arg)
3410 switch (c = *arg++)
3412 case 'A':
3413 opts->x_flag_debug_asm = 1;
3414 break;
3415 case 'p':
3416 opts->x_flag_print_asm_name = 1;
3417 break;
3418 case 'P':
3419 opts->x_flag_dump_rtl_in_asm = 1;
3420 opts->x_flag_print_asm_name = 1;
3421 break;
3422 case 'x':
3423 opts->x_rtl_dump_and_exit = 1;
3424 break;
3425 case 'D': /* These are handled by the preprocessor. */
3426 case 'I':
3427 case 'M':
3428 case 'N':
3429 case 'U':
3430 break;
3431 case 'H':
3432 setup_core_dumping (dc);
3433 break;
3434 case 'a':
3435 opts->x_flag_dump_all_passed = true;
3436 break;
3438 default:
3439 warning_at (loc, 0, "unrecognized gcc debugging option: %c", c);
3440 break;
3444 /* Enable (or disable if VALUE is 0) a warning option ARG (language
3445 mask LANG_MASK, option handlers HANDLERS) as an error for option
3446 structures OPTS and OPTS_SET, diagnostic context DC (possibly
3447 NULL), location LOC. This is used by -Werror=. */
3449 static void
3450 enable_warning_as_error (const char *arg, int value, unsigned int lang_mask,
3451 const struct cl_option_handlers *handlers,
3452 struct gcc_options *opts,
3453 struct gcc_options *opts_set,
3454 location_t loc, diagnostic_context *dc)
3456 char *new_option;
3457 int option_index;
3459 new_option = XNEWVEC (char, strlen (arg) + 2);
3460 new_option[0] = 'W';
3461 strcpy (new_option + 1, arg);
3462 option_index = find_opt (new_option, lang_mask);
3463 if (option_index == OPT_SPECIAL_unknown)
3465 option_proposer op;
3466 const char *hint = op.suggest_option (new_option);
3467 if (hint)
3468 error_at (loc, "%<-W%serror=%s%>: no option %<-%s%>;"
3469 " did you mean %<-%s%>?", value ? "" : "no-",
3470 arg, new_option, hint);
3471 else
3472 error_at (loc, "%<-W%serror=%s%>: no option %<-%s%>",
3473 value ? "" : "no-", arg, new_option);
3475 else if (!(cl_options[option_index].flags & CL_WARNING))
3476 error_at (loc, "%<-Werror=%s%>: %<-%s%> is not an option that "
3477 "controls warnings", arg, new_option);
3478 else
3480 const diagnostic_t kind = value ? DK_ERROR : DK_WARNING;
3481 const char *arg = NULL;
3483 if (cl_options[option_index].flags & CL_JOINED)
3484 arg = new_option + cl_options[option_index].opt_len;
3485 control_warning_option (option_index, (int) kind, arg, value,
3486 loc, lang_mask,
3487 handlers, opts, opts_set, dc);
3489 free (new_option);
3492 /* Return malloced memory for the name of the option OPTION_INDEX
3493 which enabled a diagnostic (context CONTEXT), originally of type
3494 ORIG_DIAG_KIND but possibly converted to DIAG_KIND by options such
3495 as -Werror. */
3497 char *
3498 option_name (diagnostic_context *context, int option_index,
3499 diagnostic_t orig_diag_kind, diagnostic_t diag_kind)
3501 if (option_index)
3503 /* A warning classified as an error. */
3504 if ((orig_diag_kind == DK_WARNING || orig_diag_kind == DK_PEDWARN)
3505 && diag_kind == DK_ERROR)
3506 return concat (cl_options[OPT_Werror_].opt_text,
3507 /* Skip over "-W". */
3508 cl_options[option_index].opt_text + 2,
3509 NULL);
3510 /* A warning with option. */
3511 else
3512 return xstrdup (cl_options[option_index].opt_text);
3514 /* A warning without option classified as an error. */
3515 else if ((orig_diag_kind == DK_WARNING || orig_diag_kind == DK_PEDWARN
3516 || diag_kind == DK_WARNING)
3517 && context->warning_as_error_requested)
3518 return xstrdup (cl_options[OPT_Werror].opt_text);
3519 else
3520 return NULL;
3523 /* Get the page within the documentation for this option. */
3525 static const char *
3526 get_option_html_page (int option_index)
3528 const cl_option *cl_opt = &cl_options[option_index];
3530 /* Analyzer options are on their own page. */
3531 if (strstr (cl_opt->opt_text, "analyzer-"))
3532 return "gcc/Static-Analyzer-Options.html";
3534 /* Handle -flto= option. */
3535 if (strstr (cl_opt->opt_text, "flto"))
3536 return "gcc/Optimize-Options.html";
3538 #ifdef CL_Fortran
3539 if ((cl_opt->flags & CL_Fortran) != 0
3540 /* If it is option common to both C/C++ and Fortran, it is documented
3541 in gcc/ rather than gfortran/ docs. */
3542 && (cl_opt->flags & CL_C) == 0
3543 #ifdef CL_CXX
3544 && (cl_opt->flags & CL_CXX) == 0
3545 #endif
3547 return "gfortran/Error-and-Warning-Options.html";
3548 #endif
3550 return "gcc/Warning-Options.html";
3553 /* Return malloced memory for a URL describing the option OPTION_INDEX
3554 which enabled a diagnostic (context CONTEXT). */
3556 char *
3557 get_option_url (diagnostic_context *, int option_index)
3559 if (option_index)
3560 return concat (/* DOCUMENTATION_ROOT_URL should be supplied via -D by
3561 the Makefile (see --with-documentation-root-url), and
3562 should have a trailing slash. */
3563 DOCUMENTATION_ROOT_URL,
3565 /* get_option_html_page will return something like
3566 "gcc/Warning-Options.html". */
3567 get_option_html_page (option_index),
3569 /* Expect an anchor of the form "index-Wfoo" e.g.
3570 <a name="index-Wformat"></a>, and thus an id within
3571 the URL of "#index-Wformat". */
3572 "#index", cl_options[option_index].opt_text,
3573 NULL);
3574 else
3575 return NULL;
3578 /* Return a heap allocated producer with command line options. */
3580 char *
3581 gen_command_line_string (cl_decoded_option *options,
3582 unsigned int options_count)
3584 auto_vec<const char *> switches;
3585 char *options_string, *tail;
3586 const char *p;
3587 size_t len = 0;
3589 for (unsigned i = 0; i < options_count; i++)
3590 switch (options[i].opt_index)
3592 case OPT_o:
3593 case OPT_d:
3594 case OPT_dumpbase:
3595 case OPT_dumpbase_ext:
3596 case OPT_dumpdir:
3597 case OPT_quiet:
3598 case OPT_version:
3599 case OPT_v:
3600 case OPT_w:
3601 case OPT_L:
3602 case OPT_D:
3603 case OPT_I:
3604 case OPT_U:
3605 case OPT_SPECIAL_unknown:
3606 case OPT_SPECIAL_ignore:
3607 case OPT_SPECIAL_warn_removed:
3608 case OPT_SPECIAL_program_name:
3609 case OPT_SPECIAL_input_file:
3610 case OPT_grecord_gcc_switches:
3611 case OPT_frecord_gcc_switches:
3612 case OPT__output_pch_:
3613 case OPT_fdiagnostics_show_location_:
3614 case OPT_fdiagnostics_show_option:
3615 case OPT_fdiagnostics_show_caret:
3616 case OPT_fdiagnostics_show_labels:
3617 case OPT_fdiagnostics_show_line_numbers:
3618 case OPT_fdiagnostics_color_:
3619 case OPT_fdiagnostics_format_:
3620 case OPT_fverbose_asm:
3621 case OPT____:
3622 case OPT__sysroot_:
3623 case OPT_nostdinc:
3624 case OPT_nostdinc__:
3625 case OPT_fpreprocessed:
3626 case OPT_fltrans_output_list_:
3627 case OPT_fresolution_:
3628 case OPT_fdebug_prefix_map_:
3629 case OPT_fmacro_prefix_map_:
3630 case OPT_ffile_prefix_map_:
3631 case OPT_fprofile_prefix_map_:
3632 case OPT_fcompare_debug:
3633 case OPT_fchecking:
3634 case OPT_fchecking_:
3635 /* Ignore these. */
3636 continue;
3637 case OPT_flto_:
3639 const char *lto_canonical = "-flto";
3640 switches.safe_push (lto_canonical);
3641 len += strlen (lto_canonical) + 1;
3642 break;
3644 default:
3645 if (cl_options[options[i].opt_index].flags
3646 & CL_NO_DWARF_RECORD)
3647 continue;
3648 gcc_checking_assert (options[i].canonical_option[0][0] == '-');
3649 switch (options[i].canonical_option[0][1])
3651 case 'M':
3652 case 'i':
3653 case 'W':
3654 continue;
3655 case 'f':
3656 if (strncmp (options[i].canonical_option[0] + 2,
3657 "dump", 4) == 0)
3658 continue;
3659 break;
3660 default:
3661 break;
3663 switches.safe_push (options[i].orig_option_with_args_text);
3664 len += strlen (options[i].orig_option_with_args_text) + 1;
3665 break;
3668 options_string = XNEWVEC (char, len + 1);
3669 tail = options_string;
3671 unsigned i;
3672 FOR_EACH_VEC_ELT (switches, i, p)
3674 len = strlen (p);
3675 memcpy (tail, p, len);
3676 tail += len;
3677 if (i != switches.length () - 1)
3679 *tail = ' ';
3680 ++tail;
3684 *tail = '\0';
3685 return options_string;
3688 /* Return a heap allocated producer string including command line options. */
3690 char *
3691 gen_producer_string (const char *language_string, cl_decoded_option *options,
3692 unsigned int options_count)
3694 char *cmdline = gen_command_line_string (options, options_count);
3695 char *combined = concat (language_string, " ", version_string, " ",
3696 cmdline, NULL);
3697 free (cmdline);
3698 return combined;
3701 #if CHECKING_P
3703 namespace selftest {
3705 /* Verify that get_option_html_page works as expected. */
3707 static void
3708 test_get_option_html_page ()
3710 ASSERT_STREQ (get_option_html_page (OPT_Wcpp), "gcc/Warning-Options.html");
3711 ASSERT_STREQ (get_option_html_page (OPT_Wanalyzer_double_free),
3712 "gcc/Static-Analyzer-Options.html");
3713 #ifdef CL_Fortran
3714 ASSERT_STREQ (get_option_html_page (OPT_Wline_truncation),
3715 "gfortran/Error-and-Warning-Options.html");
3716 #endif
3719 /* Verify EnumSet and EnumBitSet requirements. */
3721 static void
3722 test_enum_sets ()
3724 for (unsigned i = 0; i < cl_options_count; ++i)
3725 if (cl_options[i].var_type == CLVC_ENUM
3726 && cl_options[i].var_value != CLEV_NORMAL)
3728 const struct cl_enum *e = &cl_enums[cl_options[i].var_enum];
3729 unsigned HOST_WIDE_INT used_sets = 0;
3730 unsigned HOST_WIDE_INT mask = 0;
3731 unsigned highest_set = 0;
3732 for (unsigned j = 0; e->values[j].arg; ++j)
3734 unsigned set = e->values[j].flags >> CL_ENUM_SET_SHIFT;
3735 if (cl_options[i].var_value == CLEV_BITSET)
3737 /* For EnumBitSet Set shouldn't be used and Value should
3738 be a power of two. */
3739 ASSERT_TRUE (set == 0);
3740 ASSERT_TRUE (pow2p_hwi (e->values[j].value));
3741 continue;
3743 /* Test that enumerators referenced in EnumSet have all
3744 Set(n) on them within the valid range. */
3745 ASSERT_TRUE (set >= 1 && set <= HOST_BITS_PER_WIDE_INT);
3746 highest_set = MAX (set, highest_set);
3747 used_sets |= HOST_WIDE_INT_1U << (set - 1);
3749 if (cl_options[i].var_value == CLEV_BITSET)
3750 continue;
3751 /* If there is just one set, no point to using EnumSet. */
3752 ASSERT_TRUE (highest_set >= 2);
3753 /* Test that there are no gaps in between the sets. */
3754 if (highest_set == HOST_BITS_PER_WIDE_INT)
3755 ASSERT_TRUE (used_sets == HOST_WIDE_INT_M1U);
3756 else
3757 ASSERT_TRUE (used_sets == (HOST_WIDE_INT_1U << highest_set) - 1);
3758 for (unsigned int j = 1; j <= highest_set; ++j)
3760 unsigned HOST_WIDE_INT this_mask = 0;
3761 for (unsigned k = 0; e->values[k].arg; ++k)
3763 unsigned set = e->values[j].flags >> CL_ENUM_SET_SHIFT;
3764 if (set == j)
3765 this_mask |= e->values[j].value;
3767 ASSERT_TRUE ((mask & this_mask) == 0);
3768 mask |= this_mask;
3773 /* Run all of the selftests within this file. */
3775 void
3776 opts_cc_tests ()
3778 test_get_option_html_page ();
3779 test_enum_sets ();
3782 } // namespace selftest
3784 #endif /* #if CHECKING_P */