Fix big memory leak in ix86_valid_target_attribute_p
[official-gcc.git] / gcc / opts.c
blob930ae431157e5fd07e001c2e8d4c34668f0812d5
1 /* Command line option handling.
2 Copyright (C) 2002-2015 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 "params.h"
29 #include "diagnostic.h"
30 #include "opts-diagnostic.h"
31 #include "insn-attr-common.h"
32 #include "common/common-target.h"
34 static void set_Wstrict_aliasing (struct gcc_options *opts, int onoff);
36 /* Indexed by enum debug_info_type. */
37 const char *const debug_type_names[] =
39 "none", "stabs", "coff", "dwarf-2", "xcoff", "vms"
42 /* Parse the -femit-struct-debug-detailed option value
43 and set the flag variables. */
45 #define MATCH( prefix, string ) \
46 ((strncmp (prefix, string, sizeof prefix - 1) == 0) \
47 ? ((string += sizeof prefix - 1), 1) : 0)
49 void
50 set_struct_debug_option (struct gcc_options *opts, location_t loc,
51 const char *spec)
53 /* various labels for comparison */
54 static const char dfn_lbl[] = "dfn:", dir_lbl[] = "dir:", ind_lbl[] = "ind:";
55 static const char ord_lbl[] = "ord:", gen_lbl[] = "gen:";
56 static const char none_lbl[] = "none", any_lbl[] = "any";
57 static const char base_lbl[] = "base", sys_lbl[] = "sys";
59 enum debug_struct_file files = DINFO_STRUCT_FILE_ANY;
60 /* Default is to apply to as much as possible. */
61 enum debug_info_usage usage = DINFO_USAGE_NUM_ENUMS;
62 int ord = 1, gen = 1;
64 /* What usage? */
65 if (MATCH (dfn_lbl, spec))
66 usage = DINFO_USAGE_DFN;
67 else if (MATCH (dir_lbl, spec))
68 usage = DINFO_USAGE_DIR_USE;
69 else if (MATCH (ind_lbl, spec))
70 usage = DINFO_USAGE_IND_USE;
72 /* Generics or not? */
73 if (MATCH (ord_lbl, spec))
74 gen = 0;
75 else if (MATCH (gen_lbl, spec))
76 ord = 0;
78 /* What allowable environment? */
79 if (MATCH (none_lbl, spec))
80 files = DINFO_STRUCT_FILE_NONE;
81 else if (MATCH (any_lbl, spec))
82 files = DINFO_STRUCT_FILE_ANY;
83 else if (MATCH (sys_lbl, spec))
84 files = DINFO_STRUCT_FILE_SYS;
85 else if (MATCH (base_lbl, spec))
86 files = DINFO_STRUCT_FILE_BASE;
87 else
88 error_at (loc,
89 "argument %qs to %<-femit-struct-debug-detailed%> "
90 "not recognized",
91 spec);
93 /* Effect the specification. */
94 if (usage == DINFO_USAGE_NUM_ENUMS)
96 if (ord)
98 opts->x_debug_struct_ordinary[DINFO_USAGE_DFN] = files;
99 opts->x_debug_struct_ordinary[DINFO_USAGE_DIR_USE] = files;
100 opts->x_debug_struct_ordinary[DINFO_USAGE_IND_USE] = files;
102 if (gen)
104 opts->x_debug_struct_generic[DINFO_USAGE_DFN] = files;
105 opts->x_debug_struct_generic[DINFO_USAGE_DIR_USE] = files;
106 opts->x_debug_struct_generic[DINFO_USAGE_IND_USE] = files;
109 else
111 if (ord)
112 opts->x_debug_struct_ordinary[usage] = files;
113 if (gen)
114 opts->x_debug_struct_generic[usage] = files;
117 if (*spec == ',')
118 set_struct_debug_option (opts, loc, spec+1);
119 else
121 /* No more -femit-struct-debug-detailed specifications.
122 Do final checks. */
123 if (*spec != '\0')
124 error_at (loc,
125 "argument %qs to %<-femit-struct-debug-detailed%> unknown",
126 spec);
127 if (opts->x_debug_struct_ordinary[DINFO_USAGE_DIR_USE]
128 < opts->x_debug_struct_ordinary[DINFO_USAGE_IND_USE]
129 || opts->x_debug_struct_generic[DINFO_USAGE_DIR_USE]
130 < opts->x_debug_struct_generic[DINFO_USAGE_IND_USE])
131 error_at (loc,
132 "%<-femit-struct-debug-detailed=dir:...%> must allow "
133 "at least as much as "
134 "%<-femit-struct-debug-detailed=ind:...%>");
138 /* Strip off a legitimate source ending from the input string NAME of
139 length LEN. Rather than having to know the names used by all of
140 our front ends, we strip off an ending of a period followed by
141 up to five characters. (Java uses ".class".) */
143 void
144 strip_off_ending (char *name, int len)
146 int i;
147 for (i = 2; i < 6 && len > i; i++)
149 if (name[len - i] == '.')
151 name[len - i] = '\0';
152 break;
157 /* Find the base name of a path, stripping off both directories and
158 a single final extension. */
160 base_of_path (const char *path, const char **base_out)
162 const char *base = path;
163 const char *dot = 0;
164 const char *p = path;
165 char c = *p;
166 while (c)
168 if (IS_DIR_SEPARATOR (c))
170 base = p + 1;
171 dot = 0;
173 else if (c == '.')
174 dot = p;
175 c = *++p;
177 if (!dot)
178 dot = p;
179 *base_out = base;
180 return dot - base;
183 /* What to print when a switch has no documentation. */
184 static const char undocumented_msg[] = N_("This option lacks documentation.");
185 static const char use_diagnosed_msg[] = N_("Uses of this option are diagnosed.");
187 typedef char *char_p; /* For DEF_VEC_P. */
189 static void handle_param (struct gcc_options *opts,
190 struct gcc_options *opts_set, location_t loc,
191 const char *carg);
192 static void set_debug_level (enum debug_info_type type, int extended,
193 const char *arg, struct gcc_options *opts,
194 struct gcc_options *opts_set,
195 location_t loc);
196 static void set_fast_math_flags (struct gcc_options *opts, int set);
197 static void decode_d_option (const char *arg, struct gcc_options *opts,
198 location_t loc, diagnostic_context *dc);
199 static void set_unsafe_math_optimizations_flags (struct gcc_options *opts,
200 int set);
201 static void enable_warning_as_error (const char *arg, int value,
202 unsigned int lang_mask,
203 const struct cl_option_handlers *handlers,
204 struct gcc_options *opts,
205 struct gcc_options *opts_set,
206 location_t loc,
207 diagnostic_context *dc);
209 /* Handle a back-end option; arguments and return value as for
210 handle_option. */
212 bool
213 target_handle_option (struct gcc_options *opts,
214 struct gcc_options *opts_set,
215 const struct cl_decoded_option *decoded,
216 unsigned int lang_mask ATTRIBUTE_UNUSED, int kind,
217 location_t loc,
218 const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED,
219 diagnostic_context *dc)
221 gcc_assert (dc == global_dc);
222 gcc_assert (kind == DK_UNSPECIFIED);
223 return targetm_common.handle_option (opts, opts_set, decoded, loc);
226 /* Add comma-separated strings to a char_p vector. */
228 static void
229 add_comma_separated_to_vector (void **pvec, const char *arg)
231 char *tmp;
232 char *r;
233 char *w;
234 char *token_start;
235 vec<char_p> *v = (vec<char_p> *) *pvec;
237 vec_check_alloc (v, 1);
239 /* We never free this string. */
240 tmp = xstrdup (arg);
242 r = tmp;
243 w = tmp;
244 token_start = tmp;
246 while (*r != '\0')
248 if (*r == ',')
250 *w++ = '\0';
251 ++r;
252 v->safe_push (token_start);
253 token_start = w;
255 if (*r == '\\' && r[1] == ',')
257 *w++ = ',';
258 r += 2;
260 else
261 *w++ = *r++;
263 if (*token_start != '\0')
264 v->safe_push (token_start);
266 *pvec = v;
269 /* Initialize opts_obstack if not initialized. */
271 void
272 init_opts_obstack (void)
274 static bool opts_obstack_initialized = false;
276 if (!opts_obstack_initialized)
278 opts_obstack_initialized = true;
279 gcc_obstack_init (&opts_obstack);
283 /* Initialize OPTS and OPTS_SET before using them in parsing options. */
285 void
286 init_options_struct (struct gcc_options *opts, struct gcc_options *opts_set)
288 size_t num_params = get_num_compiler_params ();
290 init_opts_obstack ();
292 *opts = global_options_init;
294 if (opts_set)
295 memset (opts_set, 0, sizeof (*opts_set));
297 opts->x_param_values = XNEWVEC (int, num_params);
299 if (opts_set)
300 opts_set->x_param_values = XCNEWVEC (int, num_params);
302 init_param_values (opts->x_param_values);
304 /* Initialize whether `char' is signed. */
305 opts->x_flag_signed_char = DEFAULT_SIGNED_CHAR;
306 /* Set this to a special "uninitialized" value. The actual default
307 is set after target options have been processed. */
308 opts->x_flag_short_enums = 2;
310 /* Initialize target_flags before default_options_optimization
311 so the latter can modify it. */
312 opts->x_target_flags = targetm_common.default_target_flags;
314 /* Some targets have ABI-specified unwind tables. */
315 opts->x_flag_unwind_tables = targetm_common.unwind_tables_default;
317 /* Some targets have other target-specific initialization. */
318 targetm_common.option_init_struct (opts);
321 /* Release any allocations owned by OPTS. */
323 void
324 finalize_options_struct (struct gcc_options *opts)
326 XDELETEVEC (opts->x_param_values);
329 /* If indicated by the optimization level LEVEL (-Os if SIZE is set,
330 -Ofast if FAST is set, -Og if DEBUG is set), apply the option DEFAULT_OPT
331 to OPTS and OPTS_SET, diagnostic context DC, location LOC, with language
332 mask LANG_MASK and option handlers HANDLERS. */
334 static void
335 maybe_default_option (struct gcc_options *opts,
336 struct gcc_options *opts_set,
337 const struct default_options *default_opt,
338 int level, bool size, bool fast, bool debug,
339 unsigned int lang_mask,
340 const struct cl_option_handlers *handlers,
341 location_t loc,
342 diagnostic_context *dc)
344 const struct cl_option *option = &cl_options[default_opt->opt_index];
345 bool enabled;
347 if (size)
348 gcc_assert (level == 2);
349 if (fast)
350 gcc_assert (level == 3);
351 if (debug)
352 gcc_assert (level == 1);
354 switch (default_opt->levels)
356 case OPT_LEVELS_ALL:
357 enabled = true;
358 break;
360 case OPT_LEVELS_0_ONLY:
361 enabled = (level == 0);
362 break;
364 case OPT_LEVELS_1_PLUS:
365 enabled = (level >= 1);
366 break;
368 case OPT_LEVELS_1_PLUS_SPEED_ONLY:
369 enabled = (level >= 1 && !size && !debug);
370 break;
372 case OPT_LEVELS_1_PLUS_NOT_DEBUG:
373 enabled = (level >= 1 && !debug);
374 break;
376 case OPT_LEVELS_2_PLUS:
377 enabled = (level >= 2);
378 break;
380 case OPT_LEVELS_2_PLUS_SPEED_ONLY:
381 enabled = (level >= 2 && !size && !debug);
382 break;
384 case OPT_LEVELS_3_PLUS:
385 enabled = (level >= 3);
386 break;
388 case OPT_LEVELS_3_PLUS_AND_SIZE:
389 enabled = (level >= 3 || size);
390 break;
392 case OPT_LEVELS_SIZE:
393 enabled = size;
394 break;
396 case OPT_LEVELS_FAST:
397 enabled = fast;
398 break;
400 case OPT_LEVELS_NONE:
401 default:
402 gcc_unreachable ();
405 if (enabled)
406 handle_generated_option (opts, opts_set, default_opt->opt_index,
407 default_opt->arg, default_opt->value,
408 lang_mask, DK_UNSPECIFIED, loc,
409 handlers, dc);
410 else if (default_opt->arg == NULL
411 && !option->cl_reject_negative)
412 handle_generated_option (opts, opts_set, default_opt->opt_index,
413 default_opt->arg, !default_opt->value,
414 lang_mask, DK_UNSPECIFIED, loc,
415 handlers, dc);
418 /* As indicated by the optimization level LEVEL (-Os if SIZE is set,
419 -Ofast if FAST is set), apply the options in array DEFAULT_OPTS to
420 OPTS and OPTS_SET, diagnostic context DC, location LOC, with
421 language mask LANG_MASK and option handlers HANDLERS. */
423 static void
424 maybe_default_options (struct gcc_options *opts,
425 struct gcc_options *opts_set,
426 const struct default_options *default_opts,
427 int level, bool size, bool fast, bool debug,
428 unsigned int lang_mask,
429 const struct cl_option_handlers *handlers,
430 location_t loc,
431 diagnostic_context *dc)
433 size_t i;
435 for (i = 0; default_opts[i].levels != OPT_LEVELS_NONE; i++)
436 maybe_default_option (opts, opts_set, &default_opts[i],
437 level, size, fast, debug,
438 lang_mask, handlers, loc, dc);
441 /* Table of options enabled by default at different levels. */
443 static const struct default_options default_options_table[] =
445 /* -O1 optimizations. */
446 { OPT_LEVELS_1_PLUS, OPT_fdefer_pop, NULL, 1 },
447 #if DELAY_SLOTS
448 { OPT_LEVELS_1_PLUS, OPT_fdelayed_branch, NULL, 1 },
449 #endif
450 { OPT_LEVELS_1_PLUS, OPT_fguess_branch_probability, NULL, 1 },
451 { OPT_LEVELS_1_PLUS, OPT_fcprop_registers, NULL, 1 },
452 { OPT_LEVELS_1_PLUS, OPT_fforward_propagate, NULL, 1 },
453 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fif_conversion, NULL, 1 },
454 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fif_conversion2, NULL, 1 },
455 { OPT_LEVELS_1_PLUS, OPT_fipa_pure_const, NULL, 1 },
456 { OPT_LEVELS_1_PLUS, OPT_fipa_reference, NULL, 1 },
457 { OPT_LEVELS_1_PLUS, OPT_fipa_profile, NULL, 1 },
458 { OPT_LEVELS_1_PLUS, OPT_fmerge_constants, NULL, 1 },
459 { OPT_LEVELS_1_PLUS, OPT_freorder_blocks, NULL, 1 },
460 { OPT_LEVELS_1_PLUS, OPT_fshrink_wrap, NULL, 1 },
461 { OPT_LEVELS_1_PLUS, OPT_fsplit_wide_types, NULL, 1 },
462 { OPT_LEVELS_1_PLUS, OPT_ftree_ccp, NULL, 1 },
463 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_bit_ccp, NULL, 1 },
464 { OPT_LEVELS_1_PLUS, OPT_ftree_coalesce_vars, NULL, 1 },
465 { OPT_LEVELS_1_PLUS, OPT_ftree_dce, NULL, 1 },
466 { OPT_LEVELS_1_PLUS, OPT_ftree_dominator_opts, NULL, 1 },
467 { OPT_LEVELS_1_PLUS, OPT_ftree_dse, NULL, 1 },
468 { OPT_LEVELS_1_PLUS, OPT_ftree_ter, NULL, 1 },
469 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_sra, NULL, 1 },
470 { OPT_LEVELS_1_PLUS, OPT_ftree_fre, NULL, 1 },
471 { OPT_LEVELS_1_PLUS, OPT_ftree_copy_prop, NULL, 1 },
472 { OPT_LEVELS_1_PLUS, OPT_ftree_sink, NULL, 1 },
473 { OPT_LEVELS_1_PLUS, OPT_ftree_ch, NULL, 1 },
474 { OPT_LEVELS_1_PLUS, OPT_fcombine_stack_adjustments, NULL, 1 },
475 { OPT_LEVELS_1_PLUS, OPT_fcompare_elim, NULL, 1 },
476 { OPT_LEVELS_1_PLUS, OPT_ftree_slsr, NULL, 1 },
477 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fbranch_count_reg, NULL, 1 },
478 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fmove_loop_invariants, NULL, 1 },
479 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_pta, NULL, 1 },
480 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fssa_phiopt, NULL, 1 },
482 /* -O2 optimizations. */
483 { OPT_LEVELS_2_PLUS, OPT_finline_small_functions, NULL, 1 },
484 { OPT_LEVELS_2_PLUS, OPT_findirect_inlining, NULL, 1 },
485 { OPT_LEVELS_2_PLUS, OPT_fpartial_inlining, NULL, 1 },
486 { OPT_LEVELS_2_PLUS, OPT_fthread_jumps, NULL, 1 },
487 { OPT_LEVELS_2_PLUS, OPT_fcrossjumping, NULL, 1 },
488 { OPT_LEVELS_2_PLUS, OPT_foptimize_sibling_calls, NULL, 1 },
489 { OPT_LEVELS_2_PLUS, OPT_fcse_follow_jumps, NULL, 1 },
490 { OPT_LEVELS_2_PLUS, OPT_fgcse, NULL, 1 },
491 { OPT_LEVELS_2_PLUS, OPT_fexpensive_optimizations, NULL, 1 },
492 { OPT_LEVELS_2_PLUS, OPT_frerun_cse_after_loop, NULL, 1 },
493 { OPT_LEVELS_2_PLUS, OPT_fcaller_saves, NULL, 1 },
494 { OPT_LEVELS_2_PLUS, OPT_fpeephole2, NULL, 1 },
495 #ifdef INSN_SCHEDULING
496 /* Only run the pre-regalloc scheduling pass if optimizing for speed. */
497 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_fschedule_insns, NULL, 1 },
498 { OPT_LEVELS_2_PLUS, OPT_fschedule_insns2, NULL, 1 },
499 #endif
500 { OPT_LEVELS_2_PLUS, OPT_fstrict_aliasing, NULL, 1 },
501 { OPT_LEVELS_2_PLUS, OPT_fstrict_overflow, NULL, 1 },
502 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_freorder_blocks_algorithm_, NULL,
503 REORDER_BLOCKS_ALGORITHM_STC },
504 { OPT_LEVELS_2_PLUS, OPT_freorder_functions, NULL, 1 },
505 { OPT_LEVELS_2_PLUS, OPT_ftree_vrp, NULL, 1 },
506 { OPT_LEVELS_2_PLUS, OPT_ftree_builtin_call_dce, NULL, 1 },
507 { OPT_LEVELS_2_PLUS, OPT_ftree_pre, NULL, 1 },
508 { OPT_LEVELS_2_PLUS, OPT_ftree_switch_conversion, NULL, 1 },
509 { OPT_LEVELS_2_PLUS, OPT_fipa_cp, NULL, 1 },
510 { OPT_LEVELS_2_PLUS, OPT_fipa_cp_alignment, NULL, 1 },
511 { OPT_LEVELS_2_PLUS, OPT_fdevirtualize, NULL, 1 },
512 { OPT_LEVELS_2_PLUS, OPT_fdevirtualize_speculatively, NULL, 1 },
513 { OPT_LEVELS_2_PLUS, OPT_fipa_sra, NULL, 1 },
514 { OPT_LEVELS_2_PLUS, OPT_falign_loops, NULL, 1 },
515 { OPT_LEVELS_2_PLUS, OPT_falign_jumps, NULL, 1 },
516 { OPT_LEVELS_2_PLUS, OPT_falign_labels, NULL, 1 },
517 { OPT_LEVELS_2_PLUS, OPT_falign_functions, NULL, 1 },
518 { OPT_LEVELS_2_PLUS, OPT_ftree_tail_merge, NULL, 1 },
519 { OPT_LEVELS_2_PLUS, OPT_fvect_cost_model_, NULL, VECT_COST_MODEL_CHEAP },
520 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_foptimize_strlen, NULL, 1 },
521 { OPT_LEVELS_2_PLUS, OPT_fhoist_adjacent_loads, NULL, 1 },
522 { OPT_LEVELS_2_PLUS, OPT_fipa_icf, NULL, 1 },
523 { OPT_LEVELS_2_PLUS, OPT_fisolate_erroneous_paths_dereference, NULL, 1 },
524 { OPT_LEVELS_2_PLUS, OPT_fipa_ra, NULL, 1 },
525 { OPT_LEVELS_2_PLUS, OPT_flra_remat, NULL, 1 },
527 /* -O3 optimizations. */
528 { OPT_LEVELS_3_PLUS, OPT_ftree_loop_distribute_patterns, NULL, 1 },
529 { OPT_LEVELS_3_PLUS, OPT_fpredictive_commoning, NULL, 1 },
530 /* Inlining of functions reducing size is a good idea with -Os
531 regardless of them being declared inline. */
532 { OPT_LEVELS_3_PLUS_AND_SIZE, OPT_finline_functions, NULL, 1 },
533 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_finline_functions_called_once, NULL, 1 },
534 { OPT_LEVELS_3_PLUS, OPT_funswitch_loops, NULL, 1 },
535 { OPT_LEVELS_3_PLUS, OPT_fgcse_after_reload, NULL, 1 },
536 { OPT_LEVELS_3_PLUS, OPT_ftree_loop_vectorize, NULL, 1 },
537 { OPT_LEVELS_3_PLUS, OPT_ftree_slp_vectorize, NULL, 1 },
538 { OPT_LEVELS_3_PLUS, OPT_fvect_cost_model_, NULL, VECT_COST_MODEL_DYNAMIC },
539 { OPT_LEVELS_3_PLUS, OPT_fipa_cp_clone, NULL, 1 },
540 { OPT_LEVELS_3_PLUS, OPT_ftree_partial_pre, NULL, 1 },
542 /* -Ofast adds optimizations to -O3. */
543 { OPT_LEVELS_FAST, OPT_ffast_math, NULL, 1 },
545 { OPT_LEVELS_NONE, 0, NULL, 0 }
548 /* Default the options in OPTS and OPTS_SET based on the optimization
549 settings in DECODED_OPTIONS and DECODED_OPTIONS_COUNT. */
550 void
551 default_options_optimization (struct gcc_options *opts,
552 struct gcc_options *opts_set,
553 struct cl_decoded_option *decoded_options,
554 unsigned int decoded_options_count,
555 location_t loc,
556 unsigned int lang_mask,
557 const struct cl_option_handlers *handlers,
558 diagnostic_context *dc)
560 unsigned int i;
561 int opt2;
563 /* Scan to see what optimization level has been specified. That will
564 determine the default value of many flags. */
565 for (i = 1; i < decoded_options_count; i++)
567 struct cl_decoded_option *opt = &decoded_options[i];
568 switch (opt->opt_index)
570 case OPT_O:
571 if (*opt->arg == '\0')
573 opts->x_optimize = 1;
574 opts->x_optimize_size = 0;
575 opts->x_optimize_fast = 0;
576 opts->x_optimize_debug = 0;
578 else
580 const int optimize_val = integral_argument (opt->arg);
581 if (optimize_val == -1)
582 error_at (loc, "argument to %<-O%> should be a non-negative "
583 "integer, %<g%>, %<s%> or %<fast%>");
584 else
586 opts->x_optimize = optimize_val;
587 if ((unsigned int) opts->x_optimize > 255)
588 opts->x_optimize = 255;
589 opts->x_optimize_size = 0;
590 opts->x_optimize_fast = 0;
591 opts->x_optimize_debug = 0;
594 break;
596 case OPT_Os:
597 opts->x_optimize_size = 1;
599 /* Optimizing for size forces optimize to be 2. */
600 opts->x_optimize = 2;
601 opts->x_optimize_fast = 0;
602 opts->x_optimize_debug = 0;
603 break;
605 case OPT_Ofast:
606 /* -Ofast only adds flags to -O3. */
607 opts->x_optimize_size = 0;
608 opts->x_optimize = 3;
609 opts->x_optimize_fast = 1;
610 opts->x_optimize_debug = 0;
611 break;
613 case OPT_Og:
614 /* -Og selects optimization level 1. */
615 opts->x_optimize_size = 0;
616 opts->x_optimize = 1;
617 opts->x_optimize_fast = 0;
618 opts->x_optimize_debug = 1;
619 break;
621 default:
622 /* Ignore other options in this prescan. */
623 break;
627 maybe_default_options (opts, opts_set, default_options_table,
628 opts->x_optimize, opts->x_optimize_size,
629 opts->x_optimize_fast, opts->x_optimize_debug,
630 lang_mask, handlers, loc, dc);
632 /* -O2 param settings. */
633 opt2 = (opts->x_optimize >= 2);
635 /* Track fields in field-sensitive alias analysis. */
636 maybe_set_param_value
637 (PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE,
638 opt2 ? 100 : default_param_value (PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE),
639 opts->x_param_values, opts_set->x_param_values);
641 /* For -O1 only do loop invariant motion for very small loops. */
642 maybe_set_param_value
643 (PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP,
644 opt2 ? default_param_value (PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP) : 1000,
645 opts->x_param_values, opts_set->x_param_values);
647 /* At -Ofast, allow store motion to introduce potential race conditions. */
648 maybe_set_param_value
649 (PARAM_ALLOW_STORE_DATA_RACES,
650 opts->x_optimize_fast ? 1
651 : default_param_value (PARAM_ALLOW_STORE_DATA_RACES),
652 opts->x_param_values, opts_set->x_param_values);
654 if (opts->x_optimize_size)
655 /* We want to crossjump as much as possible. */
656 maybe_set_param_value (PARAM_MIN_CROSSJUMP_INSNS, 1,
657 opts->x_param_values, opts_set->x_param_values);
658 else
659 maybe_set_param_value (PARAM_MIN_CROSSJUMP_INSNS,
660 default_param_value (PARAM_MIN_CROSSJUMP_INSNS),
661 opts->x_param_values, opts_set->x_param_values);
663 /* Restrict the amount of work combine does at -Og while retaining
664 most of its useful transforms. */
665 if (opts->x_optimize_debug)
666 maybe_set_param_value (PARAM_MAX_COMBINE_INSNS, 2,
667 opts->x_param_values, opts_set->x_param_values);
669 /* Allow default optimizations to be specified on a per-machine basis. */
670 maybe_default_options (opts, opts_set,
671 targetm_common.option_optimization_table,
672 opts->x_optimize, opts->x_optimize_size,
673 opts->x_optimize_fast, opts->x_optimize_debug,
674 lang_mask, handlers, loc, dc);
677 /* After all options at LOC have been read into OPTS and OPTS_SET,
678 finalize settings of those options and diagnose incompatible
679 combinations. */
680 void
681 finish_options (struct gcc_options *opts, struct gcc_options *opts_set,
682 location_t loc)
684 enum unwind_info_type ui_except;
686 if (opts->x_dump_base_name
687 && ! IS_ABSOLUTE_PATH (opts->x_dump_base_name)
688 && ! opts->x_dump_base_name_prefixed)
690 /* First try to make OPTS->X_DUMP_BASE_NAME relative to the
691 OPTS->X_DUMP_DIR_NAME directory. Then try to make
692 OPTS->X_DUMP_BASE_NAME relative to the OPTS->X_AUX_BASE_NAME
693 directory, typically the directory to contain the object
694 file. */
695 if (opts->x_dump_dir_name)
696 opts->x_dump_base_name = opts_concat (opts->x_dump_dir_name,
697 opts->x_dump_base_name, NULL);
698 else if (opts->x_aux_base_name
699 && strcmp (opts->x_aux_base_name, HOST_BIT_BUCKET) != 0)
701 const char *aux_base;
703 base_of_path (opts->x_aux_base_name, &aux_base);
704 if (opts->x_aux_base_name != aux_base)
706 int dir_len = aux_base - opts->x_aux_base_name;
707 char *new_dump_base_name
708 = XOBNEWVEC (&opts_obstack, char,
709 strlen (opts->x_dump_base_name) + dir_len + 1);
711 /* Copy directory component from OPTS->X_AUX_BASE_NAME. */
712 memcpy (new_dump_base_name, opts->x_aux_base_name, dir_len);
713 /* Append existing OPTS->X_DUMP_BASE_NAME. */
714 strcpy (new_dump_base_name + dir_len, opts->x_dump_base_name);
715 opts->x_dump_base_name = new_dump_base_name;
718 opts->x_dump_base_name_prefixed = true;
721 /* Handle related options for unit-at-a-time, toplevel-reorder, and
722 section-anchors. */
723 if (!opts->x_flag_unit_at_a_time)
725 if (opts->x_flag_section_anchors && opts_set->x_flag_section_anchors)
726 error_at (loc, "section anchors must be disabled when unit-at-a-time "
727 "is disabled");
728 opts->x_flag_section_anchors = 0;
729 if (opts->x_flag_toplevel_reorder == 1)
730 error_at (loc, "toplevel reorder must be disabled when unit-at-a-time "
731 "is disabled");
732 opts->x_flag_toplevel_reorder = 0;
735 if (opts->x_flag_tm && opts->x_flag_non_call_exceptions)
736 sorry ("transactional memory is not supported with non-call exceptions");
738 /* Unless the user has asked for section anchors, we disable toplevel
739 reordering at -O0 to disable transformations that might be surprising
740 to end users and to get -fno-toplevel-reorder tested. */
741 if (!opts->x_optimize
742 && opts->x_flag_toplevel_reorder == 2
743 && !(opts->x_flag_section_anchors && opts_set->x_flag_section_anchors))
745 opts->x_flag_toplevel_reorder = 0;
746 opts->x_flag_section_anchors = 0;
748 if (!opts->x_flag_toplevel_reorder)
750 if (opts->x_flag_section_anchors && opts_set->x_flag_section_anchors)
751 error_at (loc, "section anchors must be disabled when toplevel reorder"
752 " is disabled");
753 opts->x_flag_section_anchors = 0;
756 if (!opts->x_flag_opts_finished)
758 /* We initialize opts->x_flag_pie to -1 so that targets can set a
759 default value. */
760 if (opts->x_flag_pie == -1)
762 if (opts->x_flag_pic == 0)
763 opts->x_flag_pie = DEFAULT_FLAG_PIE;
764 else
765 opts->x_flag_pie = 0;
767 if (opts->x_flag_pie)
768 opts->x_flag_pic = opts->x_flag_pie;
769 if (opts->x_flag_pic && !opts->x_flag_pie)
770 opts->x_flag_shlib = 1;
771 opts->x_flag_opts_finished = true;
774 /* We initialize opts->x_flag_stack_protect to -1 so that targets
775 can set a default value. */
776 if (opts->x_flag_stack_protect == -1)
777 opts->x_flag_stack_protect = DEFAULT_FLAG_SSP;
779 if (opts->x_optimize == 0)
781 /* Inlining does not work if not optimizing,
782 so force it not to be done. */
783 opts->x_warn_inline = 0;
784 opts->x_flag_no_inline = 1;
787 /* The optimization to partition hot and cold basic blocks into separate
788 sections of the .o and executable files does not work (currently)
789 with exception handling. This is because there is no support for
790 generating unwind info. If opts->x_flag_exceptions is turned on
791 we need to turn off the partitioning optimization. */
793 ui_except = targetm_common.except_unwind_info (opts);
795 if (opts->x_flag_exceptions
796 && opts->x_flag_reorder_blocks_and_partition
797 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))
799 if (opts_set->x_flag_reorder_blocks_and_partition)
800 inform (loc,
801 "-freorder-blocks-and-partition does not work "
802 "with exceptions on this architecture");
803 opts->x_flag_reorder_blocks_and_partition = 0;
804 opts->x_flag_reorder_blocks = 1;
807 /* If user requested unwind info, then turn off the partitioning
808 optimization. */
810 if (opts->x_flag_unwind_tables
811 && !targetm_common.unwind_tables_default
812 && opts->x_flag_reorder_blocks_and_partition
813 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))
815 if (opts_set->x_flag_reorder_blocks_and_partition)
816 inform (loc,
817 "-freorder-blocks-and-partition does not support "
818 "unwind info on this architecture");
819 opts->x_flag_reorder_blocks_and_partition = 0;
820 opts->x_flag_reorder_blocks = 1;
823 /* If the target requested unwind info, then turn off the partitioning
824 optimization with a different message. Likewise, if the target does not
825 support named sections. */
827 if (opts->x_flag_reorder_blocks_and_partition
828 && (!targetm_common.have_named_sections
829 || (opts->x_flag_unwind_tables
830 && targetm_common.unwind_tables_default
831 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))))
833 if (opts_set->x_flag_reorder_blocks_and_partition)
834 inform (loc,
835 "-freorder-blocks-and-partition does not work "
836 "on this architecture");
837 opts->x_flag_reorder_blocks_and_partition = 0;
838 opts->x_flag_reorder_blocks = 1;
841 /* Disable -freorder-blocks-and-partition when -fprofile-use is not in
842 effect. Function splitting was not actually being performed in that case,
843 as probably_never_executed_bb_p does not distinguish any basic blocks as
844 being cold vs hot when there is no profile data. Leaving it enabled,
845 however, causes the assembly code generator to create (empty) cold
846 sections and labels, leading to unnecessary size overhead. */
847 if (opts->x_flag_reorder_blocks_and_partition
848 && !opts_set->x_flag_profile_use)
849 opts->x_flag_reorder_blocks_and_partition = 0;
851 if (opts->x_flag_reorder_blocks_and_partition
852 && !opts_set->x_flag_reorder_functions)
853 opts->x_flag_reorder_functions = 1;
855 /* Pipelining of outer loops is only possible when general pipelining
856 capabilities are requested. */
857 if (!opts->x_flag_sel_sched_pipelining)
858 opts->x_flag_sel_sched_pipelining_outer_loops = 0;
860 if (opts->x_flag_conserve_stack)
862 maybe_set_param_value (PARAM_LARGE_STACK_FRAME, 100,
863 opts->x_param_values, opts_set->x_param_values);
864 maybe_set_param_value (PARAM_STACK_FRAME_GROWTH, 40,
865 opts->x_param_values, opts_set->x_param_values);
868 if (opts->x_flag_lto)
870 #ifdef ENABLE_LTO
871 opts->x_flag_generate_lto = 1;
873 /* When generating IL, do not operate in whole-program mode.
874 Otherwise, symbols will be privatized too early, causing link
875 errors later. */
876 opts->x_flag_whole_program = 0;
877 #else
878 error_at (loc, "LTO support has not been enabled in this configuration");
879 #endif
880 if (!opts->x_flag_fat_lto_objects
881 && (!HAVE_LTO_PLUGIN
882 || (opts_set->x_flag_use_linker_plugin
883 && !opts->x_flag_use_linker_plugin)))
885 if (opts_set->x_flag_fat_lto_objects)
886 error_at (loc, "-fno-fat-lto-objects are supported only with linker plugin");
887 opts->x_flag_fat_lto_objects = 1;
891 /* We initialize opts->x_flag_split_stack to -1 so that targets can set a
892 default value if they choose based on other options. */
893 if (opts->x_flag_split_stack == -1)
894 opts->x_flag_split_stack = 0;
895 else if (opts->x_flag_split_stack)
897 if (!targetm_common.supports_split_stack (true, opts))
899 error_at (loc, "%<-fsplit-stack%> is not supported by "
900 "this compiler configuration");
901 opts->x_flag_split_stack = 0;
905 /* Tune vectorization related parametees according to cost model. */
906 if (opts->x_flag_vect_cost_model == VECT_COST_MODEL_CHEAP)
908 maybe_set_param_value (PARAM_VECT_MAX_VERSION_FOR_ALIAS_CHECKS,
909 6, opts->x_param_values, opts_set->x_param_values);
910 maybe_set_param_value (PARAM_VECT_MAX_VERSION_FOR_ALIGNMENT_CHECKS,
911 0, opts->x_param_values, opts_set->x_param_values);
912 maybe_set_param_value (PARAM_VECT_MAX_PEELING_FOR_ALIGNMENT,
913 0, opts->x_param_values, opts_set->x_param_values);
916 /* Set PARAM_MAX_STORES_TO_SINK to 0 if either vectorization or if-conversion
917 is disabled. */
918 if ((!opts->x_flag_tree_loop_vectorize && !opts->x_flag_tree_slp_vectorize)
919 || !opts->x_flag_tree_loop_if_convert)
920 maybe_set_param_value (PARAM_MAX_STORES_TO_SINK, 0,
921 opts->x_param_values, opts_set->x_param_values);
923 /* The -gsplit-dwarf option requires -ggnu-pubnames. */
924 if (opts->x_dwarf_split_debug_info)
925 opts->x_debug_generate_pub_sections = 2;
927 /* Userspace and kernel ASan conflict with each other. */
929 if ((opts->x_flag_sanitize & SANITIZE_USER_ADDRESS)
930 && (opts->x_flag_sanitize & SANITIZE_KERNEL_ADDRESS))
931 error_at (loc,
932 "-fsanitize=address is incompatible with "
933 "-fsanitize=kernel-address");
935 /* And with TSan. */
937 if ((opts->x_flag_sanitize & SANITIZE_ADDRESS)
938 && (opts->x_flag_sanitize & SANITIZE_THREAD))
939 error_at (loc,
940 "-fsanitize=address and -fsanitize=kernel-address "
941 "are incompatible with -fsanitize=thread");
943 /* Error recovery is not allowed for ASan and TSan. */
945 if (opts->x_flag_sanitize_recover & SANITIZE_USER_ADDRESS)
946 error_at (loc, "-fsanitize-recover=address is not supported");
948 if (opts->x_flag_sanitize_recover & SANITIZE_THREAD)
949 error_at (loc, "-fsanitize-recover=thread is not supported");
951 if (opts->x_flag_sanitize_recover & SANITIZE_LEAK)
952 error_at (loc, "-fsanitize-recover=leak is not supported");
954 /* When instrumenting the pointers, we don't want to remove
955 the null pointer checks. */
956 if (opts->x_flag_sanitize & (SANITIZE_NULL | SANITIZE_NONNULL_ATTRIBUTE
957 | SANITIZE_RETURNS_NONNULL_ATTRIBUTE))
958 opts->x_flag_delete_null_pointer_checks = 0;
960 /* Aggressive compiler optimizations may cause false negatives. */
961 if (opts->x_flag_sanitize)
963 opts->x_flag_aggressive_loop_optimizations = 0;
964 opts->x_flag_strict_overflow = 0;
968 #define LEFT_COLUMN 27
970 /* Output ITEM, of length ITEM_WIDTH, in the left column,
971 followed by word-wrapped HELP in a second column. */
972 static void
973 wrap_help (const char *help,
974 const char *item,
975 unsigned int item_width,
976 unsigned int columns)
978 unsigned int col_width = LEFT_COLUMN;
979 unsigned int remaining, room, len;
981 remaining = strlen (help);
985 room = columns - 3 - MAX (col_width, item_width);
986 if (room > columns)
987 room = 0;
988 len = remaining;
990 if (room < len)
992 unsigned int i;
994 for (i = 0; help[i]; i++)
996 if (i >= room && len != remaining)
997 break;
998 if (help[i] == ' ')
999 len = i;
1000 else if ((help[i] == '-' || help[i] == '/')
1001 && help[i + 1] != ' '
1002 && i > 0 && ISALPHA (help[i - 1]))
1003 len = i + 1;
1007 printf (" %-*.*s %.*s\n", col_width, item_width, item, len, help);
1008 item_width = 0;
1009 while (help[len] == ' ')
1010 len++;
1011 help += len;
1012 remaining -= len;
1014 while (remaining);
1017 /* Print help for a specific front-end, etc. */
1018 static void
1019 print_filtered_help (unsigned int include_flags,
1020 unsigned int exclude_flags,
1021 unsigned int any_flags,
1022 unsigned int columns,
1023 struct gcc_options *opts,
1024 unsigned int lang_mask)
1026 unsigned int i;
1027 const char *help;
1028 bool found = false;
1029 bool displayed = false;
1030 char new_help[256];
1032 if (include_flags == CL_PARAMS)
1034 for (i = 0; i < LAST_PARAM; i++)
1036 const char *param = compiler_params[i].option;
1038 help = compiler_params[i].help;
1039 if (help == NULL || *help == '\0')
1041 if (exclude_flags & CL_UNDOCUMENTED)
1042 continue;
1043 help = undocumented_msg;
1046 /* Get the translation. */
1047 help = _(help);
1049 if (!opts->x_quiet_flag)
1051 snprintf (new_help, sizeof (new_help),
1052 _("default %d minimum %d maximum %d"),
1053 compiler_params[i].default_value,
1054 compiler_params[i].min_value,
1055 compiler_params[i].max_value);
1056 help = new_help;
1058 wrap_help (help, param, strlen (param), columns);
1060 putchar ('\n');
1061 return;
1064 if (!opts->x_help_printed)
1065 opts->x_help_printed = XCNEWVAR (char, cl_options_count);
1067 if (!opts->x_help_enum_printed)
1068 opts->x_help_enum_printed = XCNEWVAR (char, cl_enums_count);
1070 for (i = 0; i < cl_options_count; i++)
1072 const struct cl_option *option = cl_options + i;
1073 unsigned int len;
1074 const char *opt;
1075 const char *tab;
1077 if (include_flags == 0
1078 || ((option->flags & include_flags) != include_flags))
1080 if ((option->flags & any_flags) == 0)
1081 continue;
1084 /* Skip unwanted switches. */
1085 if ((option->flags & exclude_flags) != 0)
1086 continue;
1088 /* The driver currently prints its own help text. */
1089 if ((option->flags & CL_DRIVER) != 0
1090 && (option->flags & (((1U << cl_lang_count) - 1)
1091 | CL_COMMON | CL_TARGET)) == 0)
1092 continue;
1094 found = true;
1095 /* Skip switches that have already been printed. */
1096 if (opts->x_help_printed[i])
1097 continue;
1099 opts->x_help_printed[i] = true;
1101 help = option->help;
1102 if (help == NULL)
1104 if (exclude_flags & CL_UNDOCUMENTED)
1105 continue;
1107 help = undocumented_msg;
1110 if (option->alias_target < N_OPTS
1111 && cl_options [option->alias_target].help)
1113 if (help == undocumented_msg)
1115 /* For undocumented options that are aliases for other options
1116 that are documented, point the reader to the other option in
1117 preference of the former. */
1118 snprintf (new_help, sizeof new_help,
1119 _("Same as %s. Use the latter option instead."),
1120 cl_options [option->alias_target].opt_text);
1122 else
1124 /* For documented options with aliases, mention the aliased
1125 option's name for reference. */
1126 snprintf (new_help, sizeof new_help,
1127 _("%s Same as %s."),
1128 help, cl_options [option->alias_target].opt_text);
1131 help = new_help;
1134 if (option->warn_message)
1136 /* Mention that the use of the option will trigger a warning. */
1137 if (help == new_help)
1138 snprintf (new_help + strlen (new_help),
1139 sizeof new_help - strlen (new_help),
1140 " %s", _(use_diagnosed_msg));
1141 else
1142 snprintf (new_help, sizeof new_help,
1143 "%s %s", help, _(use_diagnosed_msg));
1145 help = new_help;
1148 /* Get the translation. */
1149 help = _(help);
1151 /* Find the gap between the name of the
1152 option and its descriptive text. */
1153 tab = strchr (help, '\t');
1154 if (tab)
1156 len = tab - help;
1157 opt = help;
1158 help = tab + 1;
1160 else
1162 opt = option->opt_text;
1163 len = strlen (opt);
1166 /* With the -Q option enabled we change the descriptive text associated
1167 with an option to be an indication of its current setting. */
1168 if (!opts->x_quiet_flag)
1170 void *flag_var = option_flag_var (i, opts);
1172 if (len < (LEFT_COLUMN + 2))
1173 strcpy (new_help, "\t\t");
1174 else
1175 strcpy (new_help, "\t");
1177 if (flag_var != NULL
1178 && option->var_type != CLVC_DEFER)
1180 if (option->flags & CL_JOINED)
1182 if (option->var_type == CLVC_STRING)
1184 if (* (const char **) flag_var != NULL)
1185 snprintf (new_help + strlen (new_help),
1186 sizeof (new_help) - strlen (new_help),
1187 "%s", * (const char **) flag_var);
1189 else if (option->var_type == CLVC_ENUM)
1191 const struct cl_enum *e = &cl_enums[option->var_enum];
1192 int value;
1193 const char *arg = NULL;
1195 value = e->get (flag_var);
1196 enum_value_to_arg (e->values, &arg, value, lang_mask);
1197 if (arg == NULL)
1198 arg = _("[default]");
1199 snprintf (new_help + strlen (new_help),
1200 sizeof (new_help) - strlen (new_help),
1201 "%s", arg);
1203 else
1204 sprintf (new_help + strlen (new_help),
1205 "%#x", * (int *) flag_var);
1207 else
1208 strcat (new_help, option_enabled (i, opts)
1209 ? _("[enabled]") : _("[disabled]"));
1212 help = new_help;
1215 wrap_help (help, opt, len, columns);
1216 displayed = true;
1218 if (option->var_type == CLVC_ENUM
1219 && opts->x_help_enum_printed[option->var_enum] != 2)
1220 opts->x_help_enum_printed[option->var_enum] = 1;
1223 if (! found)
1225 unsigned int langs = include_flags & CL_LANG_ALL;
1227 if (langs == 0)
1228 printf (_(" No options with the desired characteristics were found\n"));
1229 else
1231 unsigned int i;
1233 /* PR 31349: Tell the user how to see all of the
1234 options supported by a specific front end. */
1235 for (i = 0; (1U << i) < CL_LANG_ALL; i ++)
1236 if ((1U << i) & langs)
1237 printf (_(" None found. Use --help=%s to show *all* the options supported by the %s front-end.\n"),
1238 lang_names[i], lang_names[i]);
1242 else if (! displayed)
1243 printf (_(" All options with the desired characteristics have already been displayed\n"));
1245 putchar ('\n');
1247 /* Print details of enumerated option arguments, if those
1248 enumerations have help text headings provided. If no help text
1249 is provided, presume that the possible values are listed in the
1250 help text for the relevant options. */
1251 for (i = 0; i < cl_enums_count; i++)
1253 unsigned int j, pos;
1255 if (opts->x_help_enum_printed[i] != 1)
1256 continue;
1257 if (cl_enums[i].help == NULL)
1258 continue;
1259 printf (" %s\n ", _(cl_enums[i].help));
1260 pos = 4;
1261 for (j = 0; cl_enums[i].values[j].arg != NULL; j++)
1263 unsigned int len = strlen (cl_enums[i].values[j].arg);
1265 if (pos > 4 && pos + 1 + len <= columns)
1267 printf (" %s", cl_enums[i].values[j].arg);
1268 pos += 1 + len;
1270 else
1272 if (pos > 4)
1274 printf ("\n ");
1275 pos = 4;
1277 printf ("%s", cl_enums[i].values[j].arg);
1278 pos += len;
1281 printf ("\n\n");
1282 opts->x_help_enum_printed[i] = 2;
1286 /* Display help for a specified type of option.
1287 The options must have ALL of the INCLUDE_FLAGS set
1288 ANY of the flags in the ANY_FLAGS set
1289 and NONE of the EXCLUDE_FLAGS set. The current option state is in
1290 OPTS; LANG_MASK is used for interpreting enumerated option state. */
1291 static void
1292 print_specific_help (unsigned int include_flags,
1293 unsigned int exclude_flags,
1294 unsigned int any_flags,
1295 struct gcc_options *opts,
1296 unsigned int lang_mask)
1298 unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1299 const char * description = NULL;
1300 const char * descrip_extra = "";
1301 size_t i;
1302 unsigned int flag;
1304 /* Sanity check: Make sure that we do not have more
1305 languages than we have bits available to enumerate them. */
1306 gcc_assert ((1U << cl_lang_count) <= CL_MIN_OPTION_CLASS);
1308 /* If we have not done so already, obtain
1309 the desired maximum width of the output. */
1310 if (opts->x_help_columns == 0)
1312 opts->x_help_columns = get_terminal_width ();
1313 if (opts->x_help_columns == INT_MAX)
1314 /* Use a reasonable default. */
1315 opts->x_help_columns = 80;
1318 /* Decide upon the title for the options that we are going to display. */
1319 for (i = 0, flag = 1; flag <= CL_MAX_OPTION_CLASS; flag <<= 1, i ++)
1321 switch (flag & include_flags)
1323 case 0:
1324 case CL_DRIVER:
1325 break;
1327 case CL_TARGET:
1328 description = _("The following options are target specific");
1329 break;
1330 case CL_WARNING:
1331 description = _("The following options control compiler warning messages");
1332 break;
1333 case CL_OPTIMIZATION:
1334 description = _("The following options control optimizations");
1335 break;
1336 case CL_COMMON:
1337 description = _("The following options are language-independent");
1338 break;
1339 case CL_PARAMS:
1340 description = _("The --param option recognizes the following as parameters");
1341 break;
1342 default:
1343 if (i >= cl_lang_count)
1344 break;
1345 if (exclude_flags & all_langs_mask)
1346 description = _("The following options are specific to just the language ");
1347 else
1348 description = _("The following options are supported by the language ");
1349 descrip_extra = lang_names [i];
1350 break;
1354 if (description == NULL)
1356 if (any_flags == 0)
1358 if (include_flags & CL_UNDOCUMENTED)
1359 description = _("The following options are not documented");
1360 else if (include_flags & CL_SEPARATE)
1361 description = _("The following options take separate arguments");
1362 else if (include_flags & CL_JOINED)
1363 description = _("The following options take joined arguments");
1364 else
1366 internal_error ("unrecognized include_flags 0x%x passed to print_specific_help",
1367 include_flags);
1368 return;
1371 else
1373 if (any_flags & all_langs_mask)
1374 description = _("The following options are language-related");
1375 else
1376 description = _("The following options are language-independent");
1380 printf ("%s%s:\n", description, descrip_extra);
1381 print_filtered_help (include_flags, exclude_flags, any_flags,
1382 opts->x_help_columns, opts, lang_mask);
1385 /* Enable FDO-related flags. */
1387 static void
1388 enable_fdo_optimizations (struct gcc_options *opts,
1389 struct gcc_options *opts_set,
1390 int value)
1392 if (!opts_set->x_flag_branch_probabilities)
1393 opts->x_flag_branch_probabilities = value;
1394 if (!opts_set->x_flag_profile_values)
1395 opts->x_flag_profile_values = value;
1396 if (!opts_set->x_flag_unroll_loops)
1397 opts->x_flag_unroll_loops = value;
1398 if (!opts_set->x_flag_peel_loops)
1399 opts->x_flag_peel_loops = value;
1400 if (!opts_set->x_flag_tracer)
1401 opts->x_flag_tracer = value;
1402 if (!opts_set->x_flag_value_profile_transformations)
1403 opts->x_flag_value_profile_transformations = value;
1404 if (!opts_set->x_flag_inline_functions)
1405 opts->x_flag_inline_functions = value;
1406 if (!opts_set->x_flag_ipa_cp)
1407 opts->x_flag_ipa_cp = value;
1408 if (!opts_set->x_flag_ipa_cp_clone
1409 && value && opts->x_flag_ipa_cp)
1410 opts->x_flag_ipa_cp_clone = value;
1411 if (!opts_set->x_flag_ipa_cp_alignment
1412 && value && opts->x_flag_ipa_cp)
1413 opts->x_flag_ipa_cp_alignment = value;
1414 if (!opts_set->x_flag_predictive_commoning)
1415 opts->x_flag_predictive_commoning = value;
1416 if (!opts_set->x_flag_unswitch_loops)
1417 opts->x_flag_unswitch_loops = value;
1418 if (!opts_set->x_flag_gcse_after_reload)
1419 opts->x_flag_gcse_after_reload = value;
1420 if (!opts_set->x_flag_tree_loop_vectorize
1421 && !opts_set->x_flag_tree_vectorize)
1422 opts->x_flag_tree_loop_vectorize = value;
1423 if (!opts_set->x_flag_tree_slp_vectorize
1424 && !opts_set->x_flag_tree_vectorize)
1425 opts->x_flag_tree_slp_vectorize = value;
1426 if (!opts_set->x_flag_vect_cost_model)
1427 opts->x_flag_vect_cost_model = VECT_COST_MODEL_DYNAMIC;
1428 if (!opts_set->x_flag_tree_loop_distribute_patterns)
1429 opts->x_flag_tree_loop_distribute_patterns = value;
1432 /* Handle target- and language-independent options. Return zero to
1433 generate an "unknown option" message. Only options that need
1434 extra handling need to be listed here; if you simply want
1435 DECODED->value assigned to a variable, it happens automatically. */
1437 bool
1438 common_handle_option (struct gcc_options *opts,
1439 struct gcc_options *opts_set,
1440 const struct cl_decoded_option *decoded,
1441 unsigned int lang_mask, int kind ATTRIBUTE_UNUSED,
1442 location_t loc,
1443 const struct cl_option_handlers *handlers,
1444 diagnostic_context *dc)
1446 size_t scode = decoded->opt_index;
1447 const char *arg = decoded->arg;
1448 int value = decoded->value;
1449 enum opt_code code = (enum opt_code) scode;
1451 gcc_assert (decoded->canonical_option_num_elements <= 2);
1453 switch (code)
1455 case OPT__param:
1456 handle_param (opts, opts_set, loc, arg);
1457 break;
1459 case OPT__help:
1461 unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1462 unsigned int undoc_mask;
1463 unsigned int i;
1465 if (lang_mask == CL_DRIVER)
1466 break;
1468 undoc_mask = ((opts->x_verbose_flag | opts->x_extra_warnings)
1470 : CL_UNDOCUMENTED);
1471 /* First display any single language specific options. */
1472 for (i = 0; i < cl_lang_count; i++)
1473 print_specific_help
1474 (1U << i, (all_langs_mask & (~ (1U << i))) | undoc_mask, 0, opts,
1475 lang_mask);
1476 /* Next display any multi language specific options. */
1477 print_specific_help (0, undoc_mask, all_langs_mask, opts, lang_mask);
1478 /* Then display any remaining, non-language options. */
1479 for (i = CL_MIN_OPTION_CLASS; i <= CL_MAX_OPTION_CLASS; i <<= 1)
1480 if (i != CL_DRIVER)
1481 print_specific_help (i, undoc_mask, 0, opts, lang_mask);
1482 opts->x_exit_after_options = true;
1483 break;
1486 case OPT__target_help:
1487 if (lang_mask == CL_DRIVER)
1488 break;
1490 print_specific_help (CL_TARGET, CL_UNDOCUMENTED, 0, opts, lang_mask);
1491 opts->x_exit_after_options = true;
1492 break;
1494 case OPT__help_:
1496 const char * a = arg;
1497 unsigned int include_flags = 0;
1498 /* Note - by default we include undocumented options when listing
1499 specific classes. If you only want to see documented options
1500 then add ",^undocumented" to the --help= option. E.g.:
1502 --help=target,^undocumented */
1503 unsigned int exclude_flags = 0;
1505 if (lang_mask == CL_DRIVER)
1506 break;
1508 /* Walk along the argument string, parsing each word in turn.
1509 The format is:
1510 arg = [^]{word}[,{arg}]
1511 word = {optimizers|target|warnings|undocumented|
1512 params|common|<language>} */
1513 while (* a != 0)
1515 static const struct
1517 const char * string;
1518 unsigned int flag;
1520 specifics[] =
1522 { "optimizers", CL_OPTIMIZATION },
1523 { "target", CL_TARGET },
1524 { "warnings", CL_WARNING },
1525 { "undocumented", CL_UNDOCUMENTED },
1526 { "params", CL_PARAMS },
1527 { "joined", CL_JOINED },
1528 { "separate", CL_SEPARATE },
1529 { "common", CL_COMMON },
1530 { NULL, 0 }
1532 unsigned int * pflags;
1533 const char * comma;
1534 unsigned int lang_flag, specific_flag;
1535 unsigned int len;
1536 unsigned int i;
1538 if (* a == '^')
1540 ++ a;
1541 pflags = & exclude_flags;
1543 else
1544 pflags = & include_flags;
1546 comma = strchr (a, ',');
1547 if (comma == NULL)
1548 len = strlen (a);
1549 else
1550 len = comma - a;
1551 if (len == 0)
1553 a = comma + 1;
1554 continue;
1557 /* Check to see if the string matches an option class name. */
1558 for (i = 0, specific_flag = 0; specifics[i].string != NULL; i++)
1559 if (strncasecmp (a, specifics[i].string, len) == 0)
1561 specific_flag = specifics[i].flag;
1562 break;
1565 /* Check to see if the string matches a language name.
1566 Note - we rely upon the alpha-sorted nature of the entries in
1567 the lang_names array, specifically that shorter names appear
1568 before their longer variants. (i.e. C before C++). That way
1569 when we are attempting to match --help=c for example we will
1570 match with C first and not C++. */
1571 for (i = 0, lang_flag = 0; i < cl_lang_count; i++)
1572 if (strncasecmp (a, lang_names[i], len) == 0)
1574 lang_flag = 1U << i;
1575 break;
1578 if (specific_flag != 0)
1580 if (lang_flag == 0)
1581 * pflags |= specific_flag;
1582 else
1584 /* The option's argument matches both the start of a
1585 language name and the start of an option class name.
1586 We have a special case for when the user has
1587 specified "--help=c", but otherwise we have to issue
1588 a warning. */
1589 if (strncasecmp (a, "c", len) == 0)
1590 * pflags |= lang_flag;
1591 else
1592 warning_at (loc, 0,
1593 "--help argument %q.*s is ambiguous, "
1594 "please be more specific",
1595 len, a);
1598 else if (lang_flag != 0)
1599 * pflags |= lang_flag;
1600 else
1601 warning_at (loc, 0,
1602 "unrecognized argument to --help= option: %q.*s",
1603 len, a);
1605 if (comma == NULL)
1606 break;
1607 a = comma + 1;
1610 if (include_flags)
1611 print_specific_help (include_flags, exclude_flags, 0, opts,
1612 lang_mask);
1613 opts->x_exit_after_options = true;
1614 break;
1617 case OPT__version:
1618 if (lang_mask == CL_DRIVER)
1619 break;
1621 opts->x_exit_after_options = true;
1622 break;
1624 case OPT_fsanitize_:
1625 case OPT_fsanitize_recover_:
1627 const char *p = arg;
1628 unsigned int *flag
1629 = code == OPT_fsanitize_ ? &opts->x_flag_sanitize
1630 : &opts->x_flag_sanitize_recover;
1631 while (*p != 0)
1633 static const struct
1635 const char *const name;
1636 unsigned int flag;
1637 size_t len;
1638 } spec[] =
1640 { "address", SANITIZE_ADDRESS | SANITIZE_USER_ADDRESS,
1641 sizeof "address" - 1 },
1642 { "kernel-address", SANITIZE_ADDRESS | SANITIZE_KERNEL_ADDRESS,
1643 sizeof "kernel-address" - 1 },
1644 { "thread", SANITIZE_THREAD, sizeof "thread" - 1 },
1645 { "leak", SANITIZE_LEAK, sizeof "leak" - 1 },
1646 { "shift", SANITIZE_SHIFT, sizeof "shift" - 1 },
1647 { "integer-divide-by-zero", SANITIZE_DIVIDE,
1648 sizeof "integer-divide-by-zero" - 1 },
1649 { "undefined", SANITIZE_UNDEFINED, sizeof "undefined" - 1 },
1650 { "unreachable", SANITIZE_UNREACHABLE,
1651 sizeof "unreachable" - 1 },
1652 { "vla-bound", SANITIZE_VLA, sizeof "vla-bound" - 1 },
1653 { "return", SANITIZE_RETURN, sizeof "return" - 1 },
1654 { "null", SANITIZE_NULL, sizeof "null" - 1 },
1655 { "signed-integer-overflow", SANITIZE_SI_OVERFLOW,
1656 sizeof "signed-integer-overflow" -1 },
1657 { "bool", SANITIZE_BOOL, sizeof "bool" - 1 },
1658 { "enum", SANITIZE_ENUM, sizeof "enum" - 1 },
1659 { "float-divide-by-zero", SANITIZE_FLOAT_DIVIDE,
1660 sizeof "float-divide-by-zero" - 1 },
1661 { "float-cast-overflow", SANITIZE_FLOAT_CAST,
1662 sizeof "float-cast-overflow" - 1 },
1663 { "bounds", SANITIZE_BOUNDS, sizeof "bounds" - 1 },
1664 { "bounds-strict", SANITIZE_BOUNDS | SANITIZE_BOUNDS_STRICT,
1665 sizeof "bounds-strict" - 1 },
1666 { "alignment", SANITIZE_ALIGNMENT, sizeof "alignment" - 1 },
1667 { "nonnull-attribute", SANITIZE_NONNULL_ATTRIBUTE,
1668 sizeof "nonnull-attribute" - 1 },
1669 { "returns-nonnull-attribute",
1670 SANITIZE_RETURNS_NONNULL_ATTRIBUTE,
1671 sizeof "returns-nonnull-attribute" - 1 },
1672 { "object-size", SANITIZE_OBJECT_SIZE,
1673 sizeof "object-size" - 1 },
1674 { "vptr", SANITIZE_VPTR, sizeof "vptr" - 1 },
1675 { "all", ~0, sizeof "all" - 1 },
1676 { NULL, 0, 0 }
1678 const char *comma;
1679 size_t len, i;
1680 bool found = false;
1682 comma = strchr (p, ',');
1683 if (comma == NULL)
1684 len = strlen (p);
1685 else
1686 len = comma - p;
1687 if (len == 0)
1689 p = comma + 1;
1690 continue;
1693 /* Check to see if the string matches an option class name. */
1694 for (i = 0; spec[i].name != NULL; ++i)
1695 if (len == spec[i].len
1696 && memcmp (p, spec[i].name, len) == 0)
1698 /* Handle both -fsanitize and -fno-sanitize cases. */
1699 if (value && spec[i].flag == ~0U)
1701 if (code == OPT_fsanitize_)
1702 error_at (loc, "-fsanitize=all option is not valid");
1703 else
1704 *flag |= ~(SANITIZE_USER_ADDRESS | SANITIZE_THREAD
1705 | SANITIZE_LEAK);
1707 else if (value)
1708 *flag |= spec[i].flag;
1709 else
1710 *flag &= ~spec[i].flag;
1711 found = true;
1712 break;
1715 if (! found)
1716 error_at (loc,
1717 "unrecognized argument to -fsanitize%s= option: %q.*s",
1718 code == OPT_fsanitize_ ? "" : "-recover", (int) len, p);
1720 if (comma == NULL)
1721 break;
1722 p = comma + 1;
1725 if (code != OPT_fsanitize_)
1726 break;
1728 /* Kernel ASan implies normal ASan but does not yet support
1729 all features. */
1730 if (opts->x_flag_sanitize & SANITIZE_KERNEL_ADDRESS)
1732 maybe_set_param_value (PARAM_ASAN_INSTRUMENTATION_WITH_CALL_THRESHOLD, 0,
1733 opts->x_param_values,
1734 opts_set->x_param_values);
1735 maybe_set_param_value (PARAM_ASAN_GLOBALS, 0,
1736 opts->x_param_values,
1737 opts_set->x_param_values);
1738 maybe_set_param_value (PARAM_ASAN_STACK, 0,
1739 opts->x_param_values,
1740 opts_set->x_param_values);
1741 maybe_set_param_value (PARAM_ASAN_USE_AFTER_RETURN, 0,
1742 opts->x_param_values,
1743 opts_set->x_param_values);
1746 break;
1749 case OPT_fasan_shadow_offset_:
1750 /* Deferred. */
1751 break;
1753 case OPT_fsanitize_recover:
1754 if (value)
1755 opts->x_flag_sanitize_recover
1756 |= SANITIZE_UNDEFINED | SANITIZE_NONDEFAULT;
1757 else
1758 opts->x_flag_sanitize_recover
1759 &= ~(SANITIZE_UNDEFINED | SANITIZE_NONDEFAULT);
1760 break;
1762 case OPT_O:
1763 case OPT_Os:
1764 case OPT_Ofast:
1765 case OPT_Og:
1766 /* Currently handled in a prescan. */
1767 break;
1769 case OPT_Werror:
1770 dc->warning_as_error_requested = value;
1771 break;
1773 case OPT_Werror_:
1774 if (lang_mask == CL_DRIVER)
1775 break;
1777 enable_warning_as_error (arg, value, lang_mask, handlers,
1778 opts, opts_set, loc, dc);
1779 break;
1781 case OPT_Wlarger_than_:
1782 opts->x_larger_than_size = value;
1783 opts->x_warn_larger_than = value != -1;
1784 break;
1786 case OPT_Wfatal_errors:
1787 dc->fatal_errors = value;
1788 break;
1790 case OPT_Wframe_larger_than_:
1791 opts->x_frame_larger_than_size = value;
1792 opts->x_warn_frame_larger_than = value != -1;
1793 break;
1795 case OPT_Wstack_usage_:
1796 opts->x_warn_stack_usage = value;
1797 opts->x_flag_stack_usage_info = value != -1;
1798 break;
1800 case OPT_Wstrict_aliasing:
1801 set_Wstrict_aliasing (opts, value);
1802 break;
1804 case OPT_Wstrict_overflow:
1805 opts->x_warn_strict_overflow = (value
1806 ? (int) WARN_STRICT_OVERFLOW_CONDITIONAL
1807 : 0);
1808 break;
1810 case OPT_Wsystem_headers:
1811 dc->dc_warn_system_headers = value;
1812 break;
1814 case OPT_aux_info:
1815 opts->x_flag_gen_aux_info = 1;
1816 break;
1818 case OPT_auxbase_strip:
1820 char *tmp = xstrdup (arg);
1821 strip_off_ending (tmp, strlen (tmp));
1822 if (tmp[0])
1823 opts->x_aux_base_name = tmp;
1824 else
1825 free (tmp);
1827 break;
1829 case OPT_d:
1830 decode_d_option (arg, opts, loc, dc);
1831 break;
1833 case OPT_fcall_used_:
1834 case OPT_fcall_saved_:
1835 /* Deferred. */
1836 break;
1838 case OPT_fdbg_cnt_:
1839 /* Deferred. */
1840 break;
1842 case OPT_fdbg_cnt_list:
1843 /* Deferred. */
1844 opts->x_exit_after_options = true;
1845 break;
1847 case OPT_fdebug_prefix_map_:
1848 /* Deferred. */
1849 break;
1851 case OPT_fdiagnostics_show_location_:
1852 diagnostic_prefixing_rule (dc) = (diagnostic_prefixing_rule_t) value;
1853 break;
1855 case OPT_fdiagnostics_show_caret:
1856 dc->show_caret = value;
1857 break;
1859 case OPT_fdiagnostics_color_:
1860 diagnostic_color_init (dc, value);
1861 break;
1863 case OPT_fdiagnostics_show_option:
1864 dc->show_option_requested = value;
1865 break;
1867 case OPT_fdump_:
1868 /* Deferred. */
1869 break;
1871 case OPT_ffast_math:
1872 set_fast_math_flags (opts, value);
1873 break;
1875 case OPT_funsafe_math_optimizations:
1876 set_unsafe_math_optimizations_flags (opts, value);
1877 break;
1879 case OPT_ffixed_:
1880 /* Deferred. */
1881 break;
1883 case OPT_finline_limit_:
1884 set_param_value ("max-inline-insns-single", value / 2,
1885 opts->x_param_values, opts_set->x_param_values);
1886 set_param_value ("max-inline-insns-auto", value / 2,
1887 opts->x_param_values, opts_set->x_param_values);
1888 break;
1890 case OPT_finstrument_functions_exclude_function_list_:
1891 add_comma_separated_to_vector
1892 (&opts->x_flag_instrument_functions_exclude_functions, arg);
1893 break;
1895 case OPT_finstrument_functions_exclude_file_list_:
1896 add_comma_separated_to_vector
1897 (&opts->x_flag_instrument_functions_exclude_files, arg);
1898 break;
1900 case OPT_fmessage_length_:
1901 pp_set_line_maximum_length (dc->printer, value);
1902 diagnostic_set_caret_max_width (dc, value);
1903 break;
1905 case OPT_fopt_info:
1906 case OPT_fopt_info_:
1907 /* Deferred. */
1908 break;
1910 case OPT_foffload_:
1911 /* Deferred. */
1912 break;
1914 #ifndef ACCEL_COMPILER
1915 case OPT_foffload_abi_:
1916 error_at (loc, "-foffload-abi option can be specified only for "
1917 "offload compiler");
1918 break;
1919 #endif
1921 case OPT_fpack_struct_:
1922 if (value <= 0 || (value & (value - 1)) || value > 16)
1923 error_at (loc,
1924 "structure alignment must be a small power of two, not %d",
1925 value);
1926 else
1927 opts->x_initial_max_fld_align = value;
1928 break;
1930 case OPT_fplugin_:
1931 case OPT_fplugin_arg_:
1932 /* Deferred. */
1933 break;
1935 case OPT_fprofile_use_:
1936 opts->x_profile_data_prefix = xstrdup (arg);
1937 opts->x_flag_profile_use = true;
1938 value = true;
1939 /* No break here - do -fprofile-use processing. */
1940 case OPT_fprofile_use:
1941 enable_fdo_optimizations (opts, opts_set, value);
1942 if (!opts_set->x_flag_profile_reorder_functions)
1943 opts->x_flag_profile_reorder_functions = value;
1944 /* Indirect call profiling should do all useful transformations
1945 speculative devirtualization does. */
1946 if (!opts_set->x_flag_devirtualize_speculatively
1947 && opts->x_flag_value_profile_transformations)
1948 opts->x_flag_devirtualize_speculatively = false;
1949 break;
1951 case OPT_fauto_profile_:
1952 opts->x_auto_profile_file = xstrdup (arg);
1953 opts->x_flag_auto_profile = true;
1954 value = true;
1955 /* No break here - do -fauto-profile processing. */
1956 case OPT_fauto_profile:
1957 enable_fdo_optimizations (opts, opts_set, value);
1958 if (!opts_set->x_flag_profile_correction)
1959 opts->x_flag_profile_correction = value;
1960 maybe_set_param_value (
1961 PARAM_EARLY_INLINER_MAX_ITERATIONS, 10,
1962 opts->x_param_values, opts_set->x_param_values);
1963 break;
1965 case OPT_fprofile_generate_:
1966 opts->x_profile_data_prefix = xstrdup (arg);
1967 value = true;
1968 /* No break here - do -fprofile-generate processing. */
1969 case OPT_fprofile_generate:
1970 if (!opts_set->x_profile_arc_flag)
1971 opts->x_profile_arc_flag = value;
1972 if (!opts_set->x_flag_profile_values)
1973 opts->x_flag_profile_values = value;
1974 if (!opts_set->x_flag_inline_functions)
1975 opts->x_flag_inline_functions = value;
1976 /* FIXME: Instrumentation we insert makes ipa-reference bitmaps
1977 quadratic. Disable the pass until better memory representation
1978 is done. */
1979 if (!opts_set->x_flag_ipa_reference)
1980 opts->x_flag_ipa_reference = false;
1981 break;
1983 case OPT_ftree_vectorize:
1984 if (!opts_set->x_flag_tree_loop_vectorize)
1985 opts->x_flag_tree_loop_vectorize = value;
1986 if (!opts_set->x_flag_tree_slp_vectorize)
1987 opts->x_flag_tree_slp_vectorize = value;
1988 break;
1989 case OPT_fshow_column:
1990 dc->show_column = value;
1991 break;
1993 case OPT_frandom_seed:
1994 /* The real switch is -fno-random-seed. */
1995 if (value)
1996 return false;
1997 /* Deferred. */
1998 break;
2000 case OPT_frandom_seed_:
2001 /* Deferred. */
2002 break;
2004 case OPT_fsched_verbose_:
2005 #ifdef INSN_SCHEDULING
2006 /* Handled with Var in common.opt. */
2007 break;
2008 #else
2009 return false;
2010 #endif
2012 case OPT_fsched_stalled_insns_:
2013 opts->x_flag_sched_stalled_insns = value;
2014 if (opts->x_flag_sched_stalled_insns == 0)
2015 opts->x_flag_sched_stalled_insns = -1;
2016 break;
2018 case OPT_fsched_stalled_insns_dep_:
2019 opts->x_flag_sched_stalled_insns_dep = value;
2020 break;
2022 case OPT_fstack_check_:
2023 if (!strcmp (arg, "no"))
2024 opts->x_flag_stack_check = NO_STACK_CHECK;
2025 else if (!strcmp (arg, "generic"))
2026 /* This is the old stack checking method. */
2027 opts->x_flag_stack_check = STACK_CHECK_BUILTIN
2028 ? FULL_BUILTIN_STACK_CHECK
2029 : GENERIC_STACK_CHECK;
2030 else if (!strcmp (arg, "specific"))
2031 /* This is the new stack checking method. */
2032 opts->x_flag_stack_check = STACK_CHECK_BUILTIN
2033 ? FULL_BUILTIN_STACK_CHECK
2034 : STACK_CHECK_STATIC_BUILTIN
2035 ? STATIC_BUILTIN_STACK_CHECK
2036 : GENERIC_STACK_CHECK;
2037 else
2038 warning_at (loc, 0, "unknown stack check parameter %qs", arg);
2039 break;
2041 case OPT_fstack_limit:
2042 /* The real switch is -fno-stack-limit. */
2043 if (value)
2044 return false;
2045 /* Deferred. */
2046 break;
2048 case OPT_fstack_limit_register_:
2049 case OPT_fstack_limit_symbol_:
2050 /* Deferred. */
2051 break;
2053 case OPT_fstack_usage:
2054 opts->x_flag_stack_usage = value;
2055 opts->x_flag_stack_usage_info = value != 0;
2056 break;
2058 case OPT_g:
2059 set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, arg, opts, opts_set,
2060 loc);
2061 break;
2063 case OPT_gcoff:
2064 set_debug_level (SDB_DEBUG, false, arg, opts, opts_set, loc);
2065 break;
2067 case OPT_gdwarf:
2068 if (arg && strlen (arg) != 0)
2070 error_at (loc, "%<-gdwarf%s%> is ambiguous; "
2071 "use %<-gdwarf-%s%> for DWARF version "
2072 "or %<-gdwarf -g%s%> for debug level", arg, arg, arg);
2073 break;
2075 else
2076 value = opts->x_dwarf_version;
2078 /* FALLTHRU */
2079 case OPT_gdwarf_:
2080 if (value < 2 || value > 5)
2081 error_at (loc, "dwarf version %d is not supported", value);
2082 else
2083 opts->x_dwarf_version = value;
2084 set_debug_level (DWARF2_DEBUG, false, "", opts, opts_set, loc);
2085 break;
2087 case OPT_gsplit_dwarf:
2088 set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, "", opts, opts_set,
2089 loc);
2090 break;
2092 case OPT_ggdb:
2093 set_debug_level (NO_DEBUG, 2, arg, opts, opts_set, loc);
2094 break;
2096 case OPT_gstabs:
2097 case OPT_gstabs_:
2098 set_debug_level (DBX_DEBUG, code == OPT_gstabs_, arg, opts, opts_set,
2099 loc);
2100 break;
2102 case OPT_gvms:
2103 set_debug_level (VMS_DEBUG, false, arg, opts, opts_set, loc);
2104 break;
2106 case OPT_gxcoff:
2107 case OPT_gxcoff_:
2108 set_debug_level (XCOFF_DEBUG, code == OPT_gxcoff_, arg, opts, opts_set,
2109 loc);
2110 break;
2112 case OPT_gz:
2113 case OPT_gz_:
2114 /* Handled completely via specs. */
2115 break;
2117 case OPT_pedantic_errors:
2118 dc->pedantic_errors = 1;
2119 control_warning_option (OPT_Wpedantic, DK_ERROR, value,
2120 loc, lang_mask,
2121 handlers, opts, opts_set,
2122 dc);
2123 break;
2125 case OPT_flto:
2126 opts->x_flag_lto = value ? "" : NULL;
2127 break;
2129 case OPT_w:
2130 dc->dc_inhibit_warnings = true;
2131 break;
2133 case OPT_fmax_errors_:
2134 dc->max_errors = value;
2135 break;
2137 case OPT_fuse_ld_bfd:
2138 case OPT_fuse_ld_gold:
2139 case OPT_fuse_linker_plugin:
2140 /* No-op. Used by the driver and passed to us because it starts with f.*/
2141 break;
2143 case OPT_fwrapv:
2144 if (value)
2145 opts->x_flag_trapv = 0;
2146 break;
2148 case OPT_ftrapv:
2149 if (value)
2150 opts->x_flag_wrapv = 0;
2151 break;
2153 case OPT_fipa_icf:
2154 opts->x_flag_ipa_icf_functions = value;
2155 opts->x_flag_ipa_icf_variables = value;
2156 break;
2158 default:
2159 /* If the flag was handled in a standard way, assume the lack of
2160 processing here is intentional. */
2161 gcc_assert (option_flag_var (scode, opts));
2162 break;
2165 common_handle_option_auto (opts, opts_set, decoded, lang_mask, kind,
2166 loc, handlers, dc);
2167 return true;
2170 /* Handle --param NAME=VALUE. */
2171 static void
2172 handle_param (struct gcc_options *opts, struct gcc_options *opts_set,
2173 location_t loc, const char *carg)
2175 char *equal, *arg;
2176 int value;
2178 arg = xstrdup (carg);
2179 equal = strchr (arg, '=');
2180 if (!equal)
2181 error_at (loc, "%s: --param arguments should be of the form NAME=VALUE",
2182 arg);
2183 else
2185 *equal = '\0';
2187 enum compiler_param index;
2188 if (!find_param (arg, &index))
2189 error_at (loc, "invalid --param name %qs", arg);
2190 else
2192 if (!param_string_value_p (index, equal + 1, &value))
2193 value = integral_argument (equal + 1);
2195 if (value == -1)
2196 error_at (loc, "invalid --param value %qs", equal + 1);
2197 else
2198 set_param_value (arg, value,
2199 opts->x_param_values, opts_set->x_param_values);
2203 free (arg);
2206 /* Used to set the level of strict aliasing warnings in OPTS,
2207 when no level is specified (i.e., when -Wstrict-aliasing, and not
2208 -Wstrict-aliasing=level was given).
2209 ONOFF is assumed to take value 1 when -Wstrict-aliasing is specified,
2210 and 0 otherwise. After calling this function, wstrict_aliasing will be
2211 set to the default value of -Wstrict_aliasing=level, currently 3. */
2212 static void
2213 set_Wstrict_aliasing (struct gcc_options *opts, int onoff)
2215 gcc_assert (onoff == 0 || onoff == 1);
2216 if (onoff != 0)
2217 opts->x_warn_strict_aliasing = 3;
2218 else
2219 opts->x_warn_strict_aliasing = 0;
2222 /* The following routines are useful in setting all the flags that
2223 -ffast-math and -fno-fast-math imply. */
2224 static void
2225 set_fast_math_flags (struct gcc_options *opts, int set)
2227 if (!opts->frontend_set_flag_unsafe_math_optimizations)
2229 opts->x_flag_unsafe_math_optimizations = set;
2230 set_unsafe_math_optimizations_flags (opts, set);
2232 if (!opts->frontend_set_flag_finite_math_only)
2233 opts->x_flag_finite_math_only = set;
2234 if (!opts->frontend_set_flag_errno_math)
2235 opts->x_flag_errno_math = !set;
2236 if (set)
2238 if (!opts->frontend_set_flag_signaling_nans)
2239 opts->x_flag_signaling_nans = 0;
2240 if (!opts->frontend_set_flag_rounding_math)
2241 opts->x_flag_rounding_math = 0;
2242 if (!opts->frontend_set_flag_cx_limited_range)
2243 opts->x_flag_cx_limited_range = 1;
2247 /* When -funsafe-math-optimizations is set the following
2248 flags are set as well. */
2249 static void
2250 set_unsafe_math_optimizations_flags (struct gcc_options *opts, int set)
2252 if (!opts->frontend_set_flag_trapping_math)
2253 opts->x_flag_trapping_math = !set;
2254 if (!opts->frontend_set_flag_signed_zeros)
2255 opts->x_flag_signed_zeros = !set;
2256 if (!opts->frontend_set_flag_associative_math)
2257 opts->x_flag_associative_math = set;
2258 if (!opts->frontend_set_flag_reciprocal_math)
2259 opts->x_flag_reciprocal_math = set;
2262 /* Return true iff flags in OPTS are set as if -ffast-math. */
2263 bool
2264 fast_math_flags_set_p (const struct gcc_options *opts)
2266 return (!opts->x_flag_trapping_math
2267 && opts->x_flag_unsafe_math_optimizations
2268 && opts->x_flag_finite_math_only
2269 && !opts->x_flag_signed_zeros
2270 && !opts->x_flag_errno_math);
2273 /* Return true iff flags are set as if -ffast-math but using the flags stored
2274 in the struct cl_optimization structure. */
2275 bool
2276 fast_math_flags_struct_set_p (struct cl_optimization *opt)
2278 return (!opt->x_flag_trapping_math
2279 && opt->x_flag_unsafe_math_optimizations
2280 && opt->x_flag_finite_math_only
2281 && !opt->x_flag_signed_zeros
2282 && !opt->x_flag_errno_math);
2285 /* Handle a debug output -g switch for options OPTS
2286 (OPTS_SET->x_write_symbols storing whether a debug type was passed
2287 explicitly), location LOC. EXTENDED is true or false to support
2288 extended output (2 is special and means "-ggdb" was given). */
2289 static void
2290 set_debug_level (enum debug_info_type type, int extended, const char *arg,
2291 struct gcc_options *opts, struct gcc_options *opts_set,
2292 location_t loc)
2294 opts->x_use_gnu_debug_info_extensions = extended;
2296 if (type == NO_DEBUG)
2298 if (opts->x_write_symbols == NO_DEBUG)
2300 opts->x_write_symbols = PREFERRED_DEBUGGING_TYPE;
2302 if (extended == 2)
2304 #if defined DWARF2_DEBUGGING_INFO || defined DWARF2_LINENO_DEBUGGING_INFO
2305 opts->x_write_symbols = DWARF2_DEBUG;
2306 #elif defined DBX_DEBUGGING_INFO
2307 opts->x_write_symbols = DBX_DEBUG;
2308 #endif
2311 if (opts->x_write_symbols == NO_DEBUG)
2312 warning_at (loc, 0, "target system does not support debug output");
2315 else
2317 /* Does it conflict with an already selected type? */
2318 if (opts_set->x_write_symbols != NO_DEBUG
2319 && opts->x_write_symbols != NO_DEBUG
2320 && type != opts->x_write_symbols)
2321 error_at (loc, "debug format %qs conflicts with prior selection",
2322 debug_type_names[type]);
2323 opts->x_write_symbols = type;
2324 opts_set->x_write_symbols = type;
2327 /* A debug flag without a level defaults to level 2.
2328 If off or at level 1, set it to level 2, but if already
2329 at level 3, don't lower it. */
2330 if (*arg == '\0')
2332 if (opts->x_debug_info_level < DINFO_LEVEL_NORMAL)
2333 opts->x_debug_info_level = DINFO_LEVEL_NORMAL;
2335 else
2337 int argval = integral_argument (arg);
2338 if (argval == -1)
2339 error_at (loc, "unrecognised debug output level %qs", arg);
2340 else if (argval > 3)
2341 error_at (loc, "debug output level %qs is too high", arg);
2342 else
2343 opts->x_debug_info_level = (enum debug_info_levels) argval;
2347 /* Arrange to dump core on error for diagnostic context DC. (The
2348 regular error message is still printed first, except in the case of
2349 abort ().) */
2351 static void
2352 setup_core_dumping (diagnostic_context *dc)
2354 #ifdef SIGABRT
2355 signal (SIGABRT, SIG_DFL);
2356 #endif
2357 #if defined(HAVE_SETRLIMIT)
2359 struct rlimit rlim;
2360 if (getrlimit (RLIMIT_CORE, &rlim) != 0)
2361 fatal_error (input_location, "getting core file size maximum limit: %m");
2362 rlim.rlim_cur = rlim.rlim_max;
2363 if (setrlimit (RLIMIT_CORE, &rlim) != 0)
2364 fatal_error (input_location,
2365 "setting core file size limit to maximum: %m");
2367 #endif
2368 diagnostic_abort_on_error (dc);
2371 /* Parse a -d<ARG> command line switch for OPTS, location LOC,
2372 diagnostic context DC. */
2374 static void
2375 decode_d_option (const char *arg, struct gcc_options *opts,
2376 location_t loc, diagnostic_context *dc)
2378 int c;
2380 while (*arg)
2381 switch (c = *arg++)
2383 case 'A':
2384 opts->x_flag_debug_asm = 1;
2385 break;
2386 case 'p':
2387 opts->x_flag_print_asm_name = 1;
2388 break;
2389 case 'P':
2390 opts->x_flag_dump_rtl_in_asm = 1;
2391 opts->x_flag_print_asm_name = 1;
2392 break;
2393 case 'x':
2394 opts->x_rtl_dump_and_exit = 1;
2395 break;
2396 case 'D': /* These are handled by the preprocessor. */
2397 case 'I':
2398 case 'M':
2399 case 'N':
2400 case 'U':
2401 break;
2402 case 'H':
2403 setup_core_dumping (dc);
2404 break;
2405 case 'a':
2406 opts->x_flag_dump_all_passed = true;
2407 break;
2409 default:
2410 warning_at (loc, 0, "unrecognized gcc debugging option: %c", c);
2411 break;
2415 /* Enable (or disable if VALUE is 0) a warning option ARG (language
2416 mask LANG_MASK, option handlers HANDLERS) as an error for option
2417 structures OPTS and OPTS_SET, diagnostic context DC (possibly
2418 NULL), location LOC. This is used by -Werror=. */
2420 static void
2421 enable_warning_as_error (const char *arg, int value, unsigned int lang_mask,
2422 const struct cl_option_handlers *handlers,
2423 struct gcc_options *opts,
2424 struct gcc_options *opts_set,
2425 location_t loc, diagnostic_context *dc)
2427 char *new_option;
2428 int option_index;
2430 new_option = XNEWVEC (char, strlen (arg) + 2);
2431 new_option[0] = 'W';
2432 strcpy (new_option + 1, arg);
2433 option_index = find_opt (new_option, lang_mask);
2434 if (option_index == OPT_SPECIAL_unknown)
2435 error_at (loc, "-Werror=%s: no option -%s", arg, new_option);
2436 else if (!(cl_options[option_index].flags & CL_WARNING))
2437 error_at (loc, "-Werror=%s: -%s is not an option that controls warnings",
2438 arg, new_option);
2439 else
2441 const diagnostic_t kind = value ? DK_ERROR : DK_WARNING;
2443 control_warning_option (option_index, (int) kind, value,
2444 loc, lang_mask,
2445 handlers, opts, opts_set, dc);
2447 free (new_option);
2450 /* Return malloced memory for the name of the option OPTION_INDEX
2451 which enabled a diagnostic (context CONTEXT), originally of type
2452 ORIG_DIAG_KIND but possibly converted to DIAG_KIND by options such
2453 as -Werror. */
2455 char *
2456 option_name (diagnostic_context *context, int option_index,
2457 diagnostic_t orig_diag_kind, diagnostic_t diag_kind)
2459 if (option_index)
2461 /* A warning classified as an error. */
2462 if ((orig_diag_kind == DK_WARNING || orig_diag_kind == DK_PEDWARN)
2463 && diag_kind == DK_ERROR)
2464 return concat (cl_options[OPT_Werror_].opt_text,
2465 /* Skip over "-W". */
2466 cl_options[option_index].opt_text + 2,
2467 NULL);
2468 /* A warning with option. */
2469 else
2470 return xstrdup (cl_options[option_index].opt_text);
2472 /* A warning without option classified as an error. */
2473 else if ((orig_diag_kind == DK_WARNING || orig_diag_kind == DK_PEDWARN
2474 || diag_kind == DK_WARNING)
2475 && context->warning_as_error_requested)
2476 return xstrdup (cl_options[OPT_Werror].opt_text);
2477 else
2478 return NULL;