typeck.c (cp_truthvalue_conversion): Add tsubst_flags_t parameter and use it in calls...
[official-gcc.git] / gcc / opts.c
blobaddebf1536556be58fae3d7aac51f4aa60ac8902
1 /* Command line option handling.
2 Copyright (C) 2002-2019 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"
36 static void set_Wstrict_aliasing (struct gcc_options *opts, int onoff);
38 /* Indexed by enum debug_info_type. */
39 const char *const debug_type_names[] =
41 "none", "stabs", "dwarf-2", "xcoff", "vms"
44 /* Parse the -femit-struct-debug-detailed option value
45 and set the flag variables. */
47 #define MATCH( prefix, string ) \
48 ((strncmp (prefix, string, sizeof prefix - 1) == 0) \
49 ? ((string += sizeof prefix - 1), 1) : 0)
51 void
52 set_struct_debug_option (struct gcc_options *opts, location_t loc,
53 const char *spec)
55 /* various labels for comparison */
56 static const char dfn_lbl[] = "dfn:", dir_lbl[] = "dir:", ind_lbl[] = "ind:";
57 static const char ord_lbl[] = "ord:", gen_lbl[] = "gen:";
58 static const char none_lbl[] = "none", any_lbl[] = "any";
59 static const char base_lbl[] = "base", sys_lbl[] = "sys";
61 enum debug_struct_file files = DINFO_STRUCT_FILE_ANY;
62 /* Default is to apply to as much as possible. */
63 enum debug_info_usage usage = DINFO_USAGE_NUM_ENUMS;
64 int ord = 1, gen = 1;
66 /* What usage? */
67 if (MATCH (dfn_lbl, spec))
68 usage = DINFO_USAGE_DFN;
69 else if (MATCH (dir_lbl, spec))
70 usage = DINFO_USAGE_DIR_USE;
71 else if (MATCH (ind_lbl, spec))
72 usage = DINFO_USAGE_IND_USE;
74 /* Generics or not? */
75 if (MATCH (ord_lbl, spec))
76 gen = 0;
77 else if (MATCH (gen_lbl, spec))
78 ord = 0;
80 /* What allowable environment? */
81 if (MATCH (none_lbl, spec))
82 files = DINFO_STRUCT_FILE_NONE;
83 else if (MATCH (any_lbl, spec))
84 files = DINFO_STRUCT_FILE_ANY;
85 else if (MATCH (sys_lbl, spec))
86 files = DINFO_STRUCT_FILE_SYS;
87 else if (MATCH (base_lbl, spec))
88 files = DINFO_STRUCT_FILE_BASE;
89 else
90 error_at (loc,
91 "argument %qs to %<-femit-struct-debug-detailed%> "
92 "not recognized",
93 spec);
95 /* Effect the specification. */
96 if (usage == DINFO_USAGE_NUM_ENUMS)
98 if (ord)
100 opts->x_debug_struct_ordinary[DINFO_USAGE_DFN] = files;
101 opts->x_debug_struct_ordinary[DINFO_USAGE_DIR_USE] = files;
102 opts->x_debug_struct_ordinary[DINFO_USAGE_IND_USE] = files;
104 if (gen)
106 opts->x_debug_struct_generic[DINFO_USAGE_DFN] = files;
107 opts->x_debug_struct_generic[DINFO_USAGE_DIR_USE] = files;
108 opts->x_debug_struct_generic[DINFO_USAGE_IND_USE] = files;
111 else
113 if (ord)
114 opts->x_debug_struct_ordinary[usage] = files;
115 if (gen)
116 opts->x_debug_struct_generic[usage] = files;
119 if (*spec == ',')
120 set_struct_debug_option (opts, loc, spec+1);
121 else
123 /* No more -femit-struct-debug-detailed specifications.
124 Do final checks. */
125 if (*spec != '\0')
126 error_at (loc,
127 "argument %qs to %<-femit-struct-debug-detailed%> unknown",
128 spec);
129 if (opts->x_debug_struct_ordinary[DINFO_USAGE_DIR_USE]
130 < opts->x_debug_struct_ordinary[DINFO_USAGE_IND_USE]
131 || opts->x_debug_struct_generic[DINFO_USAGE_DIR_USE]
132 < opts->x_debug_struct_generic[DINFO_USAGE_IND_USE])
133 error_at (loc,
134 "%<-femit-struct-debug-detailed=dir:...%> must allow "
135 "at least as much as "
136 "%<-femit-struct-debug-detailed=ind:...%>");
140 /* Strip off a legitimate source ending from the input string NAME of
141 length LEN. Rather than having to know the names used by all of
142 our front ends, we strip off an ending of a period followed by
143 up to fource characters. (C++ uses ".cpp".) */
145 void
146 strip_off_ending (char *name, int len)
148 int i;
149 for (i = 2; i < 5 && len > i; i++)
151 if (name[len - i] == '.')
153 name[len - i] = '\0';
154 break;
159 /* Find the base name of a path, stripping off both directories and
160 a single final extension. */
162 base_of_path (const char *path, const char **base_out)
164 const char *base = path;
165 const char *dot = 0;
166 const char *p = path;
167 char c = *p;
168 while (c)
170 if (IS_DIR_SEPARATOR (c))
172 base = p + 1;
173 dot = 0;
175 else if (c == '.')
176 dot = p;
177 c = *++p;
179 if (!dot)
180 dot = p;
181 *base_out = base;
182 return dot - base;
185 /* What to print when a switch has no documentation. */
186 static const char undocumented_msg[] = N_("This option lacks documentation.");
187 static const char use_diagnosed_msg[] = N_("Uses of this option are diagnosed.");
189 typedef char *char_p; /* For DEF_VEC_P. */
191 static void set_debug_level (enum debug_info_type type, int extended,
192 const char *arg, struct gcc_options *opts,
193 struct gcc_options *opts_set,
194 location_t loc);
195 static void set_fast_math_flags (struct gcc_options *opts, int set);
196 static void decode_d_option (const char *arg, struct gcc_options *opts,
197 location_t loc, diagnostic_context *dc);
198 static void set_unsafe_math_optimizations_flags (struct gcc_options *opts,
199 int set);
200 static void enable_warning_as_error (const char *arg, int value,
201 unsigned int lang_mask,
202 const struct cl_option_handlers *handlers,
203 struct gcc_options *opts,
204 struct gcc_options *opts_set,
205 location_t loc,
206 diagnostic_context *dc);
208 /* Handle a back-end option; arguments and return value as for
209 handle_option. */
211 bool
212 target_handle_option (struct gcc_options *opts,
213 struct gcc_options *opts_set,
214 const struct cl_decoded_option *decoded,
215 unsigned int lang_mask ATTRIBUTE_UNUSED, int kind,
216 location_t loc,
217 const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED,
218 diagnostic_context *dc, void (*) (void))
220 gcc_assert (dc == global_dc);
221 gcc_assert (kind == DK_UNSPECIFIED);
222 return targetm_common.handle_option (opts, opts_set, decoded, loc);
225 /* Add comma-separated strings to a char_p vector. */
227 static void
228 add_comma_separated_to_vector (void **pvec, const char *arg)
230 char *tmp;
231 char *r;
232 char *w;
233 char *token_start;
234 vec<char_p> *v = (vec<char_p> *) *pvec;
236 vec_check_alloc (v, 1);
238 /* We never free this string. */
239 tmp = xstrdup (arg);
241 r = tmp;
242 w = tmp;
243 token_start = tmp;
245 while (*r != '\0')
247 if (*r == ',')
249 *w++ = '\0';
250 ++r;
251 v->safe_push (token_start);
252 token_start = w;
254 if (*r == '\\' && r[1] == ',')
256 *w++ = ',';
257 r += 2;
259 else
260 *w++ = *r++;
263 *w = '\0';
264 if (*token_start != '\0')
265 v->safe_push (token_start);
267 *pvec = v;
270 /* Initialize opts_obstack. */
272 void
273 init_opts_obstack (void)
275 gcc_obstack_init (&opts_obstack);
278 /* Initialize OPTS and OPTS_SET before using them in parsing options. */
280 void
281 init_options_struct (struct gcc_options *opts, struct gcc_options *opts_set)
283 /* Ensure that opts_obstack has already been initialized by the time
284 that we initialize any gcc_options instances (PR jit/68446). */
285 gcc_assert (opts_obstack.chunk_size > 0);
287 *opts = global_options_init;
289 if (opts_set)
290 memset (opts_set, 0, sizeof (*opts_set));
292 /* Initialize whether `char' is signed. */
293 opts->x_flag_signed_char = DEFAULT_SIGNED_CHAR;
294 /* Set this to a special "uninitialized" value. The actual default
295 is set after target options have been processed. */
296 opts->x_flag_short_enums = 2;
298 /* Initialize target_flags before default_options_optimization
299 so the latter can modify it. */
300 opts->x_target_flags = targetm_common.default_target_flags;
302 /* Some targets have ABI-specified unwind tables. */
303 opts->x_flag_unwind_tables = targetm_common.unwind_tables_default;
305 /* Some targets have other target-specific initialization. */
306 targetm_common.option_init_struct (opts);
309 /* If indicated by the optimization level LEVEL (-Os if SIZE is set,
310 -Ofast if FAST is set, -Og if DEBUG is set), apply the option DEFAULT_OPT
311 to OPTS and OPTS_SET, diagnostic context DC, location LOC, with language
312 mask LANG_MASK and option handlers HANDLERS. */
314 static void
315 maybe_default_option (struct gcc_options *opts,
316 struct gcc_options *opts_set,
317 const struct default_options *default_opt,
318 int level, bool size, bool fast, bool debug,
319 unsigned int lang_mask,
320 const struct cl_option_handlers *handlers,
321 location_t loc,
322 diagnostic_context *dc)
324 const struct cl_option *option = &cl_options[default_opt->opt_index];
325 bool enabled;
327 if (size)
328 gcc_assert (level == 2);
329 if (fast)
330 gcc_assert (level == 3);
331 if (debug)
332 gcc_assert (level == 1);
334 switch (default_opt->levels)
336 case OPT_LEVELS_ALL:
337 enabled = true;
338 break;
340 case OPT_LEVELS_0_ONLY:
341 enabled = (level == 0);
342 break;
344 case OPT_LEVELS_1_PLUS:
345 enabled = (level >= 1);
346 break;
348 case OPT_LEVELS_1_PLUS_SPEED_ONLY:
349 enabled = (level >= 1 && !size && !debug);
350 break;
352 case OPT_LEVELS_1_PLUS_NOT_DEBUG:
353 enabled = (level >= 1 && !debug);
354 break;
356 case OPT_LEVELS_2_PLUS:
357 enabled = (level >= 2);
358 break;
360 case OPT_LEVELS_2_PLUS_SPEED_ONLY:
361 enabled = (level >= 2 && !size && !debug);
362 break;
364 case OPT_LEVELS_3_PLUS:
365 enabled = (level >= 3);
366 break;
368 case OPT_LEVELS_3_PLUS_AND_SIZE:
369 enabled = (level >= 3 || size);
370 break;
372 case OPT_LEVELS_SIZE:
373 enabled = size;
374 break;
376 case OPT_LEVELS_FAST:
377 enabled = fast;
378 break;
380 case OPT_LEVELS_NONE:
381 default:
382 gcc_unreachable ();
385 if (enabled)
386 handle_generated_option (opts, opts_set, default_opt->opt_index,
387 default_opt->arg, default_opt->value,
388 lang_mask, DK_UNSPECIFIED, loc,
389 handlers, true, dc);
390 else if (default_opt->arg == NULL
391 && !option->cl_reject_negative
392 && !(option->flags & CL_PARAMS))
393 handle_generated_option (opts, opts_set, default_opt->opt_index,
394 default_opt->arg, !default_opt->value,
395 lang_mask, DK_UNSPECIFIED, loc,
396 handlers, true, dc);
399 /* As indicated by the optimization level LEVEL (-Os if SIZE is set,
400 -Ofast if FAST is set), apply the options in array DEFAULT_OPTS to
401 OPTS and OPTS_SET, diagnostic context DC, location LOC, with
402 language mask LANG_MASK and option handlers HANDLERS. */
404 static void
405 maybe_default_options (struct gcc_options *opts,
406 struct gcc_options *opts_set,
407 const struct default_options *default_opts,
408 int level, bool size, bool fast, bool debug,
409 unsigned int lang_mask,
410 const struct cl_option_handlers *handlers,
411 location_t loc,
412 diagnostic_context *dc)
414 size_t i;
416 for (i = 0; default_opts[i].levels != OPT_LEVELS_NONE; i++)
417 maybe_default_option (opts, opts_set, &default_opts[i],
418 level, size, fast, debug,
419 lang_mask, handlers, loc, dc);
422 /* Table of options enabled by default at different levels.
423 Please keep this list sorted by level and alphabetized within
424 each level; this makes it easier to keep the documentation
425 in sync. */
427 static const struct default_options default_options_table[] =
429 /* -O1 and -Og optimizations. */
430 { OPT_LEVELS_1_PLUS, OPT_fcombine_stack_adjustments, NULL, 1 },
431 { OPT_LEVELS_1_PLUS, OPT_fcompare_elim, NULL, 1 },
432 { OPT_LEVELS_1_PLUS, OPT_fcprop_registers, NULL, 1 },
433 { OPT_LEVELS_1_PLUS, OPT_fdefer_pop, NULL, 1 },
434 { OPT_LEVELS_1_PLUS, OPT_fforward_propagate, NULL, 1 },
435 { OPT_LEVELS_1_PLUS, OPT_fguess_branch_probability, NULL, 1 },
436 { OPT_LEVELS_1_PLUS, OPT_fipa_profile, NULL, 1 },
437 { OPT_LEVELS_1_PLUS, OPT_fipa_pure_const, NULL, 1 },
438 { OPT_LEVELS_1_PLUS, OPT_fipa_reference, NULL, 1 },
439 { OPT_LEVELS_1_PLUS, OPT_fipa_reference_addressable, NULL, 1 },
440 { OPT_LEVELS_1_PLUS, OPT_fmerge_constants, NULL, 1 },
441 { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
442 { OPT_LEVELS_1_PLUS, OPT_freorder_blocks, NULL, 1 },
443 { OPT_LEVELS_1_PLUS, OPT_fshrink_wrap, NULL, 1 },
444 { OPT_LEVELS_1_PLUS, OPT_fsplit_wide_types, NULL, 1 },
445 { OPT_LEVELS_1_PLUS, OPT_ftree_builtin_call_dce, NULL, 1 },
446 { OPT_LEVELS_1_PLUS, OPT_ftree_ccp, NULL, 1 },
447 { OPT_LEVELS_1_PLUS, OPT_ftree_ch, NULL, 1 },
448 { OPT_LEVELS_1_PLUS, OPT_ftree_coalesce_vars, NULL, 1 },
449 { OPT_LEVELS_1_PLUS, OPT_ftree_copy_prop, NULL, 1 },
450 { OPT_LEVELS_1_PLUS, OPT_ftree_dce, NULL, 1 },
451 { OPT_LEVELS_1_PLUS, OPT_ftree_dominator_opts, NULL, 1 },
452 { OPT_LEVELS_1_PLUS, OPT_ftree_fre, NULL, 1 },
453 { OPT_LEVELS_1_PLUS, OPT_ftree_sink, NULL, 1 },
454 { OPT_LEVELS_1_PLUS, OPT_ftree_slsr, NULL, 1 },
455 { OPT_LEVELS_1_PLUS, OPT_ftree_ter, NULL, 1 },
457 /* -O1 (and not -Og) optimizations. */
458 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fbranch_count_reg, NULL, 1 },
459 #if DELAY_SLOTS
460 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fdelayed_branch, NULL, 1 },
461 #endif
462 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fdse, NULL, 1 },
463 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fif_conversion, NULL, 1 },
464 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fif_conversion2, NULL, 1 },
465 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_finline_functions_called_once, NULL, 1 },
466 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fmove_loop_invariants, NULL, 1 },
467 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fssa_phiopt, NULL, 1 },
468 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_bit_ccp, NULL, 1 },
469 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_dse, NULL, 1 },
470 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_pta, NULL, 1 },
471 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_sra, NULL, 1 },
473 /* -O2 and -Os optimizations. */
474 { OPT_LEVELS_2_PLUS, OPT_fcaller_saves, NULL, 1 },
475 { OPT_LEVELS_2_PLUS, OPT_fcode_hoisting, NULL, 1 },
476 { OPT_LEVELS_2_PLUS, OPT_fcrossjumping, NULL, 1 },
477 { OPT_LEVELS_2_PLUS, OPT_fcse_follow_jumps, NULL, 1 },
478 { OPT_LEVELS_2_PLUS, OPT_fdevirtualize, NULL, 1 },
479 { OPT_LEVELS_2_PLUS, OPT_fdevirtualize_speculatively, NULL, 1 },
480 { OPT_LEVELS_2_PLUS, OPT_fexpensive_optimizations, NULL, 1 },
481 { OPT_LEVELS_2_PLUS, OPT_ffinite_loops, NULL, 1 },
482 { OPT_LEVELS_2_PLUS, OPT_fgcse, NULL, 1 },
483 { OPT_LEVELS_2_PLUS, OPT_fhoist_adjacent_loads, NULL, 1 },
484 { OPT_LEVELS_2_PLUS, OPT_findirect_inlining, NULL, 1 },
485 { OPT_LEVELS_2_PLUS, OPT_finline_small_functions, NULL, 1 },
486 { OPT_LEVELS_2_PLUS, OPT_fipa_bit_cp, NULL, 1 },
487 { OPT_LEVELS_2_PLUS, OPT_fipa_cp, NULL, 1 },
488 { OPT_LEVELS_2_PLUS, OPT_fipa_icf, NULL, 1 },
489 { OPT_LEVELS_2_PLUS, OPT_fipa_ra, NULL, 1 },
490 { OPT_LEVELS_2_PLUS, OPT_fipa_sra, NULL, 1 },
491 { OPT_LEVELS_2_PLUS, OPT_fipa_vrp, NULL, 1 },
492 { OPT_LEVELS_2_PLUS, OPT_fisolate_erroneous_paths_dereference, NULL, 1 },
493 { OPT_LEVELS_2_PLUS, OPT_flra_remat, NULL, 1 },
494 { OPT_LEVELS_2_PLUS, OPT_foptimize_sibling_calls, NULL, 1 },
495 { OPT_LEVELS_2_PLUS, OPT_fpartial_inlining, NULL, 1 },
496 { OPT_LEVELS_2_PLUS, OPT_fpeephole2, NULL, 1 },
497 { OPT_LEVELS_2_PLUS, OPT_freorder_functions, NULL, 1 },
498 { OPT_LEVELS_2_PLUS, OPT_frerun_cse_after_loop, NULL, 1 },
499 #ifdef INSN_SCHEDULING
500 { OPT_LEVELS_2_PLUS, OPT_fschedule_insns2, NULL, 1 },
501 #endif
502 { OPT_LEVELS_2_PLUS, OPT_fstrict_aliasing, NULL, 1 },
503 { OPT_LEVELS_2_PLUS, OPT_fstore_merging, NULL, 1 },
504 { OPT_LEVELS_2_PLUS, OPT_fthread_jumps, NULL, 1 },
505 { OPT_LEVELS_2_PLUS, OPT_ftree_pre, NULL, 1 },
506 { OPT_LEVELS_2_PLUS, OPT_ftree_switch_conversion, NULL, 1 },
507 { OPT_LEVELS_2_PLUS, OPT_ftree_tail_merge, NULL, 1 },
508 { OPT_LEVELS_2_PLUS, OPT_ftree_vrp, NULL, 1 },
509 { OPT_LEVELS_2_PLUS, OPT_fvect_cost_model_, NULL, VECT_COST_MODEL_CHEAP },
510 { OPT_LEVELS_2_PLUS, OPT_finline_functions, NULL, 1 },
512 /* -O2 and above optimizations, but not -Os or -Og. */
513 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_falign_functions, NULL, 1 },
514 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_falign_jumps, NULL, 1 },
515 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_falign_labels, NULL, 1 },
516 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_falign_loops, NULL, 1 },
517 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_foptimize_strlen, NULL, 1 },
518 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_freorder_blocks_algorithm_, NULL,
519 REORDER_BLOCKS_ALGORITHM_STC },
520 #ifdef INSN_SCHEDULING
521 /* Only run the pre-regalloc scheduling pass if optimizing for speed. */
522 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_fschedule_insns, NULL, 1 },
523 #endif
525 /* -O3 and -Os optimizations. */
527 /* -O3 optimizations. */
528 { OPT_LEVELS_3_PLUS, OPT_fgcse_after_reload, NULL, 1 },
529 { OPT_LEVELS_3_PLUS, OPT_fipa_cp_clone, NULL, 1 },
530 { OPT_LEVELS_3_PLUS, OPT_floop_interchange, NULL, 1 },
531 { OPT_LEVELS_3_PLUS, OPT_floop_unroll_and_jam, NULL, 1 },
532 { OPT_LEVELS_3_PLUS, OPT_fpeel_loops, NULL, 1 },
533 { OPT_LEVELS_3_PLUS, OPT_fpredictive_commoning, NULL, 1 },
534 { OPT_LEVELS_3_PLUS, OPT_fsplit_loops, NULL, 1 },
535 { OPT_LEVELS_3_PLUS, OPT_fsplit_paths, NULL, 1 },
536 { OPT_LEVELS_2_PLUS, OPT_ftree_loop_distribute_patterns, NULL, 1 },
537 { OPT_LEVELS_3_PLUS, OPT_ftree_loop_distribution, NULL, 1 },
538 { OPT_LEVELS_3_PLUS, OPT_ftree_loop_vectorize, NULL, 1 },
539 { OPT_LEVELS_3_PLUS, OPT_ftree_partial_pre, NULL, 1 },
540 { OPT_LEVELS_3_PLUS, OPT_ftree_slp_vectorize, NULL, 1 },
541 { OPT_LEVELS_3_PLUS, OPT_funswitch_loops, NULL, 1 },
542 { OPT_LEVELS_3_PLUS, OPT_fvect_cost_model_, NULL, VECT_COST_MODEL_DYNAMIC },
543 { OPT_LEVELS_3_PLUS, OPT_fversion_loops_for_strides, NULL, 1 },
545 /* -O3 parameters. */
546 { OPT_LEVELS_3_PLUS, OPT__param_max_inline_insns_auto_, NULL, 30 },
548 /* -Ofast adds optimizations to -O3. */
549 { OPT_LEVELS_FAST, OPT_ffast_math, NULL, 1 },
550 { OPT_LEVELS_FAST, OPT_fallow_store_data_races, NULL, 1 },
552 { OPT_LEVELS_NONE, 0, NULL, 0 }
555 /* Default the options in OPTS and OPTS_SET based on the optimization
556 settings in DECODED_OPTIONS and DECODED_OPTIONS_COUNT. */
557 void
558 default_options_optimization (struct gcc_options *opts,
559 struct gcc_options *opts_set,
560 struct cl_decoded_option *decoded_options,
561 unsigned int decoded_options_count,
562 location_t loc,
563 unsigned int lang_mask,
564 const struct cl_option_handlers *handlers,
565 diagnostic_context *dc)
567 unsigned int i;
568 int opt2;
569 bool openacc_mode = false;
571 /* Scan to see what optimization level has been specified. That will
572 determine the default value of many flags. */
573 for (i = 1; i < decoded_options_count; i++)
575 struct cl_decoded_option *opt = &decoded_options[i];
576 switch (opt->opt_index)
578 case OPT_O:
579 if (*opt->arg == '\0')
581 opts->x_optimize = 1;
582 opts->x_optimize_size = 0;
583 opts->x_optimize_fast = 0;
584 opts->x_optimize_debug = 0;
586 else
588 const int optimize_val = integral_argument (opt->arg);
589 if (optimize_val == -1)
590 error_at (loc, "argument to %<-O%> should be a non-negative "
591 "integer, %<g%>, %<s%> or %<fast%>");
592 else
594 opts->x_optimize = optimize_val;
595 if ((unsigned int) opts->x_optimize > 255)
596 opts->x_optimize = 255;
597 opts->x_optimize_size = 0;
598 opts->x_optimize_fast = 0;
599 opts->x_optimize_debug = 0;
602 break;
604 case OPT_Os:
605 opts->x_optimize_size = 1;
607 /* Optimizing for size forces optimize to be 2. */
608 opts->x_optimize = 2;
609 opts->x_optimize_fast = 0;
610 opts->x_optimize_debug = 0;
611 break;
613 case OPT_Ofast:
614 /* -Ofast only adds flags to -O3. */
615 opts->x_optimize_size = 0;
616 opts->x_optimize = 3;
617 opts->x_optimize_fast = 1;
618 opts->x_optimize_debug = 0;
619 break;
621 case OPT_Og:
622 /* -Og selects optimization level 1. */
623 opts->x_optimize_size = 0;
624 opts->x_optimize = 1;
625 opts->x_optimize_fast = 0;
626 opts->x_optimize_debug = 1;
627 break;
629 case OPT_fopenacc:
630 if (opt->value)
631 openacc_mode = true;
632 break;
634 default:
635 /* Ignore other options in this prescan. */
636 break;
640 maybe_default_options (opts, opts_set, default_options_table,
641 opts->x_optimize, opts->x_optimize_size,
642 opts->x_optimize_fast, opts->x_optimize_debug,
643 lang_mask, handlers, loc, dc);
645 /* -O2 param settings. */
646 opt2 = (opts->x_optimize >= 2);
648 if (openacc_mode)
649 SET_OPTION_IF_UNSET (opts, opts_set, flag_ipa_pta, true);
651 /* Track fields in field-sensitive alias analysis. */
652 if (opt2)
653 SET_OPTION_IF_UNSET (opts, opts_set, param_max_fields_for_field_sensitive,
654 100);
656 if (opts->x_optimize_size)
657 /* We want to crossjump as much as possible. */
658 SET_OPTION_IF_UNSET (opts, opts_set, param_min_crossjump_insns, 1);
660 /* Restrict the amount of work combine does at -Og while retaining
661 most of its useful transforms. */
662 if (opts->x_optimize_debug)
663 SET_OPTION_IF_UNSET (opts, opts_set, param_max_combine_insns, 2);
665 /* Allow default optimizations to be specified on a per-machine basis. */
666 maybe_default_options (opts, opts_set,
667 targetm_common.option_optimization_table,
668 opts->x_optimize, opts->x_optimize_size,
669 opts->x_optimize_fast, opts->x_optimize_debug,
670 lang_mask, handlers, loc, dc);
673 /* Control IPA optimizations based on different live patching LEVEL. */
674 static void
675 control_options_for_live_patching (struct gcc_options *opts,
676 struct gcc_options *opts_set,
677 enum live_patching_level level,
678 location_t loc)
680 gcc_assert (level > LIVE_PATCHING_NONE);
682 switch (level)
684 case LIVE_PATCHING_INLINE_ONLY_STATIC:
685 if (opts_set->x_flag_ipa_cp_clone && opts->x_flag_ipa_cp_clone)
686 error_at (loc,
687 "%<-fipa-cp-clone%> is incompatible with "
688 "%<-flive-patching=inline-only-static%>");
689 else
690 opts->x_flag_ipa_cp_clone = 0;
692 if (opts_set->x_flag_ipa_sra && opts->x_flag_ipa_sra)
693 error_at (loc,
694 "%<-fipa-sra%> is incompatible with "
695 "%<-flive-patching=inline-only-static%>");
696 else
697 opts->x_flag_ipa_sra = 0;
699 if (opts_set->x_flag_partial_inlining && opts->x_flag_partial_inlining)
700 error_at (loc,
701 "%<-fpartial-inlining%> is incompatible with "
702 "%<-flive-patching=inline-only-static%>");
703 else
704 opts->x_flag_partial_inlining = 0;
706 if (opts_set->x_flag_ipa_cp && opts->x_flag_ipa_cp)
707 error_at (loc,
708 "%<-fipa-cp%> is incompatible with "
709 "%<-flive-patching=inline-only-static%>");
710 else
711 opts->x_flag_ipa_cp = 0;
713 /* FALLTHROUGH. */
714 case LIVE_PATCHING_INLINE_CLONE:
715 /* live patching should disable whole-program optimization. */
716 if (opts_set->x_flag_whole_program && opts->x_flag_whole_program)
717 error_at (loc,
718 "%<-fwhole-program%> is incompatible with "
719 "%<-flive-patching=inline-only-static|inline-clone%>");
720 else
721 opts->x_flag_whole_program = 0;
723 /* visibility change should be excluded by !flag_whole_program
724 && !in_lto_p && !flag_ipa_cp_clone && !flag_ipa_sra
725 && !flag_partial_inlining. */
727 if (opts_set->x_flag_ipa_pta && opts->x_flag_ipa_pta)
728 error_at (loc,
729 "%<-fipa-pta%> is incompatible with "
730 "%<-flive-patching=inline-only-static|inline-clone%>");
731 else
732 opts->x_flag_ipa_pta = 0;
734 if (opts_set->x_flag_ipa_reference && opts->x_flag_ipa_reference)
735 error_at (loc,
736 "%<-fipa-reference%> is incompatible with "
737 "%<-flive-patching=inline-only-static|inline-clone%>");
738 else
739 opts->x_flag_ipa_reference = 0;
741 if (opts_set->x_flag_ipa_ra && opts->x_flag_ipa_ra)
742 error_at (loc,
743 "%<-fipa-ra%> is incompatible with "
744 "%<-flive-patching=inline-only-static|inline-clone%>");
745 else
746 opts->x_flag_ipa_ra = 0;
748 if (opts_set->x_flag_ipa_icf && opts->x_flag_ipa_icf)
749 error_at (loc,
750 "%<-fipa-icf%> is incompatible with "
751 "%<-flive-patching=inline-only-static|inline-clone%>");
752 else
753 opts->x_flag_ipa_icf = 0;
755 if (opts_set->x_flag_ipa_icf_functions && opts->x_flag_ipa_icf_functions)
756 error_at (loc,
757 "%<-fipa-icf-functions%> is incompatible with "
758 "%<-flive-patching=inline-only-static|inline-clone%>");
759 else
760 opts->x_flag_ipa_icf_functions = 0;
762 if (opts_set->x_flag_ipa_icf_variables && opts->x_flag_ipa_icf_variables)
763 error_at (loc,
764 "%<-fipa-icf-variables%> is incompatible with "
765 "%<-flive-patching=inline-only-static|inline-clone%>");
766 else
767 opts->x_flag_ipa_icf_variables = 0;
769 if (opts_set->x_flag_ipa_bit_cp && opts->x_flag_ipa_bit_cp)
770 error_at (loc,
771 "%<-fipa-bit-cp%> is incompatible with "
772 "%<-flive-patching=inline-only-static|inline-clone%>");
773 else
774 opts->x_flag_ipa_bit_cp = 0;
776 if (opts_set->x_flag_ipa_vrp && opts->x_flag_ipa_vrp)
777 error_at (loc,
778 "%<-fipa-vrp%> is incompatible with "
779 "%<-flive-patching=inline-only-static|inline-clone%>");
780 else
781 opts->x_flag_ipa_vrp = 0;
783 if (opts_set->x_flag_ipa_pure_const && opts->x_flag_ipa_pure_const)
784 error_at (loc,
785 "%<-fipa-pure-const%> is incompatible with "
786 "%<-flive-patching=inline-only-static|inline-clone%>");
787 else
788 opts->x_flag_ipa_pure_const = 0;
790 /* FIXME: disable unreachable code removal. */
792 /* discovery of functions/variables with no address taken. */
793 if (opts_set->x_flag_ipa_reference_addressable
794 && opts->x_flag_ipa_reference_addressable)
795 error_at (loc,
796 "%<-fipa-reference-addressable%> is incompatible with "
797 "%<-flive-patching=inline-only-static|inline-clone%>");
798 else
799 opts->x_flag_ipa_reference_addressable = 0;
801 /* ipa stack alignment propagation. */
802 if (opts_set->x_flag_ipa_stack_alignment
803 && opts->x_flag_ipa_stack_alignment)
804 error_at (loc,
805 "%<-fipa-stack-alignment%> is incompatible with "
806 "%<-flive-patching=inline-only-static|inline-clone%>");
807 else
808 opts->x_flag_ipa_stack_alignment = 0;
809 break;
810 default:
811 gcc_unreachable ();
815 /* --help option argument if set. */
816 vec<const char *> help_option_arguments;
819 /* After all options at LOC have been read into OPTS and OPTS_SET,
820 finalize settings of those options and diagnose incompatible
821 combinations. */
822 void
823 finish_options (struct gcc_options *opts, struct gcc_options *opts_set,
824 location_t loc)
826 enum unwind_info_type ui_except;
828 if (opts->x_dump_base_name
829 && ! opts->x_dump_base_name_prefixed)
831 const char *sep = opts->x_dump_base_name;
833 for (; *sep; sep++)
834 if (IS_DIR_SEPARATOR (*sep))
835 break;
837 if (*sep)
838 /* If dump_base_path contains subdirectories, don't prepend
839 anything. */;
840 else if (opts->x_dump_dir_name)
841 /* We have a DUMP_DIR_NAME, prepend that. */
842 opts->x_dump_base_name = opts_concat (opts->x_dump_dir_name,
843 opts->x_dump_base_name, NULL);
844 else if (opts->x_aux_base_name
845 && strcmp (opts->x_aux_base_name, HOST_BIT_BUCKET) != 0)
846 /* AUX_BASE_NAME is set and is not the bit bucket. If it
847 contains a directory component, prepend those directories.
848 Typically this places things in the same directory as the
849 object file. */
851 const char *aux_base;
853 base_of_path (opts->x_aux_base_name, &aux_base);
854 if (opts->x_aux_base_name != aux_base)
856 int dir_len = aux_base - opts->x_aux_base_name;
857 char *new_dump_base_name
858 = XOBNEWVEC (&opts_obstack, char,
859 strlen (opts->x_dump_base_name) + dir_len + 1);
861 /* Copy directory component from OPTS->X_AUX_BASE_NAME. */
862 memcpy (new_dump_base_name, opts->x_aux_base_name, dir_len);
863 /* Append existing OPTS->X_DUMP_BASE_NAME. */
864 strcpy (new_dump_base_name + dir_len, opts->x_dump_base_name);
865 opts->x_dump_base_name = new_dump_base_name;
869 /* It is definitely prefixed now. */
870 opts->x_dump_base_name_prefixed = true;
873 /* Handle related options for unit-at-a-time, toplevel-reorder, and
874 section-anchors. */
875 if (!opts->x_flag_unit_at_a_time)
877 if (opts->x_flag_section_anchors && opts_set->x_flag_section_anchors)
878 error_at (loc, "section anchors must be disabled when unit-at-a-time "
879 "is disabled");
880 opts->x_flag_section_anchors = 0;
881 if (opts->x_flag_toplevel_reorder == 1)
882 error_at (loc, "toplevel reorder must be disabled when unit-at-a-time "
883 "is disabled");
884 opts->x_flag_toplevel_reorder = 0;
887 /* -fself-test depends on the state of the compiler prior to
888 compiling anything. Ideally it should be run on an empty source
889 file. However, in case we get run with actual source, assume
890 -fsyntax-only which will inhibit any compiler initialization
891 which may confuse the self tests. */
892 if (opts->x_flag_self_test)
893 opts->x_flag_syntax_only = 1;
895 if (opts->x_flag_tm && opts->x_flag_non_call_exceptions)
896 sorry ("transactional memory is not supported with non-call exceptions");
898 /* Unless the user has asked for section anchors, we disable toplevel
899 reordering at -O0 to disable transformations that might be surprising
900 to end users and to get -fno-toplevel-reorder tested. */
901 if (!opts->x_optimize
902 && opts->x_flag_toplevel_reorder == 2
903 && !(opts->x_flag_section_anchors && opts_set->x_flag_section_anchors))
905 opts->x_flag_toplevel_reorder = 0;
906 opts->x_flag_section_anchors = 0;
908 if (!opts->x_flag_toplevel_reorder)
910 if (opts->x_flag_section_anchors && opts_set->x_flag_section_anchors)
911 error_at (loc, "section anchors must be disabled when toplevel reorder"
912 " is disabled");
913 opts->x_flag_section_anchors = 0;
916 if (!opts->x_flag_opts_finished)
918 /* We initialize opts->x_flag_pie to -1 so that targets can set a
919 default value. */
920 if (opts->x_flag_pie == -1)
922 /* We initialize opts->x_flag_pic to -1 so that we can tell if
923 -fpic, -fPIC, -fno-pic or -fno-PIC is used. */
924 if (opts->x_flag_pic == -1)
925 opts->x_flag_pie = DEFAULT_FLAG_PIE;
926 else
927 opts->x_flag_pie = 0;
929 /* If -fPIE or -fpie is used, turn on PIC. */
930 if (opts->x_flag_pie)
931 opts->x_flag_pic = opts->x_flag_pie;
932 else if (opts->x_flag_pic == -1)
933 opts->x_flag_pic = 0;
934 if (opts->x_flag_pic && !opts->x_flag_pie)
935 opts->x_flag_shlib = 1;
936 opts->x_flag_opts_finished = true;
939 /* We initialize opts->x_flag_stack_protect to -1 so that targets
940 can set a default value. */
941 if (opts->x_flag_stack_protect == -1)
942 opts->x_flag_stack_protect = DEFAULT_FLAG_SSP;
944 if (opts->x_optimize == 0)
946 /* Inlining does not work if not optimizing,
947 so force it not to be done. */
948 opts->x_warn_inline = 0;
949 opts->x_flag_no_inline = 1;
952 /* The optimization to partition hot and cold basic blocks into separate
953 sections of the .o and executable files does not work (currently)
954 with exception handling. This is because there is no support for
955 generating unwind info. If opts->x_flag_exceptions is turned on
956 we need to turn off the partitioning optimization. */
958 ui_except = targetm_common.except_unwind_info (opts);
960 if (opts->x_flag_exceptions
961 && opts->x_flag_reorder_blocks_and_partition
962 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))
964 if (opts_set->x_flag_reorder_blocks_and_partition)
965 inform (loc,
966 "%<-freorder-blocks-and-partition%> does not work "
967 "with exceptions on this architecture");
968 opts->x_flag_reorder_blocks_and_partition = 0;
969 opts->x_flag_reorder_blocks = 1;
972 /* If user requested unwind info, then turn off the partitioning
973 optimization. */
975 if (opts->x_flag_unwind_tables
976 && !targetm_common.unwind_tables_default
977 && opts->x_flag_reorder_blocks_and_partition
978 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))
980 if (opts_set->x_flag_reorder_blocks_and_partition)
981 inform (loc,
982 "%<-freorder-blocks-and-partition%> does not support "
983 "unwind info on this architecture");
984 opts->x_flag_reorder_blocks_and_partition = 0;
985 opts->x_flag_reorder_blocks = 1;
988 /* If the target requested unwind info, then turn off the partitioning
989 optimization with a different message. Likewise, if the target does not
990 support named sections. */
992 if (opts->x_flag_reorder_blocks_and_partition
993 && (!targetm_common.have_named_sections
994 || (opts->x_flag_unwind_tables
995 && targetm_common.unwind_tables_default
996 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))))
998 if (opts_set->x_flag_reorder_blocks_and_partition)
999 inform (loc,
1000 "%<-freorder-blocks-and-partition%> does not work "
1001 "on this architecture");
1002 opts->x_flag_reorder_blocks_and_partition = 0;
1003 opts->x_flag_reorder_blocks = 1;
1007 /* Pipelining of outer loops is only possible when general pipelining
1008 capabilities are requested. */
1009 if (!opts->x_flag_sel_sched_pipelining)
1010 opts->x_flag_sel_sched_pipelining_outer_loops = 0;
1012 if (opts->x_flag_conserve_stack)
1014 SET_OPTION_IF_UNSET (opts, opts_set, param_large_stack_frame, 100);
1015 SET_OPTION_IF_UNSET (opts, opts_set, param_stack_frame_growth, 40);
1018 if (opts->x_flag_lto)
1020 #ifdef ENABLE_LTO
1021 opts->x_flag_generate_lto = 1;
1023 /* When generating IL, do not operate in whole-program mode.
1024 Otherwise, symbols will be privatized too early, causing link
1025 errors later. */
1026 opts->x_flag_whole_program = 0;
1027 #else
1028 error_at (loc, "LTO support has not been enabled in this configuration");
1029 #endif
1030 if (!opts->x_flag_fat_lto_objects
1031 && (!HAVE_LTO_PLUGIN
1032 || (opts_set->x_flag_use_linker_plugin
1033 && !opts->x_flag_use_linker_plugin)))
1035 if (opts_set->x_flag_fat_lto_objects)
1036 error_at (loc, "%<-fno-fat-lto-objects%> are supported only with "
1037 "linker plugin");
1038 opts->x_flag_fat_lto_objects = 1;
1041 /* -gsplit-dwarf isn't compatible with LTO, see PR88389. */
1042 if (opts->x_dwarf_split_debug_info)
1044 inform (loc, "%<-gsplit-dwarf%> is not supported with LTO,"
1045 " disabling");
1046 opts->x_dwarf_split_debug_info = 0;
1050 /* We initialize opts->x_flag_split_stack to -1 so that targets can set a
1051 default value if they choose based on other options. */
1052 if (opts->x_flag_split_stack == -1)
1053 opts->x_flag_split_stack = 0;
1054 else if (opts->x_flag_split_stack)
1056 if (!targetm_common.supports_split_stack (true, opts))
1058 error_at (loc, "%<-fsplit-stack%> is not supported by "
1059 "this compiler configuration");
1060 opts->x_flag_split_stack = 0;
1064 /* If stack splitting is turned on, and the user did not explicitly
1065 request function partitioning, turn off partitioning, as it
1066 confuses the linker when trying to handle partitioned split-stack
1067 code that calls a non-split-stack functions. But if partitioning
1068 was turned on explicitly just hope for the best. */
1069 if (opts->x_flag_split_stack
1070 && opts->x_flag_reorder_blocks_and_partition)
1071 SET_OPTION_IF_UNSET (opts, opts_set, flag_reorder_blocks_and_partition, 0);
1073 if (opts->x_flag_reorder_blocks_and_partition)
1074 SET_OPTION_IF_UNSET (opts, opts_set, flag_reorder_functions, 1);
1076 /* The -gsplit-dwarf option requires -ggnu-pubnames. */
1077 if (opts->x_dwarf_split_debug_info)
1078 opts->x_debug_generate_pub_sections = 2;
1080 if ((opts->x_flag_sanitize
1081 & (SANITIZE_USER_ADDRESS | SANITIZE_KERNEL_ADDRESS)) == 0)
1083 if (opts->x_flag_sanitize & SANITIZE_POINTER_COMPARE)
1084 error_at (loc,
1085 "%<-fsanitize=pointer-compare%> must be combined with "
1086 "%<-fsanitize=address%> or %<-fsanitize=kernel-address%>");
1087 if (opts->x_flag_sanitize & SANITIZE_POINTER_SUBTRACT)
1088 error_at (loc,
1089 "%<-fsanitize=pointer-subtract%> must be combined with "
1090 "%<-fsanitize=address%> or %<-fsanitize=kernel-address%>");
1093 /* Userspace and kernel ASan conflict with each other. */
1094 if ((opts->x_flag_sanitize & SANITIZE_USER_ADDRESS)
1095 && (opts->x_flag_sanitize & SANITIZE_KERNEL_ADDRESS))
1096 error_at (loc,
1097 "%<-fsanitize=address%> is incompatible with "
1098 "%<-fsanitize=kernel-address%>");
1100 /* And with TSan. */
1101 if ((opts->x_flag_sanitize & SANITIZE_ADDRESS)
1102 && (opts->x_flag_sanitize & SANITIZE_THREAD))
1103 error_at (loc,
1104 "%<-fsanitize=address%> and %<-fsanitize=kernel-address%> "
1105 "are incompatible with %<-fsanitize=thread%>");
1107 if ((opts->x_flag_sanitize & SANITIZE_LEAK)
1108 && (opts->x_flag_sanitize & SANITIZE_THREAD))
1109 error_at (loc,
1110 "%<-fsanitize=leak%> is incompatible with %<-fsanitize=thread%>");
1112 /* Check error recovery for -fsanitize-recover option. */
1113 for (int i = 0; sanitizer_opts[i].name != NULL; ++i)
1114 if ((opts->x_flag_sanitize_recover & sanitizer_opts[i].flag)
1115 && !sanitizer_opts[i].can_recover)
1116 error_at (loc, "%<-fsanitize-recover=%s%> is not supported",
1117 sanitizer_opts[i].name);
1119 /* When instrumenting the pointers, we don't want to remove
1120 the null pointer checks. */
1121 if (opts->x_flag_sanitize & (SANITIZE_NULL | SANITIZE_NONNULL_ATTRIBUTE
1122 | SANITIZE_RETURNS_NONNULL_ATTRIBUTE))
1123 opts->x_flag_delete_null_pointer_checks = 0;
1125 /* Aggressive compiler optimizations may cause false negatives. */
1126 if (opts->x_flag_sanitize & ~(SANITIZE_LEAK | SANITIZE_UNREACHABLE))
1127 opts->x_flag_aggressive_loop_optimizations = 0;
1129 /* Enable -fsanitize-address-use-after-scope if address sanitizer is
1130 enabled. */
1131 if (opts->x_flag_sanitize & SANITIZE_USER_ADDRESS)
1132 SET_OPTION_IF_UNSET (opts, opts_set, flag_sanitize_address_use_after_scope,
1133 true);
1135 /* Force -fstack-reuse=none in case -fsanitize-address-use-after-scope
1136 is enabled. */
1137 if (opts->x_flag_sanitize_address_use_after_scope)
1139 if (opts->x_flag_stack_reuse != SR_NONE
1140 && opts_set->x_flag_stack_reuse != SR_NONE)
1141 error_at (loc,
1142 "%<-fsanitize-address-use-after-scope%> requires "
1143 "%<-fstack-reuse=none%> option");
1145 opts->x_flag_stack_reuse = SR_NONE;
1148 if ((opts->x_flag_sanitize & SANITIZE_USER_ADDRESS) && opts->x_flag_tm)
1149 sorry ("transactional memory is not supported with %<-fsanitize=address%>");
1151 if ((opts->x_flag_sanitize & SANITIZE_KERNEL_ADDRESS) && opts->x_flag_tm)
1152 sorry ("transactional memory is not supported with "
1153 "%<-fsanitize=kernel-address%>");
1155 /* Currently live patching is not support for LTO. */
1156 if (opts->x_flag_live_patching && opts->x_flag_lto)
1157 sorry ("live patching is not supported with LTO");
1159 /* Currently vtable verification is not supported for LTO */
1160 if (opts->x_flag_vtable_verify && opts->x_flag_lto)
1161 sorry ("vtable verification is not supported with LTO");
1163 /* Control IPA optimizations based on different -flive-patching level. */
1164 if (opts->x_flag_live_patching)
1166 control_options_for_live_patching (opts, opts_set,
1167 opts->x_flag_live_patching,
1168 loc);
1172 #define LEFT_COLUMN 27
1174 /* Output ITEM, of length ITEM_WIDTH, in the left column,
1175 followed by word-wrapped HELP in a second column. */
1176 static void
1177 wrap_help (const char *help,
1178 const char *item,
1179 unsigned int item_width,
1180 unsigned int columns)
1182 unsigned int col_width = LEFT_COLUMN;
1183 unsigned int remaining, room, len;
1185 remaining = strlen (help);
1189 room = columns - 3 - MAX (col_width, item_width);
1190 if (room > columns)
1191 room = 0;
1192 len = remaining;
1194 if (room < len)
1196 unsigned int i;
1198 for (i = 0; help[i]; i++)
1200 if (i >= room && len != remaining)
1201 break;
1202 if (help[i] == ' ')
1203 len = i;
1204 else if ((help[i] == '-' || help[i] == '/')
1205 && help[i + 1] != ' '
1206 && i > 0 && ISALPHA (help[i - 1]))
1207 len = i + 1;
1211 printf (" %-*.*s %.*s\n", col_width, item_width, item, len, help);
1212 item_width = 0;
1213 while (help[len] == ' ')
1214 len++;
1215 help += len;
1216 remaining -= len;
1218 while (remaining);
1221 /* Data structure used to print list of valid option values. */
1223 class option_help_tuple
1225 public:
1226 option_help_tuple (int code, vec<const char *> values):
1227 m_code (code), m_values (values)
1230 /* Code of an option. */
1231 int m_code;
1233 /* List of possible values. */
1234 vec<const char *> m_values;
1237 /* Print help for a specific front-end, etc. */
1238 static void
1239 print_filtered_help (unsigned int include_flags,
1240 unsigned int exclude_flags,
1241 unsigned int any_flags,
1242 unsigned int columns,
1243 struct gcc_options *opts,
1244 unsigned int lang_mask)
1246 unsigned int i;
1247 const char *help;
1248 bool found = false;
1249 bool displayed = false;
1250 char new_help[256];
1252 if (!opts->x_help_printed)
1253 opts->x_help_printed = XCNEWVAR (char, cl_options_count);
1255 if (!opts->x_help_enum_printed)
1256 opts->x_help_enum_printed = XCNEWVAR (char, cl_enums_count);
1258 auto_vec<option_help_tuple> help_tuples;
1260 for (i = 0; i < cl_options_count; i++)
1262 const struct cl_option *option = cl_options + i;
1263 unsigned int len;
1264 const char *opt;
1265 const char *tab;
1267 if (include_flags == 0
1268 || ((option->flags & include_flags) != include_flags))
1270 if ((option->flags & any_flags) == 0)
1271 continue;
1274 /* Skip unwanted switches. */
1275 if ((option->flags & exclude_flags) != 0)
1276 continue;
1278 /* The driver currently prints its own help text. */
1279 if ((option->flags & CL_DRIVER) != 0
1280 && (option->flags & (((1U << cl_lang_count) - 1)
1281 | CL_COMMON | CL_TARGET)) == 0)
1282 continue;
1284 found = true;
1285 /* Skip switches that have already been printed. */
1286 if (opts->x_help_printed[i])
1287 continue;
1289 opts->x_help_printed[i] = true;
1291 help = option->help;
1292 if (help == NULL)
1294 if (exclude_flags & CL_UNDOCUMENTED)
1295 continue;
1297 help = undocumented_msg;
1300 if (option->alias_target < N_OPTS
1301 && cl_options [option->alias_target].help)
1303 if (help == undocumented_msg)
1305 /* For undocumented options that are aliases for other options
1306 that are documented, point the reader to the other option in
1307 preference of the former. */
1308 snprintf (new_help, sizeof new_help,
1309 _("Same as %s. Use the latter option instead."),
1310 cl_options [option->alias_target].opt_text);
1312 else
1314 /* For documented options with aliases, mention the aliased
1315 option's name for reference. */
1316 snprintf (new_help, sizeof new_help,
1317 _("%s Same as %s."),
1318 help, cl_options [option->alias_target].opt_text);
1321 help = new_help;
1324 if (option->warn_message)
1326 /* Mention that the use of the option will trigger a warning. */
1327 if (help == new_help)
1328 snprintf (new_help + strlen (new_help),
1329 sizeof new_help - strlen (new_help),
1330 " %s", _(use_diagnosed_msg));
1331 else
1332 snprintf (new_help, sizeof new_help,
1333 "%s %s", help, _(use_diagnosed_msg));
1335 help = new_help;
1338 /* Get the translation. */
1339 help = _(help);
1341 /* Find the gap between the name of the
1342 option and its descriptive text. */
1343 tab = strchr (help, '\t');
1344 if (tab)
1346 len = tab - help;
1347 opt = help;
1348 help = tab + 1;
1350 else
1352 opt = option->opt_text;
1353 len = strlen (opt);
1356 /* With the -Q option enabled we change the descriptive text associated
1357 with an option to be an indication of its current setting. */
1358 if (!opts->x_quiet_flag)
1360 void *flag_var = option_flag_var (i, opts);
1362 if (len < (LEFT_COLUMN + 2))
1363 strcpy (new_help, "\t\t");
1364 else
1365 strcpy (new_help, "\t");
1367 /* Set to print whether the option is enabled or disabled,
1368 or, if it's an alias for another option, the name of
1369 the aliased option. */
1370 bool print_state = false;
1372 if (flag_var != NULL
1373 && option->var_type != CLVC_DEFER)
1375 /* If OPTION is only available for a specific subset
1376 of languages other than this one, mention them. */
1377 bool avail_for_lang = true;
1378 if (unsigned langset = option->flags & CL_LANG_ALL)
1380 if (!(langset & lang_mask))
1382 avail_for_lang = false;
1383 strcat (new_help, _("[available in "));
1384 for (unsigned i = 0, n = 0; (1U << i) < CL_LANG_ALL; ++i)
1385 if (langset & (1U << i))
1387 if (n++)
1388 strcat (new_help, ", ");
1389 strcat (new_help, lang_names[i]);
1391 strcat (new_help, "]");
1394 if (!avail_for_lang)
1395 ; /* Print nothing else if the option is not available
1396 in the current language. */
1397 else if (option->flags & CL_JOINED)
1399 if (option->var_type == CLVC_STRING)
1401 if (* (const char **) flag_var != NULL)
1402 snprintf (new_help + strlen (new_help),
1403 sizeof (new_help) - strlen (new_help),
1404 "%s", * (const char **) flag_var);
1406 else if (option->var_type == CLVC_ENUM)
1408 const struct cl_enum *e = &cl_enums[option->var_enum];
1409 int value;
1410 const char *arg = NULL;
1412 value = e->get (flag_var);
1413 enum_value_to_arg (e->values, &arg, value, lang_mask);
1414 if (arg == NULL)
1415 arg = _("[default]");
1416 snprintf (new_help + strlen (new_help),
1417 sizeof (new_help) - strlen (new_help),
1418 "%s", arg);
1420 else
1422 if (option->cl_host_wide_int)
1423 sprintf (new_help + strlen (new_help),
1424 _("%llu bytes"), (unsigned long long)
1425 *(unsigned HOST_WIDE_INT *) flag_var);
1426 else
1427 sprintf (new_help + strlen (new_help),
1428 "%i", * (int *) flag_var);
1431 else
1432 print_state = true;
1434 else
1435 /* When there is no argument, print the option state only
1436 if the option takes no argument. */
1437 print_state = !(option->flags & CL_JOINED);
1439 if (print_state)
1441 if (option->alias_target < N_OPTS
1442 && option->alias_target != OPT_SPECIAL_warn_removed
1443 && option->alias_target != OPT_SPECIAL_ignore
1444 && option->alias_target != OPT_SPECIAL_input_file
1445 && option->alias_target != OPT_SPECIAL_program_name
1446 && option->alias_target != OPT_SPECIAL_unknown)
1448 const struct cl_option *target
1449 = &cl_options[option->alias_target];
1450 sprintf (new_help + strlen (new_help), "%s%s",
1451 target->opt_text,
1452 option->alias_arg ? option->alias_arg : "");
1454 else if (option->alias_target == OPT_SPECIAL_ignore)
1455 strcat (new_help, ("[ignored]"));
1456 else
1458 /* Print the state for an on/off option. */
1459 int ena = option_enabled (i, lang_mask, opts);
1460 if (ena > 0)
1461 strcat (new_help, _("[enabled]"));
1462 else if (ena == 0)
1463 strcat (new_help, _("[disabled]"));
1467 help = new_help;
1470 if (option->range_max != -1)
1472 char b[128];
1473 snprintf (b, sizeof (b), "<%d,%d>", option->range_min,
1474 option->range_max);
1475 opt = concat (opt, b, NULL);
1476 len += strlen (b);
1479 wrap_help (help, opt, len, columns);
1480 displayed = true;
1482 if (option->var_type == CLVC_ENUM
1483 && opts->x_help_enum_printed[option->var_enum] != 2)
1484 opts->x_help_enum_printed[option->var_enum] = 1;
1485 else
1487 vec<const char *> option_values
1488 = targetm_common.get_valid_option_values (i, NULL);
1489 if (!option_values.is_empty ())
1490 help_tuples.safe_push (option_help_tuple (i, option_values));
1494 if (! found)
1496 unsigned int langs = include_flags & CL_LANG_ALL;
1498 if (langs == 0)
1499 printf (_(" No options with the desired characteristics were found\n"));
1500 else
1502 unsigned int i;
1504 /* PR 31349: Tell the user how to see all of the
1505 options supported by a specific front end. */
1506 for (i = 0; (1U << i) < CL_LANG_ALL; i ++)
1507 if ((1U << i) & langs)
1508 printf (_(" None found. Use --help=%s to show *all* the options supported by the %s front-end.\n"),
1509 lang_names[i], lang_names[i]);
1513 else if (! displayed)
1514 printf (_(" All options with the desired characteristics have already been displayed\n"));
1516 putchar ('\n');
1518 /* Print details of enumerated option arguments, if those
1519 enumerations have help text headings provided. If no help text
1520 is provided, presume that the possible values are listed in the
1521 help text for the relevant options. */
1522 for (i = 0; i < cl_enums_count; i++)
1524 unsigned int j, pos;
1526 if (opts->x_help_enum_printed[i] != 1)
1527 continue;
1528 if (cl_enums[i].help == NULL)
1529 continue;
1530 printf (" %s\n ", _(cl_enums[i].help));
1531 pos = 4;
1532 for (j = 0; cl_enums[i].values[j].arg != NULL; j++)
1534 unsigned int len = strlen (cl_enums[i].values[j].arg);
1536 if (pos > 4 && pos + 1 + len <= columns)
1538 printf (" %s", cl_enums[i].values[j].arg);
1539 pos += 1 + len;
1541 else
1543 if (pos > 4)
1545 printf ("\n ");
1546 pos = 4;
1548 printf ("%s", cl_enums[i].values[j].arg);
1549 pos += len;
1552 printf ("\n\n");
1553 opts->x_help_enum_printed[i] = 2;
1556 for (unsigned i = 0; i < help_tuples.length (); i++)
1558 const struct cl_option *option = cl_options + help_tuples[i].m_code;
1559 printf (_(" Known valid arguments for %s option:\n "),
1560 option->opt_text);
1561 for (unsigned j = 0; j < help_tuples[i].m_values.length (); j++)
1562 printf (" %s", help_tuples[i].m_values[j]);
1563 printf ("\n\n");
1567 /* Display help for a specified type of option.
1568 The options must have ALL of the INCLUDE_FLAGS set
1569 ANY of the flags in the ANY_FLAGS set
1570 and NONE of the EXCLUDE_FLAGS set. The current option state is in
1571 OPTS; LANG_MASK is used for interpreting enumerated option state. */
1572 static void
1573 print_specific_help (unsigned int include_flags,
1574 unsigned int exclude_flags,
1575 unsigned int any_flags,
1576 struct gcc_options *opts,
1577 unsigned int lang_mask)
1579 unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1580 const char * description = NULL;
1581 const char * descrip_extra = "";
1582 size_t i;
1583 unsigned int flag;
1585 /* Sanity check: Make sure that we do not have more
1586 languages than we have bits available to enumerate them. */
1587 gcc_assert ((1U << cl_lang_count) <= CL_MIN_OPTION_CLASS);
1589 /* If we have not done so already, obtain
1590 the desired maximum width of the output. */
1591 if (opts->x_help_columns == 0)
1593 opts->x_help_columns = get_terminal_width ();
1594 if (opts->x_help_columns == INT_MAX)
1595 /* Use a reasonable default. */
1596 opts->x_help_columns = 80;
1599 /* Decide upon the title for the options that we are going to display. */
1600 for (i = 0, flag = 1; flag <= CL_MAX_OPTION_CLASS; flag <<= 1, i ++)
1602 switch (flag & include_flags)
1604 case 0:
1605 case CL_DRIVER:
1606 break;
1608 case CL_TARGET:
1609 description = _("The following options are target specific");
1610 break;
1611 case CL_WARNING:
1612 description = _("The following options control compiler warning messages");
1613 break;
1614 case CL_OPTIMIZATION:
1615 description = _("The following options control optimizations");
1616 break;
1617 case CL_COMMON:
1618 description = _("The following options are language-independent");
1619 break;
1620 case CL_PARAMS:
1621 description = _("The following options control parameters");
1622 break;
1623 default:
1624 if (i >= cl_lang_count)
1625 break;
1626 if (exclude_flags & all_langs_mask)
1627 description = _("The following options are specific to just the language ");
1628 else
1629 description = _("The following options are supported by the language ");
1630 descrip_extra = lang_names [i];
1631 break;
1635 if (description == NULL)
1637 if (any_flags == 0)
1639 if (include_flags & CL_UNDOCUMENTED)
1640 description = _("The following options are not documented");
1641 else if (include_flags & CL_SEPARATE)
1642 description = _("The following options take separate arguments");
1643 else if (include_flags & CL_JOINED)
1644 description = _("The following options take joined arguments");
1645 else
1647 internal_error ("unrecognized %<include_flags 0x%x%> passed "
1648 "to %<print_specific_help%>",
1649 include_flags);
1650 return;
1653 else
1655 if (any_flags & all_langs_mask)
1656 description = _("The following options are language-related");
1657 else
1658 description = _("The following options are language-independent");
1662 printf ("%s%s:\n", description, descrip_extra);
1663 print_filtered_help (include_flags, exclude_flags, any_flags,
1664 opts->x_help_columns, opts, lang_mask);
1667 /* Enable FDO-related flags. */
1669 static void
1670 enable_fdo_optimizations (struct gcc_options *opts,
1671 struct gcc_options *opts_set,
1672 int value)
1674 SET_OPTION_IF_UNSET (opts, opts_set, flag_branch_probabilities, value);
1675 SET_OPTION_IF_UNSET (opts, opts_set, flag_profile_values, value);
1676 SET_OPTION_IF_UNSET (opts, opts_set, flag_unroll_loops, value);
1677 SET_OPTION_IF_UNSET (opts, opts_set, flag_peel_loops, value);
1678 SET_OPTION_IF_UNSET (opts, opts_set, flag_tracer, value);
1679 SET_OPTION_IF_UNSET (opts, opts_set, flag_value_profile_transformations,
1680 value);
1681 SET_OPTION_IF_UNSET (opts, opts_set, flag_inline_functions, value);
1682 SET_OPTION_IF_UNSET (opts, opts_set, flag_ipa_cp, value);
1683 if (value)
1685 SET_OPTION_IF_UNSET (opts, opts_set, flag_ipa_cp_clone, 1);
1686 SET_OPTION_IF_UNSET (opts, opts_set, flag_ipa_bit_cp, 1);
1688 SET_OPTION_IF_UNSET (opts, opts_set, flag_predictive_commoning, value);
1689 SET_OPTION_IF_UNSET (opts, opts_set, flag_split_loops, value);
1690 SET_OPTION_IF_UNSET (opts, opts_set, flag_unswitch_loops, value);
1691 SET_OPTION_IF_UNSET (opts, opts_set, flag_gcse_after_reload, value);
1692 SET_OPTION_IF_UNSET (opts, opts_set, flag_tree_loop_vectorize, value);
1693 SET_OPTION_IF_UNSET (opts, opts_set, flag_tree_slp_vectorize, value);
1694 SET_OPTION_IF_UNSET (opts, opts_set, flag_version_loops_for_strides, value);
1695 SET_OPTION_IF_UNSET (opts, opts_set, flag_vect_cost_model,
1696 VECT_COST_MODEL_DYNAMIC);
1697 SET_OPTION_IF_UNSET (opts, opts_set, flag_tree_loop_distribute_patterns,
1698 value);
1699 SET_OPTION_IF_UNSET (opts, opts_set, flag_loop_interchange, value);
1700 SET_OPTION_IF_UNSET (opts, opts_set, flag_unroll_jam, value);
1701 SET_OPTION_IF_UNSET (opts, opts_set, flag_tree_loop_distribution, value);
1704 /* -f{,no-}sanitize{,-recover}= suboptions. */
1705 const struct sanitizer_opts_s sanitizer_opts[] =
1707 #define SANITIZER_OPT(name, flags, recover) \
1708 { #name, flags, sizeof #name - 1, recover }
1709 SANITIZER_OPT (address, (SANITIZE_ADDRESS | SANITIZE_USER_ADDRESS), true),
1710 SANITIZER_OPT (kernel-address, (SANITIZE_ADDRESS | SANITIZE_KERNEL_ADDRESS),
1711 true),
1712 SANITIZER_OPT (pointer-compare, SANITIZE_POINTER_COMPARE, true),
1713 SANITIZER_OPT (pointer-subtract, SANITIZE_POINTER_SUBTRACT, true),
1714 SANITIZER_OPT (thread, SANITIZE_THREAD, false),
1715 SANITIZER_OPT (leak, SANITIZE_LEAK, false),
1716 SANITIZER_OPT (shift, SANITIZE_SHIFT, true),
1717 SANITIZER_OPT (shift-base, SANITIZE_SHIFT_BASE, true),
1718 SANITIZER_OPT (shift-exponent, SANITIZE_SHIFT_EXPONENT, true),
1719 SANITIZER_OPT (integer-divide-by-zero, SANITIZE_DIVIDE, true),
1720 SANITIZER_OPT (undefined, SANITIZE_UNDEFINED, true),
1721 SANITIZER_OPT (unreachable, SANITIZE_UNREACHABLE, false),
1722 SANITIZER_OPT (vla-bound, SANITIZE_VLA, true),
1723 SANITIZER_OPT (return, SANITIZE_RETURN, false),
1724 SANITIZER_OPT (null, SANITIZE_NULL, true),
1725 SANITIZER_OPT (signed-integer-overflow, SANITIZE_SI_OVERFLOW, true),
1726 SANITIZER_OPT (bool, SANITIZE_BOOL, true),
1727 SANITIZER_OPT (enum, SANITIZE_ENUM, true),
1728 SANITIZER_OPT (float-divide-by-zero, SANITIZE_FLOAT_DIVIDE, true),
1729 SANITIZER_OPT (float-cast-overflow, SANITIZE_FLOAT_CAST, true),
1730 SANITIZER_OPT (bounds, SANITIZE_BOUNDS, true),
1731 SANITIZER_OPT (bounds-strict, SANITIZE_BOUNDS | SANITIZE_BOUNDS_STRICT, true),
1732 SANITIZER_OPT (alignment, SANITIZE_ALIGNMENT, true),
1733 SANITIZER_OPT (nonnull-attribute, SANITIZE_NONNULL_ATTRIBUTE, true),
1734 SANITIZER_OPT (returns-nonnull-attribute, SANITIZE_RETURNS_NONNULL_ATTRIBUTE,
1735 true),
1736 SANITIZER_OPT (object-size, SANITIZE_OBJECT_SIZE, true),
1737 SANITIZER_OPT (vptr, SANITIZE_VPTR, true),
1738 SANITIZER_OPT (pointer-overflow, SANITIZE_POINTER_OVERFLOW, true),
1739 SANITIZER_OPT (builtin, SANITIZE_BUILTIN, true),
1740 SANITIZER_OPT (all, ~0U, true),
1741 #undef SANITIZER_OPT
1742 { NULL, 0U, 0UL, false }
1745 /* -f{,no-}sanitize-coverage= suboptions. */
1746 const struct sanitizer_opts_s coverage_sanitizer_opts[] =
1748 #define COVERAGE_SANITIZER_OPT(name, flags) \
1749 { #name, flags, sizeof #name - 1, true }
1750 COVERAGE_SANITIZER_OPT (trace-pc, SANITIZE_COV_TRACE_PC),
1751 COVERAGE_SANITIZER_OPT (trace-cmp, SANITIZE_COV_TRACE_CMP),
1752 #undef COVERAGE_SANITIZER_OPT
1753 { NULL, 0U, 0UL, false }
1756 /* A struct for describing a run of chars within a string. */
1758 class string_fragment
1760 public:
1761 string_fragment (const char *start, size_t len)
1762 : m_start (start), m_len (len) {}
1764 const char *m_start;
1765 size_t m_len;
1768 /* Specialization of edit_distance_traits for string_fragment,
1769 for use by get_closest_sanitizer_option. */
1771 template <>
1772 struct edit_distance_traits<const string_fragment &>
1774 static size_t get_length (const string_fragment &fragment)
1776 return fragment.m_len;
1779 static const char *get_string (const string_fragment &fragment)
1781 return fragment.m_start;
1785 /* Given ARG, an unrecognized sanitizer option, return the best
1786 matching sanitizer option, or NULL if there isn't one.
1787 OPTS is array of candidate sanitizer options.
1788 CODE is OPT_fsanitize_, OPT_fsanitize_recover_ or
1789 OPT_fsanitize_coverage_.
1790 VALUE is non-zero for the regular form of the option, zero
1791 for the "no-" form (e.g. "-fno-sanitize-recover="). */
1793 static const char *
1794 get_closest_sanitizer_option (const string_fragment &arg,
1795 const struct sanitizer_opts_s *opts,
1796 enum opt_code code, int value)
1798 best_match <const string_fragment &, const char*> bm (arg);
1799 for (int i = 0; opts[i].name != NULL; ++i)
1801 /* -fsanitize=all is not valid, so don't offer it. */
1802 if (code == OPT_fsanitize_
1803 && opts[i].flag == ~0U
1804 && value)
1805 continue;
1807 /* For -fsanitize-recover= (and not -fno-sanitize-recover=),
1808 don't offer the non-recoverable options. */
1809 if (code == OPT_fsanitize_recover_
1810 && !opts[i].can_recover
1811 && value)
1812 continue;
1814 bm.consider (opts[i].name);
1816 return bm.get_best_meaningful_candidate ();
1819 /* Parse comma separated sanitizer suboptions from P for option SCODE,
1820 adjust previous FLAGS and return new ones. If COMPLAIN is false,
1821 don't issue diagnostics. */
1823 unsigned int
1824 parse_sanitizer_options (const char *p, location_t loc, int scode,
1825 unsigned int flags, int value, bool complain)
1827 enum opt_code code = (enum opt_code) scode;
1829 const struct sanitizer_opts_s *opts;
1830 if (code == OPT_fsanitize_coverage_)
1831 opts = coverage_sanitizer_opts;
1832 else
1833 opts = sanitizer_opts;
1835 while (*p != 0)
1837 size_t len, i;
1838 bool found = false;
1839 const char *comma = strchr (p, ',');
1841 if (comma == NULL)
1842 len = strlen (p);
1843 else
1844 len = comma - p;
1845 if (len == 0)
1847 p = comma + 1;
1848 continue;
1851 /* Check to see if the string matches an option class name. */
1852 for (i = 0; opts[i].name != NULL; ++i)
1853 if (len == opts[i].len && memcmp (p, opts[i].name, len) == 0)
1855 /* Handle both -fsanitize and -fno-sanitize cases. */
1856 if (value && opts[i].flag == ~0U)
1858 if (code == OPT_fsanitize_)
1860 if (complain)
1861 error_at (loc, "%<-fsanitize=all%> option is not valid");
1863 else
1864 flags |= ~(SANITIZE_THREAD | SANITIZE_LEAK
1865 | SANITIZE_UNREACHABLE | SANITIZE_RETURN);
1867 else if (value)
1869 /* Do not enable -fsanitize-recover=unreachable and
1870 -fsanitize-recover=return if -fsanitize-recover=undefined
1871 is selected. */
1872 if (code == OPT_fsanitize_recover_
1873 && opts[i].flag == SANITIZE_UNDEFINED)
1874 flags |= (SANITIZE_UNDEFINED
1875 & ~(SANITIZE_UNREACHABLE | SANITIZE_RETURN));
1876 else
1877 flags |= opts[i].flag;
1879 else
1880 flags &= ~opts[i].flag;
1881 found = true;
1882 break;
1885 if (! found && complain)
1887 const char *hint
1888 = get_closest_sanitizer_option (string_fragment (p, len),
1889 opts, code, value);
1891 const char *suffix;
1892 if (code == OPT_fsanitize_recover_)
1893 suffix = "-recover";
1894 else if (code == OPT_fsanitize_coverage_)
1895 suffix = "-coverage";
1896 else
1897 suffix = "";
1899 if (hint)
1900 error_at (loc,
1901 "unrecognized argument to %<-f%ssanitize%s=%> "
1902 "option: %q.*s; did you mean %qs?",
1903 value ? "" : "no-",
1904 suffix, (int) len, p, hint);
1905 else
1906 error_at (loc,
1907 "unrecognized argument to %<-f%ssanitize%s=%> option: "
1908 "%q.*s", value ? "" : "no-",
1909 suffix, (int) len, p);
1912 if (comma == NULL)
1913 break;
1914 p = comma + 1;
1916 return flags;
1919 /* Parse string values of no_sanitize attribute passed in VALUE.
1920 Values are separated with comma. */
1922 unsigned int
1923 parse_no_sanitize_attribute (char *value)
1925 unsigned int flags = 0;
1926 unsigned int i;
1927 char *q = strtok (value, ",");
1929 while (q != NULL)
1931 for (i = 0; sanitizer_opts[i].name != NULL; ++i)
1932 if (strcmp (sanitizer_opts[i].name, q) == 0)
1934 flags |= sanitizer_opts[i].flag;
1935 if (sanitizer_opts[i].flag == SANITIZE_UNDEFINED)
1936 flags |= SANITIZE_UNDEFINED_NONDEFAULT;
1937 break;
1940 if (sanitizer_opts[i].name == NULL)
1941 warning (OPT_Wattributes,
1942 "%qs attribute directive ignored", q);
1944 q = strtok (NULL, ",");
1947 return flags;
1950 /* Parse -falign-NAME format for a FLAG value. Return individual
1951 parsed integer values into RESULT_VALUES array. If REPORT_ERROR is
1952 set, print error message at LOC location. */
1954 bool
1955 parse_and_check_align_values (const char *flag,
1956 const char *name,
1957 auto_vec<unsigned> &result_values,
1958 bool report_error,
1959 location_t loc)
1961 char *str = xstrdup (flag);
1962 for (char *p = strtok (str, ":"); p; p = strtok (NULL, ":"))
1964 char *end;
1965 int v = strtol (p, &end, 10);
1966 if (*end != '\0' || v < 0)
1968 if (report_error)
1969 error_at (loc, "invalid arguments for %<-falign-%s%> option: %qs",
1970 name, flag);
1972 return false;
1975 result_values.safe_push ((unsigned)v);
1978 free (str);
1980 /* Check that we have a correct number of values. */
1981 if (result_values.is_empty () || result_values.length () > 4)
1983 if (report_error)
1984 error_at (loc, "invalid number of arguments for %<-falign-%s%> "
1985 "option: %qs", name, flag);
1986 return false;
1989 for (unsigned i = 0; i < result_values.length (); i++)
1990 if (result_values[i] > MAX_CODE_ALIGN_VALUE)
1992 if (report_error)
1993 error_at (loc, "%<-falign-%s%> is not between 0 and %d",
1994 name, MAX_CODE_ALIGN_VALUE);
1995 return false;
1998 return true;
2001 /* Check that alignment value FLAG for -falign-NAME is valid at a given
2002 location LOC. */
2004 static void
2005 check_alignment_argument (location_t loc, const char *flag, const char *name)
2007 auto_vec<unsigned> align_result;
2008 parse_and_check_align_values (flag, name, align_result, true, loc);
2011 /* Print help when OPT__help_ is set. */
2013 void
2014 print_help (struct gcc_options *opts, unsigned int lang_mask,
2015 const char *help_option_argument)
2017 const char *a = help_option_argument;
2018 unsigned int include_flags = 0;
2019 /* Note - by default we include undocumented options when listing
2020 specific classes. If you only want to see documented options
2021 then add ",^undocumented" to the --help= option. E.g.:
2023 --help=target,^undocumented */
2024 unsigned int exclude_flags = 0;
2026 if (lang_mask == CL_DRIVER)
2027 return;
2029 /* Walk along the argument string, parsing each word in turn.
2030 The format is:
2031 arg = [^]{word}[,{arg}]
2032 word = {optimizers|target|warnings|undocumented|
2033 params|common|<language>} */
2034 while (*a != 0)
2036 static const struct
2038 const char *string;
2039 unsigned int flag;
2041 specifics[] =
2043 { "optimizers", CL_OPTIMIZATION },
2044 { "target", CL_TARGET },
2045 { "warnings", CL_WARNING },
2046 { "undocumented", CL_UNDOCUMENTED },
2047 { "params", CL_PARAMS },
2048 { "joined", CL_JOINED },
2049 { "separate", CL_SEPARATE },
2050 { "common", CL_COMMON },
2051 { NULL, 0 }
2053 unsigned int *pflags;
2054 const char *comma;
2055 unsigned int lang_flag, specific_flag;
2056 unsigned int len;
2057 unsigned int i;
2059 if (*a == '^')
2061 ++a;
2062 if (*a == '\0')
2064 error ("missing argument to %qs", "--help=^");
2065 break;
2067 pflags = &exclude_flags;
2069 else
2070 pflags = &include_flags;
2072 comma = strchr (a, ',');
2073 if (comma == NULL)
2074 len = strlen (a);
2075 else
2076 len = comma - a;
2077 if (len == 0)
2079 a = comma + 1;
2080 continue;
2083 /* Check to see if the string matches an option class name. */
2084 for (i = 0, specific_flag = 0; specifics[i].string != NULL; i++)
2085 if (strncasecmp (a, specifics[i].string, len) == 0)
2087 specific_flag = specifics[i].flag;
2088 break;
2091 /* Check to see if the string matches a language name.
2092 Note - we rely upon the alpha-sorted nature of the entries in
2093 the lang_names array, specifically that shorter names appear
2094 before their longer variants. (i.e. C before C++). That way
2095 when we are attempting to match --help=c for example we will
2096 match with C first and not C++. */
2097 for (i = 0, lang_flag = 0; i < cl_lang_count; i++)
2098 if (strncasecmp (a, lang_names[i], len) == 0)
2100 lang_flag = 1U << i;
2101 break;
2104 if (specific_flag != 0)
2106 if (lang_flag == 0)
2107 *pflags |= specific_flag;
2108 else
2110 /* The option's argument matches both the start of a
2111 language name and the start of an option class name.
2112 We have a special case for when the user has
2113 specified "--help=c", but otherwise we have to issue
2114 a warning. */
2115 if (strncasecmp (a, "c", len) == 0)
2116 *pflags |= lang_flag;
2117 else
2118 warning (0,
2119 "%<--help%> argument %q.*s is ambiguous, "
2120 "please be more specific",
2121 len, a);
2124 else if (lang_flag != 0)
2125 *pflags |= lang_flag;
2126 else
2127 warning (0,
2128 "unrecognized argument to %<--help=%> option: %q.*s",
2129 len, a);
2131 if (comma == NULL)
2132 break;
2133 a = comma + 1;
2136 if (include_flags)
2137 print_specific_help (include_flags, exclude_flags, 0, opts,
2138 lang_mask);
2141 /* Handle target- and language-independent options. Return zero to
2142 generate an "unknown option" message. Only options that need
2143 extra handling need to be listed here; if you simply want
2144 DECODED->value assigned to a variable, it happens automatically. */
2146 bool
2147 common_handle_option (struct gcc_options *opts,
2148 struct gcc_options *opts_set,
2149 const struct cl_decoded_option *decoded,
2150 unsigned int lang_mask, int kind ATTRIBUTE_UNUSED,
2151 location_t loc,
2152 const struct cl_option_handlers *handlers,
2153 diagnostic_context *dc,
2154 void (*target_option_override_hook) (void))
2156 size_t scode = decoded->opt_index;
2157 const char *arg = decoded->arg;
2158 HOST_WIDE_INT value = decoded->value;
2159 enum opt_code code = (enum opt_code) scode;
2161 gcc_assert (decoded->canonical_option_num_elements <= 2);
2163 switch (code)
2165 case OPT__help:
2167 unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
2168 unsigned int undoc_mask;
2169 unsigned int i;
2171 if (lang_mask == CL_DRIVER)
2172 break;
2174 undoc_mask = ((opts->x_verbose_flag | opts->x_extra_warnings)
2176 : CL_UNDOCUMENTED);
2177 target_option_override_hook ();
2178 /* First display any single language specific options. */
2179 for (i = 0; i < cl_lang_count; i++)
2180 print_specific_help
2181 (1U << i, (all_langs_mask & (~ (1U << i))) | undoc_mask, 0, opts,
2182 lang_mask);
2183 /* Next display any multi language specific options. */
2184 print_specific_help (0, undoc_mask, all_langs_mask, opts, lang_mask);
2185 /* Then display any remaining, non-language options. */
2186 for (i = CL_MIN_OPTION_CLASS; i <= CL_MAX_OPTION_CLASS; i <<= 1)
2187 if (i != CL_DRIVER)
2188 print_specific_help (i, undoc_mask, 0, opts, lang_mask);
2189 opts->x_exit_after_options = true;
2190 break;
2193 case OPT__target_help:
2194 if (lang_mask == CL_DRIVER)
2195 break;
2197 target_option_override_hook ();
2198 print_specific_help (CL_TARGET, CL_UNDOCUMENTED, 0, opts, lang_mask);
2199 opts->x_exit_after_options = true;
2200 break;
2202 case OPT__help_:
2204 help_option_arguments.safe_push (arg);
2205 opts->x_exit_after_options = true;
2206 break;
2209 case OPT__version:
2210 if (lang_mask == CL_DRIVER)
2211 break;
2213 opts->x_exit_after_options = true;
2214 break;
2216 case OPT__completion_:
2217 break;
2219 case OPT_fsanitize_:
2220 opts->x_flag_sanitize
2221 = parse_sanitizer_options (arg, loc, code,
2222 opts->x_flag_sanitize, value, true);
2224 /* Kernel ASan implies normal ASan but does not yet support
2225 all features. */
2226 if (opts->x_flag_sanitize & SANITIZE_KERNEL_ADDRESS)
2228 SET_OPTION_IF_UNSET (opts, opts_set,
2229 param_asan_instrumentation_with_call_threshold,
2231 SET_OPTION_IF_UNSET (opts, opts_set, param_asan_globals, 0);
2232 SET_OPTION_IF_UNSET (opts, opts_set, param_asan_stack, 0);
2233 SET_OPTION_IF_UNSET (opts, opts_set, param_asan_protect_allocas, 0);
2234 SET_OPTION_IF_UNSET (opts, opts_set, param_asan_use_after_return, 0);
2236 break;
2238 case OPT_fsanitize_recover_:
2239 opts->x_flag_sanitize_recover
2240 = parse_sanitizer_options (arg, loc, code,
2241 opts->x_flag_sanitize_recover, value, true);
2242 break;
2244 case OPT_fasan_shadow_offset_:
2245 /* Deferred. */
2246 break;
2248 case OPT_fsanitize_address_use_after_scope:
2249 opts->x_flag_sanitize_address_use_after_scope = value;
2250 break;
2252 case OPT_fsanitize_recover:
2253 if (value)
2254 opts->x_flag_sanitize_recover
2255 |= (SANITIZE_UNDEFINED | SANITIZE_UNDEFINED_NONDEFAULT)
2256 & ~(SANITIZE_UNREACHABLE | SANITIZE_RETURN);
2257 else
2258 opts->x_flag_sanitize_recover
2259 &= ~(SANITIZE_UNDEFINED | SANITIZE_UNDEFINED_NONDEFAULT);
2260 break;
2262 case OPT_fsanitize_coverage_:
2263 opts->x_flag_sanitize_coverage
2264 = parse_sanitizer_options (arg, loc, code,
2265 opts->x_flag_sanitize_coverage, value, true);
2266 break;
2268 case OPT_O:
2269 case OPT_Os:
2270 case OPT_Ofast:
2271 case OPT_Og:
2272 /* Currently handled in a prescan. */
2273 break;
2275 case OPT_Werror:
2276 dc->warning_as_error_requested = value;
2277 break;
2279 case OPT_Werror_:
2280 if (lang_mask == CL_DRIVER)
2281 break;
2283 enable_warning_as_error (arg, value, lang_mask, handlers,
2284 opts, opts_set, loc, dc);
2285 break;
2287 case OPT_Wfatal_errors:
2288 dc->fatal_errors = value;
2289 break;
2291 case OPT_Wstack_usage_:
2292 opts->x_flag_stack_usage_info = value != -1;
2293 break;
2295 case OPT_Wstrict_aliasing:
2296 set_Wstrict_aliasing (opts, value);
2297 break;
2299 case OPT_Wstrict_overflow:
2300 opts->x_warn_strict_overflow = (value
2301 ? (int) WARN_STRICT_OVERFLOW_CONDITIONAL
2302 : 0);
2303 break;
2305 case OPT_Wsystem_headers:
2306 dc->dc_warn_system_headers = value;
2307 break;
2309 case OPT_aux_info:
2310 opts->x_flag_gen_aux_info = 1;
2311 break;
2313 case OPT_auxbase_strip:
2315 char *tmp = xstrdup (arg);
2316 strip_off_ending (tmp, strlen (tmp));
2317 if (tmp[0])
2318 opts->x_aux_base_name = tmp;
2319 else
2320 free (tmp);
2322 break;
2324 case OPT_d:
2325 decode_d_option (arg, opts, loc, dc);
2326 break;
2328 case OPT_fcall_used_:
2329 case OPT_fcall_saved_:
2330 /* Deferred. */
2331 break;
2333 case OPT_fdbg_cnt_:
2334 /* Deferred. */
2335 break;
2337 case OPT_fdbg_cnt_list:
2338 /* Deferred. */
2339 opts->x_exit_after_options = true;
2340 break;
2342 case OPT_fdebug_prefix_map_:
2343 case OPT_ffile_prefix_map_:
2344 /* Deferred. */
2345 break;
2347 case OPT_fcallgraph_info:
2348 opts->x_flag_callgraph_info = CALLGRAPH_INFO_NAKED;
2349 break;
2351 case OPT_fcallgraph_info_:
2353 char *my_arg, *p;
2354 my_arg = xstrdup (arg);
2355 p = strtok (my_arg, ",");
2356 while (p)
2358 if (strcmp (p, "su") == 0)
2360 opts->x_flag_callgraph_info |= CALLGRAPH_INFO_STACK_USAGE;
2361 opts->x_flag_stack_usage_info = true;
2363 else if (strcmp (p, "da") == 0)
2364 opts->x_flag_callgraph_info |= CALLGRAPH_INFO_DYNAMIC_ALLOC;
2365 else
2366 return 0;
2367 p = strtok (NULL, ",");
2369 free (my_arg);
2371 break;
2373 case OPT_fdiagnostics_show_location_:
2374 diagnostic_prefixing_rule (dc) = (diagnostic_prefixing_rule_t) value;
2375 break;
2377 case OPT_fdiagnostics_show_caret:
2378 dc->show_caret = value;
2379 break;
2381 case OPT_fdiagnostics_show_labels:
2382 dc->show_labels_p = value;
2383 break;
2385 case OPT_fdiagnostics_show_line_numbers:
2386 dc->show_line_numbers_p = value;
2387 break;
2389 case OPT_fdiagnostics_color_:
2390 diagnostic_color_init (dc, value);
2391 break;
2393 case OPT_fdiagnostics_urls_:
2394 diagnostic_urls_init (dc, value);
2395 break;
2397 case OPT_fdiagnostics_format_:
2398 diagnostic_output_format_init (dc,
2399 (enum diagnostics_output_format)value);
2400 break;
2402 case OPT_fdiagnostics_parseable_fixits:
2403 dc->parseable_fixits_p = value;
2404 break;
2406 case OPT_fdiagnostics_show_option:
2407 dc->show_option_requested = value;
2408 break;
2410 case OPT_fdiagnostics_minimum_margin_width_:
2411 dc->min_margin_width = value;
2412 break;
2414 case OPT_fdump_:
2415 /* Deferred. */
2416 break;
2418 case OPT_ffast_math:
2419 set_fast_math_flags (opts, value);
2420 break;
2422 case OPT_funsafe_math_optimizations:
2423 set_unsafe_math_optimizations_flags (opts, value);
2424 break;
2426 case OPT_ffixed_:
2427 /* Deferred. */
2428 break;
2430 case OPT_finline_limit_:
2431 SET_OPTION_IF_UNSET (opts, opts_set, param_max_inline_insns_single,
2432 value / 2);
2433 SET_OPTION_IF_UNSET (opts, opts_set, param_max_inline_insns_auto,
2434 value / 2);
2435 break;
2437 case OPT_finstrument_functions_exclude_function_list_:
2438 add_comma_separated_to_vector
2439 (&opts->x_flag_instrument_functions_exclude_functions, arg);
2440 break;
2442 case OPT_finstrument_functions_exclude_file_list_:
2443 add_comma_separated_to_vector
2444 (&opts->x_flag_instrument_functions_exclude_files, arg);
2445 break;
2447 case OPT_fmessage_length_:
2448 pp_set_line_maximum_length (dc->printer, value);
2449 diagnostic_set_caret_max_width (dc, value);
2450 break;
2452 case OPT_fopt_info:
2453 case OPT_fopt_info_:
2454 /* Deferred. */
2455 break;
2457 case OPT_foffload_:
2459 const char *p = arg;
2460 opts->x_flag_disable_hsa = true;
2461 while (*p != 0)
2463 const char *comma = strchr (p, ',');
2465 if ((strncmp (p, "disable", 7) == 0)
2466 && (p[7] == ',' || p[7] == '\0'))
2468 opts->x_flag_disable_hsa = true;
2469 break;
2472 if ((strncmp (p, "hsa", 3) == 0)
2473 && (p[3] == ',' || p[3] == '\0'))
2475 #ifdef ENABLE_HSA
2476 opts->x_flag_disable_hsa = false;
2477 #else
2478 sorry ("HSA has not been enabled during configuration");
2479 #endif
2481 if (!comma)
2482 break;
2483 p = comma + 1;
2485 break;
2488 #ifndef ACCEL_COMPILER
2489 case OPT_foffload_abi_:
2490 error_at (loc, "%<-foffload-abi%> option can be specified only for "
2491 "offload compiler");
2492 break;
2493 #endif
2495 case OPT_fpack_struct_:
2496 if (value <= 0 || (value & (value - 1)) || value > 16)
2497 error_at (loc,
2498 "structure alignment must be a small power of two, not %wu",
2499 value);
2500 else
2501 opts->x_initial_max_fld_align = value;
2502 break;
2504 case OPT_fplugin_:
2505 case OPT_fplugin_arg_:
2506 /* Deferred. */
2507 break;
2509 case OPT_fprofile_use_:
2510 opts->x_profile_data_prefix = xstrdup (arg);
2511 opts->x_flag_profile_use = true;
2512 value = true;
2513 /* No break here - do -fprofile-use processing. */
2514 /* FALLTHRU */
2515 case OPT_fprofile_use:
2516 enable_fdo_optimizations (opts, opts_set, value);
2517 SET_OPTION_IF_UNSET (opts, opts_set, flag_profile_reorder_functions,
2518 value);
2519 /* Indirect call profiling should do all useful transformations
2520 speculative devirtualization does. */
2521 if (opts->x_flag_value_profile_transformations)
2522 SET_OPTION_IF_UNSET (opts, opts_set, flag_devirtualize_speculatively,
2523 false);
2524 break;
2526 case OPT_fauto_profile_:
2527 opts->x_auto_profile_file = xstrdup (arg);
2528 opts->x_flag_auto_profile = true;
2529 value = true;
2530 /* No break here - do -fauto-profile processing. */
2531 /* FALLTHRU */
2532 case OPT_fauto_profile:
2533 enable_fdo_optimizations (opts, opts_set, value);
2534 SET_OPTION_IF_UNSET (opts, opts_set, flag_profile_correction, value);
2535 SET_OPTION_IF_UNSET (opts, opts_set,
2536 param_early_inliner_max_iterations, 10);
2537 break;
2539 case OPT_fprofile_generate_:
2540 opts->x_profile_data_prefix = xstrdup (arg);
2541 value = true;
2542 /* No break here - do -fprofile-generate processing. */
2543 /* FALLTHRU */
2544 case OPT_fprofile_generate:
2545 SET_OPTION_IF_UNSET (opts, opts_set, profile_arc_flag, value);
2546 SET_OPTION_IF_UNSET (opts, opts_set, flag_profile_values, value);
2547 SET_OPTION_IF_UNSET (opts, opts_set, flag_inline_functions, value);
2548 SET_OPTION_IF_UNSET (opts, opts_set, flag_ipa_bit_cp, value);
2549 /* FIXME: Instrumentation we insert makes ipa-reference bitmaps
2550 quadratic. Disable the pass until better memory representation
2551 is done. */
2552 SET_OPTION_IF_UNSET (opts, opts_set, flag_ipa_reference, false);
2553 break;
2555 case OPT_fpatchable_function_entry_:
2557 char *patch_area_arg = xstrdup (arg);
2558 char *comma = strchr (patch_area_arg, ',');
2559 if (comma)
2561 *comma = '\0';
2562 function_entry_patch_area_size =
2563 integral_argument (patch_area_arg);
2564 function_entry_patch_area_start =
2565 integral_argument (comma + 1);
2567 else
2569 function_entry_patch_area_size =
2570 integral_argument (patch_area_arg);
2571 function_entry_patch_area_start = 0;
2573 if (function_entry_patch_area_size < 0
2574 || function_entry_patch_area_start < 0
2575 || function_entry_patch_area_size
2576 < function_entry_patch_area_start)
2577 error ("invalid arguments for %<-fpatchable_function_entry%>");
2578 free (patch_area_arg);
2580 break;
2582 case OPT_ftree_vectorize:
2583 /* Automatically sets -ftree-loop-vectorize and
2584 -ftree-slp-vectorize. Nothing more to do here. */
2585 break;
2586 case OPT_fshow_column:
2587 dc->show_column = value;
2588 break;
2590 case OPT_frandom_seed:
2591 /* The real switch is -fno-random-seed. */
2592 if (value)
2593 return false;
2594 /* Deferred. */
2595 break;
2597 case OPT_frandom_seed_:
2598 /* Deferred. */
2599 break;
2601 case OPT_fsched_verbose_:
2602 #ifdef INSN_SCHEDULING
2603 /* Handled with Var in common.opt. */
2604 break;
2605 #else
2606 return false;
2607 #endif
2609 case OPT_fsched_stalled_insns_:
2610 opts->x_flag_sched_stalled_insns = value;
2611 if (opts->x_flag_sched_stalled_insns == 0)
2612 opts->x_flag_sched_stalled_insns = -1;
2613 break;
2615 case OPT_fsched_stalled_insns_dep_:
2616 opts->x_flag_sched_stalled_insns_dep = value;
2617 break;
2619 case OPT_fstack_check_:
2620 if (!strcmp (arg, "no"))
2621 opts->x_flag_stack_check = NO_STACK_CHECK;
2622 else if (!strcmp (arg, "generic"))
2623 /* This is the old stack checking method. */
2624 opts->x_flag_stack_check = STACK_CHECK_BUILTIN
2625 ? FULL_BUILTIN_STACK_CHECK
2626 : GENERIC_STACK_CHECK;
2627 else if (!strcmp (arg, "specific"))
2628 /* This is the new stack checking method. */
2629 opts->x_flag_stack_check = STACK_CHECK_BUILTIN
2630 ? FULL_BUILTIN_STACK_CHECK
2631 : STACK_CHECK_STATIC_BUILTIN
2632 ? STATIC_BUILTIN_STACK_CHECK
2633 : GENERIC_STACK_CHECK;
2634 else
2635 warning_at (loc, 0, "unknown stack check parameter %qs", arg);
2636 break;
2638 case OPT_fstack_limit:
2639 /* The real switch is -fno-stack-limit. */
2640 if (value)
2641 return false;
2642 /* Deferred. */
2643 break;
2645 case OPT_fstack_limit_register_:
2646 case OPT_fstack_limit_symbol_:
2647 /* Deferred. */
2648 break;
2650 case OPT_fstack_usage:
2651 opts->x_flag_stack_usage = value;
2652 opts->x_flag_stack_usage_info = value != 0;
2653 break;
2655 case OPT_g:
2656 set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, arg, opts, opts_set,
2657 loc);
2658 break;
2660 case OPT_gdwarf:
2661 if (arg && strlen (arg) != 0)
2663 error_at (loc, "%<-gdwarf%s%> is ambiguous; "
2664 "use %<-gdwarf-%s%> for DWARF version "
2665 "or %<-gdwarf%> %<-g%s%> for debug level", arg, arg, arg);
2666 break;
2668 else
2669 value = opts->x_dwarf_version;
2671 /* FALLTHRU */
2672 case OPT_gdwarf_:
2673 if (value < 2 || value > 5)
2674 error_at (loc, "dwarf version %wu is not supported", value);
2675 else
2676 opts->x_dwarf_version = value;
2677 set_debug_level (DWARF2_DEBUG, false, "", opts, opts_set, loc);
2678 break;
2680 case OPT_gsplit_dwarf:
2681 set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, "", opts, opts_set,
2682 loc);
2683 break;
2685 case OPT_ggdb:
2686 set_debug_level (NO_DEBUG, 2, arg, opts, opts_set, loc);
2687 break;
2689 case OPT_gstabs:
2690 case OPT_gstabs_:
2691 set_debug_level (DBX_DEBUG, code == OPT_gstabs_, arg, opts, opts_set,
2692 loc);
2693 break;
2695 case OPT_gvms:
2696 set_debug_level (VMS_DEBUG, false, arg, opts, opts_set, loc);
2697 break;
2699 case OPT_gxcoff:
2700 case OPT_gxcoff_:
2701 set_debug_level (XCOFF_DEBUG, code == OPT_gxcoff_, arg, opts, opts_set,
2702 loc);
2703 break;
2705 case OPT_gz:
2706 case OPT_gz_:
2707 /* Handled completely via specs. */
2708 break;
2710 case OPT_pedantic_errors:
2711 dc->pedantic_errors = 1;
2712 control_warning_option (OPT_Wpedantic, DK_ERROR, NULL, value,
2713 loc, lang_mask,
2714 handlers, opts, opts_set,
2715 dc);
2716 break;
2718 case OPT_flto:
2719 opts->x_flag_lto = value ? "" : NULL;
2720 break;
2722 case OPT_flto_:
2723 if (strcmp (arg, "none") != 0
2724 && strcmp (arg, "jobserver") != 0
2725 && strcmp (arg, "auto") != 0
2726 && atoi (arg) == 0)
2727 error_at (loc,
2728 "unrecognized argument to %<-flto=%> option: %qs", arg);
2729 break;
2731 case OPT_w:
2732 dc->dc_inhibit_warnings = true;
2733 break;
2735 case OPT_fmax_errors_:
2736 dc->max_errors = value;
2737 break;
2739 case OPT_fuse_ld_bfd:
2740 case OPT_fuse_ld_gold:
2741 case OPT_fuse_ld_lld:
2742 case OPT_fuse_linker_plugin:
2743 /* No-op. Used by the driver and passed to us because it starts with f.*/
2744 break;
2746 case OPT_fwrapv:
2747 if (value)
2748 opts->x_flag_trapv = 0;
2749 break;
2751 case OPT_ftrapv:
2752 if (value)
2753 opts->x_flag_wrapv = 0;
2754 break;
2756 case OPT_fstrict_overflow:
2757 opts->x_flag_wrapv = !value;
2758 opts->x_flag_wrapv_pointer = !value;
2759 if (!value)
2760 opts->x_flag_trapv = 0;
2761 break;
2763 case OPT_fipa_icf:
2764 opts->x_flag_ipa_icf_functions = value;
2765 opts->x_flag_ipa_icf_variables = value;
2766 break;
2768 case OPT_falign_loops_:
2769 check_alignment_argument (loc, arg, "loops");
2770 break;
2772 case OPT_falign_jumps_:
2773 check_alignment_argument (loc, arg, "jumps");
2774 break;
2776 case OPT_falign_labels_:
2777 check_alignment_argument (loc, arg, "labels");
2778 break;
2780 case OPT_falign_functions_:
2781 check_alignment_argument (loc, arg, "functions");
2782 break;
2784 default:
2785 /* If the flag was handled in a standard way, assume the lack of
2786 processing here is intentional. */
2787 gcc_assert (option_flag_var (scode, opts));
2788 break;
2791 common_handle_option_auto (opts, opts_set, decoded, lang_mask, kind,
2792 loc, handlers, dc);
2793 return true;
2796 /* Used to set the level of strict aliasing warnings in OPTS,
2797 when no level is specified (i.e., when -Wstrict-aliasing, and not
2798 -Wstrict-aliasing=level was given).
2799 ONOFF is assumed to take value 1 when -Wstrict-aliasing is specified,
2800 and 0 otherwise. After calling this function, wstrict_aliasing will be
2801 set to the default value of -Wstrict_aliasing=level, currently 3. */
2802 static void
2803 set_Wstrict_aliasing (struct gcc_options *opts, int onoff)
2805 gcc_assert (onoff == 0 || onoff == 1);
2806 if (onoff != 0)
2807 opts->x_warn_strict_aliasing = 3;
2808 else
2809 opts->x_warn_strict_aliasing = 0;
2812 /* The following routines are useful in setting all the flags that
2813 -ffast-math and -fno-fast-math imply. */
2814 static void
2815 set_fast_math_flags (struct gcc_options *opts, int set)
2817 if (!opts->frontend_set_flag_unsafe_math_optimizations)
2819 opts->x_flag_unsafe_math_optimizations = set;
2820 set_unsafe_math_optimizations_flags (opts, set);
2822 if (!opts->frontend_set_flag_finite_math_only)
2823 opts->x_flag_finite_math_only = set;
2824 if (!opts->frontend_set_flag_errno_math)
2825 opts->x_flag_errno_math = !set;
2826 if (set)
2828 if (opts->frontend_set_flag_excess_precision == EXCESS_PRECISION_DEFAULT)
2829 opts->x_flag_excess_precision
2830 = set ? EXCESS_PRECISION_FAST : EXCESS_PRECISION_DEFAULT;
2831 if (!opts->frontend_set_flag_signaling_nans)
2832 opts->x_flag_signaling_nans = 0;
2833 if (!opts->frontend_set_flag_rounding_math)
2834 opts->x_flag_rounding_math = 0;
2835 if (!opts->frontend_set_flag_cx_limited_range)
2836 opts->x_flag_cx_limited_range = 1;
2840 /* When -funsafe-math-optimizations is set the following
2841 flags are set as well. */
2842 static void
2843 set_unsafe_math_optimizations_flags (struct gcc_options *opts, int set)
2845 if (!opts->frontend_set_flag_trapping_math)
2846 opts->x_flag_trapping_math = !set;
2847 if (!opts->frontend_set_flag_signed_zeros)
2848 opts->x_flag_signed_zeros = !set;
2849 if (!opts->frontend_set_flag_associative_math)
2850 opts->x_flag_associative_math = set;
2851 if (!opts->frontend_set_flag_reciprocal_math)
2852 opts->x_flag_reciprocal_math = set;
2855 /* Return true iff flags in OPTS are set as if -ffast-math. */
2856 bool
2857 fast_math_flags_set_p (const struct gcc_options *opts)
2859 return (!opts->x_flag_trapping_math
2860 && opts->x_flag_unsafe_math_optimizations
2861 && opts->x_flag_finite_math_only
2862 && !opts->x_flag_signed_zeros
2863 && !opts->x_flag_errno_math
2864 && opts->x_flag_excess_precision == EXCESS_PRECISION_FAST);
2867 /* Return true iff flags are set as if -ffast-math but using the flags stored
2868 in the struct cl_optimization structure. */
2869 bool
2870 fast_math_flags_struct_set_p (struct cl_optimization *opt)
2872 return (!opt->x_flag_trapping_math
2873 && opt->x_flag_unsafe_math_optimizations
2874 && opt->x_flag_finite_math_only
2875 && !opt->x_flag_signed_zeros
2876 && !opt->x_flag_errno_math);
2879 /* Handle a debug output -g switch for options OPTS
2880 (OPTS_SET->x_write_symbols storing whether a debug type was passed
2881 explicitly), location LOC. EXTENDED is true or false to support
2882 extended output (2 is special and means "-ggdb" was given). */
2883 static void
2884 set_debug_level (enum debug_info_type type, int extended, const char *arg,
2885 struct gcc_options *opts, struct gcc_options *opts_set,
2886 location_t loc)
2888 opts->x_use_gnu_debug_info_extensions = extended;
2890 if (type == NO_DEBUG)
2892 if (opts->x_write_symbols == NO_DEBUG)
2894 opts->x_write_symbols = PREFERRED_DEBUGGING_TYPE;
2896 if (extended == 2)
2898 #if defined DWARF2_DEBUGGING_INFO || defined DWARF2_LINENO_DEBUGGING_INFO
2899 opts->x_write_symbols = DWARF2_DEBUG;
2900 #elif defined DBX_DEBUGGING_INFO
2901 opts->x_write_symbols = DBX_DEBUG;
2902 #endif
2905 if (opts->x_write_symbols == NO_DEBUG)
2906 warning_at (loc, 0, "target system does not support debug output");
2909 else
2911 /* Does it conflict with an already selected type? */
2912 if (opts_set->x_write_symbols != NO_DEBUG
2913 && opts->x_write_symbols != NO_DEBUG
2914 && type != opts->x_write_symbols)
2915 error_at (loc, "debug format %qs conflicts with prior selection",
2916 debug_type_names[type]);
2917 opts->x_write_symbols = type;
2918 opts_set->x_write_symbols = type;
2921 /* A debug flag without a level defaults to level 2.
2922 If off or at level 1, set it to level 2, but if already
2923 at level 3, don't lower it. */
2924 if (*arg == '\0')
2926 if (opts->x_debug_info_level < DINFO_LEVEL_NORMAL)
2927 opts->x_debug_info_level = DINFO_LEVEL_NORMAL;
2929 else
2931 int argval = integral_argument (arg);
2932 if (argval == -1)
2933 error_at (loc, "unrecognized debug output level %qs", arg);
2934 else if (argval > 3)
2935 error_at (loc, "debug output level %qs is too high", arg);
2936 else
2937 opts->x_debug_info_level = (enum debug_info_levels) argval;
2941 /* Arrange to dump core on error for diagnostic context DC. (The
2942 regular error message is still printed first, except in the case of
2943 abort ().) */
2945 static void
2946 setup_core_dumping (diagnostic_context *dc)
2948 #ifdef SIGABRT
2949 signal (SIGABRT, SIG_DFL);
2950 #endif
2951 #if defined(HAVE_SETRLIMIT)
2953 struct rlimit rlim;
2954 if (getrlimit (RLIMIT_CORE, &rlim) != 0)
2955 fatal_error (input_location, "getting core file size maximum limit: %m");
2956 rlim.rlim_cur = rlim.rlim_max;
2957 if (setrlimit (RLIMIT_CORE, &rlim) != 0)
2958 fatal_error (input_location,
2959 "setting core file size limit to maximum: %m");
2961 #endif
2962 diagnostic_abort_on_error (dc);
2965 /* Parse a -d<ARG> command line switch for OPTS, location LOC,
2966 diagnostic context DC. */
2968 static void
2969 decode_d_option (const char *arg, struct gcc_options *opts,
2970 location_t loc, diagnostic_context *dc)
2972 int c;
2974 while (*arg)
2975 switch (c = *arg++)
2977 case 'A':
2978 opts->x_flag_debug_asm = 1;
2979 break;
2980 case 'p':
2981 opts->x_flag_print_asm_name = 1;
2982 break;
2983 case 'P':
2984 opts->x_flag_dump_rtl_in_asm = 1;
2985 opts->x_flag_print_asm_name = 1;
2986 break;
2987 case 'x':
2988 opts->x_rtl_dump_and_exit = 1;
2989 break;
2990 case 'D': /* These are handled by the preprocessor. */
2991 case 'I':
2992 case 'M':
2993 case 'N':
2994 case 'U':
2995 break;
2996 case 'H':
2997 setup_core_dumping (dc);
2998 break;
2999 case 'a':
3000 opts->x_flag_dump_all_passed = true;
3001 break;
3003 default:
3004 warning_at (loc, 0, "unrecognized gcc debugging option: %c", c);
3005 break;
3009 /* Enable (or disable if VALUE is 0) a warning option ARG (language
3010 mask LANG_MASK, option handlers HANDLERS) as an error for option
3011 structures OPTS and OPTS_SET, diagnostic context DC (possibly
3012 NULL), location LOC. This is used by -Werror=. */
3014 static void
3015 enable_warning_as_error (const char *arg, int value, unsigned int lang_mask,
3016 const struct cl_option_handlers *handlers,
3017 struct gcc_options *opts,
3018 struct gcc_options *opts_set,
3019 location_t loc, diagnostic_context *dc)
3021 char *new_option;
3022 int option_index;
3024 new_option = XNEWVEC (char, strlen (arg) + 2);
3025 new_option[0] = 'W';
3026 strcpy (new_option + 1, arg);
3027 option_index = find_opt (new_option, lang_mask);
3028 if (option_index == OPT_SPECIAL_unknown)
3030 option_proposer op;
3031 const char *hint = op.suggest_option (new_option);
3032 if (hint)
3033 error_at (loc, "%<-W%serror=%s%>: no option %<-%s%>;"
3034 " did you mean %<-%s%>?", value ? "" : "no-",
3035 arg, new_option, hint);
3036 else
3037 error_at (loc, "%<-W%serror=%s%>: no option %<-%s%>",
3038 value ? "" : "no-", arg, new_option);
3040 else if (!(cl_options[option_index].flags & CL_WARNING))
3041 error_at (loc, "%<-Werror=%s%>: %<-%s%> is not an option that "
3042 "controls warnings", arg, new_option);
3043 else
3045 const diagnostic_t kind = value ? DK_ERROR : DK_WARNING;
3046 const char *arg = NULL;
3048 if (cl_options[option_index].flags & CL_JOINED)
3049 arg = new_option + cl_options[option_index].opt_len;
3050 control_warning_option (option_index, (int) kind, arg, value,
3051 loc, lang_mask,
3052 handlers, opts, opts_set, dc);
3054 free (new_option);
3057 /* Return malloced memory for the name of the option OPTION_INDEX
3058 which enabled a diagnostic (context CONTEXT), originally of type
3059 ORIG_DIAG_KIND but possibly converted to DIAG_KIND by options such
3060 as -Werror. */
3062 char *
3063 option_name (diagnostic_context *context, int option_index,
3064 diagnostic_t orig_diag_kind, diagnostic_t diag_kind)
3066 if (option_index)
3068 /* A warning classified as an error. */
3069 if ((orig_diag_kind == DK_WARNING || orig_diag_kind == DK_PEDWARN)
3070 && diag_kind == DK_ERROR)
3071 return concat (cl_options[OPT_Werror_].opt_text,
3072 /* Skip over "-W". */
3073 cl_options[option_index].opt_text + 2,
3074 NULL);
3075 /* A warning with option. */
3076 else
3077 return xstrdup (cl_options[option_index].opt_text);
3079 /* A warning without option classified as an error. */
3080 else if ((orig_diag_kind == DK_WARNING || orig_diag_kind == DK_PEDWARN
3081 || diag_kind == DK_WARNING)
3082 && context->warning_as_error_requested)
3083 return xstrdup (cl_options[OPT_Werror].opt_text);
3084 else
3085 return NULL;
3088 /* Return malloced memory for a URL describing the option OPTION_INDEX
3089 which enabled a diagnostic (context CONTEXT). */
3091 char *
3092 get_option_url (diagnostic_context *, int option_index)
3094 if (option_index)
3095 /* DOCUMENTATION_ROOT_URL should be supplied via -D by the Makefile
3096 (see --with-documentation-root-url).
3098 Expect an anchor of the form "index-Wfoo" e.g.
3099 <a name="index-Wformat"></a>, and thus an id within
3100 the URL of "#index-Wformat". */
3101 return concat (DOCUMENTATION_ROOT_URL,
3102 "Warning-Options.html",
3103 "#index", cl_options[option_index].opt_text,
3104 NULL);
3105 else
3106 return NULL;