Don't warn when alignment of global common data exceeds maximum alignment.
[official-gcc.git] / gcc / opts.c
blobe0501551ef5ada7ce33444d443113f62eef01704
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 CTF debug info is enabled. */
140 bool
141 ctf_debuginfo_p ()
143 return (write_symbols & CTF_DEBUG);
146 /* Return TRUE iff dwarf2 debug info is enabled. */
148 bool
149 dwarf_debuginfo_p ()
151 return (write_symbols & DWARF2_DEBUG);
154 /* Return true iff the debug info format is to be generated based on DWARF
155 DIEs (like CTF and BTF debug info formats). */
157 bool dwarf_based_debuginfo_p ()
159 return ((write_symbols & CTF_DEBUG)
160 || (write_symbols & BTF_DEBUG));
163 /* Parse the -femit-struct-debug-detailed option value
164 and set the flag variables. */
166 #define MATCH( prefix, string ) \
167 ((strncmp (prefix, string, sizeof prefix - 1) == 0) \
168 ? ((string += sizeof prefix - 1), 1) : 0)
170 void
171 set_struct_debug_option (struct gcc_options *opts, location_t loc,
172 const char *spec)
174 /* various labels for comparison */
175 static const char dfn_lbl[] = "dfn:", dir_lbl[] = "dir:", ind_lbl[] = "ind:";
176 static const char ord_lbl[] = "ord:", gen_lbl[] = "gen:";
177 static const char none_lbl[] = "none", any_lbl[] = "any";
178 static const char base_lbl[] = "base", sys_lbl[] = "sys";
180 enum debug_struct_file files = DINFO_STRUCT_FILE_ANY;
181 /* Default is to apply to as much as possible. */
182 enum debug_info_usage usage = DINFO_USAGE_NUM_ENUMS;
183 int ord = 1, gen = 1;
185 /* What usage? */
186 if (MATCH (dfn_lbl, spec))
187 usage = DINFO_USAGE_DFN;
188 else if (MATCH (dir_lbl, spec))
189 usage = DINFO_USAGE_DIR_USE;
190 else if (MATCH (ind_lbl, spec))
191 usage = DINFO_USAGE_IND_USE;
193 /* Generics or not? */
194 if (MATCH (ord_lbl, spec))
195 gen = 0;
196 else if (MATCH (gen_lbl, spec))
197 ord = 0;
199 /* What allowable environment? */
200 if (MATCH (none_lbl, spec))
201 files = DINFO_STRUCT_FILE_NONE;
202 else if (MATCH (any_lbl, spec))
203 files = DINFO_STRUCT_FILE_ANY;
204 else if (MATCH (sys_lbl, spec))
205 files = DINFO_STRUCT_FILE_SYS;
206 else if (MATCH (base_lbl, spec))
207 files = DINFO_STRUCT_FILE_BASE;
208 else
209 error_at (loc,
210 "argument %qs to %<-femit-struct-debug-detailed%> "
211 "not recognized",
212 spec);
214 /* Effect the specification. */
215 if (usage == DINFO_USAGE_NUM_ENUMS)
217 if (ord)
219 opts->x_debug_struct_ordinary[DINFO_USAGE_DFN] = files;
220 opts->x_debug_struct_ordinary[DINFO_USAGE_DIR_USE] = files;
221 opts->x_debug_struct_ordinary[DINFO_USAGE_IND_USE] = files;
223 if (gen)
225 opts->x_debug_struct_generic[DINFO_USAGE_DFN] = files;
226 opts->x_debug_struct_generic[DINFO_USAGE_DIR_USE] = files;
227 opts->x_debug_struct_generic[DINFO_USAGE_IND_USE] = files;
230 else
232 if (ord)
233 opts->x_debug_struct_ordinary[usage] = files;
234 if (gen)
235 opts->x_debug_struct_generic[usage] = files;
238 if (*spec == ',')
239 set_struct_debug_option (opts, loc, spec+1);
240 else
242 /* No more -femit-struct-debug-detailed specifications.
243 Do final checks. */
244 if (*spec != '\0')
245 error_at (loc,
246 "argument %qs to %<-femit-struct-debug-detailed%> unknown",
247 spec);
248 if (opts->x_debug_struct_ordinary[DINFO_USAGE_DIR_USE]
249 < opts->x_debug_struct_ordinary[DINFO_USAGE_IND_USE]
250 || opts->x_debug_struct_generic[DINFO_USAGE_DIR_USE]
251 < opts->x_debug_struct_generic[DINFO_USAGE_IND_USE])
252 error_at (loc,
253 "%<-femit-struct-debug-detailed=dir:...%> must allow "
254 "at least as much as "
255 "%<-femit-struct-debug-detailed=ind:...%>");
259 /* Strip off a legitimate source ending from the input string NAME of
260 length LEN. Rather than having to know the names used by all of
261 our front ends, we strip off an ending of a period followed by
262 up to fource characters. (C++ uses ".cpp".) */
264 void
265 strip_off_ending (char *name, int len)
267 int i;
268 for (i = 2; i < 5 && len > i; i++)
270 if (name[len - i] == '.')
272 name[len - i] = '\0';
273 break;
278 /* Find the base name of a path, stripping off both directories and
279 a single final extension. */
281 base_of_path (const char *path, const char **base_out)
283 const char *base = path;
284 const char *dot = 0;
285 const char *p = path;
286 char c = *p;
287 while (c)
289 if (IS_DIR_SEPARATOR (c))
291 base = p + 1;
292 dot = 0;
294 else if (c == '.')
295 dot = p;
296 c = *++p;
298 if (!dot)
299 dot = p;
300 *base_out = base;
301 return dot - base;
304 /* What to print when a switch has no documentation. */
305 static const char undocumented_msg[] = N_("This option lacks documentation.");
306 static const char use_diagnosed_msg[] = N_("Uses of this option are diagnosed.");
308 typedef char *char_p; /* For DEF_VEC_P. */
310 static void set_debug_level (uint32_t dinfo, int extended,
311 const char *arg, struct gcc_options *opts,
312 struct gcc_options *opts_set,
313 location_t loc);
314 static void set_fast_math_flags (struct gcc_options *opts, int set);
315 static void decode_d_option (const char *arg, struct gcc_options *opts,
316 location_t loc, diagnostic_context *dc);
317 static void set_unsafe_math_optimizations_flags (struct gcc_options *opts,
318 int set);
319 static void enable_warning_as_error (const char *arg, int value,
320 unsigned int lang_mask,
321 const struct cl_option_handlers *handlers,
322 struct gcc_options *opts,
323 struct gcc_options *opts_set,
324 location_t loc,
325 diagnostic_context *dc);
327 /* Handle a back-end option; arguments and return value as for
328 handle_option. */
330 bool
331 target_handle_option (struct gcc_options *opts,
332 struct gcc_options *opts_set,
333 const struct cl_decoded_option *decoded,
334 unsigned int lang_mask ATTRIBUTE_UNUSED, int kind,
335 location_t loc,
336 const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED,
337 diagnostic_context *dc, void (*) (void))
339 gcc_assert (dc == global_dc);
340 gcc_assert (kind == DK_UNSPECIFIED);
341 return targetm_common.handle_option (opts, opts_set, decoded, loc);
344 /* Add comma-separated strings to a char_p vector. */
346 static void
347 add_comma_separated_to_vector (void **pvec, const char *arg)
349 char *tmp;
350 char *r;
351 char *w;
352 char *token_start;
353 vec<char_p> *v = (vec<char_p> *) *pvec;
355 vec_check_alloc (v, 1);
357 /* We never free this string. */
358 tmp = xstrdup (arg);
360 r = tmp;
361 w = tmp;
362 token_start = tmp;
364 while (*r != '\0')
366 if (*r == ',')
368 *w++ = '\0';
369 ++r;
370 v->safe_push (token_start);
371 token_start = w;
373 if (*r == '\\' && r[1] == ',')
375 *w++ = ',';
376 r += 2;
378 else
379 *w++ = *r++;
382 *w = '\0';
383 if (*token_start != '\0')
384 v->safe_push (token_start);
386 *pvec = v;
389 /* Initialize opts_obstack. */
391 void
392 init_opts_obstack (void)
394 gcc_obstack_init (&opts_obstack);
397 /* Initialize OPTS and OPTS_SET before using them in parsing options. */
399 void
400 init_options_struct (struct gcc_options *opts, struct gcc_options *opts_set)
402 /* Ensure that opts_obstack has already been initialized by the time
403 that we initialize any gcc_options instances (PR jit/68446). */
404 gcc_assert (opts_obstack.chunk_size > 0);
406 *opts = global_options_init;
408 if (opts_set)
409 memset (opts_set, 0, sizeof (*opts_set));
411 /* Initialize whether `char' is signed. */
412 opts->x_flag_signed_char = DEFAULT_SIGNED_CHAR;
413 /* Set this to a special "uninitialized" value. The actual default
414 is set after target options have been processed. */
415 opts->x_flag_short_enums = 2;
417 /* Initialize target_flags before default_options_optimization
418 so the latter can modify it. */
419 opts->x_target_flags = targetm_common.default_target_flags;
421 /* Some targets have ABI-specified unwind tables. */
422 opts->x_flag_unwind_tables = targetm_common.unwind_tables_default;
424 /* Some targets have other target-specific initialization. */
425 targetm_common.option_init_struct (opts);
428 /* If indicated by the optimization level LEVEL (-Os if SIZE is set,
429 -Ofast if FAST is set, -Og if DEBUG is set), apply the option DEFAULT_OPT
430 to OPTS and OPTS_SET, diagnostic context DC, location LOC, with language
431 mask LANG_MASK and option handlers HANDLERS. */
433 static void
434 maybe_default_option (struct gcc_options *opts,
435 struct gcc_options *opts_set,
436 const struct default_options *default_opt,
437 int level, bool size, bool fast, bool debug,
438 unsigned int lang_mask,
439 const struct cl_option_handlers *handlers,
440 location_t loc,
441 diagnostic_context *dc)
443 const struct cl_option *option = &cl_options[default_opt->opt_index];
444 bool enabled;
446 if (size)
447 gcc_assert (level == 2);
448 if (fast)
449 gcc_assert (level == 3);
450 if (debug)
451 gcc_assert (level == 1);
453 switch (default_opt->levels)
455 case OPT_LEVELS_ALL:
456 enabled = true;
457 break;
459 case OPT_LEVELS_0_ONLY:
460 enabled = (level == 0);
461 break;
463 case OPT_LEVELS_1_PLUS:
464 enabled = (level >= 1);
465 break;
467 case OPT_LEVELS_1_PLUS_SPEED_ONLY:
468 enabled = (level >= 1 && !size && !debug);
469 break;
471 case OPT_LEVELS_1_PLUS_NOT_DEBUG:
472 enabled = (level >= 1 && !debug);
473 break;
475 case OPT_LEVELS_2_PLUS:
476 enabled = (level >= 2);
477 break;
479 case OPT_LEVELS_2_PLUS_SPEED_ONLY:
480 enabled = (level >= 2 && !size && !debug);
481 break;
483 case OPT_LEVELS_3_PLUS:
484 enabled = (level >= 3);
485 break;
487 case OPT_LEVELS_3_PLUS_AND_SIZE:
488 enabled = (level >= 3 || size);
489 break;
491 case OPT_LEVELS_SIZE:
492 enabled = size;
493 break;
495 case OPT_LEVELS_FAST:
496 enabled = fast;
497 break;
499 case OPT_LEVELS_NONE:
500 default:
501 gcc_unreachable ();
504 if (enabled)
505 handle_generated_option (opts, opts_set, default_opt->opt_index,
506 default_opt->arg, default_opt->value,
507 lang_mask, DK_UNSPECIFIED, loc,
508 handlers, true, dc);
509 else if (default_opt->arg == NULL
510 && !option->cl_reject_negative
511 && !(option->flags & CL_PARAMS))
512 handle_generated_option (opts, opts_set, default_opt->opt_index,
513 default_opt->arg, !default_opt->value,
514 lang_mask, DK_UNSPECIFIED, loc,
515 handlers, true, dc);
518 /* As indicated by the optimization level LEVEL (-Os if SIZE is set,
519 -Ofast if FAST is set), apply the options in array DEFAULT_OPTS to
520 OPTS and OPTS_SET, diagnostic context DC, location LOC, with
521 language mask LANG_MASK and option handlers HANDLERS. */
523 static void
524 maybe_default_options (struct gcc_options *opts,
525 struct gcc_options *opts_set,
526 const struct default_options *default_opts,
527 int level, bool size, bool fast, bool debug,
528 unsigned int lang_mask,
529 const struct cl_option_handlers *handlers,
530 location_t loc,
531 diagnostic_context *dc)
533 size_t i;
535 for (i = 0; default_opts[i].levels != OPT_LEVELS_NONE; i++)
536 maybe_default_option (opts, opts_set, &default_opts[i],
537 level, size, fast, debug,
538 lang_mask, handlers, loc, dc);
541 /* Table of options enabled by default at different levels.
542 Please keep this list sorted by level and alphabetized within
543 each level; this makes it easier to keep the documentation
544 in sync. */
546 static const struct default_options default_options_table[] =
548 /* -O1 and -Og optimizations. */
549 { OPT_LEVELS_1_PLUS, OPT_fcombine_stack_adjustments, NULL, 1 },
550 { OPT_LEVELS_1_PLUS, OPT_fcompare_elim, NULL, 1 },
551 { OPT_LEVELS_1_PLUS, OPT_fcprop_registers, NULL, 1 },
552 { OPT_LEVELS_1_PLUS, OPT_fdefer_pop, NULL, 1 },
553 { OPT_LEVELS_1_PLUS, OPT_fforward_propagate, NULL, 1 },
554 { OPT_LEVELS_1_PLUS, OPT_fguess_branch_probability, NULL, 1 },
555 { OPT_LEVELS_1_PLUS, OPT_fipa_profile, NULL, 1 },
556 { OPT_LEVELS_1_PLUS, OPT_fipa_pure_const, NULL, 1 },
557 { OPT_LEVELS_1_PLUS, OPT_fipa_reference, NULL, 1 },
558 { OPT_LEVELS_1_PLUS, OPT_fipa_reference_addressable, NULL, 1 },
559 { OPT_LEVELS_1_PLUS, OPT_fmerge_constants, NULL, 1 },
560 { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
561 { OPT_LEVELS_1_PLUS, OPT_freorder_blocks, NULL, 1 },
562 { OPT_LEVELS_1_PLUS, OPT_fshrink_wrap, NULL, 1 },
563 { OPT_LEVELS_1_PLUS, OPT_fsplit_wide_types, NULL, 1 },
564 { OPT_LEVELS_1_PLUS, OPT_ftree_builtin_call_dce, NULL, 1 },
565 { OPT_LEVELS_1_PLUS, OPT_ftree_ccp, NULL, 1 },
566 { OPT_LEVELS_1_PLUS, OPT_ftree_ch, NULL, 1 },
567 { OPT_LEVELS_1_PLUS, OPT_ftree_coalesce_vars, NULL, 1 },
568 { OPT_LEVELS_1_PLUS, OPT_ftree_copy_prop, NULL, 1 },
569 { OPT_LEVELS_1_PLUS, OPT_ftree_dce, NULL, 1 },
570 { OPT_LEVELS_1_PLUS, OPT_ftree_dominator_opts, NULL, 1 },
571 { OPT_LEVELS_1_PLUS, OPT_ftree_fre, NULL, 1 },
572 { OPT_LEVELS_1_PLUS, OPT_ftree_sink, NULL, 1 },
573 { OPT_LEVELS_1_PLUS, OPT_ftree_slsr, NULL, 1 },
574 { OPT_LEVELS_1_PLUS, OPT_ftree_ter, NULL, 1 },
576 /* -O1 (and not -Og) optimizations. */
577 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fbranch_count_reg, NULL, 1 },
578 #if DELAY_SLOTS
579 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fdelayed_branch, NULL, 1 },
580 #endif
581 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fdse, NULL, 1 },
582 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fif_conversion, NULL, 1 },
583 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fif_conversion2, NULL, 1 },
584 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_finline_functions_called_once, NULL, 1 },
585 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fmove_loop_invariants, NULL, 1 },
586 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fmove_loop_stores, NULL, 1 },
587 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fssa_phiopt, NULL, 1 },
588 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fipa_modref, NULL, 1 },
589 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_bit_ccp, NULL, 1 },
590 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_dse, NULL, 1 },
591 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_pta, NULL, 1 },
592 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_sra, NULL, 1 },
594 /* -O2 and -Os optimizations. */
595 { OPT_LEVELS_2_PLUS, OPT_fcaller_saves, NULL, 1 },
596 { OPT_LEVELS_2_PLUS, OPT_fcode_hoisting, NULL, 1 },
597 { OPT_LEVELS_2_PLUS, OPT_fcrossjumping, NULL, 1 },
598 { OPT_LEVELS_2_PLUS, OPT_fcse_follow_jumps, NULL, 1 },
599 { OPT_LEVELS_2_PLUS, OPT_fdevirtualize, NULL, 1 },
600 { OPT_LEVELS_2_PLUS, OPT_fdevirtualize_speculatively, NULL, 1 },
601 { OPT_LEVELS_2_PLUS, OPT_fexpensive_optimizations, NULL, 1 },
602 { OPT_LEVELS_2_PLUS, OPT_fgcse, NULL, 1 },
603 { OPT_LEVELS_2_PLUS, OPT_fhoist_adjacent_loads, NULL, 1 },
604 { OPT_LEVELS_2_PLUS, OPT_findirect_inlining, NULL, 1 },
605 { OPT_LEVELS_2_PLUS, OPT_finline_small_functions, NULL, 1 },
606 { OPT_LEVELS_2_PLUS, OPT_fipa_bit_cp, NULL, 1 },
607 { OPT_LEVELS_2_PLUS, OPT_fipa_cp, NULL, 1 },
608 { OPT_LEVELS_2_PLUS, OPT_fipa_icf, NULL, 1 },
609 { OPT_LEVELS_2_PLUS, OPT_fipa_ra, NULL, 1 },
610 { OPT_LEVELS_2_PLUS, OPT_fipa_sra, NULL, 1 },
611 { OPT_LEVELS_2_PLUS, OPT_fipa_vrp, NULL, 1 },
612 { OPT_LEVELS_2_PLUS, OPT_fisolate_erroneous_paths_dereference, NULL, 1 },
613 { OPT_LEVELS_2_PLUS, OPT_flra_remat, NULL, 1 },
614 { OPT_LEVELS_2_PLUS, OPT_foptimize_sibling_calls, NULL, 1 },
615 { OPT_LEVELS_2_PLUS, OPT_fpartial_inlining, NULL, 1 },
616 { OPT_LEVELS_2_PLUS, OPT_fpeephole2, NULL, 1 },
617 { OPT_LEVELS_2_PLUS, OPT_freorder_functions, NULL, 1 },
618 { OPT_LEVELS_2_PLUS, OPT_frerun_cse_after_loop, NULL, 1 },
619 #ifdef INSN_SCHEDULING
620 { OPT_LEVELS_2_PLUS, OPT_fschedule_insns2, NULL, 1 },
621 #endif
622 { OPT_LEVELS_2_PLUS, OPT_fstrict_aliasing, NULL, 1 },
623 { OPT_LEVELS_2_PLUS, OPT_fstore_merging, NULL, 1 },
624 { OPT_LEVELS_2_PLUS, OPT_fthread_jumps, NULL, 1 },
625 { OPT_LEVELS_2_PLUS, OPT_ftree_pre, NULL, 1 },
626 { OPT_LEVELS_2_PLUS, OPT_ftree_switch_conversion, NULL, 1 },
627 { OPT_LEVELS_2_PLUS, OPT_ftree_tail_merge, NULL, 1 },
628 { OPT_LEVELS_2_PLUS, OPT_ftree_vrp, NULL, 1 },
629 { OPT_LEVELS_2_PLUS, OPT_fvect_cost_model_, NULL, VECT_COST_MODEL_CHEAP },
630 { OPT_LEVELS_2_PLUS, OPT_finline_functions, NULL, 1 },
631 { OPT_LEVELS_2_PLUS, OPT_ftree_loop_distribute_patterns, NULL, 1 },
633 /* -O2 and above optimizations, but not -Os or -Og. */
634 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_falign_functions, NULL, 1 },
635 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_falign_jumps, NULL, 1 },
636 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_falign_labels, NULL, 1 },
637 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_falign_loops, NULL, 1 },
638 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_foptimize_strlen, NULL, 1 },
639 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_freorder_blocks_algorithm_, NULL,
640 REORDER_BLOCKS_ALGORITHM_STC },
641 #ifdef INSN_SCHEDULING
642 /* Only run the pre-regalloc scheduling pass if optimizing for speed. */
643 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_fschedule_insns, NULL, 1 },
644 #endif
646 /* -O3 and -Os optimizations. */
648 /* -O3 optimizations. */
649 { OPT_LEVELS_3_PLUS, OPT_fgcse_after_reload, NULL, 1 },
650 { OPT_LEVELS_3_PLUS, OPT_fipa_cp_clone, NULL, 1 },
651 { OPT_LEVELS_3_PLUS, OPT_floop_interchange, NULL, 1 },
652 { OPT_LEVELS_3_PLUS, OPT_floop_unroll_and_jam, NULL, 1 },
653 { OPT_LEVELS_3_PLUS, OPT_fpeel_loops, NULL, 1 },
654 { OPT_LEVELS_3_PLUS, OPT_fpredictive_commoning, NULL, 1 },
655 { OPT_LEVELS_3_PLUS, OPT_fsplit_loops, NULL, 1 },
656 { OPT_LEVELS_3_PLUS, OPT_fsplit_paths, NULL, 1 },
657 { OPT_LEVELS_3_PLUS, OPT_ftree_loop_distribution, NULL, 1 },
658 { OPT_LEVELS_3_PLUS, OPT_ftree_loop_vectorize, NULL, 1 },
659 { OPT_LEVELS_3_PLUS, OPT_ftree_partial_pre, NULL, 1 },
660 { OPT_LEVELS_3_PLUS, OPT_ftree_slp_vectorize, NULL, 1 },
661 { OPT_LEVELS_3_PLUS, OPT_funswitch_loops, NULL, 1 },
662 { OPT_LEVELS_3_PLUS, OPT_fvect_cost_model_, NULL, VECT_COST_MODEL_DYNAMIC },
663 { OPT_LEVELS_3_PLUS, OPT_fversion_loops_for_strides, NULL, 1 },
665 /* -O3 parameters. */
666 { OPT_LEVELS_3_PLUS, OPT__param_max_inline_insns_auto_, NULL, 30 },
667 { OPT_LEVELS_3_PLUS, OPT__param_early_inlining_insns_, NULL, 14 },
668 { OPT_LEVELS_3_PLUS, OPT__param_inline_heuristics_hint_percent_, NULL, 600 },
669 { OPT_LEVELS_3_PLUS, OPT__param_inline_min_speedup_, NULL, 15 },
670 { OPT_LEVELS_3_PLUS, OPT__param_max_inline_insns_single_, NULL, 200 },
672 /* -Ofast adds optimizations to -O3. */
673 { OPT_LEVELS_FAST, OPT_ffast_math, NULL, 1 },
674 { OPT_LEVELS_FAST, OPT_fallow_store_data_races, NULL, 1 },
676 { OPT_LEVELS_NONE, 0, NULL, 0 }
679 /* Default the options in OPTS and OPTS_SET based on the optimization
680 settings in DECODED_OPTIONS and DECODED_OPTIONS_COUNT. */
681 void
682 default_options_optimization (struct gcc_options *opts,
683 struct gcc_options *opts_set,
684 struct cl_decoded_option *decoded_options,
685 unsigned int decoded_options_count,
686 location_t loc,
687 unsigned int lang_mask,
688 const struct cl_option_handlers *handlers,
689 diagnostic_context *dc)
691 unsigned int i;
692 int opt2;
693 bool openacc_mode = false;
695 /* Scan to see what optimization level has been specified. That will
696 determine the default value of many flags. */
697 for (i = 1; i < decoded_options_count; i++)
699 struct cl_decoded_option *opt = &decoded_options[i];
700 switch (opt->opt_index)
702 case OPT_O:
703 if (*opt->arg == '\0')
705 opts->x_optimize = 1;
706 opts->x_optimize_size = 0;
707 opts->x_optimize_fast = 0;
708 opts->x_optimize_debug = 0;
710 else
712 const int optimize_val = integral_argument (opt->arg);
713 if (optimize_val == -1)
714 error_at (loc, "argument to %<-O%> should be a non-negative "
715 "integer, %<g%>, %<s%> or %<fast%>");
716 else
718 opts->x_optimize = optimize_val;
719 if ((unsigned int) opts->x_optimize > 255)
720 opts->x_optimize = 255;
721 opts->x_optimize_size = 0;
722 opts->x_optimize_fast = 0;
723 opts->x_optimize_debug = 0;
726 break;
728 case OPT_Os:
729 opts->x_optimize_size = 1;
731 /* Optimizing for size forces optimize to be 2. */
732 opts->x_optimize = 2;
733 opts->x_optimize_fast = 0;
734 opts->x_optimize_debug = 0;
735 break;
737 case OPT_Ofast:
738 /* -Ofast only adds flags to -O3. */
739 opts->x_optimize_size = 0;
740 opts->x_optimize = 3;
741 opts->x_optimize_fast = 1;
742 opts->x_optimize_debug = 0;
743 break;
745 case OPT_Og:
746 /* -Og selects optimization level 1. */
747 opts->x_optimize_size = 0;
748 opts->x_optimize = 1;
749 opts->x_optimize_fast = 0;
750 opts->x_optimize_debug = 1;
751 break;
753 case OPT_fopenacc:
754 if (opt->value)
755 openacc_mode = true;
756 break;
758 default:
759 /* Ignore other options in this prescan. */
760 break;
764 maybe_default_options (opts, opts_set, default_options_table,
765 opts->x_optimize, opts->x_optimize_size,
766 opts->x_optimize_fast, opts->x_optimize_debug,
767 lang_mask, handlers, loc, dc);
769 /* -O2 param settings. */
770 opt2 = (opts->x_optimize >= 2);
772 if (openacc_mode)
773 SET_OPTION_IF_UNSET (opts, opts_set, flag_ipa_pta, true);
775 /* Track fields in field-sensitive alias analysis. */
776 if (opt2)
777 SET_OPTION_IF_UNSET (opts, opts_set, param_max_fields_for_field_sensitive,
778 100);
780 if (opts->x_optimize_size)
781 /* We want to crossjump as much as possible. */
782 SET_OPTION_IF_UNSET (opts, opts_set, param_min_crossjump_insns, 1);
784 /* Restrict the amount of work combine does at -Og while retaining
785 most of its useful transforms. */
786 if (opts->x_optimize_debug)
787 SET_OPTION_IF_UNSET (opts, opts_set, param_max_combine_insns, 2);
789 /* Allow default optimizations to be specified on a per-machine basis. */
790 maybe_default_options (opts, opts_set,
791 targetm_common.option_optimization_table,
792 opts->x_optimize, opts->x_optimize_size,
793 opts->x_optimize_fast, opts->x_optimize_debug,
794 lang_mask, handlers, loc, dc);
797 /* Control IPA optimizations based on different live patching LEVEL. */
798 static void
799 control_options_for_live_patching (struct gcc_options *opts,
800 struct gcc_options *opts_set,
801 enum live_patching_level level,
802 location_t loc)
804 gcc_assert (level > LIVE_PATCHING_NONE);
806 switch (level)
808 case LIVE_PATCHING_INLINE_ONLY_STATIC:
809 #define LIVE_PATCHING_OPTION "-flive-patching=inline-only-static"
810 if (opts_set->x_flag_ipa_cp_clone && opts->x_flag_ipa_cp_clone)
811 error_at (loc, "%qs is incompatible with %qs",
812 "-fipa-cp-clone", LIVE_PATCHING_OPTION);
813 else
814 opts->x_flag_ipa_cp_clone = 0;
816 if (opts_set->x_flag_ipa_sra && opts->x_flag_ipa_sra)
817 error_at (loc, "%qs is incompatible with %qs",
818 "-fipa-sra", LIVE_PATCHING_OPTION);
819 else
820 opts->x_flag_ipa_sra = 0;
822 if (opts_set->x_flag_partial_inlining && opts->x_flag_partial_inlining)
823 error_at (loc, "%qs is incompatible with %qs",
824 "-fpartial-inlining", LIVE_PATCHING_OPTION);
825 else
826 opts->x_flag_partial_inlining = 0;
828 if (opts_set->x_flag_ipa_cp && opts->x_flag_ipa_cp)
829 error_at (loc, "%qs is incompatible with %qs",
830 "-fipa-cp", LIVE_PATCHING_OPTION);
831 else
832 opts->x_flag_ipa_cp = 0;
834 /* FALLTHROUGH. */
835 case LIVE_PATCHING_INLINE_CLONE:
836 #undef LIVE_PATCHING_OPTION
837 #define LIVE_PATCHING_OPTION "-flive-patching=inline-only-static|inline-clone"
838 /* live patching should disable whole-program optimization. */
839 if (opts_set->x_flag_whole_program && opts->x_flag_whole_program)
840 error_at (loc, "%qs is incompatible with %qs",
841 "-fwhole-program", LIVE_PATCHING_OPTION);
842 else
843 opts->x_flag_whole_program = 0;
845 /* visibility change should be excluded by !flag_whole_program
846 && !in_lto_p && !flag_ipa_cp_clone && !flag_ipa_sra
847 && !flag_partial_inlining. */
849 if (opts_set->x_flag_ipa_pta && opts->x_flag_ipa_pta)
850 error_at (loc, "%qs is incompatible with %qs",
851 "-fipa-pta", LIVE_PATCHING_OPTION);
852 else
853 opts->x_flag_ipa_pta = 0;
855 if (opts_set->x_flag_ipa_reference && opts->x_flag_ipa_reference)
856 error_at (loc, "%qs is incompatible with %qs",
857 "-fipa-reference", LIVE_PATCHING_OPTION);
858 else
859 opts->x_flag_ipa_reference = 0;
861 if (opts_set->x_flag_ipa_ra && opts->x_flag_ipa_ra)
862 error_at (loc, "%qs is incompatible with %qs",
863 "-fipa-ra", LIVE_PATCHING_OPTION);
864 else
865 opts->x_flag_ipa_ra = 0;
867 if (opts_set->x_flag_ipa_icf && opts->x_flag_ipa_icf)
868 error_at (loc, "%qs is incompatible with %qs",
869 "-fipa-icf", LIVE_PATCHING_OPTION);
870 else
871 opts->x_flag_ipa_icf = 0;
873 if (opts_set->x_flag_ipa_icf_functions && opts->x_flag_ipa_icf_functions)
874 error_at (loc, "%qs is incompatible with %qs",
875 "-fipa-icf-functions", LIVE_PATCHING_OPTION);
876 else
877 opts->x_flag_ipa_icf_functions = 0;
879 if (opts_set->x_flag_ipa_icf_variables && opts->x_flag_ipa_icf_variables)
880 error_at (loc, "%qs is incompatible with %qs",
881 "-fipa-icf-variables", LIVE_PATCHING_OPTION);
882 else
883 opts->x_flag_ipa_icf_variables = 0;
885 if (opts_set->x_flag_ipa_bit_cp && opts->x_flag_ipa_bit_cp)
886 error_at (loc, "%qs is incompatible with %qs",
887 "-fipa-bit-cp", LIVE_PATCHING_OPTION);
888 else
889 opts->x_flag_ipa_bit_cp = 0;
891 if (opts_set->x_flag_ipa_vrp && opts->x_flag_ipa_vrp)
892 error_at (loc, "%qs is incompatible with %qs",
893 "-fipa-vrp", LIVE_PATCHING_OPTION);
894 else
895 opts->x_flag_ipa_vrp = 0;
897 if (opts_set->x_flag_ipa_pure_const && opts->x_flag_ipa_pure_const)
898 error_at (loc, "%qs is incompatible with %qs",
899 "-fipa-pure-const", LIVE_PATCHING_OPTION);
900 else
901 opts->x_flag_ipa_pure_const = 0;
903 if (opts_set->x_flag_ipa_modref && opts->x_flag_ipa_modref)
904 error_at (loc,
905 "%<-fipa-modref%> is incompatible with %qs",
906 LIVE_PATCHING_OPTION);
907 else
908 opts->x_flag_ipa_modref = 0;
910 /* FIXME: disable unreachable code removal. */
912 /* discovery of functions/variables with no address taken. */
913 if (opts_set->x_flag_ipa_reference_addressable
914 && opts->x_flag_ipa_reference_addressable)
915 error_at (loc, "%qs is incompatible with %qs",
916 "-fipa-reference-addressable", LIVE_PATCHING_OPTION);
917 else
918 opts->x_flag_ipa_reference_addressable = 0;
920 /* ipa stack alignment propagation. */
921 if (opts_set->x_flag_ipa_stack_alignment
922 && opts->x_flag_ipa_stack_alignment)
923 error_at (loc, "%qs is incompatible with %qs",
924 "-fipa-stack-alignment", LIVE_PATCHING_OPTION);
925 else
926 opts->x_flag_ipa_stack_alignment = 0;
927 break;
928 default:
929 gcc_unreachable ();
932 #undef LIVE_PATCHING_OPTION
935 /* --help option argument if set. */
936 vec<const char *> help_option_arguments;
938 /* Return the string name describing a sanitizer argument which has been
939 provided on the command line and has set this particular flag. */
940 const char *
941 find_sanitizer_argument (struct gcc_options *opts, unsigned int flags)
943 for (int i = 0; sanitizer_opts[i].name != NULL; ++i)
945 /* Need to find the sanitizer_opts element which:
946 a) Could have set the flags requested.
947 b) Has been set on the command line.
949 Can have (a) without (b) if the flag requested is e.g.
950 SANITIZE_ADDRESS, since both -fsanitize=address and
951 -fsanitize=kernel-address set this flag.
953 Can have (b) without (a) by requesting more than one sanitizer on the
954 command line. */
955 if ((sanitizer_opts[i].flag & opts->x_flag_sanitize)
956 != sanitizer_opts[i].flag)
957 continue;
958 if ((sanitizer_opts[i].flag & flags) != flags)
959 continue;
960 return sanitizer_opts[i].name;
962 return NULL;
966 /* Report an error to the user about sanitizer options they have requested
967 which have set conflicting flags.
969 LEFT and RIGHT indicate sanitizer flags which conflict with each other, this
970 function reports an error if both have been set in OPTS->x_flag_sanitize and
971 ensures the error identifies the requested command line options that have
972 set these flags. */
973 static void
974 report_conflicting_sanitizer_options (struct gcc_options *opts, location_t loc,
975 unsigned int left, unsigned int right)
977 unsigned int left_seen = (opts->x_flag_sanitize & left);
978 unsigned int right_seen = (opts->x_flag_sanitize & right);
979 if (left_seen && right_seen)
981 const char* left_arg = find_sanitizer_argument (opts, left_seen);
982 const char* right_arg = find_sanitizer_argument (opts, right_seen);
983 gcc_assert (left_arg && right_arg);
984 error_at (loc,
985 "%<-fsanitize=%s%> is incompatible with %<-fsanitize=%s%>",
986 left_arg, right_arg);
990 /* After all options at LOC have been read into OPTS and OPTS_SET,
991 finalize settings of those options and diagnose incompatible
992 combinations. */
993 void
994 finish_options (struct gcc_options *opts, struct gcc_options *opts_set,
995 location_t loc)
997 enum unwind_info_type ui_except;
999 if (opts->x_dump_base_name
1000 && ! opts->x_dump_base_name_prefixed)
1002 const char *sep = opts->x_dump_base_name;
1004 for (; *sep; sep++)
1005 if (IS_DIR_SEPARATOR (*sep))
1006 break;
1008 if (*sep)
1009 /* If dump_base_path contains subdirectories, don't prepend
1010 anything. */;
1011 else if (opts->x_dump_dir_name)
1012 /* We have a DUMP_DIR_NAME, prepend that. */
1013 opts->x_dump_base_name = opts_concat (opts->x_dump_dir_name,
1014 opts->x_dump_base_name, NULL);
1016 /* It is definitely prefixed now. */
1017 opts->x_dump_base_name_prefixed = true;
1020 /* Handle related options for unit-at-a-time, toplevel-reorder, and
1021 section-anchors. */
1022 if (!opts->x_flag_unit_at_a_time)
1024 if (opts->x_flag_section_anchors && opts_set->x_flag_section_anchors)
1025 error_at (loc, "section anchors must be disabled when unit-at-a-time "
1026 "is disabled");
1027 opts->x_flag_section_anchors = 0;
1028 if (opts->x_flag_toplevel_reorder == 1)
1029 error_at (loc, "toplevel reorder must be disabled when unit-at-a-time "
1030 "is disabled");
1031 opts->x_flag_toplevel_reorder = 0;
1034 /* -fself-test depends on the state of the compiler prior to
1035 compiling anything. Ideally it should be run on an empty source
1036 file. However, in case we get run with actual source, assume
1037 -fsyntax-only which will inhibit any compiler initialization
1038 which may confuse the self tests. */
1039 if (opts->x_flag_self_test)
1040 opts->x_flag_syntax_only = 1;
1042 if (opts->x_flag_tm && opts->x_flag_non_call_exceptions)
1043 sorry ("transactional memory is not supported with non-call exceptions");
1045 /* Unless the user has asked for section anchors, we disable toplevel
1046 reordering at -O0 to disable transformations that might be surprising
1047 to end users and to get -fno-toplevel-reorder tested. */
1048 if (!opts->x_optimize
1049 && opts->x_flag_toplevel_reorder == 2
1050 && !(opts->x_flag_section_anchors && opts_set->x_flag_section_anchors))
1052 opts->x_flag_toplevel_reorder = 0;
1053 opts->x_flag_section_anchors = 0;
1055 if (!opts->x_flag_toplevel_reorder)
1057 if (opts->x_flag_section_anchors && opts_set->x_flag_section_anchors)
1058 error_at (loc, "section anchors must be disabled when toplevel reorder"
1059 " is disabled");
1060 opts->x_flag_section_anchors = 0;
1063 if (!opts->x_flag_opts_finished)
1065 /* We initialize opts->x_flag_pie to -1 so that targets can set a
1066 default value. */
1067 if (opts->x_flag_pie == -1)
1069 /* We initialize opts->x_flag_pic to -1 so that we can tell if
1070 -fpic, -fPIC, -fno-pic or -fno-PIC is used. */
1071 if (opts->x_flag_pic == -1)
1072 opts->x_flag_pie = DEFAULT_FLAG_PIE;
1073 else
1074 opts->x_flag_pie = 0;
1076 /* If -fPIE or -fpie is used, turn on PIC. */
1077 if (opts->x_flag_pie)
1078 opts->x_flag_pic = opts->x_flag_pie;
1079 else if (opts->x_flag_pic == -1)
1080 opts->x_flag_pic = 0;
1081 if (opts->x_flag_pic && !opts->x_flag_pie)
1082 opts->x_flag_shlib = 1;
1083 opts->x_flag_opts_finished = true;
1086 /* We initialize opts->x_flag_stack_protect to -1 so that targets
1087 can set a default value. */
1088 if (opts->x_flag_stack_protect == -1)
1089 opts->x_flag_stack_protect = DEFAULT_FLAG_SSP;
1091 if (opts->x_optimize == 0)
1093 /* Inlining does not work if not optimizing,
1094 so force it not to be done. */
1095 opts->x_warn_inline = 0;
1096 opts->x_flag_no_inline = 1;
1099 /* The optimization to partition hot and cold basic blocks into separate
1100 sections of the .o and executable files does not work (currently)
1101 with exception handling. This is because there is no support for
1102 generating unwind info. If opts->x_flag_exceptions is turned on
1103 we need to turn off the partitioning optimization. */
1105 ui_except = targetm_common.except_unwind_info (opts);
1107 if (opts->x_flag_exceptions
1108 && opts->x_flag_reorder_blocks_and_partition
1109 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))
1111 if (opts_set->x_flag_reorder_blocks_and_partition)
1112 inform (loc,
1113 "%<-freorder-blocks-and-partition%> does not work "
1114 "with exceptions on this architecture");
1115 opts->x_flag_reorder_blocks_and_partition = 0;
1116 opts->x_flag_reorder_blocks = 1;
1119 /* If user requested unwind info, then turn off the partitioning
1120 optimization. */
1122 if (opts->x_flag_unwind_tables
1123 && !targetm_common.unwind_tables_default
1124 && opts->x_flag_reorder_blocks_and_partition
1125 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))
1127 if (opts_set->x_flag_reorder_blocks_and_partition)
1128 inform (loc,
1129 "%<-freorder-blocks-and-partition%> does not support "
1130 "unwind info on this architecture");
1131 opts->x_flag_reorder_blocks_and_partition = 0;
1132 opts->x_flag_reorder_blocks = 1;
1135 /* If the target requested unwind info, then turn off the partitioning
1136 optimization with a different message. Likewise, if the target does not
1137 support named sections. */
1139 if (opts->x_flag_reorder_blocks_and_partition
1140 && (!targetm_common.have_named_sections
1141 || (opts->x_flag_unwind_tables
1142 && targetm_common.unwind_tables_default
1143 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))))
1145 if (opts_set->x_flag_reorder_blocks_and_partition)
1146 inform (loc,
1147 "%<-freorder-blocks-and-partition%> does not work "
1148 "on this architecture");
1149 opts->x_flag_reorder_blocks_and_partition = 0;
1150 opts->x_flag_reorder_blocks = 1;
1154 /* Pipelining of outer loops is only possible when general pipelining
1155 capabilities are requested. */
1156 if (!opts->x_flag_sel_sched_pipelining)
1157 opts->x_flag_sel_sched_pipelining_outer_loops = 0;
1159 if (opts->x_flag_conserve_stack)
1161 SET_OPTION_IF_UNSET (opts, opts_set, param_large_stack_frame, 100);
1162 SET_OPTION_IF_UNSET (opts, opts_set, param_stack_frame_growth, 40);
1165 if (opts->x_flag_lto)
1167 #ifdef ENABLE_LTO
1168 opts->x_flag_generate_lto = 1;
1170 /* When generating IL, do not operate in whole-program mode.
1171 Otherwise, symbols will be privatized too early, causing link
1172 errors later. */
1173 opts->x_flag_whole_program = 0;
1174 #else
1175 error_at (loc, "LTO support has not been enabled in this configuration");
1176 #endif
1177 if (!opts->x_flag_fat_lto_objects
1178 && (!HAVE_LTO_PLUGIN
1179 || (opts_set->x_flag_use_linker_plugin
1180 && !opts->x_flag_use_linker_plugin)))
1182 if (opts_set->x_flag_fat_lto_objects)
1183 error_at (loc, "%<-fno-fat-lto-objects%> are supported only with "
1184 "linker plugin");
1185 opts->x_flag_fat_lto_objects = 1;
1188 /* -gsplit-dwarf isn't compatible with LTO, see PR88389. */
1189 if (opts->x_dwarf_split_debug_info)
1191 inform (loc, "%<-gsplit-dwarf%> is not supported with LTO,"
1192 " disabling");
1193 opts->x_dwarf_split_debug_info = 0;
1197 /* We initialize opts->x_flag_split_stack to -1 so that targets can set a
1198 default value if they choose based on other options. */
1199 if (opts->x_flag_split_stack == -1)
1200 opts->x_flag_split_stack = 0;
1201 else if (opts->x_flag_split_stack)
1203 if (!targetm_common.supports_split_stack (true, opts))
1205 error_at (loc, "%<-fsplit-stack%> is not supported by "
1206 "this compiler configuration");
1207 opts->x_flag_split_stack = 0;
1211 /* If stack splitting is turned on, and the user did not explicitly
1212 request function partitioning, turn off partitioning, as it
1213 confuses the linker when trying to handle partitioned split-stack
1214 code that calls a non-split-stack functions. But if partitioning
1215 was turned on explicitly just hope for the best. */
1216 if (opts->x_flag_split_stack
1217 && opts->x_flag_reorder_blocks_and_partition)
1218 SET_OPTION_IF_UNSET (opts, opts_set, flag_reorder_blocks_and_partition, 0);
1220 if (opts->x_flag_reorder_blocks_and_partition)
1221 SET_OPTION_IF_UNSET (opts, opts_set, flag_reorder_functions, 1);
1223 /* The -gsplit-dwarf option requires -ggnu-pubnames. */
1224 if (opts->x_dwarf_split_debug_info)
1225 opts->x_debug_generate_pub_sections = 2;
1227 if ((opts->x_flag_sanitize
1228 & (SANITIZE_USER_ADDRESS | SANITIZE_KERNEL_ADDRESS)) == 0)
1230 if (opts->x_flag_sanitize & SANITIZE_POINTER_COMPARE)
1231 error_at (loc,
1232 "%<-fsanitize=pointer-compare%> must be combined with "
1233 "%<-fsanitize=address%> or %<-fsanitize=kernel-address%>");
1234 if (opts->x_flag_sanitize & SANITIZE_POINTER_SUBTRACT)
1235 error_at (loc,
1236 "%<-fsanitize=pointer-subtract%> must be combined with "
1237 "%<-fsanitize=address%> or %<-fsanitize=kernel-address%>");
1240 /* Address sanitizers conflict with the thread sanitizer. */
1241 report_conflicting_sanitizer_options (opts, loc, SANITIZE_THREAD,
1242 SANITIZE_ADDRESS | SANITIZE_HWADDRESS);
1243 /* The leak sanitizer conflicts with the thread sanitizer. */
1244 report_conflicting_sanitizer_options (opts, loc, SANITIZE_LEAK,
1245 SANITIZE_THREAD);
1247 /* No combination of HWASAN and ASAN work together. */
1248 report_conflicting_sanitizer_options (opts, loc,
1249 SANITIZE_HWADDRESS, SANITIZE_ADDRESS);
1251 /* The userspace and kernel address sanitizers conflict with each other. */
1252 report_conflicting_sanitizer_options (opts, loc, SANITIZE_USER_HWADDRESS,
1253 SANITIZE_KERNEL_HWADDRESS);
1254 report_conflicting_sanitizer_options (opts, loc, SANITIZE_USER_ADDRESS,
1255 SANITIZE_KERNEL_ADDRESS);
1257 /* Check error recovery for -fsanitize-recover option. */
1258 for (int i = 0; sanitizer_opts[i].name != NULL; ++i)
1259 if ((opts->x_flag_sanitize_recover & sanitizer_opts[i].flag)
1260 && !sanitizer_opts[i].can_recover)
1261 error_at (loc, "%<-fsanitize-recover=%s%> is not supported",
1262 sanitizer_opts[i].name);
1264 /* When instrumenting the pointers, we don't want to remove
1265 the null pointer checks. */
1266 if (opts->x_flag_sanitize & (SANITIZE_NULL | SANITIZE_NONNULL_ATTRIBUTE
1267 | SANITIZE_RETURNS_NONNULL_ATTRIBUTE))
1268 opts->x_flag_delete_null_pointer_checks = 0;
1270 /* Aggressive compiler optimizations may cause false negatives. */
1271 if (opts->x_flag_sanitize & ~(SANITIZE_LEAK | SANITIZE_UNREACHABLE))
1272 opts->x_flag_aggressive_loop_optimizations = 0;
1274 /* Enable -fsanitize-address-use-after-scope if either address sanitizer is
1275 enabled. */
1276 if (opts->x_flag_sanitize
1277 & (SANITIZE_USER_ADDRESS | SANITIZE_USER_HWADDRESS))
1278 SET_OPTION_IF_UNSET (opts, opts_set, flag_sanitize_address_use_after_scope,
1279 true);
1281 /* Force -fstack-reuse=none in case -fsanitize-address-use-after-scope
1282 is enabled. */
1283 if (opts->x_flag_sanitize_address_use_after_scope)
1285 if (opts->x_flag_stack_reuse != SR_NONE
1286 && opts_set->x_flag_stack_reuse != SR_NONE)
1287 error_at (loc,
1288 "%<-fsanitize-address-use-after-scope%> requires "
1289 "%<-fstack-reuse=none%> option");
1291 opts->x_flag_stack_reuse = SR_NONE;
1294 if ((opts->x_flag_sanitize & SANITIZE_USER_ADDRESS) && opts->x_flag_tm)
1295 sorry ("transactional memory is not supported with %<-fsanitize=address%>");
1297 if ((opts->x_flag_sanitize & SANITIZE_KERNEL_ADDRESS) && opts->x_flag_tm)
1298 sorry ("transactional memory is not supported with "
1299 "%<-fsanitize=kernel-address%>");
1301 /* Currently live patching is not support for LTO. */
1302 if (opts->x_flag_live_patching && opts->x_flag_lto)
1303 sorry ("live patching is not supported with LTO");
1305 /* Currently vtable verification is not supported for LTO */
1306 if (opts->x_flag_vtable_verify && opts->x_flag_lto)
1307 sorry ("vtable verification is not supported with LTO");
1309 /* Control IPA optimizations based on different -flive-patching level. */
1310 if (opts->x_flag_live_patching)
1311 control_options_for_live_patching (opts, opts_set,
1312 opts->x_flag_live_patching,
1313 loc);
1315 /* Unrolling all loops implies that standard loop unrolling must also
1316 be done. */
1317 if (opts->x_flag_unroll_all_loops)
1318 opts->x_flag_unroll_loops = 1;
1320 /* Allow cunroll to grow size accordingly. */
1321 if (!opts_set->x_flag_cunroll_grow_size)
1322 opts->x_flag_cunroll_grow_size
1323 = (opts->x_flag_unroll_loops
1324 || opts->x_flag_peel_loops
1325 || opts->x_optimize >= 3);
1328 #define LEFT_COLUMN 27
1330 /* Output ITEM, of length ITEM_WIDTH, in the left column,
1331 followed by word-wrapped HELP in a second column. */
1332 static void
1333 wrap_help (const char *help,
1334 const char *item,
1335 unsigned int item_width,
1336 unsigned int columns)
1338 unsigned int col_width = LEFT_COLUMN;
1339 unsigned int remaining, room, len;
1341 remaining = strlen (help);
1345 room = columns - 3 - MAX (col_width, item_width);
1346 if (room > columns)
1347 room = 0;
1348 len = remaining;
1350 if (room < len)
1352 unsigned int i;
1354 for (i = 0; help[i]; i++)
1356 if (i >= room && len != remaining)
1357 break;
1358 if (help[i] == ' ')
1359 len = i;
1360 else if ((help[i] == '-' || help[i] == '/')
1361 && help[i + 1] != ' '
1362 && i > 0 && ISALPHA (help[i - 1]))
1363 len = i + 1;
1367 printf (" %-*.*s %.*s\n", col_width, item_width, item, len, help);
1368 item_width = 0;
1369 while (help[len] == ' ')
1370 len++;
1371 help += len;
1372 remaining -= len;
1374 while (remaining);
1377 /* Data structure used to print list of valid option values. */
1379 class option_help_tuple
1381 public:
1382 option_help_tuple (int code, vec<const char *> values):
1383 m_code (code), m_values (values)
1386 /* Code of an option. */
1387 int m_code;
1389 /* List of possible values. */
1390 vec<const char *> m_values;
1393 /* Print help for a specific front-end, etc. */
1394 static void
1395 print_filtered_help (unsigned int include_flags,
1396 unsigned int exclude_flags,
1397 unsigned int any_flags,
1398 unsigned int columns,
1399 struct gcc_options *opts,
1400 unsigned int lang_mask)
1402 unsigned int i;
1403 const char *help;
1404 bool found = false;
1405 bool displayed = false;
1406 char new_help[256];
1408 if (!opts->x_help_printed)
1409 opts->x_help_printed = XCNEWVAR (char, cl_options_count);
1411 if (!opts->x_help_enum_printed)
1412 opts->x_help_enum_printed = XCNEWVAR (char, cl_enums_count);
1414 auto_vec<option_help_tuple> help_tuples;
1416 for (i = 0; i < cl_options_count; i++)
1418 const struct cl_option *option = cl_options + i;
1419 unsigned int len;
1420 const char *opt;
1421 const char *tab;
1423 if (include_flags == 0
1424 || ((option->flags & include_flags) != include_flags))
1426 if ((option->flags & any_flags) == 0)
1427 continue;
1430 /* Skip unwanted switches. */
1431 if ((option->flags & exclude_flags) != 0)
1432 continue;
1434 /* The driver currently prints its own help text. */
1435 if ((option->flags & CL_DRIVER) != 0
1436 && (option->flags & (((1U << cl_lang_count) - 1)
1437 | CL_COMMON | CL_TARGET)) == 0)
1438 continue;
1440 /* If an option contains a language specification,
1441 exclude it from common unless all languages are present. */
1442 if ((include_flags & CL_COMMON)
1443 && !(option->flags & CL_DRIVER)
1444 && (option->flags & CL_LANG_ALL)
1445 && (option->flags & CL_LANG_ALL) != CL_LANG_ALL)
1446 continue;
1448 found = true;
1449 /* Skip switches that have already been printed. */
1450 if (opts->x_help_printed[i])
1451 continue;
1453 opts->x_help_printed[i] = true;
1455 help = option->help;
1456 if (help == NULL)
1458 if (exclude_flags & CL_UNDOCUMENTED)
1459 continue;
1461 help = undocumented_msg;
1464 /* Get the translation. */
1465 help = _(help);
1467 if (option->alias_target < N_OPTS
1468 && cl_options [option->alias_target].help)
1470 const struct cl_option *target = cl_options + option->alias_target;
1471 if (option->help == NULL)
1473 /* The option is undocumented but is an alias for an option that
1474 is documented. If the option has alias arguments, then its
1475 purpose is to provide certain arguments to the other option, so
1476 inform the reader of this. Otherwise, point the reader to the
1477 other option in preference to the former. */
1479 if (option->alias_arg)
1481 if (option->neg_alias_arg)
1482 snprintf (new_help, sizeof new_help,
1483 _("Same as %s%s (or, in negated form, %s%s)."),
1484 target->opt_text, option->alias_arg,
1485 target->opt_text, option->neg_alias_arg);
1486 else
1487 snprintf (new_help, sizeof new_help,
1488 _("Same as %s%s."),
1489 target->opt_text, option->alias_arg);
1491 else
1492 snprintf (new_help, sizeof new_help,
1493 _("Same as %s."),
1494 target->opt_text);
1496 else
1498 /* For documented options with aliases, mention the aliased
1499 option's name for reference. */
1500 snprintf (new_help, sizeof new_help,
1501 _("%s Same as %s."),
1502 help, cl_options [option->alias_target].opt_text);
1505 help = new_help;
1508 if (option->warn_message)
1510 /* Mention that the use of the option will trigger a warning. */
1511 if (help == new_help)
1512 snprintf (new_help + strlen (new_help),
1513 sizeof new_help - strlen (new_help),
1514 " %s", _(use_diagnosed_msg));
1515 else
1516 snprintf (new_help, sizeof new_help,
1517 "%s %s", help, _(use_diagnosed_msg));
1519 help = new_help;
1522 /* Find the gap between the name of the
1523 option and its descriptive text. */
1524 tab = strchr (help, '\t');
1525 if (tab)
1527 len = tab - help;
1528 opt = help;
1529 help = tab + 1;
1531 else
1533 opt = option->opt_text;
1534 len = strlen (opt);
1537 /* With the -Q option enabled we change the descriptive text associated
1538 with an option to be an indication of its current setting. */
1539 if (!opts->x_quiet_flag)
1541 void *flag_var = option_flag_var (i, opts);
1543 if (len < (LEFT_COLUMN + 2))
1544 strcpy (new_help, "\t\t");
1545 else
1546 strcpy (new_help, "\t");
1548 /* Set to print whether the option is enabled or disabled,
1549 or, if it's an alias for another option, the name of
1550 the aliased option. */
1551 bool print_state = false;
1553 if (flag_var != NULL
1554 && option->var_type != CLVC_DEFER)
1556 /* If OPTION is only available for a specific subset
1557 of languages other than this one, mention them. */
1558 bool avail_for_lang = true;
1559 if (unsigned langset = option->flags & CL_LANG_ALL)
1561 if (!(langset & lang_mask))
1563 avail_for_lang = false;
1564 strcat (new_help, _("[available in "));
1565 for (unsigned i = 0, n = 0; (1U << i) < CL_LANG_ALL; ++i)
1566 if (langset & (1U << i))
1568 if (n++)
1569 strcat (new_help, ", ");
1570 strcat (new_help, lang_names[i]);
1572 strcat (new_help, "]");
1575 if (!avail_for_lang)
1576 ; /* Print nothing else if the option is not available
1577 in the current language. */
1578 else if (option->flags & CL_JOINED)
1580 if (option->var_type == CLVC_STRING)
1582 if (* (const char **) flag_var != NULL)
1583 snprintf (new_help + strlen (new_help),
1584 sizeof (new_help) - strlen (new_help),
1585 "%s", * (const char **) flag_var);
1587 else if (option->var_type == CLVC_ENUM)
1589 const struct cl_enum *e = &cl_enums[option->var_enum];
1590 int value;
1591 const char *arg = NULL;
1593 value = e->get (flag_var);
1594 enum_value_to_arg (e->values, &arg, value, lang_mask);
1595 if (arg == NULL)
1596 arg = _("[default]");
1597 snprintf (new_help + strlen (new_help),
1598 sizeof (new_help) - strlen (new_help),
1599 "%s", arg);
1601 else
1603 if (option->cl_host_wide_int)
1604 sprintf (new_help + strlen (new_help),
1605 _("%llu bytes"), (unsigned long long)
1606 *(unsigned HOST_WIDE_INT *) flag_var);
1607 else
1608 sprintf (new_help + strlen (new_help),
1609 "%i", * (int *) flag_var);
1612 else
1613 print_state = true;
1615 else
1616 /* When there is no argument, print the option state only
1617 if the option takes no argument. */
1618 print_state = !(option->flags & CL_JOINED);
1620 if (print_state)
1622 if (option->alias_target < N_OPTS
1623 && option->alias_target != OPT_SPECIAL_warn_removed
1624 && option->alias_target != OPT_SPECIAL_ignore
1625 && option->alias_target != OPT_SPECIAL_input_file
1626 && option->alias_target != OPT_SPECIAL_program_name
1627 && option->alias_target != OPT_SPECIAL_unknown)
1629 const struct cl_option *target
1630 = &cl_options[option->alias_target];
1631 sprintf (new_help + strlen (new_help), "%s%s",
1632 target->opt_text,
1633 option->alias_arg ? option->alias_arg : "");
1635 else if (option->alias_target == OPT_SPECIAL_ignore)
1636 strcat (new_help, ("[ignored]"));
1637 else
1639 /* Print the state for an on/off option. */
1640 int ena = option_enabled (i, lang_mask, opts);
1641 if (ena > 0)
1642 strcat (new_help, _("[enabled]"));
1643 else if (ena == 0)
1644 strcat (new_help, _("[disabled]"));
1648 help = new_help;
1651 if (option->range_max != -1)
1653 char b[128];
1654 snprintf (b, sizeof (b), "<%d,%d>", option->range_min,
1655 option->range_max);
1656 opt = concat (opt, b, NULL);
1657 len += strlen (b);
1660 wrap_help (help, opt, len, columns);
1661 displayed = true;
1663 if (option->var_type == CLVC_ENUM
1664 && opts->x_help_enum_printed[option->var_enum] != 2)
1665 opts->x_help_enum_printed[option->var_enum] = 1;
1666 else
1668 vec<const char *> option_values
1669 = targetm_common.get_valid_option_values (i, NULL);
1670 if (!option_values.is_empty ())
1671 help_tuples.safe_push (option_help_tuple (i, option_values));
1675 if (! found)
1677 unsigned int langs = include_flags & CL_LANG_ALL;
1679 if (langs == 0)
1680 printf (_(" No options with the desired characteristics were found\n"));
1681 else
1683 unsigned int i;
1685 /* PR 31349: Tell the user how to see all of the
1686 options supported by a specific front end. */
1687 for (i = 0; (1U << i) < CL_LANG_ALL; i ++)
1688 if ((1U << i) & langs)
1689 printf (_(" None found. Use --help=%s to show *all* the options supported by the %s front-end.\n"),
1690 lang_names[i], lang_names[i]);
1694 else if (! displayed)
1695 printf (_(" All options with the desired characteristics have already been displayed\n"));
1697 putchar ('\n');
1699 /* Print details of enumerated option arguments, if those
1700 enumerations have help text headings provided. If no help text
1701 is provided, presume that the possible values are listed in the
1702 help text for the relevant options. */
1703 for (i = 0; i < cl_enums_count; i++)
1705 unsigned int j, pos;
1707 if (opts->x_help_enum_printed[i] != 1)
1708 continue;
1709 if (cl_enums[i].help == NULL)
1710 continue;
1711 printf (" %s\n ", _(cl_enums[i].help));
1712 pos = 4;
1713 for (j = 0; cl_enums[i].values[j].arg != NULL; j++)
1715 unsigned int len = strlen (cl_enums[i].values[j].arg);
1717 if (pos > 4 && pos + 1 + len <= columns)
1719 printf (" %s", cl_enums[i].values[j].arg);
1720 pos += 1 + len;
1722 else
1724 if (pos > 4)
1726 printf ("\n ");
1727 pos = 4;
1729 printf ("%s", cl_enums[i].values[j].arg);
1730 pos += len;
1733 printf ("\n\n");
1734 opts->x_help_enum_printed[i] = 2;
1737 for (unsigned i = 0; i < help_tuples.length (); i++)
1739 const struct cl_option *option = cl_options + help_tuples[i].m_code;
1740 printf (_(" Known valid arguments for %s option:\n "),
1741 option->opt_text);
1742 for (unsigned j = 0; j < help_tuples[i].m_values.length (); j++)
1743 printf (" %s", help_tuples[i].m_values[j]);
1744 printf ("\n\n");
1748 /* Display help for a specified type of option.
1749 The options must have ALL of the INCLUDE_FLAGS set
1750 ANY of the flags in the ANY_FLAGS set
1751 and NONE of the EXCLUDE_FLAGS set. The current option state is in
1752 OPTS; LANG_MASK is used for interpreting enumerated option state. */
1753 static void
1754 print_specific_help (unsigned int include_flags,
1755 unsigned int exclude_flags,
1756 unsigned int any_flags,
1757 struct gcc_options *opts,
1758 unsigned int lang_mask)
1760 unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1761 const char * description = NULL;
1762 const char * descrip_extra = "";
1763 size_t i;
1764 unsigned int flag;
1766 /* Sanity check: Make sure that we do not have more
1767 languages than we have bits available to enumerate them. */
1768 gcc_assert ((1U << cl_lang_count) <= CL_MIN_OPTION_CLASS);
1770 /* If we have not done so already, obtain
1771 the desired maximum width of the output. */
1772 if (opts->x_help_columns == 0)
1774 opts->x_help_columns = get_terminal_width ();
1775 if (opts->x_help_columns == INT_MAX)
1776 /* Use a reasonable default. */
1777 opts->x_help_columns = 80;
1780 /* Decide upon the title for the options that we are going to display. */
1781 for (i = 0, flag = 1; flag <= CL_MAX_OPTION_CLASS; flag <<= 1, i ++)
1783 switch (flag & include_flags)
1785 case 0:
1786 case CL_DRIVER:
1787 break;
1789 case CL_TARGET:
1790 description = _("The following options are target specific");
1791 break;
1792 case CL_WARNING:
1793 description = _("The following options control compiler warning messages");
1794 break;
1795 case CL_OPTIMIZATION:
1796 description = _("The following options control optimizations");
1797 break;
1798 case CL_COMMON:
1799 description = _("The following options are language-independent");
1800 break;
1801 case CL_PARAMS:
1802 description = _("The following options control parameters");
1803 break;
1804 default:
1805 if (i >= cl_lang_count)
1806 break;
1807 if (exclude_flags & all_langs_mask)
1808 description = _("The following options are specific to just the language ");
1809 else
1810 description = _("The following options are supported by the language ");
1811 descrip_extra = lang_names [i];
1812 break;
1816 if (description == NULL)
1818 if (any_flags == 0)
1820 if (include_flags & CL_UNDOCUMENTED)
1821 description = _("The following options are not documented");
1822 else if (include_flags & CL_SEPARATE)
1823 description = _("The following options take separate arguments");
1824 else if (include_flags & CL_JOINED)
1825 description = _("The following options take joined arguments");
1826 else
1828 internal_error ("unrecognized %<include_flags 0x%x%> passed "
1829 "to %<print_specific_help%>",
1830 include_flags);
1831 return;
1834 else
1836 if (any_flags & all_langs_mask)
1837 description = _("The following options are language-related");
1838 else
1839 description = _("The following options are language-independent");
1843 printf ("%s%s:\n", description, descrip_extra);
1844 print_filtered_help (include_flags, exclude_flags, any_flags,
1845 opts->x_help_columns, opts, lang_mask);
1848 /* Enable FDO-related flags. */
1850 static void
1851 enable_fdo_optimizations (struct gcc_options *opts,
1852 struct gcc_options *opts_set,
1853 int value)
1855 SET_OPTION_IF_UNSET (opts, opts_set, flag_branch_probabilities, value);
1856 SET_OPTION_IF_UNSET (opts, opts_set, flag_profile_values, value);
1857 SET_OPTION_IF_UNSET (opts, opts_set, flag_unroll_loops, value);
1858 SET_OPTION_IF_UNSET (opts, opts_set, flag_peel_loops, value);
1859 SET_OPTION_IF_UNSET (opts, opts_set, flag_tracer, value);
1860 SET_OPTION_IF_UNSET (opts, opts_set, flag_value_profile_transformations,
1861 value);
1862 SET_OPTION_IF_UNSET (opts, opts_set, flag_inline_functions, value);
1863 SET_OPTION_IF_UNSET (opts, opts_set, flag_ipa_cp, value);
1864 if (value)
1866 SET_OPTION_IF_UNSET (opts, opts_set, flag_ipa_cp_clone, 1);
1867 SET_OPTION_IF_UNSET (opts, opts_set, flag_ipa_bit_cp, 1);
1869 SET_OPTION_IF_UNSET (opts, opts_set, flag_predictive_commoning, value);
1870 SET_OPTION_IF_UNSET (opts, opts_set, flag_split_loops, value);
1871 SET_OPTION_IF_UNSET (opts, opts_set, flag_unswitch_loops, value);
1872 SET_OPTION_IF_UNSET (opts, opts_set, flag_gcse_after_reload, value);
1873 SET_OPTION_IF_UNSET (opts, opts_set, flag_tree_loop_vectorize, value);
1874 SET_OPTION_IF_UNSET (opts, opts_set, flag_tree_slp_vectorize, value);
1875 SET_OPTION_IF_UNSET (opts, opts_set, flag_version_loops_for_strides, value);
1876 SET_OPTION_IF_UNSET (opts, opts_set, flag_vect_cost_model,
1877 VECT_COST_MODEL_DYNAMIC);
1878 SET_OPTION_IF_UNSET (opts, opts_set, flag_tree_loop_distribute_patterns,
1879 value);
1880 SET_OPTION_IF_UNSET (opts, opts_set, flag_loop_interchange, value);
1881 SET_OPTION_IF_UNSET (opts, opts_set, flag_unroll_jam, value);
1882 SET_OPTION_IF_UNSET (opts, opts_set, flag_tree_loop_distribution, value);
1885 /* -f{,no-}sanitize{,-recover}= suboptions. */
1886 const struct sanitizer_opts_s sanitizer_opts[] =
1888 #define SANITIZER_OPT(name, flags, recover) \
1889 { #name, flags, sizeof #name - 1, recover }
1890 SANITIZER_OPT (address, (SANITIZE_ADDRESS | SANITIZE_USER_ADDRESS), true),
1891 SANITIZER_OPT (hwaddress, (SANITIZE_HWADDRESS | SANITIZE_USER_HWADDRESS),
1892 true),
1893 SANITIZER_OPT (kernel-address, (SANITIZE_ADDRESS | SANITIZE_KERNEL_ADDRESS),
1894 true),
1895 SANITIZER_OPT (kernel-hwaddress,
1896 (SANITIZE_HWADDRESS | SANITIZE_KERNEL_HWADDRESS),
1897 true),
1898 SANITIZER_OPT (pointer-compare, SANITIZE_POINTER_COMPARE, true),
1899 SANITIZER_OPT (pointer-subtract, SANITIZE_POINTER_SUBTRACT, true),
1900 SANITIZER_OPT (thread, SANITIZE_THREAD, false),
1901 SANITIZER_OPT (leak, SANITIZE_LEAK, false),
1902 SANITIZER_OPT (shift, SANITIZE_SHIFT, true),
1903 SANITIZER_OPT (shift-base, SANITIZE_SHIFT_BASE, true),
1904 SANITIZER_OPT (shift-exponent, SANITIZE_SHIFT_EXPONENT, true),
1905 SANITIZER_OPT (integer-divide-by-zero, SANITIZE_DIVIDE, true),
1906 SANITIZER_OPT (undefined, SANITIZE_UNDEFINED, true),
1907 SANITIZER_OPT (unreachable, SANITIZE_UNREACHABLE, false),
1908 SANITIZER_OPT (vla-bound, SANITIZE_VLA, true),
1909 SANITIZER_OPT (return, SANITIZE_RETURN, false),
1910 SANITIZER_OPT (null, SANITIZE_NULL, true),
1911 SANITIZER_OPT (signed-integer-overflow, SANITIZE_SI_OVERFLOW, true),
1912 SANITIZER_OPT (bool, SANITIZE_BOOL, true),
1913 SANITIZER_OPT (enum, SANITIZE_ENUM, true),
1914 SANITIZER_OPT (float-divide-by-zero, SANITIZE_FLOAT_DIVIDE, true),
1915 SANITIZER_OPT (float-cast-overflow, SANITIZE_FLOAT_CAST, true),
1916 SANITIZER_OPT (bounds, SANITIZE_BOUNDS, true),
1917 SANITIZER_OPT (bounds-strict, SANITIZE_BOUNDS | SANITIZE_BOUNDS_STRICT, true),
1918 SANITIZER_OPT (alignment, SANITIZE_ALIGNMENT, true),
1919 SANITIZER_OPT (nonnull-attribute, SANITIZE_NONNULL_ATTRIBUTE, true),
1920 SANITIZER_OPT (returns-nonnull-attribute, SANITIZE_RETURNS_NONNULL_ATTRIBUTE,
1921 true),
1922 SANITIZER_OPT (object-size, SANITIZE_OBJECT_SIZE, true),
1923 SANITIZER_OPT (vptr, SANITIZE_VPTR, true),
1924 SANITIZER_OPT (pointer-overflow, SANITIZE_POINTER_OVERFLOW, true),
1925 SANITIZER_OPT (builtin, SANITIZE_BUILTIN, true),
1926 SANITIZER_OPT (all, ~0U, true),
1927 #undef SANITIZER_OPT
1928 { NULL, 0U, 0UL, false }
1931 /* -fzero-call-used-regs= suboptions. */
1932 const struct zero_call_used_regs_opts_s zero_call_used_regs_opts[] =
1934 #define ZERO_CALL_USED_REGS_OPT(name, flags) \
1935 { #name, flags }
1936 ZERO_CALL_USED_REGS_OPT (skip, zero_regs_flags::SKIP),
1937 ZERO_CALL_USED_REGS_OPT (used-gpr-arg, zero_regs_flags::USED_GPR_ARG),
1938 ZERO_CALL_USED_REGS_OPT (used-gpr, zero_regs_flags::USED_GPR),
1939 ZERO_CALL_USED_REGS_OPT (used-arg, zero_regs_flags::USED_ARG),
1940 ZERO_CALL_USED_REGS_OPT (used, zero_regs_flags::USED),
1941 ZERO_CALL_USED_REGS_OPT (all-gpr-arg, zero_regs_flags::ALL_GPR_ARG),
1942 ZERO_CALL_USED_REGS_OPT (all-gpr, zero_regs_flags::ALL_GPR),
1943 ZERO_CALL_USED_REGS_OPT (all-arg, zero_regs_flags::ALL_ARG),
1944 ZERO_CALL_USED_REGS_OPT (all, zero_regs_flags::ALL),
1945 #undef ZERO_CALL_USED_REGS_OPT
1946 {NULL, 0U}
1949 /* A struct for describing a run of chars within a string. */
1951 class string_fragment
1953 public:
1954 string_fragment (const char *start, size_t len)
1955 : m_start (start), m_len (len) {}
1957 const char *m_start;
1958 size_t m_len;
1961 /* Specialization of edit_distance_traits for string_fragment,
1962 for use by get_closest_sanitizer_option. */
1964 template <>
1965 struct edit_distance_traits<const string_fragment &>
1967 static size_t get_length (const string_fragment &fragment)
1969 return fragment.m_len;
1972 static const char *get_string (const string_fragment &fragment)
1974 return fragment.m_start;
1978 /* Given ARG, an unrecognized sanitizer option, return the best
1979 matching sanitizer option, or NULL if there isn't one.
1980 OPTS is array of candidate sanitizer options.
1981 CODE is OPT_fsanitize_ or OPT_fsanitize_recover_.
1982 VALUE is non-zero for the regular form of the option, zero
1983 for the "no-" form (e.g. "-fno-sanitize-recover="). */
1985 static const char *
1986 get_closest_sanitizer_option (const string_fragment &arg,
1987 const struct sanitizer_opts_s *opts,
1988 enum opt_code code, int value)
1990 best_match <const string_fragment &, const char*> bm (arg);
1991 for (int i = 0; opts[i].name != NULL; ++i)
1993 /* -fsanitize=all is not valid, so don't offer it. */
1994 if (code == OPT_fsanitize_
1995 && opts[i].flag == ~0U
1996 && value)
1997 continue;
1999 /* For -fsanitize-recover= (and not -fno-sanitize-recover=),
2000 don't offer the non-recoverable options. */
2001 if (code == OPT_fsanitize_recover_
2002 && !opts[i].can_recover
2003 && value)
2004 continue;
2006 bm.consider (opts[i].name);
2008 return bm.get_best_meaningful_candidate ();
2011 /* Parse comma separated sanitizer suboptions from P for option SCODE,
2012 adjust previous FLAGS and return new ones. If COMPLAIN is false,
2013 don't issue diagnostics. */
2015 unsigned int
2016 parse_sanitizer_options (const char *p, location_t loc, int scode,
2017 unsigned int flags, int value, bool complain)
2019 enum opt_code code = (enum opt_code) scode;
2021 while (*p != 0)
2023 size_t len, i;
2024 bool found = false;
2025 const char *comma = strchr (p, ',');
2027 if (comma == NULL)
2028 len = strlen (p);
2029 else
2030 len = comma - p;
2031 if (len == 0)
2033 p = comma + 1;
2034 continue;
2037 /* Check to see if the string matches an option class name. */
2038 for (i = 0; sanitizer_opts[i].name != NULL; ++i)
2039 if (len == sanitizer_opts[i].len
2040 && memcmp (p, sanitizer_opts[i].name, len) == 0)
2042 /* Handle both -fsanitize and -fno-sanitize cases. */
2043 if (value && sanitizer_opts[i].flag == ~0U)
2045 if (code == OPT_fsanitize_)
2047 if (complain)
2048 error_at (loc, "%<-fsanitize=all%> option is not valid");
2050 else
2051 flags |= ~(SANITIZE_THREAD | SANITIZE_LEAK
2052 | SANITIZE_UNREACHABLE | SANITIZE_RETURN);
2054 else if (value)
2056 /* Do not enable -fsanitize-recover=unreachable and
2057 -fsanitize-recover=return if -fsanitize-recover=undefined
2058 is selected. */
2059 if (code == OPT_fsanitize_recover_
2060 && sanitizer_opts[i].flag == SANITIZE_UNDEFINED)
2061 flags |= (SANITIZE_UNDEFINED
2062 & ~(SANITIZE_UNREACHABLE | SANITIZE_RETURN));
2063 else
2064 flags |= sanitizer_opts[i].flag;
2066 else
2067 flags &= ~sanitizer_opts[i].flag;
2068 found = true;
2069 break;
2072 if (! found && complain)
2074 const char *hint
2075 = get_closest_sanitizer_option (string_fragment (p, len),
2076 sanitizer_opts, code, value);
2078 const char *suffix;
2079 if (code == OPT_fsanitize_recover_)
2080 suffix = "-recover";
2081 else
2082 suffix = "";
2084 if (hint)
2085 error_at (loc,
2086 "unrecognized argument to %<-f%ssanitize%s=%> "
2087 "option: %q.*s; did you mean %qs?",
2088 value ? "" : "no-",
2089 suffix, (int) len, p, hint);
2090 else
2091 error_at (loc,
2092 "unrecognized argument to %<-f%ssanitize%s=%> option: "
2093 "%q.*s", value ? "" : "no-",
2094 suffix, (int) len, p);
2097 if (comma == NULL)
2098 break;
2099 p = comma + 1;
2101 return flags;
2104 /* Parse string values of no_sanitize attribute passed in VALUE.
2105 Values are separated with comma. */
2107 unsigned int
2108 parse_no_sanitize_attribute (char *value)
2110 unsigned int flags = 0;
2111 unsigned int i;
2112 char *q = strtok (value, ",");
2114 while (q != NULL)
2116 for (i = 0; sanitizer_opts[i].name != NULL; ++i)
2117 if (strcmp (sanitizer_opts[i].name, q) == 0)
2119 flags |= sanitizer_opts[i].flag;
2120 if (sanitizer_opts[i].flag == SANITIZE_UNDEFINED)
2121 flags |= SANITIZE_UNDEFINED_NONDEFAULT;
2122 break;
2125 if (sanitizer_opts[i].name == NULL)
2126 warning (OPT_Wattributes,
2127 "%qs attribute directive ignored", q);
2129 q = strtok (NULL, ",");
2132 return flags;
2135 /* Parse -fzero-call-used-regs suboptions from ARG, return the FLAGS. */
2137 unsigned int
2138 parse_zero_call_used_regs_options (const char *arg)
2140 unsigned int flags = 0;
2142 /* Check to see if the string matches a sub-option name. */
2143 for (unsigned int i = 0; zero_call_used_regs_opts[i].name != NULL; ++i)
2144 if (strcmp (arg, zero_call_used_regs_opts[i].name) == 0)
2146 flags = zero_call_used_regs_opts[i].flag;
2147 break;
2150 if (!flags)
2151 error ("unrecognized argument to %<-fzero-call-used-regs=%>: %qs", arg);
2153 return flags;
2156 /* Parse -falign-NAME format for a FLAG value. Return individual
2157 parsed integer values into RESULT_VALUES array. If REPORT_ERROR is
2158 set, print error message at LOC location. */
2160 bool
2161 parse_and_check_align_values (const char *flag,
2162 const char *name,
2163 auto_vec<unsigned> &result_values,
2164 bool report_error,
2165 location_t loc)
2167 char *str = xstrdup (flag);
2168 for (char *p = strtok (str, ":"); p; p = strtok (NULL, ":"))
2170 char *end;
2171 int v = strtol (p, &end, 10);
2172 if (*end != '\0' || v < 0)
2174 if (report_error)
2175 error_at (loc, "invalid arguments for %<-falign-%s%> option: %qs",
2176 name, flag);
2178 return false;
2181 result_values.safe_push ((unsigned)v);
2184 free (str);
2186 /* Check that we have a correct number of values. */
2187 if (result_values.is_empty () || result_values.length () > 4)
2189 if (report_error)
2190 error_at (loc, "invalid number of arguments for %<-falign-%s%> "
2191 "option: %qs", name, flag);
2192 return false;
2195 for (unsigned i = 0; i < result_values.length (); i++)
2196 if (result_values[i] > MAX_CODE_ALIGN_VALUE)
2198 if (report_error)
2199 error_at (loc, "%<-falign-%s%> is not between 0 and %d",
2200 name, MAX_CODE_ALIGN_VALUE);
2201 return false;
2204 return true;
2207 /* Check that alignment value FLAG for -falign-NAME is valid at a given
2208 location LOC. OPT_STR points to the stored -falign-NAME=argument and
2209 OPT_FLAG points to the associated -falign-NAME on/off flag. */
2211 static void
2212 check_alignment_argument (location_t loc, const char *flag, const char *name,
2213 int *opt_flag, const char **opt_str)
2215 auto_vec<unsigned> align_result;
2216 parse_and_check_align_values (flag, name, align_result, true, loc);
2218 if (align_result.length() >= 1 && align_result[0] == 0)
2220 *opt_flag = 1;
2221 *opt_str = NULL;
2225 /* Parse argument of -fpatchable-function-entry option ARG and store
2226 corresponding values to PATCH_AREA_SIZE and PATCH_AREA_START.
2227 If REPORT_ERROR is set to true, generate error for a problematic
2228 option arguments. */
2230 void
2231 parse_and_check_patch_area (const char *arg, bool report_error,
2232 HOST_WIDE_INT *patch_area_size,
2233 HOST_WIDE_INT *patch_area_start)
2235 *patch_area_size = 0;
2236 *patch_area_start = 0;
2238 if (arg == NULL)
2239 return;
2241 char *patch_area_arg = xstrdup (arg);
2242 char *comma = strchr (patch_area_arg, ',');
2243 if (comma)
2245 *comma = '\0';
2246 *patch_area_size = integral_argument (patch_area_arg);
2247 *patch_area_start = integral_argument (comma + 1);
2249 else
2250 *patch_area_size = integral_argument (patch_area_arg);
2252 if (*patch_area_size < 0
2253 || *patch_area_size > USHRT_MAX
2254 || *patch_area_start < 0
2255 || *patch_area_start > USHRT_MAX
2256 || *patch_area_size < *patch_area_start)
2257 if (report_error)
2258 error ("invalid arguments for %<-fpatchable-function-entry%>");
2260 free (patch_area_arg);
2263 /* Print help when OPT__help_ is set. */
2265 void
2266 print_help (struct gcc_options *opts, unsigned int lang_mask,
2267 const char *help_option_argument)
2269 const char *a = help_option_argument;
2270 unsigned int include_flags = 0;
2271 /* Note - by default we include undocumented options when listing
2272 specific classes. If you only want to see documented options
2273 then add ",^undocumented" to the --help= option. E.g.:
2275 --help=target,^undocumented */
2276 unsigned int exclude_flags = 0;
2278 if (lang_mask == CL_DRIVER)
2279 return;
2281 /* Walk along the argument string, parsing each word in turn.
2282 The format is:
2283 arg = [^]{word}[,{arg}]
2284 word = {optimizers|target|warnings|undocumented|
2285 params|common|<language>} */
2286 while (*a != 0)
2288 static const struct
2290 const char *string;
2291 unsigned int flag;
2293 specifics[] =
2295 { "optimizers", CL_OPTIMIZATION },
2296 { "target", CL_TARGET },
2297 { "warnings", CL_WARNING },
2298 { "undocumented", CL_UNDOCUMENTED },
2299 { "params", CL_PARAMS },
2300 { "joined", CL_JOINED },
2301 { "separate", CL_SEPARATE },
2302 { "common", CL_COMMON },
2303 { NULL, 0 }
2305 unsigned int *pflags;
2306 const char *comma;
2307 unsigned int lang_flag, specific_flag;
2308 unsigned int len;
2309 unsigned int i;
2311 if (*a == '^')
2313 ++a;
2314 if (*a == '\0')
2316 error ("missing argument to %qs", "--help=^");
2317 break;
2319 pflags = &exclude_flags;
2321 else
2322 pflags = &include_flags;
2324 comma = strchr (a, ',');
2325 if (comma == NULL)
2326 len = strlen (a);
2327 else
2328 len = comma - a;
2329 if (len == 0)
2331 a = comma + 1;
2332 continue;
2335 /* Check to see if the string matches an option class name. */
2336 for (i = 0, specific_flag = 0; specifics[i].string != NULL; i++)
2337 if (strncasecmp (a, specifics[i].string, len) == 0)
2339 specific_flag = specifics[i].flag;
2340 break;
2343 /* Check to see if the string matches a language name.
2344 Note - we rely upon the alpha-sorted nature of the entries in
2345 the lang_names array, specifically that shorter names appear
2346 before their longer variants. (i.e. C before C++). That way
2347 when we are attempting to match --help=c for example we will
2348 match with C first and not C++. */
2349 for (i = 0, lang_flag = 0; i < cl_lang_count; i++)
2350 if (strncasecmp (a, lang_names[i], len) == 0)
2352 lang_flag = 1U << i;
2353 break;
2356 if (specific_flag != 0)
2358 if (lang_flag == 0)
2359 *pflags |= specific_flag;
2360 else
2362 /* The option's argument matches both the start of a
2363 language name and the start of an option class name.
2364 We have a special case for when the user has
2365 specified "--help=c", but otherwise we have to issue
2366 a warning. */
2367 if (strncasecmp (a, "c", len) == 0)
2368 *pflags |= lang_flag;
2369 else
2370 warning (0,
2371 "%<--help%> argument %q.*s is ambiguous, "
2372 "please be more specific",
2373 len, a);
2376 else if (lang_flag != 0)
2377 *pflags |= lang_flag;
2378 else
2379 warning (0,
2380 "unrecognized argument to %<--help=%> option: %q.*s",
2381 len, a);
2383 if (comma == NULL)
2384 break;
2385 a = comma + 1;
2388 /* We started using PerFunction/Optimization for parameters and
2389 a warning. We should exclude these from optimization options. */
2390 if (include_flags & CL_OPTIMIZATION)
2391 exclude_flags |= CL_WARNING;
2392 if (!(include_flags & CL_PARAMS))
2393 exclude_flags |= CL_PARAMS;
2395 if (include_flags)
2396 print_specific_help (include_flags, exclude_flags, 0, opts,
2397 lang_mask);
2400 /* Handle target- and language-independent options. Return zero to
2401 generate an "unknown option" message. Only options that need
2402 extra handling need to be listed here; if you simply want
2403 DECODED->value assigned to a variable, it happens automatically. */
2405 bool
2406 common_handle_option (struct gcc_options *opts,
2407 struct gcc_options *opts_set,
2408 const struct cl_decoded_option *decoded,
2409 unsigned int lang_mask, int kind ATTRIBUTE_UNUSED,
2410 location_t loc,
2411 const struct cl_option_handlers *handlers,
2412 diagnostic_context *dc,
2413 void (*target_option_override_hook) (void))
2415 size_t scode = decoded->opt_index;
2416 const char *arg = decoded->arg;
2417 HOST_WIDE_INT value = decoded->value;
2418 enum opt_code code = (enum opt_code) scode;
2420 gcc_assert (decoded->canonical_option_num_elements <= 2);
2422 switch (code)
2424 case OPT__help:
2426 unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
2427 unsigned int undoc_mask;
2428 unsigned int i;
2430 if (lang_mask == CL_DRIVER)
2431 break;
2433 undoc_mask = ((opts->x_verbose_flag | opts->x_extra_warnings)
2435 : CL_UNDOCUMENTED);
2436 target_option_override_hook ();
2437 /* First display any single language specific options. */
2438 for (i = 0; i < cl_lang_count; i++)
2439 print_specific_help
2440 (1U << i, (all_langs_mask & (~ (1U << i))) | undoc_mask, 0, opts,
2441 lang_mask);
2442 /* Next display any multi language specific options. */
2443 print_specific_help (0, undoc_mask, all_langs_mask, opts, lang_mask);
2444 /* Then display any remaining, non-language options. */
2445 for (i = CL_MIN_OPTION_CLASS; i <= CL_MAX_OPTION_CLASS; i <<= 1)
2446 if (i != CL_DRIVER)
2447 print_specific_help (i, undoc_mask, 0, opts, lang_mask);
2448 opts->x_exit_after_options = true;
2449 break;
2452 case OPT__target_help:
2453 if (lang_mask == CL_DRIVER)
2454 break;
2456 target_option_override_hook ();
2457 print_specific_help (CL_TARGET, CL_UNDOCUMENTED, 0, opts, lang_mask);
2458 opts->x_exit_after_options = true;
2459 break;
2461 case OPT__help_:
2463 help_option_arguments.safe_push (arg);
2464 opts->x_exit_after_options = true;
2465 break;
2468 case OPT__version:
2469 if (lang_mask == CL_DRIVER)
2470 break;
2472 opts->x_exit_after_options = true;
2473 break;
2475 case OPT__completion_:
2476 break;
2478 case OPT_fsanitize_:
2479 opts->x_flag_sanitize
2480 = parse_sanitizer_options (arg, loc, code,
2481 opts->x_flag_sanitize, value, true);
2483 /* Kernel ASan implies normal ASan but does not yet support
2484 all features. */
2485 if (opts->x_flag_sanitize & SANITIZE_KERNEL_ADDRESS)
2487 SET_OPTION_IF_UNSET (opts, opts_set,
2488 param_asan_instrumentation_with_call_threshold,
2490 SET_OPTION_IF_UNSET (opts, opts_set, param_asan_globals, 0);
2491 SET_OPTION_IF_UNSET (opts, opts_set, param_asan_stack, 0);
2492 SET_OPTION_IF_UNSET (opts, opts_set, param_asan_protect_allocas, 0);
2493 SET_OPTION_IF_UNSET (opts, opts_set, param_asan_use_after_return, 0);
2495 if (opts->x_flag_sanitize & SANITIZE_KERNEL_HWADDRESS)
2497 SET_OPTION_IF_UNSET (opts, opts_set,
2498 param_hwasan_instrument_stack, 0);
2499 SET_OPTION_IF_UNSET (opts, opts_set,
2500 param_hwasan_random_frame_tag, 0);
2501 SET_OPTION_IF_UNSET (opts, opts_set,
2502 param_hwasan_instrument_allocas, 0);
2504 break;
2506 case OPT_fsanitize_recover_:
2507 opts->x_flag_sanitize_recover
2508 = parse_sanitizer_options (arg, loc, code,
2509 opts->x_flag_sanitize_recover, value, true);
2510 break;
2512 case OPT_fasan_shadow_offset_:
2513 /* Deferred. */
2514 break;
2516 case OPT_fsanitize_address_use_after_scope:
2517 opts->x_flag_sanitize_address_use_after_scope = value;
2518 break;
2520 case OPT_fsanitize_recover:
2521 if (value)
2522 opts->x_flag_sanitize_recover
2523 |= (SANITIZE_UNDEFINED | SANITIZE_UNDEFINED_NONDEFAULT)
2524 & ~(SANITIZE_UNREACHABLE | SANITIZE_RETURN);
2525 else
2526 opts->x_flag_sanitize_recover
2527 &= ~(SANITIZE_UNDEFINED | SANITIZE_UNDEFINED_NONDEFAULT);
2528 break;
2530 case OPT_fsanitize_coverage_:
2531 opts->x_flag_sanitize_coverage = value;
2532 break;
2534 case OPT_O:
2535 case OPT_Os:
2536 case OPT_Ofast:
2537 case OPT_Og:
2538 /* Currently handled in a prescan. */
2539 break;
2541 case OPT_Werror:
2542 dc->warning_as_error_requested = value;
2543 break;
2545 case OPT_Werror_:
2546 if (lang_mask == CL_DRIVER)
2547 break;
2549 enable_warning_as_error (arg, value, lang_mask, handlers,
2550 opts, opts_set, loc, dc);
2551 break;
2553 case OPT_Wfatal_errors:
2554 dc->fatal_errors = value;
2555 break;
2557 case OPT_Wstack_usage_:
2558 opts->x_flag_stack_usage_info = value != -1;
2559 break;
2561 case OPT_Wstrict_aliasing:
2562 set_Wstrict_aliasing (opts, value);
2563 break;
2565 case OPT_Wstrict_overflow:
2566 opts->x_warn_strict_overflow = (value
2567 ? (int) WARN_STRICT_OVERFLOW_CONDITIONAL
2568 : 0);
2569 break;
2571 case OPT_Wsystem_headers:
2572 dc->dc_warn_system_headers = value;
2573 break;
2575 case OPT_aux_info:
2576 opts->x_flag_gen_aux_info = 1;
2577 break;
2579 case OPT_d:
2580 decode_d_option (arg, opts, loc, dc);
2581 break;
2583 case OPT_fcall_used_:
2584 case OPT_fcall_saved_:
2585 /* Deferred. */
2586 break;
2588 case OPT_fdbg_cnt_:
2589 /* Deferred. */
2590 break;
2592 case OPT_fdebug_prefix_map_:
2593 case OPT_ffile_prefix_map_:
2594 /* Deferred. */
2595 break;
2597 case OPT_fcallgraph_info:
2598 opts->x_flag_callgraph_info = CALLGRAPH_INFO_NAKED;
2599 break;
2601 case OPT_fcallgraph_info_:
2603 char *my_arg, *p;
2604 my_arg = xstrdup (arg);
2605 p = strtok (my_arg, ",");
2606 while (p)
2608 if (strcmp (p, "su") == 0)
2610 opts->x_flag_callgraph_info |= CALLGRAPH_INFO_STACK_USAGE;
2611 opts->x_flag_stack_usage_info = true;
2613 else if (strcmp (p, "da") == 0)
2614 opts->x_flag_callgraph_info |= CALLGRAPH_INFO_DYNAMIC_ALLOC;
2615 else
2616 return 0;
2617 p = strtok (NULL, ",");
2619 free (my_arg);
2621 break;
2623 case OPT_fdiagnostics_show_location_:
2624 diagnostic_prefixing_rule (dc) = (diagnostic_prefixing_rule_t) value;
2625 break;
2627 case OPT_fdiagnostics_show_caret:
2628 dc->show_caret = value;
2629 break;
2631 case OPT_fdiagnostics_show_labels:
2632 dc->show_labels_p = value;
2633 break;
2635 case OPT_fdiagnostics_show_line_numbers:
2636 dc->show_line_numbers_p = value;
2637 break;
2639 case OPT_fdiagnostics_color_:
2640 diagnostic_color_init (dc, value);
2641 break;
2643 case OPT_fdiagnostics_urls_:
2644 diagnostic_urls_init (dc, value);
2645 break;
2647 case OPT_fdiagnostics_format_:
2648 diagnostic_output_format_init (dc,
2649 (enum diagnostics_output_format)value);
2650 break;
2652 case OPT_fdiagnostics_parseable_fixits:
2653 dc->extra_output_kind = (value
2654 ? EXTRA_DIAGNOSTIC_OUTPUT_fixits_v1
2655 : EXTRA_DIAGNOSTIC_OUTPUT_none);
2656 break;
2658 case OPT_fdiagnostics_column_unit_:
2659 dc->column_unit = (enum diagnostics_column_unit)value;
2660 break;
2662 case OPT_fdiagnostics_column_origin_:
2663 dc->column_origin = value;
2664 break;
2666 case OPT_fdiagnostics_show_cwe:
2667 dc->show_cwe = value;
2668 break;
2670 case OPT_fdiagnostics_path_format_:
2671 dc->path_format = (enum diagnostic_path_format)value;
2672 break;
2674 case OPT_fdiagnostics_show_path_depths:
2675 dc->show_path_depths = value;
2676 break;
2678 case OPT_fdiagnostics_show_option:
2679 dc->show_option_requested = value;
2680 break;
2682 case OPT_fdiagnostics_minimum_margin_width_:
2683 dc->min_margin_width = value;
2684 break;
2686 case OPT_fdump_:
2687 /* Deferred. */
2688 break;
2690 case OPT_ffast_math:
2691 set_fast_math_flags (opts, value);
2692 break;
2694 case OPT_funsafe_math_optimizations:
2695 set_unsafe_math_optimizations_flags (opts, value);
2696 break;
2698 case OPT_ffixed_:
2699 /* Deferred. */
2700 break;
2702 case OPT_finline_limit_:
2703 SET_OPTION_IF_UNSET (opts, opts_set, param_max_inline_insns_single,
2704 value / 2);
2705 SET_OPTION_IF_UNSET (opts, opts_set, param_max_inline_insns_auto,
2706 value / 2);
2707 break;
2709 case OPT_finstrument_functions_exclude_function_list_:
2710 add_comma_separated_to_vector
2711 (&opts->x_flag_instrument_functions_exclude_functions, arg);
2712 break;
2714 case OPT_finstrument_functions_exclude_file_list_:
2715 add_comma_separated_to_vector
2716 (&opts->x_flag_instrument_functions_exclude_files, arg);
2717 break;
2719 case OPT_fmessage_length_:
2720 pp_set_line_maximum_length (dc->printer, value);
2721 diagnostic_set_caret_max_width (dc, value);
2722 break;
2724 case OPT_fopt_info:
2725 case OPT_fopt_info_:
2726 /* Deferred. */
2727 break;
2729 case OPT_foffload_options_:
2730 /* Deferred. */
2731 break;
2733 case OPT_foffload_abi_:
2734 #ifdef ACCEL_COMPILER
2735 /* Handled in the 'mkoffload's. */
2736 #else
2737 error_at (loc, "%<-foffload-abi%> option can be specified only for "
2738 "offload compiler");
2739 #endif
2740 break;
2742 case OPT_fpack_struct_:
2743 if (value <= 0 || (value & (value - 1)) || value > 16)
2744 error_at (loc,
2745 "structure alignment must be a small power of two, not %wu",
2746 value);
2747 else
2748 opts->x_initial_max_fld_align = value;
2749 break;
2751 case OPT_fplugin_:
2752 case OPT_fplugin_arg_:
2753 /* Deferred. */
2754 break;
2756 case OPT_fprofile_use_:
2757 opts->x_profile_data_prefix = xstrdup (arg);
2758 opts->x_flag_profile_use = true;
2759 value = true;
2760 /* No break here - do -fprofile-use processing. */
2761 /* FALLTHRU */
2762 case OPT_fprofile_use:
2763 enable_fdo_optimizations (opts, opts_set, value);
2764 SET_OPTION_IF_UNSET (opts, opts_set, flag_profile_reorder_functions,
2765 value);
2766 /* Indirect call profiling should do all useful transformations
2767 speculative devirtualization does. */
2768 if (opts->x_flag_value_profile_transformations)
2769 SET_OPTION_IF_UNSET (opts, opts_set, flag_devirtualize_speculatively,
2770 false);
2771 break;
2773 case OPT_fauto_profile_:
2774 opts->x_auto_profile_file = xstrdup (arg);
2775 opts->x_flag_auto_profile = true;
2776 value = true;
2777 /* No break here - do -fauto-profile processing. */
2778 /* FALLTHRU */
2779 case OPT_fauto_profile:
2780 enable_fdo_optimizations (opts, opts_set, value);
2781 SET_OPTION_IF_UNSET (opts, opts_set, flag_profile_correction, value);
2782 SET_OPTION_IF_UNSET (opts, opts_set,
2783 param_early_inliner_max_iterations, 10);
2784 break;
2786 case OPT_fprofile_generate_:
2787 opts->x_profile_data_prefix = xstrdup (arg);
2788 value = true;
2789 /* No break here - do -fprofile-generate processing. */
2790 /* FALLTHRU */
2791 case OPT_fprofile_generate:
2792 SET_OPTION_IF_UNSET (opts, opts_set, profile_arc_flag, value);
2793 SET_OPTION_IF_UNSET (opts, opts_set, flag_profile_values, value);
2794 SET_OPTION_IF_UNSET (opts, opts_set, flag_inline_functions, value);
2795 SET_OPTION_IF_UNSET (opts, opts_set, flag_ipa_bit_cp, value);
2796 break;
2798 case OPT_fprofile_info_section:
2799 opts->x_profile_info_section = ".gcov_info";
2800 break;
2802 case OPT_fpatchable_function_entry_:
2804 HOST_WIDE_INT patch_area_size, patch_area_start;
2805 parse_and_check_patch_area (arg, true, &patch_area_size,
2806 &patch_area_start);
2808 break;
2810 case OPT_ftree_vectorize:
2811 /* Automatically sets -ftree-loop-vectorize and
2812 -ftree-slp-vectorize. Nothing more to do here. */
2813 break;
2814 case OPT_fzero_call_used_regs_:
2815 opts->x_flag_zero_call_used_regs
2816 = parse_zero_call_used_regs_options (arg);
2817 break;
2819 case OPT_fshow_column:
2820 dc->show_column = value;
2821 break;
2823 case OPT_frandom_seed:
2824 /* The real switch is -fno-random-seed. */
2825 if (value)
2826 return false;
2827 /* Deferred. */
2828 break;
2830 case OPT_frandom_seed_:
2831 /* Deferred. */
2832 break;
2834 case OPT_fsched_verbose_:
2835 #ifdef INSN_SCHEDULING
2836 /* Handled with Var in common.opt. */
2837 break;
2838 #else
2839 return false;
2840 #endif
2842 case OPT_fsched_stalled_insns_:
2843 opts->x_flag_sched_stalled_insns = value;
2844 if (opts->x_flag_sched_stalled_insns == 0)
2845 opts->x_flag_sched_stalled_insns = -1;
2846 break;
2848 case OPT_fsched_stalled_insns_dep_:
2849 opts->x_flag_sched_stalled_insns_dep = value;
2850 break;
2852 case OPT_fstack_check_:
2853 if (!strcmp (arg, "no"))
2854 opts->x_flag_stack_check = NO_STACK_CHECK;
2855 else if (!strcmp (arg, "generic"))
2856 /* This is the old stack checking method. */
2857 opts->x_flag_stack_check = STACK_CHECK_BUILTIN
2858 ? FULL_BUILTIN_STACK_CHECK
2859 : GENERIC_STACK_CHECK;
2860 else if (!strcmp (arg, "specific"))
2861 /* This is the new stack checking method. */
2862 opts->x_flag_stack_check = STACK_CHECK_BUILTIN
2863 ? FULL_BUILTIN_STACK_CHECK
2864 : STACK_CHECK_STATIC_BUILTIN
2865 ? STATIC_BUILTIN_STACK_CHECK
2866 : GENERIC_STACK_CHECK;
2867 else
2868 warning_at (loc, 0, "unknown stack check parameter %qs", arg);
2869 break;
2871 case OPT_fstack_limit:
2872 /* The real switch is -fno-stack-limit. */
2873 if (value)
2874 return false;
2875 /* Deferred. */
2876 break;
2878 case OPT_fstack_limit_register_:
2879 case OPT_fstack_limit_symbol_:
2880 /* Deferred. */
2881 break;
2883 case OPT_fstack_usage:
2884 opts->x_flag_stack_usage = value;
2885 opts->x_flag_stack_usage_info = value != 0;
2886 break;
2888 case OPT_g:
2889 set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, arg, opts, opts_set,
2890 loc);
2891 break;
2893 case OPT_gbtf:
2894 set_debug_level (BTF_DEBUG, false, arg, opts, opts_set, loc);
2895 /* set the debug level to level 2, but if already at level 3,
2896 don't lower it. */
2897 if (opts->x_debug_info_level < DINFO_LEVEL_NORMAL)
2898 opts->x_debug_info_level = DINFO_LEVEL_NORMAL;
2899 break;
2901 case OPT_gctf:
2902 set_debug_level (CTF_DEBUG, false, arg, opts, opts_set, loc);
2903 /* CTF generation feeds off DWARF dies. For optimal CTF, switch debug
2904 info level to 2. If off or at level 1, set it to level 2, but if
2905 already at level 3, don't lower it. */
2906 if (opts->x_debug_info_level < DINFO_LEVEL_NORMAL
2907 && opts->x_ctf_debug_info_level > CTFINFO_LEVEL_NONE)
2908 opts->x_debug_info_level = DINFO_LEVEL_NORMAL;
2909 break;
2911 case OPT_gdwarf:
2912 if (arg && strlen (arg) != 0)
2914 error_at (loc, "%<-gdwarf%s%> is ambiguous; "
2915 "use %<-gdwarf-%s%> for DWARF version "
2916 "or %<-gdwarf%> %<-g%s%> for debug level", arg, arg, arg);
2917 break;
2919 else
2920 value = opts->x_dwarf_version;
2922 /* FALLTHRU */
2923 case OPT_gdwarf_:
2924 if (value < 2 || value > 5)
2925 error_at (loc, "dwarf version %wu is not supported", value);
2926 else
2927 opts->x_dwarf_version = value;
2928 set_debug_level (DWARF2_DEBUG, false, "", opts, opts_set, loc);
2929 break;
2931 case OPT_ggdb:
2932 set_debug_level (NO_DEBUG, 2, arg, opts, opts_set, loc);
2933 break;
2935 case OPT_gstabs:
2936 case OPT_gstabs_:
2937 set_debug_level (DBX_DEBUG, code == OPT_gstabs_, arg, opts, opts_set,
2938 loc);
2939 break;
2941 case OPT_gvms:
2942 set_debug_level (VMS_DEBUG, false, arg, opts, opts_set, loc);
2943 break;
2945 case OPT_gxcoff:
2946 case OPT_gxcoff_:
2947 set_debug_level (XCOFF_DEBUG, code == OPT_gxcoff_, arg, opts, opts_set,
2948 loc);
2949 break;
2951 case OPT_gz:
2952 case OPT_gz_:
2953 /* Handled completely via specs. */
2954 break;
2956 case OPT_pedantic_errors:
2957 dc->pedantic_errors = 1;
2958 control_warning_option (OPT_Wpedantic, DK_ERROR, NULL, value,
2959 loc, lang_mask,
2960 handlers, opts, opts_set,
2961 dc);
2962 break;
2964 case OPT_flto:
2965 opts->x_flag_lto = value ? "" : NULL;
2966 break;
2968 case OPT_flto_:
2969 if (strcmp (arg, "none") != 0
2970 && strcmp (arg, "jobserver") != 0
2971 && strcmp (arg, "auto") != 0
2972 && atoi (arg) == 0)
2973 error_at (loc,
2974 "unrecognized argument to %<-flto=%> option: %qs", arg);
2975 break;
2977 case OPT_w:
2978 dc->dc_inhibit_warnings = true;
2979 break;
2981 case OPT_fmax_errors_:
2982 dc->max_errors = value;
2983 break;
2985 case OPT_fuse_ld_bfd:
2986 case OPT_fuse_ld_gold:
2987 case OPT_fuse_ld_lld:
2988 case OPT_fuse_linker_plugin:
2989 /* No-op. Used by the driver and passed to us because it starts with f.*/
2990 break;
2992 case OPT_fwrapv:
2993 if (value)
2994 opts->x_flag_trapv = 0;
2995 break;
2997 case OPT_ftrapv:
2998 if (value)
2999 opts->x_flag_wrapv = 0;
3000 break;
3002 case OPT_fstrict_overflow:
3003 opts->x_flag_wrapv = !value;
3004 opts->x_flag_wrapv_pointer = !value;
3005 if (!value)
3006 opts->x_flag_trapv = 0;
3007 break;
3009 case OPT_fipa_icf:
3010 opts->x_flag_ipa_icf_functions = value;
3011 opts->x_flag_ipa_icf_variables = value;
3012 break;
3014 case OPT_falign_loops_:
3015 check_alignment_argument (loc, arg, "loops",
3016 &opts->x_flag_align_loops,
3017 &opts->x_str_align_loops);
3018 break;
3020 case OPT_falign_jumps_:
3021 check_alignment_argument (loc, arg, "jumps",
3022 &opts->x_flag_align_jumps,
3023 &opts->x_str_align_jumps);
3024 break;
3026 case OPT_falign_labels_:
3027 check_alignment_argument (loc, arg, "labels",
3028 &opts->x_flag_align_labels,
3029 &opts->x_str_align_labels);
3030 break;
3032 case OPT_falign_functions_:
3033 check_alignment_argument (loc, arg, "functions",
3034 &opts->x_flag_align_functions,
3035 &opts->x_str_align_functions);
3036 break;
3038 case OPT_ftabstop_:
3039 /* It is documented that we silently ignore silly values. */
3040 if (value >= 1 && value <= 100)
3041 dc->tabstop = value;
3042 break;
3044 default:
3045 /* If the flag was handled in a standard way, assume the lack of
3046 processing here is intentional. */
3047 gcc_assert (option_flag_var (scode, opts));
3048 break;
3051 common_handle_option_auto (opts, opts_set, decoded, lang_mask, kind,
3052 loc, handlers, dc);
3053 return true;
3056 /* Used to set the level of strict aliasing warnings in OPTS,
3057 when no level is specified (i.e., when -Wstrict-aliasing, and not
3058 -Wstrict-aliasing=level was given).
3059 ONOFF is assumed to take value 1 when -Wstrict-aliasing is specified,
3060 and 0 otherwise. After calling this function, wstrict_aliasing will be
3061 set to the default value of -Wstrict_aliasing=level, currently 3. */
3062 static void
3063 set_Wstrict_aliasing (struct gcc_options *opts, int onoff)
3065 gcc_assert (onoff == 0 || onoff == 1);
3066 if (onoff != 0)
3067 opts->x_warn_strict_aliasing = 3;
3068 else
3069 opts->x_warn_strict_aliasing = 0;
3072 /* The following routines are useful in setting all the flags that
3073 -ffast-math and -fno-fast-math imply. */
3074 static void
3075 set_fast_math_flags (struct gcc_options *opts, int set)
3077 if (!opts->frontend_set_flag_unsafe_math_optimizations)
3079 opts->x_flag_unsafe_math_optimizations = set;
3080 set_unsafe_math_optimizations_flags (opts, set);
3082 if (!opts->frontend_set_flag_finite_math_only)
3083 opts->x_flag_finite_math_only = set;
3084 if (!opts->frontend_set_flag_errno_math)
3085 opts->x_flag_errno_math = !set;
3086 if (set)
3088 if (opts->frontend_set_flag_excess_precision == EXCESS_PRECISION_DEFAULT)
3089 opts->x_flag_excess_precision
3090 = set ? EXCESS_PRECISION_FAST : EXCESS_PRECISION_DEFAULT;
3091 if (!opts->frontend_set_flag_signaling_nans)
3092 opts->x_flag_signaling_nans = 0;
3093 if (!opts->frontend_set_flag_rounding_math)
3094 opts->x_flag_rounding_math = 0;
3095 if (!opts->frontend_set_flag_cx_limited_range)
3096 opts->x_flag_cx_limited_range = 1;
3100 /* When -funsafe-math-optimizations is set the following
3101 flags are set as well. */
3102 static void
3103 set_unsafe_math_optimizations_flags (struct gcc_options *opts, int set)
3105 if (!opts->frontend_set_flag_trapping_math)
3106 opts->x_flag_trapping_math = !set;
3107 if (!opts->frontend_set_flag_signed_zeros)
3108 opts->x_flag_signed_zeros = !set;
3109 if (!opts->frontend_set_flag_associative_math)
3110 opts->x_flag_associative_math = set;
3111 if (!opts->frontend_set_flag_reciprocal_math)
3112 opts->x_flag_reciprocal_math = set;
3115 /* Return true iff flags in OPTS are set as if -ffast-math. */
3116 bool
3117 fast_math_flags_set_p (const struct gcc_options *opts)
3119 return (!opts->x_flag_trapping_math
3120 && opts->x_flag_unsafe_math_optimizations
3121 && opts->x_flag_finite_math_only
3122 && !opts->x_flag_signed_zeros
3123 && !opts->x_flag_errno_math
3124 && opts->x_flag_excess_precision == EXCESS_PRECISION_FAST);
3127 /* Return true iff flags are set as if -ffast-math but using the flags stored
3128 in the struct cl_optimization structure. */
3129 bool
3130 fast_math_flags_struct_set_p (struct cl_optimization *opt)
3132 return (!opt->x_flag_trapping_math
3133 && opt->x_flag_unsafe_math_optimizations
3134 && opt->x_flag_finite_math_only
3135 && !opt->x_flag_signed_zeros
3136 && !opt->x_flag_errno_math);
3139 /* Handle a debug output -g switch for options OPTS
3140 (OPTS_SET->x_write_symbols storing whether a debug format was passed
3141 explicitly), location LOC. EXTENDED is true or false to support
3142 extended output (2 is special and means "-ggdb" was given). */
3143 static void
3144 set_debug_level (uint32_t dinfo, int extended, const char *arg,
3145 struct gcc_options *opts, struct gcc_options *opts_set,
3146 location_t loc)
3148 opts->x_use_gnu_debug_info_extensions = extended;
3150 if (dinfo == NO_DEBUG)
3152 if (opts->x_write_symbols == NO_DEBUG)
3154 opts->x_write_symbols = PREFERRED_DEBUGGING_TYPE;
3156 if (extended == 2)
3158 #if defined DWARF2_DEBUGGING_INFO || defined DWARF2_LINENO_DEBUGGING_INFO
3159 if (opts->x_write_symbols & CTF_DEBUG)
3160 opts->x_write_symbols |= DWARF2_DEBUG;
3161 else
3162 opts->x_write_symbols = DWARF2_DEBUG;
3163 #elif defined DBX_DEBUGGING_INFO
3164 opts->x_write_symbols = DBX_DEBUG;
3165 #endif
3168 if (opts->x_write_symbols == NO_DEBUG)
3169 warning_at (loc, 0, "target system does not support debug output");
3171 else if ((opts->x_write_symbols & CTF_DEBUG)
3172 || (opts->x_write_symbols & BTF_DEBUG))
3174 opts->x_write_symbols |= DWARF2_DEBUG;
3175 opts_set->x_write_symbols |= DWARF2_DEBUG;
3178 else
3180 /* Make and retain the choice if both CTF and DWARF debug info are to
3181 be generated. */
3182 if (((dinfo == DWARF2_DEBUG) || (dinfo == CTF_DEBUG))
3183 && ((opts->x_write_symbols == (DWARF2_DEBUG|CTF_DEBUG))
3184 || (opts->x_write_symbols == DWARF2_DEBUG)
3185 || (opts->x_write_symbols == CTF_DEBUG)))
3187 opts->x_write_symbols |= dinfo;
3188 opts_set->x_write_symbols |= dinfo;
3190 /* However, CTF and BTF are not allowed together at this time. */
3191 else if (((dinfo == DWARF2_DEBUG) || (dinfo == BTF_DEBUG))
3192 && ((opts->x_write_symbols == (DWARF2_DEBUG|BTF_DEBUG))
3193 || (opts->x_write_symbols == DWARF2_DEBUG)
3194 || (opts->x_write_symbols == BTF_DEBUG)))
3196 opts->x_write_symbols |= dinfo;
3197 opts_set->x_write_symbols |= dinfo;
3199 else
3201 /* Does it conflict with an already selected debug format? */
3202 if (opts_set->x_write_symbols != NO_DEBUG
3203 && opts->x_write_symbols != NO_DEBUG
3204 && dinfo != opts->x_write_symbols)
3206 gcc_assert (debug_set_count (dinfo) <= 1);
3207 error_at (loc, "debug format %qs conflicts with prior selection",
3208 debug_type_names[debug_set_to_format (dinfo)]);
3210 opts->x_write_symbols = dinfo;
3211 opts_set->x_write_symbols = dinfo;
3215 if (dinfo != BTF_DEBUG)
3217 /* A debug flag without a level defaults to level 2.
3218 If off or at level 1, set it to level 2, but if already
3219 at level 3, don't lower it. */
3220 if (*arg == '\0')
3222 if (dinfo == CTF_DEBUG)
3223 opts->x_ctf_debug_info_level = CTFINFO_LEVEL_NORMAL;
3224 else if (opts->x_debug_info_level < DINFO_LEVEL_NORMAL)
3225 opts->x_debug_info_level = DINFO_LEVEL_NORMAL;
3227 else
3229 int argval = integral_argument (arg);
3230 if (argval == -1)
3231 error_at (loc, "unrecognized debug output level %qs", arg);
3232 else if (argval > 3)
3233 error_at (loc, "debug output level %qs is too high", arg);
3234 else
3236 if (dinfo == CTF_DEBUG)
3237 opts->x_ctf_debug_info_level
3238 = (enum ctf_debug_info_levels) argval;
3239 else
3240 opts->x_debug_info_level = (enum debug_info_levels) argval;
3244 else if (*arg != '\0')
3245 error_at (loc, "unrecognized btf debug output level %qs", arg);
3248 /* Arrange to dump core on error for diagnostic context DC. (The
3249 regular error message is still printed first, except in the case of
3250 abort ().) */
3252 static void
3253 setup_core_dumping (diagnostic_context *dc)
3255 #ifdef SIGABRT
3256 signal (SIGABRT, SIG_DFL);
3257 #endif
3258 #if defined(HAVE_SETRLIMIT)
3260 struct rlimit rlim;
3261 if (getrlimit (RLIMIT_CORE, &rlim) != 0)
3262 fatal_error (input_location, "getting core file size maximum limit: %m");
3263 rlim.rlim_cur = rlim.rlim_max;
3264 if (setrlimit (RLIMIT_CORE, &rlim) != 0)
3265 fatal_error (input_location,
3266 "setting core file size limit to maximum: %m");
3268 #endif
3269 diagnostic_abort_on_error (dc);
3272 /* Parse a -d<ARG> command line switch for OPTS, location LOC,
3273 diagnostic context DC. */
3275 static void
3276 decode_d_option (const char *arg, struct gcc_options *opts,
3277 location_t loc, diagnostic_context *dc)
3279 int c;
3281 while (*arg)
3282 switch (c = *arg++)
3284 case 'A':
3285 opts->x_flag_debug_asm = 1;
3286 break;
3287 case 'p':
3288 opts->x_flag_print_asm_name = 1;
3289 break;
3290 case 'P':
3291 opts->x_flag_dump_rtl_in_asm = 1;
3292 opts->x_flag_print_asm_name = 1;
3293 break;
3294 case 'x':
3295 opts->x_rtl_dump_and_exit = 1;
3296 break;
3297 case 'D': /* These are handled by the preprocessor. */
3298 case 'I':
3299 case 'M':
3300 case 'N':
3301 case 'U':
3302 break;
3303 case 'H':
3304 setup_core_dumping (dc);
3305 break;
3306 case 'a':
3307 opts->x_flag_dump_all_passed = true;
3308 break;
3310 default:
3311 warning_at (loc, 0, "unrecognized gcc debugging option: %c", c);
3312 break;
3316 /* Enable (or disable if VALUE is 0) a warning option ARG (language
3317 mask LANG_MASK, option handlers HANDLERS) as an error for option
3318 structures OPTS and OPTS_SET, diagnostic context DC (possibly
3319 NULL), location LOC. This is used by -Werror=. */
3321 static void
3322 enable_warning_as_error (const char *arg, int value, unsigned int lang_mask,
3323 const struct cl_option_handlers *handlers,
3324 struct gcc_options *opts,
3325 struct gcc_options *opts_set,
3326 location_t loc, diagnostic_context *dc)
3328 char *new_option;
3329 int option_index;
3331 new_option = XNEWVEC (char, strlen (arg) + 2);
3332 new_option[0] = 'W';
3333 strcpy (new_option + 1, arg);
3334 option_index = find_opt (new_option, lang_mask);
3335 if (option_index == OPT_SPECIAL_unknown)
3337 option_proposer op;
3338 const char *hint = op.suggest_option (new_option);
3339 if (hint)
3340 error_at (loc, "%<-W%serror=%s%>: no option %<-%s%>;"
3341 " did you mean %<-%s%>?", value ? "" : "no-",
3342 arg, new_option, hint);
3343 else
3344 error_at (loc, "%<-W%serror=%s%>: no option %<-%s%>",
3345 value ? "" : "no-", arg, new_option);
3347 else if (!(cl_options[option_index].flags & CL_WARNING))
3348 error_at (loc, "%<-Werror=%s%>: %<-%s%> is not an option that "
3349 "controls warnings", arg, new_option);
3350 else
3352 const diagnostic_t kind = value ? DK_ERROR : DK_WARNING;
3353 const char *arg = NULL;
3355 if (cl_options[option_index].flags & CL_JOINED)
3356 arg = new_option + cl_options[option_index].opt_len;
3357 control_warning_option (option_index, (int) kind, arg, value,
3358 loc, lang_mask,
3359 handlers, opts, opts_set, dc);
3361 free (new_option);
3364 /* Return malloced memory for the name of the option OPTION_INDEX
3365 which enabled a diagnostic (context CONTEXT), originally of type
3366 ORIG_DIAG_KIND but possibly converted to DIAG_KIND by options such
3367 as -Werror. */
3369 char *
3370 option_name (diagnostic_context *context, int option_index,
3371 diagnostic_t orig_diag_kind, diagnostic_t diag_kind)
3373 if (option_index)
3375 /* A warning classified as an error. */
3376 if ((orig_diag_kind == DK_WARNING || orig_diag_kind == DK_PEDWARN)
3377 && diag_kind == DK_ERROR)
3378 return concat (cl_options[OPT_Werror_].opt_text,
3379 /* Skip over "-W". */
3380 cl_options[option_index].opt_text + 2,
3381 NULL);
3382 /* A warning with option. */
3383 else
3384 return xstrdup (cl_options[option_index].opt_text);
3386 /* A warning without option classified as an error. */
3387 else if ((orig_diag_kind == DK_WARNING || orig_diag_kind == DK_PEDWARN
3388 || diag_kind == DK_WARNING)
3389 && context->warning_as_error_requested)
3390 return xstrdup (cl_options[OPT_Werror].opt_text);
3391 else
3392 return NULL;
3395 /* Get the page within the documentation for this option. */
3397 static const char *
3398 get_option_html_page (int option_index)
3400 const cl_option *cl_opt = &cl_options[option_index];
3402 /* Analyzer options are on their own page. */
3403 if (strstr (cl_opt->opt_text, "analyzer-"))
3404 return "gcc/Static-Analyzer-Options.html";
3406 /* Handle -flto= option. */
3407 if (strstr (cl_opt->opt_text, "flto"))
3408 return "gcc/Optimize-Options.html";
3410 #ifdef CL_Fortran
3411 if ((cl_opt->flags & CL_Fortran) != 0
3412 /* If it is option common to both C/C++ and Fortran, it is documented
3413 in gcc/ rather than gfortran/ docs. */
3414 && (cl_opt->flags & CL_C) == 0
3415 #ifdef CL_CXX
3416 && (cl_opt->flags & CL_CXX) == 0
3417 #endif
3419 return "gfortran/Error-and-Warning-Options.html";
3420 #endif
3422 return "gcc/Warning-Options.html";
3425 /* Return malloced memory for a URL describing the option OPTION_INDEX
3426 which enabled a diagnostic (context CONTEXT). */
3428 char *
3429 get_option_url (diagnostic_context *, int option_index)
3431 if (option_index)
3432 return concat (/* DOCUMENTATION_ROOT_URL should be supplied via -D by
3433 the Makefile (see --with-documentation-root-url), and
3434 should have a trailing slash. */
3435 DOCUMENTATION_ROOT_URL,
3437 /* get_option_html_page will return something like
3438 "gcc/Warning-Options.html". */
3439 get_option_html_page (option_index),
3441 /* Expect an anchor of the form "index-Wfoo" e.g.
3442 <a name="index-Wformat"></a>, and thus an id within
3443 the URL of "#index-Wformat". */
3444 "#index", cl_options[option_index].opt_text,
3445 NULL);
3446 else
3447 return NULL;
3450 /* Return a heap allocated producer with command line options. */
3452 char *
3453 gen_command_line_string (cl_decoded_option *options,
3454 unsigned int options_count)
3456 auto_vec<const char *> switches;
3457 char *options_string, *tail;
3458 const char *p;
3459 size_t len = 0;
3461 for (unsigned i = 0; i < options_count; i++)
3462 switch (options[i].opt_index)
3464 case OPT_o:
3465 case OPT_d:
3466 case OPT_dumpbase:
3467 case OPT_dumpbase_ext:
3468 case OPT_dumpdir:
3469 case OPT_quiet:
3470 case OPT_version:
3471 case OPT_v:
3472 case OPT_w:
3473 case OPT_L:
3474 case OPT_D:
3475 case OPT_I:
3476 case OPT_U:
3477 case OPT_SPECIAL_unknown:
3478 case OPT_SPECIAL_ignore:
3479 case OPT_SPECIAL_warn_removed:
3480 case OPT_SPECIAL_program_name:
3481 case OPT_SPECIAL_input_file:
3482 case OPT_grecord_gcc_switches:
3483 case OPT_frecord_gcc_switches:
3484 case OPT__output_pch_:
3485 case OPT_fdiagnostics_show_location_:
3486 case OPT_fdiagnostics_show_option:
3487 case OPT_fdiagnostics_show_caret:
3488 case OPT_fdiagnostics_show_labels:
3489 case OPT_fdiagnostics_show_line_numbers:
3490 case OPT_fdiagnostics_color_:
3491 case OPT_fdiagnostics_format_:
3492 case OPT_fverbose_asm:
3493 case OPT____:
3494 case OPT__sysroot_:
3495 case OPT_nostdinc:
3496 case OPT_nostdinc__:
3497 case OPT_fpreprocessed:
3498 case OPT_fltrans_output_list_:
3499 case OPT_fresolution_:
3500 case OPT_fdebug_prefix_map_:
3501 case OPT_fmacro_prefix_map_:
3502 case OPT_ffile_prefix_map_:
3503 case OPT_fcompare_debug:
3504 case OPT_fchecking:
3505 case OPT_fchecking_:
3506 /* Ignore these. */
3507 continue;
3508 case OPT_flto_:
3510 const char *lto_canonical = "-flto";
3511 switches.safe_push (lto_canonical);
3512 len += strlen (lto_canonical) + 1;
3513 break;
3515 default:
3516 if (cl_options[options[i].opt_index].flags
3517 & CL_NO_DWARF_RECORD)
3518 continue;
3519 gcc_checking_assert (options[i].canonical_option[0][0] == '-');
3520 switch (options[i].canonical_option[0][1])
3522 case 'M':
3523 case 'i':
3524 case 'W':
3525 continue;
3526 case 'f':
3527 if (strncmp (options[i].canonical_option[0] + 2,
3528 "dump", 4) == 0)
3529 continue;
3530 break;
3531 default:
3532 break;
3534 switches.safe_push (options[i].orig_option_with_args_text);
3535 len += strlen (options[i].orig_option_with_args_text) + 1;
3536 break;
3539 options_string = XNEWVEC (char, len + 1);
3540 tail = options_string;
3542 unsigned i;
3543 FOR_EACH_VEC_ELT (switches, i, p)
3545 len = strlen (p);
3546 memcpy (tail, p, len);
3547 tail += len;
3548 if (i != switches.length () - 1)
3550 *tail = ' ';
3551 ++tail;
3555 *tail = '\0';
3556 return options_string;
3559 /* Return a heap allocated producer string including command line options. */
3561 char *
3562 gen_producer_string (const char *language_string, cl_decoded_option *options,
3563 unsigned int options_count)
3565 char *cmdline = gen_command_line_string (options, options_count);
3566 char *combined = concat (language_string, " ", version_string, " ",
3567 cmdline, NULL);
3568 free (cmdline);
3569 return combined;
3572 #if CHECKING_P
3574 namespace selftest {
3576 /* Verify that get_option_html_page works as expected. */
3578 static void
3579 test_get_option_html_page ()
3581 ASSERT_STREQ (get_option_html_page (OPT_Wcpp), "gcc/Warning-Options.html");
3582 ASSERT_STREQ (get_option_html_page (OPT_Wanalyzer_double_free),
3583 "gcc/Static-Analyzer-Options.html");
3584 #ifdef CL_Fortran
3585 ASSERT_STREQ (get_option_html_page (OPT_Wline_truncation),
3586 "gfortran/Error-and-Warning-Options.html");
3587 #endif
3590 /* Run all of the selftests within this file. */
3592 void
3593 opts_c_tests ()
3595 test_get_option_html_page ();
3598 } // namespace selftest
3600 #endif /* #if CHECKING_P */