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