Merge the ./config directory between GCC and Binutils
[official-gcc.git] / gcc / opts.c
blob3a0ed61e59372414fe32c74634693f117151ddde
1 /* Command line option handling.
2 Copyright (C) 2002-2014 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 "options.h"
27 #include "tm.h" /* For STACK_CHECK_BUILTIN,
28 STACK_CHECK_STATIC_BUILTIN, DEFAULT_GDB_EXTENSIONS,
29 DWARF2_DEBUGGING_INFO and DBX_DEBUGGING_INFO. */
30 #include "flags.h"
31 #include "params.h"
32 #include "diagnostic.h"
33 #include "diagnostic-color.h"
34 #include "opts-diagnostic.h"
35 #include "insn-attr-common.h"
36 #include "common/common-target.h"
38 static void set_Wstrict_aliasing (struct gcc_options *opts, int onoff);
40 /* Indexed by enum debug_info_type. */
41 const char *const debug_type_names[] =
43 "none", "stabs", "coff", "dwarf-2", "xcoff", "vms"
46 /* Parse the -femit-struct-debug-detailed option value
47 and set the flag variables. */
49 #define MATCH( prefix, string ) \
50 ((strncmp (prefix, string, sizeof prefix - 1) == 0) \
51 ? ((string += sizeof prefix - 1), 1) : 0)
53 void
54 set_struct_debug_option (struct gcc_options *opts, location_t loc,
55 const char *spec)
57 /* various labels for comparison */
58 static const char dfn_lbl[] = "dfn:", dir_lbl[] = "dir:", ind_lbl[] = "ind:";
59 static const char ord_lbl[] = "ord:", gen_lbl[] = "gen:";
60 static const char none_lbl[] = "none", any_lbl[] = "any";
61 static const char base_lbl[] = "base", sys_lbl[] = "sys";
63 enum debug_struct_file files = DINFO_STRUCT_FILE_ANY;
64 /* Default is to apply to as much as possible. */
65 enum debug_info_usage usage = DINFO_USAGE_NUM_ENUMS;
66 int ord = 1, gen = 1;
68 /* What usage? */
69 if (MATCH (dfn_lbl, spec))
70 usage = DINFO_USAGE_DFN;
71 else if (MATCH (dir_lbl, spec))
72 usage = DINFO_USAGE_DIR_USE;
73 else if (MATCH (ind_lbl, spec))
74 usage = DINFO_USAGE_IND_USE;
76 /* Generics or not? */
77 if (MATCH (ord_lbl, spec))
78 gen = 0;
79 else if (MATCH (gen_lbl, spec))
80 ord = 0;
82 /* What allowable environment? */
83 if (MATCH (none_lbl, spec))
84 files = DINFO_STRUCT_FILE_NONE;
85 else if (MATCH (any_lbl, spec))
86 files = DINFO_STRUCT_FILE_ANY;
87 else if (MATCH (sys_lbl, spec))
88 files = DINFO_STRUCT_FILE_SYS;
89 else if (MATCH (base_lbl, spec))
90 files = DINFO_STRUCT_FILE_BASE;
91 else
92 error_at (loc,
93 "argument %qs to %<-femit-struct-debug-detailed%> "
94 "not recognized",
95 spec);
97 /* Effect the specification. */
98 if (usage == DINFO_USAGE_NUM_ENUMS)
100 if (ord)
102 opts->x_debug_struct_ordinary[DINFO_USAGE_DFN] = files;
103 opts->x_debug_struct_ordinary[DINFO_USAGE_DIR_USE] = files;
104 opts->x_debug_struct_ordinary[DINFO_USAGE_IND_USE] = files;
106 if (gen)
108 opts->x_debug_struct_generic[DINFO_USAGE_DFN] = files;
109 opts->x_debug_struct_generic[DINFO_USAGE_DIR_USE] = files;
110 opts->x_debug_struct_generic[DINFO_USAGE_IND_USE] = files;
113 else
115 if (ord)
116 opts->x_debug_struct_ordinary[usage] = files;
117 if (gen)
118 opts->x_debug_struct_generic[usage] = files;
121 if (*spec == ',')
122 set_struct_debug_option (opts, loc, spec+1);
123 else
125 /* No more -femit-struct-debug-detailed specifications.
126 Do final checks. */
127 if (*spec != '\0')
128 error_at (loc,
129 "argument %qs to %<-femit-struct-debug-detailed%> unknown",
130 spec);
131 if (opts->x_debug_struct_ordinary[DINFO_USAGE_DIR_USE]
132 < opts->x_debug_struct_ordinary[DINFO_USAGE_IND_USE]
133 || opts->x_debug_struct_generic[DINFO_USAGE_DIR_USE]
134 < opts->x_debug_struct_generic[DINFO_USAGE_IND_USE])
135 error_at (loc,
136 "%<-femit-struct-debug-detailed=dir:...%> must allow "
137 "at least as much as "
138 "%<-femit-struct-debug-detailed=ind:...%>");
142 /* Strip off a legitimate source ending from the input string NAME of
143 length LEN. Rather than having to know the names used by all of
144 our front ends, we strip off an ending of a period followed by
145 up to five characters. (Java uses ".class".) */
147 void
148 strip_off_ending (char *name, int len)
150 int i;
151 for (i = 2; i < 6 && len > i; i++)
153 if (name[len - i] == '.')
155 name[len - i] = '\0';
156 break;
161 /* Find the base name of a path, stripping off both directories and
162 a single final extension. */
164 base_of_path (const char *path, const char **base_out)
166 const char *base = path;
167 const char *dot = 0;
168 const char *p = path;
169 char c = *p;
170 while (c)
172 if (IS_DIR_SEPARATOR (c))
174 base = p + 1;
175 dot = 0;
177 else if (c == '.')
178 dot = p;
179 c = *++p;
181 if (!dot)
182 dot = p;
183 *base_out = base;
184 return dot - base;
187 /* What to print when a switch has no documentation. */
188 static const char undocumented_msg[] = N_("This switch lacks documentation");
190 typedef char *char_p; /* For DEF_VEC_P. */
192 static void handle_param (struct gcc_options *opts,
193 struct gcc_options *opts_set, location_t loc,
194 const char *carg);
195 static void set_debug_level (enum debug_info_type type, int extended,
196 const char *arg, struct gcc_options *opts,
197 struct gcc_options *opts_set,
198 location_t loc);
199 static void set_fast_math_flags (struct gcc_options *opts, int set);
200 static void decode_d_option (const char *arg, struct gcc_options *opts,
201 location_t loc, diagnostic_context *dc);
202 static void set_unsafe_math_optimizations_flags (struct gcc_options *opts,
203 int set);
204 static void enable_warning_as_error (const char *arg, int value,
205 unsigned int lang_mask,
206 const struct cl_option_handlers *handlers,
207 struct gcc_options *opts,
208 struct gcc_options *opts_set,
209 location_t loc,
210 diagnostic_context *dc);
212 /* Handle a back-end option; arguments and return value as for
213 handle_option. */
215 bool
216 target_handle_option (struct gcc_options *opts,
217 struct gcc_options *opts_set,
218 const struct cl_decoded_option *decoded,
219 unsigned int lang_mask ATTRIBUTE_UNUSED, int kind,
220 location_t loc,
221 const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED,
222 diagnostic_context *dc)
224 gcc_assert (dc == global_dc);
225 gcc_assert (kind == DK_UNSPECIFIED);
226 return targetm_common.handle_option (opts, opts_set, decoded, loc);
229 /* Add comma-separated strings to a char_p vector. */
231 static void
232 add_comma_separated_to_vector (void **pvec, const char *arg)
234 char *tmp;
235 char *r;
236 char *w;
237 char *token_start;
238 vec<char_p> *v = (vec<char_p> *) *pvec;
240 vec_check_alloc (v, 1);
242 /* We never free this string. */
243 tmp = xstrdup (arg);
245 r = tmp;
246 w = tmp;
247 token_start = tmp;
249 while (*r != '\0')
251 if (*r == ',')
253 *w++ = '\0';
254 ++r;
255 v->safe_push (token_start);
256 token_start = w;
258 if (*r == '\\' && r[1] == ',')
260 *w++ = ',';
261 r += 2;
263 else
264 *w++ = *r++;
266 if (*token_start != '\0')
267 v->safe_push (token_start);
269 *pvec = v;
272 /* Initialize OPTS and OPTS_SET before using them in parsing options. */
274 void
275 init_options_struct (struct gcc_options *opts, struct gcc_options *opts_set)
277 size_t num_params = get_num_compiler_params ();
279 gcc_obstack_init (&opts_obstack);
281 *opts = global_options_init;
283 if (opts_set)
284 memset (opts_set, 0, sizeof (*opts_set));
286 opts->x_param_values = XNEWVEC (int, num_params);
288 if (opts_set)
289 opts_set->x_param_values = XCNEWVEC (int, num_params);
291 init_param_values (opts->x_param_values);
293 /* Initialize whether `char' is signed. */
294 opts->x_flag_signed_char = DEFAULT_SIGNED_CHAR;
295 /* Set this to a special "uninitialized" value. The actual default
296 is set after target options have been processed. */
297 opts->x_flag_short_enums = 2;
299 /* Initialize target_flags before default_options_optimization
300 so the latter can modify it. */
301 opts->x_target_flags = targetm_common.default_target_flags;
303 /* Some targets have ABI-specified unwind tables. */
304 opts->x_flag_unwind_tables = targetm_common.unwind_tables_default;
306 /* Some targets have other target-specific initialization. */
307 targetm_common.option_init_struct (opts);
310 /* Release any allocations owned by OPTS. */
312 void
313 finalize_options_struct (struct gcc_options *opts)
315 XDELETEVEC (opts->x_param_values);
318 /* If indicated by the optimization level LEVEL (-Os if SIZE is set,
319 -Ofast if FAST is set, -Og if DEBUG is set), apply the option DEFAULT_OPT
320 to OPTS and OPTS_SET, diagnostic context DC, location LOC, with language
321 mask LANG_MASK and option handlers HANDLERS. */
323 static void
324 maybe_default_option (struct gcc_options *opts,
325 struct gcc_options *opts_set,
326 const struct default_options *default_opt,
327 int level, bool size, bool fast, bool debug,
328 unsigned int lang_mask,
329 const struct cl_option_handlers *handlers,
330 location_t loc,
331 diagnostic_context *dc)
333 const struct cl_option *option = &cl_options[default_opt->opt_index];
334 bool enabled;
336 if (size)
337 gcc_assert (level == 2);
338 if (fast)
339 gcc_assert (level == 3);
340 if (debug)
341 gcc_assert (level == 1);
343 switch (default_opt->levels)
345 case OPT_LEVELS_ALL:
346 enabled = true;
347 break;
349 case OPT_LEVELS_0_ONLY:
350 enabled = (level == 0);
351 break;
353 case OPT_LEVELS_1_PLUS:
354 enabled = (level >= 1);
355 break;
357 case OPT_LEVELS_1_PLUS_SPEED_ONLY:
358 enabled = (level >= 1 && !size && !debug);
359 break;
361 case OPT_LEVELS_1_PLUS_NOT_DEBUG:
362 enabled = (level >= 1 && !debug);
363 break;
365 case OPT_LEVELS_2_PLUS:
366 enabled = (level >= 2);
367 break;
369 case OPT_LEVELS_2_PLUS_SPEED_ONLY:
370 enabled = (level >= 2 && !size && !debug);
371 break;
373 case OPT_LEVELS_3_PLUS:
374 enabled = (level >= 3);
375 break;
377 case OPT_LEVELS_3_PLUS_AND_SIZE:
378 enabled = (level >= 3 || size);
379 break;
381 case OPT_LEVELS_SIZE:
382 enabled = size;
383 break;
385 case OPT_LEVELS_FAST:
386 enabled = fast;
387 break;
389 case OPT_LEVELS_NONE:
390 default:
391 gcc_unreachable ();
394 if (enabled)
395 handle_generated_option (opts, opts_set, default_opt->opt_index,
396 default_opt->arg, default_opt->value,
397 lang_mask, DK_UNSPECIFIED, loc,
398 handlers, dc);
399 else if (default_opt->arg == NULL
400 && !option->cl_reject_negative)
401 handle_generated_option (opts, opts_set, default_opt->opt_index,
402 default_opt->arg, !default_opt->value,
403 lang_mask, DK_UNSPECIFIED, loc,
404 handlers, dc);
407 /* As indicated by the optimization level LEVEL (-Os if SIZE is set,
408 -Ofast if FAST is set), apply the options in array DEFAULT_OPTS to
409 OPTS and OPTS_SET, diagnostic context DC, location LOC, with
410 language mask LANG_MASK and option handlers HANDLERS. */
412 static void
413 maybe_default_options (struct gcc_options *opts,
414 struct gcc_options *opts_set,
415 const struct default_options *default_opts,
416 int level, bool size, bool fast, bool debug,
417 unsigned int lang_mask,
418 const struct cl_option_handlers *handlers,
419 location_t loc,
420 diagnostic_context *dc)
422 size_t i;
424 for (i = 0; default_opts[i].levels != OPT_LEVELS_NONE; i++)
425 maybe_default_option (opts, opts_set, &default_opts[i],
426 level, size, fast, debug,
427 lang_mask, handlers, loc, dc);
430 /* Table of options enabled by default at different levels. */
432 static const struct default_options default_options_table[] =
434 /* -O1 optimizations. */
435 { OPT_LEVELS_1_PLUS, OPT_fdefer_pop, NULL, 1 },
436 #ifdef DELAY_SLOTS
437 { OPT_LEVELS_1_PLUS, OPT_fdelayed_branch, NULL, 1 },
438 #endif
439 { OPT_LEVELS_1_PLUS, OPT_fguess_branch_probability, NULL, 1 },
440 { OPT_LEVELS_1_PLUS, OPT_fcprop_registers, NULL, 1 },
441 { OPT_LEVELS_1_PLUS, OPT_fforward_propagate, NULL, 1 },
442 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fif_conversion, NULL, 1 },
443 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fif_conversion2, NULL, 1 },
444 { OPT_LEVELS_1_PLUS, OPT_fipa_pure_const, NULL, 1 },
445 { OPT_LEVELS_1_PLUS, OPT_fipa_reference, NULL, 1 },
446 { OPT_LEVELS_1_PLUS, OPT_fipa_profile, NULL, 1 },
447 { OPT_LEVELS_1_PLUS, OPT_fmerge_constants, NULL, 1 },
448 { OPT_LEVELS_1_PLUS, OPT_fshrink_wrap, NULL, 1 },
449 { OPT_LEVELS_1_PLUS, OPT_fsplit_wide_types, NULL, 1 },
450 { OPT_LEVELS_1_PLUS, OPT_ftree_ccp, NULL, 1 },
451 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_bit_ccp, NULL, 1 },
452 { OPT_LEVELS_1_PLUS, OPT_ftree_dce, NULL, 1 },
453 { OPT_LEVELS_1_PLUS, OPT_ftree_dominator_opts, NULL, 1 },
454 { OPT_LEVELS_1_PLUS, OPT_ftree_dse, NULL, 1 },
455 { OPT_LEVELS_1_PLUS, OPT_ftree_ter, NULL, 1 },
456 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_sra, NULL, 1 },
457 { OPT_LEVELS_1_PLUS, OPT_ftree_copyrename, NULL, 1 },
458 { OPT_LEVELS_1_PLUS, OPT_ftree_fre, NULL, 1 },
459 { OPT_LEVELS_1_PLUS, OPT_ftree_copy_prop, NULL, 1 },
460 { OPT_LEVELS_1_PLUS, OPT_ftree_sink, NULL, 1 },
461 { OPT_LEVELS_1_PLUS, OPT_ftree_ch, NULL, 1 },
462 { OPT_LEVELS_1_PLUS, OPT_fcombine_stack_adjustments, NULL, 1 },
463 { OPT_LEVELS_1_PLUS, OPT_fcompare_elim, NULL, 1 },
464 { OPT_LEVELS_1_PLUS, OPT_ftree_slsr, NULL, 1 },
465 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fbranch_count_reg, NULL, 1 },
466 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fmove_loop_invariants, NULL, 1 },
467 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_pta, NULL, 1 },
468 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fssa_phiopt, NULL, 1 },
470 /* -O2 optimizations. */
471 { OPT_LEVELS_2_PLUS, OPT_finline_small_functions, NULL, 1 },
472 { OPT_LEVELS_2_PLUS, OPT_findirect_inlining, NULL, 1 },
473 { OPT_LEVELS_2_PLUS, OPT_fpartial_inlining, NULL, 1 },
474 { OPT_LEVELS_2_PLUS, OPT_fthread_jumps, NULL, 1 },
475 { OPT_LEVELS_2_PLUS, OPT_fcrossjumping, NULL, 1 },
476 { OPT_LEVELS_2_PLUS, OPT_foptimize_sibling_calls, NULL, 1 },
477 { OPT_LEVELS_2_PLUS, OPT_fcse_follow_jumps, NULL, 1 },
478 { OPT_LEVELS_2_PLUS, OPT_fgcse, NULL, 1 },
479 { OPT_LEVELS_2_PLUS, OPT_fexpensive_optimizations, NULL, 1 },
480 { OPT_LEVELS_2_PLUS, OPT_frerun_cse_after_loop, NULL, 1 },
481 { OPT_LEVELS_2_PLUS, OPT_fcaller_saves, NULL, 1 },
482 { OPT_LEVELS_2_PLUS, OPT_fpeephole2, NULL, 1 },
483 #ifdef INSN_SCHEDULING
484 /* Only run the pre-regalloc scheduling pass if optimizing for speed. */
485 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_fschedule_insns, NULL, 1 },
486 { OPT_LEVELS_2_PLUS, OPT_fschedule_insns2, NULL, 1 },
487 #endif
488 { OPT_LEVELS_2_PLUS, OPT_fstrict_aliasing, NULL, 1 },
489 { OPT_LEVELS_2_PLUS, OPT_fstrict_overflow, NULL, 1 },
490 { OPT_LEVELS_2_PLUS, OPT_freorder_blocks, NULL, 1 },
491 { OPT_LEVELS_2_PLUS, OPT_freorder_functions, NULL, 1 },
492 { OPT_LEVELS_2_PLUS, OPT_ftree_vrp, NULL, 1 },
493 { OPT_LEVELS_2_PLUS, OPT_ftree_builtin_call_dce, NULL, 1 },
494 { OPT_LEVELS_2_PLUS, OPT_ftree_pre, NULL, 1 },
495 { OPT_LEVELS_2_PLUS, OPT_ftree_switch_conversion, NULL, 1 },
496 { OPT_LEVELS_2_PLUS, OPT_fipa_cp, NULL, 1 },
497 { OPT_LEVELS_2_PLUS, OPT_fdevirtualize, NULL, 1 },
498 { OPT_LEVELS_2_PLUS, OPT_fdevirtualize_speculatively, NULL, 1 },
499 { OPT_LEVELS_2_PLUS, OPT_fipa_sra, NULL, 1 },
500 { OPT_LEVELS_2_PLUS, OPT_falign_loops, NULL, 1 },
501 { OPT_LEVELS_2_PLUS, OPT_falign_jumps, NULL, 1 },
502 { OPT_LEVELS_2_PLUS, OPT_falign_labels, NULL, 1 },
503 { OPT_LEVELS_2_PLUS, OPT_falign_functions, NULL, 1 },
504 { OPT_LEVELS_2_PLUS, OPT_ftree_tail_merge, NULL, 1 },
505 { OPT_LEVELS_2_PLUS, OPT_fvect_cost_model_, NULL, VECT_COST_MODEL_CHEAP },
506 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_foptimize_strlen, NULL, 1 },
507 { OPT_LEVELS_2_PLUS, OPT_fhoist_adjacent_loads, NULL, 1 },
508 { OPT_LEVELS_2_PLUS, OPT_fipa_icf, NULL, 1 },
509 { OPT_LEVELS_2_PLUS, OPT_fisolate_erroneous_paths_dereference, NULL, 1 },
510 { OPT_LEVELS_2_PLUS, OPT_fuse_caller_save, NULL, 1 },
511 { OPT_LEVELS_2_PLUS, OPT_flra_remat, NULL, 1 },
513 /* -O3 optimizations. */
514 { OPT_LEVELS_3_PLUS, OPT_ftree_loop_distribute_patterns, NULL, 1 },
515 { OPT_LEVELS_3_PLUS, OPT_fpredictive_commoning, NULL, 1 },
516 /* Inlining of functions reducing size is a good idea with -Os
517 regardless of them being declared inline. */
518 { OPT_LEVELS_3_PLUS_AND_SIZE, OPT_finline_functions, NULL, 1 },
519 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_finline_functions_called_once, NULL, 1 },
520 { OPT_LEVELS_3_PLUS, OPT_funswitch_loops, NULL, 1 },
521 { OPT_LEVELS_3_PLUS, OPT_fgcse_after_reload, NULL, 1 },
522 { OPT_LEVELS_3_PLUS, OPT_ftree_loop_vectorize, NULL, 1 },
523 { OPT_LEVELS_3_PLUS, OPT_ftree_slp_vectorize, NULL, 1 },
524 { OPT_LEVELS_3_PLUS, OPT_fvect_cost_model_, NULL, VECT_COST_MODEL_DYNAMIC },
525 { OPT_LEVELS_3_PLUS, OPT_fipa_cp_clone, NULL, 1 },
526 { OPT_LEVELS_3_PLUS, OPT_ftree_partial_pre, NULL, 1 },
528 /* -Ofast adds optimizations to -O3. */
529 { OPT_LEVELS_FAST, OPT_ffast_math, NULL, 1 },
531 { OPT_LEVELS_NONE, 0, NULL, 0 }
534 /* Default the options in OPTS and OPTS_SET based on the optimization
535 settings in DECODED_OPTIONS and DECODED_OPTIONS_COUNT. */
536 void
537 default_options_optimization (struct gcc_options *opts,
538 struct gcc_options *opts_set,
539 struct cl_decoded_option *decoded_options,
540 unsigned int decoded_options_count,
541 location_t loc,
542 unsigned int lang_mask,
543 const struct cl_option_handlers *handlers,
544 diagnostic_context *dc)
546 unsigned int i;
547 int opt2;
549 /* Scan to see what optimization level has been specified. That will
550 determine the default value of many flags. */
551 for (i = 1; i < decoded_options_count; i++)
553 struct cl_decoded_option *opt = &decoded_options[i];
554 switch (opt->opt_index)
556 case OPT_O:
557 if (*opt->arg == '\0')
559 opts->x_optimize = 1;
560 opts->x_optimize_size = 0;
561 opts->x_optimize_fast = 0;
562 opts->x_optimize_debug = 0;
564 else
566 const int optimize_val = integral_argument (opt->arg);
567 if (optimize_val == -1)
568 error_at (loc, "argument to %<-O%> should be a non-negative "
569 "integer, %<g%>, %<s%> or %<fast%>");
570 else
572 opts->x_optimize = optimize_val;
573 if ((unsigned int) opts->x_optimize > 255)
574 opts->x_optimize = 255;
575 opts->x_optimize_size = 0;
576 opts->x_optimize_fast = 0;
577 opts->x_optimize_debug = 0;
580 break;
582 case OPT_Os:
583 opts->x_optimize_size = 1;
585 /* Optimizing for size forces optimize to be 2. */
586 opts->x_optimize = 2;
587 opts->x_optimize_fast = 0;
588 opts->x_optimize_debug = 0;
589 break;
591 case OPT_Ofast:
592 /* -Ofast only adds flags to -O3. */
593 opts->x_optimize_size = 0;
594 opts->x_optimize = 3;
595 opts->x_optimize_fast = 1;
596 opts->x_optimize_debug = 0;
597 break;
599 case OPT_Og:
600 /* -Og selects optimization level 1. */
601 opts->x_optimize_size = 0;
602 opts->x_optimize = 1;
603 opts->x_optimize_fast = 0;
604 opts->x_optimize_debug = 1;
605 break;
607 default:
608 /* Ignore other options in this prescan. */
609 break;
613 maybe_default_options (opts, opts_set, default_options_table,
614 opts->x_optimize, opts->x_optimize_size,
615 opts->x_optimize_fast, opts->x_optimize_debug,
616 lang_mask, handlers, loc, dc);
618 /* -O2 param settings. */
619 opt2 = (opts->x_optimize >= 2);
621 /* Track fields in field-sensitive alias analysis. */
622 maybe_set_param_value
623 (PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE,
624 opt2 ? 100 : default_param_value (PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE),
625 opts->x_param_values, opts_set->x_param_values);
627 /* For -O1 only do loop invariant motion for very small loops. */
628 maybe_set_param_value
629 (PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP,
630 opt2 ? default_param_value (PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP) : 1000,
631 opts->x_param_values, opts_set->x_param_values);
633 /* At -Ofast, allow store motion to introduce potential race conditions. */
634 maybe_set_param_value
635 (PARAM_ALLOW_STORE_DATA_RACES,
636 opts->x_optimize_fast ? 1
637 : default_param_value (PARAM_ALLOW_STORE_DATA_RACES),
638 opts->x_param_values, opts_set->x_param_values);
640 if (opts->x_optimize_size)
641 /* We want to crossjump as much as possible. */
642 maybe_set_param_value (PARAM_MIN_CROSSJUMP_INSNS, 1,
643 opts->x_param_values, opts_set->x_param_values);
644 else
645 maybe_set_param_value (PARAM_MIN_CROSSJUMP_INSNS,
646 default_param_value (PARAM_MIN_CROSSJUMP_INSNS),
647 opts->x_param_values, opts_set->x_param_values);
649 /* Restrict the amount of work combine does at -Og while retaining
650 most of its useful transforms. */
651 if (opts->x_optimize_debug)
652 maybe_set_param_value (PARAM_MAX_COMBINE_INSNS, 2,
653 opts->x_param_values, opts_set->x_param_values);
655 /* Allow default optimizations to be specified on a per-machine basis. */
656 maybe_default_options (opts, opts_set,
657 targetm_common.option_optimization_table,
658 opts->x_optimize, opts->x_optimize_size,
659 opts->x_optimize_fast, opts->x_optimize_debug,
660 lang_mask, handlers, loc, dc);
663 /* After all options at LOC have been read into OPTS and OPTS_SET,
664 finalize settings of those options and diagnose incompatible
665 combinations. */
666 void
667 finish_options (struct gcc_options *opts, struct gcc_options *opts_set,
668 location_t loc)
670 enum unwind_info_type ui_except;
672 if (opts->x_dump_base_name
673 && ! IS_ABSOLUTE_PATH (opts->x_dump_base_name)
674 && ! opts->x_dump_base_name_prefixed)
676 /* First try to make OPTS->X_DUMP_BASE_NAME relative to the
677 OPTS->X_DUMP_DIR_NAME directory. Then try to make
678 OPTS->X_DUMP_BASE_NAME relative to the OPTS->X_AUX_BASE_NAME
679 directory, typically the directory to contain the object
680 file. */
681 if (opts->x_dump_dir_name)
682 opts->x_dump_base_name = opts_concat (opts->x_dump_dir_name,
683 opts->x_dump_base_name, NULL);
684 else if (opts->x_aux_base_name
685 && strcmp (opts->x_aux_base_name, HOST_BIT_BUCKET) != 0)
687 const char *aux_base;
689 base_of_path (opts->x_aux_base_name, &aux_base);
690 if (opts->x_aux_base_name != aux_base)
692 int dir_len = aux_base - opts->x_aux_base_name;
693 char *new_dump_base_name
694 = XOBNEWVEC (&opts_obstack, char,
695 strlen (opts->x_dump_base_name) + dir_len + 1);
697 /* Copy directory component from OPTS->X_AUX_BASE_NAME. */
698 memcpy (new_dump_base_name, opts->x_aux_base_name, dir_len);
699 /* Append existing OPTS->X_DUMP_BASE_NAME. */
700 strcpy (new_dump_base_name + dir_len, opts->x_dump_base_name);
701 opts->x_dump_base_name = new_dump_base_name;
704 opts->x_dump_base_name_prefixed = true;
707 /* Handle related options for unit-at-a-time, toplevel-reorder, and
708 section-anchors. */
709 if (!opts->x_flag_unit_at_a_time)
711 if (opts->x_flag_section_anchors && opts_set->x_flag_section_anchors)
712 error_at (loc, "section anchors must be disabled when unit-at-a-time "
713 "is disabled");
714 opts->x_flag_section_anchors = 0;
715 if (opts->x_flag_toplevel_reorder == 1)
716 error_at (loc, "toplevel reorder must be disabled when unit-at-a-time "
717 "is disabled");
718 opts->x_flag_toplevel_reorder = 0;
721 if (opts->x_flag_tm && opts->x_flag_non_call_exceptions)
722 sorry ("transactional memory is not supported with non-call exceptions");
724 /* Unless the user has asked for section anchors, we disable toplevel
725 reordering at -O0 to disable transformations that might be surprising
726 to end users and to get -fno-toplevel-reorder tested. */
727 if (!opts->x_optimize
728 && opts->x_flag_toplevel_reorder == 2
729 && !(opts->x_flag_section_anchors && opts_set->x_flag_section_anchors))
731 opts->x_flag_toplevel_reorder = 0;
732 opts->x_flag_section_anchors = 0;
734 if (!opts->x_flag_toplevel_reorder)
736 if (opts->x_flag_section_anchors && opts_set->x_flag_section_anchors)
737 error_at (loc, "section anchors must be disabled when toplevel reorder"
738 " is disabled");
739 opts->x_flag_section_anchors = 0;
742 if (!opts->x_flag_opts_finished)
744 if (opts->x_flag_pie)
745 opts->x_flag_pic = opts->x_flag_pie;
746 if (opts->x_flag_pic && !opts->x_flag_pie)
747 opts->x_flag_shlib = 1;
748 opts->x_flag_opts_finished = true;
751 if (opts->x_optimize == 0)
753 /* Inlining does not work if not optimizing,
754 so force it not to be done. */
755 opts->x_warn_inline = 0;
756 opts->x_flag_no_inline = 1;
759 /* The optimization to partition hot and cold basic blocks into separate
760 sections of the .o and executable files does not work (currently)
761 with exception handling. This is because there is no support for
762 generating unwind info. If opts->x_flag_exceptions is turned on
763 we need to turn off the partitioning optimization. */
765 ui_except = targetm_common.except_unwind_info (opts);
767 if (opts->x_flag_exceptions
768 && opts->x_flag_reorder_blocks_and_partition
769 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))
771 if (opts_set->x_flag_reorder_blocks_and_partition)
772 inform (loc,
773 "-freorder-blocks-and-partition does not work "
774 "with exceptions on this architecture");
775 opts->x_flag_reorder_blocks_and_partition = 0;
776 opts->x_flag_reorder_blocks = 1;
779 /* If user requested unwind info, then turn off the partitioning
780 optimization. */
782 if (opts->x_flag_unwind_tables
783 && !targetm_common.unwind_tables_default
784 && opts->x_flag_reorder_blocks_and_partition
785 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))
787 if (opts_set->x_flag_reorder_blocks_and_partition)
788 inform (loc,
789 "-freorder-blocks-and-partition does not support "
790 "unwind info on this architecture");
791 opts->x_flag_reorder_blocks_and_partition = 0;
792 opts->x_flag_reorder_blocks = 1;
795 /* If the target requested unwind info, then turn off the partitioning
796 optimization with a different message. Likewise, if the target does not
797 support named sections. */
799 if (opts->x_flag_reorder_blocks_and_partition
800 && (!targetm_common.have_named_sections
801 || (opts->x_flag_unwind_tables
802 && targetm_common.unwind_tables_default
803 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))))
805 if (opts_set->x_flag_reorder_blocks_and_partition)
806 inform (loc,
807 "-freorder-blocks-and-partition does not work "
808 "on this architecture");
809 opts->x_flag_reorder_blocks_and_partition = 0;
810 opts->x_flag_reorder_blocks = 1;
813 if (opts->x_flag_reorder_blocks_and_partition
814 && !opts_set->x_flag_reorder_functions)
815 opts->x_flag_reorder_functions = 1;
817 /* Pipelining of outer loops is only possible when general pipelining
818 capabilities are requested. */
819 if (!opts->x_flag_sel_sched_pipelining)
820 opts->x_flag_sel_sched_pipelining_outer_loops = 0;
822 if (opts->x_flag_conserve_stack)
824 maybe_set_param_value (PARAM_LARGE_STACK_FRAME, 100,
825 opts->x_param_values, opts_set->x_param_values);
826 maybe_set_param_value (PARAM_STACK_FRAME_GROWTH, 40,
827 opts->x_param_values, opts_set->x_param_values);
830 if (opts->x_flag_lto)
832 #ifdef ENABLE_LTO
833 opts->x_flag_generate_lto = 1;
835 /* When generating IL, do not operate in whole-program mode.
836 Otherwise, symbols will be privatized too early, causing link
837 errors later. */
838 opts->x_flag_whole_program = 0;
839 #else
840 error_at (loc, "LTO support has not been enabled in this configuration");
841 #endif
842 if (!opts->x_flag_fat_lto_objects
843 && (!HAVE_LTO_PLUGIN
844 || (opts_set->x_flag_use_linker_plugin
845 && !opts->x_flag_use_linker_plugin)))
847 if (opts_set->x_flag_fat_lto_objects)
848 error_at (loc, "-fno-fat-lto-objects are supported only with linker plugin");
849 opts->x_flag_fat_lto_objects = 1;
853 /* We initialize opts->x_flag_split_stack to -1 so that targets can set a
854 default value if they choose based on other options. */
855 if (opts->x_flag_split_stack == -1)
856 opts->x_flag_split_stack = 0;
857 else if (opts->x_flag_split_stack)
859 if (!targetm_common.supports_split_stack (true, opts))
861 error_at (loc, "%<-fsplit-stack%> is not supported by "
862 "this compiler configuration");
863 opts->x_flag_split_stack = 0;
867 /* Tune vectorization related parametees according to cost model. */
868 if (opts->x_flag_vect_cost_model == VECT_COST_MODEL_CHEAP)
870 maybe_set_param_value (PARAM_VECT_MAX_VERSION_FOR_ALIAS_CHECKS,
871 6, opts->x_param_values, opts_set->x_param_values);
872 maybe_set_param_value (PARAM_VECT_MAX_VERSION_FOR_ALIGNMENT_CHECKS,
873 0, opts->x_param_values, opts_set->x_param_values);
874 maybe_set_param_value (PARAM_VECT_MAX_PEELING_FOR_ALIGNMENT,
875 0, opts->x_param_values, opts_set->x_param_values);
878 /* Set PARAM_MAX_STORES_TO_SINK to 0 if either vectorization or if-conversion
879 is disabled. */
880 if ((!opts->x_flag_tree_loop_vectorize && !opts->x_flag_tree_slp_vectorize)
881 || !opts->x_flag_tree_loop_if_convert)
882 maybe_set_param_value (PARAM_MAX_STORES_TO_SINK, 0,
883 opts->x_param_values, opts_set->x_param_values);
885 /* The -gsplit-dwarf option requires -ggnu-pubnames. */
886 if (opts->x_dwarf_split_debug_info)
887 opts->x_debug_generate_pub_sections = 2;
889 /* Userspace and kernel ASan conflict with each other. */
891 if ((opts->x_flag_sanitize & SANITIZE_USER_ADDRESS)
892 && (opts->x_flag_sanitize & SANITIZE_KERNEL_ADDRESS))
893 error_at (loc,
894 "-fsanitize=address is incompatible with "
895 "-fsanitize=kernel-address");
897 /* And with TSan. */
899 if ((opts->x_flag_sanitize & SANITIZE_ADDRESS)
900 && (opts->x_flag_sanitize & SANITIZE_THREAD))
901 error_at (loc,
902 "-fsanitize=address and -fsanitize=kernel-address "
903 "are incompatible with -fsanitize=thread");
905 /* Error recovery is not allowed for ASan and TSan. */
907 if (opts->x_flag_sanitize_recover & SANITIZE_USER_ADDRESS)
908 error_at (loc, "-fsanitize-recover=address is not supported");
910 if (opts->x_flag_sanitize_recover & SANITIZE_THREAD)
911 error_at (loc, "-fsanitize-recover=thread is not supported");
913 if (opts->x_flag_sanitize_recover & SANITIZE_LEAK)
914 error_at (loc, "-fsanitize-recover=leak is not supported");
916 /* When instrumenting the pointers, we don't want to remove
917 the null pointer checks. */
918 if (opts->x_flag_sanitize & (SANITIZE_NULL | SANITIZE_NONNULL_ATTRIBUTE
919 | SANITIZE_RETURNS_NONNULL_ATTRIBUTE))
920 opts->x_flag_delete_null_pointer_checks = 0;
922 /* Aggressive compiler optimizations may cause false negatives. */
923 if (opts->x_flag_sanitize)
925 opts->x_flag_aggressive_loop_optimizations = 0;
926 opts->x_flag_strict_overflow = 0;
930 #define LEFT_COLUMN 27
932 /* Output ITEM, of length ITEM_WIDTH, in the left column,
933 followed by word-wrapped HELP in a second column. */
934 static void
935 wrap_help (const char *help,
936 const char *item,
937 unsigned int item_width,
938 unsigned int columns)
940 unsigned int col_width = LEFT_COLUMN;
941 unsigned int remaining, room, len;
943 remaining = strlen (help);
947 room = columns - 3 - MAX (col_width, item_width);
948 if (room > columns)
949 room = 0;
950 len = remaining;
952 if (room < len)
954 unsigned int i;
956 for (i = 0; help[i]; i++)
958 if (i >= room && len != remaining)
959 break;
960 if (help[i] == ' ')
961 len = i;
962 else if ((help[i] == '-' || help[i] == '/')
963 && help[i + 1] != ' '
964 && i > 0 && ISALPHA (help[i - 1]))
965 len = i + 1;
969 printf (" %-*.*s %.*s\n", col_width, item_width, item, len, help);
970 item_width = 0;
971 while (help[len] == ' ')
972 len++;
973 help += len;
974 remaining -= len;
976 while (remaining);
979 /* Print help for a specific front-end, etc. */
980 static void
981 print_filtered_help (unsigned int include_flags,
982 unsigned int exclude_flags,
983 unsigned int any_flags,
984 unsigned int columns,
985 struct gcc_options *opts,
986 unsigned int lang_mask)
988 unsigned int i;
989 const char *help;
990 bool found = false;
991 bool displayed = false;
992 char new_help[128];
994 if (include_flags == CL_PARAMS)
996 for (i = 0; i < LAST_PARAM; i++)
998 const char *param = compiler_params[i].option;
1000 help = compiler_params[i].help;
1001 if (help == NULL || *help == '\0')
1003 if (exclude_flags & CL_UNDOCUMENTED)
1004 continue;
1005 help = undocumented_msg;
1008 /* Get the translation. */
1009 help = _(help);
1011 if (!opts->x_quiet_flag)
1013 snprintf (new_help, sizeof (new_help),
1014 _("default %d minimum %d maximum %d"),
1015 compiler_params[i].default_value,
1016 compiler_params[i].min_value,
1017 compiler_params[i].max_value);
1018 help = new_help;
1020 wrap_help (help, param, strlen (param), columns);
1022 putchar ('\n');
1023 return;
1026 if (!opts->x_help_printed)
1027 opts->x_help_printed = XCNEWVAR (char, cl_options_count);
1029 if (!opts->x_help_enum_printed)
1030 opts->x_help_enum_printed = XCNEWVAR (char, cl_enums_count);
1032 for (i = 0; i < cl_options_count; i++)
1034 const struct cl_option *option = cl_options + i;
1035 unsigned int len;
1036 const char *opt;
1037 const char *tab;
1039 if (include_flags == 0
1040 || ((option->flags & include_flags) != include_flags))
1042 if ((option->flags & any_flags) == 0)
1043 continue;
1046 /* Skip unwanted switches. */
1047 if ((option->flags & exclude_flags) != 0)
1048 continue;
1050 /* The driver currently prints its own help text. */
1051 if ((option->flags & CL_DRIVER) != 0
1052 && (option->flags & (((1U << cl_lang_count) - 1)
1053 | CL_COMMON | CL_TARGET)) == 0)
1054 continue;
1056 found = true;
1057 /* Skip switches that have already been printed. */
1058 if (opts->x_help_printed[i])
1059 continue;
1061 opts->x_help_printed[i] = true;
1063 help = option->help;
1064 if (help == NULL)
1066 if (exclude_flags & CL_UNDOCUMENTED)
1067 continue;
1068 help = undocumented_msg;
1071 /* Get the translation. */
1072 help = _(help);
1074 /* Find the gap between the name of the
1075 option and its descriptive text. */
1076 tab = strchr (help, '\t');
1077 if (tab)
1079 len = tab - help;
1080 opt = help;
1081 help = tab + 1;
1083 else
1085 opt = option->opt_text;
1086 len = strlen (opt);
1089 /* With the -Q option enabled we change the descriptive text associated
1090 with an option to be an indication of its current setting. */
1091 if (!opts->x_quiet_flag)
1093 void *flag_var = option_flag_var (i, opts);
1095 if (len < (LEFT_COLUMN + 2))
1096 strcpy (new_help, "\t\t");
1097 else
1098 strcpy (new_help, "\t");
1100 if (flag_var != NULL
1101 && option->var_type != CLVC_DEFER)
1103 if (option->flags & CL_JOINED)
1105 if (option->var_type == CLVC_STRING)
1107 if (* (const char **) flag_var != NULL)
1108 snprintf (new_help + strlen (new_help),
1109 sizeof (new_help) - strlen (new_help),
1110 * (const char **) flag_var);
1112 else if (option->var_type == CLVC_ENUM)
1114 const struct cl_enum *e = &cl_enums[option->var_enum];
1115 int value;
1116 const char *arg = NULL;
1118 value = e->get (flag_var);
1119 enum_value_to_arg (e->values, &arg, value, lang_mask);
1120 if (arg == NULL)
1121 arg = _("[default]");
1122 snprintf (new_help + strlen (new_help),
1123 sizeof (new_help) - strlen (new_help),
1124 arg);
1126 else
1127 sprintf (new_help + strlen (new_help),
1128 "%#x", * (int *) flag_var);
1130 else
1131 strcat (new_help, option_enabled (i, opts)
1132 ? _("[enabled]") : _("[disabled]"));
1135 help = new_help;
1138 wrap_help (help, opt, len, columns);
1139 displayed = true;
1141 if (option->var_type == CLVC_ENUM
1142 && opts->x_help_enum_printed[option->var_enum] != 2)
1143 opts->x_help_enum_printed[option->var_enum] = 1;
1146 if (! found)
1148 unsigned int langs = include_flags & CL_LANG_ALL;
1150 if (langs == 0)
1151 printf (_(" No options with the desired characteristics were found\n"));
1152 else
1154 unsigned int i;
1156 /* PR 31349: Tell the user how to see all of the
1157 options supported by a specific front end. */
1158 for (i = 0; (1U << i) < CL_LANG_ALL; i ++)
1159 if ((1U << i) & langs)
1160 printf (_(" None found. Use --help=%s to show *all* the options supported by the %s front-end\n"),
1161 lang_names[i], lang_names[i]);
1165 else if (! displayed)
1166 printf (_(" All options with the desired characteristics have already been displayed\n"));
1168 putchar ('\n');
1170 /* Print details of enumerated option arguments, if those
1171 enumerations have help text headings provided. If no help text
1172 is provided, presume that the possible values are listed in the
1173 help text for the relevant options. */
1174 for (i = 0; i < cl_enums_count; i++)
1176 unsigned int j, pos;
1178 if (opts->x_help_enum_printed[i] != 1)
1179 continue;
1180 if (cl_enums[i].help == NULL)
1181 continue;
1182 printf (" %s\n ", _(cl_enums[i].help));
1183 pos = 4;
1184 for (j = 0; cl_enums[i].values[j].arg != NULL; j++)
1186 unsigned int len = strlen (cl_enums[i].values[j].arg);
1188 if (pos > 4 && pos + 1 + len <= columns)
1190 printf (" %s", cl_enums[i].values[j].arg);
1191 pos += 1 + len;
1193 else
1195 if (pos > 4)
1197 printf ("\n ");
1198 pos = 4;
1200 printf ("%s", cl_enums[i].values[j].arg);
1201 pos += len;
1204 printf ("\n\n");
1205 opts->x_help_enum_printed[i] = 2;
1209 /* Display help for a specified type of option.
1210 The options must have ALL of the INCLUDE_FLAGS set
1211 ANY of the flags in the ANY_FLAGS set
1212 and NONE of the EXCLUDE_FLAGS set. The current option state is in
1213 OPTS; LANG_MASK is used for interpreting enumerated option state. */
1214 static void
1215 print_specific_help (unsigned int include_flags,
1216 unsigned int exclude_flags,
1217 unsigned int any_flags,
1218 struct gcc_options *opts,
1219 unsigned int lang_mask)
1221 unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1222 const char * description = NULL;
1223 const char * descrip_extra = "";
1224 size_t i;
1225 unsigned int flag;
1227 /* Sanity check: Make sure that we do not have more
1228 languages than we have bits available to enumerate them. */
1229 gcc_assert ((1U << cl_lang_count) <= CL_MIN_OPTION_CLASS);
1231 /* If we have not done so already, obtain
1232 the desired maximum width of the output. */
1233 if (opts->x_help_columns == 0)
1235 const char *p;
1237 p = getenv ("COLUMNS");
1238 if (p != NULL)
1240 int value = atoi (p);
1242 if (value > 0)
1243 opts->x_help_columns = value;
1246 if (opts->x_help_columns == 0)
1247 /* Use a reasonable default. */
1248 opts->x_help_columns = 80;
1251 /* Decide upon the title for the options that we are going to display. */
1252 for (i = 0, flag = 1; flag <= CL_MAX_OPTION_CLASS; flag <<= 1, i ++)
1254 switch (flag & include_flags)
1256 case 0:
1257 case CL_DRIVER:
1258 break;
1260 case CL_TARGET:
1261 description = _("The following options are target specific");
1262 break;
1263 case CL_WARNING:
1264 description = _("The following options control compiler warning messages");
1265 break;
1266 case CL_OPTIMIZATION:
1267 description = _("The following options control optimizations");
1268 break;
1269 case CL_COMMON:
1270 description = _("The following options are language-independent");
1271 break;
1272 case CL_PARAMS:
1273 description = _("The --param option recognizes the following as parameters");
1274 break;
1275 default:
1276 if (i >= cl_lang_count)
1277 break;
1278 if (exclude_flags & all_langs_mask)
1279 description = _("The following options are specific to just the language ");
1280 else
1281 description = _("The following options are supported by the language ");
1282 descrip_extra = lang_names [i];
1283 break;
1287 if (description == NULL)
1289 if (any_flags == 0)
1291 if (include_flags & CL_UNDOCUMENTED)
1292 description = _("The following options are not documented");
1293 else if (include_flags & CL_SEPARATE)
1294 description = _("The following options take separate arguments");
1295 else if (include_flags & CL_JOINED)
1296 description = _("The following options take joined arguments");
1297 else
1299 internal_error ("unrecognized include_flags 0x%x passed to print_specific_help",
1300 include_flags);
1301 return;
1304 else
1306 if (any_flags & all_langs_mask)
1307 description = _("The following options are language-related");
1308 else
1309 description = _("The following options are language-independent");
1313 printf ("%s%s:\n", description, descrip_extra);
1314 print_filtered_help (include_flags, exclude_flags, any_flags,
1315 opts->x_help_columns, opts, lang_mask);
1318 /* Enable FDO-related flags. */
1320 static void
1321 enable_fdo_optimizations (struct gcc_options *opts,
1322 struct gcc_options *opts_set,
1323 int value)
1325 if (!opts_set->x_flag_branch_probabilities)
1326 opts->x_flag_branch_probabilities = value;
1327 if (!opts_set->x_flag_profile_values)
1328 opts->x_flag_profile_values = value;
1329 if (!opts_set->x_flag_unroll_loops)
1330 opts->x_flag_unroll_loops = value;
1331 if (!opts_set->x_flag_peel_loops)
1332 opts->x_flag_peel_loops = value;
1333 if (!opts_set->x_flag_tracer)
1334 opts->x_flag_tracer = value;
1335 if (!opts_set->x_flag_value_profile_transformations)
1336 opts->x_flag_value_profile_transformations = value;
1337 if (!opts_set->x_flag_inline_functions)
1338 opts->x_flag_inline_functions = value;
1339 if (!opts_set->x_flag_ipa_cp)
1340 opts->x_flag_ipa_cp = value;
1341 if (!opts_set->x_flag_ipa_cp_clone
1342 && value && opts->x_flag_ipa_cp)
1343 opts->x_flag_ipa_cp_clone = value;
1344 if (!opts_set->x_flag_predictive_commoning)
1345 opts->x_flag_predictive_commoning = value;
1346 if (!opts_set->x_flag_unswitch_loops)
1347 opts->x_flag_unswitch_loops = value;
1348 if (!opts_set->x_flag_gcse_after_reload)
1349 opts->x_flag_gcse_after_reload = value;
1350 if (!opts_set->x_flag_tree_loop_vectorize
1351 && !opts_set->x_flag_tree_vectorize)
1352 opts->x_flag_tree_loop_vectorize = value;
1353 if (!opts_set->x_flag_tree_slp_vectorize
1354 && !opts_set->x_flag_tree_vectorize)
1355 opts->x_flag_tree_slp_vectorize = value;
1356 if (!opts_set->x_flag_vect_cost_model)
1357 opts->x_flag_vect_cost_model = VECT_COST_MODEL_DYNAMIC;
1358 if (!opts_set->x_flag_tree_loop_distribute_patterns)
1359 opts->x_flag_tree_loop_distribute_patterns = value;
1362 /* Handle target- and language-independent options. Return zero to
1363 generate an "unknown option" message. Only options that need
1364 extra handling need to be listed here; if you simply want
1365 DECODED->value assigned to a variable, it happens automatically. */
1367 bool
1368 common_handle_option (struct gcc_options *opts,
1369 struct gcc_options *opts_set,
1370 const struct cl_decoded_option *decoded,
1371 unsigned int lang_mask, int kind ATTRIBUTE_UNUSED,
1372 location_t loc,
1373 const struct cl_option_handlers *handlers,
1374 diagnostic_context *dc)
1376 size_t scode = decoded->opt_index;
1377 const char *arg = decoded->arg;
1378 int value = decoded->value;
1379 enum opt_code code = (enum opt_code) scode;
1381 gcc_assert (decoded->canonical_option_num_elements <= 2);
1383 switch (code)
1385 case OPT__param:
1386 handle_param (opts, opts_set, loc, arg);
1387 break;
1389 case OPT__help:
1391 unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1392 unsigned int undoc_mask;
1393 unsigned int i;
1395 if (lang_mask == CL_DRIVER)
1396 break;;
1398 undoc_mask = ((opts->x_verbose_flag | opts->x_extra_warnings)
1400 : CL_UNDOCUMENTED);
1401 /* First display any single language specific options. */
1402 for (i = 0; i < cl_lang_count; i++)
1403 print_specific_help
1404 (1U << i, (all_langs_mask & (~ (1U << i))) | undoc_mask, 0, opts,
1405 lang_mask);
1406 /* Next display any multi language specific options. */
1407 print_specific_help (0, undoc_mask, all_langs_mask, opts, lang_mask);
1408 /* Then display any remaining, non-language options. */
1409 for (i = CL_MIN_OPTION_CLASS; i <= CL_MAX_OPTION_CLASS; i <<= 1)
1410 if (i != CL_DRIVER)
1411 print_specific_help (i, undoc_mask, 0, opts, lang_mask);
1412 opts->x_exit_after_options = true;
1413 break;
1416 case OPT__target_help:
1417 if (lang_mask == CL_DRIVER)
1418 break;
1420 print_specific_help (CL_TARGET, CL_UNDOCUMENTED, 0, opts, lang_mask);
1421 opts->x_exit_after_options = true;
1422 break;
1424 case OPT__help_:
1426 const char * a = arg;
1427 unsigned int include_flags = 0;
1428 /* Note - by default we include undocumented options when listing
1429 specific classes. If you only want to see documented options
1430 then add ",^undocumented" to the --help= option. E.g.:
1432 --help=target,^undocumented */
1433 unsigned int exclude_flags = 0;
1435 if (lang_mask == CL_DRIVER)
1436 break;
1438 /* Walk along the argument string, parsing each word in turn.
1439 The format is:
1440 arg = [^]{word}[,{arg}]
1441 word = {optimizers|target|warnings|undocumented|
1442 params|common|<language>} */
1443 while (* a != 0)
1445 static const struct
1447 const char * string;
1448 unsigned int flag;
1450 specifics[] =
1452 { "optimizers", CL_OPTIMIZATION },
1453 { "target", CL_TARGET },
1454 { "warnings", CL_WARNING },
1455 { "undocumented", CL_UNDOCUMENTED },
1456 { "params", CL_PARAMS },
1457 { "joined", CL_JOINED },
1458 { "separate", CL_SEPARATE },
1459 { "common", CL_COMMON },
1460 { NULL, 0 }
1462 unsigned int * pflags;
1463 const char * comma;
1464 unsigned int lang_flag, specific_flag;
1465 unsigned int len;
1466 unsigned int i;
1468 if (* a == '^')
1470 ++ a;
1471 pflags = & exclude_flags;
1473 else
1474 pflags = & include_flags;
1476 comma = strchr (a, ',');
1477 if (comma == NULL)
1478 len = strlen (a);
1479 else
1480 len = comma - a;
1481 if (len == 0)
1483 a = comma + 1;
1484 continue;
1487 /* Check to see if the string matches an option class name. */
1488 for (i = 0, specific_flag = 0; specifics[i].string != NULL; i++)
1489 if (strncasecmp (a, specifics[i].string, len) == 0)
1491 specific_flag = specifics[i].flag;
1492 break;
1495 /* Check to see if the string matches a language name.
1496 Note - we rely upon the alpha-sorted nature of the entries in
1497 the lang_names array, specifically that shorter names appear
1498 before their longer variants. (i.e. C before C++). That way
1499 when we are attempting to match --help=c for example we will
1500 match with C first and not C++. */
1501 for (i = 0, lang_flag = 0; i < cl_lang_count; i++)
1502 if (strncasecmp (a, lang_names[i], len) == 0)
1504 lang_flag = 1U << i;
1505 break;
1508 if (specific_flag != 0)
1510 if (lang_flag == 0)
1511 * pflags |= specific_flag;
1512 else
1514 /* The option's argument matches both the start of a
1515 language name and the start of an option class name.
1516 We have a special case for when the user has
1517 specified "--help=c", but otherwise we have to issue
1518 a warning. */
1519 if (strncasecmp (a, "c", len) == 0)
1520 * pflags |= lang_flag;
1521 else
1522 warning_at (loc, 0,
1523 "--help argument %q.*s is ambiguous, "
1524 "please be more specific",
1525 len, a);
1528 else if (lang_flag != 0)
1529 * pflags |= lang_flag;
1530 else
1531 warning_at (loc, 0,
1532 "unrecognized argument to --help= option: %q.*s",
1533 len, a);
1535 if (comma == NULL)
1536 break;
1537 a = comma + 1;
1540 if (include_flags)
1541 print_specific_help (include_flags, exclude_flags, 0, opts,
1542 lang_mask);
1543 opts->x_exit_after_options = true;
1544 break;
1547 case OPT__version:
1548 if (lang_mask == CL_DRIVER)
1549 break;
1551 opts->x_exit_after_options = true;
1552 break;
1554 case OPT_fsanitize_:
1555 case OPT_fsanitize_recover_:
1557 const char *p = arg;
1558 unsigned int *flag
1559 = code == OPT_fsanitize_ ? &opts->x_flag_sanitize
1560 : &opts->x_flag_sanitize_recover;
1561 while (*p != 0)
1563 static const struct
1565 const char *const name;
1566 unsigned int flag;
1567 size_t len;
1568 } spec[] =
1570 { "address", SANITIZE_ADDRESS | SANITIZE_USER_ADDRESS,
1571 sizeof "address" - 1 },
1572 { "kernel-address", SANITIZE_ADDRESS | SANITIZE_KERNEL_ADDRESS,
1573 sizeof "kernel-address" - 1 },
1574 { "thread", SANITIZE_THREAD, sizeof "thread" - 1 },
1575 { "leak", SANITIZE_LEAK, sizeof "leak" - 1 },
1576 { "shift", SANITIZE_SHIFT, sizeof "shift" - 1 },
1577 { "integer-divide-by-zero", SANITIZE_DIVIDE,
1578 sizeof "integer-divide-by-zero" - 1 },
1579 { "undefined", SANITIZE_UNDEFINED, sizeof "undefined" - 1 },
1580 { "unreachable", SANITIZE_UNREACHABLE,
1581 sizeof "unreachable" - 1 },
1582 { "vla-bound", SANITIZE_VLA, sizeof "vla-bound" - 1 },
1583 { "return", SANITIZE_RETURN, sizeof "return" - 1 },
1584 { "null", SANITIZE_NULL, sizeof "null" - 1 },
1585 { "signed-integer-overflow", SANITIZE_SI_OVERFLOW,
1586 sizeof "signed-integer-overflow" -1 },
1587 { "bool", SANITIZE_BOOL, sizeof "bool" - 1 },
1588 { "enum", SANITIZE_ENUM, sizeof "enum" - 1 },
1589 { "float-divide-by-zero", SANITIZE_FLOAT_DIVIDE,
1590 sizeof "float-divide-by-zero" - 1 },
1591 { "float-cast-overflow", SANITIZE_FLOAT_CAST,
1592 sizeof "float-cast-overflow" - 1 },
1593 { "bounds", SANITIZE_BOUNDS, sizeof "bounds" - 1 },
1594 { "alignment", SANITIZE_ALIGNMENT, sizeof "alignment" - 1 },
1595 { "nonnull-attribute", SANITIZE_NONNULL_ATTRIBUTE,
1596 sizeof "nonnull-attribute" - 1 },
1597 { "returns-nonnull-attribute",
1598 SANITIZE_RETURNS_NONNULL_ATTRIBUTE,
1599 sizeof "returns-nonnull-attribute" - 1 },
1600 { "object-size", SANITIZE_OBJECT_SIZE,
1601 sizeof "object-size" - 1 },
1602 { NULL, 0, 0 }
1604 const char *comma;
1605 size_t len, i;
1606 bool found = false;
1608 comma = strchr (p, ',');
1609 if (comma == NULL)
1610 len = strlen (p);
1611 else
1612 len = comma - p;
1613 if (len == 0)
1615 p = comma + 1;
1616 continue;
1619 /* Check to see if the string matches an option class name. */
1620 for (i = 0; spec[i].name != NULL; ++i)
1621 if (len == spec[i].len
1622 && memcmp (p, spec[i].name, len) == 0)
1624 /* Handle both -fsanitize and -fno-sanitize cases. */
1625 if (value)
1626 *flag |= spec[i].flag;
1627 else
1628 *flag &= ~spec[i].flag;
1629 found = true;
1630 break;
1633 if (! found)
1634 error_at (loc,
1635 "unrecognized argument to -fsanitize%s= option: %q.*s",
1636 code == OPT_fsanitize_ ? "" : "-recover", (int) len, p);
1638 if (comma == NULL)
1639 break;
1640 p = comma + 1;
1643 if (code != OPT_fsanitize_)
1644 break;
1646 /* Kernel ASan implies normal ASan but does not yet support
1647 all features. */
1648 if (opts->x_flag_sanitize & SANITIZE_KERNEL_ADDRESS)
1650 maybe_set_param_value (PARAM_ASAN_INSTRUMENTATION_WITH_CALL_THRESHOLD, 0,
1651 opts->x_param_values,
1652 opts_set->x_param_values);
1653 maybe_set_param_value (PARAM_ASAN_GLOBALS, 0,
1654 opts->x_param_values,
1655 opts_set->x_param_values);
1656 maybe_set_param_value (PARAM_ASAN_STACK, 0,
1657 opts->x_param_values,
1658 opts_set->x_param_values);
1659 maybe_set_param_value (PARAM_ASAN_USE_AFTER_RETURN, 0,
1660 opts->x_param_values,
1661 opts_set->x_param_values);
1664 break;
1667 case OPT_fasan_shadow_offset_:
1668 /* Deferred. */
1669 break;
1671 case OPT_fsanitize_recover:
1672 if (value)
1673 opts->x_flag_sanitize_recover
1674 |= SANITIZE_UNDEFINED | SANITIZE_NONDEFAULT;
1675 else
1676 opts->x_flag_sanitize_recover
1677 &= ~(SANITIZE_UNDEFINED | SANITIZE_NONDEFAULT);
1678 break;
1680 case OPT_O:
1681 case OPT_Os:
1682 case OPT_Ofast:
1683 case OPT_Og:
1684 /* Currently handled in a prescan. */
1685 break;
1687 case OPT_Werror:
1688 dc->warning_as_error_requested = value;
1689 break;
1691 case OPT_Werror_:
1692 if (lang_mask == CL_DRIVER)
1693 break;
1695 enable_warning_as_error (arg, value, lang_mask, handlers,
1696 opts, opts_set, loc, dc);
1697 break;
1699 case OPT_Wlarger_than_:
1700 opts->x_larger_than_size = value;
1701 opts->x_warn_larger_than = value != -1;
1702 break;
1704 case OPT_Wfatal_errors:
1705 dc->fatal_errors = value;
1706 break;
1708 case OPT_Wframe_larger_than_:
1709 opts->x_frame_larger_than_size = value;
1710 opts->x_warn_frame_larger_than = value != -1;
1711 break;
1713 case OPT_Wstack_usage_:
1714 opts->x_warn_stack_usage = value;
1715 opts->x_flag_stack_usage_info = value != -1;
1716 break;
1718 case OPT_Wstrict_aliasing:
1719 set_Wstrict_aliasing (opts, value);
1720 break;
1722 case OPT_Wstrict_overflow:
1723 opts->x_warn_strict_overflow = (value
1724 ? (int) WARN_STRICT_OVERFLOW_CONDITIONAL
1725 : 0);
1726 break;
1728 case OPT_Wsystem_headers:
1729 dc->dc_warn_system_headers = value;
1730 break;
1732 case OPT_aux_info:
1733 opts->x_flag_gen_aux_info = 1;
1734 break;
1736 case OPT_auxbase_strip:
1738 char *tmp = xstrdup (arg);
1739 strip_off_ending (tmp, strlen (tmp));
1740 if (tmp[0])
1741 opts->x_aux_base_name = tmp;
1742 else
1743 free (tmp);
1745 break;
1747 case OPT_d:
1748 decode_d_option (arg, opts, loc, dc);
1749 break;
1751 case OPT_fcall_used_:
1752 case OPT_fcall_saved_:
1753 /* Deferred. */
1754 break;
1756 case OPT_fdbg_cnt_:
1757 case OPT_fdbg_cnt_list:
1758 /* Deferred. */
1759 break;
1761 case OPT_fdebug_prefix_map_:
1762 /* Deferred. */
1763 break;
1765 case OPT_fdiagnostics_show_location_:
1766 diagnostic_prefixing_rule (dc) = (diagnostic_prefixing_rule_t) value;
1767 break;
1769 case OPT_fdiagnostics_show_caret:
1770 dc->show_caret = value;
1771 break;
1773 case OPT_fdiagnostics_color_:
1774 pp_show_color (dc->printer)
1775 = colorize_init ((diagnostic_color_rule_t) value);
1776 break;
1778 case OPT_fdiagnostics_show_option:
1779 dc->show_option_requested = value;
1780 break;
1782 case OPT_fdump_:
1783 /* Deferred. */
1784 break;
1786 case OPT_ffast_math:
1787 set_fast_math_flags (opts, value);
1788 break;
1790 case OPT_funsafe_math_optimizations:
1791 set_unsafe_math_optimizations_flags (opts, value);
1792 break;
1794 case OPT_ffixed_:
1795 /* Deferred. */
1796 break;
1798 case OPT_finline_limit_:
1799 set_param_value ("max-inline-insns-single", value / 2,
1800 opts->x_param_values, opts_set->x_param_values);
1801 set_param_value ("max-inline-insns-auto", value / 2,
1802 opts->x_param_values, opts_set->x_param_values);
1803 break;
1805 case OPT_finstrument_functions_exclude_function_list_:
1806 add_comma_separated_to_vector
1807 (&opts->x_flag_instrument_functions_exclude_functions, arg);
1808 break;
1810 case OPT_finstrument_functions_exclude_file_list_:
1811 add_comma_separated_to_vector
1812 (&opts->x_flag_instrument_functions_exclude_files, arg);
1813 break;
1815 case OPT_fmessage_length_:
1816 pp_set_line_maximum_length (dc->printer, value);
1817 diagnostic_set_caret_max_width (dc, value);
1818 break;
1820 case OPT_fopt_info:
1821 case OPT_fopt_info_:
1822 /* Deferred. */
1823 break;
1825 case OPT_foffload_:
1826 /* Deferred. */
1827 break;
1829 #ifndef ACCEL_COMPILER
1830 case OPT_foffload_abi_:
1831 error_at (loc, "-foffload-abi option can be specified only for "
1832 "offload compiler");
1833 break;
1834 #endif
1836 case OPT_fpack_struct_:
1837 if (value <= 0 || (value & (value - 1)) || value > 16)
1838 error_at (loc,
1839 "structure alignment must be a small power of two, not %d",
1840 value);
1841 else
1842 opts->x_initial_max_fld_align = value;
1843 break;
1845 case OPT_fplugin_:
1846 case OPT_fplugin_arg_:
1847 /* Deferred. */
1848 break;
1850 case OPT_fprofile_use_:
1851 opts->x_profile_data_prefix = xstrdup (arg);
1852 opts->x_flag_profile_use = true;
1853 value = true;
1854 /* No break here - do -fprofile-use processing. */
1855 case OPT_fprofile_use:
1856 enable_fdo_optimizations (opts, opts_set, value);
1857 if (!opts_set->x_flag_profile_reorder_functions)
1858 opts->x_flag_profile_reorder_functions = value;
1859 /* Indirect call profiling should do all useful transformations
1860 speculative devirtualization does. */
1861 if (!opts_set->x_flag_devirtualize_speculatively
1862 && opts->x_flag_value_profile_transformations)
1863 opts->x_flag_devirtualize_speculatively = false;
1864 break;
1866 case OPT_fauto_profile_:
1867 opts->x_auto_profile_file = xstrdup (arg);
1868 opts->x_flag_auto_profile = true;
1869 value = true;
1870 /* No break here - do -fauto-profile processing. */
1871 case OPT_fauto_profile:
1872 enable_fdo_optimizations (opts, opts_set, value);
1873 if (!opts_set->x_flag_profile_correction)
1874 opts->x_flag_profile_correction = value;
1875 maybe_set_param_value (
1876 PARAM_EARLY_INLINER_MAX_ITERATIONS, 10,
1877 opts->x_param_values, opts_set->x_param_values);
1878 break;
1880 case OPT_fprofile_generate_:
1881 opts->x_profile_data_prefix = xstrdup (arg);
1882 value = true;
1883 /* No break here - do -fprofile-generate processing. */
1884 case OPT_fprofile_generate:
1885 if (!opts_set->x_profile_arc_flag)
1886 opts->x_profile_arc_flag = value;
1887 if (!opts_set->x_flag_profile_values)
1888 opts->x_flag_profile_values = value;
1889 if (!opts_set->x_flag_inline_functions)
1890 opts->x_flag_inline_functions = value;
1891 /* FIXME: Instrumentation we insert makes ipa-reference bitmaps
1892 quadratic. Disable the pass until better memory representation
1893 is done. */
1894 if (!opts_set->x_flag_ipa_reference)
1895 opts->x_flag_ipa_reference = false;
1896 break;
1898 case OPT_ftree_vectorize:
1899 if (!opts_set->x_flag_tree_loop_vectorize)
1900 opts->x_flag_tree_loop_vectorize = value;
1901 if (!opts_set->x_flag_tree_slp_vectorize)
1902 opts->x_flag_tree_slp_vectorize = value;
1903 break;
1904 case OPT_fshow_column:
1905 dc->show_column = value;
1906 break;
1908 case OPT_frandom_seed:
1909 /* The real switch is -fno-random-seed. */
1910 if (value)
1911 return false;
1912 /* Deferred. */
1913 break;
1915 case OPT_frandom_seed_:
1916 /* Deferred. */
1917 break;
1919 case OPT_fsched_verbose_:
1920 #ifdef INSN_SCHEDULING
1921 /* Handled with Var in common.opt. */
1922 break;
1923 #else
1924 return false;
1925 #endif
1927 case OPT_fsched_stalled_insns_:
1928 opts->x_flag_sched_stalled_insns = value;
1929 if (opts->x_flag_sched_stalled_insns == 0)
1930 opts->x_flag_sched_stalled_insns = -1;
1931 break;
1933 case OPT_fsched_stalled_insns_dep_:
1934 opts->x_flag_sched_stalled_insns_dep = value;
1935 break;
1937 case OPT_fstack_check_:
1938 if (!strcmp (arg, "no"))
1939 opts->x_flag_stack_check = NO_STACK_CHECK;
1940 else if (!strcmp (arg, "generic"))
1941 /* This is the old stack checking method. */
1942 opts->x_flag_stack_check = STACK_CHECK_BUILTIN
1943 ? FULL_BUILTIN_STACK_CHECK
1944 : GENERIC_STACK_CHECK;
1945 else if (!strcmp (arg, "specific"))
1946 /* This is the new stack checking method. */
1947 opts->x_flag_stack_check = STACK_CHECK_BUILTIN
1948 ? FULL_BUILTIN_STACK_CHECK
1949 : STACK_CHECK_STATIC_BUILTIN
1950 ? STATIC_BUILTIN_STACK_CHECK
1951 : GENERIC_STACK_CHECK;
1952 else
1953 warning_at (loc, 0, "unknown stack check parameter %qs", arg);
1954 break;
1956 case OPT_fstack_limit:
1957 /* The real switch is -fno-stack-limit. */
1958 if (value)
1959 return false;
1960 /* Deferred. */
1961 break;
1963 case OPT_fstack_limit_register_:
1964 case OPT_fstack_limit_symbol_:
1965 /* Deferred. */
1966 break;
1968 case OPT_fstack_usage:
1969 opts->x_flag_stack_usage = value;
1970 opts->x_flag_stack_usage_info = value != 0;
1971 break;
1973 case OPT_g:
1974 set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, arg, opts, opts_set,
1975 loc);
1976 break;
1978 case OPT_gcoff:
1979 set_debug_level (SDB_DEBUG, false, arg, opts, opts_set, loc);
1980 break;
1982 case OPT_gdwarf:
1983 if (arg && strlen (arg) != 0)
1985 error_at (loc, "%<-gdwarf%s%> is ambiguous; "
1986 "use %<-gdwarf-%s%> for DWARF version "
1987 "or %<-gdwarf -g%s%> for debug level", arg, arg, arg);
1988 break;
1990 else
1991 value = opts->x_dwarf_version;
1993 /* FALLTHRU */
1994 case OPT_gdwarf_:
1995 if (value < 2 || value > 5)
1996 error_at (loc, "dwarf version %d is not supported", value);
1997 else
1998 opts->x_dwarf_version = value;
1999 set_debug_level (DWARF2_DEBUG, false, "", opts, opts_set, loc);
2000 break;
2002 case OPT_gsplit_dwarf:
2003 set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, "", opts, opts_set,
2004 loc);
2005 break;
2007 case OPT_ggdb:
2008 set_debug_level (NO_DEBUG, 2, arg, opts, opts_set, loc);
2009 break;
2011 case OPT_gstabs:
2012 case OPT_gstabs_:
2013 set_debug_level (DBX_DEBUG, code == OPT_gstabs_, arg, opts, opts_set,
2014 loc);
2015 break;
2017 case OPT_gvms:
2018 set_debug_level (VMS_DEBUG, false, arg, opts, opts_set, loc);
2019 break;
2021 case OPT_gxcoff:
2022 case OPT_gxcoff_:
2023 set_debug_level (XCOFF_DEBUG, code == OPT_gxcoff_, arg, opts, opts_set,
2024 loc);
2025 break;
2027 case OPT_gz:
2028 case OPT_gz_:
2029 /* Handled completely via specs. */
2030 break;
2032 case OPT_pedantic_errors:
2033 dc->pedantic_errors = 1;
2034 control_warning_option (OPT_Wpedantic, DK_ERROR, value,
2035 loc, lang_mask,
2036 handlers, opts, opts_set,
2037 dc);
2038 break;
2040 case OPT_flto:
2041 opts->x_flag_lto = value ? "" : NULL;
2042 break;
2044 case OPT_w:
2045 dc->dc_inhibit_warnings = true;
2046 break;
2048 case OPT_fmax_errors_:
2049 dc->max_errors = value;
2050 break;
2052 case OPT_fuse_ld_bfd:
2053 case OPT_fuse_ld_gold:
2054 case OPT_fuse_linker_plugin:
2055 /* No-op. Used by the driver and passed to us because it starts with f.*/
2056 break;
2058 case OPT_fwrapv:
2059 if (value)
2060 opts->x_flag_trapv = 0;
2061 break;
2063 case OPT_ftrapv:
2064 if (value)
2065 opts->x_flag_wrapv = 0;
2066 break;
2068 case OPT_fipa_icf:
2069 opts->x_flag_ipa_icf_functions = value;
2070 opts->x_flag_ipa_icf_variables = value;
2071 break;
2073 default:
2074 /* If the flag was handled in a standard way, assume the lack of
2075 processing here is intentional. */
2076 gcc_assert (option_flag_var (scode, opts));
2077 break;
2080 common_handle_option_auto (opts, opts_set, decoded, lang_mask, kind,
2081 loc, handlers, dc);
2082 return true;
2085 /* Handle --param NAME=VALUE. */
2086 static void
2087 handle_param (struct gcc_options *opts, struct gcc_options *opts_set,
2088 location_t loc, const char *carg)
2090 char *equal, *arg;
2091 int value;
2093 arg = xstrdup (carg);
2094 equal = strchr (arg, '=');
2095 if (!equal)
2096 error_at (loc, "%s: --param arguments should be of the form NAME=VALUE",
2097 arg);
2098 else
2100 value = integral_argument (equal + 1);
2101 if (value == -1)
2102 error_at (loc, "invalid --param value %qs", equal + 1);
2103 else
2105 *equal = '\0';
2106 set_param_value (arg, value,
2107 opts->x_param_values, opts_set->x_param_values);
2111 free (arg);
2114 /* Used to set the level of strict aliasing warnings in OPTS,
2115 when no level is specified (i.e., when -Wstrict-aliasing, and not
2116 -Wstrict-aliasing=level was given).
2117 ONOFF is assumed to take value 1 when -Wstrict-aliasing is specified,
2118 and 0 otherwise. After calling this function, wstrict_aliasing will be
2119 set to the default value of -Wstrict_aliasing=level, currently 3. */
2120 static void
2121 set_Wstrict_aliasing (struct gcc_options *opts, int onoff)
2123 gcc_assert (onoff == 0 || onoff == 1);
2124 if (onoff != 0)
2125 opts->x_warn_strict_aliasing = 3;
2126 else
2127 opts->x_warn_strict_aliasing = 0;
2130 /* The following routines are useful in setting all the flags that
2131 -ffast-math and -fno-fast-math imply. */
2132 static void
2133 set_fast_math_flags (struct gcc_options *opts, int set)
2135 if (!opts->frontend_set_flag_unsafe_math_optimizations)
2137 opts->x_flag_unsafe_math_optimizations = set;
2138 set_unsafe_math_optimizations_flags (opts, set);
2140 if (!opts->frontend_set_flag_finite_math_only)
2141 opts->x_flag_finite_math_only = set;
2142 if (!opts->frontend_set_flag_errno_math)
2143 opts->x_flag_errno_math = !set;
2144 if (set)
2146 if (!opts->frontend_set_flag_signaling_nans)
2147 opts->x_flag_signaling_nans = 0;
2148 if (!opts->frontend_set_flag_rounding_math)
2149 opts->x_flag_rounding_math = 0;
2150 if (!opts->frontend_set_flag_cx_limited_range)
2151 opts->x_flag_cx_limited_range = 1;
2155 /* When -funsafe-math-optimizations is set the following
2156 flags are set as well. */
2157 static void
2158 set_unsafe_math_optimizations_flags (struct gcc_options *opts, int set)
2160 if (!opts->frontend_set_flag_trapping_math)
2161 opts->x_flag_trapping_math = !set;
2162 if (!opts->frontend_set_flag_signed_zeros)
2163 opts->x_flag_signed_zeros = !set;
2164 if (!opts->frontend_set_flag_associative_math)
2165 opts->x_flag_associative_math = set;
2166 if (!opts->frontend_set_flag_reciprocal_math)
2167 opts->x_flag_reciprocal_math = set;
2170 /* Return true iff flags in OPTS are set as if -ffast-math. */
2171 bool
2172 fast_math_flags_set_p (const struct gcc_options *opts)
2174 return (!opts->x_flag_trapping_math
2175 && opts->x_flag_unsafe_math_optimizations
2176 && opts->x_flag_finite_math_only
2177 && !opts->x_flag_signed_zeros
2178 && !opts->x_flag_errno_math);
2181 /* Return true iff flags are set as if -ffast-math but using the flags stored
2182 in the struct cl_optimization structure. */
2183 bool
2184 fast_math_flags_struct_set_p (struct cl_optimization *opt)
2186 return (!opt->x_flag_trapping_math
2187 && opt->x_flag_unsafe_math_optimizations
2188 && opt->x_flag_finite_math_only
2189 && !opt->x_flag_signed_zeros
2190 && !opt->x_flag_errno_math);
2193 /* Handle a debug output -g switch for options OPTS
2194 (OPTS_SET->x_write_symbols storing whether a debug type was passed
2195 explicitly), location LOC. EXTENDED is true or false to support
2196 extended output (2 is special and means "-ggdb" was given). */
2197 static void
2198 set_debug_level (enum debug_info_type type, int extended, const char *arg,
2199 struct gcc_options *opts, struct gcc_options *opts_set,
2200 location_t loc)
2202 opts->x_use_gnu_debug_info_extensions = extended;
2204 if (type == NO_DEBUG)
2206 if (opts->x_write_symbols == NO_DEBUG)
2208 opts->x_write_symbols = PREFERRED_DEBUGGING_TYPE;
2210 if (extended == 2)
2212 #ifdef DWARF2_DEBUGGING_INFO
2213 opts->x_write_symbols = DWARF2_DEBUG;
2214 #elif defined DBX_DEBUGGING_INFO
2215 opts->x_write_symbols = DBX_DEBUG;
2216 #endif
2219 if (opts->x_write_symbols == NO_DEBUG)
2220 warning_at (loc, 0, "target system does not support debug output");
2223 else
2225 /* Does it conflict with an already selected type? */
2226 if (opts_set->x_write_symbols != NO_DEBUG
2227 && opts->x_write_symbols != NO_DEBUG
2228 && type != opts->x_write_symbols)
2229 error_at (loc, "debug format %qs conflicts with prior selection",
2230 debug_type_names[type]);
2231 opts->x_write_symbols = type;
2232 opts_set->x_write_symbols = type;
2235 /* A debug flag without a level defaults to level 2.
2236 If off or at level 1, set it to level 2, but if already
2237 at level 3, don't lower it. */
2238 if (*arg == '\0')
2240 if (opts->x_debug_info_level < DINFO_LEVEL_NORMAL)
2241 opts->x_debug_info_level = DINFO_LEVEL_NORMAL;
2243 else
2245 int argval = integral_argument (arg);
2246 if (argval == -1)
2247 error_at (loc, "unrecognised debug output level %qs", arg);
2248 else if (argval > 3)
2249 error_at (loc, "debug output level %qs is too high", arg);
2250 else
2251 opts->x_debug_info_level = (enum debug_info_levels) argval;
2255 /* Arrange to dump core on error for diagnostic context DC. (The
2256 regular error message is still printed first, except in the case of
2257 abort ().) */
2259 static void
2260 setup_core_dumping (diagnostic_context *dc)
2262 #ifdef SIGABRT
2263 signal (SIGABRT, SIG_DFL);
2264 #endif
2265 #if defined(HAVE_SETRLIMIT)
2267 struct rlimit rlim;
2268 if (getrlimit (RLIMIT_CORE, &rlim) != 0)
2269 fatal_error ("getting core file size maximum limit: %m");
2270 rlim.rlim_cur = rlim.rlim_max;
2271 if (setrlimit (RLIMIT_CORE, &rlim) != 0)
2272 fatal_error ("setting core file size limit to maximum: %m");
2274 #endif
2275 diagnostic_abort_on_error (dc);
2278 /* Parse a -d<ARG> command line switch for OPTS, location LOC,
2279 diagnostic context DC. */
2281 static void
2282 decode_d_option (const char *arg, struct gcc_options *opts,
2283 location_t loc, diagnostic_context *dc)
2285 int c;
2287 while (*arg)
2288 switch (c = *arg++)
2290 case 'A':
2291 opts->x_flag_debug_asm = 1;
2292 break;
2293 case 'p':
2294 opts->x_flag_print_asm_name = 1;
2295 break;
2296 case 'P':
2297 opts->x_flag_dump_rtl_in_asm = 1;
2298 opts->x_flag_print_asm_name = 1;
2299 break;
2300 case 'x':
2301 opts->x_rtl_dump_and_exit = 1;
2302 break;
2303 case 'D': /* These are handled by the preprocessor. */
2304 case 'I':
2305 case 'M':
2306 case 'N':
2307 case 'U':
2308 break;
2309 case 'H':
2310 setup_core_dumping (dc);
2311 break;
2312 case 'a':
2313 opts->x_flag_dump_all_passed = true;
2314 break;
2316 default:
2317 warning_at (loc, 0, "unrecognized gcc debugging option: %c", c);
2318 break;
2322 /* Enable (or disable if VALUE is 0) a warning option ARG (language
2323 mask LANG_MASK, option handlers HANDLERS) as an error for option
2324 structures OPTS and OPTS_SET, diagnostic context DC (possibly
2325 NULL), location LOC. This is used by -Werror=. */
2327 static void
2328 enable_warning_as_error (const char *arg, int value, unsigned int lang_mask,
2329 const struct cl_option_handlers *handlers,
2330 struct gcc_options *opts,
2331 struct gcc_options *opts_set,
2332 location_t loc, diagnostic_context *dc)
2334 char *new_option;
2335 int option_index;
2337 new_option = XNEWVEC (char, strlen (arg) + 2);
2338 new_option[0] = 'W';
2339 strcpy (new_option + 1, arg);
2340 option_index = find_opt (new_option, lang_mask);
2341 if (option_index == OPT_SPECIAL_unknown)
2343 error_at (loc, "-Werror=%s: no option -%s", arg, new_option);
2345 else
2347 const diagnostic_t kind = value ? DK_ERROR : DK_WARNING;
2349 control_warning_option (option_index, (int) kind, value,
2350 loc, lang_mask,
2351 handlers, opts, opts_set, dc);
2353 free (new_option);
2356 /* Return malloced memory for the name of the option OPTION_INDEX
2357 which enabled a diagnostic (context CONTEXT), originally of type
2358 ORIG_DIAG_KIND but possibly converted to DIAG_KIND by options such
2359 as -Werror. */
2361 char *
2362 option_name (diagnostic_context *context, int option_index,
2363 diagnostic_t orig_diag_kind, diagnostic_t diag_kind)
2365 if (option_index)
2367 /* A warning classified as an error. */
2368 if ((orig_diag_kind == DK_WARNING || orig_diag_kind == DK_PEDWARN)
2369 && diag_kind == DK_ERROR)
2370 return concat (cl_options[OPT_Werror_].opt_text,
2371 /* Skip over "-W". */
2372 cl_options[option_index].opt_text + 2,
2373 NULL);
2374 /* A warning with option. */
2375 else
2376 return xstrdup (cl_options[option_index].opt_text);
2378 /* A warning without option classified as an error. */
2379 else if ((orig_diag_kind == DK_WARNING || orig_diag_kind == DK_PEDWARN
2380 || diag_kind == DK_WARNING)
2381 && context->warning_as_error_requested)
2382 return xstrdup (cl_options[OPT_Werror].opt_text);
2383 else
2384 return NULL;