2016-01-21 Vladimir Makarov <vmakarov@redhat.com>
[official-gcc.git] / gcc / opts.c
blobb4e8144489cde2a86087c9c0fe99ff60a7c23c63
1 /* Command line option handling.
2 Copyright (C) 2002-2016 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. */
271 void
272 init_opts_obstack (void)
274 gcc_obstack_init (&opts_obstack);
277 /* Initialize OPTS and OPTS_SET before using them in parsing options. */
279 void
280 init_options_struct (struct gcc_options *opts, struct gcc_options *opts_set)
282 size_t num_params = get_num_compiler_params ();
284 /* Ensure that opts_obstack has already been initialized by the time
285 that we initialize any gcc_options instances (PR jit/68446). */
286 gcc_assert (opts_obstack.chunk_size > 0);
288 *opts = global_options_init;
290 if (opts_set)
291 memset (opts_set, 0, sizeof (*opts_set));
293 opts->x_param_values = XNEWVEC (int, num_params);
295 if (opts_set)
296 opts_set->x_param_values = XCNEWVEC (int, num_params);
298 init_param_values (opts->x_param_values);
300 /* Initialize whether `char' is signed. */
301 opts->x_flag_signed_char = DEFAULT_SIGNED_CHAR;
302 /* Set this to a special "uninitialized" value. The actual default
303 is set after target options have been processed. */
304 opts->x_flag_short_enums = 2;
306 /* Initialize target_flags before default_options_optimization
307 so the latter can modify it. */
308 opts->x_target_flags = targetm_common.default_target_flags;
310 /* Some targets have ABI-specified unwind tables. */
311 opts->x_flag_unwind_tables = targetm_common.unwind_tables_default;
313 /* Some targets have other target-specific initialization. */
314 targetm_common.option_init_struct (opts);
317 /* Release any allocations owned by OPTS. */
319 void
320 finalize_options_struct (struct gcc_options *opts)
322 XDELETEVEC (opts->x_param_values);
325 /* If indicated by the optimization level LEVEL (-Os if SIZE is set,
326 -Ofast if FAST is set, -Og if DEBUG is set), apply the option DEFAULT_OPT
327 to OPTS and OPTS_SET, diagnostic context DC, location LOC, with language
328 mask LANG_MASK and option handlers HANDLERS. */
330 static void
331 maybe_default_option (struct gcc_options *opts,
332 struct gcc_options *opts_set,
333 const struct default_options *default_opt,
334 int level, bool size, bool fast, bool debug,
335 unsigned int lang_mask,
336 const struct cl_option_handlers *handlers,
337 location_t loc,
338 diagnostic_context *dc)
340 const struct cl_option *option = &cl_options[default_opt->opt_index];
341 bool enabled;
343 if (size)
344 gcc_assert (level == 2);
345 if (fast)
346 gcc_assert (level == 3);
347 if (debug)
348 gcc_assert (level == 1);
350 switch (default_opt->levels)
352 case OPT_LEVELS_ALL:
353 enabled = true;
354 break;
356 case OPT_LEVELS_0_ONLY:
357 enabled = (level == 0);
358 break;
360 case OPT_LEVELS_1_PLUS:
361 enabled = (level >= 1);
362 break;
364 case OPT_LEVELS_1_PLUS_SPEED_ONLY:
365 enabled = (level >= 1 && !size && !debug);
366 break;
368 case OPT_LEVELS_1_PLUS_NOT_DEBUG:
369 enabled = (level >= 1 && !debug);
370 break;
372 case OPT_LEVELS_2_PLUS:
373 enabled = (level >= 2);
374 break;
376 case OPT_LEVELS_2_PLUS_SPEED_ONLY:
377 enabled = (level >= 2 && !size && !debug);
378 break;
380 case OPT_LEVELS_3_PLUS:
381 enabled = (level >= 3);
382 break;
384 case OPT_LEVELS_3_PLUS_AND_SIZE:
385 enabled = (level >= 3 || size);
386 break;
388 case OPT_LEVELS_SIZE:
389 enabled = size;
390 break;
392 case OPT_LEVELS_FAST:
393 enabled = fast;
394 break;
396 case OPT_LEVELS_NONE:
397 default:
398 gcc_unreachable ();
401 if (enabled)
402 handle_generated_option (opts, opts_set, default_opt->opt_index,
403 default_opt->arg, default_opt->value,
404 lang_mask, DK_UNSPECIFIED, loc,
405 handlers, dc);
406 else if (default_opt->arg == NULL
407 && !option->cl_reject_negative)
408 handle_generated_option (opts, opts_set, default_opt->opt_index,
409 default_opt->arg, !default_opt->value,
410 lang_mask, DK_UNSPECIFIED, loc,
411 handlers, dc);
414 /* As indicated by the optimization level LEVEL (-Os if SIZE is set,
415 -Ofast if FAST is set), apply the options in array DEFAULT_OPTS to
416 OPTS and OPTS_SET, diagnostic context DC, location LOC, with
417 language mask LANG_MASK and option handlers HANDLERS. */
419 static void
420 maybe_default_options (struct gcc_options *opts,
421 struct gcc_options *opts_set,
422 const struct default_options *default_opts,
423 int level, bool size, bool fast, bool debug,
424 unsigned int lang_mask,
425 const struct cl_option_handlers *handlers,
426 location_t loc,
427 diagnostic_context *dc)
429 size_t i;
431 for (i = 0; default_opts[i].levels != OPT_LEVELS_NONE; i++)
432 maybe_default_option (opts, opts_set, &default_opts[i],
433 level, size, fast, debug,
434 lang_mask, handlers, loc, dc);
437 /* Table of options enabled by default at different levels. */
439 static const struct default_options default_options_table[] =
441 /* -O1 optimizations. */
442 { OPT_LEVELS_1_PLUS, OPT_fdefer_pop, NULL, 1 },
443 #if DELAY_SLOTS
444 { OPT_LEVELS_1_PLUS, OPT_fdelayed_branch, NULL, 1 },
445 #endif
446 { OPT_LEVELS_1_PLUS, OPT_fguess_branch_probability, NULL, 1 },
447 { OPT_LEVELS_1_PLUS, OPT_fcprop_registers, NULL, 1 },
448 { OPT_LEVELS_1_PLUS, OPT_fforward_propagate, NULL, 1 },
449 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fif_conversion, NULL, 1 },
450 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fif_conversion2, NULL, 1 },
451 { OPT_LEVELS_1_PLUS, OPT_fipa_pure_const, NULL, 1 },
452 { OPT_LEVELS_1_PLUS, OPT_fipa_reference, NULL, 1 },
453 { OPT_LEVELS_1_PLUS, OPT_fipa_profile, NULL, 1 },
454 { OPT_LEVELS_1_PLUS, OPT_fmerge_constants, NULL, 1 },
455 { OPT_LEVELS_1_PLUS, OPT_freorder_blocks, NULL, 1 },
456 { OPT_LEVELS_1_PLUS, OPT_fshrink_wrap, NULL, 1 },
457 { OPT_LEVELS_1_PLUS, OPT_fsplit_wide_types, NULL, 1 },
458 { OPT_LEVELS_1_PLUS, OPT_ftree_ccp, NULL, 1 },
459 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_bit_ccp, NULL, 1 },
460 { OPT_LEVELS_1_PLUS, OPT_ftree_coalesce_vars, NULL, 1 },
461 { OPT_LEVELS_1_PLUS, OPT_ftree_dce, NULL, 1 },
462 { OPT_LEVELS_1_PLUS, OPT_ftree_dominator_opts, NULL, 1 },
463 { OPT_LEVELS_1_PLUS, OPT_ftree_dse, NULL, 1 },
464 { OPT_LEVELS_1_PLUS, OPT_ftree_ter, NULL, 1 },
465 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_sra, NULL, 1 },
466 { OPT_LEVELS_1_PLUS, OPT_ftree_fre, NULL, 1 },
467 { OPT_LEVELS_1_PLUS, OPT_ftree_copy_prop, NULL, 1 },
468 { OPT_LEVELS_1_PLUS, OPT_ftree_sink, NULL, 1 },
469 { OPT_LEVELS_1_PLUS, OPT_ftree_ch, NULL, 1 },
470 { OPT_LEVELS_1_PLUS, OPT_fcombine_stack_adjustments, NULL, 1 },
471 { OPT_LEVELS_1_PLUS, OPT_fcompare_elim, NULL, 1 },
472 { OPT_LEVELS_1_PLUS, OPT_ftree_slsr, NULL, 1 },
473 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fbranch_count_reg, NULL, 1 },
474 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fmove_loop_invariants, NULL, 1 },
475 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_pta, NULL, 1 },
476 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fssa_phiopt, NULL, 1 },
477 { OPT_LEVELS_1_PLUS, OPT_ftree_builtin_call_dce, NULL, 1 },
479 /* -O2 optimizations. */
480 { OPT_LEVELS_2_PLUS, OPT_finline_small_functions, NULL, 1 },
481 { OPT_LEVELS_2_PLUS, OPT_findirect_inlining, NULL, 1 },
482 { OPT_LEVELS_2_PLUS, OPT_fpartial_inlining, NULL, 1 },
483 { OPT_LEVELS_2_PLUS, OPT_fthread_jumps, NULL, 1 },
484 { OPT_LEVELS_2_PLUS, OPT_fcrossjumping, NULL, 1 },
485 { OPT_LEVELS_2_PLUS, OPT_foptimize_sibling_calls, NULL, 1 },
486 { OPT_LEVELS_2_PLUS, OPT_fcse_follow_jumps, NULL, 1 },
487 { OPT_LEVELS_2_PLUS, OPT_fgcse, NULL, 1 },
488 { OPT_LEVELS_2_PLUS, OPT_fexpensive_optimizations, NULL, 1 },
489 { OPT_LEVELS_2_PLUS, OPT_frerun_cse_after_loop, NULL, 1 },
490 { OPT_LEVELS_2_PLUS, OPT_fcaller_saves, NULL, 1 },
491 { OPT_LEVELS_2_PLUS, OPT_fpeephole2, NULL, 1 },
492 #ifdef INSN_SCHEDULING
493 /* Only run the pre-regalloc scheduling pass if optimizing for speed. */
494 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_fschedule_insns, NULL, 1 },
495 { OPT_LEVELS_2_PLUS, OPT_fschedule_insns2, NULL, 1 },
496 #endif
497 { OPT_LEVELS_2_PLUS, OPT_fstrict_aliasing, NULL, 1 },
498 { OPT_LEVELS_2_PLUS, OPT_fstrict_overflow, NULL, 1 },
499 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_freorder_blocks_algorithm_, NULL,
500 REORDER_BLOCKS_ALGORITHM_STC },
501 { OPT_LEVELS_2_PLUS, OPT_freorder_functions, NULL, 1 },
502 { OPT_LEVELS_2_PLUS, OPT_ftree_vrp, NULL, 1 },
503 { OPT_LEVELS_2_PLUS, OPT_ftree_pre, NULL, 1 },
504 { OPT_LEVELS_2_PLUS, OPT_ftree_switch_conversion, NULL, 1 },
505 { OPT_LEVELS_2_PLUS, OPT_fipa_cp, NULL, 1 },
506 { OPT_LEVELS_2_PLUS, OPT_fipa_cp_alignment, NULL, 1 },
507 { OPT_LEVELS_2_PLUS, OPT_fdevirtualize, NULL, 1 },
508 { OPT_LEVELS_2_PLUS, OPT_fdevirtualize_speculatively, NULL, 1 },
509 { OPT_LEVELS_2_PLUS, OPT_fipa_sra, NULL, 1 },
510 { OPT_LEVELS_2_PLUS, OPT_falign_loops, NULL, 1 },
511 { OPT_LEVELS_2_PLUS, OPT_falign_jumps, NULL, 1 },
512 { OPT_LEVELS_2_PLUS, OPT_falign_labels, NULL, 1 },
513 { OPT_LEVELS_2_PLUS, OPT_falign_functions, NULL, 1 },
514 { OPT_LEVELS_2_PLUS, OPT_ftree_tail_merge, NULL, 1 },
515 { OPT_LEVELS_2_PLUS, OPT_fvect_cost_model_, NULL, VECT_COST_MODEL_CHEAP },
516 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_foptimize_strlen, NULL, 1 },
517 { OPT_LEVELS_2_PLUS, OPT_fhoist_adjacent_loads, NULL, 1 },
518 { OPT_LEVELS_2_PLUS, OPT_fipa_icf, NULL, 1 },
519 { OPT_LEVELS_2_PLUS, OPT_fisolate_erroneous_paths_dereference, NULL, 1 },
520 { OPT_LEVELS_2_PLUS, OPT_fipa_ra, NULL, 1 },
521 { OPT_LEVELS_2_PLUS, OPT_flra_remat, NULL, 1 },
523 /* -O3 optimizations. */
524 { OPT_LEVELS_3_PLUS, OPT_ftree_loop_distribute_patterns, NULL, 1 },
525 { OPT_LEVELS_3_PLUS, OPT_fpredictive_commoning, NULL, 1 },
526 { OPT_LEVELS_3_PLUS, OPT_fsplit_paths, NULL, 1 },
527 /* Inlining of functions reducing size is a good idea with -Os
528 regardless of them being declared inline. */
529 { OPT_LEVELS_3_PLUS_AND_SIZE, OPT_finline_functions, NULL, 1 },
530 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_finline_functions_called_once, NULL, 1 },
531 { OPT_LEVELS_3_PLUS, OPT_funswitch_loops, NULL, 1 },
532 { OPT_LEVELS_3_PLUS, OPT_fgcse_after_reload, NULL, 1 },
533 { OPT_LEVELS_3_PLUS, OPT_ftree_loop_vectorize, NULL, 1 },
534 { OPT_LEVELS_3_PLUS, OPT_ftree_slp_vectorize, NULL, 1 },
535 { OPT_LEVELS_3_PLUS, OPT_fvect_cost_model_, NULL, VECT_COST_MODEL_DYNAMIC },
536 { OPT_LEVELS_3_PLUS, OPT_fipa_cp_clone, NULL, 1 },
537 { OPT_LEVELS_3_PLUS, OPT_ftree_partial_pre, NULL, 1 },
539 /* -Ofast adds optimizations to -O3. */
540 { OPT_LEVELS_FAST, OPT_ffast_math, NULL, 1 },
542 { OPT_LEVELS_NONE, 0, NULL, 0 }
545 /* Default the options in OPTS and OPTS_SET based on the optimization
546 settings in DECODED_OPTIONS and DECODED_OPTIONS_COUNT. */
547 void
548 default_options_optimization (struct gcc_options *opts,
549 struct gcc_options *opts_set,
550 struct cl_decoded_option *decoded_options,
551 unsigned int decoded_options_count,
552 location_t loc,
553 unsigned int lang_mask,
554 const struct cl_option_handlers *handlers,
555 diagnostic_context *dc)
557 unsigned int i;
558 int opt2;
559 bool openacc_mode = false;
561 /* Scan to see what optimization level has been specified. That will
562 determine the default value of many flags. */
563 for (i = 1; i < decoded_options_count; i++)
565 struct cl_decoded_option *opt = &decoded_options[i];
566 switch (opt->opt_index)
568 case OPT_O:
569 if (*opt->arg == '\0')
571 opts->x_optimize = 1;
572 opts->x_optimize_size = 0;
573 opts->x_optimize_fast = 0;
574 opts->x_optimize_debug = 0;
576 else
578 const int optimize_val = integral_argument (opt->arg);
579 if (optimize_val == -1)
580 error_at (loc, "argument to %<-O%> should be a non-negative "
581 "integer, %<g%>, %<s%> or %<fast%>");
582 else
584 opts->x_optimize = optimize_val;
585 if ((unsigned int) opts->x_optimize > 255)
586 opts->x_optimize = 255;
587 opts->x_optimize_size = 0;
588 opts->x_optimize_fast = 0;
589 opts->x_optimize_debug = 0;
592 break;
594 case OPT_Os:
595 opts->x_optimize_size = 1;
597 /* Optimizing for size forces optimize to be 2. */
598 opts->x_optimize = 2;
599 opts->x_optimize_fast = 0;
600 opts->x_optimize_debug = 0;
601 break;
603 case OPT_Ofast:
604 /* -Ofast only adds flags to -O3. */
605 opts->x_optimize_size = 0;
606 opts->x_optimize = 3;
607 opts->x_optimize_fast = 1;
608 opts->x_optimize_debug = 0;
609 break;
611 case OPT_Og:
612 /* -Og selects optimization level 1. */
613 opts->x_optimize_size = 0;
614 opts->x_optimize = 1;
615 opts->x_optimize_fast = 0;
616 opts->x_optimize_debug = 1;
617 break;
619 case OPT_fopenacc:
620 if (opt->value)
621 openacc_mode = true;
622 break;
624 default:
625 /* Ignore other options in this prescan. */
626 break;
630 maybe_default_options (opts, opts_set, default_options_table,
631 opts->x_optimize, opts->x_optimize_size,
632 opts->x_optimize_fast, opts->x_optimize_debug,
633 lang_mask, handlers, loc, dc);
635 /* -O2 param settings. */
636 opt2 = (opts->x_optimize >= 2);
638 if (openacc_mode
639 && !opts_set->x_flag_ipa_pta)
640 opts->x_flag_ipa_pta = true;
642 /* Track fields in field-sensitive alias analysis. */
643 maybe_set_param_value
644 (PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE,
645 opt2 ? 100 : default_param_value (PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE),
646 opts->x_param_values, opts_set->x_param_values);
648 /* For -O1 only do loop invariant motion for very small loops. */
649 maybe_set_param_value
650 (PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP,
651 opt2 ? default_param_value (PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP) : 1000,
652 opts->x_param_values, opts_set->x_param_values);
654 /* At -Ofast, allow store motion to introduce potential race conditions. */
655 maybe_set_param_value
656 (PARAM_ALLOW_STORE_DATA_RACES,
657 opts->x_optimize_fast ? 1
658 : default_param_value (PARAM_ALLOW_STORE_DATA_RACES),
659 opts->x_param_values, opts_set->x_param_values);
661 if (opts->x_optimize_size)
662 /* We want to crossjump as much as possible. */
663 maybe_set_param_value (PARAM_MIN_CROSSJUMP_INSNS, 1,
664 opts->x_param_values, opts_set->x_param_values);
665 else
666 maybe_set_param_value (PARAM_MIN_CROSSJUMP_INSNS,
667 default_param_value (PARAM_MIN_CROSSJUMP_INSNS),
668 opts->x_param_values, opts_set->x_param_values);
670 /* Restrict the amount of work combine does at -Og while retaining
671 most of its useful transforms. */
672 if (opts->x_optimize_debug)
673 maybe_set_param_value (PARAM_MAX_COMBINE_INSNS, 2,
674 opts->x_param_values, opts_set->x_param_values);
676 /* Allow default optimizations to be specified on a per-machine basis. */
677 maybe_default_options (opts, opts_set,
678 targetm_common.option_optimization_table,
679 opts->x_optimize, opts->x_optimize_size,
680 opts->x_optimize_fast, opts->x_optimize_debug,
681 lang_mask, handlers, loc, dc);
684 /* After all options at LOC have been read into OPTS and OPTS_SET,
685 finalize settings of those options and diagnose incompatible
686 combinations. */
687 void
688 finish_options (struct gcc_options *opts, struct gcc_options *opts_set,
689 location_t loc)
691 enum unwind_info_type ui_except;
693 if (opts->x_dump_base_name
694 && ! IS_ABSOLUTE_PATH (opts->x_dump_base_name)
695 && ! opts->x_dump_base_name_prefixed)
697 /* First try to make OPTS->X_DUMP_BASE_NAME relative to the
698 OPTS->X_DUMP_DIR_NAME directory. Then try to make
699 OPTS->X_DUMP_BASE_NAME relative to the OPTS->X_AUX_BASE_NAME
700 directory, typically the directory to contain the object
701 file. */
702 if (opts->x_dump_dir_name)
703 opts->x_dump_base_name = opts_concat (opts->x_dump_dir_name,
704 opts->x_dump_base_name, NULL);
705 else if (opts->x_aux_base_name
706 && strcmp (opts->x_aux_base_name, HOST_BIT_BUCKET) != 0)
708 const char *aux_base;
710 base_of_path (opts->x_aux_base_name, &aux_base);
711 if (opts->x_aux_base_name != aux_base)
713 int dir_len = aux_base - opts->x_aux_base_name;
714 char *new_dump_base_name
715 = XOBNEWVEC (&opts_obstack, char,
716 strlen (opts->x_dump_base_name) + dir_len + 1);
718 /* Copy directory component from OPTS->X_AUX_BASE_NAME. */
719 memcpy (new_dump_base_name, opts->x_aux_base_name, dir_len);
720 /* Append existing OPTS->X_DUMP_BASE_NAME. */
721 strcpy (new_dump_base_name + dir_len, opts->x_dump_base_name);
722 opts->x_dump_base_name = new_dump_base_name;
725 opts->x_dump_base_name_prefixed = true;
728 /* Handle related options for unit-at-a-time, toplevel-reorder, and
729 section-anchors. */
730 if (!opts->x_flag_unit_at_a_time)
732 if (opts->x_flag_section_anchors && opts_set->x_flag_section_anchors)
733 error_at (loc, "section anchors must be disabled when unit-at-a-time "
734 "is disabled");
735 opts->x_flag_section_anchors = 0;
736 if (opts->x_flag_toplevel_reorder == 1)
737 error_at (loc, "toplevel reorder must be disabled when unit-at-a-time "
738 "is disabled");
739 opts->x_flag_toplevel_reorder = 0;
742 if (opts->x_flag_tm && opts->x_flag_non_call_exceptions)
743 sorry ("transactional memory is not supported with non-call exceptions");
745 /* Unless the user has asked for section anchors, we disable toplevel
746 reordering at -O0 to disable transformations that might be surprising
747 to end users and to get -fno-toplevel-reorder tested. */
748 if (!opts->x_optimize
749 && opts->x_flag_toplevel_reorder == 2
750 && !(opts->x_flag_section_anchors && opts_set->x_flag_section_anchors))
752 opts->x_flag_toplevel_reorder = 0;
753 opts->x_flag_section_anchors = 0;
755 if (!opts->x_flag_toplevel_reorder)
757 if (opts->x_flag_section_anchors && opts_set->x_flag_section_anchors)
758 error_at (loc, "section anchors must be disabled when toplevel reorder"
759 " is disabled");
760 opts->x_flag_section_anchors = 0;
763 if (!opts->x_flag_opts_finished)
765 /* We initialize opts->x_flag_pie to -1 so that targets can set a
766 default value. */
767 if (opts->x_flag_pie == -1)
769 if (opts->x_flag_pic == 0)
770 opts->x_flag_pie = DEFAULT_FLAG_PIE;
771 else
772 opts->x_flag_pie = 0;
774 if (opts->x_flag_pie)
775 opts->x_flag_pic = opts->x_flag_pie;
776 if (opts->x_flag_pic && !opts->x_flag_pie)
777 opts->x_flag_shlib = 1;
778 opts->x_flag_opts_finished = true;
781 /* We initialize opts->x_flag_stack_protect to -1 so that targets
782 can set a default value. */
783 if (opts->x_flag_stack_protect == -1)
784 opts->x_flag_stack_protect = DEFAULT_FLAG_SSP;
786 if (opts->x_optimize == 0)
788 /* Inlining does not work if not optimizing,
789 so force it not to be done. */
790 opts->x_warn_inline = 0;
791 opts->x_flag_no_inline = 1;
794 /* The optimization to partition hot and cold basic blocks into separate
795 sections of the .o and executable files does not work (currently)
796 with exception handling. This is because there is no support for
797 generating unwind info. If opts->x_flag_exceptions is turned on
798 we need to turn off the partitioning optimization. */
800 ui_except = targetm_common.except_unwind_info (opts);
802 if (opts->x_flag_exceptions
803 && opts->x_flag_reorder_blocks_and_partition
804 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))
806 if (opts_set->x_flag_reorder_blocks_and_partition)
807 inform (loc,
808 "-freorder-blocks-and-partition does not work "
809 "with exceptions on this architecture");
810 opts->x_flag_reorder_blocks_and_partition = 0;
811 opts->x_flag_reorder_blocks = 1;
814 /* If user requested unwind info, then turn off the partitioning
815 optimization. */
817 if (opts->x_flag_unwind_tables
818 && !targetm_common.unwind_tables_default
819 && opts->x_flag_reorder_blocks_and_partition
820 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))
822 if (opts_set->x_flag_reorder_blocks_and_partition)
823 inform (loc,
824 "-freorder-blocks-and-partition does not support "
825 "unwind info on this architecture");
826 opts->x_flag_reorder_blocks_and_partition = 0;
827 opts->x_flag_reorder_blocks = 1;
830 /* If the target requested unwind info, then turn off the partitioning
831 optimization with a different message. Likewise, if the target does not
832 support named sections. */
834 if (opts->x_flag_reorder_blocks_and_partition
835 && (!targetm_common.have_named_sections
836 || (opts->x_flag_unwind_tables
837 && targetm_common.unwind_tables_default
838 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))))
840 if (opts_set->x_flag_reorder_blocks_and_partition)
841 inform (loc,
842 "-freorder-blocks-and-partition does not work "
843 "on this architecture");
844 opts->x_flag_reorder_blocks_and_partition = 0;
845 opts->x_flag_reorder_blocks = 1;
848 /* Disable -freorder-blocks-and-partition when -fprofile-use is not in
849 effect. Function splitting was not actually being performed in that case,
850 as probably_never_executed_bb_p does not distinguish any basic blocks as
851 being cold vs hot when there is no profile data. Leaving it enabled,
852 however, causes the assembly code generator to create (empty) cold
853 sections and labels, leading to unnecessary size overhead. */
854 if (opts->x_flag_reorder_blocks_and_partition
855 && !opts_set->x_flag_profile_use)
856 opts->x_flag_reorder_blocks_and_partition = 0;
858 if (opts->x_flag_reorder_blocks_and_partition
859 && !opts_set->x_flag_reorder_functions)
860 opts->x_flag_reorder_functions = 1;
862 /* Pipelining of outer loops is only possible when general pipelining
863 capabilities are requested. */
864 if (!opts->x_flag_sel_sched_pipelining)
865 opts->x_flag_sel_sched_pipelining_outer_loops = 0;
867 if (opts->x_flag_conserve_stack)
869 maybe_set_param_value (PARAM_LARGE_STACK_FRAME, 100,
870 opts->x_param_values, opts_set->x_param_values);
871 maybe_set_param_value (PARAM_STACK_FRAME_GROWTH, 40,
872 opts->x_param_values, opts_set->x_param_values);
875 if (opts->x_flag_lto)
877 #ifdef ENABLE_LTO
878 opts->x_flag_generate_lto = 1;
880 /* When generating IL, do not operate in whole-program mode.
881 Otherwise, symbols will be privatized too early, causing link
882 errors later. */
883 opts->x_flag_whole_program = 0;
884 #else
885 error_at (loc, "LTO support has not been enabled in this configuration");
886 #endif
887 if (!opts->x_flag_fat_lto_objects
888 && (!HAVE_LTO_PLUGIN
889 || (opts_set->x_flag_use_linker_plugin
890 && !opts->x_flag_use_linker_plugin)))
892 if (opts_set->x_flag_fat_lto_objects)
893 error_at (loc, "-fno-fat-lto-objects are supported only with linker plugin");
894 opts->x_flag_fat_lto_objects = 1;
898 /* We initialize opts->x_flag_split_stack to -1 so that targets can set a
899 default value if they choose based on other options. */
900 if (opts->x_flag_split_stack == -1)
901 opts->x_flag_split_stack = 0;
902 else if (opts->x_flag_split_stack)
904 if (!targetm_common.supports_split_stack (true, opts))
906 error_at (loc, "%<-fsplit-stack%> is not supported by "
907 "this compiler configuration");
908 opts->x_flag_split_stack = 0;
912 /* Tune vectorization related parametees according to cost model. */
913 if (opts->x_flag_vect_cost_model == VECT_COST_MODEL_CHEAP)
915 maybe_set_param_value (PARAM_VECT_MAX_VERSION_FOR_ALIAS_CHECKS,
916 6, opts->x_param_values, opts_set->x_param_values);
917 maybe_set_param_value (PARAM_VECT_MAX_VERSION_FOR_ALIGNMENT_CHECKS,
918 0, opts->x_param_values, opts_set->x_param_values);
919 maybe_set_param_value (PARAM_VECT_MAX_PEELING_FOR_ALIGNMENT,
920 0, opts->x_param_values, opts_set->x_param_values);
923 /* Set PARAM_MAX_STORES_TO_SINK to 0 if either vectorization or if-conversion
924 is disabled. */
925 if ((!opts->x_flag_tree_loop_vectorize && !opts->x_flag_tree_slp_vectorize)
926 || !opts->x_flag_tree_loop_if_convert)
927 maybe_set_param_value (PARAM_MAX_STORES_TO_SINK, 0,
928 opts->x_param_values, opts_set->x_param_values);
930 /* The -gsplit-dwarf option requires -ggnu-pubnames. */
931 if (opts->x_dwarf_split_debug_info)
932 opts->x_debug_generate_pub_sections = 2;
934 /* Userspace and kernel ASan conflict with each other. */
936 if ((opts->x_flag_sanitize & SANITIZE_USER_ADDRESS)
937 && (opts->x_flag_sanitize & SANITIZE_KERNEL_ADDRESS))
938 error_at (loc,
939 "-fsanitize=address is incompatible with "
940 "-fsanitize=kernel-address");
942 /* And with TSan. */
944 if ((opts->x_flag_sanitize & SANITIZE_ADDRESS)
945 && (opts->x_flag_sanitize & SANITIZE_THREAD))
946 error_at (loc,
947 "-fsanitize=address and -fsanitize=kernel-address "
948 "are incompatible with -fsanitize=thread");
950 /* Error recovery is not allowed for LSan and TSan. */
952 if (opts->x_flag_sanitize_recover & SANITIZE_THREAD)
953 error_at (loc, "-fsanitize-recover=thread is not supported");
955 if (opts->x_flag_sanitize_recover & SANITIZE_LEAK)
956 error_at (loc, "-fsanitize-recover=leak is not supported");
958 /* When instrumenting the pointers, we don't want to remove
959 the null pointer checks. */
960 if (opts->x_flag_sanitize & (SANITIZE_NULL | SANITIZE_NONNULL_ATTRIBUTE
961 | SANITIZE_RETURNS_NONNULL_ATTRIBUTE))
962 opts->x_flag_delete_null_pointer_checks = 0;
964 /* Aggressive compiler optimizations may cause false negatives. */
965 if (opts->x_flag_sanitize)
967 opts->x_flag_aggressive_loop_optimizations = 0;
968 opts->x_flag_strict_overflow = 0;
972 #define LEFT_COLUMN 27
974 /* Output ITEM, of length ITEM_WIDTH, in the left column,
975 followed by word-wrapped HELP in a second column. */
976 static void
977 wrap_help (const char *help,
978 const char *item,
979 unsigned int item_width,
980 unsigned int columns)
982 unsigned int col_width = LEFT_COLUMN;
983 unsigned int remaining, room, len;
985 remaining = strlen (help);
989 room = columns - 3 - MAX (col_width, item_width);
990 if (room > columns)
991 room = 0;
992 len = remaining;
994 if (room < len)
996 unsigned int i;
998 for (i = 0; help[i]; i++)
1000 if (i >= room && len != remaining)
1001 break;
1002 if (help[i] == ' ')
1003 len = i;
1004 else if ((help[i] == '-' || help[i] == '/')
1005 && help[i + 1] != ' '
1006 && i > 0 && ISALPHA (help[i - 1]))
1007 len = i + 1;
1011 printf (" %-*.*s %.*s\n", col_width, item_width, item, len, help);
1012 item_width = 0;
1013 while (help[len] == ' ')
1014 len++;
1015 help += len;
1016 remaining -= len;
1018 while (remaining);
1021 /* Print help for a specific front-end, etc. */
1022 static void
1023 print_filtered_help (unsigned int include_flags,
1024 unsigned int exclude_flags,
1025 unsigned int any_flags,
1026 unsigned int columns,
1027 struct gcc_options *opts,
1028 unsigned int lang_mask)
1030 unsigned int i;
1031 const char *help;
1032 bool found = false;
1033 bool displayed = false;
1034 char new_help[256];
1036 if (include_flags == CL_PARAMS)
1038 for (i = 0; i < LAST_PARAM; i++)
1040 const char *param = compiler_params[i].option;
1042 help = compiler_params[i].help;
1043 if (help == NULL || *help == '\0')
1045 if (exclude_flags & CL_UNDOCUMENTED)
1046 continue;
1047 help = undocumented_msg;
1050 /* Get the translation. */
1051 help = _(help);
1053 if (!opts->x_quiet_flag)
1055 snprintf (new_help, sizeof (new_help),
1056 _("default %d minimum %d maximum %d"),
1057 compiler_params[i].default_value,
1058 compiler_params[i].min_value,
1059 compiler_params[i].max_value);
1060 help = new_help;
1062 wrap_help (help, param, strlen (param), columns);
1064 putchar ('\n');
1065 return;
1068 if (!opts->x_help_printed)
1069 opts->x_help_printed = XCNEWVAR (char, cl_options_count);
1071 if (!opts->x_help_enum_printed)
1072 opts->x_help_enum_printed = XCNEWVAR (char, cl_enums_count);
1074 for (i = 0; i < cl_options_count; i++)
1076 const struct cl_option *option = cl_options + i;
1077 unsigned int len;
1078 const char *opt;
1079 const char *tab;
1081 if (include_flags == 0
1082 || ((option->flags & include_flags) != include_flags))
1084 if ((option->flags & any_flags) == 0)
1085 continue;
1088 /* Skip unwanted switches. */
1089 if ((option->flags & exclude_flags) != 0)
1090 continue;
1092 /* The driver currently prints its own help text. */
1093 if ((option->flags & CL_DRIVER) != 0
1094 && (option->flags & (((1U << cl_lang_count) - 1)
1095 | CL_COMMON | CL_TARGET)) == 0)
1096 continue;
1098 found = true;
1099 /* Skip switches that have already been printed. */
1100 if (opts->x_help_printed[i])
1101 continue;
1103 opts->x_help_printed[i] = true;
1105 help = option->help;
1106 if (help == NULL)
1108 if (exclude_flags & CL_UNDOCUMENTED)
1109 continue;
1111 help = undocumented_msg;
1114 if (option->alias_target < N_OPTS
1115 && cl_options [option->alias_target].help)
1117 if (help == undocumented_msg)
1119 /* For undocumented options that are aliases for other options
1120 that are documented, point the reader to the other option in
1121 preference of the former. */
1122 snprintf (new_help, sizeof new_help,
1123 _("Same as %s. Use the latter option instead."),
1124 cl_options [option->alias_target].opt_text);
1126 else
1128 /* For documented options with aliases, mention the aliased
1129 option's name for reference. */
1130 snprintf (new_help, sizeof new_help,
1131 _("%s Same as %s."),
1132 help, cl_options [option->alias_target].opt_text);
1135 help = new_help;
1138 if (option->warn_message)
1140 /* Mention that the use of the option will trigger a warning. */
1141 if (help == new_help)
1142 snprintf (new_help + strlen (new_help),
1143 sizeof new_help - strlen (new_help),
1144 " %s", _(use_diagnosed_msg));
1145 else
1146 snprintf (new_help, sizeof new_help,
1147 "%s %s", help, _(use_diagnosed_msg));
1149 help = new_help;
1152 /* Get the translation. */
1153 help = _(help);
1155 /* Find the gap between the name of the
1156 option and its descriptive text. */
1157 tab = strchr (help, '\t');
1158 if (tab)
1160 len = tab - help;
1161 opt = help;
1162 help = tab + 1;
1164 else
1166 opt = option->opt_text;
1167 len = strlen (opt);
1170 /* With the -Q option enabled we change the descriptive text associated
1171 with an option to be an indication of its current setting. */
1172 if (!opts->x_quiet_flag)
1174 void *flag_var = option_flag_var (i, opts);
1176 if (len < (LEFT_COLUMN + 2))
1177 strcpy (new_help, "\t\t");
1178 else
1179 strcpy (new_help, "\t");
1181 if (flag_var != NULL
1182 && option->var_type != CLVC_DEFER)
1184 if (option->flags & CL_JOINED)
1186 if (option->var_type == CLVC_STRING)
1188 if (* (const char **) flag_var != NULL)
1189 snprintf (new_help + strlen (new_help),
1190 sizeof (new_help) - strlen (new_help),
1191 "%s", * (const char **) flag_var);
1193 else if (option->var_type == CLVC_ENUM)
1195 const struct cl_enum *e = &cl_enums[option->var_enum];
1196 int value;
1197 const char *arg = NULL;
1199 value = e->get (flag_var);
1200 enum_value_to_arg (e->values, &arg, value, lang_mask);
1201 if (arg == NULL)
1202 arg = _("[default]");
1203 snprintf (new_help + strlen (new_help),
1204 sizeof (new_help) - strlen (new_help),
1205 "%s", arg);
1207 else
1208 sprintf (new_help + strlen (new_help),
1209 "%#x", * (int *) flag_var);
1211 else
1212 strcat (new_help, option_enabled (i, opts)
1213 ? _("[enabled]") : _("[disabled]"));
1216 help = new_help;
1219 wrap_help (help, opt, len, columns);
1220 displayed = true;
1222 if (option->var_type == CLVC_ENUM
1223 && opts->x_help_enum_printed[option->var_enum] != 2)
1224 opts->x_help_enum_printed[option->var_enum] = 1;
1227 if (! found)
1229 unsigned int langs = include_flags & CL_LANG_ALL;
1231 if (langs == 0)
1232 printf (_(" No options with the desired characteristics were found\n"));
1233 else
1235 unsigned int i;
1237 /* PR 31349: Tell the user how to see all of the
1238 options supported by a specific front end. */
1239 for (i = 0; (1U << i) < CL_LANG_ALL; i ++)
1240 if ((1U << i) & langs)
1241 printf (_(" None found. Use --help=%s to show *all* the options supported by the %s front-end.\n"),
1242 lang_names[i], lang_names[i]);
1246 else if (! displayed)
1247 printf (_(" All options with the desired characteristics have already been displayed\n"));
1249 putchar ('\n');
1251 /* Print details of enumerated option arguments, if those
1252 enumerations have help text headings provided. If no help text
1253 is provided, presume that the possible values are listed in the
1254 help text for the relevant options. */
1255 for (i = 0; i < cl_enums_count; i++)
1257 unsigned int j, pos;
1259 if (opts->x_help_enum_printed[i] != 1)
1260 continue;
1261 if (cl_enums[i].help == NULL)
1262 continue;
1263 printf (" %s\n ", _(cl_enums[i].help));
1264 pos = 4;
1265 for (j = 0; cl_enums[i].values[j].arg != NULL; j++)
1267 unsigned int len = strlen (cl_enums[i].values[j].arg);
1269 if (pos > 4 && pos + 1 + len <= columns)
1271 printf (" %s", cl_enums[i].values[j].arg);
1272 pos += 1 + len;
1274 else
1276 if (pos > 4)
1278 printf ("\n ");
1279 pos = 4;
1281 printf ("%s", cl_enums[i].values[j].arg);
1282 pos += len;
1285 printf ("\n\n");
1286 opts->x_help_enum_printed[i] = 2;
1290 /* Display help for a specified type of option.
1291 The options must have ALL of the INCLUDE_FLAGS set
1292 ANY of the flags in the ANY_FLAGS set
1293 and NONE of the EXCLUDE_FLAGS set. The current option state is in
1294 OPTS; LANG_MASK is used for interpreting enumerated option state. */
1295 static void
1296 print_specific_help (unsigned int include_flags,
1297 unsigned int exclude_flags,
1298 unsigned int any_flags,
1299 struct gcc_options *opts,
1300 unsigned int lang_mask)
1302 unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1303 const char * description = NULL;
1304 const char * descrip_extra = "";
1305 size_t i;
1306 unsigned int flag;
1308 /* Sanity check: Make sure that we do not have more
1309 languages than we have bits available to enumerate them. */
1310 gcc_assert ((1U << cl_lang_count) <= CL_MIN_OPTION_CLASS);
1312 /* If we have not done so already, obtain
1313 the desired maximum width of the output. */
1314 if (opts->x_help_columns == 0)
1316 opts->x_help_columns = get_terminal_width ();
1317 if (opts->x_help_columns == INT_MAX)
1318 /* Use a reasonable default. */
1319 opts->x_help_columns = 80;
1322 /* Decide upon the title for the options that we are going to display. */
1323 for (i = 0, flag = 1; flag <= CL_MAX_OPTION_CLASS; flag <<= 1, i ++)
1325 switch (flag & include_flags)
1327 case 0:
1328 case CL_DRIVER:
1329 break;
1331 case CL_TARGET:
1332 description = _("The following options are target specific");
1333 break;
1334 case CL_WARNING:
1335 description = _("The following options control compiler warning messages");
1336 break;
1337 case CL_OPTIMIZATION:
1338 description = _("The following options control optimizations");
1339 break;
1340 case CL_COMMON:
1341 description = _("The following options are language-independent");
1342 break;
1343 case CL_PARAMS:
1344 description = _("The --param option recognizes the following as parameters");
1345 break;
1346 default:
1347 if (i >= cl_lang_count)
1348 break;
1349 if (exclude_flags & all_langs_mask)
1350 description = _("The following options are specific to just the language ");
1351 else
1352 description = _("The following options are supported by the language ");
1353 descrip_extra = lang_names [i];
1354 break;
1358 if (description == NULL)
1360 if (any_flags == 0)
1362 if (include_flags & CL_UNDOCUMENTED)
1363 description = _("The following options are not documented");
1364 else if (include_flags & CL_SEPARATE)
1365 description = _("The following options take separate arguments");
1366 else if (include_flags & CL_JOINED)
1367 description = _("The following options take joined arguments");
1368 else
1370 internal_error ("unrecognized include_flags 0x%x passed to print_specific_help",
1371 include_flags);
1372 return;
1375 else
1377 if (any_flags & all_langs_mask)
1378 description = _("The following options are language-related");
1379 else
1380 description = _("The following options are language-independent");
1384 printf ("%s%s:\n", description, descrip_extra);
1385 print_filtered_help (include_flags, exclude_flags, any_flags,
1386 opts->x_help_columns, opts, lang_mask);
1389 /* Enable FDO-related flags. */
1391 static void
1392 enable_fdo_optimizations (struct gcc_options *opts,
1393 struct gcc_options *opts_set,
1394 int value)
1396 if (!opts_set->x_flag_branch_probabilities)
1397 opts->x_flag_branch_probabilities = value;
1398 if (!opts_set->x_flag_profile_values)
1399 opts->x_flag_profile_values = value;
1400 if (!opts_set->x_flag_unroll_loops)
1401 opts->x_flag_unroll_loops = value;
1402 if (!opts_set->x_flag_peel_loops)
1403 opts->x_flag_peel_loops = value;
1404 if (!opts_set->x_flag_tracer)
1405 opts->x_flag_tracer = value;
1406 if (!opts_set->x_flag_value_profile_transformations)
1407 opts->x_flag_value_profile_transformations = value;
1408 if (!opts_set->x_flag_inline_functions)
1409 opts->x_flag_inline_functions = value;
1410 if (!opts_set->x_flag_ipa_cp)
1411 opts->x_flag_ipa_cp = value;
1412 if (!opts_set->x_flag_ipa_cp_clone
1413 && value && opts->x_flag_ipa_cp)
1414 opts->x_flag_ipa_cp_clone = value;
1415 if (!opts_set->x_flag_ipa_cp_alignment
1416 && value && opts->x_flag_ipa_cp)
1417 opts->x_flag_ipa_cp_alignment = value;
1418 if (!opts_set->x_flag_predictive_commoning)
1419 opts->x_flag_predictive_commoning = value;
1420 if (!opts_set->x_flag_unswitch_loops)
1421 opts->x_flag_unswitch_loops = value;
1422 if (!opts_set->x_flag_gcse_after_reload)
1423 opts->x_flag_gcse_after_reload = value;
1424 if (!opts_set->x_flag_tree_loop_vectorize
1425 && !opts_set->x_flag_tree_vectorize)
1426 opts->x_flag_tree_loop_vectorize = value;
1427 if (!opts_set->x_flag_tree_slp_vectorize
1428 && !opts_set->x_flag_tree_vectorize)
1429 opts->x_flag_tree_slp_vectorize = value;
1430 if (!opts_set->x_flag_vect_cost_model)
1431 opts->x_flag_vect_cost_model = VECT_COST_MODEL_DYNAMIC;
1432 if (!opts_set->x_flag_tree_loop_distribute_patterns)
1433 opts->x_flag_tree_loop_distribute_patterns = value;
1436 /* Handle target- and language-independent options. Return zero to
1437 generate an "unknown option" message. Only options that need
1438 extra handling need to be listed here; if you simply want
1439 DECODED->value assigned to a variable, it happens automatically. */
1441 bool
1442 common_handle_option (struct gcc_options *opts,
1443 struct gcc_options *opts_set,
1444 const struct cl_decoded_option *decoded,
1445 unsigned int lang_mask, int kind ATTRIBUTE_UNUSED,
1446 location_t loc,
1447 const struct cl_option_handlers *handlers,
1448 diagnostic_context *dc)
1450 size_t scode = decoded->opt_index;
1451 const char *arg = decoded->arg;
1452 int value = decoded->value;
1453 enum opt_code code = (enum opt_code) scode;
1455 gcc_assert (decoded->canonical_option_num_elements <= 2);
1457 switch (code)
1459 case OPT__param:
1460 handle_param (opts, opts_set, loc, arg);
1461 break;
1463 case OPT__help:
1465 unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1466 unsigned int undoc_mask;
1467 unsigned int i;
1469 if (lang_mask == CL_DRIVER)
1470 break;
1472 undoc_mask = ((opts->x_verbose_flag | opts->x_extra_warnings)
1474 : CL_UNDOCUMENTED);
1475 /* First display any single language specific options. */
1476 for (i = 0; i < cl_lang_count; i++)
1477 print_specific_help
1478 (1U << i, (all_langs_mask & (~ (1U << i))) | undoc_mask, 0, opts,
1479 lang_mask);
1480 /* Next display any multi language specific options. */
1481 print_specific_help (0, undoc_mask, all_langs_mask, opts, lang_mask);
1482 /* Then display any remaining, non-language options. */
1483 for (i = CL_MIN_OPTION_CLASS; i <= CL_MAX_OPTION_CLASS; i <<= 1)
1484 if (i != CL_DRIVER)
1485 print_specific_help (i, undoc_mask, 0, opts, lang_mask);
1486 opts->x_exit_after_options = true;
1487 break;
1490 case OPT__target_help:
1491 if (lang_mask == CL_DRIVER)
1492 break;
1494 print_specific_help (CL_TARGET, CL_UNDOCUMENTED, 0, opts, lang_mask);
1495 opts->x_exit_after_options = true;
1496 break;
1498 case OPT__help_:
1500 const char * a = arg;
1501 unsigned int include_flags = 0;
1502 /* Note - by default we include undocumented options when listing
1503 specific classes. If you only want to see documented options
1504 then add ",^undocumented" to the --help= option. E.g.:
1506 --help=target,^undocumented */
1507 unsigned int exclude_flags = 0;
1509 if (lang_mask == CL_DRIVER)
1510 break;
1512 /* Walk along the argument string, parsing each word in turn.
1513 The format is:
1514 arg = [^]{word}[,{arg}]
1515 word = {optimizers|target|warnings|undocumented|
1516 params|common|<language>} */
1517 while (* a != 0)
1519 static const struct
1521 const char * string;
1522 unsigned int flag;
1524 specifics[] =
1526 { "optimizers", CL_OPTIMIZATION },
1527 { "target", CL_TARGET },
1528 { "warnings", CL_WARNING },
1529 { "undocumented", CL_UNDOCUMENTED },
1530 { "params", CL_PARAMS },
1531 { "joined", CL_JOINED },
1532 { "separate", CL_SEPARATE },
1533 { "common", CL_COMMON },
1534 { NULL, 0 }
1536 unsigned int * pflags;
1537 const char * comma;
1538 unsigned int lang_flag, specific_flag;
1539 unsigned int len;
1540 unsigned int i;
1542 if (* a == '^')
1544 ++ a;
1545 pflags = & exclude_flags;
1547 else
1548 pflags = & include_flags;
1550 comma = strchr (a, ',');
1551 if (comma == NULL)
1552 len = strlen (a);
1553 else
1554 len = comma - a;
1555 if (len == 0)
1557 a = comma + 1;
1558 continue;
1561 /* Check to see if the string matches an option class name. */
1562 for (i = 0, specific_flag = 0; specifics[i].string != NULL; i++)
1563 if (strncasecmp (a, specifics[i].string, len) == 0)
1565 specific_flag = specifics[i].flag;
1566 break;
1569 /* Check to see if the string matches a language name.
1570 Note - we rely upon the alpha-sorted nature of the entries in
1571 the lang_names array, specifically that shorter names appear
1572 before their longer variants. (i.e. C before C++). That way
1573 when we are attempting to match --help=c for example we will
1574 match with C first and not C++. */
1575 for (i = 0, lang_flag = 0; i < cl_lang_count; i++)
1576 if (strncasecmp (a, lang_names[i], len) == 0)
1578 lang_flag = 1U << i;
1579 break;
1582 if (specific_flag != 0)
1584 if (lang_flag == 0)
1585 * pflags |= specific_flag;
1586 else
1588 /* The option's argument matches both the start of a
1589 language name and the start of an option class name.
1590 We have a special case for when the user has
1591 specified "--help=c", but otherwise we have to issue
1592 a warning. */
1593 if (strncasecmp (a, "c", len) == 0)
1594 * pflags |= lang_flag;
1595 else
1596 warning_at (loc, 0,
1597 "--help argument %q.*s is ambiguous, "
1598 "please be more specific",
1599 len, a);
1602 else if (lang_flag != 0)
1603 * pflags |= lang_flag;
1604 else
1605 warning_at (loc, 0,
1606 "unrecognized argument to --help= option: %q.*s",
1607 len, a);
1609 if (comma == NULL)
1610 break;
1611 a = comma + 1;
1614 if (include_flags)
1615 print_specific_help (include_flags, exclude_flags, 0, opts,
1616 lang_mask);
1617 opts->x_exit_after_options = true;
1618 break;
1621 case OPT__version:
1622 if (lang_mask == CL_DRIVER)
1623 break;
1625 opts->x_exit_after_options = true;
1626 break;
1628 case OPT_fsanitize_:
1629 case OPT_fsanitize_recover_:
1631 const char *p = arg;
1632 unsigned int *flag
1633 = code == OPT_fsanitize_ ? &opts->x_flag_sanitize
1634 : &opts->x_flag_sanitize_recover;
1635 while (*p != 0)
1637 static const struct
1639 const char *const name;
1640 unsigned int flag;
1641 size_t len;
1642 } spec[] =
1644 { "address", SANITIZE_ADDRESS | SANITIZE_USER_ADDRESS,
1645 sizeof "address" - 1 },
1646 { "kernel-address", SANITIZE_ADDRESS | SANITIZE_KERNEL_ADDRESS,
1647 sizeof "kernel-address" - 1 },
1648 { "thread", SANITIZE_THREAD, sizeof "thread" - 1 },
1649 { "leak", SANITIZE_LEAK, sizeof "leak" - 1 },
1650 { "shift", SANITIZE_SHIFT, sizeof "shift" - 1 },
1651 { "integer-divide-by-zero", SANITIZE_DIVIDE,
1652 sizeof "integer-divide-by-zero" - 1 },
1653 { "undefined", SANITIZE_UNDEFINED, sizeof "undefined" - 1 },
1654 { "unreachable", SANITIZE_UNREACHABLE,
1655 sizeof "unreachable" - 1 },
1656 { "vla-bound", SANITIZE_VLA, sizeof "vla-bound" - 1 },
1657 { "return", SANITIZE_RETURN, sizeof "return" - 1 },
1658 { "null", SANITIZE_NULL, sizeof "null" - 1 },
1659 { "signed-integer-overflow", SANITIZE_SI_OVERFLOW,
1660 sizeof "signed-integer-overflow" -1 },
1661 { "bool", SANITIZE_BOOL, sizeof "bool" - 1 },
1662 { "enum", SANITIZE_ENUM, sizeof "enum" - 1 },
1663 { "float-divide-by-zero", SANITIZE_FLOAT_DIVIDE,
1664 sizeof "float-divide-by-zero" - 1 },
1665 { "float-cast-overflow", SANITIZE_FLOAT_CAST,
1666 sizeof "float-cast-overflow" - 1 },
1667 { "bounds", SANITIZE_BOUNDS, sizeof "bounds" - 1 },
1668 { "bounds-strict", SANITIZE_BOUNDS | SANITIZE_BOUNDS_STRICT,
1669 sizeof "bounds-strict" - 1 },
1670 { "alignment", SANITIZE_ALIGNMENT, sizeof "alignment" - 1 },
1671 { "nonnull-attribute", SANITIZE_NONNULL_ATTRIBUTE,
1672 sizeof "nonnull-attribute" - 1 },
1673 { "returns-nonnull-attribute",
1674 SANITIZE_RETURNS_NONNULL_ATTRIBUTE,
1675 sizeof "returns-nonnull-attribute" - 1 },
1676 { "object-size", SANITIZE_OBJECT_SIZE,
1677 sizeof "object-size" - 1 },
1678 { "vptr", SANITIZE_VPTR, sizeof "vptr" - 1 },
1679 { "all", ~0, sizeof "all" - 1 },
1680 { NULL, 0, 0 }
1682 const char *comma;
1683 size_t len, i;
1684 bool found = false;
1686 comma = strchr (p, ',');
1687 if (comma == NULL)
1688 len = strlen (p);
1689 else
1690 len = comma - p;
1691 if (len == 0)
1693 p = comma + 1;
1694 continue;
1697 /* Check to see if the string matches an option class name. */
1698 for (i = 0; spec[i].name != NULL; ++i)
1699 if (len == spec[i].len
1700 && memcmp (p, spec[i].name, len) == 0)
1702 /* Handle both -fsanitize and -fno-sanitize cases. */
1703 if (value && spec[i].flag == ~0U)
1705 if (code == OPT_fsanitize_)
1706 error_at (loc, "-fsanitize=all option is not valid");
1707 else
1708 *flag |= ~(SANITIZE_USER_ADDRESS | SANITIZE_THREAD
1709 | SANITIZE_LEAK);
1711 else if (value)
1712 *flag |= spec[i].flag;
1713 else
1714 *flag &= ~spec[i].flag;
1715 found = true;
1716 break;
1719 if (! found)
1720 error_at (loc,
1721 "unrecognized argument to -fsanitize%s= option: %q.*s",
1722 code == OPT_fsanitize_ ? "" : "-recover", (int) len, p);
1724 if (comma == NULL)
1725 break;
1726 p = comma + 1;
1729 if (code != OPT_fsanitize_)
1730 break;
1732 /* Kernel ASan implies normal ASan but does not yet support
1733 all features. */
1734 if (opts->x_flag_sanitize & SANITIZE_KERNEL_ADDRESS)
1736 maybe_set_param_value (PARAM_ASAN_INSTRUMENTATION_WITH_CALL_THRESHOLD, 0,
1737 opts->x_param_values,
1738 opts_set->x_param_values);
1739 maybe_set_param_value (PARAM_ASAN_GLOBALS, 0,
1740 opts->x_param_values,
1741 opts_set->x_param_values);
1742 maybe_set_param_value (PARAM_ASAN_STACK, 0,
1743 opts->x_param_values,
1744 opts_set->x_param_values);
1745 maybe_set_param_value (PARAM_ASAN_USE_AFTER_RETURN, 0,
1746 opts->x_param_values,
1747 opts_set->x_param_values);
1750 break;
1753 case OPT_fasan_shadow_offset_:
1754 /* Deferred. */
1755 break;
1757 case OPT_fsanitize_recover:
1758 if (value)
1759 opts->x_flag_sanitize_recover
1760 |= SANITIZE_UNDEFINED | SANITIZE_NONDEFAULT;
1761 else
1762 opts->x_flag_sanitize_recover
1763 &= ~(SANITIZE_UNDEFINED | SANITIZE_NONDEFAULT);
1764 break;
1766 case OPT_O:
1767 case OPT_Os:
1768 case OPT_Ofast:
1769 case OPT_Og:
1770 /* Currently handled in a prescan. */
1771 break;
1773 case OPT_Werror:
1774 dc->warning_as_error_requested = value;
1775 break;
1777 case OPT_Werror_:
1778 if (lang_mask == CL_DRIVER)
1779 break;
1781 enable_warning_as_error (arg, value, lang_mask, handlers,
1782 opts, opts_set, loc, dc);
1783 break;
1785 case OPT_Wlarger_than_:
1786 opts->x_larger_than_size = value;
1787 opts->x_warn_larger_than = value != -1;
1788 break;
1790 case OPT_Wfatal_errors:
1791 dc->fatal_errors = value;
1792 break;
1794 case OPT_Wframe_larger_than_:
1795 opts->x_frame_larger_than_size = value;
1796 opts->x_warn_frame_larger_than = value != -1;
1797 break;
1799 case OPT_Wstack_usage_:
1800 opts->x_warn_stack_usage = value;
1801 opts->x_flag_stack_usage_info = value != -1;
1802 break;
1804 case OPT_Wstrict_aliasing:
1805 set_Wstrict_aliasing (opts, value);
1806 break;
1808 case OPT_Wstrict_overflow:
1809 opts->x_warn_strict_overflow = (value
1810 ? (int) WARN_STRICT_OVERFLOW_CONDITIONAL
1811 : 0);
1812 break;
1814 case OPT_Wsystem_headers:
1815 dc->dc_warn_system_headers = value;
1816 break;
1818 case OPT_aux_info:
1819 opts->x_flag_gen_aux_info = 1;
1820 break;
1822 case OPT_auxbase_strip:
1824 char *tmp = xstrdup (arg);
1825 strip_off_ending (tmp, strlen (tmp));
1826 if (tmp[0])
1827 opts->x_aux_base_name = tmp;
1828 else
1829 free (tmp);
1831 break;
1833 case OPT_d:
1834 decode_d_option (arg, opts, loc, dc);
1835 break;
1837 case OPT_fcall_used_:
1838 case OPT_fcall_saved_:
1839 /* Deferred. */
1840 break;
1842 case OPT_fdbg_cnt_:
1843 /* Deferred. */
1844 break;
1846 case OPT_fdbg_cnt_list:
1847 /* Deferred. */
1848 opts->x_exit_after_options = true;
1849 break;
1851 case OPT_fdebug_prefix_map_:
1852 /* Deferred. */
1853 break;
1855 case OPT_fdiagnostics_show_location_:
1856 diagnostic_prefixing_rule (dc) = (diagnostic_prefixing_rule_t) value;
1857 break;
1859 case OPT_fdiagnostics_show_caret:
1860 dc->show_caret = value;
1861 break;
1863 case OPT_fdiagnostics_color_:
1864 diagnostic_color_init (dc, value);
1865 break;
1867 case OPT_fdiagnostics_show_option:
1868 dc->show_option_requested = value;
1869 break;
1871 case OPT_fdump_:
1872 /* Deferred. */
1873 break;
1875 case OPT_ffast_math:
1876 set_fast_math_flags (opts, value);
1877 break;
1879 case OPT_funsafe_math_optimizations:
1880 set_unsafe_math_optimizations_flags (opts, value);
1881 break;
1883 case OPT_ffixed_:
1884 /* Deferred. */
1885 break;
1887 case OPT_finline_limit_:
1888 set_param_value ("max-inline-insns-single", value / 2,
1889 opts->x_param_values, opts_set->x_param_values);
1890 set_param_value ("max-inline-insns-auto", value / 2,
1891 opts->x_param_values, opts_set->x_param_values);
1892 break;
1894 case OPT_finstrument_functions_exclude_function_list_:
1895 add_comma_separated_to_vector
1896 (&opts->x_flag_instrument_functions_exclude_functions, arg);
1897 break;
1899 case OPT_finstrument_functions_exclude_file_list_:
1900 add_comma_separated_to_vector
1901 (&opts->x_flag_instrument_functions_exclude_files, arg);
1902 break;
1904 case OPT_fmessage_length_:
1905 pp_set_line_maximum_length (dc->printer, value);
1906 diagnostic_set_caret_max_width (dc, value);
1907 break;
1909 case OPT_fopt_info:
1910 case OPT_fopt_info_:
1911 /* Deferred. */
1912 break;
1914 case OPT_foffload_:
1916 const char *p = arg;
1917 opts->x_flag_disable_hsa = true;
1918 while (*p != 0)
1920 const char *comma = strchr (p, ',');
1922 if ((strncmp (p, "disable", 7) == 0)
1923 && (p[7] == ',' || p[7] == '\0'))
1925 opts->x_flag_disable_hsa = true;
1926 break;
1929 if ((strncmp (p, "hsa", 3) == 0)
1930 && (p[3] == ',' || p[3] == '\0'))
1932 #ifdef ENABLE_HSA
1933 opts->x_flag_disable_hsa = false;
1934 #else
1935 sorry ("HSA has not been enabled during configuration");
1936 #endif
1938 if (!comma)
1939 break;
1940 p = comma + 1;
1942 break;
1945 #ifndef ACCEL_COMPILER
1946 case OPT_foffload_abi_:
1947 error_at (loc, "-foffload-abi option can be specified only for "
1948 "offload compiler");
1949 break;
1950 #endif
1952 case OPT_fpack_struct_:
1953 if (value <= 0 || (value & (value - 1)) || value > 16)
1954 error_at (loc,
1955 "structure alignment must be a small power of two, not %d",
1956 value);
1957 else
1958 opts->x_initial_max_fld_align = value;
1959 break;
1961 case OPT_fplugin_:
1962 case OPT_fplugin_arg_:
1963 /* Deferred. */
1964 break;
1966 case OPT_fprofile_use_:
1967 opts->x_profile_data_prefix = xstrdup (arg);
1968 opts->x_flag_profile_use = true;
1969 value = true;
1970 /* No break here - do -fprofile-use processing. */
1971 case OPT_fprofile_use:
1972 enable_fdo_optimizations (opts, opts_set, value);
1973 if (!opts_set->x_flag_profile_reorder_functions)
1974 opts->x_flag_profile_reorder_functions = value;
1975 /* Indirect call profiling should do all useful transformations
1976 speculative devirtualization does. */
1977 if (!opts_set->x_flag_devirtualize_speculatively
1978 && opts->x_flag_value_profile_transformations)
1979 opts->x_flag_devirtualize_speculatively = false;
1980 break;
1982 case OPT_fauto_profile_:
1983 opts->x_auto_profile_file = xstrdup (arg);
1984 opts->x_flag_auto_profile = true;
1985 value = true;
1986 /* No break here - do -fauto-profile processing. */
1987 case OPT_fauto_profile:
1988 enable_fdo_optimizations (opts, opts_set, value);
1989 if (!opts_set->x_flag_profile_correction)
1990 opts->x_flag_profile_correction = value;
1991 maybe_set_param_value (
1992 PARAM_EARLY_INLINER_MAX_ITERATIONS, 10,
1993 opts->x_param_values, opts_set->x_param_values);
1994 break;
1996 case OPT_fprofile_generate_:
1997 opts->x_profile_data_prefix = xstrdup (arg);
1998 value = true;
1999 /* No break here - do -fprofile-generate processing. */
2000 case OPT_fprofile_generate:
2001 if (!opts_set->x_profile_arc_flag)
2002 opts->x_profile_arc_flag = value;
2003 if (!opts_set->x_flag_profile_values)
2004 opts->x_flag_profile_values = value;
2005 if (!opts_set->x_flag_inline_functions)
2006 opts->x_flag_inline_functions = value;
2007 /* FIXME: Instrumentation we insert makes ipa-reference bitmaps
2008 quadratic. Disable the pass until better memory representation
2009 is done. */
2010 if (!opts_set->x_flag_ipa_reference)
2011 opts->x_flag_ipa_reference = false;
2012 break;
2014 case OPT_ftree_vectorize:
2015 if (!opts_set->x_flag_tree_loop_vectorize)
2016 opts->x_flag_tree_loop_vectorize = value;
2017 if (!opts_set->x_flag_tree_slp_vectorize)
2018 opts->x_flag_tree_slp_vectorize = value;
2019 break;
2020 case OPT_fshow_column:
2021 dc->show_column = value;
2022 break;
2024 case OPT_frandom_seed:
2025 /* The real switch is -fno-random-seed. */
2026 if (value)
2027 return false;
2028 /* Deferred. */
2029 break;
2031 case OPT_frandom_seed_:
2032 /* Deferred. */
2033 break;
2035 case OPT_fsched_verbose_:
2036 #ifdef INSN_SCHEDULING
2037 /* Handled with Var in common.opt. */
2038 break;
2039 #else
2040 return false;
2041 #endif
2043 case OPT_fsched_stalled_insns_:
2044 opts->x_flag_sched_stalled_insns = value;
2045 if (opts->x_flag_sched_stalled_insns == 0)
2046 opts->x_flag_sched_stalled_insns = -1;
2047 break;
2049 case OPT_fsched_stalled_insns_dep_:
2050 opts->x_flag_sched_stalled_insns_dep = value;
2051 break;
2053 case OPT_fstack_check_:
2054 if (!strcmp (arg, "no"))
2055 opts->x_flag_stack_check = NO_STACK_CHECK;
2056 else if (!strcmp (arg, "generic"))
2057 /* This is the old stack checking method. */
2058 opts->x_flag_stack_check = STACK_CHECK_BUILTIN
2059 ? FULL_BUILTIN_STACK_CHECK
2060 : GENERIC_STACK_CHECK;
2061 else if (!strcmp (arg, "specific"))
2062 /* This is the new stack checking method. */
2063 opts->x_flag_stack_check = STACK_CHECK_BUILTIN
2064 ? FULL_BUILTIN_STACK_CHECK
2065 : STACK_CHECK_STATIC_BUILTIN
2066 ? STATIC_BUILTIN_STACK_CHECK
2067 : GENERIC_STACK_CHECK;
2068 else
2069 warning_at (loc, 0, "unknown stack check parameter %qs", arg);
2070 break;
2072 case OPT_fstack_limit:
2073 /* The real switch is -fno-stack-limit. */
2074 if (value)
2075 return false;
2076 /* Deferred. */
2077 break;
2079 case OPT_fstack_limit_register_:
2080 case OPT_fstack_limit_symbol_:
2081 /* Deferred. */
2082 break;
2084 case OPT_fstack_usage:
2085 opts->x_flag_stack_usage = value;
2086 opts->x_flag_stack_usage_info = value != 0;
2087 break;
2089 case OPT_g:
2090 set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, arg, opts, opts_set,
2091 loc);
2092 break;
2094 case OPT_gcoff:
2095 set_debug_level (SDB_DEBUG, false, arg, opts, opts_set, loc);
2096 break;
2098 case OPT_gdwarf:
2099 if (arg && strlen (arg) != 0)
2101 error_at (loc, "%<-gdwarf%s%> is ambiguous; "
2102 "use %<-gdwarf-%s%> for DWARF version "
2103 "or %<-gdwarf -g%s%> for debug level", arg, arg, arg);
2104 break;
2106 else
2107 value = opts->x_dwarf_version;
2109 /* FALLTHRU */
2110 case OPT_gdwarf_:
2111 if (value < 2 || value > 5)
2112 error_at (loc, "dwarf version %d is not supported", value);
2113 else
2114 opts->x_dwarf_version = value;
2115 set_debug_level (DWARF2_DEBUG, false, "", opts, opts_set, loc);
2116 break;
2118 case OPT_gsplit_dwarf:
2119 set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, "", opts, opts_set,
2120 loc);
2121 break;
2123 case OPT_ggdb:
2124 set_debug_level (NO_DEBUG, 2, arg, opts, opts_set, loc);
2125 break;
2127 case OPT_gstabs:
2128 case OPT_gstabs_:
2129 set_debug_level (DBX_DEBUG, code == OPT_gstabs_, arg, opts, opts_set,
2130 loc);
2131 break;
2133 case OPT_gvms:
2134 set_debug_level (VMS_DEBUG, false, arg, opts, opts_set, loc);
2135 break;
2137 case OPT_gxcoff:
2138 case OPT_gxcoff_:
2139 set_debug_level (XCOFF_DEBUG, code == OPT_gxcoff_, arg, opts, opts_set,
2140 loc);
2141 break;
2143 case OPT_gz:
2144 case OPT_gz_:
2145 /* Handled completely via specs. */
2146 break;
2148 case OPT_pedantic_errors:
2149 dc->pedantic_errors = 1;
2150 control_warning_option (OPT_Wpedantic, DK_ERROR, NULL, value,
2151 loc, lang_mask,
2152 handlers, opts, opts_set,
2153 dc);
2154 break;
2156 case OPT_flto:
2157 opts->x_flag_lto = value ? "" : NULL;
2158 break;
2160 case OPT_w:
2161 dc->dc_inhibit_warnings = true;
2162 break;
2164 case OPT_fmax_errors_:
2165 dc->max_errors = value;
2166 break;
2168 case OPT_fuse_ld_bfd:
2169 case OPT_fuse_ld_gold:
2170 case OPT_fuse_linker_plugin:
2171 /* No-op. Used by the driver and passed to us because it starts with f.*/
2172 break;
2174 case OPT_fwrapv:
2175 if (value)
2176 opts->x_flag_trapv = 0;
2177 break;
2179 case OPT_ftrapv:
2180 if (value)
2181 opts->x_flag_wrapv = 0;
2182 break;
2184 case OPT_fipa_icf:
2185 opts->x_flag_ipa_icf_functions = value;
2186 opts->x_flag_ipa_icf_variables = value;
2187 break;
2189 default:
2190 /* If the flag was handled in a standard way, assume the lack of
2191 processing here is intentional. */
2192 gcc_assert (option_flag_var (scode, opts));
2193 break;
2196 common_handle_option_auto (opts, opts_set, decoded, lang_mask, kind,
2197 loc, handlers, dc);
2198 return true;
2201 /* Handle --param NAME=VALUE. */
2202 static void
2203 handle_param (struct gcc_options *opts, struct gcc_options *opts_set,
2204 location_t loc, const char *carg)
2206 char *equal, *arg;
2207 int value;
2209 arg = xstrdup (carg);
2210 equal = strchr (arg, '=');
2211 if (!equal)
2212 error_at (loc, "%s: --param arguments should be of the form NAME=VALUE",
2213 arg);
2214 else
2216 *equal = '\0';
2218 enum compiler_param index;
2219 if (!find_param (arg, &index))
2220 error_at (loc, "invalid --param name %qs", arg);
2221 else
2223 if (!param_string_value_p (index, equal + 1, &value))
2224 value = integral_argument (equal + 1);
2226 if (value == -1)
2227 error_at (loc, "invalid --param value %qs", equal + 1);
2228 else
2229 set_param_value (arg, value,
2230 opts->x_param_values, opts_set->x_param_values);
2234 free (arg);
2237 /* Used to set the level of strict aliasing warnings in OPTS,
2238 when no level is specified (i.e., when -Wstrict-aliasing, and not
2239 -Wstrict-aliasing=level was given).
2240 ONOFF is assumed to take value 1 when -Wstrict-aliasing is specified,
2241 and 0 otherwise. After calling this function, wstrict_aliasing will be
2242 set to the default value of -Wstrict_aliasing=level, currently 3. */
2243 static void
2244 set_Wstrict_aliasing (struct gcc_options *opts, int onoff)
2246 gcc_assert (onoff == 0 || onoff == 1);
2247 if (onoff != 0)
2248 opts->x_warn_strict_aliasing = 3;
2249 else
2250 opts->x_warn_strict_aliasing = 0;
2253 /* The following routines are useful in setting all the flags that
2254 -ffast-math and -fno-fast-math imply. */
2255 static void
2256 set_fast_math_flags (struct gcc_options *opts, int set)
2258 if (!opts->frontend_set_flag_unsafe_math_optimizations)
2260 opts->x_flag_unsafe_math_optimizations = set;
2261 set_unsafe_math_optimizations_flags (opts, set);
2263 if (!opts->frontend_set_flag_finite_math_only)
2264 opts->x_flag_finite_math_only = set;
2265 if (!opts->frontend_set_flag_errno_math)
2266 opts->x_flag_errno_math = !set;
2267 if (set)
2269 if (!opts->frontend_set_flag_signaling_nans)
2270 opts->x_flag_signaling_nans = 0;
2271 if (!opts->frontend_set_flag_rounding_math)
2272 opts->x_flag_rounding_math = 0;
2273 if (!opts->frontend_set_flag_cx_limited_range)
2274 opts->x_flag_cx_limited_range = 1;
2278 /* When -funsafe-math-optimizations is set the following
2279 flags are set as well. */
2280 static void
2281 set_unsafe_math_optimizations_flags (struct gcc_options *opts, int set)
2283 if (!opts->frontend_set_flag_trapping_math)
2284 opts->x_flag_trapping_math = !set;
2285 if (!opts->frontend_set_flag_signed_zeros)
2286 opts->x_flag_signed_zeros = !set;
2287 if (!opts->frontend_set_flag_associative_math)
2288 opts->x_flag_associative_math = set;
2289 if (!opts->frontend_set_flag_reciprocal_math)
2290 opts->x_flag_reciprocal_math = set;
2293 /* Return true iff flags in OPTS are set as if -ffast-math. */
2294 bool
2295 fast_math_flags_set_p (const struct gcc_options *opts)
2297 return (!opts->x_flag_trapping_math
2298 && opts->x_flag_unsafe_math_optimizations
2299 && opts->x_flag_finite_math_only
2300 && !opts->x_flag_signed_zeros
2301 && !opts->x_flag_errno_math);
2304 /* Return true iff flags are set as if -ffast-math but using the flags stored
2305 in the struct cl_optimization structure. */
2306 bool
2307 fast_math_flags_struct_set_p (struct cl_optimization *opt)
2309 return (!opt->x_flag_trapping_math
2310 && opt->x_flag_unsafe_math_optimizations
2311 && opt->x_flag_finite_math_only
2312 && !opt->x_flag_signed_zeros
2313 && !opt->x_flag_errno_math);
2316 /* Handle a debug output -g switch for options OPTS
2317 (OPTS_SET->x_write_symbols storing whether a debug type was passed
2318 explicitly), location LOC. EXTENDED is true or false to support
2319 extended output (2 is special and means "-ggdb" was given). */
2320 static void
2321 set_debug_level (enum debug_info_type type, int extended, const char *arg,
2322 struct gcc_options *opts, struct gcc_options *opts_set,
2323 location_t loc)
2325 opts->x_use_gnu_debug_info_extensions = extended;
2327 if (type == NO_DEBUG)
2329 if (opts->x_write_symbols == NO_DEBUG)
2331 opts->x_write_symbols = PREFERRED_DEBUGGING_TYPE;
2333 if (extended == 2)
2335 #if defined DWARF2_DEBUGGING_INFO || defined DWARF2_LINENO_DEBUGGING_INFO
2336 opts->x_write_symbols = DWARF2_DEBUG;
2337 #elif defined DBX_DEBUGGING_INFO
2338 opts->x_write_symbols = DBX_DEBUG;
2339 #endif
2342 if (opts->x_write_symbols == NO_DEBUG)
2343 warning_at (loc, 0, "target system does not support debug output");
2346 else
2348 /* Does it conflict with an already selected type? */
2349 if (opts_set->x_write_symbols != NO_DEBUG
2350 && opts->x_write_symbols != NO_DEBUG
2351 && type != opts->x_write_symbols)
2352 error_at (loc, "debug format %qs conflicts with prior selection",
2353 debug_type_names[type]);
2354 opts->x_write_symbols = type;
2355 opts_set->x_write_symbols = type;
2358 /* A debug flag without a level defaults to level 2.
2359 If off or at level 1, set it to level 2, but if already
2360 at level 3, don't lower it. */
2361 if (*arg == '\0')
2363 if (opts->x_debug_info_level < DINFO_LEVEL_NORMAL)
2364 opts->x_debug_info_level = DINFO_LEVEL_NORMAL;
2366 else
2368 int argval = integral_argument (arg);
2369 if (argval == -1)
2370 error_at (loc, "unrecognised debug output level %qs", arg);
2371 else if (argval > 3)
2372 error_at (loc, "debug output level %qs is too high", arg);
2373 else
2374 opts->x_debug_info_level = (enum debug_info_levels) argval;
2378 /* Arrange to dump core on error for diagnostic context DC. (The
2379 regular error message is still printed first, except in the case of
2380 abort ().) */
2382 static void
2383 setup_core_dumping (diagnostic_context *dc)
2385 #ifdef SIGABRT
2386 signal (SIGABRT, SIG_DFL);
2387 #endif
2388 #if defined(HAVE_SETRLIMIT)
2390 struct rlimit rlim;
2391 if (getrlimit (RLIMIT_CORE, &rlim) != 0)
2392 fatal_error (input_location, "getting core file size maximum limit: %m");
2393 rlim.rlim_cur = rlim.rlim_max;
2394 if (setrlimit (RLIMIT_CORE, &rlim) != 0)
2395 fatal_error (input_location,
2396 "setting core file size limit to maximum: %m");
2398 #endif
2399 diagnostic_abort_on_error (dc);
2402 /* Parse a -d<ARG> command line switch for OPTS, location LOC,
2403 diagnostic context DC. */
2405 static void
2406 decode_d_option (const char *arg, struct gcc_options *opts,
2407 location_t loc, diagnostic_context *dc)
2409 int c;
2411 while (*arg)
2412 switch (c = *arg++)
2414 case 'A':
2415 opts->x_flag_debug_asm = 1;
2416 break;
2417 case 'p':
2418 opts->x_flag_print_asm_name = 1;
2419 break;
2420 case 'P':
2421 opts->x_flag_dump_rtl_in_asm = 1;
2422 opts->x_flag_print_asm_name = 1;
2423 break;
2424 case 'x':
2425 opts->x_rtl_dump_and_exit = 1;
2426 break;
2427 case 'D': /* These are handled by the preprocessor. */
2428 case 'I':
2429 case 'M':
2430 case 'N':
2431 case 'U':
2432 break;
2433 case 'H':
2434 setup_core_dumping (dc);
2435 break;
2436 case 'a':
2437 opts->x_flag_dump_all_passed = true;
2438 break;
2440 default:
2441 warning_at (loc, 0, "unrecognized gcc debugging option: %c", c);
2442 break;
2446 /* Enable (or disable if VALUE is 0) a warning option ARG (language
2447 mask LANG_MASK, option handlers HANDLERS) as an error for option
2448 structures OPTS and OPTS_SET, diagnostic context DC (possibly
2449 NULL), location LOC. This is used by -Werror=. */
2451 static void
2452 enable_warning_as_error (const char *arg, int value, unsigned int lang_mask,
2453 const struct cl_option_handlers *handlers,
2454 struct gcc_options *opts,
2455 struct gcc_options *opts_set,
2456 location_t loc, diagnostic_context *dc)
2458 char *new_option;
2459 int option_index;
2461 new_option = XNEWVEC (char, strlen (arg) + 2);
2462 new_option[0] = 'W';
2463 strcpy (new_option + 1, arg);
2464 option_index = find_opt (new_option, lang_mask);
2465 if (option_index == OPT_SPECIAL_unknown)
2466 error_at (loc, "-Werror=%s: no option -%s", arg, new_option);
2467 else if (!(cl_options[option_index].flags & CL_WARNING))
2468 error_at (loc, "-Werror=%s: -%s is not an option that controls warnings",
2469 arg, new_option);
2470 else
2472 const diagnostic_t kind = value ? DK_ERROR : DK_WARNING;
2473 const char *arg = NULL;
2475 if (cl_options[option_index].flags & CL_JOINED)
2476 arg = new_option + cl_options[option_index].opt_len;
2477 control_warning_option (option_index, (int) kind, arg, value,
2478 loc, lang_mask,
2479 handlers, opts, opts_set, dc);
2481 free (new_option);
2484 /* Return malloced memory for the name of the option OPTION_INDEX
2485 which enabled a diagnostic (context CONTEXT), originally of type
2486 ORIG_DIAG_KIND but possibly converted to DIAG_KIND by options such
2487 as -Werror. */
2489 char *
2490 option_name (diagnostic_context *context, int option_index,
2491 diagnostic_t orig_diag_kind, diagnostic_t diag_kind)
2493 if (option_index)
2495 /* A warning classified as an error. */
2496 if ((orig_diag_kind == DK_WARNING || orig_diag_kind == DK_PEDWARN)
2497 && diag_kind == DK_ERROR)
2498 return concat (cl_options[OPT_Werror_].opt_text,
2499 /* Skip over "-W". */
2500 cl_options[option_index].opt_text + 2,
2501 NULL);
2502 /* A warning with option. */
2503 else
2504 return xstrdup (cl_options[option_index].opt_text);
2506 /* A warning without option classified as an error. */
2507 else if ((orig_diag_kind == DK_WARNING || orig_diag_kind == DK_PEDWARN
2508 || diag_kind == DK_WARNING)
2509 && context->warning_as_error_requested)
2510 return xstrdup (cl_options[OPT_Werror].opt_text);
2511 else
2512 return NULL;