[Ada] Add adequate guard before calling First_Rep_Item
[official-gcc.git] / gcc / opts.c
blob1d2d22d7a3fd586de1bed7d4da9da71152d878ee
1 /* Command line option handling.
2 Copyright (C) 2002-2021 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_ftree_builtin_call_dce, NULL, 1 },
573 { OPT_LEVELS_1_PLUS, OPT_ftree_ccp, NULL, 1 },
574 { OPT_LEVELS_1_PLUS, OPT_ftree_ch, NULL, 1 },
575 { OPT_LEVELS_1_PLUS, OPT_ftree_coalesce_vars, NULL, 1 },
576 { OPT_LEVELS_1_PLUS, OPT_ftree_copy_prop, NULL, 1 },
577 { OPT_LEVELS_1_PLUS, OPT_ftree_dce, NULL, 1 },
578 { OPT_LEVELS_1_PLUS, OPT_ftree_dominator_opts, NULL, 1 },
579 { OPT_LEVELS_1_PLUS, OPT_ftree_fre, NULL, 1 },
580 { OPT_LEVELS_1_PLUS, OPT_ftree_sink, NULL, 1 },
581 { OPT_LEVELS_1_PLUS, OPT_ftree_slsr, NULL, 1 },
582 { OPT_LEVELS_1_PLUS, OPT_ftree_ter, NULL, 1 },
584 /* -O1 (and not -Og) optimizations. */
585 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fbranch_count_reg, NULL, 1 },
586 #if DELAY_SLOTS
587 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fdelayed_branch, NULL, 1 },
588 #endif
589 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fdse, NULL, 1 },
590 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fif_conversion, NULL, 1 },
591 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fif_conversion2, NULL, 1 },
592 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_finline_functions_called_once, NULL, 1 },
593 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fmove_loop_invariants, NULL, 1 },
594 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fmove_loop_stores, NULL, 1 },
595 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fssa_phiopt, NULL, 1 },
596 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fipa_modref, NULL, 1 },
597 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_bit_ccp, NULL, 1 },
598 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_dse, NULL, 1 },
599 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_pta, NULL, 1 },
600 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_sra, NULL, 1 },
602 /* -O2 and -Os optimizations. */
603 { OPT_LEVELS_2_PLUS, OPT_fcaller_saves, NULL, 1 },
604 { OPT_LEVELS_2_PLUS, OPT_fcode_hoisting, NULL, 1 },
605 { OPT_LEVELS_2_PLUS, OPT_fcrossjumping, NULL, 1 },
606 { OPT_LEVELS_2_PLUS, OPT_fcse_follow_jumps, NULL, 1 },
607 { OPT_LEVELS_2_PLUS, OPT_fdevirtualize, NULL, 1 },
608 { OPT_LEVELS_2_PLUS, OPT_fdevirtualize_speculatively, NULL, 1 },
609 { OPT_LEVELS_2_PLUS, OPT_fexpensive_optimizations, NULL, 1 },
610 { OPT_LEVELS_2_PLUS, OPT_fgcse, NULL, 1 },
611 { OPT_LEVELS_2_PLUS, OPT_fhoist_adjacent_loads, NULL, 1 },
612 { OPT_LEVELS_2_PLUS, OPT_findirect_inlining, NULL, 1 },
613 { OPT_LEVELS_2_PLUS, OPT_finline_small_functions, NULL, 1 },
614 { OPT_LEVELS_2_PLUS, OPT_fipa_bit_cp, NULL, 1 },
615 { OPT_LEVELS_2_PLUS, OPT_fipa_cp, NULL, 1 },
616 { OPT_LEVELS_2_PLUS, OPT_fipa_icf, NULL, 1 },
617 { OPT_LEVELS_2_PLUS, OPT_fipa_ra, NULL, 1 },
618 { OPT_LEVELS_2_PLUS, OPT_fipa_sra, NULL, 1 },
619 { OPT_LEVELS_2_PLUS, OPT_fipa_vrp, NULL, 1 },
620 { OPT_LEVELS_2_PLUS, OPT_fisolate_erroneous_paths_dereference, NULL, 1 },
621 { OPT_LEVELS_2_PLUS, OPT_flra_remat, NULL, 1 },
622 { OPT_LEVELS_2_PLUS, OPT_foptimize_sibling_calls, NULL, 1 },
623 { OPT_LEVELS_2_PLUS, OPT_fpartial_inlining, NULL, 1 },
624 { OPT_LEVELS_2_PLUS, OPT_fpeephole2, NULL, 1 },
625 { OPT_LEVELS_2_PLUS, OPT_freorder_functions, NULL, 1 },
626 { OPT_LEVELS_2_PLUS, OPT_frerun_cse_after_loop, NULL, 1 },
627 #ifdef INSN_SCHEDULING
628 { OPT_LEVELS_2_PLUS, OPT_fschedule_insns2, NULL, 1 },
629 #endif
630 { OPT_LEVELS_2_PLUS, OPT_fstrict_aliasing, NULL, 1 },
631 { OPT_LEVELS_2_PLUS, OPT_fstore_merging, NULL, 1 },
632 { OPT_LEVELS_2_PLUS, OPT_fthread_jumps, NULL, 1 },
633 { OPT_LEVELS_2_PLUS, OPT_ftree_pre, NULL, 1 },
634 { OPT_LEVELS_2_PLUS, OPT_ftree_switch_conversion, NULL, 1 },
635 { OPT_LEVELS_2_PLUS, OPT_ftree_tail_merge, NULL, 1 },
636 { OPT_LEVELS_2_PLUS, OPT_ftree_vrp, NULL, 1 },
637 { OPT_LEVELS_2_PLUS, OPT_fvect_cost_model_, NULL, VECT_COST_MODEL_CHEAP },
638 { OPT_LEVELS_2_PLUS, OPT_finline_functions, NULL, 1 },
639 { OPT_LEVELS_2_PLUS, OPT_ftree_loop_distribute_patterns, NULL, 1 },
641 /* -O2 and above optimizations, but not -Os or -Og. */
642 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_falign_functions, NULL, 1 },
643 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_falign_jumps, NULL, 1 },
644 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_falign_labels, NULL, 1 },
645 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_falign_loops, NULL, 1 },
646 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_foptimize_strlen, NULL, 1 },
647 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_freorder_blocks_algorithm_, NULL,
648 REORDER_BLOCKS_ALGORITHM_STC },
649 #ifdef INSN_SCHEDULING
650 /* Only run the pre-regalloc scheduling pass if optimizing for speed. */
651 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_fschedule_insns, NULL, 1 },
652 #endif
654 /* -O3 and -Os optimizations. */
656 /* -O3 optimizations. */
657 { OPT_LEVELS_3_PLUS, OPT_fgcse_after_reload, NULL, 1 },
658 { OPT_LEVELS_3_PLUS, OPT_fipa_cp_clone, NULL, 1 },
659 { OPT_LEVELS_3_PLUS, OPT_floop_interchange, NULL, 1 },
660 { OPT_LEVELS_3_PLUS, OPT_floop_unroll_and_jam, NULL, 1 },
661 { OPT_LEVELS_3_PLUS, OPT_fpeel_loops, NULL, 1 },
662 { OPT_LEVELS_3_PLUS, OPT_fpredictive_commoning, NULL, 1 },
663 { OPT_LEVELS_3_PLUS, OPT_fsplit_loops, NULL, 1 },
664 { OPT_LEVELS_3_PLUS, OPT_fsplit_paths, NULL, 1 },
665 { OPT_LEVELS_3_PLUS, OPT_ftree_loop_distribution, NULL, 1 },
666 { OPT_LEVELS_3_PLUS, OPT_ftree_loop_vectorize, NULL, 1 },
667 { OPT_LEVELS_3_PLUS, OPT_ftree_partial_pre, NULL, 1 },
668 { OPT_LEVELS_3_PLUS, OPT_ftree_slp_vectorize, NULL, 1 },
669 { OPT_LEVELS_3_PLUS, OPT_funswitch_loops, NULL, 1 },
670 { OPT_LEVELS_3_PLUS, OPT_fvect_cost_model_, NULL, VECT_COST_MODEL_DYNAMIC },
671 { OPT_LEVELS_3_PLUS, OPT_fversion_loops_for_strides, NULL, 1 },
673 /* -O3 parameters. */
674 { OPT_LEVELS_3_PLUS, OPT__param_max_inline_insns_auto_, NULL, 30 },
675 { OPT_LEVELS_3_PLUS, OPT__param_early_inlining_insns_, NULL, 14 },
676 { OPT_LEVELS_3_PLUS, OPT__param_inline_heuristics_hint_percent_, NULL, 600 },
677 { OPT_LEVELS_3_PLUS, OPT__param_inline_min_speedup_, NULL, 15 },
678 { OPT_LEVELS_3_PLUS, OPT__param_max_inline_insns_single_, NULL, 200 },
680 /* -Ofast adds optimizations to -O3. */
681 { OPT_LEVELS_FAST, OPT_ffast_math, NULL, 1 },
682 { OPT_LEVELS_FAST, OPT_fallow_store_data_races, NULL, 1 },
684 { OPT_LEVELS_NONE, 0, NULL, 0 }
687 /* Default the options in OPTS and OPTS_SET based on the optimization
688 settings in DECODED_OPTIONS and DECODED_OPTIONS_COUNT. */
689 void
690 default_options_optimization (struct gcc_options *opts,
691 struct gcc_options *opts_set,
692 struct cl_decoded_option *decoded_options,
693 unsigned int decoded_options_count,
694 location_t loc,
695 unsigned int lang_mask,
696 const struct cl_option_handlers *handlers,
697 diagnostic_context *dc)
699 unsigned int i;
700 int opt2;
701 bool openacc_mode = false;
703 /* Scan to see what optimization level has been specified. That will
704 determine the default value of many flags. */
705 for (i = 1; i < decoded_options_count; i++)
707 struct cl_decoded_option *opt = &decoded_options[i];
708 switch (opt->opt_index)
710 case OPT_O:
711 if (*opt->arg == '\0')
713 opts->x_optimize = 1;
714 opts->x_optimize_size = 0;
715 opts->x_optimize_fast = 0;
716 opts->x_optimize_debug = 0;
718 else
720 const int optimize_val = integral_argument (opt->arg);
721 if (optimize_val == -1)
722 error_at (loc, "argument to %<-O%> should be a non-negative "
723 "integer, %<g%>, %<s%> or %<fast%>");
724 else
726 opts->x_optimize = optimize_val;
727 if ((unsigned int) opts->x_optimize > 255)
728 opts->x_optimize = 255;
729 opts->x_optimize_size = 0;
730 opts->x_optimize_fast = 0;
731 opts->x_optimize_debug = 0;
734 break;
736 case OPT_Os:
737 opts->x_optimize_size = 1;
739 /* Optimizing for size forces optimize to be 2. */
740 opts->x_optimize = 2;
741 opts->x_optimize_fast = 0;
742 opts->x_optimize_debug = 0;
743 break;
745 case OPT_Ofast:
746 /* -Ofast only adds flags to -O3. */
747 opts->x_optimize_size = 0;
748 opts->x_optimize = 3;
749 opts->x_optimize_fast = 1;
750 opts->x_optimize_debug = 0;
751 break;
753 case OPT_Og:
754 /* -Og selects optimization level 1. */
755 opts->x_optimize_size = 0;
756 opts->x_optimize = 1;
757 opts->x_optimize_fast = 0;
758 opts->x_optimize_debug = 1;
759 break;
761 case OPT_fopenacc:
762 if (opt->value)
763 openacc_mode = true;
764 break;
766 default:
767 /* Ignore other options in this prescan. */
768 break;
772 maybe_default_options (opts, opts_set, default_options_table,
773 opts->x_optimize, opts->x_optimize_size,
774 opts->x_optimize_fast, opts->x_optimize_debug,
775 lang_mask, handlers, loc, dc);
777 /* -O2 param settings. */
778 opt2 = (opts->x_optimize >= 2);
780 if (openacc_mode)
781 SET_OPTION_IF_UNSET (opts, opts_set, flag_ipa_pta, true);
783 /* Track fields in field-sensitive alias analysis. */
784 if (opt2)
785 SET_OPTION_IF_UNSET (opts, opts_set, param_max_fields_for_field_sensitive,
786 100);
788 if (opts->x_optimize_size)
789 /* We want to crossjump as much as possible. */
790 SET_OPTION_IF_UNSET (opts, opts_set, param_min_crossjump_insns, 1);
792 /* Restrict the amount of work combine does at -Og while retaining
793 most of its useful transforms. */
794 if (opts->x_optimize_debug)
795 SET_OPTION_IF_UNSET (opts, opts_set, param_max_combine_insns, 2);
797 /* Allow default optimizations to be specified on a per-machine basis. */
798 maybe_default_options (opts, opts_set,
799 targetm_common.option_optimization_table,
800 opts->x_optimize, opts->x_optimize_size,
801 opts->x_optimize_fast, opts->x_optimize_debug,
802 lang_mask, handlers, loc, dc);
805 /* Control IPA optimizations based on different live patching LEVEL. */
806 static void
807 control_options_for_live_patching (struct gcc_options *opts,
808 struct gcc_options *opts_set,
809 enum live_patching_level level,
810 location_t loc)
812 gcc_assert (level > LIVE_PATCHING_NONE);
814 switch (level)
816 case LIVE_PATCHING_INLINE_ONLY_STATIC:
817 #define LIVE_PATCHING_OPTION "-flive-patching=inline-only-static"
818 if (opts_set->x_flag_ipa_cp_clone && opts->x_flag_ipa_cp_clone)
819 error_at (loc, "%qs is incompatible with %qs",
820 "-fipa-cp-clone", LIVE_PATCHING_OPTION);
821 else
822 opts->x_flag_ipa_cp_clone = 0;
824 if (opts_set->x_flag_ipa_sra && opts->x_flag_ipa_sra)
825 error_at (loc, "%qs is incompatible with %qs",
826 "-fipa-sra", LIVE_PATCHING_OPTION);
827 else
828 opts->x_flag_ipa_sra = 0;
830 if (opts_set->x_flag_partial_inlining && opts->x_flag_partial_inlining)
831 error_at (loc, "%qs is incompatible with %qs",
832 "-fpartial-inlining", LIVE_PATCHING_OPTION);
833 else
834 opts->x_flag_partial_inlining = 0;
836 if (opts_set->x_flag_ipa_cp && opts->x_flag_ipa_cp)
837 error_at (loc, "%qs is incompatible with %qs",
838 "-fipa-cp", LIVE_PATCHING_OPTION);
839 else
840 opts->x_flag_ipa_cp = 0;
842 /* FALLTHROUGH. */
843 case LIVE_PATCHING_INLINE_CLONE:
844 #undef LIVE_PATCHING_OPTION
845 #define LIVE_PATCHING_OPTION "-flive-patching=inline-only-static|inline-clone"
846 /* live patching should disable whole-program optimization. */
847 if (opts_set->x_flag_whole_program && opts->x_flag_whole_program)
848 error_at (loc, "%qs is incompatible with %qs",
849 "-fwhole-program", LIVE_PATCHING_OPTION);
850 else
851 opts->x_flag_whole_program = 0;
853 /* visibility change should be excluded by !flag_whole_program
854 && !in_lto_p && !flag_ipa_cp_clone && !flag_ipa_sra
855 && !flag_partial_inlining. */
857 if (opts_set->x_flag_ipa_pta && opts->x_flag_ipa_pta)
858 error_at (loc, "%qs is incompatible with %qs",
859 "-fipa-pta", LIVE_PATCHING_OPTION);
860 else
861 opts->x_flag_ipa_pta = 0;
863 if (opts_set->x_flag_ipa_reference && opts->x_flag_ipa_reference)
864 error_at (loc, "%qs is incompatible with %qs",
865 "-fipa-reference", LIVE_PATCHING_OPTION);
866 else
867 opts->x_flag_ipa_reference = 0;
869 if (opts_set->x_flag_ipa_ra && opts->x_flag_ipa_ra)
870 error_at (loc, "%qs is incompatible with %qs",
871 "-fipa-ra", LIVE_PATCHING_OPTION);
872 else
873 opts->x_flag_ipa_ra = 0;
875 if (opts_set->x_flag_ipa_icf && opts->x_flag_ipa_icf)
876 error_at (loc, "%qs is incompatible with %qs",
877 "-fipa-icf", LIVE_PATCHING_OPTION);
878 else
879 opts->x_flag_ipa_icf = 0;
881 if (opts_set->x_flag_ipa_icf_functions && opts->x_flag_ipa_icf_functions)
882 error_at (loc, "%qs is incompatible with %qs",
883 "-fipa-icf-functions", LIVE_PATCHING_OPTION);
884 else
885 opts->x_flag_ipa_icf_functions = 0;
887 if (opts_set->x_flag_ipa_icf_variables && opts->x_flag_ipa_icf_variables)
888 error_at (loc, "%qs is incompatible with %qs",
889 "-fipa-icf-variables", LIVE_PATCHING_OPTION);
890 else
891 opts->x_flag_ipa_icf_variables = 0;
893 if (opts_set->x_flag_ipa_bit_cp && opts->x_flag_ipa_bit_cp)
894 error_at (loc, "%qs is incompatible with %qs",
895 "-fipa-bit-cp", LIVE_PATCHING_OPTION);
896 else
897 opts->x_flag_ipa_bit_cp = 0;
899 if (opts_set->x_flag_ipa_vrp && opts->x_flag_ipa_vrp)
900 error_at (loc, "%qs is incompatible with %qs",
901 "-fipa-vrp", LIVE_PATCHING_OPTION);
902 else
903 opts->x_flag_ipa_vrp = 0;
905 if (opts_set->x_flag_ipa_pure_const && opts->x_flag_ipa_pure_const)
906 error_at (loc, "%qs is incompatible with %qs",
907 "-fipa-pure-const", LIVE_PATCHING_OPTION);
908 else
909 opts->x_flag_ipa_pure_const = 0;
911 if (opts_set->x_flag_ipa_modref && opts->x_flag_ipa_modref)
912 error_at (loc,
913 "%<-fipa-modref%> is incompatible with %qs",
914 LIVE_PATCHING_OPTION);
915 else
916 opts->x_flag_ipa_modref = 0;
918 /* FIXME: disable unreachable code removal. */
920 /* discovery of functions/variables with no address taken. */
921 if (opts_set->x_flag_ipa_reference_addressable
922 && opts->x_flag_ipa_reference_addressable)
923 error_at (loc, "%qs is incompatible with %qs",
924 "-fipa-reference-addressable", LIVE_PATCHING_OPTION);
925 else
926 opts->x_flag_ipa_reference_addressable = 0;
928 /* ipa stack alignment propagation. */
929 if (opts_set->x_flag_ipa_stack_alignment
930 && opts->x_flag_ipa_stack_alignment)
931 error_at (loc, "%qs is incompatible with %qs",
932 "-fipa-stack-alignment", LIVE_PATCHING_OPTION);
933 else
934 opts->x_flag_ipa_stack_alignment = 0;
935 break;
936 default:
937 gcc_unreachable ();
940 #undef LIVE_PATCHING_OPTION
943 /* --help option argument if set. */
944 vec<const char *> help_option_arguments;
946 /* Return the string name describing a sanitizer argument which has been
947 provided on the command line and has set this particular flag. */
948 const char *
949 find_sanitizer_argument (struct gcc_options *opts, unsigned int flags)
951 for (int i = 0; sanitizer_opts[i].name != NULL; ++i)
953 /* Need to find the sanitizer_opts element which:
954 a) Could have set the flags requested.
955 b) Has been set on the command line.
957 Can have (a) without (b) if the flag requested is e.g.
958 SANITIZE_ADDRESS, since both -fsanitize=address and
959 -fsanitize=kernel-address set this flag.
961 Can have (b) without (a) by requesting more than one sanitizer on the
962 command line. */
963 if ((sanitizer_opts[i].flag & opts->x_flag_sanitize)
964 != sanitizer_opts[i].flag)
965 continue;
966 if ((sanitizer_opts[i].flag & flags) != flags)
967 continue;
968 return sanitizer_opts[i].name;
970 return NULL;
974 /* Report an error to the user about sanitizer options they have requested
975 which have set conflicting flags.
977 LEFT and RIGHT indicate sanitizer flags which conflict with each other, this
978 function reports an error if both have been set in OPTS->x_flag_sanitize and
979 ensures the error identifies the requested command line options that have
980 set these flags. */
981 static void
982 report_conflicting_sanitizer_options (struct gcc_options *opts, location_t loc,
983 unsigned int left, unsigned int right)
985 unsigned int left_seen = (opts->x_flag_sanitize & left);
986 unsigned int right_seen = (opts->x_flag_sanitize & right);
987 if (left_seen && right_seen)
989 const char* left_arg = find_sanitizer_argument (opts, left_seen);
990 const char* right_arg = find_sanitizer_argument (opts, right_seen);
991 gcc_assert (left_arg && right_arg);
992 error_at (loc,
993 "%<-fsanitize=%s%> is incompatible with %<-fsanitize=%s%>",
994 left_arg, right_arg);
998 /* After all options at LOC have been read into OPTS and OPTS_SET,
999 finalize settings of those options and diagnose incompatible
1000 combinations. */
1001 void
1002 finish_options (struct gcc_options *opts, struct gcc_options *opts_set,
1003 location_t loc)
1005 enum unwind_info_type ui_except;
1007 if (opts->x_dump_base_name
1008 && ! opts->x_dump_base_name_prefixed)
1010 const char *sep = opts->x_dump_base_name;
1012 for (; *sep; sep++)
1013 if (IS_DIR_SEPARATOR (*sep))
1014 break;
1016 if (*sep)
1017 /* If dump_base_path contains subdirectories, don't prepend
1018 anything. */;
1019 else if (opts->x_dump_dir_name)
1020 /* We have a DUMP_DIR_NAME, prepend that. */
1021 opts->x_dump_base_name = opts_concat (opts->x_dump_dir_name,
1022 opts->x_dump_base_name, NULL);
1024 /* It is definitely prefixed now. */
1025 opts->x_dump_base_name_prefixed = true;
1028 /* Handle related options for unit-at-a-time, toplevel-reorder, and
1029 section-anchors. */
1030 if (!opts->x_flag_unit_at_a_time)
1032 if (opts->x_flag_section_anchors && opts_set->x_flag_section_anchors)
1033 error_at (loc, "section anchors must be disabled when unit-at-a-time "
1034 "is disabled");
1035 opts->x_flag_section_anchors = 0;
1036 if (opts->x_flag_toplevel_reorder == 1)
1037 error_at (loc, "toplevel reorder must be disabled when unit-at-a-time "
1038 "is disabled");
1039 opts->x_flag_toplevel_reorder = 0;
1042 /* -fself-test depends on the state of the compiler prior to
1043 compiling anything. Ideally it should be run on an empty source
1044 file. However, in case we get run with actual source, assume
1045 -fsyntax-only which will inhibit any compiler initialization
1046 which may confuse the self tests. */
1047 if (opts->x_flag_self_test)
1048 opts->x_flag_syntax_only = 1;
1050 if (opts->x_flag_tm && opts->x_flag_non_call_exceptions)
1051 sorry ("transactional memory is not supported with non-call exceptions");
1053 /* Unless the user has asked for section anchors, we disable toplevel
1054 reordering at -O0 to disable transformations that might be surprising
1055 to end users and to get -fno-toplevel-reorder tested. */
1056 if (!opts->x_optimize
1057 && opts->x_flag_toplevel_reorder == 2
1058 && !(opts->x_flag_section_anchors && opts_set->x_flag_section_anchors))
1060 opts->x_flag_toplevel_reorder = 0;
1061 opts->x_flag_section_anchors = 0;
1063 if (!opts->x_flag_toplevel_reorder)
1065 if (opts->x_flag_section_anchors && opts_set->x_flag_section_anchors)
1066 error_at (loc, "section anchors must be disabled when toplevel reorder"
1067 " is disabled");
1068 opts->x_flag_section_anchors = 0;
1071 if (!opts->x_flag_opts_finished)
1073 /* We initialize opts->x_flag_pie to -1 so that targets can set a
1074 default value. */
1075 if (opts->x_flag_pie == -1)
1077 /* We initialize opts->x_flag_pic to -1 so that we can tell if
1078 -fpic, -fPIC, -fno-pic or -fno-PIC is used. */
1079 if (opts->x_flag_pic == -1)
1080 opts->x_flag_pie = DEFAULT_FLAG_PIE;
1081 else
1082 opts->x_flag_pie = 0;
1084 /* If -fPIE or -fpie is used, turn on PIC. */
1085 if (opts->x_flag_pie)
1086 opts->x_flag_pic = opts->x_flag_pie;
1087 else if (opts->x_flag_pic == -1)
1088 opts->x_flag_pic = 0;
1089 if (opts->x_flag_pic && !opts->x_flag_pie)
1090 opts->x_flag_shlib = 1;
1091 opts->x_flag_opts_finished = true;
1094 /* We initialize opts->x_flag_stack_protect to -1 so that targets
1095 can set a default value. */
1096 if (opts->x_flag_stack_protect == -1)
1097 opts->x_flag_stack_protect = DEFAULT_FLAG_SSP;
1099 if (opts->x_optimize == 0)
1101 /* Inlining does not work if not optimizing,
1102 so force it not to be done. */
1103 opts->x_warn_inline = 0;
1104 opts->x_flag_no_inline = 1;
1107 /* The optimization to partition hot and cold basic blocks into separate
1108 sections of the .o and executable files does not work (currently)
1109 with exception handling. This is because there is no support for
1110 generating unwind info. If opts->x_flag_exceptions is turned on
1111 we need to turn off the partitioning optimization. */
1113 ui_except = targetm_common.except_unwind_info (opts);
1115 if (opts->x_flag_exceptions
1116 && opts->x_flag_reorder_blocks_and_partition
1117 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))
1119 if (opts_set->x_flag_reorder_blocks_and_partition)
1120 inform (loc,
1121 "%<-freorder-blocks-and-partition%> does not work "
1122 "with exceptions on this architecture");
1123 opts->x_flag_reorder_blocks_and_partition = 0;
1124 opts->x_flag_reorder_blocks = 1;
1127 /* If user requested unwind info, then turn off the partitioning
1128 optimization. */
1130 if (opts->x_flag_unwind_tables
1131 && !targetm_common.unwind_tables_default
1132 && opts->x_flag_reorder_blocks_and_partition
1133 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))
1135 if (opts_set->x_flag_reorder_blocks_and_partition)
1136 inform (loc,
1137 "%<-freorder-blocks-and-partition%> does not support "
1138 "unwind info on this architecture");
1139 opts->x_flag_reorder_blocks_and_partition = 0;
1140 opts->x_flag_reorder_blocks = 1;
1143 /* If the target requested unwind info, then turn off the partitioning
1144 optimization with a different message. Likewise, if the target does not
1145 support named sections. */
1147 if (opts->x_flag_reorder_blocks_and_partition
1148 && (!targetm_common.have_named_sections
1149 || (opts->x_flag_unwind_tables
1150 && targetm_common.unwind_tables_default
1151 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))))
1153 if (opts_set->x_flag_reorder_blocks_and_partition)
1154 inform (loc,
1155 "%<-freorder-blocks-and-partition%> does not work "
1156 "on this architecture");
1157 opts->x_flag_reorder_blocks_and_partition = 0;
1158 opts->x_flag_reorder_blocks = 1;
1162 /* Pipelining of outer loops is only possible when general pipelining
1163 capabilities are requested. */
1164 if (!opts->x_flag_sel_sched_pipelining)
1165 opts->x_flag_sel_sched_pipelining_outer_loops = 0;
1167 if (opts->x_flag_conserve_stack)
1169 SET_OPTION_IF_UNSET (opts, opts_set, param_large_stack_frame, 100);
1170 SET_OPTION_IF_UNSET (opts, opts_set, param_stack_frame_growth, 40);
1173 if (opts->x_flag_lto)
1175 #ifdef ENABLE_LTO
1176 opts->x_flag_generate_lto = 1;
1178 /* When generating IL, do not operate in whole-program mode.
1179 Otherwise, symbols will be privatized too early, causing link
1180 errors later. */
1181 opts->x_flag_whole_program = 0;
1182 #else
1183 error_at (loc, "LTO support has not been enabled in this configuration");
1184 #endif
1185 if (!opts->x_flag_fat_lto_objects
1186 && (!HAVE_LTO_PLUGIN
1187 || (opts_set->x_flag_use_linker_plugin
1188 && !opts->x_flag_use_linker_plugin)))
1190 if (opts_set->x_flag_fat_lto_objects)
1191 error_at (loc, "%<-fno-fat-lto-objects%> are supported only with "
1192 "linker plugin");
1193 opts->x_flag_fat_lto_objects = 1;
1196 /* -gsplit-dwarf isn't compatible with LTO, see PR88389. */
1197 if (opts->x_dwarf_split_debug_info)
1199 inform (loc, "%<-gsplit-dwarf%> is not supported with LTO,"
1200 " disabling");
1201 opts->x_dwarf_split_debug_info = 0;
1205 /* We initialize opts->x_flag_split_stack to -1 so that targets can set a
1206 default value if they choose based on other options. */
1207 if (opts->x_flag_split_stack == -1)
1208 opts->x_flag_split_stack = 0;
1209 else if (opts->x_flag_split_stack)
1211 if (!targetm_common.supports_split_stack (true, opts))
1213 error_at (loc, "%<-fsplit-stack%> is not supported by "
1214 "this compiler configuration");
1215 opts->x_flag_split_stack = 0;
1219 /* If stack splitting is turned on, and the user did not explicitly
1220 request function partitioning, turn off partitioning, as it
1221 confuses the linker when trying to handle partitioned split-stack
1222 code that calls a non-split-stack functions. But if partitioning
1223 was turned on explicitly just hope for the best. */
1224 if (opts->x_flag_split_stack
1225 && opts->x_flag_reorder_blocks_and_partition)
1226 SET_OPTION_IF_UNSET (opts, opts_set, flag_reorder_blocks_and_partition, 0);
1228 if (opts->x_flag_reorder_blocks_and_partition)
1229 SET_OPTION_IF_UNSET (opts, opts_set, flag_reorder_functions, 1);
1231 /* The -gsplit-dwarf option requires -ggnu-pubnames. */
1232 if (opts->x_dwarf_split_debug_info)
1233 opts->x_debug_generate_pub_sections = 2;
1235 if ((opts->x_flag_sanitize
1236 & (SANITIZE_USER_ADDRESS | SANITIZE_KERNEL_ADDRESS)) == 0)
1238 if (opts->x_flag_sanitize & SANITIZE_POINTER_COMPARE)
1239 error_at (loc,
1240 "%<-fsanitize=pointer-compare%> must be combined with "
1241 "%<-fsanitize=address%> or %<-fsanitize=kernel-address%>");
1242 if (opts->x_flag_sanitize & SANITIZE_POINTER_SUBTRACT)
1243 error_at (loc,
1244 "%<-fsanitize=pointer-subtract%> must be combined with "
1245 "%<-fsanitize=address%> or %<-fsanitize=kernel-address%>");
1248 /* Address sanitizers conflict with the thread sanitizer. */
1249 report_conflicting_sanitizer_options (opts, loc, SANITIZE_THREAD,
1250 SANITIZE_ADDRESS | SANITIZE_HWADDRESS);
1251 /* The leak sanitizer conflicts with the thread sanitizer. */
1252 report_conflicting_sanitizer_options (opts, loc, SANITIZE_LEAK,
1253 SANITIZE_THREAD);
1255 /* No combination of HWASAN and ASAN work together. */
1256 report_conflicting_sanitizer_options (opts, loc,
1257 SANITIZE_HWADDRESS, SANITIZE_ADDRESS);
1259 /* The userspace and kernel address sanitizers conflict with each other. */
1260 report_conflicting_sanitizer_options (opts, loc, SANITIZE_USER_HWADDRESS,
1261 SANITIZE_KERNEL_HWADDRESS);
1262 report_conflicting_sanitizer_options (opts, loc, SANITIZE_USER_ADDRESS,
1263 SANITIZE_KERNEL_ADDRESS);
1265 /* Check error recovery for -fsanitize-recover option. */
1266 for (int i = 0; sanitizer_opts[i].name != NULL; ++i)
1267 if ((opts->x_flag_sanitize_recover & sanitizer_opts[i].flag)
1268 && !sanitizer_opts[i].can_recover)
1269 error_at (loc, "%<-fsanitize-recover=%s%> is not supported",
1270 sanitizer_opts[i].name);
1272 /* When instrumenting the pointers, we don't want to remove
1273 the null pointer checks. */
1274 if (opts->x_flag_sanitize & (SANITIZE_NULL | SANITIZE_NONNULL_ATTRIBUTE
1275 | SANITIZE_RETURNS_NONNULL_ATTRIBUTE))
1276 opts->x_flag_delete_null_pointer_checks = 0;
1278 /* Aggressive compiler optimizations may cause false negatives. */
1279 if (opts->x_flag_sanitize & ~(SANITIZE_LEAK | SANITIZE_UNREACHABLE))
1280 opts->x_flag_aggressive_loop_optimizations = 0;
1282 /* Enable -fsanitize-address-use-after-scope if either address sanitizer is
1283 enabled. */
1284 if (opts->x_flag_sanitize
1285 & (SANITIZE_USER_ADDRESS | SANITIZE_USER_HWADDRESS))
1286 SET_OPTION_IF_UNSET (opts, opts_set, flag_sanitize_address_use_after_scope,
1287 true);
1289 /* Force -fstack-reuse=none in case -fsanitize-address-use-after-scope
1290 is enabled. */
1291 if (opts->x_flag_sanitize_address_use_after_scope)
1293 if (opts->x_flag_stack_reuse != SR_NONE
1294 && opts_set->x_flag_stack_reuse != SR_NONE)
1295 error_at (loc,
1296 "%<-fsanitize-address-use-after-scope%> requires "
1297 "%<-fstack-reuse=none%> option");
1299 opts->x_flag_stack_reuse = SR_NONE;
1302 if ((opts->x_flag_sanitize & SANITIZE_USER_ADDRESS) && opts->x_flag_tm)
1303 sorry ("transactional memory is not supported with %<-fsanitize=address%>");
1305 if ((opts->x_flag_sanitize & SANITIZE_KERNEL_ADDRESS) && opts->x_flag_tm)
1306 sorry ("transactional memory is not supported with "
1307 "%<-fsanitize=kernel-address%>");
1309 /* Currently live patching is not support for LTO. */
1310 if (opts->x_flag_live_patching && opts->x_flag_lto)
1311 sorry ("live patching is not supported with LTO");
1313 /* Currently vtable verification is not supported for LTO */
1314 if (opts->x_flag_vtable_verify && opts->x_flag_lto)
1315 sorry ("vtable verification is not supported with LTO");
1317 /* Control IPA optimizations based on different -flive-patching level. */
1318 if (opts->x_flag_live_patching)
1319 control_options_for_live_patching (opts, opts_set,
1320 opts->x_flag_live_patching,
1321 loc);
1323 /* Unrolling all loops implies that standard loop unrolling must also
1324 be done. */
1325 if (opts->x_flag_unroll_all_loops)
1326 opts->x_flag_unroll_loops = 1;
1328 /* Allow cunroll to grow size accordingly. */
1329 if (!opts_set->x_flag_cunroll_grow_size)
1330 opts->x_flag_cunroll_grow_size
1331 = (opts->x_flag_unroll_loops
1332 || opts->x_flag_peel_loops
1333 || opts->x_optimize >= 3);
1336 #define LEFT_COLUMN 27
1338 /* Output ITEM, of length ITEM_WIDTH, in the left column,
1339 followed by word-wrapped HELP in a second column. */
1340 static void
1341 wrap_help (const char *help,
1342 const char *item,
1343 unsigned int item_width,
1344 unsigned int columns)
1346 unsigned int col_width = LEFT_COLUMN;
1347 unsigned int remaining, room, len;
1349 remaining = strlen (help);
1353 room = columns - 3 - MAX (col_width, item_width);
1354 if (room > columns)
1355 room = 0;
1356 len = remaining;
1358 if (room < len)
1360 unsigned int i;
1362 for (i = 0; help[i]; i++)
1364 if (i >= room && len != remaining)
1365 break;
1366 if (help[i] == ' ')
1367 len = i;
1368 else if ((help[i] == '-' || help[i] == '/')
1369 && help[i + 1] != ' '
1370 && i > 0 && ISALPHA (help[i - 1]))
1371 len = i + 1;
1375 printf (" %-*.*s %.*s\n", col_width, item_width, item, len, help);
1376 item_width = 0;
1377 while (help[len] == ' ')
1378 len++;
1379 help += len;
1380 remaining -= len;
1382 while (remaining);
1385 /* Data structure used to print list of valid option values. */
1387 class option_help_tuple
1389 public:
1390 option_help_tuple (int code, vec<const char *> values):
1391 m_code (code), m_values (values)
1394 /* Code of an option. */
1395 int m_code;
1397 /* List of possible values. */
1398 vec<const char *> m_values;
1401 /* Print help for a specific front-end, etc. */
1402 static void
1403 print_filtered_help (unsigned int include_flags,
1404 unsigned int exclude_flags,
1405 unsigned int any_flags,
1406 unsigned int columns,
1407 struct gcc_options *opts,
1408 unsigned int lang_mask)
1410 unsigned int i;
1411 const char *help;
1412 bool found = false;
1413 bool displayed = false;
1414 char new_help[256];
1416 if (!opts->x_help_printed)
1417 opts->x_help_printed = XCNEWVAR (char, cl_options_count);
1419 if (!opts->x_help_enum_printed)
1420 opts->x_help_enum_printed = XCNEWVAR (char, cl_enums_count);
1422 auto_vec<option_help_tuple> help_tuples;
1424 for (i = 0; i < cl_options_count; i++)
1426 const struct cl_option *option = cl_options + i;
1427 unsigned int len;
1428 const char *opt;
1429 const char *tab;
1431 if (include_flags == 0
1432 || ((option->flags & include_flags) != include_flags))
1434 if ((option->flags & any_flags) == 0)
1435 continue;
1438 /* Skip unwanted switches. */
1439 if ((option->flags & exclude_flags) != 0)
1440 continue;
1442 /* The driver currently prints its own help text. */
1443 if ((option->flags & CL_DRIVER) != 0
1444 && (option->flags & (((1U << cl_lang_count) - 1)
1445 | CL_COMMON | CL_TARGET)) == 0)
1446 continue;
1448 /* If an option contains a language specification,
1449 exclude it from common unless all languages are present. */
1450 if ((include_flags & CL_COMMON)
1451 && !(option->flags & CL_DRIVER)
1452 && (option->flags & CL_LANG_ALL)
1453 && (option->flags & CL_LANG_ALL) != CL_LANG_ALL)
1454 continue;
1456 found = true;
1457 /* Skip switches that have already been printed. */
1458 if (opts->x_help_printed[i])
1459 continue;
1461 opts->x_help_printed[i] = true;
1463 help = option->help;
1464 if (help == NULL)
1466 if (exclude_flags & CL_UNDOCUMENTED)
1467 continue;
1469 help = undocumented_msg;
1472 /* Get the translation. */
1473 help = _(help);
1475 if (option->alias_target < N_OPTS
1476 && cl_options [option->alias_target].help)
1478 const struct cl_option *target = cl_options + option->alias_target;
1479 if (option->help == NULL)
1481 /* The option is undocumented but is an alias for an option that
1482 is documented. If the option has alias arguments, then its
1483 purpose is to provide certain arguments to the other option, so
1484 inform the reader of this. Otherwise, point the reader to the
1485 other option in preference to the former. */
1487 if (option->alias_arg)
1489 if (option->neg_alias_arg)
1490 snprintf (new_help, sizeof new_help,
1491 _("Same as %s%s (or, in negated form, %s%s)."),
1492 target->opt_text, option->alias_arg,
1493 target->opt_text, option->neg_alias_arg);
1494 else
1495 snprintf (new_help, sizeof new_help,
1496 _("Same as %s%s."),
1497 target->opt_text, option->alias_arg);
1499 else
1500 snprintf (new_help, sizeof new_help,
1501 _("Same as %s."),
1502 target->opt_text);
1504 else
1506 /* For documented options with aliases, mention the aliased
1507 option's name for reference. */
1508 snprintf (new_help, sizeof new_help,
1509 _("%s Same as %s."),
1510 help, cl_options [option->alias_target].opt_text);
1513 help = new_help;
1516 if (option->warn_message)
1518 /* Mention that the use of the option will trigger a warning. */
1519 if (help == new_help)
1520 snprintf (new_help + strlen (new_help),
1521 sizeof new_help - strlen (new_help),
1522 " %s", _(use_diagnosed_msg));
1523 else
1524 snprintf (new_help, sizeof new_help,
1525 "%s %s", help, _(use_diagnosed_msg));
1527 help = new_help;
1530 /* Find the gap between the name of the
1531 option and its descriptive text. */
1532 tab = strchr (help, '\t');
1533 if (tab)
1535 len = tab - help;
1536 opt = help;
1537 help = tab + 1;
1539 else
1541 opt = option->opt_text;
1542 len = strlen (opt);
1545 /* With the -Q option enabled we change the descriptive text associated
1546 with an option to be an indication of its current setting. */
1547 if (!opts->x_quiet_flag)
1549 void *flag_var = option_flag_var (i, opts);
1551 if (len < (LEFT_COLUMN + 2))
1552 strcpy (new_help, "\t\t");
1553 else
1554 strcpy (new_help, "\t");
1556 /* Set to print whether the option is enabled or disabled,
1557 or, if it's an alias for another option, the name of
1558 the aliased option. */
1559 bool print_state = false;
1561 if (flag_var != NULL
1562 && option->var_type != CLVC_DEFER)
1564 /* If OPTION is only available for a specific subset
1565 of languages other than this one, mention them. */
1566 bool avail_for_lang = true;
1567 if (unsigned langset = option->flags & CL_LANG_ALL)
1569 if (!(langset & lang_mask))
1571 avail_for_lang = false;
1572 strcat (new_help, _("[available in "));
1573 for (unsigned i = 0, n = 0; (1U << i) < CL_LANG_ALL; ++i)
1574 if (langset & (1U << i))
1576 if (n++)
1577 strcat (new_help, ", ");
1578 strcat (new_help, lang_names[i]);
1580 strcat (new_help, "]");
1583 if (!avail_for_lang)
1584 ; /* Print nothing else if the option is not available
1585 in the current language. */
1586 else if (option->flags & CL_JOINED)
1588 if (option->var_type == CLVC_STRING)
1590 if (* (const char **) flag_var != NULL)
1591 snprintf (new_help + strlen (new_help),
1592 sizeof (new_help) - strlen (new_help),
1593 "%s", * (const char **) flag_var);
1595 else if (option->var_type == CLVC_ENUM)
1597 const struct cl_enum *e = &cl_enums[option->var_enum];
1598 int value;
1599 const char *arg = NULL;
1601 value = e->get (flag_var);
1602 enum_value_to_arg (e->values, &arg, value, lang_mask);
1603 if (arg == NULL)
1604 arg = _("[default]");
1605 snprintf (new_help + strlen (new_help),
1606 sizeof (new_help) - strlen (new_help),
1607 "%s", arg);
1609 else
1611 if (option->cl_host_wide_int)
1612 sprintf (new_help + strlen (new_help),
1613 _("%llu bytes"), (unsigned long long)
1614 *(unsigned HOST_WIDE_INT *) flag_var);
1615 else
1616 sprintf (new_help + strlen (new_help),
1617 "%i", * (int *) flag_var);
1620 else
1621 print_state = true;
1623 else
1624 /* When there is no argument, print the option state only
1625 if the option takes no argument. */
1626 print_state = !(option->flags & CL_JOINED);
1628 if (print_state)
1630 if (option->alias_target < N_OPTS
1631 && option->alias_target != OPT_SPECIAL_warn_removed
1632 && option->alias_target != OPT_SPECIAL_ignore
1633 && option->alias_target != OPT_SPECIAL_input_file
1634 && option->alias_target != OPT_SPECIAL_program_name
1635 && option->alias_target != OPT_SPECIAL_unknown)
1637 const struct cl_option *target
1638 = &cl_options[option->alias_target];
1639 sprintf (new_help + strlen (new_help), "%s%s",
1640 target->opt_text,
1641 option->alias_arg ? option->alias_arg : "");
1643 else if (option->alias_target == OPT_SPECIAL_ignore)
1644 strcat (new_help, ("[ignored]"));
1645 else
1647 /* Print the state for an on/off option. */
1648 int ena = option_enabled (i, lang_mask, opts);
1649 if (ena > 0)
1650 strcat (new_help, _("[enabled]"));
1651 else if (ena == 0)
1652 strcat (new_help, _("[disabled]"));
1656 help = new_help;
1659 if (option->range_max != -1)
1661 char b[128];
1662 snprintf (b, sizeof (b), "<%d,%d>", option->range_min,
1663 option->range_max);
1664 opt = concat (opt, b, NULL);
1665 len += strlen (b);
1668 wrap_help (help, opt, len, columns);
1669 displayed = true;
1671 if (option->var_type == CLVC_ENUM
1672 && opts->x_help_enum_printed[option->var_enum] != 2)
1673 opts->x_help_enum_printed[option->var_enum] = 1;
1674 else
1676 vec<const char *> option_values
1677 = targetm_common.get_valid_option_values (i, NULL);
1678 if (!option_values.is_empty ())
1679 help_tuples.safe_push (option_help_tuple (i, option_values));
1683 if (! found)
1685 unsigned int langs = include_flags & CL_LANG_ALL;
1687 if (langs == 0)
1688 printf (_(" No options with the desired characteristics were found\n"));
1689 else
1691 unsigned int i;
1693 /* PR 31349: Tell the user how to see all of the
1694 options supported by a specific front end. */
1695 for (i = 0; (1U << i) < CL_LANG_ALL; i ++)
1696 if ((1U << i) & langs)
1697 printf (_(" None found. Use --help=%s to show *all* the options supported by the %s front-end.\n"),
1698 lang_names[i], lang_names[i]);
1702 else if (! displayed)
1703 printf (_(" All options with the desired characteristics have already been displayed\n"));
1705 putchar ('\n');
1707 /* Print details of enumerated option arguments, if those
1708 enumerations have help text headings provided. If no help text
1709 is provided, presume that the possible values are listed in the
1710 help text for the relevant options. */
1711 for (i = 0; i < cl_enums_count; i++)
1713 unsigned int j, pos;
1715 if (opts->x_help_enum_printed[i] != 1)
1716 continue;
1717 if (cl_enums[i].help == NULL)
1718 continue;
1719 printf (" %s\n ", _(cl_enums[i].help));
1720 pos = 4;
1721 for (j = 0; cl_enums[i].values[j].arg != NULL; j++)
1723 unsigned int len = strlen (cl_enums[i].values[j].arg);
1725 if (pos > 4 && pos + 1 + len <= columns)
1727 printf (" %s", cl_enums[i].values[j].arg);
1728 pos += 1 + len;
1730 else
1732 if (pos > 4)
1734 printf ("\n ");
1735 pos = 4;
1737 printf ("%s", cl_enums[i].values[j].arg);
1738 pos += len;
1741 printf ("\n\n");
1742 opts->x_help_enum_printed[i] = 2;
1745 for (unsigned i = 0; i < help_tuples.length (); i++)
1747 const struct cl_option *option = cl_options + help_tuples[i].m_code;
1748 printf (_(" Known valid arguments for %s option:\n "),
1749 option->opt_text);
1750 for (unsigned j = 0; j < help_tuples[i].m_values.length (); j++)
1751 printf (" %s", help_tuples[i].m_values[j]);
1752 printf ("\n\n");
1756 /* Display help for a specified type of option.
1757 The options must have ALL of the INCLUDE_FLAGS set
1758 ANY of the flags in the ANY_FLAGS set
1759 and NONE of the EXCLUDE_FLAGS set. The current option state is in
1760 OPTS; LANG_MASK is used for interpreting enumerated option state. */
1761 static void
1762 print_specific_help (unsigned int include_flags,
1763 unsigned int exclude_flags,
1764 unsigned int any_flags,
1765 struct gcc_options *opts,
1766 unsigned int lang_mask)
1768 unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1769 const char * description = NULL;
1770 const char * descrip_extra = "";
1771 size_t i;
1772 unsigned int flag;
1774 /* Sanity check: Make sure that we do not have more
1775 languages than we have bits available to enumerate them. */
1776 gcc_assert ((1U << cl_lang_count) <= CL_MIN_OPTION_CLASS);
1778 /* If we have not done so already, obtain
1779 the desired maximum width of the output. */
1780 if (opts->x_help_columns == 0)
1782 opts->x_help_columns = get_terminal_width ();
1783 if (opts->x_help_columns == INT_MAX)
1784 /* Use a reasonable default. */
1785 opts->x_help_columns = 80;
1788 /* Decide upon the title for the options that we are going to display. */
1789 for (i = 0, flag = 1; flag <= CL_MAX_OPTION_CLASS; flag <<= 1, i ++)
1791 switch (flag & include_flags)
1793 case 0:
1794 case CL_DRIVER:
1795 break;
1797 case CL_TARGET:
1798 description = _("The following options are target specific");
1799 break;
1800 case CL_WARNING:
1801 description = _("The following options control compiler warning messages");
1802 break;
1803 case CL_OPTIMIZATION:
1804 description = _("The following options control optimizations");
1805 break;
1806 case CL_COMMON:
1807 description = _("The following options are language-independent");
1808 break;
1809 case CL_PARAMS:
1810 description = _("The following options control parameters");
1811 break;
1812 default:
1813 if (i >= cl_lang_count)
1814 break;
1815 if (exclude_flags & all_langs_mask)
1816 description = _("The following options are specific to just the language ");
1817 else
1818 description = _("The following options are supported by the language ");
1819 descrip_extra = lang_names [i];
1820 break;
1824 if (description == NULL)
1826 if (any_flags == 0)
1828 if (include_flags & CL_UNDOCUMENTED)
1829 description = _("The following options are not documented");
1830 else if (include_flags & CL_SEPARATE)
1831 description = _("The following options take separate arguments");
1832 else if (include_flags & CL_JOINED)
1833 description = _("The following options take joined arguments");
1834 else
1836 internal_error ("unrecognized %<include_flags 0x%x%> passed "
1837 "to %<print_specific_help%>",
1838 include_flags);
1839 return;
1842 else
1844 if (any_flags & all_langs_mask)
1845 description = _("The following options are language-related");
1846 else
1847 description = _("The following options are language-independent");
1851 printf ("%s%s:\n", description, descrip_extra);
1852 print_filtered_help (include_flags, exclude_flags, any_flags,
1853 opts->x_help_columns, opts, lang_mask);
1856 /* Enable FDO-related flags. */
1858 static void
1859 enable_fdo_optimizations (struct gcc_options *opts,
1860 struct gcc_options *opts_set,
1861 int value)
1863 SET_OPTION_IF_UNSET (opts, opts_set, flag_branch_probabilities, value);
1864 SET_OPTION_IF_UNSET (opts, opts_set, flag_profile_values, value);
1865 SET_OPTION_IF_UNSET (opts, opts_set, flag_unroll_loops, value);
1866 SET_OPTION_IF_UNSET (opts, opts_set, flag_peel_loops, value);
1867 SET_OPTION_IF_UNSET (opts, opts_set, flag_tracer, value);
1868 SET_OPTION_IF_UNSET (opts, opts_set, flag_value_profile_transformations,
1869 value);
1870 SET_OPTION_IF_UNSET (opts, opts_set, flag_inline_functions, value);
1871 SET_OPTION_IF_UNSET (opts, opts_set, flag_ipa_cp, value);
1872 if (value)
1874 SET_OPTION_IF_UNSET (opts, opts_set, flag_ipa_cp_clone, 1);
1875 SET_OPTION_IF_UNSET (opts, opts_set, flag_ipa_bit_cp, 1);
1877 SET_OPTION_IF_UNSET (opts, opts_set, flag_predictive_commoning, value);
1878 SET_OPTION_IF_UNSET (opts, opts_set, flag_split_loops, value);
1879 SET_OPTION_IF_UNSET (opts, opts_set, flag_unswitch_loops, value);
1880 SET_OPTION_IF_UNSET (opts, opts_set, flag_gcse_after_reload, value);
1881 SET_OPTION_IF_UNSET (opts, opts_set, flag_tree_loop_vectorize, value);
1882 SET_OPTION_IF_UNSET (opts, opts_set, flag_tree_slp_vectorize, value);
1883 SET_OPTION_IF_UNSET (opts, opts_set, flag_version_loops_for_strides, value);
1884 SET_OPTION_IF_UNSET (opts, opts_set, flag_vect_cost_model,
1885 VECT_COST_MODEL_DYNAMIC);
1886 SET_OPTION_IF_UNSET (opts, opts_set, flag_tree_loop_distribute_patterns,
1887 value);
1888 SET_OPTION_IF_UNSET (opts, opts_set, flag_loop_interchange, value);
1889 SET_OPTION_IF_UNSET (opts, opts_set, flag_unroll_jam, value);
1890 SET_OPTION_IF_UNSET (opts, opts_set, flag_tree_loop_distribution, value);
1893 /* -f{,no-}sanitize{,-recover}= suboptions. */
1894 const struct sanitizer_opts_s sanitizer_opts[] =
1896 #define SANITIZER_OPT(name, flags, recover) \
1897 { #name, flags, sizeof #name - 1, recover }
1898 SANITIZER_OPT (address, (SANITIZE_ADDRESS | SANITIZE_USER_ADDRESS), true),
1899 SANITIZER_OPT (hwaddress, (SANITIZE_HWADDRESS | SANITIZE_USER_HWADDRESS),
1900 true),
1901 SANITIZER_OPT (kernel-address, (SANITIZE_ADDRESS | SANITIZE_KERNEL_ADDRESS),
1902 true),
1903 SANITIZER_OPT (kernel-hwaddress,
1904 (SANITIZE_HWADDRESS | SANITIZE_KERNEL_HWADDRESS),
1905 true),
1906 SANITIZER_OPT (pointer-compare, SANITIZE_POINTER_COMPARE, true),
1907 SANITIZER_OPT (pointer-subtract, SANITIZE_POINTER_SUBTRACT, true),
1908 SANITIZER_OPT (thread, SANITIZE_THREAD, false),
1909 SANITIZER_OPT (leak, SANITIZE_LEAK, false),
1910 SANITIZER_OPT (shift, SANITIZE_SHIFT, true),
1911 SANITIZER_OPT (shift-base, SANITIZE_SHIFT_BASE, true),
1912 SANITIZER_OPT (shift-exponent, SANITIZE_SHIFT_EXPONENT, true),
1913 SANITIZER_OPT (integer-divide-by-zero, SANITIZE_DIVIDE, true),
1914 SANITIZER_OPT (undefined, SANITIZE_UNDEFINED, true),
1915 SANITIZER_OPT (unreachable, SANITIZE_UNREACHABLE, false),
1916 SANITIZER_OPT (vla-bound, SANITIZE_VLA, true),
1917 SANITIZER_OPT (return, SANITIZE_RETURN, false),
1918 SANITIZER_OPT (null, SANITIZE_NULL, true),
1919 SANITIZER_OPT (signed-integer-overflow, SANITIZE_SI_OVERFLOW, true),
1920 SANITIZER_OPT (bool, SANITIZE_BOOL, true),
1921 SANITIZER_OPT (enum, SANITIZE_ENUM, true),
1922 SANITIZER_OPT (float-divide-by-zero, SANITIZE_FLOAT_DIVIDE, true),
1923 SANITIZER_OPT (float-cast-overflow, SANITIZE_FLOAT_CAST, true),
1924 SANITIZER_OPT (bounds, SANITIZE_BOUNDS, true),
1925 SANITIZER_OPT (bounds-strict, SANITIZE_BOUNDS | SANITIZE_BOUNDS_STRICT, true),
1926 SANITIZER_OPT (alignment, SANITIZE_ALIGNMENT, true),
1927 SANITIZER_OPT (nonnull-attribute, SANITIZE_NONNULL_ATTRIBUTE, true),
1928 SANITIZER_OPT (returns-nonnull-attribute, SANITIZE_RETURNS_NONNULL_ATTRIBUTE,
1929 true),
1930 SANITIZER_OPT (object-size, SANITIZE_OBJECT_SIZE, true),
1931 SANITIZER_OPT (vptr, SANITIZE_VPTR, true),
1932 SANITIZER_OPT (pointer-overflow, SANITIZE_POINTER_OVERFLOW, true),
1933 SANITIZER_OPT (builtin, SANITIZE_BUILTIN, true),
1934 SANITIZER_OPT (all, ~0U, true),
1935 #undef SANITIZER_OPT
1936 { NULL, 0U, 0UL, false }
1939 /* -fzero-call-used-regs= suboptions. */
1940 const struct zero_call_used_regs_opts_s zero_call_used_regs_opts[] =
1942 #define ZERO_CALL_USED_REGS_OPT(name, flags) \
1943 { #name, flags }
1944 ZERO_CALL_USED_REGS_OPT (skip, zero_regs_flags::SKIP),
1945 ZERO_CALL_USED_REGS_OPT (used-gpr-arg, zero_regs_flags::USED_GPR_ARG),
1946 ZERO_CALL_USED_REGS_OPT (used-gpr, zero_regs_flags::USED_GPR),
1947 ZERO_CALL_USED_REGS_OPT (used-arg, zero_regs_flags::USED_ARG),
1948 ZERO_CALL_USED_REGS_OPT (used, zero_regs_flags::USED),
1949 ZERO_CALL_USED_REGS_OPT (all-gpr-arg, zero_regs_flags::ALL_GPR_ARG),
1950 ZERO_CALL_USED_REGS_OPT (all-gpr, zero_regs_flags::ALL_GPR),
1951 ZERO_CALL_USED_REGS_OPT (all-arg, zero_regs_flags::ALL_ARG),
1952 ZERO_CALL_USED_REGS_OPT (all, zero_regs_flags::ALL),
1953 #undef ZERO_CALL_USED_REGS_OPT
1954 {NULL, 0U}
1957 /* A struct for describing a run of chars within a string. */
1959 class string_fragment
1961 public:
1962 string_fragment (const char *start, size_t len)
1963 : m_start (start), m_len (len) {}
1965 const char *m_start;
1966 size_t m_len;
1969 /* Specialization of edit_distance_traits for string_fragment,
1970 for use by get_closest_sanitizer_option. */
1972 template <>
1973 struct edit_distance_traits<const string_fragment &>
1975 static size_t get_length (const string_fragment &fragment)
1977 return fragment.m_len;
1980 static const char *get_string (const string_fragment &fragment)
1982 return fragment.m_start;
1986 /* Given ARG, an unrecognized sanitizer option, return the best
1987 matching sanitizer option, or NULL if there isn't one.
1988 OPTS is array of candidate sanitizer options.
1989 CODE is OPT_fsanitize_ or OPT_fsanitize_recover_.
1990 VALUE is non-zero for the regular form of the option, zero
1991 for the "no-" form (e.g. "-fno-sanitize-recover="). */
1993 static const char *
1994 get_closest_sanitizer_option (const string_fragment &arg,
1995 const struct sanitizer_opts_s *opts,
1996 enum opt_code code, int value)
1998 best_match <const string_fragment &, const char*> bm (arg);
1999 for (int i = 0; opts[i].name != NULL; ++i)
2001 /* -fsanitize=all is not valid, so don't offer it. */
2002 if (code == OPT_fsanitize_
2003 && opts[i].flag == ~0U
2004 && value)
2005 continue;
2007 /* For -fsanitize-recover= (and not -fno-sanitize-recover=),
2008 don't offer the non-recoverable options. */
2009 if (code == OPT_fsanitize_recover_
2010 && !opts[i].can_recover
2011 && value)
2012 continue;
2014 bm.consider (opts[i].name);
2016 return bm.get_best_meaningful_candidate ();
2019 /* Parse comma separated sanitizer suboptions from P for option SCODE,
2020 adjust previous FLAGS and return new ones. If COMPLAIN is false,
2021 don't issue diagnostics. */
2023 unsigned int
2024 parse_sanitizer_options (const char *p, location_t loc, int scode,
2025 unsigned int flags, int value, bool complain)
2027 enum opt_code code = (enum opt_code) scode;
2029 while (*p != 0)
2031 size_t len, i;
2032 bool found = false;
2033 const char *comma = strchr (p, ',');
2035 if (comma == NULL)
2036 len = strlen (p);
2037 else
2038 len = comma - p;
2039 if (len == 0)
2041 p = comma + 1;
2042 continue;
2045 /* Check to see if the string matches an option class name. */
2046 for (i = 0; sanitizer_opts[i].name != NULL; ++i)
2047 if (len == sanitizer_opts[i].len
2048 && memcmp (p, sanitizer_opts[i].name, len) == 0)
2050 /* Handle both -fsanitize and -fno-sanitize cases. */
2051 if (value && sanitizer_opts[i].flag == ~0U)
2053 if (code == OPT_fsanitize_)
2055 if (complain)
2056 error_at (loc, "%<-fsanitize=all%> option is not valid");
2058 else
2059 flags |= ~(SANITIZE_THREAD | SANITIZE_LEAK
2060 | SANITIZE_UNREACHABLE | SANITIZE_RETURN);
2062 else if (value)
2064 /* Do not enable -fsanitize-recover=unreachable and
2065 -fsanitize-recover=return if -fsanitize-recover=undefined
2066 is selected. */
2067 if (code == OPT_fsanitize_recover_
2068 && sanitizer_opts[i].flag == SANITIZE_UNDEFINED)
2069 flags |= (SANITIZE_UNDEFINED
2070 & ~(SANITIZE_UNREACHABLE | SANITIZE_RETURN));
2071 else
2072 flags |= sanitizer_opts[i].flag;
2074 else
2075 flags &= ~sanitizer_opts[i].flag;
2076 found = true;
2077 break;
2080 if (! found && complain)
2082 const char *hint
2083 = get_closest_sanitizer_option (string_fragment (p, len),
2084 sanitizer_opts, code, value);
2086 const char *suffix;
2087 if (code == OPT_fsanitize_recover_)
2088 suffix = "-recover";
2089 else
2090 suffix = "";
2092 if (hint)
2093 error_at (loc,
2094 "unrecognized argument to %<-f%ssanitize%s=%> "
2095 "option: %q.*s; did you mean %qs?",
2096 value ? "" : "no-",
2097 suffix, (int) len, p, hint);
2098 else
2099 error_at (loc,
2100 "unrecognized argument to %<-f%ssanitize%s=%> option: "
2101 "%q.*s", value ? "" : "no-",
2102 suffix, (int) len, p);
2105 if (comma == NULL)
2106 break;
2107 p = comma + 1;
2109 return flags;
2112 /* Parse string values of no_sanitize attribute passed in VALUE.
2113 Values are separated with comma. */
2115 unsigned int
2116 parse_no_sanitize_attribute (char *value)
2118 unsigned int flags = 0;
2119 unsigned int i;
2120 char *q = strtok (value, ",");
2122 while (q != NULL)
2124 for (i = 0; sanitizer_opts[i].name != NULL; ++i)
2125 if (strcmp (sanitizer_opts[i].name, q) == 0)
2127 flags |= sanitizer_opts[i].flag;
2128 if (sanitizer_opts[i].flag == SANITIZE_UNDEFINED)
2129 flags |= SANITIZE_UNDEFINED_NONDEFAULT;
2130 break;
2133 if (sanitizer_opts[i].name == NULL)
2134 warning (OPT_Wattributes,
2135 "%qs attribute directive ignored", q);
2137 q = strtok (NULL, ",");
2140 return flags;
2143 /* Parse -fzero-call-used-regs suboptions from ARG, return the FLAGS. */
2145 unsigned int
2146 parse_zero_call_used_regs_options (const char *arg)
2148 unsigned int flags = 0;
2150 /* Check to see if the string matches a sub-option name. */
2151 for (unsigned int i = 0; zero_call_used_regs_opts[i].name != NULL; ++i)
2152 if (strcmp (arg, zero_call_used_regs_opts[i].name) == 0)
2154 flags = zero_call_used_regs_opts[i].flag;
2155 break;
2158 if (!flags)
2159 error ("unrecognized argument to %<-fzero-call-used-regs=%>: %qs", arg);
2161 return flags;
2164 /* Parse -falign-NAME format for a FLAG value. Return individual
2165 parsed integer values into RESULT_VALUES array. If REPORT_ERROR is
2166 set, print error message at LOC location. */
2168 bool
2169 parse_and_check_align_values (const char *flag,
2170 const char *name,
2171 auto_vec<unsigned> &result_values,
2172 bool report_error,
2173 location_t loc)
2175 char *str = xstrdup (flag);
2176 for (char *p = strtok (str, ":"); p; p = strtok (NULL, ":"))
2178 char *end;
2179 int v = strtol (p, &end, 10);
2180 if (*end != '\0' || v < 0)
2182 if (report_error)
2183 error_at (loc, "invalid arguments for %<-falign-%s%> option: %qs",
2184 name, flag);
2186 return false;
2189 result_values.safe_push ((unsigned)v);
2192 free (str);
2194 /* Check that we have a correct number of values. */
2195 if (result_values.is_empty () || result_values.length () > 4)
2197 if (report_error)
2198 error_at (loc, "invalid number of arguments for %<-falign-%s%> "
2199 "option: %qs", name, flag);
2200 return false;
2203 for (unsigned i = 0; i < result_values.length (); i++)
2204 if (result_values[i] > MAX_CODE_ALIGN_VALUE)
2206 if (report_error)
2207 error_at (loc, "%<-falign-%s%> is not between 0 and %d",
2208 name, MAX_CODE_ALIGN_VALUE);
2209 return false;
2212 return true;
2215 /* Check that alignment value FLAG for -falign-NAME is valid at a given
2216 location LOC. OPT_STR points to the stored -falign-NAME=argument and
2217 OPT_FLAG points to the associated -falign-NAME on/off flag. */
2219 static void
2220 check_alignment_argument (location_t loc, const char *flag, const char *name,
2221 int *opt_flag, const char **opt_str)
2223 auto_vec<unsigned> align_result;
2224 parse_and_check_align_values (flag, name, align_result, true, loc);
2226 if (align_result.length() >= 1 && align_result[0] == 0)
2228 *opt_flag = 1;
2229 *opt_str = NULL;
2233 /* Parse argument of -fpatchable-function-entry option ARG and store
2234 corresponding values to PATCH_AREA_SIZE and PATCH_AREA_START.
2235 If REPORT_ERROR is set to true, generate error for a problematic
2236 option arguments. */
2238 void
2239 parse_and_check_patch_area (const char *arg, bool report_error,
2240 HOST_WIDE_INT *patch_area_size,
2241 HOST_WIDE_INT *patch_area_start)
2243 *patch_area_size = 0;
2244 *patch_area_start = 0;
2246 if (arg == NULL)
2247 return;
2249 char *patch_area_arg = xstrdup (arg);
2250 char *comma = strchr (patch_area_arg, ',');
2251 if (comma)
2253 *comma = '\0';
2254 *patch_area_size = integral_argument (patch_area_arg);
2255 *patch_area_start = integral_argument (comma + 1);
2257 else
2258 *patch_area_size = integral_argument (patch_area_arg);
2260 if (*patch_area_size < 0
2261 || *patch_area_size > USHRT_MAX
2262 || *patch_area_start < 0
2263 || *patch_area_start > USHRT_MAX
2264 || *patch_area_size < *patch_area_start)
2265 if (report_error)
2266 error ("invalid arguments for %<-fpatchable-function-entry%>");
2268 free (patch_area_arg);
2271 /* Print help when OPT__help_ is set. */
2273 void
2274 print_help (struct gcc_options *opts, unsigned int lang_mask,
2275 const char *help_option_argument)
2277 const char *a = help_option_argument;
2278 unsigned int include_flags = 0;
2279 /* Note - by default we include undocumented options when listing
2280 specific classes. If you only want to see documented options
2281 then add ",^undocumented" to the --help= option. E.g.:
2283 --help=target,^undocumented */
2284 unsigned int exclude_flags = 0;
2286 if (lang_mask == CL_DRIVER)
2287 return;
2289 /* Walk along the argument string, parsing each word in turn.
2290 The format is:
2291 arg = [^]{word}[,{arg}]
2292 word = {optimizers|target|warnings|undocumented|
2293 params|common|<language>} */
2294 while (*a != 0)
2296 static const struct
2298 const char *string;
2299 unsigned int flag;
2301 specifics[] =
2303 { "optimizers", CL_OPTIMIZATION },
2304 { "target", CL_TARGET },
2305 { "warnings", CL_WARNING },
2306 { "undocumented", CL_UNDOCUMENTED },
2307 { "params", CL_PARAMS },
2308 { "joined", CL_JOINED },
2309 { "separate", CL_SEPARATE },
2310 { "common", CL_COMMON },
2311 { NULL, 0 }
2313 unsigned int *pflags;
2314 const char *comma;
2315 unsigned int lang_flag, specific_flag;
2316 unsigned int len;
2317 unsigned int i;
2319 if (*a == '^')
2321 ++a;
2322 if (*a == '\0')
2324 error ("missing argument to %qs", "--help=^");
2325 break;
2327 pflags = &exclude_flags;
2329 else
2330 pflags = &include_flags;
2332 comma = strchr (a, ',');
2333 if (comma == NULL)
2334 len = strlen (a);
2335 else
2336 len = comma - a;
2337 if (len == 0)
2339 a = comma + 1;
2340 continue;
2343 /* Check to see if the string matches an option class name. */
2344 for (i = 0, specific_flag = 0; specifics[i].string != NULL; i++)
2345 if (strncasecmp (a, specifics[i].string, len) == 0)
2347 specific_flag = specifics[i].flag;
2348 break;
2351 /* Check to see if the string matches a language name.
2352 Note - we rely upon the alpha-sorted nature of the entries in
2353 the lang_names array, specifically that shorter names appear
2354 before their longer variants. (i.e. C before C++). That way
2355 when we are attempting to match --help=c for example we will
2356 match with C first and not C++. */
2357 for (i = 0, lang_flag = 0; i < cl_lang_count; i++)
2358 if (strncasecmp (a, lang_names[i], len) == 0)
2360 lang_flag = 1U << i;
2361 break;
2364 if (specific_flag != 0)
2366 if (lang_flag == 0)
2367 *pflags |= specific_flag;
2368 else
2370 /* The option's argument matches both the start of a
2371 language name and the start of an option class name.
2372 We have a special case for when the user has
2373 specified "--help=c", but otherwise we have to issue
2374 a warning. */
2375 if (strncasecmp (a, "c", len) == 0)
2376 *pflags |= lang_flag;
2377 else
2378 warning (0,
2379 "%<--help%> argument %q.*s is ambiguous, "
2380 "please be more specific",
2381 len, a);
2384 else if (lang_flag != 0)
2385 *pflags |= lang_flag;
2386 else
2387 warning (0,
2388 "unrecognized argument to %<--help=%> option: %q.*s",
2389 len, a);
2391 if (comma == NULL)
2392 break;
2393 a = comma + 1;
2396 /* We started using PerFunction/Optimization for parameters and
2397 a warning. We should exclude these from optimization options. */
2398 if (include_flags & CL_OPTIMIZATION)
2399 exclude_flags |= CL_WARNING;
2400 if (!(include_flags & CL_PARAMS))
2401 exclude_flags |= CL_PARAMS;
2403 if (include_flags)
2404 print_specific_help (include_flags, exclude_flags, 0, opts,
2405 lang_mask);
2408 /* Handle target- and language-independent options. Return zero to
2409 generate an "unknown option" message. Only options that need
2410 extra handling need to be listed here; if you simply want
2411 DECODED->value assigned to a variable, it happens automatically. */
2413 bool
2414 common_handle_option (struct gcc_options *opts,
2415 struct gcc_options *opts_set,
2416 const struct cl_decoded_option *decoded,
2417 unsigned int lang_mask, int kind ATTRIBUTE_UNUSED,
2418 location_t loc,
2419 const struct cl_option_handlers *handlers,
2420 diagnostic_context *dc,
2421 void (*target_option_override_hook) (void))
2423 size_t scode = decoded->opt_index;
2424 const char *arg = decoded->arg;
2425 HOST_WIDE_INT value = decoded->value;
2426 enum opt_code code = (enum opt_code) scode;
2428 gcc_assert (decoded->canonical_option_num_elements <= 2);
2430 switch (code)
2432 case OPT__help:
2434 unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
2435 unsigned int undoc_mask;
2436 unsigned int i;
2438 if (lang_mask == CL_DRIVER)
2439 break;
2441 undoc_mask = ((opts->x_verbose_flag | opts->x_extra_warnings)
2443 : CL_UNDOCUMENTED);
2444 target_option_override_hook ();
2445 /* First display any single language specific options. */
2446 for (i = 0; i < cl_lang_count; i++)
2447 print_specific_help
2448 (1U << i, (all_langs_mask & (~ (1U << i))) | undoc_mask, 0, opts,
2449 lang_mask);
2450 /* Next display any multi language specific options. */
2451 print_specific_help (0, undoc_mask, all_langs_mask, opts, lang_mask);
2452 /* Then display any remaining, non-language options. */
2453 for (i = CL_MIN_OPTION_CLASS; i <= CL_MAX_OPTION_CLASS; i <<= 1)
2454 if (i != CL_DRIVER)
2455 print_specific_help (i, undoc_mask, 0, opts, lang_mask);
2456 opts->x_exit_after_options = true;
2457 break;
2460 case OPT__target_help:
2461 if (lang_mask == CL_DRIVER)
2462 break;
2464 target_option_override_hook ();
2465 print_specific_help (CL_TARGET, CL_UNDOCUMENTED, 0, opts, lang_mask);
2466 opts->x_exit_after_options = true;
2467 break;
2469 case OPT__help_:
2471 help_option_arguments.safe_push (arg);
2472 opts->x_exit_after_options = true;
2473 break;
2476 case OPT__version:
2477 if (lang_mask == CL_DRIVER)
2478 break;
2480 opts->x_exit_after_options = true;
2481 break;
2483 case OPT__completion_:
2484 break;
2486 case OPT_fsanitize_:
2487 opts->x_flag_sanitize
2488 = parse_sanitizer_options (arg, loc, code,
2489 opts->x_flag_sanitize, value, true);
2491 /* Kernel ASan implies normal ASan but does not yet support
2492 all features. */
2493 if (opts->x_flag_sanitize & SANITIZE_KERNEL_ADDRESS)
2495 SET_OPTION_IF_UNSET (opts, opts_set,
2496 param_asan_instrumentation_with_call_threshold,
2498 SET_OPTION_IF_UNSET (opts, opts_set, param_asan_globals, 0);
2499 SET_OPTION_IF_UNSET (opts, opts_set, param_asan_stack, 0);
2500 SET_OPTION_IF_UNSET (opts, opts_set, param_asan_protect_allocas, 0);
2501 SET_OPTION_IF_UNSET (opts, opts_set, param_asan_use_after_return, 0);
2503 if (opts->x_flag_sanitize & SANITIZE_KERNEL_HWADDRESS)
2505 SET_OPTION_IF_UNSET (opts, opts_set,
2506 param_hwasan_instrument_stack, 0);
2507 SET_OPTION_IF_UNSET (opts, opts_set,
2508 param_hwasan_random_frame_tag, 0);
2509 SET_OPTION_IF_UNSET (opts, opts_set,
2510 param_hwasan_instrument_allocas, 0);
2512 break;
2514 case OPT_fsanitize_recover_:
2515 opts->x_flag_sanitize_recover
2516 = parse_sanitizer_options (arg, loc, code,
2517 opts->x_flag_sanitize_recover, value, true);
2518 break;
2520 case OPT_fasan_shadow_offset_:
2521 /* Deferred. */
2522 break;
2524 case OPT_fsanitize_address_use_after_scope:
2525 opts->x_flag_sanitize_address_use_after_scope = value;
2526 break;
2528 case OPT_fsanitize_recover:
2529 if (value)
2530 opts->x_flag_sanitize_recover
2531 |= (SANITIZE_UNDEFINED | SANITIZE_UNDEFINED_NONDEFAULT)
2532 & ~(SANITIZE_UNREACHABLE | SANITIZE_RETURN);
2533 else
2534 opts->x_flag_sanitize_recover
2535 &= ~(SANITIZE_UNDEFINED | SANITIZE_UNDEFINED_NONDEFAULT);
2536 break;
2538 case OPT_fsanitize_coverage_:
2539 opts->x_flag_sanitize_coverage = value;
2540 break;
2542 case OPT_O:
2543 case OPT_Os:
2544 case OPT_Ofast:
2545 case OPT_Og:
2546 /* Currently handled in a prescan. */
2547 break;
2549 case OPT_Werror:
2550 dc->warning_as_error_requested = value;
2551 break;
2553 case OPT_Werror_:
2554 if (lang_mask == CL_DRIVER)
2555 break;
2557 enable_warning_as_error (arg, value, lang_mask, handlers,
2558 opts, opts_set, loc, dc);
2559 break;
2561 case OPT_Wfatal_errors:
2562 dc->fatal_errors = value;
2563 break;
2565 case OPT_Wstack_usage_:
2566 opts->x_flag_stack_usage_info = value != -1;
2567 break;
2569 case OPT_Wstrict_aliasing:
2570 set_Wstrict_aliasing (opts, value);
2571 break;
2573 case OPT_Wstrict_overflow:
2574 opts->x_warn_strict_overflow = (value
2575 ? (int) WARN_STRICT_OVERFLOW_CONDITIONAL
2576 : 0);
2577 break;
2579 case OPT_Wsystem_headers:
2580 dc->dc_warn_system_headers = value;
2581 break;
2583 case OPT_aux_info:
2584 opts->x_flag_gen_aux_info = 1;
2585 break;
2587 case OPT_d:
2588 decode_d_option (arg, opts, loc, dc);
2589 break;
2591 case OPT_fcall_used_:
2592 case OPT_fcall_saved_:
2593 /* Deferred. */
2594 break;
2596 case OPT_fdbg_cnt_:
2597 /* Deferred. */
2598 break;
2600 case OPT_fdebug_prefix_map_:
2601 case OPT_ffile_prefix_map_:
2602 /* Deferred. */
2603 break;
2605 case OPT_fcallgraph_info:
2606 opts->x_flag_callgraph_info = CALLGRAPH_INFO_NAKED;
2607 break;
2609 case OPT_fcallgraph_info_:
2611 char *my_arg, *p;
2612 my_arg = xstrdup (arg);
2613 p = strtok (my_arg, ",");
2614 while (p)
2616 if (strcmp (p, "su") == 0)
2618 opts->x_flag_callgraph_info |= CALLGRAPH_INFO_STACK_USAGE;
2619 opts->x_flag_stack_usage_info = true;
2621 else if (strcmp (p, "da") == 0)
2622 opts->x_flag_callgraph_info |= CALLGRAPH_INFO_DYNAMIC_ALLOC;
2623 else
2624 return 0;
2625 p = strtok (NULL, ",");
2627 free (my_arg);
2629 break;
2631 case OPT_fdiagnostics_show_location_:
2632 diagnostic_prefixing_rule (dc) = (diagnostic_prefixing_rule_t) value;
2633 break;
2635 case OPT_fdiagnostics_show_caret:
2636 dc->show_caret = value;
2637 break;
2639 case OPT_fdiagnostics_show_labels:
2640 dc->show_labels_p = value;
2641 break;
2643 case OPT_fdiagnostics_show_line_numbers:
2644 dc->show_line_numbers_p = value;
2645 break;
2647 case OPT_fdiagnostics_color_:
2648 diagnostic_color_init (dc, value);
2649 break;
2651 case OPT_fdiagnostics_urls_:
2652 diagnostic_urls_init (dc, value);
2653 break;
2655 case OPT_fdiagnostics_format_:
2656 diagnostic_output_format_init (dc,
2657 (enum diagnostics_output_format)value);
2658 break;
2660 case OPT_fdiagnostics_parseable_fixits:
2661 dc->extra_output_kind = (value
2662 ? EXTRA_DIAGNOSTIC_OUTPUT_fixits_v1
2663 : EXTRA_DIAGNOSTIC_OUTPUT_none);
2664 break;
2666 case OPT_fdiagnostics_column_unit_:
2667 dc->column_unit = (enum diagnostics_column_unit)value;
2668 break;
2670 case OPT_fdiagnostics_column_origin_:
2671 dc->column_origin = value;
2672 break;
2674 case OPT_fdiagnostics_show_cwe:
2675 dc->show_cwe = value;
2676 break;
2678 case OPT_fdiagnostics_path_format_:
2679 dc->path_format = (enum diagnostic_path_format)value;
2680 break;
2682 case OPT_fdiagnostics_show_path_depths:
2683 dc->show_path_depths = value;
2684 break;
2686 case OPT_fdiagnostics_show_option:
2687 dc->show_option_requested = value;
2688 break;
2690 case OPT_fdiagnostics_minimum_margin_width_:
2691 dc->min_margin_width = value;
2692 break;
2694 case OPT_fdump_:
2695 /* Deferred. */
2696 break;
2698 case OPT_ffast_math:
2699 set_fast_math_flags (opts, value);
2700 break;
2702 case OPT_funsafe_math_optimizations:
2703 set_unsafe_math_optimizations_flags (opts, value);
2704 break;
2706 case OPT_ffixed_:
2707 /* Deferred. */
2708 break;
2710 case OPT_finline_limit_:
2711 SET_OPTION_IF_UNSET (opts, opts_set, param_max_inline_insns_single,
2712 value / 2);
2713 SET_OPTION_IF_UNSET (opts, opts_set, param_max_inline_insns_auto,
2714 value / 2);
2715 break;
2717 case OPT_finstrument_functions_exclude_function_list_:
2718 add_comma_separated_to_vector
2719 (&opts->x_flag_instrument_functions_exclude_functions, arg);
2720 break;
2722 case OPT_finstrument_functions_exclude_file_list_:
2723 add_comma_separated_to_vector
2724 (&opts->x_flag_instrument_functions_exclude_files, arg);
2725 break;
2727 case OPT_fmessage_length_:
2728 pp_set_line_maximum_length (dc->printer, value);
2729 diagnostic_set_caret_max_width (dc, value);
2730 break;
2732 case OPT_fopt_info:
2733 case OPT_fopt_info_:
2734 /* Deferred. */
2735 break;
2737 case OPT_foffload_options_:
2738 /* Deferred. */
2739 break;
2741 case OPT_foffload_abi_:
2742 #ifdef ACCEL_COMPILER
2743 /* Handled in the 'mkoffload's. */
2744 #else
2745 error_at (loc, "%<-foffload-abi%> option can be specified only for "
2746 "offload compiler");
2747 #endif
2748 break;
2750 case OPT_fpack_struct_:
2751 if (value <= 0 || (value & (value - 1)) || value > 16)
2752 error_at (loc,
2753 "structure alignment must be a small power of two, not %wu",
2754 value);
2755 else
2756 opts->x_initial_max_fld_align = value;
2757 break;
2759 case OPT_fplugin_:
2760 case OPT_fplugin_arg_:
2761 /* Deferred. */
2762 break;
2764 case OPT_fprofile_use_:
2765 opts->x_profile_data_prefix = xstrdup (arg);
2766 opts->x_flag_profile_use = true;
2767 value = true;
2768 /* No break here - do -fprofile-use processing. */
2769 /* FALLTHRU */
2770 case OPT_fprofile_use:
2771 enable_fdo_optimizations (opts, opts_set, value);
2772 SET_OPTION_IF_UNSET (opts, opts_set, flag_profile_reorder_functions,
2773 value);
2774 /* Indirect call profiling should do all useful transformations
2775 speculative devirtualization does. */
2776 if (opts->x_flag_value_profile_transformations)
2777 SET_OPTION_IF_UNSET (opts, opts_set, flag_devirtualize_speculatively,
2778 false);
2779 break;
2781 case OPT_fauto_profile_:
2782 opts->x_auto_profile_file = xstrdup (arg);
2783 opts->x_flag_auto_profile = true;
2784 value = true;
2785 /* No break here - do -fauto-profile processing. */
2786 /* FALLTHRU */
2787 case OPT_fauto_profile:
2788 enable_fdo_optimizations (opts, opts_set, value);
2789 SET_OPTION_IF_UNSET (opts, opts_set, flag_profile_correction, value);
2790 SET_OPTION_IF_UNSET (opts, opts_set,
2791 param_early_inliner_max_iterations, 10);
2792 break;
2794 case OPT_fprofile_generate_:
2795 opts->x_profile_data_prefix = xstrdup (arg);
2796 value = true;
2797 /* No break here - do -fprofile-generate processing. */
2798 /* FALLTHRU */
2799 case OPT_fprofile_generate:
2800 SET_OPTION_IF_UNSET (opts, opts_set, profile_arc_flag, value);
2801 SET_OPTION_IF_UNSET (opts, opts_set, flag_profile_values, value);
2802 SET_OPTION_IF_UNSET (opts, opts_set, flag_inline_functions, value);
2803 SET_OPTION_IF_UNSET (opts, opts_set, flag_ipa_bit_cp, value);
2804 break;
2806 case OPT_fprofile_info_section:
2807 opts->x_profile_info_section = ".gcov_info";
2808 break;
2810 case OPT_fpatchable_function_entry_:
2812 HOST_WIDE_INT patch_area_size, patch_area_start;
2813 parse_and_check_patch_area (arg, true, &patch_area_size,
2814 &patch_area_start);
2816 break;
2818 case OPT_ftree_vectorize:
2819 /* Automatically sets -ftree-loop-vectorize and
2820 -ftree-slp-vectorize. Nothing more to do here. */
2821 break;
2822 case OPT_fzero_call_used_regs_:
2823 opts->x_flag_zero_call_used_regs
2824 = parse_zero_call_used_regs_options (arg);
2825 break;
2827 case OPT_fshow_column:
2828 dc->show_column = value;
2829 break;
2831 case OPT_frandom_seed:
2832 /* The real switch is -fno-random-seed. */
2833 if (value)
2834 return false;
2835 /* Deferred. */
2836 break;
2838 case OPT_frandom_seed_:
2839 /* Deferred. */
2840 break;
2842 case OPT_fsched_verbose_:
2843 #ifdef INSN_SCHEDULING
2844 /* Handled with Var in common.opt. */
2845 break;
2846 #else
2847 return false;
2848 #endif
2850 case OPT_fsched_stalled_insns_:
2851 opts->x_flag_sched_stalled_insns = value;
2852 if (opts->x_flag_sched_stalled_insns == 0)
2853 opts->x_flag_sched_stalled_insns = -1;
2854 break;
2856 case OPT_fsched_stalled_insns_dep_:
2857 opts->x_flag_sched_stalled_insns_dep = value;
2858 break;
2860 case OPT_fstack_check_:
2861 if (!strcmp (arg, "no"))
2862 opts->x_flag_stack_check = NO_STACK_CHECK;
2863 else if (!strcmp (arg, "generic"))
2864 /* This is the old stack checking method. */
2865 opts->x_flag_stack_check = STACK_CHECK_BUILTIN
2866 ? FULL_BUILTIN_STACK_CHECK
2867 : GENERIC_STACK_CHECK;
2868 else if (!strcmp (arg, "specific"))
2869 /* This is the new stack checking method. */
2870 opts->x_flag_stack_check = STACK_CHECK_BUILTIN
2871 ? FULL_BUILTIN_STACK_CHECK
2872 : STACK_CHECK_STATIC_BUILTIN
2873 ? STATIC_BUILTIN_STACK_CHECK
2874 : GENERIC_STACK_CHECK;
2875 else
2876 warning_at (loc, 0, "unknown stack check parameter %qs", arg);
2877 break;
2879 case OPT_fstack_limit:
2880 /* The real switch is -fno-stack-limit. */
2881 if (value)
2882 return false;
2883 /* Deferred. */
2884 break;
2886 case OPT_fstack_limit_register_:
2887 case OPT_fstack_limit_symbol_:
2888 /* Deferred. */
2889 break;
2891 case OPT_fstack_usage:
2892 opts->x_flag_stack_usage = value;
2893 opts->x_flag_stack_usage_info = value != 0;
2894 break;
2896 case OPT_g:
2897 set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, arg, opts, opts_set,
2898 loc);
2899 break;
2901 case OPT_gbtf:
2902 set_debug_level (BTF_DEBUG, false, arg, opts, opts_set, loc);
2903 /* set the debug level to level 2, but if already at level 3,
2904 don't lower it. */
2905 if (opts->x_debug_info_level < DINFO_LEVEL_NORMAL)
2906 opts->x_debug_info_level = DINFO_LEVEL_NORMAL;
2907 break;
2909 case OPT_gctf:
2910 set_debug_level (CTF_DEBUG, false, arg, opts, opts_set, loc);
2911 /* CTF generation feeds off DWARF dies. For optimal CTF, switch debug
2912 info level to 2. If off or at level 1, set it to level 2, but if
2913 already at level 3, don't lower it. */
2914 if (opts->x_debug_info_level < DINFO_LEVEL_NORMAL
2915 && opts->x_ctf_debug_info_level > CTFINFO_LEVEL_NONE)
2916 opts->x_debug_info_level = DINFO_LEVEL_NORMAL;
2917 break;
2919 case OPT_gdwarf:
2920 if (arg && strlen (arg) != 0)
2922 error_at (loc, "%<-gdwarf%s%> is ambiguous; "
2923 "use %<-gdwarf-%s%> for DWARF version "
2924 "or %<-gdwarf%> %<-g%s%> for debug level", arg, arg, arg);
2925 break;
2927 else
2928 value = opts->x_dwarf_version;
2930 /* FALLTHRU */
2931 case OPT_gdwarf_:
2932 if (value < 2 || value > 5)
2933 error_at (loc, "dwarf version %wu is not supported", value);
2934 else
2935 opts->x_dwarf_version = value;
2936 set_debug_level (DWARF2_DEBUG, false, "", opts, opts_set, loc);
2937 break;
2939 case OPT_ggdb:
2940 set_debug_level (NO_DEBUG, 2, arg, opts, opts_set, loc);
2941 break;
2943 case OPT_gstabs:
2944 case OPT_gstabs_:
2945 set_debug_level (DBX_DEBUG, code == OPT_gstabs_, arg, opts, opts_set,
2946 loc);
2947 break;
2949 case OPT_gvms:
2950 set_debug_level (VMS_DEBUG, false, arg, opts, opts_set, loc);
2951 break;
2953 case OPT_gxcoff:
2954 case OPT_gxcoff_:
2955 set_debug_level (XCOFF_DEBUG, code == OPT_gxcoff_, arg, opts, opts_set,
2956 loc);
2957 break;
2959 case OPT_gz:
2960 case OPT_gz_:
2961 /* Handled completely via specs. */
2962 break;
2964 case OPT_pedantic_errors:
2965 dc->pedantic_errors = 1;
2966 control_warning_option (OPT_Wpedantic, DK_ERROR, NULL, value,
2967 loc, lang_mask,
2968 handlers, opts, opts_set,
2969 dc);
2970 break;
2972 case OPT_flto:
2973 opts->x_flag_lto = value ? "" : NULL;
2974 break;
2976 case OPT_flto_:
2977 if (strcmp (arg, "none") != 0
2978 && strcmp (arg, "jobserver") != 0
2979 && strcmp (arg, "auto") != 0
2980 && atoi (arg) == 0)
2981 error_at (loc,
2982 "unrecognized argument to %<-flto=%> option: %qs", arg);
2983 break;
2985 case OPT_w:
2986 dc->dc_inhibit_warnings = true;
2987 break;
2989 case OPT_fmax_errors_:
2990 dc->max_errors = value;
2991 break;
2993 case OPT_fuse_ld_bfd:
2994 case OPT_fuse_ld_gold:
2995 case OPT_fuse_ld_lld:
2996 case OPT_fuse_linker_plugin:
2997 /* No-op. Used by the driver and passed to us because it starts with f.*/
2998 break;
3000 case OPT_fwrapv:
3001 if (value)
3002 opts->x_flag_trapv = 0;
3003 break;
3005 case OPT_ftrapv:
3006 if (value)
3007 opts->x_flag_wrapv = 0;
3008 break;
3010 case OPT_fstrict_overflow:
3011 opts->x_flag_wrapv = !value;
3012 opts->x_flag_wrapv_pointer = !value;
3013 if (!value)
3014 opts->x_flag_trapv = 0;
3015 break;
3017 case OPT_fipa_icf:
3018 opts->x_flag_ipa_icf_functions = value;
3019 opts->x_flag_ipa_icf_variables = value;
3020 break;
3022 case OPT_falign_loops_:
3023 check_alignment_argument (loc, arg, "loops",
3024 &opts->x_flag_align_loops,
3025 &opts->x_str_align_loops);
3026 break;
3028 case OPT_falign_jumps_:
3029 check_alignment_argument (loc, arg, "jumps",
3030 &opts->x_flag_align_jumps,
3031 &opts->x_str_align_jumps);
3032 break;
3034 case OPT_falign_labels_:
3035 check_alignment_argument (loc, arg, "labels",
3036 &opts->x_flag_align_labels,
3037 &opts->x_str_align_labels);
3038 break;
3040 case OPT_falign_functions_:
3041 check_alignment_argument (loc, arg, "functions",
3042 &opts->x_flag_align_functions,
3043 &opts->x_str_align_functions);
3044 break;
3046 case OPT_ftabstop_:
3047 /* It is documented that we silently ignore silly values. */
3048 if (value >= 1 && value <= 100)
3049 dc->tabstop = value;
3050 break;
3052 default:
3053 /* If the flag was handled in a standard way, assume the lack of
3054 processing here is intentional. */
3055 gcc_assert (option_flag_var (scode, opts));
3056 break;
3059 common_handle_option_auto (opts, opts_set, decoded, lang_mask, kind,
3060 loc, handlers, dc);
3061 return true;
3064 /* Used to set the level of strict aliasing warnings in OPTS,
3065 when no level is specified (i.e., when -Wstrict-aliasing, and not
3066 -Wstrict-aliasing=level was given).
3067 ONOFF is assumed to take value 1 when -Wstrict-aliasing is specified,
3068 and 0 otherwise. After calling this function, wstrict_aliasing will be
3069 set to the default value of -Wstrict_aliasing=level, currently 3. */
3070 static void
3071 set_Wstrict_aliasing (struct gcc_options *opts, int onoff)
3073 gcc_assert (onoff == 0 || onoff == 1);
3074 if (onoff != 0)
3075 opts->x_warn_strict_aliasing = 3;
3076 else
3077 opts->x_warn_strict_aliasing = 0;
3080 /* The following routines are useful in setting all the flags that
3081 -ffast-math and -fno-fast-math imply. */
3082 static void
3083 set_fast_math_flags (struct gcc_options *opts, int set)
3085 if (!opts->frontend_set_flag_unsafe_math_optimizations)
3087 opts->x_flag_unsafe_math_optimizations = set;
3088 set_unsafe_math_optimizations_flags (opts, set);
3090 if (!opts->frontend_set_flag_finite_math_only)
3091 opts->x_flag_finite_math_only = set;
3092 if (!opts->frontend_set_flag_errno_math)
3093 opts->x_flag_errno_math = !set;
3094 if (set)
3096 if (opts->frontend_set_flag_excess_precision == EXCESS_PRECISION_DEFAULT)
3097 opts->x_flag_excess_precision
3098 = set ? EXCESS_PRECISION_FAST : EXCESS_PRECISION_DEFAULT;
3099 if (!opts->frontend_set_flag_signaling_nans)
3100 opts->x_flag_signaling_nans = 0;
3101 if (!opts->frontend_set_flag_rounding_math)
3102 opts->x_flag_rounding_math = 0;
3103 if (!opts->frontend_set_flag_cx_limited_range)
3104 opts->x_flag_cx_limited_range = 1;
3108 /* When -funsafe-math-optimizations is set the following
3109 flags are set as well. */
3110 static void
3111 set_unsafe_math_optimizations_flags (struct gcc_options *opts, int set)
3113 if (!opts->frontend_set_flag_trapping_math)
3114 opts->x_flag_trapping_math = !set;
3115 if (!opts->frontend_set_flag_signed_zeros)
3116 opts->x_flag_signed_zeros = !set;
3117 if (!opts->frontend_set_flag_associative_math)
3118 opts->x_flag_associative_math = set;
3119 if (!opts->frontend_set_flag_reciprocal_math)
3120 opts->x_flag_reciprocal_math = set;
3123 /* Return true iff flags in OPTS are set as if -ffast-math. */
3124 bool
3125 fast_math_flags_set_p (const struct gcc_options *opts)
3127 return (!opts->x_flag_trapping_math
3128 && opts->x_flag_unsafe_math_optimizations
3129 && opts->x_flag_finite_math_only
3130 && !opts->x_flag_signed_zeros
3131 && !opts->x_flag_errno_math
3132 && opts->x_flag_excess_precision == EXCESS_PRECISION_FAST);
3135 /* Return true iff flags are set as if -ffast-math but using the flags stored
3136 in the struct cl_optimization structure. */
3137 bool
3138 fast_math_flags_struct_set_p (struct cl_optimization *opt)
3140 return (!opt->x_flag_trapping_math
3141 && opt->x_flag_unsafe_math_optimizations
3142 && opt->x_flag_finite_math_only
3143 && !opt->x_flag_signed_zeros
3144 && !opt->x_flag_errno_math);
3147 /* Handle a debug output -g switch for options OPTS
3148 (OPTS_SET->x_write_symbols storing whether a debug format was passed
3149 explicitly), location LOC. EXTENDED is true or false to support
3150 extended output (2 is special and means "-ggdb" was given). */
3151 static void
3152 set_debug_level (uint32_t dinfo, int extended, const char *arg,
3153 struct gcc_options *opts, struct gcc_options *opts_set,
3154 location_t loc)
3156 opts->x_use_gnu_debug_info_extensions = extended;
3158 if (dinfo == NO_DEBUG)
3160 if (opts->x_write_symbols == NO_DEBUG)
3162 opts->x_write_symbols = PREFERRED_DEBUGGING_TYPE;
3164 if (extended == 2)
3166 #if defined DWARF2_DEBUGGING_INFO || defined DWARF2_LINENO_DEBUGGING_INFO
3167 if (opts->x_write_symbols & CTF_DEBUG)
3168 opts->x_write_symbols |= DWARF2_DEBUG;
3169 else
3170 opts->x_write_symbols = DWARF2_DEBUG;
3171 #elif defined DBX_DEBUGGING_INFO
3172 opts->x_write_symbols = DBX_DEBUG;
3173 #endif
3176 if (opts->x_write_symbols == NO_DEBUG)
3177 warning_at (loc, 0, "target system does not support debug output");
3179 else if ((opts->x_write_symbols & CTF_DEBUG)
3180 || (opts->x_write_symbols & BTF_DEBUG))
3182 opts->x_write_symbols |= DWARF2_DEBUG;
3183 opts_set->x_write_symbols |= DWARF2_DEBUG;
3186 else
3188 /* Make and retain the choice if both CTF and DWARF debug info are to
3189 be generated. */
3190 if (((dinfo == DWARF2_DEBUG) || (dinfo == CTF_DEBUG))
3191 && ((opts->x_write_symbols == (DWARF2_DEBUG|CTF_DEBUG))
3192 || (opts->x_write_symbols == DWARF2_DEBUG)
3193 || (opts->x_write_symbols == CTF_DEBUG)))
3195 opts->x_write_symbols |= dinfo;
3196 opts_set->x_write_symbols |= dinfo;
3198 /* However, CTF and BTF are not allowed together at this time. */
3199 else if (((dinfo == DWARF2_DEBUG) || (dinfo == BTF_DEBUG))
3200 && ((opts->x_write_symbols == (DWARF2_DEBUG|BTF_DEBUG))
3201 || (opts->x_write_symbols == DWARF2_DEBUG)
3202 || (opts->x_write_symbols == BTF_DEBUG)))
3204 opts->x_write_symbols |= dinfo;
3205 opts_set->x_write_symbols |= dinfo;
3207 else
3209 /* Does it conflict with an already selected debug format? */
3210 if (opts_set->x_write_symbols != NO_DEBUG
3211 && opts->x_write_symbols != NO_DEBUG
3212 && dinfo != opts->x_write_symbols)
3214 gcc_assert (debug_set_count (dinfo) <= 1);
3215 error_at (loc, "debug format %qs conflicts with prior selection",
3216 debug_type_names[debug_set_to_format (dinfo)]);
3218 opts->x_write_symbols = dinfo;
3219 opts_set->x_write_symbols = dinfo;
3223 if (dinfo != BTF_DEBUG)
3225 /* A debug flag without a level defaults to level 2.
3226 If off or at level 1, set it to level 2, but if already
3227 at level 3, don't lower it. */
3228 if (*arg == '\0')
3230 if (dinfo == CTF_DEBUG)
3231 opts->x_ctf_debug_info_level = CTFINFO_LEVEL_NORMAL;
3232 else if (opts->x_debug_info_level < DINFO_LEVEL_NORMAL)
3233 opts->x_debug_info_level = DINFO_LEVEL_NORMAL;
3235 else
3237 int argval = integral_argument (arg);
3238 if (argval == -1)
3239 error_at (loc, "unrecognized debug output level %qs", arg);
3240 else if (argval > 3)
3241 error_at (loc, "debug output level %qs is too high", arg);
3242 else
3244 if (dinfo == CTF_DEBUG)
3245 opts->x_ctf_debug_info_level
3246 = (enum ctf_debug_info_levels) argval;
3247 else
3248 opts->x_debug_info_level = (enum debug_info_levels) argval;
3252 else if (*arg != '\0')
3253 error_at (loc, "unrecognized btf debug output level %qs", arg);
3256 /* Arrange to dump core on error for diagnostic context DC. (The
3257 regular error message is still printed first, except in the case of
3258 abort ().) */
3260 static void
3261 setup_core_dumping (diagnostic_context *dc)
3263 #ifdef SIGABRT
3264 signal (SIGABRT, SIG_DFL);
3265 #endif
3266 #if defined(HAVE_SETRLIMIT)
3268 struct rlimit rlim;
3269 if (getrlimit (RLIMIT_CORE, &rlim) != 0)
3270 fatal_error (input_location, "getting core file size maximum limit: %m");
3271 rlim.rlim_cur = rlim.rlim_max;
3272 if (setrlimit (RLIMIT_CORE, &rlim) != 0)
3273 fatal_error (input_location,
3274 "setting core file size limit to maximum: %m");
3276 #endif
3277 diagnostic_abort_on_error (dc);
3280 /* Parse a -d<ARG> command line switch for OPTS, location LOC,
3281 diagnostic context DC. */
3283 static void
3284 decode_d_option (const char *arg, struct gcc_options *opts,
3285 location_t loc, diagnostic_context *dc)
3287 int c;
3289 while (*arg)
3290 switch (c = *arg++)
3292 case 'A':
3293 opts->x_flag_debug_asm = 1;
3294 break;
3295 case 'p':
3296 opts->x_flag_print_asm_name = 1;
3297 break;
3298 case 'P':
3299 opts->x_flag_dump_rtl_in_asm = 1;
3300 opts->x_flag_print_asm_name = 1;
3301 break;
3302 case 'x':
3303 opts->x_rtl_dump_and_exit = 1;
3304 break;
3305 case 'D': /* These are handled by the preprocessor. */
3306 case 'I':
3307 case 'M':
3308 case 'N':
3309 case 'U':
3310 break;
3311 case 'H':
3312 setup_core_dumping (dc);
3313 break;
3314 case 'a':
3315 opts->x_flag_dump_all_passed = true;
3316 break;
3318 default:
3319 warning_at (loc, 0, "unrecognized gcc debugging option: %c", c);
3320 break;
3324 /* Enable (or disable if VALUE is 0) a warning option ARG (language
3325 mask LANG_MASK, option handlers HANDLERS) as an error for option
3326 structures OPTS and OPTS_SET, diagnostic context DC (possibly
3327 NULL), location LOC. This is used by -Werror=. */
3329 static void
3330 enable_warning_as_error (const char *arg, int value, unsigned int lang_mask,
3331 const struct cl_option_handlers *handlers,
3332 struct gcc_options *opts,
3333 struct gcc_options *opts_set,
3334 location_t loc, diagnostic_context *dc)
3336 char *new_option;
3337 int option_index;
3339 new_option = XNEWVEC (char, strlen (arg) + 2);
3340 new_option[0] = 'W';
3341 strcpy (new_option + 1, arg);
3342 option_index = find_opt (new_option, lang_mask);
3343 if (option_index == OPT_SPECIAL_unknown)
3345 option_proposer op;
3346 const char *hint = op.suggest_option (new_option);
3347 if (hint)
3348 error_at (loc, "%<-W%serror=%s%>: no option %<-%s%>;"
3349 " did you mean %<-%s%>?", value ? "" : "no-",
3350 arg, new_option, hint);
3351 else
3352 error_at (loc, "%<-W%serror=%s%>: no option %<-%s%>",
3353 value ? "" : "no-", arg, new_option);
3355 else if (!(cl_options[option_index].flags & CL_WARNING))
3356 error_at (loc, "%<-Werror=%s%>: %<-%s%> is not an option that "
3357 "controls warnings", arg, new_option);
3358 else
3360 const diagnostic_t kind = value ? DK_ERROR : DK_WARNING;
3361 const char *arg = NULL;
3363 if (cl_options[option_index].flags & CL_JOINED)
3364 arg = new_option + cl_options[option_index].opt_len;
3365 control_warning_option (option_index, (int) kind, arg, value,
3366 loc, lang_mask,
3367 handlers, opts, opts_set, dc);
3369 free (new_option);
3372 /* Return malloced memory for the name of the option OPTION_INDEX
3373 which enabled a diagnostic (context CONTEXT), originally of type
3374 ORIG_DIAG_KIND but possibly converted to DIAG_KIND by options such
3375 as -Werror. */
3377 char *
3378 option_name (diagnostic_context *context, int option_index,
3379 diagnostic_t orig_diag_kind, diagnostic_t diag_kind)
3381 if (option_index)
3383 /* A warning classified as an error. */
3384 if ((orig_diag_kind == DK_WARNING || orig_diag_kind == DK_PEDWARN)
3385 && diag_kind == DK_ERROR)
3386 return concat (cl_options[OPT_Werror_].opt_text,
3387 /* Skip over "-W". */
3388 cl_options[option_index].opt_text + 2,
3389 NULL);
3390 /* A warning with option. */
3391 else
3392 return xstrdup (cl_options[option_index].opt_text);
3394 /* A warning without option classified as an error. */
3395 else if ((orig_diag_kind == DK_WARNING || orig_diag_kind == DK_PEDWARN
3396 || diag_kind == DK_WARNING)
3397 && context->warning_as_error_requested)
3398 return xstrdup (cl_options[OPT_Werror].opt_text);
3399 else
3400 return NULL;
3403 /* Get the page within the documentation for this option. */
3405 static const char *
3406 get_option_html_page (int option_index)
3408 const cl_option *cl_opt = &cl_options[option_index];
3410 /* Analyzer options are on their own page. */
3411 if (strstr (cl_opt->opt_text, "analyzer-"))
3412 return "gcc/Static-Analyzer-Options.html";
3414 /* Handle -flto= option. */
3415 if (strstr (cl_opt->opt_text, "flto"))
3416 return "gcc/Optimize-Options.html";
3418 #ifdef CL_Fortran
3419 if ((cl_opt->flags & CL_Fortran) != 0
3420 /* If it is option common to both C/C++ and Fortran, it is documented
3421 in gcc/ rather than gfortran/ docs. */
3422 && (cl_opt->flags & CL_C) == 0
3423 #ifdef CL_CXX
3424 && (cl_opt->flags & CL_CXX) == 0
3425 #endif
3427 return "gfortran/Error-and-Warning-Options.html";
3428 #endif
3430 return "gcc/Warning-Options.html";
3433 /* Return malloced memory for a URL describing the option OPTION_INDEX
3434 which enabled a diagnostic (context CONTEXT). */
3436 char *
3437 get_option_url (diagnostic_context *, int option_index)
3439 if (option_index)
3440 return concat (/* DOCUMENTATION_ROOT_URL should be supplied via -D by
3441 the Makefile (see --with-documentation-root-url), and
3442 should have a trailing slash. */
3443 DOCUMENTATION_ROOT_URL,
3445 /* get_option_html_page will return something like
3446 "gcc/Warning-Options.html". */
3447 get_option_html_page (option_index),
3449 /* Expect an anchor of the form "index-Wfoo" e.g.
3450 <a name="index-Wformat"></a>, and thus an id within
3451 the URL of "#index-Wformat". */
3452 "#index", cl_options[option_index].opt_text,
3453 NULL);
3454 else
3455 return NULL;
3458 /* Return a heap allocated producer with command line options. */
3460 char *
3461 gen_command_line_string (cl_decoded_option *options,
3462 unsigned int options_count)
3464 auto_vec<const char *> switches;
3465 char *options_string, *tail;
3466 const char *p;
3467 size_t len = 0;
3469 for (unsigned i = 0; i < options_count; i++)
3470 switch (options[i].opt_index)
3472 case OPT_o:
3473 case OPT_d:
3474 case OPT_dumpbase:
3475 case OPT_dumpbase_ext:
3476 case OPT_dumpdir:
3477 case OPT_quiet:
3478 case OPT_version:
3479 case OPT_v:
3480 case OPT_w:
3481 case OPT_L:
3482 case OPT_D:
3483 case OPT_I:
3484 case OPT_U:
3485 case OPT_SPECIAL_unknown:
3486 case OPT_SPECIAL_ignore:
3487 case OPT_SPECIAL_warn_removed:
3488 case OPT_SPECIAL_program_name:
3489 case OPT_SPECIAL_input_file:
3490 case OPT_grecord_gcc_switches:
3491 case OPT_frecord_gcc_switches:
3492 case OPT__output_pch_:
3493 case OPT_fdiagnostics_show_location_:
3494 case OPT_fdiagnostics_show_option:
3495 case OPT_fdiagnostics_show_caret:
3496 case OPT_fdiagnostics_show_labels:
3497 case OPT_fdiagnostics_show_line_numbers:
3498 case OPT_fdiagnostics_color_:
3499 case OPT_fdiagnostics_format_:
3500 case OPT_fverbose_asm:
3501 case OPT____:
3502 case OPT__sysroot_:
3503 case OPT_nostdinc:
3504 case OPT_nostdinc__:
3505 case OPT_fpreprocessed:
3506 case OPT_fltrans_output_list_:
3507 case OPT_fresolution_:
3508 case OPT_fdebug_prefix_map_:
3509 case OPT_fmacro_prefix_map_:
3510 case OPT_ffile_prefix_map_:
3511 case OPT_fcompare_debug:
3512 case OPT_fchecking:
3513 case OPT_fchecking_:
3514 /* Ignore these. */
3515 continue;
3516 case OPT_flto_:
3518 const char *lto_canonical = "-flto";
3519 switches.safe_push (lto_canonical);
3520 len += strlen (lto_canonical) + 1;
3521 break;
3523 default:
3524 if (cl_options[options[i].opt_index].flags
3525 & CL_NO_DWARF_RECORD)
3526 continue;
3527 gcc_checking_assert (options[i].canonical_option[0][0] == '-');
3528 switch (options[i].canonical_option[0][1])
3530 case 'M':
3531 case 'i':
3532 case 'W':
3533 continue;
3534 case 'f':
3535 if (strncmp (options[i].canonical_option[0] + 2,
3536 "dump", 4) == 0)
3537 continue;
3538 break;
3539 default:
3540 break;
3542 switches.safe_push (options[i].orig_option_with_args_text);
3543 len += strlen (options[i].orig_option_with_args_text) + 1;
3544 break;
3547 options_string = XNEWVEC (char, len + 1);
3548 tail = options_string;
3550 unsigned i;
3551 FOR_EACH_VEC_ELT (switches, i, p)
3553 len = strlen (p);
3554 memcpy (tail, p, len);
3555 tail += len;
3556 if (i != switches.length () - 1)
3558 *tail = ' ';
3559 ++tail;
3563 *tail = '\0';
3564 return options_string;
3567 /* Return a heap allocated producer string including command line options. */
3569 char *
3570 gen_producer_string (const char *language_string, cl_decoded_option *options,
3571 unsigned int options_count)
3573 char *cmdline = gen_command_line_string (options, options_count);
3574 char *combined = concat (language_string, " ", version_string, " ",
3575 cmdline, NULL);
3576 free (cmdline);
3577 return combined;
3580 #if CHECKING_P
3582 namespace selftest {
3584 /* Verify that get_option_html_page works as expected. */
3586 static void
3587 test_get_option_html_page ()
3589 ASSERT_STREQ (get_option_html_page (OPT_Wcpp), "gcc/Warning-Options.html");
3590 ASSERT_STREQ (get_option_html_page (OPT_Wanalyzer_double_free),
3591 "gcc/Static-Analyzer-Options.html");
3592 #ifdef CL_Fortran
3593 ASSERT_STREQ (get_option_html_page (OPT_Wline_truncation),
3594 "gfortran/Error-and-Warning-Options.html");
3595 #endif
3598 /* Run all of the selftests within this file. */
3600 void
3601 opts_c_tests ()
3603 test_get_option_html_page ();
3606 } // namespace selftest
3608 #endif /* #if CHECKING_P */