1 /* Command line option handling.
2 Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
3 Free Software Foundation, Inc.
4 Contributed by Neil Booth.
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
25 #include "coretypes.h"
26 #include "tm.h" /* For STACK_CHECK_BUILTIN,
27 STACK_CHECK_STATIC_BUILTIN, DEFAULT_GDB_EXTENSIONS,
28 DWARF2_DEBUGGING_INFO and DBX_DEBUGGING_INFO. */
33 #include "diagnostic.h"
34 #include "opts-diagnostic.h"
35 #include "insn-attr-common.h"
36 #include "common/common-target.h"
38 /* Indexed by enum debug_info_type. */
39 const char *const debug_type_names
[] =
41 "none", "stabs", "coff", "dwarf-2", "xcoff", "vms"
44 /* Parse the -femit-struct-debug-detailed option value
45 and set the flag variables. */
47 #define MATCH( prefix, string ) \
48 ((strncmp (prefix, string, sizeof prefix - 1) == 0) \
49 ? ((string += sizeof prefix - 1), 1) : 0)
52 set_struct_debug_option (struct gcc_options
*opts
, location_t loc
,
55 /* various labels for comparison */
56 static const char dfn_lbl
[] = "dfn:", dir_lbl
[] = "dir:", ind_lbl
[] = "ind:";
57 static const char ord_lbl
[] = "ord:", gen_lbl
[] = "gen:";
58 static const char none_lbl
[] = "none", any_lbl
[] = "any";
59 static const char base_lbl
[] = "base", sys_lbl
[] = "sys";
61 enum debug_struct_file files
= DINFO_STRUCT_FILE_ANY
;
62 /* Default is to apply to as much as possible. */
63 enum debug_info_usage usage
= DINFO_USAGE_NUM_ENUMS
;
67 if (MATCH (dfn_lbl
, spec
))
68 usage
= DINFO_USAGE_DFN
;
69 else if (MATCH (dir_lbl
, spec
))
70 usage
= DINFO_USAGE_DIR_USE
;
71 else if (MATCH (ind_lbl
, spec
))
72 usage
= DINFO_USAGE_IND_USE
;
74 /* Generics or not? */
75 if (MATCH (ord_lbl
, spec
))
77 else if (MATCH (gen_lbl
, spec
))
80 /* What allowable environment? */
81 if (MATCH (none_lbl
, spec
))
82 files
= DINFO_STRUCT_FILE_NONE
;
83 else if (MATCH (any_lbl
, spec
))
84 files
= DINFO_STRUCT_FILE_ANY
;
85 else if (MATCH (sys_lbl
, spec
))
86 files
= DINFO_STRUCT_FILE_SYS
;
87 else if (MATCH (base_lbl
, spec
))
88 files
= DINFO_STRUCT_FILE_BASE
;
91 "argument %qs to %<-femit-struct-debug-detailed%> "
95 /* Effect the specification. */
96 if (usage
== DINFO_USAGE_NUM_ENUMS
)
100 opts
->x_debug_struct_ordinary
[DINFO_USAGE_DFN
] = files
;
101 opts
->x_debug_struct_ordinary
[DINFO_USAGE_DIR_USE
] = files
;
102 opts
->x_debug_struct_ordinary
[DINFO_USAGE_IND_USE
] = files
;
106 opts
->x_debug_struct_generic
[DINFO_USAGE_DFN
] = files
;
107 opts
->x_debug_struct_generic
[DINFO_USAGE_DIR_USE
] = files
;
108 opts
->x_debug_struct_generic
[DINFO_USAGE_IND_USE
] = files
;
114 opts
->x_debug_struct_ordinary
[usage
] = files
;
116 opts
->x_debug_struct_generic
[usage
] = files
;
120 set_struct_debug_option (opts
, loc
, spec
+1);
123 /* No more -femit-struct-debug-detailed specifications.
127 "argument %qs to %<-femit-struct-debug-detailed%> unknown",
129 if (opts
->x_debug_struct_ordinary
[DINFO_USAGE_DIR_USE
]
130 < opts
->x_debug_struct_ordinary
[DINFO_USAGE_IND_USE
]
131 || opts
->x_debug_struct_generic
[DINFO_USAGE_DIR_USE
]
132 < opts
->x_debug_struct_generic
[DINFO_USAGE_IND_USE
])
134 "%<-femit-struct-debug-detailed=dir:...%> must allow "
135 "at least as much as "
136 "%<-femit-struct-debug-detailed=ind:...%>");
140 /* Handle -ftree-vectorizer-verbose=VAL for options OPTS. */
143 vect_set_verbosity_level (struct gcc_options
*opts
, int val
)
145 if (val
< MAX_VERBOSITY_LEVEL
)
146 opts
->x_user_vect_verbosity_level
= (enum vect_verbosity_levels
) val
;
148 opts
->x_user_vect_verbosity_level
149 = (enum vect_verbosity_levels
) (MAX_VERBOSITY_LEVEL
- 1);
153 /* Strip off a legitimate source ending from the input string NAME of
154 length LEN. Rather than having to know the names used by all of
155 our front ends, we strip off an ending of a period followed by
156 up to five characters. (Java uses ".class".) */
159 strip_off_ending (char *name
, int len
)
162 for (i
= 2; i
< 6 && len
> i
; i
++)
164 if (name
[len
- i
] == '.')
166 name
[len
- i
] = '\0';
172 /* Find the base name of a path, stripping off both directories and
173 a single final extension. */
175 base_of_path (const char *path
, const char **base_out
)
177 const char *base
= path
;
179 const char *p
= path
;
183 if (IS_DIR_SEPARATOR(c
))
198 /* What to print when a switch has no documentation. */
199 static const char undocumented_msg
[] = N_("This switch lacks documentation");
201 typedef char *char_p
; /* For DEF_VEC_P. */
203 DEF_VEC_ALLOC_P(char_p
,heap
);
205 static void handle_param (struct gcc_options
*opts
,
206 struct gcc_options
*opts_set
, location_t loc
,
208 static void set_debug_level (enum debug_info_type type
, int extended
,
209 const char *arg
, struct gcc_options
*opts
,
210 struct gcc_options
*opts_set
,
212 static void set_fast_math_flags (struct gcc_options
*opts
, int set
);
213 static void decode_d_option (const char *arg
, struct gcc_options
*opts
,
214 location_t loc
, diagnostic_context
*dc
);
215 static void set_unsafe_math_optimizations_flags (struct gcc_options
*opts
,
217 static void enable_warning_as_error (const char *arg
, int value
,
218 unsigned int lang_mask
,
219 const struct cl_option_handlers
*handlers
,
220 struct gcc_options
*opts
,
221 struct gcc_options
*opts_set
,
223 diagnostic_context
*dc
);
225 /* Handle a back-end option; arguments and return value as for
229 target_handle_option (struct gcc_options
*opts
,
230 struct gcc_options
*opts_set
,
231 const struct cl_decoded_option
*decoded
,
232 unsigned int lang_mask ATTRIBUTE_UNUSED
, int kind
,
234 const struct cl_option_handlers
*handlers ATTRIBUTE_UNUSED
,
235 diagnostic_context
*dc
)
237 gcc_assert (dc
== global_dc
);
238 gcc_assert (kind
== DK_UNSPECIFIED
);
239 return targetm_common
.handle_option (opts
, opts_set
, decoded
, loc
);
242 /* Add comma-separated strings to a char_p vector. */
245 add_comma_separated_to_vector (void **pvec
, const char *arg
)
251 VEC(char_p
,heap
) *vec
= (VEC(char_p
,heap
) *) *pvec
;
253 /* We never free this string. */
266 VEC_safe_push (char_p
, heap
, vec
, token_start
);
269 if (*r
== '\\' && r
[1] == ',')
277 if (*token_start
!= '\0')
278 VEC_safe_push (char_p
, heap
, vec
, token_start
);
283 /* Initialize OPTS and OPTS_SET before using them in parsing options. */
286 init_options_struct (struct gcc_options
*opts
, struct gcc_options
*opts_set
)
288 size_t num_params
= get_num_compiler_params ();
290 *opts
= global_options_init
;
291 memset (opts_set
, 0, sizeof (*opts_set
));
293 opts
->x_param_values
= XNEWVEC (int, num_params
);
294 opts_set
->x_param_values
= XCNEWVEC (int, num_params
);
295 init_param_values (opts
->x_param_values
);
297 /* Initialize whether `char' is signed. */
298 opts
->x_flag_signed_char
= DEFAULT_SIGNED_CHAR
;
299 /* Set this to a special "uninitialized" value. The actual default
300 is set after target options have been processed. */
301 opts
->x_flag_short_enums
= 2;
303 /* Initialize target_flags before default_options_optimization
304 so the latter can modify it. */
305 opts
->x_target_flags
= targetm_common
.default_target_flags
;
307 /* Some targets have ABI-specified unwind tables. */
308 opts
->x_flag_unwind_tables
= targetm_common
.unwind_tables_default
;
310 /* Some targets have other target-specific initialization. */
311 targetm_common
.option_init_struct (opts
);
314 /* If indicated by the optimization level LEVEL (-Os if SIZE is set,
315 -Ofast if FAST is set), apply the option DEFAULT_OPT to OPTS and
316 OPTS_SET, diagnostic context DC, location LOC, with language mask
317 LANG_MASK and option handlers HANDLERS. */
320 maybe_default_option (struct gcc_options
*opts
,
321 struct gcc_options
*opts_set
,
322 const struct default_options
*default_opt
,
323 int level
, bool size
, bool fast
,
324 unsigned int lang_mask
,
325 const struct cl_option_handlers
*handlers
,
327 diagnostic_context
*dc
)
329 const struct cl_option
*option
= &cl_options
[default_opt
->opt_index
];
333 gcc_assert (level
== 2);
335 gcc_assert (level
== 3);
337 switch (default_opt
->levels
)
343 case OPT_LEVELS_0_ONLY
:
344 enabled
= (level
== 0);
347 case OPT_LEVELS_1_PLUS
:
348 enabled
= (level
>= 1);
351 case OPT_LEVELS_1_PLUS_SPEED_ONLY
:
352 enabled
= (level
>= 1 && !size
);
355 case OPT_LEVELS_2_PLUS
:
356 enabled
= (level
>= 2);
359 case OPT_LEVELS_2_PLUS_SPEED_ONLY
:
360 enabled
= (level
>= 2 && !size
);
363 case OPT_LEVELS_3_PLUS
:
364 enabled
= (level
>= 3);
367 case OPT_LEVELS_3_PLUS_AND_SIZE
:
368 enabled
= (level
>= 3 || size
);
371 case OPT_LEVELS_SIZE
:
375 case OPT_LEVELS_FAST
:
379 case OPT_LEVELS_NONE
:
385 handle_generated_option (opts
, opts_set
, default_opt
->opt_index
,
386 default_opt
->arg
, default_opt
->value
,
387 lang_mask
, DK_UNSPECIFIED
, loc
,
389 else if (default_opt
->arg
== NULL
390 && !option
->cl_reject_negative
)
391 handle_generated_option (opts
, opts_set
, default_opt
->opt_index
,
392 default_opt
->arg
, !default_opt
->value
,
393 lang_mask
, DK_UNSPECIFIED
, loc
,
397 /* As indicated by the optimization level LEVEL (-Os if SIZE is set,
398 -Ofast if FAST is set), apply the options in array DEFAULT_OPTS to
399 OPTS and OPTS_SET, diagnostic context DC, location LOC, with
400 language mask LANG_MASK and option handlers HANDLERS. */
403 maybe_default_options (struct gcc_options
*opts
,
404 struct gcc_options
*opts_set
,
405 const struct default_options
*default_opts
,
406 int level
, bool size
, bool fast
,
407 unsigned int lang_mask
,
408 const struct cl_option_handlers
*handlers
,
410 diagnostic_context
*dc
)
414 for (i
= 0; default_opts
[i
].levels
!= OPT_LEVELS_NONE
; i
++)
415 maybe_default_option (opts
, opts_set
, &default_opts
[i
],
416 level
, size
, fast
, lang_mask
, handlers
, loc
, dc
);
419 /* Table of options enabled by default at different levels. */
421 static const struct default_options default_options_table
[] =
423 /* -O1 optimizations. */
424 { OPT_LEVELS_1_PLUS
, OPT_fdefer_pop
, NULL
, 1 },
426 { OPT_LEVELS_1_PLUS
, OPT_fdelayed_branch
, NULL
, 1 },
428 { OPT_LEVELS_1_PLUS
, OPT_fguess_branch_probability
, NULL
, 1 },
429 { OPT_LEVELS_1_PLUS
, OPT_fcprop_registers
, NULL
, 1 },
430 { OPT_LEVELS_1_PLUS
, OPT_fforward_propagate
, NULL
, 1 },
431 { OPT_LEVELS_1_PLUS
, OPT_fif_conversion
, NULL
, 1 },
432 { OPT_LEVELS_1_PLUS
, OPT_fif_conversion2
, NULL
, 1 },
433 { OPT_LEVELS_1_PLUS
, OPT_fipa_pure_const
, NULL
, 1 },
434 { OPT_LEVELS_1_PLUS
, OPT_fipa_reference
, NULL
, 1 },
435 { OPT_LEVELS_1_PLUS
, OPT_fipa_profile
, NULL
, 1 },
436 { OPT_LEVELS_1_PLUS
, OPT_fmerge_constants
, NULL
, 1 },
437 { OPT_LEVELS_1_PLUS
, OPT_fsplit_wide_types
, NULL
, 1 },
438 { OPT_LEVELS_1_PLUS
, OPT_ftree_ccp
, NULL
, 1 },
439 { OPT_LEVELS_1_PLUS
, OPT_ftree_bit_ccp
, NULL
, 1 },
440 { OPT_LEVELS_1_PLUS
, OPT_ftree_dce
, NULL
, 1 },
441 { OPT_LEVELS_1_PLUS
, OPT_ftree_dominator_opts
, NULL
, 1 },
442 { OPT_LEVELS_1_PLUS
, OPT_ftree_dse
, NULL
, 1 },
443 { OPT_LEVELS_1_PLUS
, OPT_ftree_ter
, NULL
, 1 },
444 { OPT_LEVELS_1_PLUS
, OPT_ftree_sra
, NULL
, 1 },
445 { OPT_LEVELS_1_PLUS
, OPT_ftree_copyrename
, NULL
, 1 },
446 { OPT_LEVELS_1_PLUS
, OPT_ftree_fre
, NULL
, 1 },
447 { OPT_LEVELS_1_PLUS
, OPT_ftree_copy_prop
, NULL
, 1 },
448 { OPT_LEVELS_1_PLUS
, OPT_ftree_sink
, NULL
, 1 },
449 { OPT_LEVELS_1_PLUS
, OPT_ftree_ch
, NULL
, 1 },
450 { OPT_LEVELS_1_PLUS
, OPT_fcombine_stack_adjustments
, NULL
, 1 },
451 { OPT_LEVELS_1_PLUS
, OPT_fcompare_elim
, NULL
, 1 },
453 /* -O2 optimizations. */
454 { OPT_LEVELS_2_PLUS
, OPT_finline_small_functions
, NULL
, 1 },
455 { OPT_LEVELS_2_PLUS
, OPT_findirect_inlining
, NULL
, 1 },
456 { OPT_LEVELS_2_PLUS
, OPT_fpartial_inlining
, NULL
, 1 },
457 { OPT_LEVELS_2_PLUS
, OPT_fthread_jumps
, NULL
, 1 },
458 { OPT_LEVELS_2_PLUS
, OPT_fcrossjumping
, NULL
, 1 },
459 { OPT_LEVELS_2_PLUS
, OPT_foptimize_sibling_calls
, NULL
, 1 },
460 { OPT_LEVELS_2_PLUS
, OPT_fcse_follow_jumps
, NULL
, 1 },
461 { OPT_LEVELS_2_PLUS
, OPT_fgcse
, NULL
, 1 },
462 { OPT_LEVELS_2_PLUS
, OPT_fexpensive_optimizations
, NULL
, 1 },
463 { OPT_LEVELS_2_PLUS
, OPT_frerun_cse_after_loop
, NULL
, 1 },
464 { OPT_LEVELS_2_PLUS
, OPT_fcaller_saves
, NULL
, 1 },
465 { OPT_LEVELS_2_PLUS
, OPT_fpeephole2
, NULL
, 1 },
466 #ifdef INSN_SCHEDULING
467 /* Only run the pre-regalloc scheduling pass if optimizing for speed. */
468 { OPT_LEVELS_2_PLUS_SPEED_ONLY
, OPT_fschedule_insns
, NULL
, 1 },
469 { OPT_LEVELS_2_PLUS
, OPT_fschedule_insns2
, NULL
, 1 },
471 { OPT_LEVELS_2_PLUS
, OPT_fregmove
, NULL
, 1 },
472 { OPT_LEVELS_2_PLUS
, OPT_fstrict_aliasing
, NULL
, 1 },
473 { OPT_LEVELS_2_PLUS
, OPT_fstrict_overflow
, NULL
, 1 },
474 { OPT_LEVELS_2_PLUS
, OPT_freorder_blocks
, NULL
, 1 },
475 { OPT_LEVELS_2_PLUS
, OPT_freorder_functions
, NULL
, 1 },
476 { OPT_LEVELS_2_PLUS
, OPT_ftree_vrp
, NULL
, 1 },
477 { OPT_LEVELS_2_PLUS
, OPT_ftree_builtin_call_dce
, NULL
, 1 },
478 { OPT_LEVELS_2_PLUS
, OPT_ftree_pre
, NULL
, 1 },
479 { OPT_LEVELS_2_PLUS
, OPT_ftree_switch_conversion
, NULL
, 1 },
480 { OPT_LEVELS_2_PLUS
, OPT_fipa_cp
, NULL
, 1 },
481 { OPT_LEVELS_2_PLUS
, OPT_fdevirtualize
, NULL
, 1 },
482 { OPT_LEVELS_2_PLUS
, OPT_fipa_sra
, NULL
, 1 },
483 { OPT_LEVELS_2_PLUS
, OPT_falign_loops
, NULL
, 1 },
484 { OPT_LEVELS_2_PLUS
, OPT_falign_jumps
, NULL
, 1 },
485 { OPT_LEVELS_2_PLUS
, OPT_falign_labels
, NULL
, 1 },
486 { OPT_LEVELS_2_PLUS
, OPT_falign_functions
, NULL
, 1 },
487 { OPT_LEVELS_2_PLUS
, OPT_ftree_tail_merge
, NULL
, 1 },
488 { OPT_LEVELS_2_PLUS_SPEED_ONLY
, OPT_foptimize_strlen
, 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
, 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_fipa_cp_clone
, NULL
, 1 },
502 /* -Ofast adds optimizations to -O3. */
503 { OPT_LEVELS_FAST
, OPT_ffast_math
, NULL
, 1 },
505 { OPT_LEVELS_NONE
, 0, NULL
, 0 }
508 /* Default the options in OPTS and OPTS_SET based on the optimization
509 settings in DECODED_OPTIONS and DECODED_OPTIONS_COUNT. */
511 default_options_optimization (struct gcc_options
*opts
,
512 struct gcc_options
*opts_set
,
513 struct cl_decoded_option
*decoded_options
,
514 unsigned int decoded_options_count
,
516 unsigned int lang_mask
,
517 const struct cl_option_handlers
*handlers
,
518 diagnostic_context
*dc
)
523 /* Scan to see what optimization level has been specified. That will
524 determine the default value of many flags. */
525 for (i
= 1; i
< decoded_options_count
; i
++)
527 struct cl_decoded_option
*opt
= &decoded_options
[i
];
528 switch (opt
->opt_index
)
531 if (*opt
->arg
== '\0')
533 opts
->x_optimize
= 1;
534 opts
->x_optimize_size
= 0;
535 opts
->x_optimize_fast
= 0;
539 const int optimize_val
= integral_argument (opt
->arg
);
540 if (optimize_val
== -1)
542 "argument to %qs should be a non-negative integer",
546 opts
->x_optimize
= optimize_val
;
547 if ((unsigned int) opts
->x_optimize
> 255)
548 opts
->x_optimize
= 255;
549 opts
->x_optimize_size
= 0;
550 opts
->x_optimize_fast
= 0;
556 opts
->x_optimize_size
= 1;
558 /* Optimizing for size forces optimize to be 2. */
559 opts
->x_optimize
= 2;
560 opts
->x_optimize_fast
= 0;
564 /* -Ofast only adds flags to -O3. */
565 opts
->x_optimize_size
= 0;
566 opts
->x_optimize
= 3;
567 opts
->x_optimize_fast
= 1;
571 /* Ignore other options in this prescan. */
576 maybe_default_options (opts
, opts_set
, default_options_table
,
577 opts
->x_optimize
, opts
->x_optimize_size
,
578 opts
->x_optimize_fast
, lang_mask
, handlers
, loc
, dc
);
580 /* -O2 param settings. */
581 opt2
= (opts
->x_optimize
>= 2);
583 /* Track fields in field-sensitive alias analysis. */
584 maybe_set_param_value
585 (PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE
,
586 opt2
? 100 : default_param_value (PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE
),
587 opts
->x_param_values
, opts_set
->x_param_values
);
589 /* For -O1 only do loop invariant motion for very small loops. */
590 maybe_set_param_value
591 (PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP
,
592 opt2
? default_param_value (PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP
) : 1000,
593 opts
->x_param_values
, opts_set
->x_param_values
);
595 if (opts
->x_optimize_size
)
596 /* We want to crossjump as much as possible. */
597 maybe_set_param_value (PARAM_MIN_CROSSJUMP_INSNS
, 1,
598 opts
->x_param_values
, opts_set
->x_param_values
);
600 maybe_set_param_value (PARAM_MIN_CROSSJUMP_INSNS
,
601 default_param_value (PARAM_MIN_CROSSJUMP_INSNS
),
602 opts
->x_param_values
, opts_set
->x_param_values
);
604 /* Allow default optimizations to be specified on a per-machine basis. */
605 maybe_default_options (opts
, opts_set
,
606 targetm_common
.option_optimization_table
,
607 opts
->x_optimize
, opts
->x_optimize_size
,
608 opts
->x_optimize_fast
, lang_mask
, handlers
, loc
, dc
);
611 /* After all options at LOC have been read into OPTS and OPTS_SET,
612 finalize settings of those options and diagnose incompatible
615 finish_options (struct gcc_options
*opts
, struct gcc_options
*opts_set
,
618 enum unwind_info_type ui_except
;
620 if (opts
->x_dump_base_name
&& ! IS_ABSOLUTE_PATH (opts
->x_dump_base_name
))
622 /* First try to make OPTS->X_DUMP_BASE_NAME relative to the
623 OPTS->X_DUMP_DIR_NAME directory. Then try to make
624 OPTS->X_DUMP_BASE_NAME relative to the OPTS->X_AUX_BASE_NAME
625 directory, typically the directory to contain the object
627 if (opts
->x_dump_dir_name
)
628 opts
->x_dump_base_name
= concat (opts
->x_dump_dir_name
,
629 opts
->x_dump_base_name
, NULL
);
630 else if (opts
->x_aux_base_name
631 && strcmp (opts
->x_aux_base_name
, HOST_BIT_BUCKET
) != 0)
633 const char *aux_base
;
635 base_of_path (opts
->x_aux_base_name
, &aux_base
);
636 if (opts
->x_aux_base_name
!= aux_base
)
638 int dir_len
= aux_base
- opts
->x_aux_base_name
;
639 char *new_dump_base_name
=
640 XNEWVEC (char, strlen (opts
->x_dump_base_name
) + dir_len
+ 1);
642 /* Copy directory component from OPTS->X_AUX_BASE_NAME. */
643 memcpy (new_dump_base_name
, opts
->x_aux_base_name
, dir_len
);
644 /* Append existing OPTS->X_DUMP_BASE_NAME. */
645 strcpy (new_dump_base_name
+ dir_len
, opts
->x_dump_base_name
);
646 opts
->x_dump_base_name
= new_dump_base_name
;
651 /* Handle related options for unit-at-a-time, toplevel-reorder, and
653 if (!opts
->x_flag_unit_at_a_time
)
655 if (opts
->x_flag_section_anchors
&& opts_set
->x_flag_section_anchors
)
656 error_at (loc
, "section anchors must be disabled when unit-at-a-time "
658 opts
->x_flag_section_anchors
= 0;
659 if (opts
->x_flag_toplevel_reorder
== 1)
660 error_at (loc
, "toplevel reorder must be disabled when unit-at-a-time "
662 opts
->x_flag_toplevel_reorder
= 0;
665 /* -Wmissing-noreturn is alias for -Wsuggest-attribute=noreturn. */
666 if (opts
->x_warn_missing_noreturn
)
667 opts
->x_warn_suggest_attribute_noreturn
= true;
669 /* Unless the user has asked for section anchors, we disable toplevel
670 reordering at -O0 to disable transformations that might be surprising
671 to end users and to get -fno-toplevel-reorder tested. */
672 if (!opts
->x_optimize
673 && opts
->x_flag_toplevel_reorder
== 2
674 && !(opts
->x_flag_section_anchors
&& opts_set
->x_flag_section_anchors
))
676 opts
->x_flag_toplevel_reorder
= 0;
677 opts
->x_flag_section_anchors
= 0;
679 if (!opts
->x_flag_toplevel_reorder
)
681 if (opts
->x_flag_section_anchors
&& opts_set
->x_flag_section_anchors
)
682 error_at (loc
, "section anchors must be disabled when toplevel reorder"
684 opts
->x_flag_section_anchors
= 0;
687 if (!opts
->x_flag_opts_finished
)
689 if (opts
->x_flag_pie
)
690 opts
->x_flag_pic
= opts
->x_flag_pie
;
691 if (opts
->x_flag_pic
&& !opts
->x_flag_pie
)
692 opts
->x_flag_shlib
= 1;
693 opts
->x_flag_opts_finished
= true;
696 if (opts
->x_optimize
== 0)
698 /* Inlining does not work if not optimizing,
699 so force it not to be done. */
700 opts
->x_warn_inline
= 0;
701 opts
->x_flag_no_inline
= 1;
704 /* The optimization to partition hot and cold basic blocks into separate
705 sections of the .o and executable files does not work (currently)
706 with exception handling. This is because there is no support for
707 generating unwind info. If opts->x_flag_exceptions is turned on
708 we need to turn off the partitioning optimization. */
710 ui_except
= targetm_common
.except_unwind_info (opts
);
712 if (opts
->x_flag_exceptions
713 && opts
->x_flag_reorder_blocks_and_partition
714 && (ui_except
== UI_SJLJ
|| ui_except
== UI_TARGET
))
717 "-freorder-blocks-and-partition does not work "
718 "with exceptions on this architecture");
719 opts
->x_flag_reorder_blocks_and_partition
= 0;
720 opts
->x_flag_reorder_blocks
= 1;
723 /* If user requested unwind info, then turn off the partitioning
726 if (opts
->x_flag_unwind_tables
727 && !targetm_common
.unwind_tables_default
728 && opts
->x_flag_reorder_blocks_and_partition
729 && (ui_except
== UI_SJLJ
|| ui_except
== UI_TARGET
))
732 "-freorder-blocks-and-partition does not support "
733 "unwind info on this architecture");
734 opts
->x_flag_reorder_blocks_and_partition
= 0;
735 opts
->x_flag_reorder_blocks
= 1;
738 /* If the target requested unwind info, then turn off the partitioning
739 optimization with a different message. Likewise, if the target does not
740 support named sections. */
742 if (opts
->x_flag_reorder_blocks_and_partition
743 && (!targetm_common
.have_named_sections
744 || (opts
->x_flag_unwind_tables
745 && targetm_common
.unwind_tables_default
746 && (ui_except
== UI_SJLJ
|| ui_except
== UI_TARGET
))))
749 "-freorder-blocks-and-partition does not work "
750 "on this architecture");
751 opts
->x_flag_reorder_blocks_and_partition
= 0;
752 opts
->x_flag_reorder_blocks
= 1;
755 if (opts
->x_flag_reorder_blocks_and_partition
756 && !opts_set
->x_flag_reorder_functions
)
757 opts
->x_flag_reorder_functions
= 1;
759 /* Pipelining of outer loops is only possible when general pipelining
760 capabilities are requested. */
761 if (!opts
->x_flag_sel_sched_pipelining
)
762 opts
->x_flag_sel_sched_pipelining_outer_loops
= 0;
764 if (opts
->x_flag_conserve_stack
)
766 maybe_set_param_value (PARAM_LARGE_STACK_FRAME
, 100,
767 opts
->x_param_values
, opts_set
->x_param_values
);
768 maybe_set_param_value (PARAM_STACK_FRAME_GROWTH
, 40,
769 opts
->x_param_values
, opts_set
->x_param_values
);
772 if (opts
->x_flag_lto
)
775 opts
->x_flag_generate_lto
= 1;
777 /* When generating IL, do not operate in whole-program mode.
778 Otherwise, symbols will be privatized too early, causing link
780 opts
->x_flag_whole_program
= 0;
782 error_at (loc
, "LTO support has not been enabled in this configuration");
784 if (!opts
->x_flag_fat_lto_objects
&& !HAVE_LTO_PLUGIN
)
785 error_at (loc
, "-fno-fat-lto-objects are supported only with linker plugin.");
787 if ((opts
->x_flag_lto_partition_balanced
!= 0) + (opts
->x_flag_lto_partition_1to1
!= 0)
788 + (opts
->x_flag_lto_partition_none
!= 0) >= 1)
790 if ((opts
->x_flag_lto_partition_balanced
!= 0)
791 + (opts
->x_flag_lto_partition_1to1
!= 0)
792 + (opts
->x_flag_lto_partition_none
!= 0) > 1)
793 error_at (loc
, "only one -flto-partition value can be specified");
796 /* We initialize opts->x_flag_split_stack to -1 so that targets can set a
797 default value if they choose based on other options. */
798 if (opts
->x_flag_split_stack
== -1)
799 opts
->x_flag_split_stack
= 0;
800 else if (opts
->x_flag_split_stack
)
802 if (!targetm_common
.supports_split_stack (true, opts
))
804 error_at (loc
, "%<-fsplit-stack%> is not supported by "
805 "this compiler configuration");
806 opts
->x_flag_split_stack
= 0;
810 /* Set PARAM_MAX_STORES_TO_SINK to 0 if either vectorization or if-conversion
812 if (!opts
->x_flag_tree_vectorize
|| !opts
->x_flag_tree_loop_if_convert
)
813 maybe_set_param_value (PARAM_MAX_STORES_TO_SINK
, 0,
814 opts
->x_param_values
, opts_set
->x_param_values
);
816 /* This replaces set_Wunused. */
817 if (opts
->x_warn_unused_function
== -1)
818 opts
->x_warn_unused_function
= opts
->x_warn_unused
;
819 if (opts
->x_warn_unused_label
== -1)
820 opts
->x_warn_unused_label
= opts
->x_warn_unused
;
821 /* Wunused-parameter is enabled if both -Wunused -Wextra are enabled. */
822 if (opts
->x_warn_unused_parameter
== -1)
823 opts
->x_warn_unused_parameter
= (opts
->x_warn_unused
824 && opts
->x_extra_warnings
);
825 if (opts
->x_warn_unused_variable
== -1)
826 opts
->x_warn_unused_variable
= opts
->x_warn_unused
;
827 /* Wunused-but-set-parameter is enabled if both -Wunused -Wextra are
829 if (opts
->x_warn_unused_but_set_parameter
== -1)
830 opts
->x_warn_unused_but_set_parameter
= (opts
->x_warn_unused
831 && opts
->x_extra_warnings
);
832 if (opts
->x_warn_unused_but_set_variable
== -1)
833 opts
->x_warn_unused_but_set_variable
= opts
->x_warn_unused
;
834 if (opts
->x_warn_unused_value
== -1)
835 opts
->x_warn_unused_value
= opts
->x_warn_unused
;
837 /* This replaces set_Wextra. */
838 if (opts
->x_warn_uninitialized
== -1)
839 opts
->x_warn_uninitialized
= opts
->x_extra_warnings
;
842 #define LEFT_COLUMN 27
844 /* Output ITEM, of length ITEM_WIDTH, in the left column,
845 followed by word-wrapped HELP in a second column. */
847 wrap_help (const char *help
,
849 unsigned int item_width
,
850 unsigned int columns
)
852 unsigned int col_width
= LEFT_COLUMN
;
853 unsigned int remaining
, room
, len
;
855 remaining
= strlen (help
);
859 room
= columns
- 3 - MAX (col_width
, item_width
);
868 for (i
= 0; help
[i
]; i
++)
870 if (i
>= room
&& len
!= remaining
)
874 else if ((help
[i
] == '-' || help
[i
] == '/')
875 && help
[i
+ 1] != ' '
876 && i
> 0 && ISALPHA (help
[i
- 1]))
881 printf( " %-*.*s %.*s\n", col_width
, item_width
, item
, len
, help
);
883 while (help
[len
] == ' ')
891 /* Print help for a specific front-end, etc. */
893 print_filtered_help (unsigned int include_flags
,
894 unsigned int exclude_flags
,
895 unsigned int any_flags
,
896 unsigned int columns
,
897 struct gcc_options
*opts
,
898 unsigned int lang_mask
)
903 bool displayed
= false;
905 if (include_flags
== CL_PARAMS
)
907 for (i
= 0; i
< LAST_PARAM
; i
++)
909 const char *param
= compiler_params
[i
].option
;
911 help
= compiler_params
[i
].help
;
912 if (help
== NULL
|| *help
== '\0')
914 if (exclude_flags
& CL_UNDOCUMENTED
)
916 help
= undocumented_msg
;
919 /* Get the translation. */
922 wrap_help (help
, param
, strlen (param
), columns
);
928 if (!opts
->x_help_printed
)
929 opts
->x_help_printed
= XCNEWVAR (char, cl_options_count
);
931 if (!opts
->x_help_enum_printed
)
932 opts
->x_help_enum_printed
= XCNEWVAR (char, cl_enums_count
);
934 for (i
= 0; i
< cl_options_count
; i
++)
937 const struct cl_option
*option
= cl_options
+ i
;
942 if (include_flags
== 0
943 || ((option
->flags
& include_flags
) != include_flags
))
945 if ((option
->flags
& any_flags
) == 0)
949 /* Skip unwanted switches. */
950 if ((option
->flags
& exclude_flags
) != 0)
953 /* The driver currently prints its own help text. */
954 if ((option
->flags
& CL_DRIVER
) != 0
955 && (option
->flags
& (((1U << cl_lang_count
) - 1)
956 | CL_COMMON
| CL_TARGET
)) == 0)
960 /* Skip switches that have already been printed. */
961 if (opts
->x_help_printed
[i
])
964 opts
->x_help_printed
[i
] = true;
969 if (exclude_flags
& CL_UNDOCUMENTED
)
971 help
= undocumented_msg
;
974 /* Get the translation. */
977 /* Find the gap between the name of the
978 option and its descriptive text. */
979 tab
= strchr (help
, '\t');
988 opt
= option
->opt_text
;
992 /* With the -Q option enabled we change the descriptive text associated
993 with an option to be an indication of its current setting. */
994 if (!opts
->x_quiet_flag
)
996 void *flag_var
= option_flag_var (i
, opts
);
998 if (len
< (LEFT_COLUMN
+ 2))
999 strcpy (new_help
, "\t\t");
1001 strcpy (new_help
, "\t");
1003 if (flag_var
!= NULL
1004 && option
->var_type
!= CLVC_DEFER
)
1006 if (option
->flags
& CL_JOINED
)
1008 if (option
->var_type
== CLVC_STRING
)
1010 if (* (const char **) flag_var
!= NULL
)
1011 snprintf (new_help
+ strlen (new_help
),
1012 sizeof (new_help
) - strlen (new_help
),
1013 * (const char **) flag_var
);
1015 else if (option
->var_type
== CLVC_ENUM
)
1017 const struct cl_enum
*e
= &cl_enums
[option
->var_enum
];
1019 const char *arg
= NULL
;
1021 value
= e
->get (flag_var
);
1022 enum_value_to_arg (e
->values
, &arg
, value
, lang_mask
);
1024 arg
= _("[default]");
1025 snprintf (new_help
+ strlen (new_help
),
1026 sizeof (new_help
) - strlen (new_help
),
1030 sprintf (new_help
+ strlen (new_help
),
1031 "%#x", * (int *) flag_var
);
1034 strcat (new_help
, option_enabled (i
, opts
)
1035 ? _("[enabled]") : _("[disabled]"));
1041 wrap_help (help
, opt
, len
, columns
);
1044 if (option
->var_type
== CLVC_ENUM
1045 && opts
->x_help_enum_printed
[option
->var_enum
] != 2)
1046 opts
->x_help_enum_printed
[option
->var_enum
] = 1;
1051 unsigned int langs
= include_flags
& CL_LANG_ALL
;
1054 printf (_(" No options with the desired characteristics were found\n"));
1059 /* PR 31349: Tell the user how to see all of the
1060 options supported by a specific front end. */
1061 for (i
= 0; (1U << i
) < CL_LANG_ALL
; i
++)
1062 if ((1U << i
) & langs
)
1063 printf (_(" None found. Use --help=%s to show *all* the options supported by the %s front-end\n"),
1064 lang_names
[i
], lang_names
[i
]);
1068 else if (! displayed
)
1069 printf (_(" All options with the desired characteristics have already been displayed\n"));
1073 /* Print details of enumerated option arguments, if those
1074 enumerations have help text headings provided. If no help text
1075 is provided, presume that the possible values are listed in the
1076 help text for the relevant options. */
1077 for (i
= 0; i
< cl_enums_count
; i
++)
1079 unsigned int j
, pos
;
1081 if (opts
->x_help_enum_printed
[i
] != 1)
1083 if (cl_enums
[i
].help
== NULL
)
1085 printf (" %s\n ", _(cl_enums
[i
].help
));
1087 for (j
= 0; cl_enums
[i
].values
[j
].arg
!= NULL
; j
++)
1089 unsigned int len
= strlen (cl_enums
[i
].values
[j
].arg
);
1091 if (pos
> 4 && pos
+ 1 + len
<= columns
)
1093 printf (" %s", cl_enums
[i
].values
[j
].arg
);
1103 printf ("%s", cl_enums
[i
].values
[j
].arg
);
1108 opts
->x_help_enum_printed
[i
] = 2;
1112 /* Display help for a specified type of option.
1113 The options must have ALL of the INCLUDE_FLAGS set
1114 ANY of the flags in the ANY_FLAGS set
1115 and NONE of the EXCLUDE_FLAGS set. The current option state is in
1116 OPTS; LANG_MASK is used for interpreting enumerated option state. */
1118 print_specific_help (unsigned int include_flags
,
1119 unsigned int exclude_flags
,
1120 unsigned int any_flags
,
1121 struct gcc_options
*opts
,
1122 unsigned int lang_mask
)
1124 unsigned int all_langs_mask
= (1U << cl_lang_count
) - 1;
1125 const char * description
= NULL
;
1126 const char * descrip_extra
= "";
1130 /* Sanity check: Make sure that we do not have more
1131 languages than we have bits available to enumerate them. */
1132 gcc_assert ((1U << cl_lang_count
) <= CL_MIN_OPTION_CLASS
);
1134 /* If we have not done so already, obtain
1135 the desired maximum width of the output. */
1136 if (opts
->x_help_columns
== 0)
1140 p
= getenv ("COLUMNS");
1143 int value
= atoi (p
);
1146 opts
->x_help_columns
= value
;
1149 if (opts
->x_help_columns
== 0)
1150 /* Use a reasonable default. */
1151 opts
->x_help_columns
= 80;
1154 /* Decide upon the title for the options that we are going to display. */
1155 for (i
= 0, flag
= 1; flag
<= CL_MAX_OPTION_CLASS
; flag
<<= 1, i
++)
1157 switch (flag
& include_flags
)
1164 description
= _("The following options are target specific");
1167 description
= _("The following options control compiler warning messages");
1169 case CL_OPTIMIZATION
:
1170 description
= _("The following options control optimizations");
1173 description
= _("The following options are language-independent");
1176 description
= _("The --param option recognizes the following as parameters");
1179 if (i
>= cl_lang_count
)
1181 if (exclude_flags
& all_langs_mask
)
1182 description
= _("The following options are specific to just the language ");
1184 description
= _("The following options are supported by the language ");
1185 descrip_extra
= lang_names
[i
];
1190 if (description
== NULL
)
1194 if (include_flags
& CL_UNDOCUMENTED
)
1195 description
= _("The following options are not documented");
1196 else if (include_flags
& CL_SEPARATE
)
1197 description
= _("The following options take separate arguments");
1198 else if (include_flags
& CL_JOINED
)
1199 description
= _("The following options take joined arguments");
1202 internal_error ("unrecognized include_flags 0x%x passed to print_specific_help",
1209 if (any_flags
& all_langs_mask
)
1210 description
= _("The following options are language-related");
1212 description
= _("The following options are language-independent");
1216 printf ("%s%s:\n", description
, descrip_extra
);
1217 print_filtered_help (include_flags
, exclude_flags
, any_flags
,
1218 opts
->x_help_columns
, opts
, lang_mask
);
1221 /* Handle target- and language-independent options. Return zero to
1222 generate an "unknown option" message. Only options that need
1223 extra handling need to be listed here; if you simply want
1224 DECODED->value assigned to a variable, it happens automatically. */
1227 common_handle_option (struct gcc_options
*opts
,
1228 struct gcc_options
*opts_set
,
1229 const struct cl_decoded_option
*decoded
,
1230 unsigned int lang_mask
, int kind ATTRIBUTE_UNUSED
,
1232 const struct cl_option_handlers
*handlers
,
1233 diagnostic_context
*dc
)
1235 size_t scode
= decoded
->opt_index
;
1236 const char *arg
= decoded
->arg
;
1237 int value
= decoded
->value
;
1238 enum opt_code code
= (enum opt_code
) scode
;
1240 gcc_assert (decoded
->canonical_option_num_elements
<= 2);
1245 handle_param (opts
, opts_set
, loc
, arg
);
1250 unsigned int all_langs_mask
= (1U << cl_lang_count
) - 1;
1251 unsigned int undoc_mask
;
1254 if (lang_mask
== CL_DRIVER
)
1257 undoc_mask
= ((opts
->x_verbose_flag
| opts
->x_extra_warnings
)
1260 /* First display any single language specific options. */
1261 for (i
= 0; i
< cl_lang_count
; i
++)
1263 (1U << i
, (all_langs_mask
& (~ (1U << i
))) | undoc_mask
, 0, opts
,
1265 /* Next display any multi language specific options. */
1266 print_specific_help (0, undoc_mask
, all_langs_mask
, opts
, lang_mask
);
1267 /* Then display any remaining, non-language options. */
1268 for (i
= CL_MIN_OPTION_CLASS
; i
<= CL_MAX_OPTION_CLASS
; i
<<= 1)
1270 print_specific_help (i
, undoc_mask
, 0, opts
, lang_mask
);
1271 opts
->x_exit_after_options
= true;
1275 case OPT__target_help
:
1276 if (lang_mask
== CL_DRIVER
)
1279 print_specific_help (CL_TARGET
, CL_UNDOCUMENTED
, 0, opts
, lang_mask
);
1280 opts
->x_exit_after_options
= true;
1285 const char * a
= arg
;
1286 unsigned int include_flags
= 0;
1287 /* Note - by default we include undocumented options when listing
1288 specific classes. If you only want to see documented options
1289 then add ",^undocumented" to the --help= option. E.g.:
1291 --help=target,^undocumented */
1292 unsigned int exclude_flags
= 0;
1294 if (lang_mask
== CL_DRIVER
)
1297 /* Walk along the argument string, parsing each word in turn.
1299 arg = [^]{word}[,{arg}]
1300 word = {optimizers|target|warnings|undocumented|
1301 params|common|<language>} */
1306 const char * string
;
1311 { "optimizers", CL_OPTIMIZATION
},
1312 { "target", CL_TARGET
},
1313 { "warnings", CL_WARNING
},
1314 { "undocumented", CL_UNDOCUMENTED
},
1315 { "params", CL_PARAMS
},
1316 { "joined", CL_JOINED
},
1317 { "separate", CL_SEPARATE
},
1318 { "common", CL_COMMON
},
1321 unsigned int * pflags
;
1323 unsigned int lang_flag
, specific_flag
;
1330 pflags
= & exclude_flags
;
1333 pflags
= & include_flags
;
1335 comma
= strchr (a
, ',');
1346 /* Check to see if the string matches an option class name. */
1347 for (i
= 0, specific_flag
= 0; specifics
[i
].string
!= NULL
; i
++)
1348 if (strncasecmp (a
, specifics
[i
].string
, len
) == 0)
1350 specific_flag
= specifics
[i
].flag
;
1354 /* Check to see if the string matches a language name.
1355 Note - we rely upon the alpha-sorted nature of the entries in
1356 the lang_names array, specifically that shorter names appear
1357 before their longer variants. (i.e. C before C++). That way
1358 when we are attempting to match --help=c for example we will
1359 match with C first and not C++. */
1360 for (i
= 0, lang_flag
= 0; i
< cl_lang_count
; i
++)
1361 if (strncasecmp (a
, lang_names
[i
], len
) == 0)
1363 lang_flag
= 1U << i
;
1367 if (specific_flag
!= 0)
1370 * pflags
|= specific_flag
;
1373 /* The option's argument matches both the start of a
1374 language name and the start of an option class name.
1375 We have a special case for when the user has
1376 specified "--help=c", but otherwise we have to issue
1378 if (strncasecmp (a
, "c", len
) == 0)
1379 * pflags
|= lang_flag
;
1382 "--help argument %q.*s is ambiguous, "
1383 "please be more specific",
1387 else if (lang_flag
!= 0)
1388 * pflags
|= lang_flag
;
1391 "unrecognized argument to --help= option: %q.*s",
1400 print_specific_help (include_flags
, exclude_flags
, 0, opts
,
1402 opts
->x_exit_after_options
= true;
1407 if (lang_mask
== CL_DRIVER
)
1410 opts
->x_exit_after_options
= true;
1416 /* Currently handled in a prescan. */
1420 if (lang_mask
== CL_DRIVER
)
1423 enable_warning_as_error (arg
, value
, lang_mask
, handlers
,
1424 opts
, opts_set
, loc
, dc
);
1427 case OPT_Wlarger_than_
:
1428 opts
->x_larger_than_size
= value
;
1429 opts
->x_warn_larger_than
= value
!= -1;
1432 case OPT_Wfatal_errors
:
1433 dc
->fatal_errors
= value
;
1436 case OPT_Wframe_larger_than_
:
1437 opts
->x_frame_larger_than_size
= value
;
1438 opts
->x_warn_frame_larger_than
= value
!= -1;
1441 case OPT_Wstack_usage_
:
1442 opts
->x_warn_stack_usage
= value
;
1443 opts
->x_flag_stack_usage_info
= value
!= -1;
1446 case OPT_Wstrict_aliasing
:
1447 set_Wstrict_aliasing (opts
, value
);
1450 case OPT_Wstrict_overflow
:
1451 opts
->x_warn_strict_overflow
= (value
1452 ? (int) WARN_STRICT_OVERFLOW_CONDITIONAL
1456 case OPT_Wsystem_headers
:
1457 dc
->dc_warn_system_headers
= value
;
1461 opts
->x_flag_gen_aux_info
= 1;
1464 case OPT_auxbase_strip
:
1466 char *tmp
= xstrdup (arg
);
1467 strip_off_ending (tmp
, strlen (tmp
));
1469 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_option
:
1496 dc
->show_option_requested
= value
;
1503 case OPT_ffast_math
:
1504 set_fast_math_flags (opts
, value
);
1507 case OPT_funsafe_math_optimizations
:
1508 set_unsafe_math_optimizations_flags (opts
, value
);
1515 case OPT_finline_limit_
:
1516 set_param_value ("max-inline-insns-single", value
/ 2,
1517 opts
->x_param_values
, opts_set
->x_param_values
);
1518 set_param_value ("max-inline-insns-auto", value
/ 2,
1519 opts
->x_param_values
, opts_set
->x_param_values
);
1522 case OPT_finstrument_functions_exclude_function_list_
:
1523 add_comma_separated_to_vector
1524 (&opts
->x_flag_instrument_functions_exclude_functions
, arg
);
1527 case OPT_finstrument_functions_exclude_file_list_
:
1528 add_comma_separated_to_vector
1529 (&opts
->x_flag_instrument_functions_exclude_files
, arg
);
1532 case OPT_fmessage_length_
:
1533 pp_set_line_maximum_length (dc
->printer
, value
);
1536 case OPT_fpack_struct_
:
1537 if (value
<= 0 || (value
& (value
- 1)) || value
> 16)
1539 "structure alignment must be a small power of two, not %d",
1542 opts
->x_initial_max_fld_align
= value
;
1546 case OPT_fplugin_arg_
:
1550 case OPT_fprofile_use_
:
1551 opts
->x_profile_data_prefix
= xstrdup (arg
);
1552 opts
->x_flag_profile_use
= true;
1554 /* No break here - do -fprofile-use processing. */
1555 case OPT_fprofile_use
:
1556 if (!opts_set
->x_flag_branch_probabilities
)
1557 opts
->x_flag_branch_probabilities
= value
;
1558 if (!opts_set
->x_flag_profile_values
)
1559 opts
->x_flag_profile_values
= value
;
1560 if (!opts_set
->x_flag_unroll_loops
)
1561 opts
->x_flag_unroll_loops
= value
;
1562 if (!opts_set
->x_flag_peel_loops
)
1563 opts
->x_flag_peel_loops
= value
;
1564 if (!opts_set
->x_flag_tracer
)
1565 opts
->x_flag_tracer
= value
;
1566 if (!opts_set
->x_flag_value_profile_transformations
)
1567 opts
->x_flag_value_profile_transformations
= value
;
1568 if (!opts_set
->x_flag_inline_functions
)
1569 opts
->x_flag_inline_functions
= value
;
1570 if (!opts_set
->x_flag_ipa_cp
)
1571 opts
->x_flag_ipa_cp
= value
;
1572 if (!opts_set
->x_flag_ipa_cp_clone
1573 && value
&& opts
->x_flag_ipa_cp
)
1574 opts
->x_flag_ipa_cp_clone
= value
;
1575 if (!opts_set
->x_flag_predictive_commoning
)
1576 opts
->x_flag_predictive_commoning
= value
;
1577 if (!opts_set
->x_flag_unswitch_loops
)
1578 opts
->x_flag_unswitch_loops
= value
;
1579 if (!opts_set
->x_flag_gcse_after_reload
)
1580 opts
->x_flag_gcse_after_reload
= value
;
1583 case OPT_fprofile_generate_
:
1584 opts
->x_profile_data_prefix
= xstrdup (arg
);
1586 /* No break here - do -fprofile-generate processing. */
1587 case OPT_fprofile_generate
:
1588 if (!opts_set
->x_profile_arc_flag
)
1589 opts
->x_profile_arc_flag
= value
;
1590 if (!opts_set
->x_flag_profile_values
)
1591 opts
->x_flag_profile_values
= value
;
1592 if (!opts_set
->x_flag_value_profile_transformations
)
1593 opts
->x_flag_value_profile_transformations
= value
;
1594 if (!opts_set
->x_flag_inline_functions
)
1595 opts
->x_flag_inline_functions
= value
;
1596 /* FIXME: Instrumentation we insert makes ipa-reference bitmaps
1597 quadratic. Disable the pass until better memory representation
1599 if (!opts_set
->x_flag_ipa_reference
&& opts
->x_in_lto_p
)
1600 opts
->x_flag_ipa_reference
= false;
1603 case OPT_fshow_column
:
1604 dc
->show_column
= value
;
1607 case OPT_frandom_seed
:
1608 /* The real switch is -fno-random-seed. */
1614 case OPT_frandom_seed_
:
1618 case OPT_fsched_verbose_
:
1619 #ifdef INSN_SCHEDULING
1620 /* Handled with Var in common.opt. */
1626 case OPT_fsched_stalled_insns_
:
1627 opts
->x_flag_sched_stalled_insns
= value
;
1628 if (opts
->x_flag_sched_stalled_insns
== 0)
1629 opts
->x_flag_sched_stalled_insns
= -1;
1632 case OPT_fsched_stalled_insns_dep_
:
1633 opts
->x_flag_sched_stalled_insns_dep
= value
;
1636 case OPT_fstack_check_
:
1637 if (!strcmp (arg
, "no"))
1638 opts
->x_flag_stack_check
= NO_STACK_CHECK
;
1639 else if (!strcmp (arg
, "generic"))
1640 /* This is the old stack checking method. */
1641 opts
->x_flag_stack_check
= STACK_CHECK_BUILTIN
1642 ? FULL_BUILTIN_STACK_CHECK
1643 : GENERIC_STACK_CHECK
;
1644 else if (!strcmp (arg
, "specific"))
1645 /* This is the new stack checking method. */
1646 opts
->x_flag_stack_check
= STACK_CHECK_BUILTIN
1647 ? FULL_BUILTIN_STACK_CHECK
1648 : STACK_CHECK_STATIC_BUILTIN
1649 ? STATIC_BUILTIN_STACK_CHECK
1650 : GENERIC_STACK_CHECK
;
1652 warning_at (loc
, 0, "unknown stack check parameter \"%s\"", arg
);
1655 case OPT_fstack_limit
:
1656 /* The real switch is -fno-stack-limit. */
1662 case OPT_fstack_limit_register_
:
1663 case OPT_fstack_limit_symbol_
:
1667 case OPT_fstack_usage
:
1668 opts
->x_flag_stack_usage
= value
;
1669 opts
->x_flag_stack_usage_info
= value
!= 0;
1672 case OPT_ftree_vectorizer_verbose_
:
1673 vect_set_verbosity_level (opts
, value
);
1677 set_debug_level (NO_DEBUG
, DEFAULT_GDB_EXTENSIONS
, arg
, opts
, opts_set
,
1682 set_debug_level (SDB_DEBUG
, false, arg
, opts
, opts_set
, loc
);
1686 if (value
< 2 || value
> 4)
1687 error_at (loc
, "dwarf version %d is not supported", value
);
1689 opts
->x_dwarf_version
= value
;
1690 set_debug_level (DWARF2_DEBUG
, false, "", opts
, opts_set
, loc
);
1694 set_debug_level (NO_DEBUG
, 2, arg
, opts
, opts_set
, loc
);
1699 set_debug_level (DBX_DEBUG
, code
== OPT_gstabs_
, arg
, opts
, opts_set
,
1704 set_debug_level (VMS_DEBUG
, false, arg
, opts
, opts_set
, loc
);
1709 set_debug_level (XCOFF_DEBUG
, code
== OPT_gxcoff_
, arg
, opts
, opts_set
,
1713 case OPT_pedantic_errors
:
1714 opts
->x_pedantic
= 1;
1715 dc
->pedantic_errors
= 1;
1719 opts
->x_flag_lto
= value
? "" : NULL
;
1723 dc
->dc_inhibit_warnings
= true;
1726 case OPT_fmax_errors_
:
1727 dc
->max_errors
= value
;
1730 case OPT_fuse_linker_plugin
:
1731 /* No-op. Used by the driver and passed to us because it starts with f.*/
1734 case OPT_Wuninitialized
:
1735 /* Also turn on maybe uninitialized warning. */
1736 opts
->x_warn_maybe_uninitialized
= value
;
1740 /* If the flag was handled in a standard way, assume the lack of
1741 processing here is intentional. */
1742 gcc_assert (option_flag_var (scode
, opts
));
1749 /* Handle --param NAME=VALUE. */
1751 handle_param (struct gcc_options
*opts
, struct gcc_options
*opts_set
,
1752 location_t loc
, const char *carg
)
1757 arg
= xstrdup (carg
);
1758 equal
= strchr (arg
, '=');
1760 error_at (loc
, "%s: --param arguments should be of the form NAME=VALUE",
1764 value
= integral_argument (equal
+ 1);
1766 error_at (loc
, "invalid --param value %qs", equal
+ 1);
1770 set_param_value (arg
, value
,
1771 opts
->x_param_values
, opts_set
->x_param_values
);
1778 /* Used to set the level of strict aliasing warnings in OPTS,
1779 when no level is specified (i.e., when -Wstrict-aliasing, and not
1780 -Wstrict-aliasing=level was given).
1781 ONOFF is assumed to take value 1 when -Wstrict-aliasing is specified,
1782 and 0 otherwise. After calling this function, wstrict_aliasing will be
1783 set to the default value of -Wstrict_aliasing=level, currently 3. */
1785 set_Wstrict_aliasing (struct gcc_options
*opts
, int onoff
)
1787 gcc_assert (onoff
== 0 || onoff
== 1);
1789 opts
->x_warn_strict_aliasing
= 3;
1791 opts
->x_warn_strict_aliasing
= 0;
1794 /* The following routines are useful in setting all the flags that
1795 -ffast-math and -fno-fast-math imply. */
1797 set_fast_math_flags (struct gcc_options
*opts
, int set
)
1799 if (!opts
->frontend_set_flag_unsafe_math_optimizations
)
1801 opts
->x_flag_unsafe_math_optimizations
= set
;
1802 set_unsafe_math_optimizations_flags (opts
, set
);
1804 if (!opts
->frontend_set_flag_finite_math_only
)
1805 opts
->x_flag_finite_math_only
= set
;
1806 if (!opts
->frontend_set_flag_errno_math
)
1807 opts
->x_flag_errno_math
= !set
;
1810 if (!opts
->frontend_set_flag_signaling_nans
)
1811 opts
->x_flag_signaling_nans
= 0;
1812 if (!opts
->frontend_set_flag_rounding_math
)
1813 opts
->x_flag_rounding_math
= 0;
1814 if (!opts
->frontend_set_flag_cx_limited_range
)
1815 opts
->x_flag_cx_limited_range
= 1;
1819 /* When -funsafe-math-optimizations is set the following
1820 flags are set as well. */
1822 set_unsafe_math_optimizations_flags (struct gcc_options
*opts
, int set
)
1824 if (!opts
->frontend_set_flag_trapping_math
)
1825 opts
->x_flag_trapping_math
= !set
;
1826 if (!opts
->frontend_set_flag_signed_zeros
)
1827 opts
->x_flag_signed_zeros
= !set
;
1828 if (!opts
->frontend_set_flag_associative_math
)
1829 opts
->x_flag_associative_math
= set
;
1830 if (!opts
->frontend_set_flag_reciprocal_math
)
1831 opts
->x_flag_reciprocal_math
= set
;
1834 /* Return true iff flags in OPTS are set as if -ffast-math. */
1836 fast_math_flags_set_p (const struct gcc_options
*opts
)
1838 return (!opts
->x_flag_trapping_math
1839 && opts
->x_flag_unsafe_math_optimizations
1840 && opts
->x_flag_finite_math_only
1841 && !opts
->x_flag_signed_zeros
1842 && !opts
->x_flag_errno_math
);
1845 /* Return true iff flags are set as if -ffast-math but using the flags stored
1846 in the struct cl_optimization structure. */
1848 fast_math_flags_struct_set_p (struct cl_optimization
*opt
)
1850 return (!opt
->x_flag_trapping_math
1851 && opt
->x_flag_unsafe_math_optimizations
1852 && opt
->x_flag_finite_math_only
1853 && !opt
->x_flag_signed_zeros
1854 && !opt
->x_flag_errno_math
);
1857 /* Handle a debug output -g switch for options OPTS
1858 (OPTS_SET->x_write_symbols storing whether a debug type was passed
1859 explicitly), location LOC. EXTENDED is true or false to support
1860 extended output (2 is special and means "-ggdb" was given). */
1862 set_debug_level (enum debug_info_type type
, int extended
, const char *arg
,
1863 struct gcc_options
*opts
, struct gcc_options
*opts_set
,
1866 opts
->x_use_gnu_debug_info_extensions
= extended
;
1868 if (type
== NO_DEBUG
)
1870 if (opts
->x_write_symbols
== NO_DEBUG
)
1872 opts
->x_write_symbols
= PREFERRED_DEBUGGING_TYPE
;
1876 #ifdef DWARF2_DEBUGGING_INFO
1877 opts
->x_write_symbols
= DWARF2_DEBUG
;
1878 #elif defined DBX_DEBUGGING_INFO
1879 opts
->x_write_symbols
= DBX_DEBUG
;
1883 if (opts
->x_write_symbols
== NO_DEBUG
)
1884 warning_at (loc
, 0, "target system does not support debug output");
1889 /* Does it conflict with an already selected type? */
1890 if (opts_set
->x_write_symbols
!= NO_DEBUG
1891 && opts
->x_write_symbols
!= NO_DEBUG
1892 && type
!= opts
->x_write_symbols
)
1893 error_at (loc
, "debug format \"%s\" conflicts with prior selection",
1894 debug_type_names
[type
]);
1895 opts
->x_write_symbols
= type
;
1896 opts_set
->x_write_symbols
= type
;
1899 /* A debug flag without a level defaults to level 2. */
1902 if (!opts
->x_debug_info_level
)
1903 opts
->x_debug_info_level
= DINFO_LEVEL_NORMAL
;
1907 int argval
= integral_argument (arg
);
1909 error_at (loc
, "unrecognised debug output level \"%s\"", arg
);
1910 else if (argval
> 3)
1911 error_at (loc
, "debug output level %s is too high", arg
);
1913 opts
->x_debug_info_level
= (enum debug_info_levels
) argval
;
1917 /* Arrange to dump core on error for diagnostic context DC. (The
1918 regular error message is still printed first, except in the case of
1922 setup_core_dumping (diagnostic_context
*dc
)
1925 signal (SIGABRT
, SIG_DFL
);
1927 #if defined(HAVE_SETRLIMIT)
1930 if (getrlimit (RLIMIT_CORE
, &rlim
) != 0)
1931 fatal_error ("getting core file size maximum limit: %m");
1932 rlim
.rlim_cur
= rlim
.rlim_max
;
1933 if (setrlimit (RLIMIT_CORE
, &rlim
) != 0)
1934 fatal_error ("setting core file size limit to maximum: %m");
1937 diagnostic_abort_on_error (dc
);
1940 /* Parse a -d<ARG> command line switch for OPTS, location LOC,
1941 diagnostic context DC. */
1944 decode_d_option (const char *arg
, struct gcc_options
*opts
,
1945 location_t loc
, diagnostic_context
*dc
)
1953 opts
->x_flag_debug_asm
= 1;
1956 opts
->x_flag_print_asm_name
= 1;
1959 opts
->x_flag_dump_rtl_in_asm
= 1;
1960 opts
->x_flag_print_asm_name
= 1;
1963 opts
->x_graph_dump_format
= vcg
;
1966 opts
->x_rtl_dump_and_exit
= 1;
1968 case 'D': /* These are handled by the preprocessor. */
1975 setup_core_dumping (dc
);
1978 opts
->x_flag_dump_all_passed
= true;
1982 warning_at (loc
, 0, "unrecognized gcc debugging option: %c", c
);
1987 /* Enable (or disable if VALUE is 0) a warning option ARG (language
1988 mask LANG_MASK, option handlers HANDLERS) as an error for option
1989 structures OPTS and OPTS_SET, diagnostic context DC (possibly
1990 NULL), location LOC. This is used by -Werror=. */
1993 enable_warning_as_error (const char *arg
, int value
, unsigned int lang_mask
,
1994 const struct cl_option_handlers
*handlers
,
1995 struct gcc_options
*opts
,
1996 struct gcc_options
*opts_set
,
1997 location_t loc
, diagnostic_context
*dc
)
2002 new_option
= XNEWVEC (char, strlen (arg
) + 2);
2003 new_option
[0] = 'W';
2004 strcpy (new_option
+ 1, arg
);
2005 option_index
= find_opt (new_option
, lang_mask
);
2006 if (option_index
== OPT_SPECIAL_unknown
)
2008 error_at (loc
, "-Werror=%s: no option -%s", arg
, new_option
);
2012 const diagnostic_t kind
= value
? DK_ERROR
: DK_WARNING
;
2014 control_warning_option (option_index
, (int) kind
, value
,
2016 handlers
, opts
, opts_set
, dc
);
2017 if (option_index
== OPT_Wuninitialized
)
2018 enable_warning_as_error ("maybe-uninitialized", value
, lang_mask
,
2019 handlers
, opts
, opts_set
, loc
, dc
);
2024 /* Return malloced memory for the name of the option OPTION_INDEX
2025 which enabled a diagnostic (context CONTEXT), originally of type
2026 ORIG_DIAG_KIND but possibly converted to DIAG_KIND by options such
2030 option_name (diagnostic_context
*context
, int option_index
,
2031 diagnostic_t orig_diag_kind
, diagnostic_t diag_kind
)
2035 /* A warning classified as an error. */
2036 if ((orig_diag_kind
== DK_WARNING
|| orig_diag_kind
== DK_PEDWARN
)
2037 && diag_kind
== DK_ERROR
)
2038 return concat (cl_options
[OPT_Werror_
].opt_text
,
2039 /* Skip over "-W". */
2040 cl_options
[option_index
].opt_text
+ 2,
2042 /* A warning with option. */
2044 return xstrdup (cl_options
[option_index
].opt_text
);
2046 /* A warning without option classified as an error. */
2047 else if (orig_diag_kind
== DK_WARNING
|| orig_diag_kind
== DK_PEDWARN
2048 || diag_kind
== DK_WARNING
)
2050 if (context
->warning_as_error_requested
)
2051 return xstrdup (cl_options
[OPT_Werror
].opt_text
);
2053 return xstrdup (_("enabled by default"));