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