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"
29 #include "diagnostic.h"
30 #include "opts-diagnostic.h"
31 #include "insn-attr-common.h"
32 #include "common/common-target.h"
33 #include "spellcheck.h"
34 #include "opt-suggestions.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 handle_param (struct gcc_options
*opts
,
192 struct gcc_options
*opts_set
, location_t loc
,
194 static void set_debug_level (enum debug_info_type type
, int extended
,
195 const char *arg
, struct gcc_options
*opts
,
196 struct gcc_options
*opts_set
,
198 static void set_fast_math_flags (struct gcc_options
*opts
, int set
);
199 static void decode_d_option (const char *arg
, struct gcc_options
*opts
,
200 location_t loc
, diagnostic_context
*dc
);
201 static void set_unsafe_math_optimizations_flags (struct gcc_options
*opts
,
203 static void enable_warning_as_error (const char *arg
, int value
,
204 unsigned int lang_mask
,
205 const struct cl_option_handlers
*handlers
,
206 struct gcc_options
*opts
,
207 struct gcc_options
*opts_set
,
209 diagnostic_context
*dc
);
211 /* Handle a back-end option; arguments and return value as for
215 target_handle_option (struct gcc_options
*opts
,
216 struct gcc_options
*opts_set
,
217 const struct cl_decoded_option
*decoded
,
218 unsigned int lang_mask ATTRIBUTE_UNUSED
, int kind
,
220 const struct cl_option_handlers
*handlers ATTRIBUTE_UNUSED
,
221 diagnostic_context
*dc
, void (*) (void))
223 gcc_assert (dc
== global_dc
);
224 gcc_assert (kind
== DK_UNSPECIFIED
);
225 return targetm_common
.handle_option (opts
, opts_set
, decoded
, loc
);
228 /* Add comma-separated strings to a char_p vector. */
231 add_comma_separated_to_vector (void **pvec
, const char *arg
)
237 vec
<char_p
> *v
= (vec
<char_p
> *) *pvec
;
239 vec_check_alloc (v
, 1);
241 /* We never free this string. */
254 v
->safe_push (token_start
);
257 if (*r
== '\\' && r
[1] == ',')
265 if (*token_start
!= '\0')
266 v
->safe_push (token_start
);
271 /* Initialize opts_obstack. */
274 init_opts_obstack (void)
276 gcc_obstack_init (&opts_obstack
);
279 /* Initialize OPTS and OPTS_SET before using them in parsing options. */
282 init_options_struct (struct gcc_options
*opts
, struct gcc_options
*opts_set
)
284 size_t num_params
= get_num_compiler_params ();
286 /* Ensure that opts_obstack has already been initialized by the time
287 that we initialize any gcc_options instances (PR jit/68446). */
288 gcc_assert (opts_obstack
.chunk_size
> 0);
290 *opts
= global_options_init
;
293 memset (opts_set
, 0, sizeof (*opts_set
));
295 opts
->x_param_values
= XNEWVEC (int, num_params
);
298 opts_set
->x_param_values
= XCNEWVEC (int, num_params
);
300 init_param_values (opts
->x_param_values
);
302 /* Initialize whether `char' is signed. */
303 opts
->x_flag_signed_char
= DEFAULT_SIGNED_CHAR
;
304 /* Set this to a special "uninitialized" value. The actual default
305 is set after target options have been processed. */
306 opts
->x_flag_short_enums
= 2;
308 /* Initialize target_flags before default_options_optimization
309 so the latter can modify it. */
310 opts
->x_target_flags
= targetm_common
.default_target_flags
;
312 /* Some targets have ABI-specified unwind tables. */
313 opts
->x_flag_unwind_tables
= targetm_common
.unwind_tables_default
;
315 /* Some targets have other target-specific initialization. */
316 targetm_common
.option_init_struct (opts
);
319 /* Release any allocations owned by OPTS. */
322 finalize_options_struct (struct gcc_options
*opts
)
324 XDELETEVEC (opts
->x_param_values
);
327 /* If indicated by the optimization level LEVEL (-Os if SIZE is set,
328 -Ofast if FAST is set, -Og if DEBUG is set), apply the option DEFAULT_OPT
329 to OPTS and OPTS_SET, diagnostic context DC, location LOC, with language
330 mask LANG_MASK and option handlers HANDLERS. */
333 maybe_default_option (struct gcc_options
*opts
,
334 struct gcc_options
*opts_set
,
335 const struct default_options
*default_opt
,
336 int level
, bool size
, bool fast
, bool debug
,
337 unsigned int lang_mask
,
338 const struct cl_option_handlers
*handlers
,
340 diagnostic_context
*dc
)
342 const struct cl_option
*option
= &cl_options
[default_opt
->opt_index
];
346 gcc_assert (level
== 2);
348 gcc_assert (level
== 3);
350 gcc_assert (level
== 1);
352 switch (default_opt
->levels
)
358 case OPT_LEVELS_0_ONLY
:
359 enabled
= (level
== 0);
362 case OPT_LEVELS_1_PLUS
:
363 enabled
= (level
>= 1);
366 case OPT_LEVELS_1_PLUS_SPEED_ONLY
:
367 enabled
= (level
>= 1 && !size
&& !debug
);
370 case OPT_LEVELS_1_PLUS_NOT_DEBUG
:
371 enabled
= (level
>= 1 && !debug
);
374 case OPT_LEVELS_2_PLUS
:
375 enabled
= (level
>= 2);
378 case OPT_LEVELS_2_PLUS_SPEED_ONLY
:
379 enabled
= (level
>= 2 && !size
&& !debug
);
382 case OPT_LEVELS_3_PLUS
:
383 enabled
= (level
>= 3);
386 case OPT_LEVELS_3_PLUS_AND_SIZE
:
387 enabled
= (level
>= 3 || size
);
390 case OPT_LEVELS_SIZE
:
394 case OPT_LEVELS_FAST
:
398 case OPT_LEVELS_NONE
:
404 handle_generated_option (opts
, opts_set
, default_opt
->opt_index
,
405 default_opt
->arg
, default_opt
->value
,
406 lang_mask
, DK_UNSPECIFIED
, loc
,
408 else if (default_opt
->arg
== NULL
409 && !option
->cl_reject_negative
)
410 handle_generated_option (opts
, opts_set
, default_opt
->opt_index
,
411 default_opt
->arg
, !default_opt
->value
,
412 lang_mask
, DK_UNSPECIFIED
, loc
,
416 /* As indicated by the optimization level LEVEL (-Os if SIZE is set,
417 -Ofast if FAST is set), apply the options in array DEFAULT_OPTS to
418 OPTS and OPTS_SET, diagnostic context DC, location LOC, with
419 language mask LANG_MASK and option handlers HANDLERS. */
422 maybe_default_options (struct gcc_options
*opts
,
423 struct gcc_options
*opts_set
,
424 const struct default_options
*default_opts
,
425 int level
, bool size
, bool fast
, bool debug
,
426 unsigned int lang_mask
,
427 const struct cl_option_handlers
*handlers
,
429 diagnostic_context
*dc
)
433 for (i
= 0; default_opts
[i
].levels
!= OPT_LEVELS_NONE
; i
++)
434 maybe_default_option (opts
, opts_set
, &default_opts
[i
],
435 level
, size
, fast
, debug
,
436 lang_mask
, handlers
, loc
, dc
);
439 /* Table of options enabled by default at different levels.
440 Please keep this list sorted by level and alphabetized within
441 each level; this makes it easier to keep the documentation
444 static const struct default_options default_options_table
[] =
446 /* -O1 and -Og optimizations. */
447 { OPT_LEVELS_1_PLUS
, OPT_fcombine_stack_adjustments
, NULL
, 1 },
448 { OPT_LEVELS_1_PLUS
, OPT_fcompare_elim
, NULL
, 1 },
449 { OPT_LEVELS_1_PLUS
, OPT_fcprop_registers
, NULL
, 1 },
450 { OPT_LEVELS_1_PLUS
, OPT_fdefer_pop
, NULL
, 1 },
451 { OPT_LEVELS_1_PLUS
, OPT_fforward_propagate
, NULL
, 1 },
452 { OPT_LEVELS_1_PLUS
, OPT_fguess_branch_probability
, NULL
, 1 },
453 { OPT_LEVELS_1_PLUS
, OPT_fipa_profile
, NULL
, 1 },
454 { OPT_LEVELS_1_PLUS
, OPT_fipa_pure_const
, NULL
, 1 },
455 { OPT_LEVELS_1_PLUS
, OPT_fipa_reference
, NULL
, 1 },
456 { OPT_LEVELS_1_PLUS
, OPT_fipa_reference_addressable
, NULL
, 1 },
457 { OPT_LEVELS_1_PLUS
, OPT_fmerge_constants
, NULL
, 1 },
458 { OPT_LEVELS_1_PLUS
, OPT_fomit_frame_pointer
, NULL
, 1 },
459 { OPT_LEVELS_1_PLUS
, OPT_freorder_blocks
, NULL
, 1 },
460 { OPT_LEVELS_1_PLUS
, OPT_fshrink_wrap
, NULL
, 1 },
461 { OPT_LEVELS_1_PLUS
, OPT_fsplit_wide_types
, NULL
, 1 },
462 { OPT_LEVELS_1_PLUS
, OPT_ftree_builtin_call_dce
, NULL
, 1 },
463 { OPT_LEVELS_1_PLUS
, OPT_ftree_ccp
, NULL
, 1 },
464 { OPT_LEVELS_1_PLUS
, OPT_ftree_ch
, NULL
, 1 },
465 { OPT_LEVELS_1_PLUS
, OPT_ftree_coalesce_vars
, NULL
, 1 },
466 { OPT_LEVELS_1_PLUS
, OPT_ftree_copy_prop
, NULL
, 1 },
467 { OPT_LEVELS_1_PLUS
, OPT_ftree_dce
, NULL
, 1 },
468 { OPT_LEVELS_1_PLUS
, OPT_ftree_dominator_opts
, NULL
, 1 },
469 { OPT_LEVELS_1_PLUS
, OPT_ftree_dse
, NULL
, 1 },
470 { OPT_LEVELS_1_PLUS
, OPT_ftree_fre
, NULL
, 1 },
471 { OPT_LEVELS_1_PLUS
, OPT_ftree_sink
, NULL
, 1 },
472 { OPT_LEVELS_1_PLUS
, OPT_ftree_slsr
, NULL
, 1 },
473 { OPT_LEVELS_1_PLUS
, OPT_ftree_ter
, NULL
, 1 },
475 /* -O1 (and not -Og) optimizations. */
476 { OPT_LEVELS_1_PLUS_NOT_DEBUG
, OPT_fbranch_count_reg
, NULL
, 1 },
478 { OPT_LEVELS_1_PLUS_NOT_DEBUG
, OPT_fdelayed_branch
, NULL
, 1 },
480 { OPT_LEVELS_1_PLUS_NOT_DEBUG
, OPT_fif_conversion
, NULL
, 1 },
481 { OPT_LEVELS_1_PLUS_NOT_DEBUG
, OPT_fif_conversion2
, NULL
, 1 },
482 { OPT_LEVELS_1_PLUS_NOT_DEBUG
, OPT_finline_functions_called_once
, NULL
, 1 },
483 { OPT_LEVELS_1_PLUS_NOT_DEBUG
, OPT_fmove_loop_invariants
, NULL
, 1 },
484 { OPT_LEVELS_1_PLUS_NOT_DEBUG
, OPT_fssa_phiopt
, NULL
, 1 },
485 { OPT_LEVELS_1_PLUS_NOT_DEBUG
, OPT_ftree_bit_ccp
, NULL
, 1 },
486 { OPT_LEVELS_1_PLUS_NOT_DEBUG
, OPT_ftree_sra
, NULL
, 1 },
487 { OPT_LEVELS_1_PLUS_NOT_DEBUG
, OPT_ftree_pta
, NULL
, 1 },
489 /* -O2 and -Os optimizations. */
490 { OPT_LEVELS_2_PLUS
, OPT_fcaller_saves
, NULL
, 1 },
491 { OPT_LEVELS_2_PLUS
, OPT_fcode_hoisting
, NULL
, 1 },
492 { OPT_LEVELS_2_PLUS
, OPT_fcrossjumping
, NULL
, 1 },
493 { OPT_LEVELS_2_PLUS
, OPT_fcse_follow_jumps
, NULL
, 1 },
494 { OPT_LEVELS_2_PLUS
, OPT_fdevirtualize
, NULL
, 1 },
495 { OPT_LEVELS_2_PLUS
, OPT_fdevirtualize_speculatively
, NULL
, 1 },
496 { OPT_LEVELS_2_PLUS
, OPT_fexpensive_optimizations
, NULL
, 1 },
497 { OPT_LEVELS_2_PLUS
, OPT_fgcse
, NULL
, 1 },
498 { OPT_LEVELS_2_PLUS
, OPT_fhoist_adjacent_loads
, NULL
, 1 },
499 { OPT_LEVELS_2_PLUS
, OPT_findirect_inlining
, NULL
, 1 },
500 { OPT_LEVELS_2_PLUS
, OPT_finline_small_functions
, NULL
, 1 },
501 { OPT_LEVELS_2_PLUS
, OPT_fipa_bit_cp
, NULL
, 1 },
502 { OPT_LEVELS_2_PLUS
, OPT_fipa_cp
, NULL
, 1 },
503 { OPT_LEVELS_2_PLUS
, OPT_fipa_icf
, NULL
, 1 },
504 { OPT_LEVELS_2_PLUS
, OPT_fipa_ra
, NULL
, 1 },
505 { OPT_LEVELS_2_PLUS
, OPT_fipa_sra
, NULL
, 1 },
506 { OPT_LEVELS_2_PLUS
, OPT_fipa_vrp
, NULL
, 1 },
507 { OPT_LEVELS_2_PLUS
, OPT_fisolate_erroneous_paths_dereference
, NULL
, 1 },
508 { OPT_LEVELS_2_PLUS
, OPT_flra_remat
, NULL
, 1 },
509 { OPT_LEVELS_2_PLUS
, OPT_foptimize_sibling_calls
, NULL
, 1 },
510 { OPT_LEVELS_2_PLUS
, OPT_fpartial_inlining
, NULL
, 1 },
511 { OPT_LEVELS_2_PLUS
, OPT_fpeephole2
, NULL
, 1 },
512 { OPT_LEVELS_2_PLUS
, OPT_freorder_functions
, NULL
, 1 },
513 { OPT_LEVELS_2_PLUS
, OPT_frerun_cse_after_loop
, NULL
, 1 },
514 #ifdef INSN_SCHEDULING
515 { OPT_LEVELS_2_PLUS
, OPT_fschedule_insns2
, NULL
, 1 },
517 { OPT_LEVELS_2_PLUS
, OPT_fstrict_aliasing
, NULL
, 1 },
518 { OPT_LEVELS_2_PLUS
, OPT_fstore_merging
, NULL
, 1 },
519 { OPT_LEVELS_2_PLUS
, OPT_fthread_jumps
, NULL
, 1 },
520 { OPT_LEVELS_2_PLUS
, OPT_ftree_pre
, NULL
, 1 },
521 { OPT_LEVELS_2_PLUS
, OPT_ftree_switch_conversion
, NULL
, 1 },
522 { OPT_LEVELS_2_PLUS
, OPT_ftree_tail_merge
, NULL
, 1 },
523 { OPT_LEVELS_2_PLUS
, OPT_ftree_vrp
, NULL
, 1 },
524 { OPT_LEVELS_2_PLUS
, OPT_fvect_cost_model_
, NULL
, VECT_COST_MODEL_CHEAP
},
526 /* -O2 and -Os optimizations. */
527 { OPT_LEVELS_2_PLUS_SPEED_ONLY
, OPT_falign_functions
, NULL
, 1 },
528 { OPT_LEVELS_2_PLUS_SPEED_ONLY
, OPT_falign_jumps
, NULL
, 1 },
529 { OPT_LEVELS_2_PLUS_SPEED_ONLY
, OPT_falign_labels
, NULL
, 1 },
530 { OPT_LEVELS_2_PLUS_SPEED_ONLY
, OPT_falign_loops
, NULL
, 1 },
531 { OPT_LEVELS_2_PLUS_SPEED_ONLY
, OPT_foptimize_strlen
, NULL
, 1 },
532 { OPT_LEVELS_2_PLUS_SPEED_ONLY
, OPT_freorder_blocks_algorithm_
, NULL
,
533 REORDER_BLOCKS_ALGORITHM_STC
},
534 #ifdef INSN_SCHEDULING
535 /* Only run the pre-regalloc scheduling pass if optimizing for speed. */
536 { OPT_LEVELS_2_PLUS_SPEED_ONLY
, OPT_fschedule_insns
, NULL
, 1 },
539 /* -O3 and -Os optimizations. */
540 /* Inlining of functions reducing size is a good idea with -Os
541 regardless of them being declared inline. */
542 { OPT_LEVELS_3_PLUS_AND_SIZE
, OPT_finline_functions
, NULL
, 1 },
544 /* -O3 optimizations. */
545 { OPT_LEVELS_3_PLUS
, OPT_fgcse_after_reload
, NULL
, 1 },
546 { OPT_LEVELS_3_PLUS
, OPT_fipa_cp_clone
, NULL
, 1 },
547 { OPT_LEVELS_3_PLUS
, OPT_floop_interchange
, NULL
, 1 },
548 { OPT_LEVELS_3_PLUS
, OPT_floop_unroll_and_jam
, NULL
, 1 },
549 { OPT_LEVELS_3_PLUS
, OPT_fpeel_loops
, NULL
, 1 },
550 { OPT_LEVELS_3_PLUS
, OPT_fpredictive_commoning
, NULL
, 1 },
551 { OPT_LEVELS_3_PLUS
, OPT_fsplit_loops
, NULL
, 1 },
552 { OPT_LEVELS_3_PLUS
, OPT_fsplit_paths
, NULL
, 1 },
553 { OPT_LEVELS_3_PLUS
, OPT_ftree_loop_distribute_patterns
, NULL
, 1 },
554 { OPT_LEVELS_3_PLUS
, OPT_ftree_loop_distribution
, NULL
, 1 },
555 { OPT_LEVELS_3_PLUS
, OPT_ftree_loop_vectorize
, NULL
, 1 },
556 { OPT_LEVELS_3_PLUS
, OPT_ftree_partial_pre
, NULL
, 1 },
557 { OPT_LEVELS_3_PLUS
, OPT_ftree_slp_vectorize
, NULL
, 1 },
558 { OPT_LEVELS_3_PLUS
, OPT_funswitch_loops
, NULL
, 1 },
559 { OPT_LEVELS_3_PLUS
, OPT_fvect_cost_model_
, NULL
, VECT_COST_MODEL_DYNAMIC
},
560 { OPT_LEVELS_3_PLUS
, OPT_fversion_loops_for_strides
, NULL
, 1 },
562 /* -Ofast adds optimizations to -O3. */
563 { OPT_LEVELS_FAST
, OPT_ffast_math
, NULL
, 1 },
565 { OPT_LEVELS_NONE
, 0, NULL
, 0 }
568 /* Default the options in OPTS and OPTS_SET based on the optimization
569 settings in DECODED_OPTIONS and DECODED_OPTIONS_COUNT. */
571 default_options_optimization (struct gcc_options
*opts
,
572 struct gcc_options
*opts_set
,
573 struct cl_decoded_option
*decoded_options
,
574 unsigned int decoded_options_count
,
576 unsigned int lang_mask
,
577 const struct cl_option_handlers
*handlers
,
578 diagnostic_context
*dc
)
582 bool openacc_mode
= false;
584 /* Scan to see what optimization level has been specified. That will
585 determine the default value of many flags. */
586 for (i
= 1; i
< decoded_options_count
; i
++)
588 struct cl_decoded_option
*opt
= &decoded_options
[i
];
589 switch (opt
->opt_index
)
592 if (*opt
->arg
== '\0')
594 opts
->x_optimize
= 1;
595 opts
->x_optimize_size
= 0;
596 opts
->x_optimize_fast
= 0;
597 opts
->x_optimize_debug
= 0;
601 const int optimize_val
= integral_argument (opt
->arg
);
602 if (optimize_val
== -1)
603 error_at (loc
, "argument to %<-O%> should be a non-negative "
604 "integer, %<g%>, %<s%> or %<fast%>");
607 opts
->x_optimize
= optimize_val
;
608 if ((unsigned int) opts
->x_optimize
> 255)
609 opts
->x_optimize
= 255;
610 opts
->x_optimize_size
= 0;
611 opts
->x_optimize_fast
= 0;
612 opts
->x_optimize_debug
= 0;
618 opts
->x_optimize_size
= 1;
620 /* Optimizing for size forces optimize to be 2. */
621 opts
->x_optimize
= 2;
622 opts
->x_optimize_fast
= 0;
623 opts
->x_optimize_debug
= 0;
627 /* -Ofast only adds flags to -O3. */
628 opts
->x_optimize_size
= 0;
629 opts
->x_optimize
= 3;
630 opts
->x_optimize_fast
= 1;
631 opts
->x_optimize_debug
= 0;
635 /* -Og selects optimization level 1. */
636 opts
->x_optimize_size
= 0;
637 opts
->x_optimize
= 1;
638 opts
->x_optimize_fast
= 0;
639 opts
->x_optimize_debug
= 1;
648 /* Ignore other options in this prescan. */
653 maybe_default_options (opts
, opts_set
, default_options_table
,
654 opts
->x_optimize
, opts
->x_optimize_size
,
655 opts
->x_optimize_fast
, opts
->x_optimize_debug
,
656 lang_mask
, handlers
, loc
, dc
);
658 /* -O2 param settings. */
659 opt2
= (opts
->x_optimize
>= 2);
662 && !opts_set
->x_flag_ipa_pta
)
663 opts
->x_flag_ipa_pta
= true;
665 /* Track fields in field-sensitive alias analysis. */
666 maybe_set_param_value
667 (PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE
,
668 opt2
? 100 : default_param_value (PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE
),
669 opts
->x_param_values
, opts_set
->x_param_values
);
671 /* For -O1 only do loop invariant motion for very small loops. */
672 maybe_set_param_value
673 (PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP
,
674 opt2
? default_param_value (PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP
)
675 : default_param_value (PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP
) / 10,
676 opts
->x_param_values
, opts_set
->x_param_values
);
678 /* For -O1 reduce the maximum number of active local stores for RTL DSE
679 since this can consume huge amounts of memory (PR89115). */
680 maybe_set_param_value
681 (PARAM_MAX_DSE_ACTIVE_LOCAL_STORES
,
682 opt2
? default_param_value (PARAM_MAX_DSE_ACTIVE_LOCAL_STORES
)
683 : default_param_value (PARAM_MAX_DSE_ACTIVE_LOCAL_STORES
) / 10,
684 opts
->x_param_values
, opts_set
->x_param_values
);
686 /* At -Ofast, allow store motion to introduce potential race conditions. */
687 maybe_set_param_value
688 (PARAM_ALLOW_STORE_DATA_RACES
,
689 opts
->x_optimize_fast
? 1
690 : default_param_value (PARAM_ALLOW_STORE_DATA_RACES
),
691 opts
->x_param_values
, opts_set
->x_param_values
);
693 if (opts
->x_optimize_size
)
694 /* We want to crossjump as much as possible. */
695 maybe_set_param_value (PARAM_MIN_CROSSJUMP_INSNS
, 1,
696 opts
->x_param_values
, opts_set
->x_param_values
);
698 maybe_set_param_value (PARAM_MIN_CROSSJUMP_INSNS
,
699 default_param_value (PARAM_MIN_CROSSJUMP_INSNS
),
700 opts
->x_param_values
, opts_set
->x_param_values
);
702 /* Restrict the amount of work combine does at -Og while retaining
703 most of its useful transforms. */
704 if (opts
->x_optimize_debug
)
705 maybe_set_param_value (PARAM_MAX_COMBINE_INSNS
, 2,
706 opts
->x_param_values
, opts_set
->x_param_values
);
708 /* Allow default optimizations to be specified on a per-machine basis. */
709 maybe_default_options (opts
, opts_set
,
710 targetm_common
.option_optimization_table
,
711 opts
->x_optimize
, opts
->x_optimize_size
,
712 opts
->x_optimize_fast
, opts
->x_optimize_debug
,
713 lang_mask
, handlers
, loc
, dc
);
716 /* Control IPA optimizations based on different live patching LEVEL. */
718 control_options_for_live_patching (struct gcc_options
*opts
,
719 struct gcc_options
*opts_set
,
720 enum live_patching_level level
,
723 gcc_assert (level
> LIVE_PATCHING_NONE
);
727 case LIVE_PATCHING_INLINE_ONLY_STATIC
:
728 if (opts_set
->x_flag_ipa_cp_clone
&& opts
->x_flag_ipa_cp_clone
)
730 "%<-fipa-cp-clone%> is incompatible with "
731 "%<-flive-patching=inline-only-static%>");
733 opts
->x_flag_ipa_cp_clone
= 0;
735 if (opts_set
->x_flag_ipa_sra
&& opts
->x_flag_ipa_sra
)
737 "%<-fipa-sra%> is incompatible with "
738 "%<-flive-patching=inline-only-static%>");
740 opts
->x_flag_ipa_sra
= 0;
742 if (opts_set
->x_flag_partial_inlining
&& opts
->x_flag_partial_inlining
)
744 "%<-fpartial-inlining%> is incompatible with "
745 "%<-flive-patching=inline-only-static%>");
747 opts
->x_flag_partial_inlining
= 0;
749 if (opts_set
->x_flag_ipa_cp
&& opts
->x_flag_ipa_cp
)
751 "%<-fipa-cp%> is incompatible with "
752 "%<-flive-patching=inline-only-static%>");
754 opts
->x_flag_ipa_cp
= 0;
757 case LIVE_PATCHING_INLINE_CLONE
:
758 /* live patching should disable whole-program optimization. */
759 if (opts_set
->x_flag_whole_program
&& opts
->x_flag_whole_program
)
761 "%<-fwhole-program%> is incompatible with "
762 "%<-flive-patching=inline-only-static|inline-clone%>");
764 opts
->x_flag_whole_program
= 0;
766 /* visibility change should be excluded by !flag_whole_program
767 && !in_lto_p && !flag_ipa_cp_clone && !flag_ipa_sra
768 && !flag_partial_inlining. */
770 if (opts_set
->x_flag_ipa_pta
&& opts
->x_flag_ipa_pta
)
772 "%<-fipa-pta%> is incompatible with "
773 "%<-flive-patching=inline-only-static|inline-clone%>");
775 opts
->x_flag_ipa_pta
= 0;
777 if (opts_set
->x_flag_ipa_reference
&& opts
->x_flag_ipa_reference
)
779 "%<-fipa-reference%> is incompatible with "
780 "%<-flive-patching=inline-only-static|inline-clone%>");
782 opts
->x_flag_ipa_reference
= 0;
784 if (opts_set
->x_flag_ipa_ra
&& opts
->x_flag_ipa_ra
)
786 "%<-fipa-ra%> is incompatible with "
787 "%<-flive-patching=inline-only-static|inline-clone%>");
789 opts
->x_flag_ipa_ra
= 0;
791 if (opts_set
->x_flag_ipa_icf
&& opts
->x_flag_ipa_icf
)
793 "%<-fipa-icf%> is incompatible with "
794 "%<-flive-patching=inline-only-static|inline-clone%>");
796 opts
->x_flag_ipa_icf
= 0;
798 if (opts_set
->x_flag_ipa_icf_functions
&& opts
->x_flag_ipa_icf_functions
)
800 "%<-fipa-icf-functions%> is incompatible with "
801 "%<-flive-patching=inline-only-static|inline-clone%>");
803 opts
->x_flag_ipa_icf_functions
= 0;
805 if (opts_set
->x_flag_ipa_icf_variables
&& opts
->x_flag_ipa_icf_variables
)
807 "%<-fipa-icf-variables%> is incompatible with "
808 "%<-flive-patching=inline-only-static|inline-clone%>");
810 opts
->x_flag_ipa_icf_variables
= 0;
812 if (opts_set
->x_flag_ipa_bit_cp
&& opts
->x_flag_ipa_bit_cp
)
814 "%<-fipa-bit-cp%> is incompatible with "
815 "%<-flive-patching=inline-only-static|inline-clone%>");
817 opts
->x_flag_ipa_bit_cp
= 0;
819 if (opts_set
->x_flag_ipa_vrp
&& opts
->x_flag_ipa_vrp
)
821 "%<-fipa-vrp%> is incompatible with "
822 "%<-flive-patching=inline-only-static|inline-clone%>");
824 opts
->x_flag_ipa_vrp
= 0;
826 if (opts_set
->x_flag_ipa_pure_const
&& opts
->x_flag_ipa_pure_const
)
828 "%<-fipa-pure-const%> is incompatible with "
829 "%<-flive-patching=inline-only-static|inline-clone%>");
831 opts
->x_flag_ipa_pure_const
= 0;
833 /* FIXME: disable unreachable code removal. */
835 /* discovery of functions/variables with no address taken. */
836 if (opts_set
->x_flag_ipa_reference_addressable
837 && opts
->x_flag_ipa_reference_addressable
)
839 "%<-fipa-reference-addressable%> is incompatible with "
840 "%<-flive-patching=inline-only-static|inline-clone%>");
842 opts
->x_flag_ipa_reference_addressable
= 0;
844 /* ipa stack alignment propagation. */
845 if (opts_set
->x_flag_ipa_stack_alignment
846 && opts
->x_flag_ipa_stack_alignment
)
848 "%<-fipa-stack-alignment%> is incompatible with "
849 "%<-flive-patching=inline-only-static|inline-clone%>");
851 opts
->x_flag_ipa_stack_alignment
= 0;
858 /* --help option argument if set. */
859 const char *help_option_argument
= NULL
;
862 /* After all options at LOC have been read into OPTS and OPTS_SET,
863 finalize settings of those options and diagnose incompatible
866 finish_options (struct gcc_options
*opts
, struct gcc_options
*opts_set
,
869 enum unwind_info_type ui_except
;
871 if (opts
->x_dump_base_name
872 && ! opts
->x_dump_base_name_prefixed
)
874 const char *sep
= opts
->x_dump_base_name
;
877 if (IS_DIR_SEPARATOR (*sep
))
881 /* If dump_base_path contains subdirectories, don't prepend
883 else if (opts
->x_dump_dir_name
)
884 /* We have a DUMP_DIR_NAME, prepend that. */
885 opts
->x_dump_base_name
= opts_concat (opts
->x_dump_dir_name
,
886 opts
->x_dump_base_name
, NULL
);
887 else if (opts
->x_aux_base_name
888 && strcmp (opts
->x_aux_base_name
, HOST_BIT_BUCKET
) != 0)
889 /* AUX_BASE_NAME is set and is not the bit bucket. If it
890 contains a directory component, prepend those directories.
891 Typically this places things in the same directory as the
894 const char *aux_base
;
896 base_of_path (opts
->x_aux_base_name
, &aux_base
);
897 if (opts
->x_aux_base_name
!= aux_base
)
899 int dir_len
= aux_base
- opts
->x_aux_base_name
;
900 char *new_dump_base_name
901 = XOBNEWVEC (&opts_obstack
, char,
902 strlen (opts
->x_dump_base_name
) + dir_len
+ 1);
904 /* Copy directory component from OPTS->X_AUX_BASE_NAME. */
905 memcpy (new_dump_base_name
, opts
->x_aux_base_name
, dir_len
);
906 /* Append existing OPTS->X_DUMP_BASE_NAME. */
907 strcpy (new_dump_base_name
+ dir_len
, opts
->x_dump_base_name
);
908 opts
->x_dump_base_name
= new_dump_base_name
;
912 /* It is definitely prefixed now. */
913 opts
->x_dump_base_name_prefixed
= true;
916 /* Handle related options for unit-at-a-time, toplevel-reorder, and
918 if (!opts
->x_flag_unit_at_a_time
)
920 if (opts
->x_flag_section_anchors
&& opts_set
->x_flag_section_anchors
)
921 error_at (loc
, "section anchors must be disabled when unit-at-a-time "
923 opts
->x_flag_section_anchors
= 0;
924 if (opts
->x_flag_toplevel_reorder
== 1)
925 error_at (loc
, "toplevel reorder must be disabled when unit-at-a-time "
927 opts
->x_flag_toplevel_reorder
= 0;
930 /* -fself-test depends on the state of the compiler prior to
931 compiling anything. Ideally it should be run on an empty source
932 file. However, in case we get run with actual source, assume
933 -fsyntax-only which will inhibit any compiler initialization
934 which may confuse the self tests. */
935 if (opts
->x_flag_self_test
)
936 opts
->x_flag_syntax_only
= 1;
938 if (opts
->x_flag_tm
&& opts
->x_flag_non_call_exceptions
)
939 sorry ("transactional memory is not supported with non-call exceptions");
941 /* Unless the user has asked for section anchors, we disable toplevel
942 reordering at -O0 to disable transformations that might be surprising
943 to end users and to get -fno-toplevel-reorder tested. */
944 if (!opts
->x_optimize
945 && opts
->x_flag_toplevel_reorder
== 2
946 && !(opts
->x_flag_section_anchors
&& opts_set
->x_flag_section_anchors
))
948 opts
->x_flag_toplevel_reorder
= 0;
949 opts
->x_flag_section_anchors
= 0;
951 if (!opts
->x_flag_toplevel_reorder
)
953 if (opts
->x_flag_section_anchors
&& opts_set
->x_flag_section_anchors
)
954 error_at (loc
, "section anchors must be disabled when toplevel reorder"
956 opts
->x_flag_section_anchors
= 0;
959 if (!opts
->x_flag_opts_finished
)
961 /* We initialize opts->x_flag_pie to -1 so that targets can set a
963 if (opts
->x_flag_pie
== -1)
965 /* We initialize opts->x_flag_pic to -1 so that we can tell if
966 -fpic, -fPIC, -fno-pic or -fno-PIC is used. */
967 if (opts
->x_flag_pic
== -1)
968 opts
->x_flag_pie
= DEFAULT_FLAG_PIE
;
970 opts
->x_flag_pie
= 0;
972 /* If -fPIE or -fpie is used, turn on PIC. */
973 if (opts
->x_flag_pie
)
974 opts
->x_flag_pic
= opts
->x_flag_pie
;
975 else if (opts
->x_flag_pic
== -1)
976 opts
->x_flag_pic
= 0;
977 if (opts
->x_flag_pic
&& !opts
->x_flag_pie
)
978 opts
->x_flag_shlib
= 1;
979 opts
->x_flag_opts_finished
= true;
982 /* We initialize opts->x_flag_stack_protect to -1 so that targets
983 can set a default value. */
984 if (opts
->x_flag_stack_protect
== -1)
985 opts
->x_flag_stack_protect
= DEFAULT_FLAG_SSP
;
987 if (opts
->x_optimize
== 0)
989 /* Inlining does not work if not optimizing,
990 so force it not to be done. */
991 opts
->x_warn_inline
= 0;
992 opts
->x_flag_no_inline
= 1;
995 /* The optimization to partition hot and cold basic blocks into separate
996 sections of the .o and executable files does not work (currently)
997 with exception handling. This is because there is no support for
998 generating unwind info. If opts->x_flag_exceptions is turned on
999 we need to turn off the partitioning optimization. */
1001 ui_except
= targetm_common
.except_unwind_info (opts
);
1003 if (opts
->x_flag_exceptions
1004 && opts
->x_flag_reorder_blocks_and_partition
1005 && (ui_except
== UI_SJLJ
|| ui_except
>= UI_TARGET
))
1007 if (opts_set
->x_flag_reorder_blocks_and_partition
)
1009 "%<-freorder-blocks-and-partition%> does not work "
1010 "with exceptions on this architecture");
1011 opts
->x_flag_reorder_blocks_and_partition
= 0;
1012 opts
->x_flag_reorder_blocks
= 1;
1015 /* If user requested unwind info, then turn off the partitioning
1018 if (opts
->x_flag_unwind_tables
1019 && !targetm_common
.unwind_tables_default
1020 && opts
->x_flag_reorder_blocks_and_partition
1021 && (ui_except
== UI_SJLJ
|| ui_except
>= UI_TARGET
))
1023 if (opts_set
->x_flag_reorder_blocks_and_partition
)
1025 "%<-freorder-blocks-and-partition%> does not support "
1026 "unwind info on this architecture");
1027 opts
->x_flag_reorder_blocks_and_partition
= 0;
1028 opts
->x_flag_reorder_blocks
= 1;
1031 /* If the target requested unwind info, then turn off the partitioning
1032 optimization with a different message. Likewise, if the target does not
1033 support named sections. */
1035 if (opts
->x_flag_reorder_blocks_and_partition
1036 && (!targetm_common
.have_named_sections
1037 || (opts
->x_flag_unwind_tables
1038 && targetm_common
.unwind_tables_default
1039 && (ui_except
== UI_SJLJ
|| ui_except
>= UI_TARGET
))))
1041 if (opts_set
->x_flag_reorder_blocks_and_partition
)
1043 "%<-freorder-blocks-and-partition%> does not work "
1044 "on this architecture");
1045 opts
->x_flag_reorder_blocks_and_partition
= 0;
1046 opts
->x_flag_reorder_blocks
= 1;
1050 /* Pipelining of outer loops is only possible when general pipelining
1051 capabilities are requested. */
1052 if (!opts
->x_flag_sel_sched_pipelining
)
1053 opts
->x_flag_sel_sched_pipelining_outer_loops
= 0;
1055 if (opts
->x_flag_conserve_stack
)
1057 maybe_set_param_value (PARAM_LARGE_STACK_FRAME
, 100,
1058 opts
->x_param_values
, opts_set
->x_param_values
);
1059 maybe_set_param_value (PARAM_STACK_FRAME_GROWTH
, 40,
1060 opts
->x_param_values
, opts_set
->x_param_values
);
1063 if (opts
->x_flag_lto
)
1066 opts
->x_flag_generate_lto
= 1;
1068 /* When generating IL, do not operate in whole-program mode.
1069 Otherwise, symbols will be privatized too early, causing link
1071 opts
->x_flag_whole_program
= 0;
1073 error_at (loc
, "LTO support has not been enabled in this configuration");
1075 if (!opts
->x_flag_fat_lto_objects
1076 && (!HAVE_LTO_PLUGIN
1077 || (opts_set
->x_flag_use_linker_plugin
1078 && !opts
->x_flag_use_linker_plugin
)))
1080 if (opts_set
->x_flag_fat_lto_objects
)
1081 error_at (loc
, "%<-fno-fat-lto-objects%> are supported only with "
1083 opts
->x_flag_fat_lto_objects
= 1;
1086 /* -gsplit-dwarf isn't compatible with LTO, see PR88389. */
1087 if (opts
->x_dwarf_split_debug_info
)
1089 inform (loc
, "%<-gsplit-dwarf%> is not supported with LTO,"
1091 opts
->x_dwarf_split_debug_info
= 0;
1095 /* We initialize opts->x_flag_split_stack to -1 so that targets can set a
1096 default value if they choose based on other options. */
1097 if (opts
->x_flag_split_stack
== -1)
1098 opts
->x_flag_split_stack
= 0;
1099 else if (opts
->x_flag_split_stack
)
1101 if (!targetm_common
.supports_split_stack (true, opts
))
1103 error_at (loc
, "%<-fsplit-stack%> is not supported by "
1104 "this compiler configuration");
1105 opts
->x_flag_split_stack
= 0;
1109 /* If stack splitting is turned on, and the user did not explicitly
1110 request function partitioning, turn off partitioning, as it
1111 confuses the linker when trying to handle partitioned split-stack
1112 code that calls a non-split-stack functions. But if partitioning
1113 was turned on explicitly just hope for the best. */
1114 if (opts
->x_flag_split_stack
1115 && opts
->x_flag_reorder_blocks_and_partition
1116 && !opts_set
->x_flag_reorder_blocks_and_partition
)
1117 opts
->x_flag_reorder_blocks_and_partition
= 0;
1119 if (opts
->x_flag_reorder_blocks_and_partition
1120 && !opts_set
->x_flag_reorder_functions
)
1121 opts
->x_flag_reorder_functions
= 1;
1123 /* Tune vectorization related parametees according to cost model. */
1124 if (opts
->x_flag_vect_cost_model
== VECT_COST_MODEL_CHEAP
)
1126 maybe_set_param_value (PARAM_VECT_MAX_VERSION_FOR_ALIAS_CHECKS
,
1127 6, opts
->x_param_values
, opts_set
->x_param_values
);
1128 maybe_set_param_value (PARAM_VECT_MAX_VERSION_FOR_ALIGNMENT_CHECKS
,
1129 0, opts
->x_param_values
, opts_set
->x_param_values
);
1130 maybe_set_param_value (PARAM_VECT_MAX_PEELING_FOR_ALIGNMENT
,
1131 0, opts
->x_param_values
, opts_set
->x_param_values
);
1134 /* Set PARAM_MAX_STORES_TO_SINK to 0 if either vectorization or if-conversion
1136 if ((!opts
->x_flag_tree_loop_vectorize
&& !opts
->x_flag_tree_slp_vectorize
)
1137 || !opts
->x_flag_tree_loop_if_convert
)
1138 maybe_set_param_value (PARAM_MAX_STORES_TO_SINK
, 0,
1139 opts
->x_param_values
, opts_set
->x_param_values
);
1141 /* The -gsplit-dwarf option requires -ggnu-pubnames. */
1142 if (opts
->x_dwarf_split_debug_info
)
1143 opts
->x_debug_generate_pub_sections
= 2;
1145 if ((opts
->x_flag_sanitize
1146 & (SANITIZE_USER_ADDRESS
| SANITIZE_KERNEL_ADDRESS
)) == 0)
1148 if (opts
->x_flag_sanitize
& SANITIZE_POINTER_COMPARE
)
1150 "%<-fsanitize=pointer-compare%> must be combined with "
1151 "%<-fsanitize=address%> or %<-fsanitize=kernel-address%>");
1152 if (opts
->x_flag_sanitize
& SANITIZE_POINTER_SUBTRACT
)
1154 "%<-fsanitize=pointer-subtract%> must be combined with "
1155 "%<-fsanitize=address%> or %<-fsanitize=kernel-address%>");
1158 /* Userspace and kernel ASan conflict with each other. */
1159 if ((opts
->x_flag_sanitize
& SANITIZE_USER_ADDRESS
)
1160 && (opts
->x_flag_sanitize
& SANITIZE_KERNEL_ADDRESS
))
1162 "%<-fsanitize=address%> is incompatible with "
1163 "%<-fsanitize=kernel-address%>");
1165 /* And with TSan. */
1166 if ((opts
->x_flag_sanitize
& SANITIZE_ADDRESS
)
1167 && (opts
->x_flag_sanitize
& SANITIZE_THREAD
))
1169 "%<-fsanitize=address%> and %<-fsanitize=kernel-address%> "
1170 "are incompatible with %<-fsanitize=thread%>");
1172 if ((opts
->x_flag_sanitize
& SANITIZE_LEAK
)
1173 && (opts
->x_flag_sanitize
& SANITIZE_THREAD
))
1175 "%<-fsanitize=leak%> is incompatible with %<-fsanitize=thread%>");
1177 /* Check error recovery for -fsanitize-recover option. */
1178 for (int i
= 0; sanitizer_opts
[i
].name
!= NULL
; ++i
)
1179 if ((opts
->x_flag_sanitize_recover
& sanitizer_opts
[i
].flag
)
1180 && !sanitizer_opts
[i
].can_recover
)
1181 error_at (loc
, "%<-fsanitize-recover=%s%> is not supported",
1182 sanitizer_opts
[i
].name
);
1184 /* When instrumenting the pointers, we don't want to remove
1185 the null pointer checks. */
1186 if (opts
->x_flag_sanitize
& (SANITIZE_NULL
| SANITIZE_NONNULL_ATTRIBUTE
1187 | SANITIZE_RETURNS_NONNULL_ATTRIBUTE
))
1188 opts
->x_flag_delete_null_pointer_checks
= 0;
1190 /* Aggressive compiler optimizations may cause false negatives. */
1191 if (opts
->x_flag_sanitize
& ~(SANITIZE_LEAK
| SANITIZE_UNREACHABLE
))
1192 opts
->x_flag_aggressive_loop_optimizations
= 0;
1194 /* Enable -fsanitize-address-use-after-scope if address sanitizer is
1196 if ((opts
->x_flag_sanitize
& SANITIZE_USER_ADDRESS
)
1197 && !opts_set
->x_flag_sanitize_address_use_after_scope
)
1198 opts
->x_flag_sanitize_address_use_after_scope
= true;
1200 /* Force -fstack-reuse=none in case -fsanitize-address-use-after-scope
1202 if (opts
->x_flag_sanitize_address_use_after_scope
)
1204 if (opts
->x_flag_stack_reuse
!= SR_NONE
1205 && opts_set
->x_flag_stack_reuse
!= SR_NONE
)
1207 "%<-fsanitize-address-use-after-scope%> requires "
1208 "%<-fstack-reuse=none%> option");
1210 opts
->x_flag_stack_reuse
= SR_NONE
;
1213 if ((opts
->x_flag_sanitize
& SANITIZE_USER_ADDRESS
) && opts
->x_flag_tm
)
1214 sorry ("transactional memory is not supported with %<-fsanitize=address%>");
1216 if ((opts
->x_flag_sanitize
& SANITIZE_KERNEL_ADDRESS
) && opts
->x_flag_tm
)
1217 sorry ("transactional memory is not supported with "
1218 "%<-fsanitize=kernel-address%>");
1220 /* Currently live patching is not support for LTO. */
1221 if (opts
->x_flag_live_patching
&& opts
->x_flag_lto
)
1222 sorry ("live patching is not supported with LTO");
1224 /* Control IPA optimizations based on different -flive-patching level. */
1225 if (opts
->x_flag_live_patching
)
1227 control_options_for_live_patching (opts
, opts_set
,
1228 opts
->x_flag_live_patching
,
1233 #define LEFT_COLUMN 27
1235 /* Output ITEM, of length ITEM_WIDTH, in the left column,
1236 followed by word-wrapped HELP in a second column. */
1238 wrap_help (const char *help
,
1240 unsigned int item_width
,
1241 unsigned int columns
)
1243 unsigned int col_width
= LEFT_COLUMN
;
1244 unsigned int remaining
, room
, len
;
1246 remaining
= strlen (help
);
1250 room
= columns
- 3 - MAX (col_width
, item_width
);
1259 for (i
= 0; help
[i
]; i
++)
1261 if (i
>= room
&& len
!= remaining
)
1265 else if ((help
[i
] == '-' || help
[i
] == '/')
1266 && help
[i
+ 1] != ' '
1267 && i
> 0 && ISALPHA (help
[i
- 1]))
1272 printf (" %-*.*s %.*s\n", col_width
, item_width
, item
, len
, help
);
1274 while (help
[len
] == ' ')
1282 /* Data structure used to print list of valid option values. */
1284 struct option_help_tuple
1286 option_help_tuple (int code
, vec
<const char *> values
):
1287 m_code (code
), m_values (values
)
1290 /* Code of an option. */
1293 /* List of possible values. */
1294 vec
<const char *> m_values
;
1297 /* Print help for a specific front-end, etc. */
1299 print_filtered_help (unsigned int include_flags
,
1300 unsigned int exclude_flags
,
1301 unsigned int any_flags
,
1302 unsigned int columns
,
1303 struct gcc_options
*opts
,
1304 unsigned int lang_mask
)
1309 bool displayed
= false;
1312 if (include_flags
== CL_PARAMS
)
1314 for (i
= 0; i
< LAST_PARAM
; i
++)
1316 const char *param
= compiler_params
[i
].option
;
1318 help
= compiler_params
[i
].help
;
1319 if (help
== NULL
|| *help
== '\0')
1321 if (exclude_flags
& CL_UNDOCUMENTED
)
1323 help
= undocumented_msg
;
1326 /* Get the translation. */
1329 if (!opts
->x_quiet_flag
)
1331 snprintf (new_help
, sizeof (new_help
),
1332 _("default %d minimum %d maximum %d"),
1333 compiler_params
[i
].default_value
,
1334 compiler_params
[i
].min_value
,
1335 compiler_params
[i
].max_value
);
1338 wrap_help (help
, param
, strlen (param
), columns
);
1344 if (!opts
->x_help_printed
)
1345 opts
->x_help_printed
= XCNEWVAR (char, cl_options_count
);
1347 if (!opts
->x_help_enum_printed
)
1348 opts
->x_help_enum_printed
= XCNEWVAR (char, cl_enums_count
);
1350 auto_vec
<option_help_tuple
> help_tuples
;
1352 for (i
= 0; i
< cl_options_count
; i
++)
1354 const struct cl_option
*option
= cl_options
+ i
;
1359 if (include_flags
== 0
1360 || ((option
->flags
& include_flags
) != include_flags
))
1362 if ((option
->flags
& any_flags
) == 0)
1366 /* Skip unwanted switches. */
1367 if ((option
->flags
& exclude_flags
) != 0)
1370 /* The driver currently prints its own help text. */
1371 if ((option
->flags
& CL_DRIVER
) != 0
1372 && (option
->flags
& (((1U << cl_lang_count
) - 1)
1373 | CL_COMMON
| CL_TARGET
)) == 0)
1377 /* Skip switches that have already been printed. */
1378 if (opts
->x_help_printed
[i
])
1381 opts
->x_help_printed
[i
] = true;
1383 help
= option
->help
;
1386 if (exclude_flags
& CL_UNDOCUMENTED
)
1389 help
= undocumented_msg
;
1392 if (option
->alias_target
< N_OPTS
1393 && cl_options
[option
->alias_target
].help
)
1395 if (help
== undocumented_msg
)
1397 /* For undocumented options that are aliases for other options
1398 that are documented, point the reader to the other option in
1399 preference of the former. */
1400 snprintf (new_help
, sizeof new_help
,
1401 _("Same as %s. Use the latter option instead."),
1402 cl_options
[option
->alias_target
].opt_text
);
1406 /* For documented options with aliases, mention the aliased
1407 option's name for reference. */
1408 snprintf (new_help
, sizeof new_help
,
1409 _("%s Same as %s."),
1410 help
, cl_options
[option
->alias_target
].opt_text
);
1416 if (option
->warn_message
)
1418 /* Mention that the use of the option will trigger a warning. */
1419 if (help
== new_help
)
1420 snprintf (new_help
+ strlen (new_help
),
1421 sizeof new_help
- strlen (new_help
),
1422 " %s", _(use_diagnosed_msg
));
1424 snprintf (new_help
, sizeof new_help
,
1425 "%s %s", help
, _(use_diagnosed_msg
));
1430 /* Get the translation. */
1433 /* Find the gap between the name of the
1434 option and its descriptive text. */
1435 tab
= strchr (help
, '\t');
1444 opt
= option
->opt_text
;
1448 /* With the -Q option enabled we change the descriptive text associated
1449 with an option to be an indication of its current setting. */
1450 if (!opts
->x_quiet_flag
)
1452 void *flag_var
= option_flag_var (i
, opts
);
1454 if (len
< (LEFT_COLUMN
+ 2))
1455 strcpy (new_help
, "\t\t");
1457 strcpy (new_help
, "\t");
1459 if (flag_var
!= NULL
1460 && option
->var_type
!= CLVC_DEFER
)
1462 if (option
->flags
& CL_JOINED
)
1464 if (option
->var_type
== CLVC_STRING
)
1466 if (* (const char **) flag_var
!= NULL
)
1467 snprintf (new_help
+ strlen (new_help
),
1468 sizeof (new_help
) - strlen (new_help
),
1469 "%s", * (const char **) flag_var
);
1471 else if (option
->var_type
== CLVC_ENUM
)
1473 const struct cl_enum
*e
= &cl_enums
[option
->var_enum
];
1475 const char *arg
= NULL
;
1477 value
= e
->get (flag_var
);
1478 enum_value_to_arg (e
->values
, &arg
, value
, lang_mask
);
1480 arg
= _("[default]");
1481 snprintf (new_help
+ strlen (new_help
),
1482 sizeof (new_help
) - strlen (new_help
),
1486 sprintf (new_help
+ strlen (new_help
),
1487 "%d", * (int *) flag_var
);
1490 strcat (new_help
, option_enabled (i
, opts
)
1491 ? _("[enabled]") : _("[disabled]"));
1497 if (option
->range_max
!= -1)
1500 snprintf (b
, sizeof (b
), "<%d,%d>", option
->range_min
,
1502 opt
= concat (opt
, b
, NULL
);
1506 wrap_help (help
, opt
, len
, columns
);
1509 if (option
->var_type
== CLVC_ENUM
1510 && opts
->x_help_enum_printed
[option
->var_enum
] != 2)
1511 opts
->x_help_enum_printed
[option
->var_enum
] = 1;
1514 vec
<const char *> option_values
1515 = targetm_common
.get_valid_option_values (i
, NULL
);
1516 if (!option_values
.is_empty ())
1517 help_tuples
.safe_push (option_help_tuple (i
, option_values
));
1523 unsigned int langs
= include_flags
& CL_LANG_ALL
;
1526 printf (_(" No options with the desired characteristics were found\n"));
1531 /* PR 31349: Tell the user how to see all of the
1532 options supported by a specific front end. */
1533 for (i
= 0; (1U << i
) < CL_LANG_ALL
; i
++)
1534 if ((1U << i
) & langs
)
1535 printf (_(" None found. Use --help=%s to show *all* the options supported by the %s front-end.\n"),
1536 lang_names
[i
], lang_names
[i
]);
1540 else if (! displayed
)
1541 printf (_(" All options with the desired characteristics have already been displayed\n"));
1545 /* Print details of enumerated option arguments, if those
1546 enumerations have help text headings provided. If no help text
1547 is provided, presume that the possible values are listed in the
1548 help text for the relevant options. */
1549 for (i
= 0; i
< cl_enums_count
; i
++)
1551 unsigned int j
, pos
;
1553 if (opts
->x_help_enum_printed
[i
] != 1)
1555 if (cl_enums
[i
].help
== NULL
)
1557 printf (" %s\n ", _(cl_enums
[i
].help
));
1559 for (j
= 0; cl_enums
[i
].values
[j
].arg
!= NULL
; j
++)
1561 unsigned int len
= strlen (cl_enums
[i
].values
[j
].arg
);
1563 if (pos
> 4 && pos
+ 1 + len
<= columns
)
1565 printf (" %s", cl_enums
[i
].values
[j
].arg
);
1575 printf ("%s", cl_enums
[i
].values
[j
].arg
);
1580 opts
->x_help_enum_printed
[i
] = 2;
1583 for (unsigned i
= 0; i
< help_tuples
.length (); i
++)
1585 const struct cl_option
*option
= cl_options
+ help_tuples
[i
].m_code
;
1586 printf (_(" Known valid arguments for %s option:\n "),
1588 for (unsigned j
= 0; j
< help_tuples
[i
].m_values
.length (); j
++)
1589 printf (" %s", help_tuples
[i
].m_values
[j
]);
1594 /* Display help for a specified type of option.
1595 The options must have ALL of the INCLUDE_FLAGS set
1596 ANY of the flags in the ANY_FLAGS set
1597 and NONE of the EXCLUDE_FLAGS set. The current option state is in
1598 OPTS; LANG_MASK is used for interpreting enumerated option state. */
1600 print_specific_help (unsigned int include_flags
,
1601 unsigned int exclude_flags
,
1602 unsigned int any_flags
,
1603 struct gcc_options
*opts
,
1604 unsigned int lang_mask
)
1606 unsigned int all_langs_mask
= (1U << cl_lang_count
) - 1;
1607 const char * description
= NULL
;
1608 const char * descrip_extra
= "";
1612 /* Sanity check: Make sure that we do not have more
1613 languages than we have bits available to enumerate them. */
1614 gcc_assert ((1U << cl_lang_count
) <= CL_MIN_OPTION_CLASS
);
1616 /* If we have not done so already, obtain
1617 the desired maximum width of the output. */
1618 if (opts
->x_help_columns
== 0)
1620 opts
->x_help_columns
= get_terminal_width ();
1621 if (opts
->x_help_columns
== INT_MAX
)
1622 /* Use a reasonable default. */
1623 opts
->x_help_columns
= 80;
1626 /* Decide upon the title for the options that we are going to display. */
1627 for (i
= 0, flag
= 1; flag
<= CL_MAX_OPTION_CLASS
; flag
<<= 1, i
++)
1629 switch (flag
& include_flags
)
1636 description
= _("The following options are target specific");
1639 description
= _("The following options control compiler warning messages");
1641 case CL_OPTIMIZATION
:
1642 description
= _("The following options control optimizations");
1645 description
= _("The following options are language-independent");
1648 description
= _("The --param option recognizes the following as parameters");
1651 if (i
>= cl_lang_count
)
1653 if (exclude_flags
& all_langs_mask
)
1654 description
= _("The following options are specific to just the language ");
1656 description
= _("The following options are supported by the language ");
1657 descrip_extra
= lang_names
[i
];
1662 if (description
== NULL
)
1666 if (include_flags
& CL_UNDOCUMENTED
)
1667 description
= _("The following options are not documented");
1668 else if (include_flags
& CL_SEPARATE
)
1669 description
= _("The following options take separate arguments");
1670 else if (include_flags
& CL_JOINED
)
1671 description
= _("The following options take joined arguments");
1674 internal_error ("unrecognized %<include_flags 0x%x%> passed "
1675 "to %<print_specific_help%>",
1682 if (any_flags
& all_langs_mask
)
1683 description
= _("The following options are language-related");
1685 description
= _("The following options are language-independent");
1689 printf ("%s%s:\n", description
, descrip_extra
);
1690 print_filtered_help (include_flags
, exclude_flags
, any_flags
,
1691 opts
->x_help_columns
, opts
, lang_mask
);
1694 /* Enable FDO-related flags. */
1697 enable_fdo_optimizations (struct gcc_options
*opts
,
1698 struct gcc_options
*opts_set
,
1701 if (!opts_set
->x_flag_branch_probabilities
)
1702 opts
->x_flag_branch_probabilities
= value
;
1703 if (!opts_set
->x_flag_profile_values
)
1704 opts
->x_flag_profile_values
= value
;
1705 if (!opts_set
->x_flag_unroll_loops
)
1706 opts
->x_flag_unroll_loops
= value
;
1707 if (!opts_set
->x_flag_peel_loops
)
1708 opts
->x_flag_peel_loops
= value
;
1709 if (!opts_set
->x_flag_tracer
)
1710 opts
->x_flag_tracer
= value
;
1711 if (!opts_set
->x_flag_value_profile_transformations
)
1712 opts
->x_flag_value_profile_transformations
= value
;
1713 if (!opts_set
->x_flag_inline_functions
)
1714 opts
->x_flag_inline_functions
= value
;
1715 if (!opts_set
->x_flag_ipa_cp
)
1716 opts
->x_flag_ipa_cp
= value
;
1717 if (!opts_set
->x_flag_ipa_cp_clone
1718 && value
&& opts
->x_flag_ipa_cp
)
1719 opts
->x_flag_ipa_cp_clone
= value
;
1720 if (!opts_set
->x_flag_ipa_bit_cp
1721 && value
&& opts
->x_flag_ipa_cp
)
1722 opts
->x_flag_ipa_bit_cp
= value
;
1723 if (!opts_set
->x_flag_predictive_commoning
)
1724 opts
->x_flag_predictive_commoning
= value
;
1725 if (!opts_set
->x_flag_split_loops
)
1726 opts
->x_flag_split_loops
= value
;
1727 if (!opts_set
->x_flag_unswitch_loops
)
1728 opts
->x_flag_unswitch_loops
= value
;
1729 if (!opts_set
->x_flag_gcse_after_reload
)
1730 opts
->x_flag_gcse_after_reload
= value
;
1731 if (!opts_set
->x_flag_tree_loop_vectorize
)
1732 opts
->x_flag_tree_loop_vectorize
= value
;
1733 if (!opts_set
->x_flag_tree_slp_vectorize
)
1734 opts
->x_flag_tree_slp_vectorize
= value
;
1735 if (!opts_set
->x_flag_version_loops_for_strides
)
1736 opts
->x_flag_version_loops_for_strides
= value
;
1737 if (!opts_set
->x_flag_vect_cost_model
)
1738 opts
->x_flag_vect_cost_model
= VECT_COST_MODEL_DYNAMIC
;
1739 if (!opts_set
->x_flag_tree_loop_distribute_patterns
)
1740 opts
->x_flag_tree_loop_distribute_patterns
= value
;
1741 if (!opts_set
->x_flag_loop_interchange
)
1742 opts
->x_flag_loop_interchange
= value
;
1743 if (!opts_set
->x_flag_unroll_jam
)
1744 opts
->x_flag_unroll_jam
= value
;
1745 if (!opts_set
->x_flag_tree_loop_distribution
)
1746 opts
->x_flag_tree_loop_distribution
= value
;
1749 /* -f{,no-}sanitize{,-recover}= suboptions. */
1750 const struct sanitizer_opts_s sanitizer_opts
[] =
1752 #define SANITIZER_OPT(name, flags, recover) \
1753 { #name, flags, sizeof #name - 1, recover }
1754 SANITIZER_OPT (address
, (SANITIZE_ADDRESS
| SANITIZE_USER_ADDRESS
), true),
1755 SANITIZER_OPT (kernel
-address
, (SANITIZE_ADDRESS
| SANITIZE_KERNEL_ADDRESS
),
1757 SANITIZER_OPT (pointer
-compare
, SANITIZE_POINTER_COMPARE
, true),
1758 SANITIZER_OPT (pointer
-subtract
, SANITIZE_POINTER_SUBTRACT
, true),
1759 SANITIZER_OPT (thread
, SANITIZE_THREAD
, false),
1760 SANITIZER_OPT (leak
, SANITIZE_LEAK
, false),
1761 SANITIZER_OPT (shift
, SANITIZE_SHIFT
, true),
1762 SANITIZER_OPT (shift
-base
, SANITIZE_SHIFT_BASE
, true),
1763 SANITIZER_OPT (shift
-exponent
, SANITIZE_SHIFT_EXPONENT
, true),
1764 SANITIZER_OPT (integer
-divide
-by
-zero
, SANITIZE_DIVIDE
, true),
1765 SANITIZER_OPT (undefined
, SANITIZE_UNDEFINED
, true),
1766 SANITIZER_OPT (unreachable
, SANITIZE_UNREACHABLE
, false),
1767 SANITIZER_OPT (vla
-bound
, SANITIZE_VLA
, true),
1768 SANITIZER_OPT (return, SANITIZE_RETURN
, false),
1769 SANITIZER_OPT (null
, SANITIZE_NULL
, true),
1770 SANITIZER_OPT (signed-integer
-overflow
, SANITIZE_SI_OVERFLOW
, true),
1771 SANITIZER_OPT (bool, SANITIZE_BOOL
, true),
1772 SANITIZER_OPT (enum, SANITIZE_ENUM
, true),
1773 SANITIZER_OPT (float-divide
-by
-zero
, SANITIZE_FLOAT_DIVIDE
, true),
1774 SANITIZER_OPT (float-cast
-overflow
, SANITIZE_FLOAT_CAST
, true),
1775 SANITIZER_OPT (bounds
, SANITIZE_BOUNDS
, true),
1776 SANITIZER_OPT (bounds
-strict
, SANITIZE_BOUNDS
| SANITIZE_BOUNDS_STRICT
, true),
1777 SANITIZER_OPT (alignment
, SANITIZE_ALIGNMENT
, true),
1778 SANITIZER_OPT (nonnull
-attribute
, SANITIZE_NONNULL_ATTRIBUTE
, true),
1779 SANITIZER_OPT (returns
-nonnull
-attribute
, SANITIZE_RETURNS_NONNULL_ATTRIBUTE
,
1781 SANITIZER_OPT (object
-size
, SANITIZE_OBJECT_SIZE
, true),
1782 SANITIZER_OPT (vptr
, SANITIZE_VPTR
, true),
1783 SANITIZER_OPT (pointer
-overflow
, SANITIZE_POINTER_OVERFLOW
, true),
1784 SANITIZER_OPT (builtin
, SANITIZE_BUILTIN
, true),
1785 SANITIZER_OPT (all
, ~0U, true),
1786 #undef SANITIZER_OPT
1787 { NULL
, 0U, 0UL, false }
1790 /* -f{,no-}sanitize-coverage= suboptions. */
1791 const struct sanitizer_opts_s coverage_sanitizer_opts
[] =
1793 #define COVERAGE_SANITIZER_OPT(name, flags) \
1794 { #name, flags, sizeof #name - 1, true }
1795 COVERAGE_SANITIZER_OPT (trace
-pc
, SANITIZE_COV_TRACE_PC
),
1796 COVERAGE_SANITIZER_OPT (trace
-cmp
, SANITIZE_COV_TRACE_CMP
),
1797 #undef COVERAGE_SANITIZER_OPT
1798 { NULL
, 0U, 0UL, false }
1801 /* A struct for describing a run of chars within a string. */
1803 struct string_fragment
1805 string_fragment (const char *start
, size_t len
)
1806 : m_start (start
), m_len (len
) {}
1808 const char *m_start
;
1812 /* Specialization of edit_distance_traits for string_fragment,
1813 for use by get_closest_sanitizer_option. */
1816 struct edit_distance_traits
<const string_fragment
&>
1818 static size_t get_length (const string_fragment
&fragment
)
1820 return fragment
.m_len
;
1823 static const char *get_string (const string_fragment
&fragment
)
1825 return fragment
.m_start
;
1829 /* Given ARG, an unrecognized sanitizer option, return the best
1830 matching sanitizer option, or NULL if there isn't one.
1831 OPTS is array of candidate sanitizer options.
1832 CODE is OPT_fsanitize_, OPT_fsanitize_recover_ or
1833 OPT_fsanitize_coverage_.
1834 VALUE is non-zero for the regular form of the option, zero
1835 for the "no-" form (e.g. "-fno-sanitize-recover="). */
1838 get_closest_sanitizer_option (const string_fragment
&arg
,
1839 const struct sanitizer_opts_s
*opts
,
1840 enum opt_code code
, int value
)
1842 best_match
<const string_fragment
&, const char*> bm (arg
);
1843 for (int i
= 0; opts
[i
].name
!= NULL
; ++i
)
1845 /* -fsanitize=all is not valid, so don't offer it. */
1846 if (code
== OPT_fsanitize_
1847 && opts
[i
].flag
== ~0U
1851 /* For -fsanitize-recover= (and not -fno-sanitize-recover=),
1852 don't offer the non-recoverable options. */
1853 if (code
== OPT_fsanitize_recover_
1854 && !opts
[i
].can_recover
1858 bm
.consider (opts
[i
].name
);
1860 return bm
.get_best_meaningful_candidate ();
1863 /* Parse comma separated sanitizer suboptions from P for option SCODE,
1864 adjust previous FLAGS and return new ones. If COMPLAIN is false,
1865 don't issue diagnostics. */
1868 parse_sanitizer_options (const char *p
, location_t loc
, int scode
,
1869 unsigned int flags
, int value
, bool complain
)
1871 enum opt_code code
= (enum opt_code
) scode
;
1873 const struct sanitizer_opts_s
*opts
;
1874 if (code
== OPT_fsanitize_coverage_
)
1875 opts
= coverage_sanitizer_opts
;
1877 opts
= sanitizer_opts
;
1883 const char *comma
= strchr (p
, ',');
1895 /* Check to see if the string matches an option class name. */
1896 for (i
= 0; opts
[i
].name
!= NULL
; ++i
)
1897 if (len
== opts
[i
].len
&& memcmp (p
, opts
[i
].name
, len
) == 0)
1899 /* Handle both -fsanitize and -fno-sanitize cases. */
1900 if (value
&& opts
[i
].flag
== ~0U)
1902 if (code
== OPT_fsanitize_
)
1905 error_at (loc
, "%<-fsanitize=all%> option is not valid");
1908 flags
|= ~(SANITIZE_THREAD
| SANITIZE_LEAK
1909 | SANITIZE_UNREACHABLE
| SANITIZE_RETURN
);
1913 /* Do not enable -fsanitize-recover=unreachable and
1914 -fsanitize-recover=return if -fsanitize-recover=undefined
1916 if (code
== OPT_fsanitize_recover_
1917 && opts
[i
].flag
== SANITIZE_UNDEFINED
)
1918 flags
|= (SANITIZE_UNDEFINED
1919 & ~(SANITIZE_UNREACHABLE
| SANITIZE_RETURN
));
1921 flags
|= opts
[i
].flag
;
1924 flags
&= ~opts
[i
].flag
;
1929 if (! found
&& complain
)
1932 = get_closest_sanitizer_option (string_fragment (p
, len
),
1936 if (code
== OPT_fsanitize_recover_
)
1937 suffix
= "-recover";
1938 else if (code
== OPT_fsanitize_coverage_
)
1939 suffix
= "-coverage";
1945 "unrecognized argument to %<-f%ssanitize%s=%> "
1946 "option: %q.*s; did you mean %qs?",
1948 suffix
, (int) len
, p
, hint
);
1951 "unrecognized argument to %<-f%ssanitize%s=%> option: "
1952 "%q.*s", value
? "" : "no-",
1953 suffix
, (int) len
, p
);
1963 /* Parse string values of no_sanitize attribute passed in VALUE.
1964 Values are separated with comma. */
1967 parse_no_sanitize_attribute (char *value
)
1969 unsigned int flags
= 0;
1971 char *q
= strtok (value
, ",");
1975 for (i
= 0; sanitizer_opts
[i
].name
!= NULL
; ++i
)
1976 if (strcmp (sanitizer_opts
[i
].name
, q
) == 0)
1978 flags
|= sanitizer_opts
[i
].flag
;
1979 if (sanitizer_opts
[i
].flag
== SANITIZE_UNDEFINED
)
1980 flags
|= SANITIZE_UNDEFINED_NONDEFAULT
;
1984 if (sanitizer_opts
[i
].name
== NULL
)
1985 warning (OPT_Wattributes
,
1986 "%qs attribute directive ignored", q
);
1988 q
= strtok (NULL
, ",");
1994 /* Parse -falign-NAME format for a FLAG value. Return individual
1995 parsed integer values into RESULT_VALUES array. If REPORT_ERROR is
1996 set, print error message at LOC location. */
1999 parse_and_check_align_values (const char *flag
,
2001 auto_vec
<unsigned> &result_values
,
2005 char *str
= xstrdup (flag
);
2006 for (char *p
= strtok (str
, ":"); p
; p
= strtok (NULL
, ":"))
2009 int v
= strtol (p
, &end
, 10);
2010 if (*end
!= '\0' || v
< 0)
2013 error_at (loc
, "invalid arguments for %<-falign-%s%> option: %qs",
2019 result_values
.safe_push ((unsigned)v
);
2024 /* Check that we have a correct number of values. */
2026 unsigned max_valid_values
= 4;
2028 unsigned max_valid_values
= 2;
2031 if (result_values
.is_empty ()
2032 || result_values
.length () > max_valid_values
)
2035 error_at (loc
, "invalid number of arguments for %<-falign-%s%> "
2036 "option: %qs", name
, flag
);
2040 for (unsigned i
= 0; i
< result_values
.length (); i
++)
2041 if (result_values
[i
] > MAX_CODE_ALIGN_VALUE
)
2044 error_at (loc
, "%<-falign-%s%> is not between 0 and %d",
2045 name
, MAX_CODE_ALIGN_VALUE
);
2052 /* Check that alignment value FLAG for -falign-NAME is valid at a given
2056 check_alignment_argument (location_t loc
, const char *flag
, const char *name
)
2058 auto_vec
<unsigned> align_result
;
2059 parse_and_check_align_values (flag
, name
, align_result
, true, loc
);
2062 /* Print help when OPT__help_ is set. */
2065 print_help (struct gcc_options
*opts
, unsigned int lang_mask
)
2067 const char *a
= help_option_argument
;
2068 unsigned int include_flags
= 0;
2069 /* Note - by default we include undocumented options when listing
2070 specific classes. If you only want to see documented options
2071 then add ",^undocumented" to the --help= option. E.g.:
2073 --help=target,^undocumented */
2074 unsigned int exclude_flags
= 0;
2076 if (lang_mask
== CL_DRIVER
)
2079 /* Walk along the argument string, parsing each word in turn.
2081 arg = [^]{word}[,{arg}]
2082 word = {optimizers|target|warnings|undocumented|
2083 params|common|<language>} */
2093 { "optimizers", CL_OPTIMIZATION
},
2094 { "target", CL_TARGET
},
2095 { "warnings", CL_WARNING
},
2096 { "undocumented", CL_UNDOCUMENTED
},
2097 { "params", CL_PARAMS
},
2098 { "joined", CL_JOINED
},
2099 { "separate", CL_SEPARATE
},
2100 { "common", CL_COMMON
},
2103 unsigned int *pflags
;
2105 unsigned int lang_flag
, specific_flag
;
2114 error ("missing argument to %qs", "--help=^");
2117 pflags
= &exclude_flags
;
2120 pflags
= &include_flags
;
2122 comma
= strchr (a
, ',');
2133 /* Check to see if the string matches an option class name. */
2134 for (i
= 0, specific_flag
= 0; specifics
[i
].string
!= NULL
; i
++)
2135 if (strncasecmp (a
, specifics
[i
].string
, len
) == 0)
2137 specific_flag
= specifics
[i
].flag
;
2141 /* Check to see if the string matches a language name.
2142 Note - we rely upon the alpha-sorted nature of the entries in
2143 the lang_names array, specifically that shorter names appear
2144 before their longer variants. (i.e. C before C++). That way
2145 when we are attempting to match --help=c for example we will
2146 match with C first and not C++. */
2147 for (i
= 0, lang_flag
= 0; i
< cl_lang_count
; i
++)
2148 if (strncasecmp (a
, lang_names
[i
], len
) == 0)
2150 lang_flag
= 1U << i
;
2154 if (specific_flag
!= 0)
2157 *pflags
|= specific_flag
;
2160 /* The option's argument matches both the start of a
2161 language name and the start of an option class name.
2162 We have a special case for when the user has
2163 specified "--help=c", but otherwise we have to issue
2165 if (strncasecmp (a
, "c", len
) == 0)
2166 *pflags
|= lang_flag
;
2169 "%<--help%> argument %q.*s is ambiguous, "
2170 "please be more specific",
2174 else if (lang_flag
!= 0)
2175 *pflags
|= lang_flag
;
2178 "unrecognized argument to %<--help=%> option: %q.*s",
2187 print_specific_help (include_flags
, exclude_flags
, 0, opts
,
2191 /* Handle target- and language-independent options. Return zero to
2192 generate an "unknown option" message. Only options that need
2193 extra handling need to be listed here; if you simply want
2194 DECODED->value assigned to a variable, it happens automatically. */
2197 common_handle_option (struct gcc_options
*opts
,
2198 struct gcc_options
*opts_set
,
2199 const struct cl_decoded_option
*decoded
,
2200 unsigned int lang_mask
, int kind ATTRIBUTE_UNUSED
,
2202 const struct cl_option_handlers
*handlers
,
2203 diagnostic_context
*dc
,
2204 void (*target_option_override_hook
) (void))
2206 size_t scode
= decoded
->opt_index
;
2207 const char *arg
= decoded
->arg
;
2208 HOST_WIDE_INT value
= decoded
->value
;
2209 enum opt_code code
= (enum opt_code
) scode
;
2211 gcc_assert (decoded
->canonical_option_num_elements
<= 2);
2216 handle_param (opts
, opts_set
, loc
, arg
);
2221 unsigned int all_langs_mask
= (1U << cl_lang_count
) - 1;
2222 unsigned int undoc_mask
;
2225 if (lang_mask
== CL_DRIVER
)
2228 undoc_mask
= ((opts
->x_verbose_flag
| opts
->x_extra_warnings
)
2231 target_option_override_hook ();
2232 /* First display any single language specific options. */
2233 for (i
= 0; i
< cl_lang_count
; i
++)
2235 (1U << i
, (all_langs_mask
& (~ (1U << i
))) | undoc_mask
, 0, opts
,
2237 /* Next display any multi language specific options. */
2238 print_specific_help (0, undoc_mask
, all_langs_mask
, opts
, lang_mask
);
2239 /* Then display any remaining, non-language options. */
2240 for (i
= CL_MIN_OPTION_CLASS
; i
<= CL_MAX_OPTION_CLASS
; i
<<= 1)
2242 print_specific_help (i
, undoc_mask
, 0, opts
, lang_mask
);
2243 opts
->x_exit_after_options
= true;
2247 case OPT__target_help
:
2248 if (lang_mask
== CL_DRIVER
)
2251 target_option_override_hook ();
2252 print_specific_help (CL_TARGET
, CL_UNDOCUMENTED
, 0, opts
, lang_mask
);
2253 opts
->x_exit_after_options
= true;
2258 help_option_argument
= arg
;
2259 opts
->x_exit_after_options
= true;
2264 if (lang_mask
== CL_DRIVER
)
2267 opts
->x_exit_after_options
= true;
2270 case OPT__completion_
:
2273 case OPT_fsanitize_
:
2274 opts
->x_flag_sanitize
2275 = parse_sanitizer_options (arg
, loc
, code
,
2276 opts
->x_flag_sanitize
, value
, true);
2278 /* Kernel ASan implies normal ASan but does not yet support
2280 if (opts
->x_flag_sanitize
& SANITIZE_KERNEL_ADDRESS
)
2282 maybe_set_param_value (PARAM_ASAN_INSTRUMENTATION_WITH_CALL_THRESHOLD
,
2283 0, opts
->x_param_values
,
2284 opts_set
->x_param_values
);
2285 maybe_set_param_value (PARAM_ASAN_GLOBALS
, 0, opts
->x_param_values
,
2286 opts_set
->x_param_values
);
2287 maybe_set_param_value (PARAM_ASAN_STACK
, 0, opts
->x_param_values
,
2288 opts_set
->x_param_values
);
2289 maybe_set_param_value (PARAM_ASAN_PROTECT_ALLOCAS
, 0,
2290 opts
->x_param_values
,
2291 opts_set
->x_param_values
);
2292 maybe_set_param_value (PARAM_ASAN_USE_AFTER_RETURN
, 0,
2293 opts
->x_param_values
,
2294 opts_set
->x_param_values
);
2298 case OPT_fsanitize_recover_
:
2299 opts
->x_flag_sanitize_recover
2300 = parse_sanitizer_options (arg
, loc
, code
,
2301 opts
->x_flag_sanitize_recover
, value
, true);
2304 case OPT_fasan_shadow_offset_
:
2308 case OPT_fsanitize_address_use_after_scope
:
2309 opts
->x_flag_sanitize_address_use_after_scope
= value
;
2312 case OPT_fsanitize_recover
:
2314 opts
->x_flag_sanitize_recover
2315 |= (SANITIZE_UNDEFINED
| SANITIZE_UNDEFINED_NONDEFAULT
)
2316 & ~(SANITIZE_UNREACHABLE
| SANITIZE_RETURN
);
2318 opts
->x_flag_sanitize_recover
2319 &= ~(SANITIZE_UNDEFINED
| SANITIZE_UNDEFINED_NONDEFAULT
);
2322 case OPT_fsanitize_coverage_
:
2323 opts
->x_flag_sanitize_coverage
2324 = parse_sanitizer_options (arg
, loc
, code
,
2325 opts
->x_flag_sanitize_coverage
, value
, true);
2332 /* Currently handled in a prescan. */
2336 dc
->warning_as_error_requested
= value
;
2340 if (lang_mask
== CL_DRIVER
)
2343 enable_warning_as_error (arg
, value
, lang_mask
, handlers
,
2344 opts
, opts_set
, loc
, dc
);
2347 case OPT_Wfatal_errors
:
2348 dc
->fatal_errors
= value
;
2351 case OPT_Wstack_usage_
:
2352 opts
->x_flag_stack_usage_info
= value
!= -1;
2355 case OPT_Wstrict_aliasing
:
2356 set_Wstrict_aliasing (opts
, value
);
2359 case OPT_Wstrict_overflow
:
2360 opts
->x_warn_strict_overflow
= (value
2361 ? (int) WARN_STRICT_OVERFLOW_CONDITIONAL
2365 case OPT_Wsystem_headers
:
2366 dc
->dc_warn_system_headers
= value
;
2370 opts
->x_flag_gen_aux_info
= 1;
2373 case OPT_auxbase_strip
:
2375 char *tmp
= xstrdup (arg
);
2376 strip_off_ending (tmp
, strlen (tmp
));
2378 opts
->x_aux_base_name
= tmp
;
2385 decode_d_option (arg
, opts
, loc
, dc
);
2388 case OPT_fcall_used_
:
2389 case OPT_fcall_saved_
:
2397 case OPT_fdbg_cnt_list
:
2399 opts
->x_exit_after_options
= true;
2402 case OPT_fdebug_prefix_map_
:
2403 case OPT_ffile_prefix_map_
:
2407 case OPT_fdiagnostics_show_location_
:
2408 diagnostic_prefixing_rule (dc
) = (diagnostic_prefixing_rule_t
) value
;
2411 case OPT_fdiagnostics_show_caret
:
2412 dc
->show_caret
= value
;
2415 case OPT_fdiagnostics_show_labels
:
2416 dc
->show_labels_p
= value
;
2419 case OPT_fdiagnostics_show_line_numbers
:
2420 dc
->show_line_numbers_p
= value
;
2423 case OPT_fdiagnostics_color_
:
2424 diagnostic_color_init (dc
, value
);
2427 case OPT_fdiagnostics_format_
:
2428 diagnostic_output_format_init (dc
,
2429 (enum diagnostics_output_format
)value
);
2432 case OPT_fdiagnostics_parseable_fixits
:
2433 dc
->parseable_fixits_p
= value
;
2436 case OPT_fdiagnostics_show_option
:
2437 dc
->show_option_requested
= value
;
2440 case OPT_fdiagnostics_minimum_margin_width_
:
2441 dc
->min_margin_width
= value
;
2448 case OPT_ffast_math
:
2449 set_fast_math_flags (opts
, value
);
2452 case OPT_funsafe_math_optimizations
:
2453 set_unsafe_math_optimizations_flags (opts
, value
);
2460 case OPT_finline_limit_
:
2461 set_param_value ("max-inline-insns-single", value
/ 2,
2462 opts
->x_param_values
, opts_set
->x_param_values
);
2463 set_param_value ("max-inline-insns-auto", value
/ 2,
2464 opts
->x_param_values
, opts_set
->x_param_values
);
2467 case OPT_finstrument_functions_exclude_function_list_
:
2468 add_comma_separated_to_vector
2469 (&opts
->x_flag_instrument_functions_exclude_functions
, arg
);
2472 case OPT_finstrument_functions_exclude_file_list_
:
2473 add_comma_separated_to_vector
2474 (&opts
->x_flag_instrument_functions_exclude_files
, arg
);
2477 case OPT_fmessage_length_
:
2478 pp_set_line_maximum_length (dc
->printer
, value
);
2479 diagnostic_set_caret_max_width (dc
, value
);
2483 case OPT_fopt_info_
:
2489 const char *p
= arg
;
2490 opts
->x_flag_disable_hsa
= true;
2493 const char *comma
= strchr (p
, ',');
2495 if ((strncmp (p
, "disable", 7) == 0)
2496 && (p
[7] == ',' || p
[7] == '\0'))
2498 opts
->x_flag_disable_hsa
= true;
2502 if ((strncmp (p
, "hsa", 3) == 0)
2503 && (p
[3] == ',' || p
[3] == '\0'))
2506 opts
->x_flag_disable_hsa
= false;
2508 sorry ("HSA has not been enabled during configuration");
2518 #ifndef ACCEL_COMPILER
2519 case OPT_foffload_abi_
:
2520 error_at (loc
, "%<-foffload-abi%> option can be specified only for "
2521 "offload compiler");
2525 case OPT_fpack_struct_
:
2526 if (value
<= 0 || (value
& (value
- 1)) || value
> 16)
2528 "structure alignment must be a small power of two, not %wu",
2531 opts
->x_initial_max_fld_align
= value
;
2535 case OPT_fplugin_arg_
:
2539 case OPT_fprofile_use_
:
2540 opts
->x_profile_data_prefix
= xstrdup (arg
);
2541 opts
->x_flag_profile_use
= true;
2543 /* No break here - do -fprofile-use processing. */
2545 case OPT_fprofile_use
:
2546 enable_fdo_optimizations (opts
, opts_set
, value
);
2547 if (!opts_set
->x_flag_profile_reorder_functions
)
2548 opts
->x_flag_profile_reorder_functions
= value
;
2549 /* Indirect call profiling should do all useful transformations
2550 speculative devirtualization does. */
2551 if (!opts_set
->x_flag_devirtualize_speculatively
2552 && opts
->x_flag_value_profile_transformations
)
2553 opts
->x_flag_devirtualize_speculatively
= false;
2556 case OPT_fauto_profile_
:
2557 opts
->x_auto_profile_file
= xstrdup (arg
);
2558 opts
->x_flag_auto_profile
= true;
2560 /* No break here - do -fauto-profile processing. */
2562 case OPT_fauto_profile
:
2563 enable_fdo_optimizations (opts
, opts_set
, value
);
2564 if (!opts_set
->x_flag_profile_correction
)
2565 opts
->x_flag_profile_correction
= value
;
2566 maybe_set_param_value (
2567 PARAM_EARLY_INLINER_MAX_ITERATIONS
, 10,
2568 opts
->x_param_values
, opts_set
->x_param_values
);
2571 case OPT_fprofile_generate_
:
2572 opts
->x_profile_data_prefix
= xstrdup (arg
);
2574 /* No break here - do -fprofile-generate processing. */
2576 case OPT_fprofile_generate
:
2577 if (!opts_set
->x_profile_arc_flag
)
2578 opts
->x_profile_arc_flag
= value
;
2579 if (!opts_set
->x_flag_profile_values
)
2580 opts
->x_flag_profile_values
= value
;
2581 if (!opts_set
->x_flag_inline_functions
)
2582 opts
->x_flag_inline_functions
= value
;
2583 if (!opts_set
->x_flag_ipa_bit_cp
)
2584 opts
->x_flag_ipa_bit_cp
= value
;
2585 /* FIXME: Instrumentation we insert makes ipa-reference bitmaps
2586 quadratic. Disable the pass until better memory representation
2588 if (!opts_set
->x_flag_ipa_reference
)
2589 opts
->x_flag_ipa_reference
= false;
2592 case OPT_fpatchable_function_entry_
:
2594 char *patch_area_arg
= xstrdup (arg
);
2595 char *comma
= strchr (patch_area_arg
, ',');
2599 function_entry_patch_area_size
=
2600 integral_argument (patch_area_arg
);
2601 function_entry_patch_area_start
=
2602 integral_argument (comma
+ 1);
2606 function_entry_patch_area_size
=
2607 integral_argument (patch_area_arg
);
2608 function_entry_patch_area_start
= 0;
2610 if (function_entry_patch_area_size
< 0
2611 || function_entry_patch_area_start
< 0
2612 || function_entry_patch_area_size
2613 < function_entry_patch_area_start
)
2614 error ("invalid arguments for %<-fpatchable_function_entry%>");
2615 free (patch_area_arg
);
2619 case OPT_ftree_vectorize
:
2620 /* Automatically sets -ftree-loop-vectorize and
2621 -ftree-slp-vectorize. Nothing more to do here. */
2623 case OPT_fshow_column
:
2624 dc
->show_column
= value
;
2627 case OPT_frandom_seed
:
2628 /* The real switch is -fno-random-seed. */
2634 case OPT_frandom_seed_
:
2638 case OPT_fsched_verbose_
:
2639 #ifdef INSN_SCHEDULING
2640 /* Handled with Var in common.opt. */
2646 case OPT_fsched_stalled_insns_
:
2647 opts
->x_flag_sched_stalled_insns
= value
;
2648 if (opts
->x_flag_sched_stalled_insns
== 0)
2649 opts
->x_flag_sched_stalled_insns
= -1;
2652 case OPT_fsched_stalled_insns_dep_
:
2653 opts
->x_flag_sched_stalled_insns_dep
= value
;
2656 case OPT_fstack_check_
:
2657 if (!strcmp (arg
, "no"))
2658 opts
->x_flag_stack_check
= NO_STACK_CHECK
;
2659 else if (!strcmp (arg
, "generic"))
2660 /* This is the old stack checking method. */
2661 opts
->x_flag_stack_check
= STACK_CHECK_BUILTIN
2662 ? FULL_BUILTIN_STACK_CHECK
2663 : GENERIC_STACK_CHECK
;
2664 else if (!strcmp (arg
, "specific"))
2665 /* This is the new stack checking method. */
2666 opts
->x_flag_stack_check
= STACK_CHECK_BUILTIN
2667 ? FULL_BUILTIN_STACK_CHECK
2668 : STACK_CHECK_STATIC_BUILTIN
2669 ? STATIC_BUILTIN_STACK_CHECK
2670 : GENERIC_STACK_CHECK
;
2672 warning_at (loc
, 0, "unknown stack check parameter %qs", arg
);
2675 case OPT_fstack_limit
:
2676 /* The real switch is -fno-stack-limit. */
2682 case OPT_fstack_limit_register_
:
2683 case OPT_fstack_limit_symbol_
:
2687 case OPT_fstack_usage
:
2688 opts
->x_flag_stack_usage
= value
;
2689 opts
->x_flag_stack_usage_info
= value
!= 0;
2693 set_debug_level (NO_DEBUG
, DEFAULT_GDB_EXTENSIONS
, arg
, opts
, opts_set
,
2698 if (arg
&& strlen (arg
) != 0)
2700 error_at (loc
, "%<-gdwarf%s%> is ambiguous; "
2701 "use %<-gdwarf-%s%> for DWARF version "
2702 "or %<-gdwarf%> %<-g%s%> for debug level", arg
, arg
, arg
);
2706 value
= opts
->x_dwarf_version
;
2710 if (value
< 2 || value
> 5)
2711 error_at (loc
, "dwarf version %wu is not supported", value
);
2713 opts
->x_dwarf_version
= value
;
2714 set_debug_level (DWARF2_DEBUG
, false, "", opts
, opts_set
, loc
);
2717 case OPT_gsplit_dwarf
:
2718 set_debug_level (NO_DEBUG
, DEFAULT_GDB_EXTENSIONS
, "", opts
, opts_set
,
2723 set_debug_level (NO_DEBUG
, 2, arg
, opts
, opts_set
, loc
);
2728 set_debug_level (DBX_DEBUG
, code
== OPT_gstabs_
, arg
, opts
, opts_set
,
2733 set_debug_level (VMS_DEBUG
, false, arg
, opts
, opts_set
, loc
);
2738 set_debug_level (XCOFF_DEBUG
, code
== OPT_gxcoff_
, arg
, opts
, opts_set
,
2744 /* Handled completely via specs. */
2747 case OPT_pedantic_errors
:
2748 dc
->pedantic_errors
= 1;
2749 control_warning_option (OPT_Wpedantic
, DK_ERROR
, NULL
, value
,
2751 handlers
, opts
, opts_set
,
2756 opts
->x_flag_lto
= value
? "" : NULL
;
2760 dc
->dc_inhibit_warnings
= true;
2763 case OPT_fmax_errors_
:
2764 dc
->max_errors
= value
;
2767 case OPT_fuse_ld_bfd
:
2768 case OPT_fuse_ld_gold
:
2769 case OPT_fuse_ld_lld
:
2770 case OPT_fuse_linker_plugin
:
2771 /* No-op. Used by the driver and passed to us because it starts with f.*/
2776 opts
->x_flag_trapv
= 0;
2781 opts
->x_flag_wrapv
= 0;
2784 case OPT_fstrict_overflow
:
2785 opts
->x_flag_wrapv
= !value
;
2786 opts
->x_flag_wrapv_pointer
= !value
;
2788 opts
->x_flag_trapv
= 0;
2792 opts
->x_flag_ipa_icf_functions
= value
;
2793 opts
->x_flag_ipa_icf_variables
= value
;
2796 case OPT_falign_loops_
:
2797 check_alignment_argument (loc
, arg
, "loops");
2800 case OPT_falign_jumps_
:
2801 check_alignment_argument (loc
, arg
, "jumps");
2804 case OPT_falign_labels_
:
2805 check_alignment_argument (loc
, arg
, "labels");
2808 case OPT_falign_functions_
:
2809 check_alignment_argument (loc
, arg
, "functions");
2813 /* If the flag was handled in a standard way, assume the lack of
2814 processing here is intentional. */
2815 gcc_assert (option_flag_var (scode
, opts
));
2819 common_handle_option_auto (opts
, opts_set
, decoded
, lang_mask
, kind
,
2824 /* Handle --param NAME=VALUE. */
2826 handle_param (struct gcc_options
*opts
, struct gcc_options
*opts_set
,
2827 location_t loc
, const char *carg
)
2832 arg
= xstrdup (carg
);
2833 equal
= strchr (arg
, '=');
2835 error_at (loc
, "%s: %qs arguments should be of the form NAME=VALUE",
2841 enum compiler_param index
;
2842 if (!find_param (arg
, &index
))
2844 const char *suggestion
= find_param_fuzzy (arg
);
2846 error_at (loc
, "invalid %qs name %qs; did you mean %qs?",
2847 "--param", arg
, suggestion
);
2849 error_at (loc
, "invalid %qs name %qs", "--param", arg
);
2853 if (!param_string_value_p (index
, equal
+ 1, &value
))
2854 value
= integral_argument (equal
+ 1);
2857 error_at (loc
, "invalid %qs value %qs", "--param", equal
+ 1);
2859 set_param_value (arg
, value
,
2860 opts
->x_param_values
, opts_set
->x_param_values
);
2867 /* Used to set the level of strict aliasing warnings in OPTS,
2868 when no level is specified (i.e., when -Wstrict-aliasing, and not
2869 -Wstrict-aliasing=level was given).
2870 ONOFF is assumed to take value 1 when -Wstrict-aliasing is specified,
2871 and 0 otherwise. After calling this function, wstrict_aliasing will be
2872 set to the default value of -Wstrict_aliasing=level, currently 3. */
2874 set_Wstrict_aliasing (struct gcc_options
*opts
, int onoff
)
2876 gcc_assert (onoff
== 0 || onoff
== 1);
2878 opts
->x_warn_strict_aliasing
= 3;
2880 opts
->x_warn_strict_aliasing
= 0;
2883 /* The following routines are useful in setting all the flags that
2884 -ffast-math and -fno-fast-math imply. */
2886 set_fast_math_flags (struct gcc_options
*opts
, int set
)
2888 if (!opts
->frontend_set_flag_unsafe_math_optimizations
)
2890 opts
->x_flag_unsafe_math_optimizations
= set
;
2891 set_unsafe_math_optimizations_flags (opts
, set
);
2893 if (!opts
->frontend_set_flag_finite_math_only
)
2894 opts
->x_flag_finite_math_only
= set
;
2895 if (!opts
->frontend_set_flag_errno_math
)
2896 opts
->x_flag_errno_math
= !set
;
2899 if (opts
->frontend_set_flag_excess_precision_cmdline
2900 == EXCESS_PRECISION_DEFAULT
)
2901 opts
->x_flag_excess_precision_cmdline
2902 = set
? EXCESS_PRECISION_FAST
: EXCESS_PRECISION_DEFAULT
;
2903 if (!opts
->frontend_set_flag_signaling_nans
)
2904 opts
->x_flag_signaling_nans
= 0;
2905 if (!opts
->frontend_set_flag_rounding_math
)
2906 opts
->x_flag_rounding_math
= 0;
2907 if (!opts
->frontend_set_flag_cx_limited_range
)
2908 opts
->x_flag_cx_limited_range
= 1;
2912 /* When -funsafe-math-optimizations is set the following
2913 flags are set as well. */
2915 set_unsafe_math_optimizations_flags (struct gcc_options
*opts
, int set
)
2917 if (!opts
->frontend_set_flag_trapping_math
)
2918 opts
->x_flag_trapping_math
= !set
;
2919 if (!opts
->frontend_set_flag_signed_zeros
)
2920 opts
->x_flag_signed_zeros
= !set
;
2921 if (!opts
->frontend_set_flag_associative_math
)
2922 opts
->x_flag_associative_math
= set
;
2923 if (!opts
->frontend_set_flag_reciprocal_math
)
2924 opts
->x_flag_reciprocal_math
= set
;
2927 /* Return true iff flags in OPTS are set as if -ffast-math. */
2929 fast_math_flags_set_p (const struct gcc_options
*opts
)
2931 return (!opts
->x_flag_trapping_math
2932 && opts
->x_flag_unsafe_math_optimizations
2933 && opts
->x_flag_finite_math_only
2934 && !opts
->x_flag_signed_zeros
2935 && !opts
->x_flag_errno_math
2936 && opts
->x_flag_excess_precision_cmdline
2937 == EXCESS_PRECISION_FAST
);
2940 /* Return true iff flags are set as if -ffast-math but using the flags stored
2941 in the struct cl_optimization structure. */
2943 fast_math_flags_struct_set_p (struct cl_optimization
*opt
)
2945 return (!opt
->x_flag_trapping_math
2946 && opt
->x_flag_unsafe_math_optimizations
2947 && opt
->x_flag_finite_math_only
2948 && !opt
->x_flag_signed_zeros
2949 && !opt
->x_flag_errno_math
);
2952 /* Handle a debug output -g switch for options OPTS
2953 (OPTS_SET->x_write_symbols storing whether a debug type was passed
2954 explicitly), location LOC. EXTENDED is true or false to support
2955 extended output (2 is special and means "-ggdb" was given). */
2957 set_debug_level (enum debug_info_type type
, int extended
, const char *arg
,
2958 struct gcc_options
*opts
, struct gcc_options
*opts_set
,
2961 opts
->x_use_gnu_debug_info_extensions
= extended
;
2963 if (type
== NO_DEBUG
)
2965 if (opts
->x_write_symbols
== NO_DEBUG
)
2967 opts
->x_write_symbols
= PREFERRED_DEBUGGING_TYPE
;
2971 #if defined DWARF2_DEBUGGING_INFO || defined DWARF2_LINENO_DEBUGGING_INFO
2972 opts
->x_write_symbols
= DWARF2_DEBUG
;
2973 #elif defined DBX_DEBUGGING_INFO
2974 opts
->x_write_symbols
= DBX_DEBUG
;
2978 if (opts
->x_write_symbols
== NO_DEBUG
)
2979 warning_at (loc
, 0, "target system does not support debug output");
2984 /* Does it conflict with an already selected type? */
2985 if (opts_set
->x_write_symbols
!= NO_DEBUG
2986 && opts
->x_write_symbols
!= NO_DEBUG
2987 && type
!= opts
->x_write_symbols
)
2988 error_at (loc
, "debug format %qs conflicts with prior selection",
2989 debug_type_names
[type
]);
2990 opts
->x_write_symbols
= type
;
2991 opts_set
->x_write_symbols
= type
;
2994 /* A debug flag without a level defaults to level 2.
2995 If off or at level 1, set it to level 2, but if already
2996 at level 3, don't lower it. */
2999 if (opts
->x_debug_info_level
< DINFO_LEVEL_NORMAL
)
3000 opts
->x_debug_info_level
= DINFO_LEVEL_NORMAL
;
3004 int argval
= integral_argument (arg
);
3006 error_at (loc
, "unrecognized debug output level %qs", arg
);
3007 else if (argval
> 3)
3008 error_at (loc
, "debug output level %qs is too high", arg
);
3010 opts
->x_debug_info_level
= (enum debug_info_levels
) argval
;
3014 /* Arrange to dump core on error for diagnostic context DC. (The
3015 regular error message is still printed first, except in the case of
3019 setup_core_dumping (diagnostic_context
*dc
)
3022 signal (SIGABRT
, SIG_DFL
);
3024 #if defined(HAVE_SETRLIMIT)
3027 if (getrlimit (RLIMIT_CORE
, &rlim
) != 0)
3028 fatal_error (input_location
, "getting core file size maximum limit: %m");
3029 rlim
.rlim_cur
= rlim
.rlim_max
;
3030 if (setrlimit (RLIMIT_CORE
, &rlim
) != 0)
3031 fatal_error (input_location
,
3032 "setting core file size limit to maximum: %m");
3035 diagnostic_abort_on_error (dc
);
3038 /* Parse a -d<ARG> command line switch for OPTS, location LOC,
3039 diagnostic context DC. */
3042 decode_d_option (const char *arg
, struct gcc_options
*opts
,
3043 location_t loc
, diagnostic_context
*dc
)
3051 opts
->x_flag_debug_asm
= 1;
3054 opts
->x_flag_print_asm_name
= 1;
3057 opts
->x_flag_dump_rtl_in_asm
= 1;
3058 opts
->x_flag_print_asm_name
= 1;
3061 opts
->x_rtl_dump_and_exit
= 1;
3063 case 'D': /* These are handled by the preprocessor. */
3070 setup_core_dumping (dc
);
3073 opts
->x_flag_dump_all_passed
= true;
3077 warning_at (loc
, 0, "unrecognized gcc debugging option: %c", c
);
3082 /* Enable (or disable if VALUE is 0) a warning option ARG (language
3083 mask LANG_MASK, option handlers HANDLERS) as an error for option
3084 structures OPTS and OPTS_SET, diagnostic context DC (possibly
3085 NULL), location LOC. This is used by -Werror=. */
3088 enable_warning_as_error (const char *arg
, int value
, unsigned int lang_mask
,
3089 const struct cl_option_handlers
*handlers
,
3090 struct gcc_options
*opts
,
3091 struct gcc_options
*opts_set
,
3092 location_t loc
, diagnostic_context
*dc
)
3097 new_option
= XNEWVEC (char, strlen (arg
) + 2);
3098 new_option
[0] = 'W';
3099 strcpy (new_option
+ 1, arg
);
3100 option_index
= find_opt (new_option
, lang_mask
);
3101 if (option_index
== OPT_SPECIAL_unknown
)
3104 const char *hint
= op
.suggest_option (new_option
);
3106 error_at (loc
, "%<-W%serror=%s%>: no option %<-%s%>;"
3107 " did you mean %<-%s%>?", value
? "" : "no-",
3108 arg
, new_option
, hint
);
3110 error_at (loc
, "%<-W%serror=%s%>: no option %<-%s%>",
3111 value
? "" : "no-", arg
, new_option
);
3113 else if (!(cl_options
[option_index
].flags
& CL_WARNING
))
3114 error_at (loc
, "%<-Werror=%s%>: %<-%s%> is not an option that "
3115 "controls warnings", arg
, new_option
);
3118 const diagnostic_t kind
= value
? DK_ERROR
: DK_WARNING
;
3119 const char *arg
= NULL
;
3121 if (cl_options
[option_index
].flags
& CL_JOINED
)
3122 arg
= new_option
+ cl_options
[option_index
].opt_len
;
3123 control_warning_option (option_index
, (int) kind
, arg
, value
,
3125 handlers
, opts
, opts_set
, dc
);
3130 /* Return malloced memory for the name of the option OPTION_INDEX
3131 which enabled a diagnostic (context CONTEXT), originally of type
3132 ORIG_DIAG_KIND but possibly converted to DIAG_KIND by options such
3136 option_name (diagnostic_context
*context
, int option_index
,
3137 diagnostic_t orig_diag_kind
, diagnostic_t diag_kind
)
3141 /* A warning classified as an error. */
3142 if ((orig_diag_kind
== DK_WARNING
|| orig_diag_kind
== DK_PEDWARN
)
3143 && diag_kind
== DK_ERROR
)
3144 return concat (cl_options
[OPT_Werror_
].opt_text
,
3145 /* Skip over "-W". */
3146 cl_options
[option_index
].opt_text
+ 2,
3148 /* A warning with option. */
3150 return xstrdup (cl_options
[option_index
].opt_text
);
3152 /* A warning without option classified as an error. */
3153 else if ((orig_diag_kind
== DK_WARNING
|| orig_diag_kind
== DK_PEDWARN
3154 || diag_kind
== DK_WARNING
)
3155 && context
->warning_as_error_requested
)
3156 return xstrdup (cl_options
[OPT_Werror
].opt_text
);