1 /* Command line option handling.
2 Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011,
4 Free Software Foundation, Inc.
5 Contributed by Neil Booth.
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 3, or (at your option) any later
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3. If not see
21 <http://www.gnu.org/licenses/>. */
26 #include "coretypes.h"
29 #include "tm.h" /* For STACK_CHECK_BUILTIN,
30 STACK_CHECK_STATIC_BUILTIN, DEFAULT_GDB_EXTENSIONS,
31 DWARF2_DEBUGGING_INFO and DBX_DEBUGGING_INFO. */
34 #include "diagnostic.h"
35 #include "opts-diagnostic.h"
36 #include "insn-attr-common.h"
37 #include "common/common-target.h"
39 static void set_Wstrict_aliasing (struct gcc_options
*opts
, int onoff
);
41 /* Indexed by enum debug_info_type. */
42 const char *const debug_type_names
[] =
44 "none", "stabs", "coff", "dwarf-2", "xcoff", "vms"
47 /* Parse the -femit-struct-debug-detailed option value
48 and set the flag variables. */
50 #define MATCH( prefix, string ) \
51 ((strncmp (prefix, string, sizeof prefix - 1) == 0) \
52 ? ((string += sizeof prefix - 1), 1) : 0)
55 set_struct_debug_option (struct gcc_options
*opts
, location_t loc
,
58 /* various labels for comparison */
59 static const char dfn_lbl
[] = "dfn:", dir_lbl
[] = "dir:", ind_lbl
[] = "ind:";
60 static const char ord_lbl
[] = "ord:", gen_lbl
[] = "gen:";
61 static const char none_lbl
[] = "none", any_lbl
[] = "any";
62 static const char base_lbl
[] = "base", sys_lbl
[] = "sys";
64 enum debug_struct_file files
= DINFO_STRUCT_FILE_ANY
;
65 /* Default is to apply to as much as possible. */
66 enum debug_info_usage usage
= DINFO_USAGE_NUM_ENUMS
;
70 if (MATCH (dfn_lbl
, spec
))
71 usage
= DINFO_USAGE_DFN
;
72 else if (MATCH (dir_lbl
, spec
))
73 usage
= DINFO_USAGE_DIR_USE
;
74 else if (MATCH (ind_lbl
, spec
))
75 usage
= DINFO_USAGE_IND_USE
;
77 /* Generics or not? */
78 if (MATCH (ord_lbl
, spec
))
80 else if (MATCH (gen_lbl
, spec
))
83 /* What allowable environment? */
84 if (MATCH (none_lbl
, spec
))
85 files
= DINFO_STRUCT_FILE_NONE
;
86 else if (MATCH (any_lbl
, spec
))
87 files
= DINFO_STRUCT_FILE_ANY
;
88 else if (MATCH (sys_lbl
, spec
))
89 files
= DINFO_STRUCT_FILE_SYS
;
90 else if (MATCH (base_lbl
, spec
))
91 files
= DINFO_STRUCT_FILE_BASE
;
94 "argument %qs to %<-femit-struct-debug-detailed%> "
98 /* Effect the specification. */
99 if (usage
== DINFO_USAGE_NUM_ENUMS
)
103 opts
->x_debug_struct_ordinary
[DINFO_USAGE_DFN
] = files
;
104 opts
->x_debug_struct_ordinary
[DINFO_USAGE_DIR_USE
] = files
;
105 opts
->x_debug_struct_ordinary
[DINFO_USAGE_IND_USE
] = files
;
109 opts
->x_debug_struct_generic
[DINFO_USAGE_DFN
] = files
;
110 opts
->x_debug_struct_generic
[DINFO_USAGE_DIR_USE
] = files
;
111 opts
->x_debug_struct_generic
[DINFO_USAGE_IND_USE
] = files
;
117 opts
->x_debug_struct_ordinary
[usage
] = files
;
119 opts
->x_debug_struct_generic
[usage
] = files
;
123 set_struct_debug_option (opts
, loc
, spec
+1);
126 /* No more -femit-struct-debug-detailed specifications.
130 "argument %qs to %<-femit-struct-debug-detailed%> unknown",
132 if (opts
->x_debug_struct_ordinary
[DINFO_USAGE_DIR_USE
]
133 < opts
->x_debug_struct_ordinary
[DINFO_USAGE_IND_USE
]
134 || opts
->x_debug_struct_generic
[DINFO_USAGE_DIR_USE
]
135 < opts
->x_debug_struct_generic
[DINFO_USAGE_IND_USE
])
137 "%<-femit-struct-debug-detailed=dir:...%> must allow "
138 "at least as much as "
139 "%<-femit-struct-debug-detailed=ind:...%>");
143 /* Strip off a legitimate source ending from the input string NAME of
144 length LEN. Rather than having to know the names used by all of
145 our front ends, we strip off an ending of a period followed by
146 up to five characters. (Java uses ".class".) */
149 strip_off_ending (char *name
, int len
)
152 for (i
= 2; i
< 6 && len
> i
; i
++)
154 if (name
[len
- i
] == '.')
156 name
[len
- i
] = '\0';
162 /* Find the base name of a path, stripping off both directories and
163 a single final extension. */
165 base_of_path (const char *path
, const char **base_out
)
167 const char *base
= path
;
169 const char *p
= path
;
173 if (IS_DIR_SEPARATOR(c
))
188 /* What to print when a switch has no documentation. */
189 static const char undocumented_msg
[] = N_("This switch lacks documentation");
191 typedef char *char_p
; /* For DEF_VEC_P. */
193 static void handle_param (struct gcc_options
*opts
,
194 struct gcc_options
*opts_set
, location_t loc
,
196 static void set_debug_level (enum debug_info_type type
, int extended
,
197 const char *arg
, struct gcc_options
*opts
,
198 struct gcc_options
*opts_set
,
200 static void set_fast_math_flags (struct gcc_options
*opts
, int set
);
201 static void decode_d_option (const char *arg
, struct gcc_options
*opts
,
202 location_t loc
, diagnostic_context
*dc
);
203 static void set_unsafe_math_optimizations_flags (struct gcc_options
*opts
,
205 static void enable_warning_as_error (const char *arg
, int value
,
206 unsigned int lang_mask
,
207 const struct cl_option_handlers
*handlers
,
208 struct gcc_options
*opts
,
209 struct gcc_options
*opts_set
,
211 diagnostic_context
*dc
);
213 /* Handle a back-end option; arguments and return value as for
217 target_handle_option (struct gcc_options
*opts
,
218 struct gcc_options
*opts_set
,
219 const struct cl_decoded_option
*decoded
,
220 unsigned int lang_mask ATTRIBUTE_UNUSED
, int kind
,
222 const struct cl_option_handlers
*handlers ATTRIBUTE_UNUSED
,
223 diagnostic_context
*dc
)
225 gcc_assert (dc
== global_dc
);
226 gcc_assert (kind
== DK_UNSPECIFIED
);
227 return targetm_common
.handle_option (opts
, opts_set
, decoded
, loc
);
230 /* Add comma-separated strings to a char_p vector. */
233 add_comma_separated_to_vector (void **pvec
, const char *arg
)
239 vec
<char_p
> *v
= (vec
<char_p
> *) *pvec
;
241 vec_check_alloc (v
, 1);
243 /* We never free this string. */
256 v
->safe_push (token_start
);
259 if (*r
== '\\' && r
[1] == ',')
267 if (*token_start
!= '\0')
268 v
->safe_push (token_start
);
273 /* Initialize OPTS and OPTS_SET before using them in parsing options. */
276 init_options_struct (struct gcc_options
*opts
, struct gcc_options
*opts_set
)
278 size_t num_params
= get_num_compiler_params ();
280 *opts
= global_options_init
;
281 memset (opts_set
, 0, sizeof (*opts_set
));
283 opts
->x_param_values
= XNEWVEC (int, num_params
);
284 opts_set
->x_param_values
= XCNEWVEC (int, num_params
);
285 init_param_values (opts
->x_param_values
);
287 /* Initialize whether `char' is signed. */
288 opts
->x_flag_signed_char
= DEFAULT_SIGNED_CHAR
;
289 /* Set this to a special "uninitialized" value. The actual default
290 is set after target options have been processed. */
291 opts
->x_flag_short_enums
= 2;
293 /* Initialize target_flags before default_options_optimization
294 so the latter can modify it. */
295 opts
->x_target_flags
= targetm_common
.default_target_flags
;
297 /* Some targets have ABI-specified unwind tables. */
298 opts
->x_flag_unwind_tables
= targetm_common
.unwind_tables_default
;
300 /* Some targets have other target-specific initialization. */
301 targetm_common
.option_init_struct (opts
);
304 /* If indicated by the optimization level LEVEL (-Os if SIZE is set,
305 -Ofast if FAST is set, -Og if DEBUG is set), apply the option DEFAULT_OPT
306 to OPTS and OPTS_SET, diagnostic context DC, location LOC, with language
307 mask LANG_MASK and option handlers HANDLERS. */
310 maybe_default_option (struct gcc_options
*opts
,
311 struct gcc_options
*opts_set
,
312 const struct default_options
*default_opt
,
313 int level
, bool size
, bool fast
, bool debug
,
314 unsigned int lang_mask
,
315 const struct cl_option_handlers
*handlers
,
317 diagnostic_context
*dc
)
319 const struct cl_option
*option
= &cl_options
[default_opt
->opt_index
];
323 gcc_assert (level
== 2);
325 gcc_assert (level
== 3);
327 gcc_assert (level
== 1);
329 switch (default_opt
->levels
)
335 case OPT_LEVELS_0_ONLY
:
336 enabled
= (level
== 0);
339 case OPT_LEVELS_1_PLUS
:
340 enabled
= (level
>= 1);
343 case OPT_LEVELS_1_PLUS_SPEED_ONLY
:
344 enabled
= (level
>= 1 && !size
&& !debug
);
347 case OPT_LEVELS_1_PLUS_NOT_DEBUG
:
348 enabled
= (level
>= 1 && !debug
);
351 case OPT_LEVELS_2_PLUS
:
352 enabled
= (level
>= 2);
355 case OPT_LEVELS_2_PLUS_SPEED_ONLY
:
356 enabled
= (level
>= 2 && !size
&& !debug
);
359 case OPT_LEVELS_3_PLUS
:
360 enabled
= (level
>= 3);
363 case OPT_LEVELS_3_PLUS_AND_SIZE
:
364 enabled
= (level
>= 3 || size
);
367 case OPT_LEVELS_SIZE
:
371 case OPT_LEVELS_FAST
:
375 case OPT_LEVELS_NONE
:
381 handle_generated_option (opts
, opts_set
, default_opt
->opt_index
,
382 default_opt
->arg
, default_opt
->value
,
383 lang_mask
, DK_UNSPECIFIED
, loc
,
385 else if (default_opt
->arg
== NULL
386 && !option
->cl_reject_negative
)
387 handle_generated_option (opts
, opts_set
, default_opt
->opt_index
,
388 default_opt
->arg
, !default_opt
->value
,
389 lang_mask
, DK_UNSPECIFIED
, loc
,
393 /* As indicated by the optimization level LEVEL (-Os if SIZE is set,
394 -Ofast if FAST is set), apply the options in array DEFAULT_OPTS to
395 OPTS and OPTS_SET, diagnostic context DC, location LOC, with
396 language mask LANG_MASK and option handlers HANDLERS. */
399 maybe_default_options (struct gcc_options
*opts
,
400 struct gcc_options
*opts_set
,
401 const struct default_options
*default_opts
,
402 int level
, bool size
, bool fast
, bool debug
,
403 unsigned int lang_mask
,
404 const struct cl_option_handlers
*handlers
,
406 diagnostic_context
*dc
)
410 for (i
= 0; default_opts
[i
].levels
!= OPT_LEVELS_NONE
; i
++)
411 maybe_default_option (opts
, opts_set
, &default_opts
[i
],
412 level
, size
, fast
, debug
,
413 lang_mask
, handlers
, loc
, dc
);
416 /* Table of options enabled by default at different levels. */
418 static const struct default_options default_options_table
[] =
420 /* -O1 optimizations. */
421 { OPT_LEVELS_1_PLUS
, OPT_fdefer_pop
, NULL
, 1 },
423 { OPT_LEVELS_1_PLUS
, OPT_fdelayed_branch
, NULL
, 1 },
425 { OPT_LEVELS_1_PLUS
, OPT_fguess_branch_probability
, NULL
, 1 },
426 { OPT_LEVELS_1_PLUS
, OPT_fcprop_registers
, NULL
, 1 },
427 { OPT_LEVELS_1_PLUS
, OPT_fforward_propagate
, NULL
, 1 },
428 { OPT_LEVELS_1_PLUS
, OPT_fif_conversion
, NULL
, 1 },
429 { OPT_LEVELS_1_PLUS
, OPT_fif_conversion2
, NULL
, 1 },
430 { OPT_LEVELS_1_PLUS
, OPT_fipa_pure_const
, NULL
, 1 },
431 { OPT_LEVELS_1_PLUS
, OPT_fipa_reference
, NULL
, 1 },
432 { OPT_LEVELS_1_PLUS
, OPT_fipa_profile
, NULL
, 1 },
433 { OPT_LEVELS_1_PLUS
, OPT_fmerge_constants
, NULL
, 1 },
434 { OPT_LEVELS_1_PLUS
, OPT_fshrink_wrap
, NULL
, 1 },
435 { OPT_LEVELS_1_PLUS
, OPT_fsplit_wide_types
, NULL
, 1 },
436 { OPT_LEVELS_1_PLUS
, OPT_ftree_ccp
, NULL
, 1 },
437 { OPT_LEVELS_1_PLUS
, OPT_ftree_bit_ccp
, NULL
, 1 },
438 { OPT_LEVELS_1_PLUS
, OPT_ftree_dce
, NULL
, 1 },
439 { OPT_LEVELS_1_PLUS
, OPT_ftree_dominator_opts
, NULL
, 1 },
440 { OPT_LEVELS_1_PLUS
, OPT_ftree_dse
, NULL
, 1 },
441 { OPT_LEVELS_1_PLUS
, OPT_ftree_ter
, NULL
, 1 },
442 { OPT_LEVELS_1_PLUS_NOT_DEBUG
, OPT_ftree_sra
, NULL
, 1 },
443 { OPT_LEVELS_1_PLUS
, OPT_ftree_copyrename
, NULL
, 1 },
444 { OPT_LEVELS_1_PLUS
, OPT_ftree_fre
, NULL
, 1 },
445 { OPT_LEVELS_1_PLUS
, OPT_ftree_copy_prop
, NULL
, 1 },
446 { OPT_LEVELS_1_PLUS
, OPT_ftree_sink
, NULL
, 1 },
447 { OPT_LEVELS_1_PLUS
, OPT_ftree_ch
, NULL
, 1 },
448 { OPT_LEVELS_1_PLUS
, OPT_fcombine_stack_adjustments
, NULL
, 1 },
449 { OPT_LEVELS_1_PLUS
, OPT_fcompare_elim
, NULL
, 1 },
450 { OPT_LEVELS_1_PLUS
, OPT_ftree_slsr
, NULL
, 1 },
452 /* -O2 optimizations. */
453 { OPT_LEVELS_2_PLUS
, OPT_finline_small_functions
, NULL
, 1 },
454 { OPT_LEVELS_2_PLUS
, OPT_findirect_inlining
, NULL
, 1 },
455 { OPT_LEVELS_2_PLUS
, OPT_fpartial_inlining
, NULL
, 1 },
456 { OPT_LEVELS_2_PLUS
, OPT_fthread_jumps
, NULL
, 1 },
457 { OPT_LEVELS_2_PLUS
, OPT_fcrossjumping
, NULL
, 1 },
458 { OPT_LEVELS_2_PLUS
, OPT_foptimize_sibling_calls
, NULL
, 1 },
459 { OPT_LEVELS_2_PLUS
, OPT_fcse_follow_jumps
, NULL
, 1 },
460 { OPT_LEVELS_2_PLUS
, OPT_fgcse
, NULL
, 1 },
461 { OPT_LEVELS_2_PLUS
, OPT_fexpensive_optimizations
, NULL
, 1 },
462 { OPT_LEVELS_2_PLUS
, OPT_frerun_cse_after_loop
, NULL
, 1 },
463 { OPT_LEVELS_2_PLUS
, OPT_fcaller_saves
, NULL
, 1 },
464 { OPT_LEVELS_2_PLUS
, OPT_fpeephole2
, NULL
, 1 },
465 #ifdef INSN_SCHEDULING
466 /* Only run the pre-regalloc scheduling pass if optimizing for speed. */
467 { OPT_LEVELS_2_PLUS_SPEED_ONLY
, OPT_fschedule_insns
, NULL
, 1 },
468 { OPT_LEVELS_2_PLUS
, OPT_fschedule_insns2
, NULL
, 1 },
470 { OPT_LEVELS_2_PLUS
, OPT_fregmove
, NULL
, 1 },
471 { OPT_LEVELS_2_PLUS
, OPT_fstrict_aliasing
, NULL
, 1 },
472 { OPT_LEVELS_2_PLUS
, OPT_fstrict_overflow
, NULL
, 1 },
473 { OPT_LEVELS_2_PLUS
, OPT_freorder_blocks
, NULL
, 1 },
474 { OPT_LEVELS_2_PLUS
, OPT_freorder_functions
, NULL
, 1 },
475 { OPT_LEVELS_2_PLUS
, OPT_ftree_vrp
, NULL
, 1 },
476 { OPT_LEVELS_2_PLUS
, OPT_ftree_builtin_call_dce
, NULL
, 1 },
477 { OPT_LEVELS_2_PLUS
, OPT_ftree_pre
, NULL
, 1 },
478 { OPT_LEVELS_2_PLUS
, OPT_ftree_switch_conversion
, NULL
, 1 },
479 { OPT_LEVELS_2_PLUS
, OPT_fipa_cp
, NULL
, 1 },
480 { OPT_LEVELS_2_PLUS
, OPT_fdevirtualize
, NULL
, 1 },
481 { OPT_LEVELS_2_PLUS
, OPT_fipa_sra
, NULL
, 1 },
482 { OPT_LEVELS_2_PLUS
, OPT_falign_loops
, NULL
, 1 },
483 { OPT_LEVELS_2_PLUS
, OPT_falign_jumps
, NULL
, 1 },
484 { OPT_LEVELS_2_PLUS
, OPT_falign_labels
, NULL
, 1 },
485 { OPT_LEVELS_2_PLUS
, OPT_falign_functions
, NULL
, 1 },
486 { OPT_LEVELS_2_PLUS
, OPT_ftree_tail_merge
, NULL
, 1 },
487 { OPT_LEVELS_2_PLUS_SPEED_ONLY
, OPT_foptimize_strlen
, NULL
, 1 },
488 { OPT_LEVELS_2_PLUS
, OPT_fhoist_adjacent_loads
, NULL
, 1 },
490 /* -O3 optimizations. */
491 { OPT_LEVELS_3_PLUS
, OPT_ftree_loop_distribute_patterns
, NULL
, 1 },
492 { OPT_LEVELS_3_PLUS
, OPT_fpredictive_commoning
, NULL
, 1 },
493 /* Inlining of functions reducing size is a good idea with -Os
494 regardless of them being declared inline. */
495 { OPT_LEVELS_3_PLUS_AND_SIZE
, OPT_finline_functions
, NULL
, 1 },
496 { OPT_LEVELS_1_PLUS_NOT_DEBUG
, OPT_finline_functions_called_once
, NULL
, 1 },
497 { OPT_LEVELS_3_PLUS
, OPT_funswitch_loops
, NULL
, 1 },
498 { OPT_LEVELS_3_PLUS
, OPT_fgcse_after_reload
, NULL
, 1 },
499 { OPT_LEVELS_3_PLUS
, OPT_ftree_vectorize
, NULL
, 1 },
500 { OPT_LEVELS_3_PLUS
, OPT_fvect_cost_model
, NULL
, 1 },
501 { OPT_LEVELS_3_PLUS
, OPT_fipa_cp_clone
, NULL
, 1 },
502 { OPT_LEVELS_3_PLUS
, OPT_ftree_partial_pre
, NULL
, 1 },
504 /* -Ofast adds optimizations to -O3. */
505 { OPT_LEVELS_FAST
, OPT_ffast_math
, NULL
, 1 },
507 { OPT_LEVELS_NONE
, 0, NULL
, 0 }
510 /* Default the options in OPTS and OPTS_SET based on the optimization
511 settings in DECODED_OPTIONS and DECODED_OPTIONS_COUNT. */
513 default_options_optimization (struct gcc_options
*opts
,
514 struct gcc_options
*opts_set
,
515 struct cl_decoded_option
*decoded_options
,
516 unsigned int decoded_options_count
,
518 unsigned int lang_mask
,
519 const struct cl_option_handlers
*handlers
,
520 diagnostic_context
*dc
)
525 /* Scan to see what optimization level has been specified. That will
526 determine the default value of many flags. */
527 for (i
= 1; i
< decoded_options_count
; i
++)
529 struct cl_decoded_option
*opt
= &decoded_options
[i
];
530 switch (opt
->opt_index
)
533 if (*opt
->arg
== '\0')
535 opts
->x_optimize
= 1;
536 opts
->x_optimize_size
= 0;
537 opts
->x_optimize_fast
= 0;
538 opts
->x_optimize_debug
= 0;
542 const int optimize_val
= integral_argument (opt
->arg
);
543 if (optimize_val
== -1)
544 error_at (loc
, "argument to %<-O%> should be a non-negative "
545 "integer, %<g%>, %<s%> or %<fast%>");
548 opts
->x_optimize
= optimize_val
;
549 if ((unsigned int) opts
->x_optimize
> 255)
550 opts
->x_optimize
= 255;
551 opts
->x_optimize_size
= 0;
552 opts
->x_optimize_fast
= 0;
553 opts
->x_optimize_debug
= 0;
559 opts
->x_optimize_size
= 1;
561 /* Optimizing for size forces optimize to be 2. */
562 opts
->x_optimize
= 2;
563 opts
->x_optimize_fast
= 0;
564 opts
->x_optimize_debug
= 0;
568 /* -Ofast only adds flags to -O3. */
569 opts
->x_optimize_size
= 0;
570 opts
->x_optimize
= 3;
571 opts
->x_optimize_fast
= 1;
572 opts
->x_optimize_debug
= 0;
576 /* -Og selects optimization level 1. */
577 opts
->x_optimize_size
= 0;
578 opts
->x_optimize
= 1;
579 opts
->x_optimize_fast
= 0;
580 opts
->x_optimize_debug
= 1;
584 /* Ignore other options in this prescan. */
589 maybe_default_options (opts
, opts_set
, default_options_table
,
590 opts
->x_optimize
, opts
->x_optimize_size
,
591 opts
->x_optimize_fast
, opts
->x_optimize_debug
,
592 lang_mask
, handlers
, loc
, dc
);
594 /* -O2 param settings. */
595 opt2
= (opts
->x_optimize
>= 2);
597 /* Track fields in field-sensitive alias analysis. */
598 maybe_set_param_value
599 (PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE
,
600 opt2
? 100 : default_param_value (PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE
),
601 opts
->x_param_values
, opts_set
->x_param_values
);
603 /* For -O1 only do loop invariant motion for very small loops. */
604 maybe_set_param_value
605 (PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP
,
606 opt2
? default_param_value (PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP
) : 1000,
607 opts
->x_param_values
, opts_set
->x_param_values
);
609 if (opts
->x_optimize_size
)
610 /* We want to crossjump as much as possible. */
611 maybe_set_param_value (PARAM_MIN_CROSSJUMP_INSNS
, 1,
612 opts
->x_param_values
, opts_set
->x_param_values
);
614 maybe_set_param_value (PARAM_MIN_CROSSJUMP_INSNS
,
615 default_param_value (PARAM_MIN_CROSSJUMP_INSNS
),
616 opts
->x_param_values
, opts_set
->x_param_values
);
618 /* Allow default optimizations to be specified on a per-machine basis. */
619 maybe_default_options (opts
, opts_set
,
620 targetm_common
.option_optimization_table
,
621 opts
->x_optimize
, opts
->x_optimize_size
,
622 opts
->x_optimize_fast
, opts
->x_optimize_debug
,
623 lang_mask
, handlers
, loc
, dc
);
626 /* After all options at LOC have been read into OPTS and OPTS_SET,
627 finalize settings of those options and diagnose incompatible
630 finish_options (struct gcc_options
*opts
, struct gcc_options
*opts_set
,
633 enum unwind_info_type ui_except
;
635 if (opts
->x_dump_base_name
&& ! IS_ABSOLUTE_PATH (opts
->x_dump_base_name
))
637 /* First try to make OPTS->X_DUMP_BASE_NAME relative to the
638 OPTS->X_DUMP_DIR_NAME directory. Then try to make
639 OPTS->X_DUMP_BASE_NAME relative to the OPTS->X_AUX_BASE_NAME
640 directory, typically the directory to contain the object
642 if (opts
->x_dump_dir_name
)
643 opts
->x_dump_base_name
= concat (opts
->x_dump_dir_name
,
644 opts
->x_dump_base_name
, NULL
);
645 else if (opts
->x_aux_base_name
646 && strcmp (opts
->x_aux_base_name
, HOST_BIT_BUCKET
) != 0)
648 const char *aux_base
;
650 base_of_path (opts
->x_aux_base_name
, &aux_base
);
651 if (opts
->x_aux_base_name
!= aux_base
)
653 int dir_len
= aux_base
- opts
->x_aux_base_name
;
654 char *new_dump_base_name
=
655 XNEWVEC (char, strlen (opts
->x_dump_base_name
) + dir_len
+ 1);
657 /* Copy directory component from OPTS->X_AUX_BASE_NAME. */
658 memcpy (new_dump_base_name
, opts
->x_aux_base_name
, dir_len
);
659 /* Append existing OPTS->X_DUMP_BASE_NAME. */
660 strcpy (new_dump_base_name
+ dir_len
, opts
->x_dump_base_name
);
661 opts
->x_dump_base_name
= new_dump_base_name
;
666 /* Handle related options for unit-at-a-time, toplevel-reorder, and
668 if (!opts
->x_flag_unit_at_a_time
)
670 if (opts
->x_flag_section_anchors
&& opts_set
->x_flag_section_anchors
)
671 error_at (loc
, "section anchors must be disabled when unit-at-a-time "
673 opts
->x_flag_section_anchors
= 0;
674 if (opts
->x_flag_toplevel_reorder
== 1)
675 error_at (loc
, "toplevel reorder must be disabled when unit-at-a-time "
677 opts
->x_flag_toplevel_reorder
= 0;
680 if (opts
->x_flag_tm
&& opts
->x_flag_non_call_exceptions
)
681 sorry ("transactional memory is not supported with non-call exceptions");
683 /* Unless the user has asked for section anchors, we disable toplevel
684 reordering at -O0 to disable transformations that might be surprising
685 to end users and to get -fno-toplevel-reorder tested. */
686 if (!opts
->x_optimize
687 && opts
->x_flag_toplevel_reorder
== 2
688 && !(opts
->x_flag_section_anchors
&& opts_set
->x_flag_section_anchors
))
690 opts
->x_flag_toplevel_reorder
= 0;
691 opts
->x_flag_section_anchors
= 0;
693 if (!opts
->x_flag_toplevel_reorder
)
695 if (opts
->x_flag_section_anchors
&& opts_set
->x_flag_section_anchors
)
696 error_at (loc
, "section anchors must be disabled when toplevel reorder"
698 opts
->x_flag_section_anchors
= 0;
701 if (!opts
->x_flag_opts_finished
)
703 if (opts
->x_flag_pie
)
704 opts
->x_flag_pic
= opts
->x_flag_pie
;
705 if (opts
->x_flag_pic
&& !opts
->x_flag_pie
)
706 opts
->x_flag_shlib
= 1;
707 opts
->x_flag_opts_finished
= true;
710 if (opts
->x_optimize
== 0)
712 /* Inlining does not work if not optimizing,
713 so force it not to be done. */
714 opts
->x_warn_inline
= 0;
715 opts
->x_flag_no_inline
= 1;
718 /* The optimization to partition hot and cold basic blocks into separate
719 sections of the .o and executable files does not work (currently)
720 with exception handling. This is because there is no support for
721 generating unwind info. If opts->x_flag_exceptions is turned on
722 we need to turn off the partitioning optimization. */
724 ui_except
= targetm_common
.except_unwind_info (opts
);
726 if (opts
->x_flag_exceptions
727 && opts
->x_flag_reorder_blocks_and_partition
728 && (ui_except
== UI_SJLJ
|| ui_except
>= UI_TARGET
))
731 "-freorder-blocks-and-partition does not work "
732 "with exceptions on this architecture");
733 opts
->x_flag_reorder_blocks_and_partition
= 0;
734 opts
->x_flag_reorder_blocks
= 1;
737 /* If user requested unwind info, then turn off the partitioning
740 if (opts
->x_flag_unwind_tables
741 && !targetm_common
.unwind_tables_default
742 && opts
->x_flag_reorder_blocks_and_partition
743 && (ui_except
== UI_SJLJ
|| ui_except
>= UI_TARGET
))
746 "-freorder-blocks-and-partition does not support "
747 "unwind info on this architecture");
748 opts
->x_flag_reorder_blocks_and_partition
= 0;
749 opts
->x_flag_reorder_blocks
= 1;
752 /* If the target requested unwind info, then turn off the partitioning
753 optimization with a different message. Likewise, if the target does not
754 support named sections. */
756 if (opts
->x_flag_reorder_blocks_and_partition
757 && (!targetm_common
.have_named_sections
758 || (opts
->x_flag_unwind_tables
759 && targetm_common
.unwind_tables_default
760 && (ui_except
== UI_SJLJ
|| ui_except
>= UI_TARGET
))))
763 "-freorder-blocks-and-partition does not work "
764 "on this architecture");
765 opts
->x_flag_reorder_blocks_and_partition
= 0;
766 opts
->x_flag_reorder_blocks
= 1;
769 if (opts
->x_flag_reorder_blocks_and_partition
770 && !opts_set
->x_flag_reorder_functions
)
771 opts
->x_flag_reorder_functions
= 1;
773 /* Pipelining of outer loops is only possible when general pipelining
774 capabilities are requested. */
775 if (!opts
->x_flag_sel_sched_pipelining
)
776 opts
->x_flag_sel_sched_pipelining_outer_loops
= 0;
778 if (opts
->x_flag_conserve_stack
)
780 maybe_set_param_value (PARAM_LARGE_STACK_FRAME
, 100,
781 opts
->x_param_values
, opts_set
->x_param_values
);
782 maybe_set_param_value (PARAM_STACK_FRAME_GROWTH
, 40,
783 opts
->x_param_values
, opts_set
->x_param_values
);
786 if (opts
->x_flag_lto
)
789 opts
->x_flag_generate_lto
= 1;
791 /* When generating IL, do not operate in whole-program mode.
792 Otherwise, symbols will be privatized too early, causing link
794 opts
->x_flag_whole_program
= 0;
796 error_at (loc
, "LTO support has not been enabled in this configuration");
798 if (!opts
->x_flag_fat_lto_objects
&& !HAVE_LTO_PLUGIN
)
799 error_at (loc
, "-fno-fat-lto-objects are supported only with linker plugin.");
801 if ((opts
->x_flag_lto_partition_balanced
!= 0) + (opts
->x_flag_lto_partition_1to1
!= 0)
802 + (opts
->x_flag_lto_partition_none
!= 0) >= 1)
804 if ((opts
->x_flag_lto_partition_balanced
!= 0)
805 + (opts
->x_flag_lto_partition_1to1
!= 0)
806 + (opts
->x_flag_lto_partition_none
!= 0) > 1)
807 error_at (loc
, "only one -flto-partition value can be specified");
810 /* We initialize opts->x_flag_split_stack to -1 so that targets can set a
811 default value if they choose based on other options. */
812 if (opts
->x_flag_split_stack
== -1)
813 opts
->x_flag_split_stack
= 0;
814 else if (opts
->x_flag_split_stack
)
816 if (!targetm_common
.supports_split_stack (true, opts
))
818 error_at (loc
, "%<-fsplit-stack%> is not supported by "
819 "this compiler configuration");
820 opts
->x_flag_split_stack
= 0;
824 /* Set PARAM_MAX_STORES_TO_SINK to 0 if either vectorization or if-conversion
826 if (!opts
->x_flag_tree_vectorize
|| !opts
->x_flag_tree_loop_if_convert
)
827 maybe_set_param_value (PARAM_MAX_STORES_TO_SINK
, 0,
828 opts
->x_param_values
, opts_set
->x_param_values
);
830 /* The -gsplit-dwarf option requires -gpubnames. */
831 if (opts
->x_dwarf_split_debug_info
)
832 opts
->x_debug_generate_pub_sections
= 1;
835 #define LEFT_COLUMN 27
837 /* Output ITEM, of length ITEM_WIDTH, in the left column,
838 followed by word-wrapped HELP in a second column. */
840 wrap_help (const char *help
,
842 unsigned int item_width
,
843 unsigned int columns
)
845 unsigned int col_width
= LEFT_COLUMN
;
846 unsigned int remaining
, room
, len
;
848 remaining
= strlen (help
);
852 room
= columns
- 3 - MAX (col_width
, item_width
);
861 for (i
= 0; help
[i
]; i
++)
863 if (i
>= room
&& len
!= remaining
)
867 else if ((help
[i
] == '-' || help
[i
] == '/')
868 && help
[i
+ 1] != ' '
869 && i
> 0 && ISALPHA (help
[i
- 1]))
874 printf( " %-*.*s %.*s\n", col_width
, item_width
, item
, len
, help
);
876 while (help
[len
] == ' ')
884 /* Print help for a specific front-end, etc. */
886 print_filtered_help (unsigned int include_flags
,
887 unsigned int exclude_flags
,
888 unsigned int any_flags
,
889 unsigned int columns
,
890 struct gcc_options
*opts
,
891 unsigned int lang_mask
)
896 bool displayed
= false;
898 if (include_flags
== CL_PARAMS
)
900 for (i
= 0; i
< LAST_PARAM
; i
++)
902 const char *param
= compiler_params
[i
].option
;
904 help
= compiler_params
[i
].help
;
905 if (help
== NULL
|| *help
== '\0')
907 if (exclude_flags
& CL_UNDOCUMENTED
)
909 help
= undocumented_msg
;
912 /* Get the translation. */
915 wrap_help (help
, param
, strlen (param
), columns
);
921 if (!opts
->x_help_printed
)
922 opts
->x_help_printed
= XCNEWVAR (char, cl_options_count
);
924 if (!opts
->x_help_enum_printed
)
925 opts
->x_help_enum_printed
= XCNEWVAR (char, cl_enums_count
);
927 for (i
= 0; i
< cl_options_count
; i
++)
930 const struct cl_option
*option
= cl_options
+ i
;
935 if (include_flags
== 0
936 || ((option
->flags
& include_flags
) != include_flags
))
938 if ((option
->flags
& any_flags
) == 0)
942 /* Skip unwanted switches. */
943 if ((option
->flags
& exclude_flags
) != 0)
946 /* The driver currently prints its own help text. */
947 if ((option
->flags
& CL_DRIVER
) != 0
948 && (option
->flags
& (((1U << cl_lang_count
) - 1)
949 | CL_COMMON
| CL_TARGET
)) == 0)
953 /* Skip switches that have already been printed. */
954 if (opts
->x_help_printed
[i
])
957 opts
->x_help_printed
[i
] = true;
962 if (exclude_flags
& CL_UNDOCUMENTED
)
964 help
= undocumented_msg
;
967 /* Get the translation. */
970 /* Find the gap between the name of the
971 option and its descriptive text. */
972 tab
= strchr (help
, '\t');
981 opt
= option
->opt_text
;
985 /* With the -Q option enabled we change the descriptive text associated
986 with an option to be an indication of its current setting. */
987 if (!opts
->x_quiet_flag
)
989 void *flag_var
= option_flag_var (i
, opts
);
991 if (len
< (LEFT_COLUMN
+ 2))
992 strcpy (new_help
, "\t\t");
994 strcpy (new_help
, "\t");
997 && option
->var_type
!= CLVC_DEFER
)
999 if (option
->flags
& CL_JOINED
)
1001 if (option
->var_type
== CLVC_STRING
)
1003 if (* (const char **) flag_var
!= NULL
)
1004 snprintf (new_help
+ strlen (new_help
),
1005 sizeof (new_help
) - strlen (new_help
),
1006 * (const char **) flag_var
);
1008 else if (option
->var_type
== CLVC_ENUM
)
1010 const struct cl_enum
*e
= &cl_enums
[option
->var_enum
];
1012 const char *arg
= NULL
;
1014 value
= e
->get (flag_var
);
1015 enum_value_to_arg (e
->values
, &arg
, value
, lang_mask
);
1017 arg
= _("[default]");
1018 snprintf (new_help
+ strlen (new_help
),
1019 sizeof (new_help
) - strlen (new_help
),
1023 sprintf (new_help
+ strlen (new_help
),
1024 "%#x", * (int *) flag_var
);
1027 strcat (new_help
, option_enabled (i
, opts
)
1028 ? _("[enabled]") : _("[disabled]"));
1034 wrap_help (help
, opt
, len
, columns
);
1037 if (option
->var_type
== CLVC_ENUM
1038 && opts
->x_help_enum_printed
[option
->var_enum
] != 2)
1039 opts
->x_help_enum_printed
[option
->var_enum
] = 1;
1044 unsigned int langs
= include_flags
& CL_LANG_ALL
;
1047 printf (_(" No options with the desired characteristics were found\n"));
1052 /* PR 31349: Tell the user how to see all of the
1053 options supported by a specific front end. */
1054 for (i
= 0; (1U << i
) < CL_LANG_ALL
; i
++)
1055 if ((1U << i
) & langs
)
1056 printf (_(" None found. Use --help=%s to show *all* the options supported by the %s front-end\n"),
1057 lang_names
[i
], lang_names
[i
]);
1061 else if (! displayed
)
1062 printf (_(" All options with the desired characteristics have already been displayed\n"));
1066 /* Print details of enumerated option arguments, if those
1067 enumerations have help text headings provided. If no help text
1068 is provided, presume that the possible values are listed in the
1069 help text for the relevant options. */
1070 for (i
= 0; i
< cl_enums_count
; i
++)
1072 unsigned int j
, pos
;
1074 if (opts
->x_help_enum_printed
[i
] != 1)
1076 if (cl_enums
[i
].help
== NULL
)
1078 printf (" %s\n ", _(cl_enums
[i
].help
));
1080 for (j
= 0; cl_enums
[i
].values
[j
].arg
!= NULL
; j
++)
1082 unsigned int len
= strlen (cl_enums
[i
].values
[j
].arg
);
1084 if (pos
> 4 && pos
+ 1 + len
<= columns
)
1086 printf (" %s", cl_enums
[i
].values
[j
].arg
);
1096 printf ("%s", cl_enums
[i
].values
[j
].arg
);
1101 opts
->x_help_enum_printed
[i
] = 2;
1105 /* Display help for a specified type of option.
1106 The options must have ALL of the INCLUDE_FLAGS set
1107 ANY of the flags in the ANY_FLAGS set
1108 and NONE of the EXCLUDE_FLAGS set. The current option state is in
1109 OPTS; LANG_MASK is used for interpreting enumerated option state. */
1111 print_specific_help (unsigned int include_flags
,
1112 unsigned int exclude_flags
,
1113 unsigned int any_flags
,
1114 struct gcc_options
*opts
,
1115 unsigned int lang_mask
)
1117 unsigned int all_langs_mask
= (1U << cl_lang_count
) - 1;
1118 const char * description
= NULL
;
1119 const char * descrip_extra
= "";
1123 /* Sanity check: Make sure that we do not have more
1124 languages than we have bits available to enumerate them. */
1125 gcc_assert ((1U << cl_lang_count
) <= CL_MIN_OPTION_CLASS
);
1127 /* If we have not done so already, obtain
1128 the desired maximum width of the output. */
1129 if (opts
->x_help_columns
== 0)
1133 p
= getenv ("COLUMNS");
1136 int value
= atoi (p
);
1139 opts
->x_help_columns
= value
;
1142 if (opts
->x_help_columns
== 0)
1143 /* Use a reasonable default. */
1144 opts
->x_help_columns
= 80;
1147 /* Decide upon the title for the options that we are going to display. */
1148 for (i
= 0, flag
= 1; flag
<= CL_MAX_OPTION_CLASS
; flag
<<= 1, i
++)
1150 switch (flag
& include_flags
)
1157 description
= _("The following options are target specific");
1160 description
= _("The following options control compiler warning messages");
1162 case CL_OPTIMIZATION
:
1163 description
= _("The following options control optimizations");
1166 description
= _("The following options are language-independent");
1169 description
= _("The --param option recognizes the following as parameters");
1172 if (i
>= cl_lang_count
)
1174 if (exclude_flags
& all_langs_mask
)
1175 description
= _("The following options are specific to just the language ");
1177 description
= _("The following options are supported by the language ");
1178 descrip_extra
= lang_names
[i
];
1183 if (description
== NULL
)
1187 if (include_flags
& CL_UNDOCUMENTED
)
1188 description
= _("The following options are not documented");
1189 else if (include_flags
& CL_SEPARATE
)
1190 description
= _("The following options take separate arguments");
1191 else if (include_flags
& CL_JOINED
)
1192 description
= _("The following options take joined arguments");
1195 internal_error ("unrecognized include_flags 0x%x passed to print_specific_help",
1202 if (any_flags
& all_langs_mask
)
1203 description
= _("The following options are language-related");
1205 description
= _("The following options are language-independent");
1209 printf ("%s%s:\n", description
, descrip_extra
);
1210 print_filtered_help (include_flags
, exclude_flags
, any_flags
,
1211 opts
->x_help_columns
, opts
, lang_mask
);
1214 /* Handle target- and language-independent options. Return zero to
1215 generate an "unknown option" message. Only options that need
1216 extra handling need to be listed here; if you simply want
1217 DECODED->value assigned to a variable, it happens automatically. */
1220 common_handle_option (struct gcc_options
*opts
,
1221 struct gcc_options
*opts_set
,
1222 const struct cl_decoded_option
*decoded
,
1223 unsigned int lang_mask
, int kind ATTRIBUTE_UNUSED
,
1225 const struct cl_option_handlers
*handlers
,
1226 diagnostic_context
*dc
)
1228 size_t scode
= decoded
->opt_index
;
1229 const char *arg
= decoded
->arg
;
1230 int value
= decoded
->value
;
1231 enum opt_code code
= (enum opt_code
) scode
;
1233 gcc_assert (decoded
->canonical_option_num_elements
<= 2);
1238 handle_param (opts
, opts_set
, loc
, arg
);
1243 unsigned int all_langs_mask
= (1U << cl_lang_count
) - 1;
1244 unsigned int undoc_mask
;
1247 if (lang_mask
== CL_DRIVER
)
1250 undoc_mask
= ((opts
->x_verbose_flag
| opts
->x_extra_warnings
)
1253 /* First display any single language specific options. */
1254 for (i
= 0; i
< cl_lang_count
; i
++)
1256 (1U << i
, (all_langs_mask
& (~ (1U << i
))) | undoc_mask
, 0, opts
,
1258 /* Next display any multi language specific options. */
1259 print_specific_help (0, undoc_mask
, all_langs_mask
, opts
, lang_mask
);
1260 /* Then display any remaining, non-language options. */
1261 for (i
= CL_MIN_OPTION_CLASS
; i
<= CL_MAX_OPTION_CLASS
; i
<<= 1)
1263 print_specific_help (i
, undoc_mask
, 0, opts
, lang_mask
);
1264 opts
->x_exit_after_options
= true;
1268 case OPT__target_help
:
1269 if (lang_mask
== CL_DRIVER
)
1272 print_specific_help (CL_TARGET
, CL_UNDOCUMENTED
, 0, opts
, lang_mask
);
1273 opts
->x_exit_after_options
= true;
1278 const char * a
= arg
;
1279 unsigned int include_flags
= 0;
1280 /* Note - by default we include undocumented options when listing
1281 specific classes. If you only want to see documented options
1282 then add ",^undocumented" to the --help= option. E.g.:
1284 --help=target,^undocumented */
1285 unsigned int exclude_flags
= 0;
1287 if (lang_mask
== CL_DRIVER
)
1290 /* Walk along the argument string, parsing each word in turn.
1292 arg = [^]{word}[,{arg}]
1293 word = {optimizers|target|warnings|undocumented|
1294 params|common|<language>} */
1299 const char * string
;
1304 { "optimizers", CL_OPTIMIZATION
},
1305 { "target", CL_TARGET
},
1306 { "warnings", CL_WARNING
},
1307 { "undocumented", CL_UNDOCUMENTED
},
1308 { "params", CL_PARAMS
},
1309 { "joined", CL_JOINED
},
1310 { "separate", CL_SEPARATE
},
1311 { "common", CL_COMMON
},
1314 unsigned int * pflags
;
1316 unsigned int lang_flag
, specific_flag
;
1323 pflags
= & exclude_flags
;
1326 pflags
= & include_flags
;
1328 comma
= strchr (a
, ',');
1339 /* Check to see if the string matches an option class name. */
1340 for (i
= 0, specific_flag
= 0; specifics
[i
].string
!= NULL
; i
++)
1341 if (strncasecmp (a
, specifics
[i
].string
, len
) == 0)
1343 specific_flag
= specifics
[i
].flag
;
1347 /* Check to see if the string matches a language name.
1348 Note - we rely upon the alpha-sorted nature of the entries in
1349 the lang_names array, specifically that shorter names appear
1350 before their longer variants. (i.e. C before C++). That way
1351 when we are attempting to match --help=c for example we will
1352 match with C first and not C++. */
1353 for (i
= 0, lang_flag
= 0; i
< cl_lang_count
; i
++)
1354 if (strncasecmp (a
, lang_names
[i
], len
) == 0)
1356 lang_flag
= 1U << i
;
1360 if (specific_flag
!= 0)
1363 * pflags
|= specific_flag
;
1366 /* The option's argument matches both the start of a
1367 language name and the start of an option class name.
1368 We have a special case for when the user has
1369 specified "--help=c", but otherwise we have to issue
1371 if (strncasecmp (a
, "c", len
) == 0)
1372 * pflags
|= lang_flag
;
1375 "--help argument %q.*s is ambiguous, "
1376 "please be more specific",
1380 else if (lang_flag
!= 0)
1381 * pflags
|= lang_flag
;
1384 "unrecognized argument to --help= option: %q.*s",
1393 print_specific_help (include_flags
, exclude_flags
, 0, opts
,
1395 opts
->x_exit_after_options
= true;
1400 if (lang_mask
== CL_DRIVER
)
1403 opts
->x_exit_after_options
= true;
1410 /* Currently handled in a prescan. */
1414 dc
->warning_as_error_requested
= value
;
1418 if (lang_mask
== CL_DRIVER
)
1421 enable_warning_as_error (arg
, value
, lang_mask
, handlers
,
1422 opts
, opts_set
, loc
, dc
);
1425 case OPT_Wlarger_than_
:
1426 opts
->x_larger_than_size
= value
;
1427 opts
->x_warn_larger_than
= value
!= -1;
1430 case OPT_Wfatal_errors
:
1431 dc
->fatal_errors
= value
;
1434 case OPT_Wframe_larger_than_
:
1435 opts
->x_frame_larger_than_size
= value
;
1436 opts
->x_warn_frame_larger_than
= value
!= -1;
1439 case OPT_Wstack_usage_
:
1440 opts
->x_warn_stack_usage
= value
;
1441 opts
->x_flag_stack_usage_info
= value
!= -1;
1444 case OPT_Wstrict_aliasing
:
1445 set_Wstrict_aliasing (opts
, value
);
1448 case OPT_Wstrict_overflow
:
1449 opts
->x_warn_strict_overflow
= (value
1450 ? (int) WARN_STRICT_OVERFLOW_CONDITIONAL
1454 case OPT_Wsystem_headers
:
1455 dc
->dc_warn_system_headers
= value
;
1459 opts
->x_flag_gen_aux_info
= 1;
1462 case OPT_auxbase_strip
:
1464 char *tmp
= xstrdup (arg
);
1465 strip_off_ending (tmp
, strlen (tmp
));
1467 opts
->x_aux_base_name
= tmp
;
1474 decode_d_option (arg
, opts
, loc
, dc
);
1477 case OPT_fcall_used_
:
1478 case OPT_fcall_saved_
:
1483 case OPT_fdbg_cnt_list
:
1487 case OPT_fdebug_prefix_map_
:
1491 case OPT_fdiagnostics_show_location_
:
1492 diagnostic_prefixing_rule (dc
) = (diagnostic_prefixing_rule_t
) value
;
1495 case OPT_fdiagnostics_show_caret
:
1496 dc
->show_caret
= value
;
1499 case OPT_fdiagnostics_show_option
:
1500 dc
->show_option_requested
= value
;
1507 case OPT_ffast_math
:
1508 set_fast_math_flags (opts
, value
);
1511 case OPT_funsafe_math_optimizations
:
1512 set_unsafe_math_optimizations_flags (opts
, value
);
1519 case OPT_finline_limit_
:
1520 set_param_value ("max-inline-insns-single", value
/ 2,
1521 opts
->x_param_values
, opts_set
->x_param_values
);
1522 set_param_value ("max-inline-insns-auto", value
/ 2,
1523 opts
->x_param_values
, opts_set
->x_param_values
);
1526 case OPT_finstrument_functions_exclude_function_list_
:
1527 add_comma_separated_to_vector
1528 (&opts
->x_flag_instrument_functions_exclude_functions
, arg
);
1531 case OPT_finstrument_functions_exclude_file_list_
:
1532 add_comma_separated_to_vector
1533 (&opts
->x_flag_instrument_functions_exclude_files
, arg
);
1536 case OPT_fmessage_length_
:
1537 pp_set_line_maximum_length (dc
->printer
, value
);
1538 diagnostic_set_caret_max_width (dc
, value
);
1542 case OPT_fopt_info_
:
1546 case OPT_fpack_struct_
:
1547 if (value
<= 0 || (value
& (value
- 1)) || value
> 16)
1549 "structure alignment must be a small power of two, not %d",
1552 opts
->x_initial_max_fld_align
= value
;
1556 case OPT_fplugin_arg_
:
1560 case OPT_fprofile_use_
:
1561 opts
->x_profile_data_prefix
= xstrdup (arg
);
1562 opts
->x_flag_profile_use
= true;
1564 /* No break here - do -fprofile-use processing. */
1565 case OPT_fprofile_use
:
1566 if (!opts_set
->x_flag_branch_probabilities
)
1567 opts
->x_flag_branch_probabilities
= value
;
1568 if (!opts_set
->x_flag_profile_values
)
1569 opts
->x_flag_profile_values
= value
;
1570 if (!opts_set
->x_flag_unroll_loops
)
1571 opts
->x_flag_unroll_loops
= value
;
1572 if (!opts_set
->x_flag_peel_loops
)
1573 opts
->x_flag_peel_loops
= value
;
1574 if (!opts_set
->x_flag_tracer
)
1575 opts
->x_flag_tracer
= value
;
1576 if (!opts_set
->x_flag_value_profile_transformations
)
1577 opts
->x_flag_value_profile_transformations
= value
;
1578 if (!opts_set
->x_flag_inline_functions
)
1579 opts
->x_flag_inline_functions
= value
;
1580 if (!opts_set
->x_flag_ipa_cp
)
1581 opts
->x_flag_ipa_cp
= value
;
1582 if (!opts_set
->x_flag_ipa_cp_clone
1583 && value
&& opts
->x_flag_ipa_cp
)
1584 opts
->x_flag_ipa_cp_clone
= value
;
1585 if (!opts_set
->x_flag_predictive_commoning
)
1586 opts
->x_flag_predictive_commoning
= value
;
1587 if (!opts_set
->x_flag_unswitch_loops
)
1588 opts
->x_flag_unswitch_loops
= value
;
1589 if (!opts_set
->x_flag_gcse_after_reload
)
1590 opts
->x_flag_gcse_after_reload
= value
;
1591 if (!opts_set
->x_flag_tree_vectorize
)
1592 opts
->x_flag_tree_vectorize
= value
;
1593 if (!opts_set
->x_flag_vect_cost_model
)
1594 opts
->x_flag_vect_cost_model
= value
;
1595 if (!opts_set
->x_flag_tree_loop_distribute_patterns
)
1596 opts
->x_flag_tree_loop_distribute_patterns
= value
;
1599 case OPT_fprofile_generate_
:
1600 opts
->x_profile_data_prefix
= xstrdup (arg
);
1602 /* No break here - do -fprofile-generate processing. */
1603 case OPT_fprofile_generate
:
1604 if (!opts_set
->x_profile_arc_flag
)
1605 opts
->x_profile_arc_flag
= value
;
1606 if (!opts_set
->x_flag_profile_values
)
1607 opts
->x_flag_profile_values
= value
;
1608 if (!opts_set
->x_flag_inline_functions
)
1609 opts
->x_flag_inline_functions
= value
;
1610 /* FIXME: Instrumentation we insert makes ipa-reference bitmaps
1611 quadratic. Disable the pass until better memory representation
1613 if (!opts_set
->x_flag_ipa_reference
&& opts
->x_in_lto_p
)
1614 opts
->x_flag_ipa_reference
= false;
1617 case OPT_fshow_column
:
1618 dc
->show_column
= value
;
1621 case OPT_frandom_seed
:
1622 /* The real switch is -fno-random-seed. */
1628 case OPT_frandom_seed_
:
1632 case OPT_fsched_verbose_
:
1633 #ifdef INSN_SCHEDULING
1634 /* Handled with Var in common.opt. */
1640 case OPT_fsched_stalled_insns_
:
1641 opts
->x_flag_sched_stalled_insns
= value
;
1642 if (opts
->x_flag_sched_stalled_insns
== 0)
1643 opts
->x_flag_sched_stalled_insns
= -1;
1646 case OPT_fsched_stalled_insns_dep_
:
1647 opts
->x_flag_sched_stalled_insns_dep
= value
;
1650 case OPT_fstack_check_
:
1651 if (!strcmp (arg
, "no"))
1652 opts
->x_flag_stack_check
= NO_STACK_CHECK
;
1653 else if (!strcmp (arg
, "generic"))
1654 /* This is the old stack checking method. */
1655 opts
->x_flag_stack_check
= STACK_CHECK_BUILTIN
1656 ? FULL_BUILTIN_STACK_CHECK
1657 : GENERIC_STACK_CHECK
;
1658 else if (!strcmp (arg
, "specific"))
1659 /* This is the new stack checking method. */
1660 opts
->x_flag_stack_check
= STACK_CHECK_BUILTIN
1661 ? FULL_BUILTIN_STACK_CHECK
1662 : STACK_CHECK_STATIC_BUILTIN
1663 ? STATIC_BUILTIN_STACK_CHECK
1664 : GENERIC_STACK_CHECK
;
1666 warning_at (loc
, 0, "unknown stack check parameter \"%s\"", arg
);
1669 case OPT_fstack_limit
:
1670 /* The real switch is -fno-stack-limit. */
1676 case OPT_fstack_limit_register_
:
1677 case OPT_fstack_limit_symbol_
:
1681 case OPT_fstack_usage
:
1682 opts
->x_flag_stack_usage
= value
;
1683 opts
->x_flag_stack_usage_info
= value
!= 0;
1686 case OPT_ftree_vectorizer_verbose_
:
1687 /* -ftree-vectorizer-verbose is deprecated. It is defined in
1688 -terms of fopt-info=N. */
1693 set_debug_level (NO_DEBUG
, DEFAULT_GDB_EXTENSIONS
, arg
, opts
, opts_set
,
1698 set_debug_level (SDB_DEBUG
, false, arg
, opts
, opts_set
, loc
);
1702 if (value
< 2 || value
> 4)
1703 error_at (loc
, "dwarf version %d is not supported", value
);
1705 opts
->x_dwarf_version
= value
;
1706 set_debug_level (DWARF2_DEBUG
, false, "", opts
, opts_set
, loc
);
1709 case OPT_gsplit_dwarf
:
1710 set_debug_level (NO_DEBUG
, DEFAULT_GDB_EXTENSIONS
, "", opts
, opts_set
,
1715 set_debug_level (NO_DEBUG
, 2, arg
, opts
, opts_set
, loc
);
1720 set_debug_level (DBX_DEBUG
, code
== OPT_gstabs_
, arg
, opts
, opts_set
,
1725 set_debug_level (VMS_DEBUG
, false, arg
, opts
, opts_set
, loc
);
1730 set_debug_level (XCOFF_DEBUG
, code
== OPT_gxcoff_
, arg
, opts
, opts_set
,
1734 case OPT_pedantic_errors
:
1735 dc
->pedantic_errors
= 1;
1736 control_warning_option (OPT_Wpedantic
, DK_ERROR
, value
,
1738 handlers
, opts
, opts_set
,
1743 opts
->x_flag_lto
= value
? "" : NULL
;
1747 dc
->dc_inhibit_warnings
= true;
1750 case OPT_fmax_errors_
:
1751 dc
->max_errors
= value
;
1754 case OPT_fuse_ld_bfd
:
1755 case OPT_fuse_ld_gold
:
1756 case OPT_fuse_linker_plugin
:
1757 /* No-op. Used by the driver and passed to us because it starts with f.*/
1761 /* If the flag was handled in a standard way, assume the lack of
1762 processing here is intentional. */
1763 gcc_assert (option_flag_var (scode
, opts
));
1767 common_handle_option_auto (opts
, opts_set
, decoded
, lang_mask
, kind
,
1772 /* Handle --param NAME=VALUE. */
1774 handle_param (struct gcc_options
*opts
, struct gcc_options
*opts_set
,
1775 location_t loc
, const char *carg
)
1780 arg
= xstrdup (carg
);
1781 equal
= strchr (arg
, '=');
1783 error_at (loc
, "%s: --param arguments should be of the form NAME=VALUE",
1787 value
= integral_argument (equal
+ 1);
1789 error_at (loc
, "invalid --param value %qs", equal
+ 1);
1793 set_param_value (arg
, value
,
1794 opts
->x_param_values
, opts_set
->x_param_values
);
1801 /* Used to set the level of strict aliasing warnings in OPTS,
1802 when no level is specified (i.e., when -Wstrict-aliasing, and not
1803 -Wstrict-aliasing=level was given).
1804 ONOFF is assumed to take value 1 when -Wstrict-aliasing is specified,
1805 and 0 otherwise. After calling this function, wstrict_aliasing will be
1806 set to the default value of -Wstrict_aliasing=level, currently 3. */
1808 set_Wstrict_aliasing (struct gcc_options
*opts
, int onoff
)
1810 gcc_assert (onoff
== 0 || onoff
== 1);
1812 opts
->x_warn_strict_aliasing
= 3;
1814 opts
->x_warn_strict_aliasing
= 0;
1817 /* The following routines are useful in setting all the flags that
1818 -ffast-math and -fno-fast-math imply. */
1820 set_fast_math_flags (struct gcc_options
*opts
, int set
)
1822 if (!opts
->frontend_set_flag_unsafe_math_optimizations
)
1824 opts
->x_flag_unsafe_math_optimizations
= set
;
1825 set_unsafe_math_optimizations_flags (opts
, set
);
1827 if (!opts
->frontend_set_flag_finite_math_only
)
1828 opts
->x_flag_finite_math_only
= set
;
1829 if (!opts
->frontend_set_flag_errno_math
)
1830 opts
->x_flag_errno_math
= !set
;
1833 if (!opts
->frontend_set_flag_signaling_nans
)
1834 opts
->x_flag_signaling_nans
= 0;
1835 if (!opts
->frontend_set_flag_rounding_math
)
1836 opts
->x_flag_rounding_math
= 0;
1837 if (!opts
->frontend_set_flag_cx_limited_range
)
1838 opts
->x_flag_cx_limited_range
= 1;
1842 /* When -funsafe-math-optimizations is set the following
1843 flags are set as well. */
1845 set_unsafe_math_optimizations_flags (struct gcc_options
*opts
, int set
)
1847 if (!opts
->frontend_set_flag_trapping_math
)
1848 opts
->x_flag_trapping_math
= !set
;
1849 if (!opts
->frontend_set_flag_signed_zeros
)
1850 opts
->x_flag_signed_zeros
= !set
;
1851 if (!opts
->frontend_set_flag_associative_math
)
1852 opts
->x_flag_associative_math
= set
;
1853 if (!opts
->frontend_set_flag_reciprocal_math
)
1854 opts
->x_flag_reciprocal_math
= set
;
1857 /* Return true iff flags in OPTS are set as if -ffast-math. */
1859 fast_math_flags_set_p (const struct gcc_options
*opts
)
1861 return (!opts
->x_flag_trapping_math
1862 && opts
->x_flag_unsafe_math_optimizations
1863 && opts
->x_flag_finite_math_only
1864 && !opts
->x_flag_signed_zeros
1865 && !opts
->x_flag_errno_math
);
1868 /* Return true iff flags are set as if -ffast-math but using the flags stored
1869 in the struct cl_optimization structure. */
1871 fast_math_flags_struct_set_p (struct cl_optimization
*opt
)
1873 return (!opt
->x_flag_trapping_math
1874 && opt
->x_flag_unsafe_math_optimizations
1875 && opt
->x_flag_finite_math_only
1876 && !opt
->x_flag_signed_zeros
1877 && !opt
->x_flag_errno_math
);
1880 /* Handle a debug output -g switch for options OPTS
1881 (OPTS_SET->x_write_symbols storing whether a debug type was passed
1882 explicitly), location LOC. EXTENDED is true or false to support
1883 extended output (2 is special and means "-ggdb" was given). */
1885 set_debug_level (enum debug_info_type type
, int extended
, const char *arg
,
1886 struct gcc_options
*opts
, struct gcc_options
*opts_set
,
1889 opts
->x_use_gnu_debug_info_extensions
= extended
;
1891 if (type
== NO_DEBUG
)
1893 if (opts
->x_write_symbols
== NO_DEBUG
)
1895 opts
->x_write_symbols
= PREFERRED_DEBUGGING_TYPE
;
1899 #ifdef DWARF2_DEBUGGING_INFO
1900 opts
->x_write_symbols
= DWARF2_DEBUG
;
1901 #elif defined DBX_DEBUGGING_INFO
1902 opts
->x_write_symbols
= DBX_DEBUG
;
1906 if (opts
->x_write_symbols
== NO_DEBUG
)
1907 warning_at (loc
, 0, "target system does not support debug output");
1912 /* Does it conflict with an already selected type? */
1913 if (opts_set
->x_write_symbols
!= NO_DEBUG
1914 && opts
->x_write_symbols
!= NO_DEBUG
1915 && type
!= opts
->x_write_symbols
)
1916 error_at (loc
, "debug format \"%s\" conflicts with prior selection",
1917 debug_type_names
[type
]);
1918 opts
->x_write_symbols
= type
;
1919 opts_set
->x_write_symbols
= type
;
1922 /* A debug flag without a level defaults to level 2. */
1925 if (!opts
->x_debug_info_level
)
1926 opts
->x_debug_info_level
= DINFO_LEVEL_NORMAL
;
1930 int argval
= integral_argument (arg
);
1932 error_at (loc
, "unrecognised debug output level \"%s\"", arg
);
1933 else if (argval
> 3)
1934 error_at (loc
, "debug output level %s is too high", arg
);
1936 opts
->x_debug_info_level
= (enum debug_info_levels
) argval
;
1940 /* Arrange to dump core on error for diagnostic context DC. (The
1941 regular error message is still printed first, except in the case of
1945 setup_core_dumping (diagnostic_context
*dc
)
1948 signal (SIGABRT
, SIG_DFL
);
1950 #if defined(HAVE_SETRLIMIT)
1953 if (getrlimit (RLIMIT_CORE
, &rlim
) != 0)
1954 fatal_error ("getting core file size maximum limit: %m");
1955 rlim
.rlim_cur
= rlim
.rlim_max
;
1956 if (setrlimit (RLIMIT_CORE
, &rlim
) != 0)
1957 fatal_error ("setting core file size limit to maximum: %m");
1960 diagnostic_abort_on_error (dc
);
1963 /* Parse a -d<ARG> command line switch for OPTS, location LOC,
1964 diagnostic context DC. */
1967 decode_d_option (const char *arg
, struct gcc_options
*opts
,
1968 location_t loc
, diagnostic_context
*dc
)
1976 opts
->x_flag_debug_asm
= 1;
1979 opts
->x_flag_print_asm_name
= 1;
1982 opts
->x_flag_dump_rtl_in_asm
= 1;
1983 opts
->x_flag_print_asm_name
= 1;
1986 opts
->x_rtl_dump_and_exit
= 1;
1988 case 'D': /* These are handled by the preprocessor. */
1995 setup_core_dumping (dc
);
1998 opts
->x_flag_dump_all_passed
= true;
2002 warning_at (loc
, 0, "unrecognized gcc debugging option: %c", c
);
2007 /* Enable (or disable if VALUE is 0) a warning option ARG (language
2008 mask LANG_MASK, option handlers HANDLERS) as an error for option
2009 structures OPTS and OPTS_SET, diagnostic context DC (possibly
2010 NULL), location LOC. This is used by -Werror=. */
2013 enable_warning_as_error (const char *arg
, int value
, unsigned int lang_mask
,
2014 const struct cl_option_handlers
*handlers
,
2015 struct gcc_options
*opts
,
2016 struct gcc_options
*opts_set
,
2017 location_t loc
, diagnostic_context
*dc
)
2022 new_option
= XNEWVEC (char, strlen (arg
) + 2);
2023 new_option
[0] = 'W';
2024 strcpy (new_option
+ 1, arg
);
2025 option_index
= find_opt (new_option
, lang_mask
);
2026 if (option_index
== OPT_SPECIAL_unknown
)
2028 error_at (loc
, "-Werror=%s: no option -%s", arg
, new_option
);
2032 const diagnostic_t kind
= value
? DK_ERROR
: DK_WARNING
;
2034 control_warning_option (option_index
, (int) kind
, value
,
2036 handlers
, opts
, opts_set
, dc
);
2041 /* Return malloced memory for the name of the option OPTION_INDEX
2042 which enabled a diagnostic (context CONTEXT), originally of type
2043 ORIG_DIAG_KIND but possibly converted to DIAG_KIND by options such
2047 option_name (diagnostic_context
*context
, int option_index
,
2048 diagnostic_t orig_diag_kind
, diagnostic_t diag_kind
)
2052 /* A warning classified as an error. */
2053 if ((orig_diag_kind
== DK_WARNING
|| orig_diag_kind
== DK_PEDWARN
)
2054 && diag_kind
== DK_ERROR
)
2055 return concat (cl_options
[OPT_Werror_
].opt_text
,
2056 /* Skip over "-W". */
2057 cl_options
[option_index
].opt_text
+ 2,
2059 /* A warning with option. */
2061 return xstrdup (cl_options
[option_index
].opt_text
);
2063 /* A warning without option classified as an error. */
2064 else if (orig_diag_kind
== DK_WARNING
|| orig_diag_kind
== DK_PEDWARN
2065 || diag_kind
== DK_WARNING
)
2067 if (context
->warning_as_error_requested
)
2068 return xstrdup (cl_options
[OPT_Werror
].opt_text
);
2070 return xstrdup (_("enabled by default"));