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" /* Needed by rtl.h and used for STACK_CHECK_BUILTIN,
27 STACK_CHECK_STATIC_BUILTIN, DEFAULT_GDB_EXTENSIONS,
28 DWARF2_DEBUGGING_INFO and DBX_DEBUGGING_INFO. */
29 #include "rtl.h" /* Needed by insn-attr.h. */
34 #include "diagnostic.h"
35 #include "opts-diagnostic.h"
36 #include "insn-attr.h" /* For INSN_SCHEDULING and DELAY_SLOTS. */
37 #include "common/common-target.h"
39 /* Parse the -femit-struct-debug-detailed option value
40 and set the flag variables. */
42 #define MATCH( prefix, string ) \
43 ((strncmp (prefix, string, sizeof prefix - 1) == 0) \
44 ? ((string += sizeof prefix - 1), 1) : 0)
47 set_struct_debug_option (struct gcc_options
*opts
, location_t loc
,
50 /* various labels for comparison */
51 static const char dfn_lbl
[] = "dfn:", dir_lbl
[] = "dir:", ind_lbl
[] = "ind:";
52 static const char ord_lbl
[] = "ord:", gen_lbl
[] = "gen:";
53 static const char none_lbl
[] = "none", any_lbl
[] = "any";
54 static const char base_lbl
[] = "base", sys_lbl
[] = "sys";
56 enum debug_struct_file files
= DINFO_STRUCT_FILE_ANY
;
57 /* Default is to apply to as much as possible. */
58 enum debug_info_usage usage
= DINFO_USAGE_NUM_ENUMS
;
62 if (MATCH (dfn_lbl
, spec
))
63 usage
= DINFO_USAGE_DFN
;
64 else if (MATCH (dir_lbl
, spec
))
65 usage
= DINFO_USAGE_DIR_USE
;
66 else if (MATCH (ind_lbl
, spec
))
67 usage
= DINFO_USAGE_IND_USE
;
69 /* Generics or not? */
70 if (MATCH (ord_lbl
, spec
))
72 else if (MATCH (gen_lbl
, spec
))
75 /* What allowable environment? */
76 if (MATCH (none_lbl
, spec
))
77 files
= DINFO_STRUCT_FILE_NONE
;
78 else if (MATCH (any_lbl
, spec
))
79 files
= DINFO_STRUCT_FILE_ANY
;
80 else if (MATCH (sys_lbl
, spec
))
81 files
= DINFO_STRUCT_FILE_SYS
;
82 else if (MATCH (base_lbl
, spec
))
83 files
= DINFO_STRUCT_FILE_BASE
;
86 "argument %qs to %<-femit-struct-debug-detailed%> "
90 /* Effect the specification. */
91 if (usage
== DINFO_USAGE_NUM_ENUMS
)
95 opts
->x_debug_struct_ordinary
[DINFO_USAGE_DFN
] = files
;
96 opts
->x_debug_struct_ordinary
[DINFO_USAGE_DIR_USE
] = files
;
97 opts
->x_debug_struct_ordinary
[DINFO_USAGE_IND_USE
] = files
;
101 opts
->x_debug_struct_generic
[DINFO_USAGE_DFN
] = files
;
102 opts
->x_debug_struct_generic
[DINFO_USAGE_DIR_USE
] = files
;
103 opts
->x_debug_struct_generic
[DINFO_USAGE_IND_USE
] = files
;
109 opts
->x_debug_struct_ordinary
[usage
] = files
;
111 opts
->x_debug_struct_generic
[usage
] = files
;
115 set_struct_debug_option (opts
, loc
, spec
+1);
118 /* No more -femit-struct-debug-detailed specifications.
122 "argument %qs to %<-femit-struct-debug-detailed%> unknown",
124 if (opts
->x_debug_struct_ordinary
[DINFO_USAGE_DIR_USE
]
125 < opts
->x_debug_struct_ordinary
[DINFO_USAGE_IND_USE
]
126 || opts
->x_debug_struct_generic
[DINFO_USAGE_DIR_USE
]
127 < opts
->x_debug_struct_generic
[DINFO_USAGE_IND_USE
])
129 "%<-femit-struct-debug-detailed=dir:...%> must allow "
130 "at least as much as "
131 "%<-femit-struct-debug-detailed=ind:...%>");
135 /* Handle -ftree-vectorizer-verbose=VAL for options OPTS. */
138 vect_set_verbosity_level (struct gcc_options
*opts
, int val
)
140 if (val
< MAX_VERBOSITY_LEVEL
)
141 opts
->x_user_vect_verbosity_level
= (enum vect_verbosity_levels
) val
;
143 opts
->x_user_vect_verbosity_level
144 = (enum vect_verbosity_levels
) (MAX_VERBOSITY_LEVEL
- 1);
148 /* Strip off a legitimate source ending from the input string NAME of
149 length LEN. Rather than having to know the names used by all of
150 our front ends, we strip off an ending of a period followed by
151 up to five characters. (Java uses ".class".) */
154 strip_off_ending (char *name
, int len
)
157 for (i
= 2; i
< 6 && len
> i
; i
++)
159 if (name
[len
- i
] == '.')
161 name
[len
- i
] = '\0';
167 /* Find the base name of a path, stripping off both directories and
168 a single final extension. */
170 base_of_path (const char *path
, const char **base_out
)
172 const char *base
= path
;
174 const char *p
= path
;
178 if (IS_DIR_SEPARATOR(c
))
193 /* What to print when a switch has no documentation. */
194 static const char undocumented_msg
[] = N_("This switch lacks documentation");
196 typedef char *char_p
; /* For DEF_VEC_P. */
198 DEF_VEC_ALLOC_P(char_p
,heap
);
200 static void handle_param (struct gcc_options
*opts
,
201 struct gcc_options
*opts_set
, location_t loc
,
203 static void set_debug_level (enum debug_info_type type
, int extended
,
204 const char *arg
, struct gcc_options
*opts
,
205 struct gcc_options
*opts_set
,
207 static void set_fast_math_flags (struct gcc_options
*opts
, int set
);
208 static void decode_d_option (const char *arg
, struct gcc_options
*opts
,
209 location_t loc
, diagnostic_context
*dc
);
210 static void set_unsafe_math_optimizations_flags (struct gcc_options
*opts
,
212 static void enable_warning_as_error (const char *arg
, int value
,
213 unsigned int lang_mask
,
214 const struct cl_option_handlers
*handlers
,
215 struct gcc_options
*opts
,
216 struct gcc_options
*opts_set
,
218 diagnostic_context
*dc
);
220 /* Handle a back-end option; arguments and return value as for
224 target_handle_option (struct gcc_options
*opts
,
225 struct gcc_options
*opts_set
,
226 const struct cl_decoded_option
*decoded
,
227 unsigned int lang_mask ATTRIBUTE_UNUSED
, int kind
,
229 const struct cl_option_handlers
*handlers ATTRIBUTE_UNUSED
,
230 diagnostic_context
*dc
)
232 gcc_assert (dc
== global_dc
);
233 gcc_assert (kind
== DK_UNSPECIFIED
);
234 return targetm_common
.handle_option (opts
, opts_set
, decoded
, loc
);
237 /* Add comma-separated strings to a char_p vector. */
240 add_comma_separated_to_vector (void **pvec
, const char *arg
)
246 VEC(char_p
,heap
) *vec
= (VEC(char_p
,heap
) *) *pvec
;
248 /* We never free this string. */
261 VEC_safe_push (char_p
, heap
, vec
, token_start
);
264 if (*r
== '\\' && r
[1] == ',')
272 if (*token_start
!= '\0')
273 VEC_safe_push (char_p
, heap
, vec
, token_start
);
278 /* Initialize OPTS and OPTS_SET before using them in parsing options. */
281 init_options_struct (struct gcc_options
*opts
, struct gcc_options
*opts_set
)
283 size_t num_params
= get_num_compiler_params ();
285 *opts
= global_options_init
;
286 memset (opts_set
, 0, sizeof (*opts_set
));
288 opts
->x_param_values
= XNEWVEC (int, num_params
);
289 opts_set
->x_param_values
= XCNEWVEC (int, num_params
);
290 init_param_values (opts
->x_param_values
);
292 /* Initialize whether `char' is signed. */
293 opts
->x_flag_signed_char
= DEFAULT_SIGNED_CHAR
;
294 /* Set this to a special "uninitialized" value. The actual default
295 is set after target options have been processed. */
296 opts
->x_flag_short_enums
= 2;
298 /* Initialize target_flags before default_options_optimization
299 so the latter can modify it. */
300 opts
->x_target_flags
= targetm_common
.default_target_flags
;
302 /* Some targets have ABI-specified unwind tables. */
303 opts
->x_flag_unwind_tables
= targetm_common
.unwind_tables_default
;
305 /* Some targets have other target-specific initialization. */
306 targetm_common
.option_init_struct (opts
);
309 /* If indicated by the optimization level LEVEL (-Os if SIZE is set,
310 -Ofast if FAST is set), apply the option DEFAULT_OPT to OPTS and
311 OPTS_SET, diagnostic context DC, location LOC, with language mask
312 LANG_MASK and option handlers HANDLERS. */
315 maybe_default_option (struct gcc_options
*opts
,
316 struct gcc_options
*opts_set
,
317 const struct default_options
*default_opt
,
318 int level
, bool size
, bool fast
,
319 unsigned int lang_mask
,
320 const struct cl_option_handlers
*handlers
,
322 diagnostic_context
*dc
)
324 const struct cl_option
*option
= &cl_options
[default_opt
->opt_index
];
328 gcc_assert (level
== 2);
330 gcc_assert (level
== 3);
332 switch (default_opt
->levels
)
338 case OPT_LEVELS_0_ONLY
:
339 enabled
= (level
== 0);
342 case OPT_LEVELS_1_PLUS
:
343 enabled
= (level
>= 1);
346 case OPT_LEVELS_1_PLUS_SPEED_ONLY
:
347 enabled
= (level
>= 1 && !size
);
350 case OPT_LEVELS_2_PLUS
:
351 enabled
= (level
>= 2);
354 case OPT_LEVELS_2_PLUS_SPEED_ONLY
:
355 enabled
= (level
>= 2 && !size
);
358 case OPT_LEVELS_3_PLUS
:
359 enabled
= (level
>= 3);
362 case OPT_LEVELS_3_PLUS_AND_SIZE
:
363 enabled
= (level
>= 3 || size
);
366 case OPT_LEVELS_SIZE
:
370 case OPT_LEVELS_FAST
:
374 case OPT_LEVELS_NONE
:
380 handle_generated_option (opts
, opts_set
, default_opt
->opt_index
,
381 default_opt
->arg
, default_opt
->value
,
382 lang_mask
, DK_UNSPECIFIED
, loc
,
384 else if (default_opt
->arg
== NULL
385 && !option
->cl_reject_negative
)
386 handle_generated_option (opts
, opts_set
, default_opt
->opt_index
,
387 default_opt
->arg
, !default_opt
->value
,
388 lang_mask
, DK_UNSPECIFIED
, loc
,
392 /* As indicated by the optimization level LEVEL (-Os if SIZE is set,
393 -Ofast if FAST is set), apply the options in array DEFAULT_OPTS to
394 OPTS and OPTS_SET, diagnostic context DC, location LOC, with
395 language mask LANG_MASK and option handlers HANDLERS. */
398 maybe_default_options (struct gcc_options
*opts
,
399 struct gcc_options
*opts_set
,
400 const struct default_options
*default_opts
,
401 int level
, bool size
, bool fast
,
402 unsigned int lang_mask
,
403 const struct cl_option_handlers
*handlers
,
405 diagnostic_context
*dc
)
409 for (i
= 0; default_opts
[i
].levels
!= OPT_LEVELS_NONE
; i
++)
410 maybe_default_option (opts
, opts_set
, &default_opts
[i
],
411 level
, size
, fast
, lang_mask
, handlers
, loc
, dc
);
414 /* Table of options enabled by default at different levels. */
416 static const struct default_options default_options_table
[] =
418 /* -O1 optimizations. */
419 { OPT_LEVELS_1_PLUS
, OPT_fdefer_pop
, NULL
, 1 },
421 { OPT_LEVELS_1_PLUS
, OPT_fdelayed_branch
, NULL
, 1 },
423 { OPT_LEVELS_1_PLUS
, OPT_fguess_branch_probability
, NULL
, 1 },
424 { OPT_LEVELS_1_PLUS
, OPT_fcprop_registers
, NULL
, 1 },
425 { OPT_LEVELS_1_PLUS
, OPT_fforward_propagate
, NULL
, 1 },
426 { OPT_LEVELS_1_PLUS
, OPT_fif_conversion
, NULL
, 1 },
427 { OPT_LEVELS_1_PLUS
, OPT_fif_conversion2
, NULL
, 1 },
428 { OPT_LEVELS_1_PLUS
, OPT_fipa_pure_const
, NULL
, 1 },
429 { OPT_LEVELS_1_PLUS
, OPT_fipa_reference
, NULL
, 1 },
430 { OPT_LEVELS_1_PLUS
, OPT_fipa_profile
, NULL
, 1 },
431 { OPT_LEVELS_1_PLUS
, OPT_fmerge_constants
, NULL
, 1 },
432 { OPT_LEVELS_1_PLUS
, OPT_fsplit_wide_types
, NULL
, 1 },
433 { OPT_LEVELS_1_PLUS
, OPT_ftree_ccp
, NULL
, 1 },
434 { OPT_LEVELS_1_PLUS
, OPT_ftree_bit_ccp
, NULL
, 1 },
435 { OPT_LEVELS_1_PLUS
, OPT_ftree_dce
, NULL
, 1 },
436 { OPT_LEVELS_1_PLUS
, OPT_ftree_dominator_opts
, NULL
, 1 },
437 { OPT_LEVELS_1_PLUS
, OPT_ftree_dse
, NULL
, 1 },
438 { OPT_LEVELS_1_PLUS
, OPT_ftree_ter
, NULL
, 1 },
439 { OPT_LEVELS_1_PLUS
, OPT_ftree_sra
, NULL
, 1 },
440 { OPT_LEVELS_1_PLUS
, OPT_ftree_copyrename
, NULL
, 1 },
441 { OPT_LEVELS_1_PLUS
, OPT_ftree_fre
, NULL
, 1 },
442 { OPT_LEVELS_1_PLUS
, OPT_ftree_copy_prop
, NULL
, 1 },
443 { OPT_LEVELS_1_PLUS
, OPT_ftree_sink
, NULL
, 1 },
444 { OPT_LEVELS_1_PLUS
, OPT_ftree_ch
, NULL
, 1 },
445 { OPT_LEVELS_1_PLUS
, OPT_fcombine_stack_adjustments
, NULL
, 1 },
446 { OPT_LEVELS_1_PLUS
, OPT_fcompare_elim
, NULL
, 1 },
448 /* -O2 optimizations. */
449 { OPT_LEVELS_2_PLUS
, OPT_finline_small_functions
, NULL
, 1 },
450 { OPT_LEVELS_2_PLUS
, OPT_findirect_inlining
, NULL
, 1 },
451 { OPT_LEVELS_2_PLUS
, OPT_fpartial_inlining
, NULL
, 1 },
452 { OPT_LEVELS_2_PLUS
, OPT_fthread_jumps
, NULL
, 1 },
453 { OPT_LEVELS_2_PLUS
, OPT_fcrossjumping
, NULL
, 1 },
454 { OPT_LEVELS_2_PLUS
, OPT_foptimize_sibling_calls
, NULL
, 1 },
455 { OPT_LEVELS_2_PLUS
, OPT_fcse_follow_jumps
, NULL
, 1 },
456 { OPT_LEVELS_2_PLUS
, OPT_fgcse
, NULL
, 1 },
457 { OPT_LEVELS_2_PLUS
, OPT_fexpensive_optimizations
, NULL
, 1 },
458 { OPT_LEVELS_2_PLUS
, OPT_frerun_cse_after_loop
, NULL
, 1 },
459 { OPT_LEVELS_2_PLUS
, OPT_fcaller_saves
, NULL
, 1 },
460 { OPT_LEVELS_2_PLUS
, OPT_fpeephole2
, NULL
, 1 },
461 #ifdef INSN_SCHEDULING
462 /* Only run the pre-regalloc scheduling pass if optimizing for speed. */
463 { OPT_LEVELS_2_PLUS_SPEED_ONLY
, OPT_fschedule_insns
, NULL
, 1 },
464 { OPT_LEVELS_2_PLUS
, OPT_fschedule_insns2
, NULL
, 1 },
466 { OPT_LEVELS_2_PLUS
, OPT_fregmove
, NULL
, 1 },
467 { OPT_LEVELS_2_PLUS
, OPT_fstrict_aliasing
, NULL
, 1 },
468 { OPT_LEVELS_2_PLUS
, OPT_fstrict_overflow
, NULL
, 1 },
469 { OPT_LEVELS_2_PLUS
, OPT_freorder_blocks
, NULL
, 1 },
470 { OPT_LEVELS_2_PLUS
, OPT_freorder_functions
, NULL
, 1 },
471 { OPT_LEVELS_2_PLUS
, OPT_ftree_vrp
, NULL
, 1 },
472 { OPT_LEVELS_2_PLUS
, OPT_ftree_builtin_call_dce
, NULL
, 1 },
473 { OPT_LEVELS_2_PLUS
, OPT_ftree_pre
, NULL
, 1 },
474 { OPT_LEVELS_2_PLUS
, OPT_ftree_switch_conversion
, NULL
, 1 },
475 { OPT_LEVELS_2_PLUS
, OPT_fipa_cp
, NULL
, 1 },
476 { OPT_LEVELS_2_PLUS
, OPT_fdevirtualize
, NULL
, 1 },
477 { OPT_LEVELS_2_PLUS
, OPT_fipa_sra
, NULL
, 1 },
478 { OPT_LEVELS_2_PLUS
, OPT_falign_loops
, NULL
, 1 },
479 { OPT_LEVELS_2_PLUS
, OPT_falign_jumps
, NULL
, 1 },
480 { OPT_LEVELS_2_PLUS
, OPT_falign_labels
, NULL
, 1 },
481 { OPT_LEVELS_2_PLUS
, OPT_falign_functions
, NULL
, 1 },
483 /* -O3 optimizations. */
484 { OPT_LEVELS_3_PLUS
, OPT_ftree_loop_distribute_patterns
, NULL
, 1 },
485 { OPT_LEVELS_3_PLUS
, OPT_fpredictive_commoning
, NULL
, 1 },
486 /* Inlining of functions reducing size is a good idea with -Os
487 regardless of them being declared inline. */
488 { OPT_LEVELS_3_PLUS_AND_SIZE
, OPT_finline_functions
, NULL
, 1 },
489 { OPT_LEVELS_1_PLUS
, OPT_finline_functions_called_once
, NULL
, 1 },
490 { OPT_LEVELS_3_PLUS
, OPT_funswitch_loops
, NULL
, 1 },
491 { OPT_LEVELS_3_PLUS
, OPT_fgcse_after_reload
, NULL
, 1 },
492 { OPT_LEVELS_3_PLUS
, OPT_ftree_vectorize
, NULL
, 1 },
493 { OPT_LEVELS_3_PLUS
, OPT_fipa_cp_clone
, NULL
, 1 },
495 /* -Ofast adds optimizations to -O3. */
496 { OPT_LEVELS_FAST
, OPT_ffast_math
, NULL
, 1 },
498 { OPT_LEVELS_NONE
, 0, NULL
, 0 }
501 /* Default the options in OPTS and OPTS_SET based on the optimization
502 settings in DECODED_OPTIONS and DECODED_OPTIONS_COUNT. */
504 default_options_optimization (struct gcc_options
*opts
,
505 struct gcc_options
*opts_set
,
506 struct cl_decoded_option
*decoded_options
,
507 unsigned int decoded_options_count
,
509 unsigned int lang_mask
,
510 const struct cl_option_handlers
*handlers
,
511 diagnostic_context
*dc
)
516 /* Scan to see what optimization level has been specified. That will
517 determine the default value of many flags. */
518 for (i
= 1; i
< decoded_options_count
; i
++)
520 struct cl_decoded_option
*opt
= &decoded_options
[i
];
521 switch (opt
->opt_index
)
524 if (*opt
->arg
== '\0')
526 opts
->x_optimize
= 1;
527 opts
->x_optimize_size
= 0;
528 opts
->x_optimize_fast
= 0;
532 const int optimize_val
= integral_argument (opt
->arg
);
533 if (optimize_val
== -1)
535 "argument to %qs should be a non-negative integer",
539 opts
->x_optimize
= optimize_val
;
540 if ((unsigned int) opts
->x_optimize
> 255)
541 opts
->x_optimize
= 255;
542 opts
->x_optimize_size
= 0;
543 opts
->x_optimize_fast
= 0;
549 opts
->x_optimize_size
= 1;
551 /* Optimizing for size forces optimize to be 2. */
552 opts
->x_optimize
= 2;
553 opts
->x_optimize_fast
= 0;
557 /* -Ofast only adds flags to -O3. */
558 opts
->x_optimize_size
= 0;
559 opts
->x_optimize
= 3;
560 opts
->x_optimize_fast
= 1;
564 /* Ignore other options in this prescan. */
569 maybe_default_options (opts
, opts_set
, default_options_table
,
570 opts
->x_optimize
, opts
->x_optimize_size
,
571 opts
->x_optimize_fast
, lang_mask
, handlers
, loc
, dc
);
573 /* -O2 param settings. */
574 opt2
= (opts
->x_optimize
>= 2);
576 /* Track fields in field-sensitive alias analysis. */
577 maybe_set_param_value
578 (PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE
,
579 opt2
? 100 : default_param_value (PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE
),
580 opts
->x_param_values
, opts_set
->x_param_values
);
582 /* For -O1 only do loop invariant motion for very small loops. */
583 maybe_set_param_value
584 (PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP
,
585 opt2
? default_param_value (PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP
) : 1000,
586 opts
->x_param_values
, opts_set
->x_param_values
);
588 if (opts
->x_optimize_size
)
589 /* We want to crossjump as much as possible. */
590 maybe_set_param_value (PARAM_MIN_CROSSJUMP_INSNS
, 1,
591 opts
->x_param_values
, opts_set
->x_param_values
);
593 maybe_set_param_value (PARAM_MIN_CROSSJUMP_INSNS
,
594 default_param_value (PARAM_MIN_CROSSJUMP_INSNS
),
595 opts
->x_param_values
, opts_set
->x_param_values
);
597 /* Allow default optimizations to be specified on a per-machine basis. */
598 maybe_default_options (opts
, opts_set
,
599 targetm_common
.option_optimization_table
,
600 opts
->x_optimize
, opts
->x_optimize_size
,
601 opts
->x_optimize_fast
, lang_mask
, handlers
, loc
, dc
);
604 /* After all options at LOC have been read into OPTS and OPTS_SET,
605 finalize settings of those options and diagnose incompatible
608 finish_options (struct gcc_options
*opts
, struct gcc_options
*opts_set
,
611 enum unwind_info_type ui_except
;
613 if (opts
->x_dump_base_name
&& ! IS_ABSOLUTE_PATH (opts
->x_dump_base_name
))
615 /* First try to make OPTS->X_DUMP_BASE_NAME relative to the
616 OPTS->X_DUMP_DIR_NAME directory. Then try to make
617 OPTS->X_DUMP_BASE_NAME relative to the OPTS->X_AUX_BASE_NAME
618 directory, typically the directory to contain the object
620 if (opts
->x_dump_dir_name
)
621 opts
->x_dump_base_name
= concat (opts
->x_dump_dir_name
,
622 opts
->x_dump_base_name
, NULL
);
623 else if (opts
->x_aux_base_name
624 && strcmp (opts
->x_aux_base_name
, HOST_BIT_BUCKET
) != 0)
626 const char *aux_base
;
628 base_of_path (opts
->x_aux_base_name
, &aux_base
);
629 if (opts
->x_aux_base_name
!= aux_base
)
631 int dir_len
= aux_base
- opts
->x_aux_base_name
;
632 char *new_dump_base_name
=
633 XNEWVEC (char, strlen (opts
->x_dump_base_name
) + dir_len
+ 1);
635 /* Copy directory component from OPTS->X_AUX_BASE_NAME. */
636 memcpy (new_dump_base_name
, opts
->x_aux_base_name
, dir_len
);
637 /* Append existing OPTS->X_DUMP_BASE_NAME. */
638 strcpy (new_dump_base_name
+ dir_len
, opts
->x_dump_base_name
);
639 opts
->x_dump_base_name
= new_dump_base_name
;
644 /* Handle related options for unit-at-a-time, toplevel-reorder, and
646 if (!opts
->x_flag_unit_at_a_time
)
648 if (opts
->x_flag_section_anchors
&& opts_set
->x_flag_section_anchors
)
649 error_at (loc
, "section anchors must be disabled when unit-at-a-time "
651 opts
->x_flag_section_anchors
= 0;
652 if (opts
->x_flag_toplevel_reorder
== 1)
653 error_at (loc
, "toplevel reorder must be disabled when unit-at-a-time "
655 opts
->x_flag_toplevel_reorder
= 0;
658 /* -Wmissing-noreturn is alias for -Wsuggest-attribute=noreturn. */
659 if (opts
->x_warn_missing_noreturn
)
660 opts
->x_warn_suggest_attribute_noreturn
= true;
662 /* Unless the user has asked for section anchors, we disable toplevel
663 reordering at -O0 to disable transformations that might be surprising
664 to end users and to get -fno-toplevel-reorder tested. */
665 if (!opts
->x_optimize
666 && opts
->x_flag_toplevel_reorder
== 2
667 && !(opts
->x_flag_section_anchors
&& opts_set
->x_flag_section_anchors
))
669 opts
->x_flag_toplevel_reorder
= 0;
670 opts
->x_flag_section_anchors
= 0;
672 if (!opts
->x_flag_toplevel_reorder
)
674 if (opts
->x_flag_section_anchors
&& opts_set
->x_flag_section_anchors
)
675 error_at (loc
, "section anchors must be disabled when toplevel reorder"
677 opts
->x_flag_section_anchors
= 0;
680 if (!opts
->x_flag_opts_finished
)
682 if (opts
->x_flag_pie
)
683 opts
->x_flag_pic
= opts
->x_flag_pie
;
684 if (opts
->x_flag_pic
&& !opts
->x_flag_pie
)
685 opts
->x_flag_shlib
= 1;
686 opts
->x_flag_opts_finished
= true;
689 if (opts
->x_optimize
== 0)
691 /* Inlining does not work if not optimizing,
692 so force it not to be done. */
693 opts
->x_warn_inline
= 0;
694 opts
->x_flag_no_inline
= 1;
697 /* The optimization to partition hot and cold basic blocks into separate
698 sections of the .o and executable files does not work (currently)
699 with exception handling. This is because there is no support for
700 generating unwind info. If opts->x_flag_exceptions is turned on
701 we need to turn off the partitioning optimization. */
703 ui_except
= targetm_common
.except_unwind_info (opts
);
705 if (opts
->x_flag_exceptions
706 && opts
->x_flag_reorder_blocks_and_partition
707 && (ui_except
== UI_SJLJ
|| ui_except
== UI_TARGET
))
710 "-freorder-blocks-and-partition does not work "
711 "with exceptions on this architecture");
712 opts
->x_flag_reorder_blocks_and_partition
= 0;
713 opts
->x_flag_reorder_blocks
= 1;
716 /* If user requested unwind info, then turn off the partitioning
719 if (opts
->x_flag_unwind_tables
720 && !targetm_common
.unwind_tables_default
721 && opts
->x_flag_reorder_blocks_and_partition
722 && (ui_except
== UI_SJLJ
|| ui_except
== UI_TARGET
))
725 "-freorder-blocks-and-partition does not support "
726 "unwind info on this architecture");
727 opts
->x_flag_reorder_blocks_and_partition
= 0;
728 opts
->x_flag_reorder_blocks
= 1;
731 /* If the target requested unwind info, then turn off the partitioning
732 optimization with a different message. Likewise, if the target does not
733 support named sections. */
735 if (opts
->x_flag_reorder_blocks_and_partition
736 && (!targetm_common
.have_named_sections
737 || (opts
->x_flag_unwind_tables
738 && targetm_common
.unwind_tables_default
739 && (ui_except
== UI_SJLJ
|| ui_except
== UI_TARGET
))))
742 "-freorder-blocks-and-partition does not work "
743 "on this architecture");
744 opts
->x_flag_reorder_blocks_and_partition
= 0;
745 opts
->x_flag_reorder_blocks
= 1;
748 if (opts
->x_flag_reorder_blocks_and_partition
749 && !opts_set
->x_flag_reorder_functions
)
750 opts
->x_flag_reorder_functions
= 1;
752 /* Pipelining of outer loops is only possible when general pipelining
753 capabilities are requested. */
754 if (!opts
->x_flag_sel_sched_pipelining
)
755 opts
->x_flag_sel_sched_pipelining_outer_loops
= 0;
757 if (opts
->x_flag_conserve_stack
)
759 maybe_set_param_value (PARAM_LARGE_STACK_FRAME
, 100,
760 opts
->x_param_values
, opts_set
->x_param_values
);
761 maybe_set_param_value (PARAM_STACK_FRAME_GROWTH
, 40,
762 opts
->x_param_values
, opts_set
->x_param_values
);
764 if (opts
->x_flag_wpa
|| opts
->x_flag_ltrans
)
766 /* These passes are not WHOPR compatible yet. */
767 opts
->x_flag_ipa_pta
= 0;
770 if (opts
->x_flag_lto
)
773 opts
->x_flag_generate_lto
= 1;
775 /* When generating IL, do not operate in whole-program mode.
776 Otherwise, symbols will be privatized too early, causing link
778 opts
->x_flag_whole_program
= 0;
780 error_at (loc
, "LTO support has not been enabled in this configuration");
783 if ((opts
->x_flag_lto_partition_balanced
!= 0) + (opts
->x_flag_lto_partition_1to1
!= 0)
784 + (opts
->x_flag_lto_partition_none
!= 0) >= 1)
786 if ((opts
->x_flag_lto_partition_balanced
!= 0)
787 + (opts
->x_flag_lto_partition_1to1
!= 0)
788 + (opts
->x_flag_lto_partition_none
!= 0) > 1)
789 error_at (loc
, "only one -flto-partition value can be specified");
792 /* We initialize opts->x_flag_split_stack to -1 so that targets can set a
793 default value if they choose based on other options. */
794 if (opts
->x_flag_split_stack
== -1)
795 opts
->x_flag_split_stack
= 0;
796 else if (opts
->x_flag_split_stack
)
798 if (!targetm_common
.supports_split_stack (true, opts
))
800 error_at (loc
, "%<-fsplit-stack%> is not supported by "
801 "this compiler configuration");
802 opts
->x_flag_split_stack
= 0;
806 /* Set PARAM_MAX_STORES_TO_SINK to 0 if either vectorization or if-conversion
808 if (!opts
->x_flag_tree_vectorize
|| !opts
->x_flag_tree_loop_if_convert
)
809 maybe_set_param_value (PARAM_MAX_STORES_TO_SINK
, 0,
810 opts
->x_param_values
, opts_set
->x_param_values
);
812 /* This replaces set_Wunused. */
813 if (opts
->x_warn_unused_function
== -1)
814 opts
->x_warn_unused_function
= opts
->x_warn_unused
;
815 if (opts
->x_warn_unused_label
== -1)
816 opts
->x_warn_unused_label
= opts
->x_warn_unused
;
817 /* Wunused-parameter is enabled if both -Wunused -Wextra are enabled. */
818 if (opts
->x_warn_unused_parameter
== -1)
819 opts
->x_warn_unused_parameter
= (opts
->x_warn_unused
820 && opts
->x_extra_warnings
);
821 if (opts
->x_warn_unused_variable
== -1)
822 opts
->x_warn_unused_variable
= opts
->x_warn_unused
;
823 /* Wunused-but-set-parameter is enabled if both -Wunused -Wextra are
825 if (opts
->x_warn_unused_but_set_parameter
== -1)
826 opts
->x_warn_unused_but_set_parameter
= (opts
->x_warn_unused
827 && opts
->x_extra_warnings
);
828 if (opts
->x_warn_unused_but_set_variable
== -1)
829 opts
->x_warn_unused_but_set_variable
= opts
->x_warn_unused
;
830 if (opts
->x_warn_unused_value
== -1)
831 opts
->x_warn_unused_value
= opts
->x_warn_unused
;
833 /* This replaces set_Wextra. */
834 if (opts
->x_warn_uninitialized
== -1)
835 opts
->x_warn_uninitialized
= opts
->x_extra_warnings
;
838 #define LEFT_COLUMN 27
840 /* Output ITEM, of length ITEM_WIDTH, in the left column,
841 followed by word-wrapped HELP in a second column. */
843 wrap_help (const char *help
,
845 unsigned int item_width
,
846 unsigned int columns
)
848 unsigned int col_width
= LEFT_COLUMN
;
849 unsigned int remaining
, room
, len
;
851 remaining
= strlen (help
);
855 room
= columns
- 3 - MAX (col_width
, item_width
);
864 for (i
= 0; help
[i
]; i
++)
866 if (i
>= room
&& len
!= remaining
)
870 else if ((help
[i
] == '-' || help
[i
] == '/')
871 && help
[i
+ 1] != ' '
872 && i
> 0 && ISALPHA (help
[i
- 1]))
877 printf( " %-*.*s %.*s\n", col_width
, item_width
, item
, len
, help
);
879 while (help
[len
] == ' ')
887 /* Print help for a specific front-end, etc. */
889 print_filtered_help (unsigned int include_flags
,
890 unsigned int exclude_flags
,
891 unsigned int any_flags
,
892 unsigned int columns
,
893 struct gcc_options
*opts
,
894 unsigned int lang_mask
)
899 bool displayed
= false;
901 if (include_flags
== CL_PARAMS
)
903 for (i
= 0; i
< LAST_PARAM
; i
++)
905 const char *param
= compiler_params
[i
].option
;
907 help
= compiler_params
[i
].help
;
908 if (help
== NULL
|| *help
== '\0')
910 if (exclude_flags
& CL_UNDOCUMENTED
)
912 help
= undocumented_msg
;
915 /* Get the translation. */
918 wrap_help (help
, param
, strlen (param
), columns
);
924 if (!opts
->x_help_printed
)
925 opts
->x_help_printed
= XCNEWVAR (char, cl_options_count
);
927 if (!opts
->x_help_enum_printed
)
928 opts
->x_help_enum_printed
= XCNEWVAR (char, cl_enums_count
);
930 for (i
= 0; i
< cl_options_count
; i
++)
933 const struct cl_option
*option
= cl_options
+ i
;
938 if (include_flags
== 0
939 || ((option
->flags
& include_flags
) != include_flags
))
941 if ((option
->flags
& any_flags
) == 0)
945 /* Skip unwanted switches. */
946 if ((option
->flags
& exclude_flags
) != 0)
949 /* The driver currently prints its own help text. */
950 if ((option
->flags
& CL_DRIVER
) != 0
951 && (option
->flags
& (((1U << cl_lang_count
) - 1)
952 | CL_COMMON
| CL_TARGET
)) == 0)
956 /* Skip switches that have already been printed. */
957 if (opts
->x_help_printed
[i
])
960 opts
->x_help_printed
[i
] = true;
965 if (exclude_flags
& CL_UNDOCUMENTED
)
967 help
= undocumented_msg
;
970 /* Get the translation. */
973 /* Find the gap between the name of the
974 option and its descriptive text. */
975 tab
= strchr (help
, '\t');
984 opt
= option
->opt_text
;
988 /* With the -Q option enabled we change the descriptive text associated
989 with an option to be an indication of its current setting. */
992 void *flag_var
= option_flag_var (i
, opts
);
994 if (len
< (LEFT_COLUMN
+ 2))
995 strcpy (new_help
, "\t\t");
997 strcpy (new_help
, "\t");
1000 && option
->var_type
!= CLVC_DEFER
)
1002 if (option
->flags
& CL_JOINED
)
1004 if (option
->var_type
== CLVC_STRING
)
1006 if (* (const char **) flag_var
!= NULL
)
1007 snprintf (new_help
+ strlen (new_help
),
1008 sizeof (new_help
) - strlen (new_help
),
1009 * (const char **) flag_var
);
1011 else if (option
->var_type
== CLVC_ENUM
)
1013 const struct cl_enum
*e
= &cl_enums
[option
->var_enum
];
1015 const char *arg
= NULL
;
1017 value
= e
->get (flag_var
);
1018 enum_value_to_arg (e
->values
, &arg
, value
, lang_mask
);
1020 arg
= _("[default]");
1021 snprintf (new_help
+ strlen (new_help
),
1022 sizeof (new_help
) - strlen (new_help
),
1026 sprintf (new_help
+ strlen (new_help
),
1027 "%#x", * (int *) flag_var
);
1030 strcat (new_help
, option_enabled (i
, opts
)
1031 ? _("[enabled]") : _("[disabled]"));
1037 wrap_help (help
, opt
, len
, columns
);
1040 if (option
->var_type
== CLVC_ENUM
1041 && opts
->x_help_enum_printed
[option
->var_enum
] != 2)
1042 opts
->x_help_enum_printed
[option
->var_enum
] = 1;
1047 unsigned int langs
= include_flags
& CL_LANG_ALL
;
1050 printf (_(" No options with the desired characteristics were found\n"));
1055 /* PR 31349: Tell the user how to see all of the
1056 options supported by a specific front end. */
1057 for (i
= 0; (1U << i
) < CL_LANG_ALL
; i
++)
1058 if ((1U << i
) & langs
)
1059 printf (_(" None found. Use --help=%s to show *all* the options supported by the %s front-end\n"),
1060 lang_names
[i
], lang_names
[i
]);
1064 else if (! displayed
)
1065 printf (_(" All options with the desired characteristics have already been displayed\n"));
1069 /* Print details of enumerated option arguments, if those
1070 enumerations have help text headings provided. If no help text
1071 is provided, presume that the possible values are listed in the
1072 help text for the relevant options. */
1073 for (i
= 0; i
< cl_enums_count
; i
++)
1075 unsigned int j
, pos
;
1077 if (opts
->x_help_enum_printed
[i
] != 1)
1079 if (cl_enums
[i
].help
== NULL
)
1081 printf (" %s\n ", _(cl_enums
[i
].help
));
1083 for (j
= 0; cl_enums
[i
].values
[j
].arg
!= NULL
; j
++)
1085 unsigned int len
= strlen (cl_enums
[i
].values
[j
].arg
);
1087 if (pos
> 4 && pos
+ 1 + len
<= columns
)
1089 printf (" %s", cl_enums
[i
].values
[j
].arg
);
1099 printf ("%s", cl_enums
[i
].values
[j
].arg
);
1104 opts
->x_help_enum_printed
[i
] = 2;
1108 /* Display help for a specified type of option.
1109 The options must have ALL of the INCLUDE_FLAGS set
1110 ANY of the flags in the ANY_FLAGS set
1111 and NONE of the EXCLUDE_FLAGS set. The current option state is in
1112 OPTS; LANG_MASK is used for interpreting enumerated option state. */
1114 print_specific_help (unsigned int include_flags
,
1115 unsigned int exclude_flags
,
1116 unsigned int any_flags
,
1117 struct gcc_options
*opts
,
1118 unsigned int lang_mask
)
1120 unsigned int all_langs_mask
= (1U << cl_lang_count
) - 1;
1121 const char * description
= NULL
;
1122 const char * descrip_extra
= "";
1126 /* Sanity check: Make sure that we do not have more
1127 languages than we have bits available to enumerate them. */
1128 gcc_assert ((1U << cl_lang_count
) < CL_MIN_OPTION_CLASS
);
1130 /* If we have not done so already, obtain
1131 the desired maximum width of the output. */
1132 if (opts
->x_help_columns
== 0)
1136 p
= getenv ("COLUMNS");
1139 int value
= atoi (p
);
1142 opts
->x_help_columns
= value
;
1145 if (opts
->x_help_columns
== 0)
1146 /* Use a reasonable default. */
1147 opts
->x_help_columns
= 80;
1150 /* Decide upon the title for the options that we are going to display. */
1151 for (i
= 0, flag
= 1; flag
<= CL_MAX_OPTION_CLASS
; flag
<<= 1, i
++)
1153 switch (flag
& include_flags
)
1160 description
= _("The following options are target specific");
1163 description
= _("The following options control compiler warning messages");
1165 case CL_OPTIMIZATION
:
1166 description
= _("The following options control optimizations");
1169 description
= _("The following options are language-independent");
1172 description
= _("The --param option recognizes the following as parameters");
1175 if (i
>= cl_lang_count
)
1177 if (exclude_flags
& all_langs_mask
)
1178 description
= _("The following options are specific to just the language ");
1180 description
= _("The following options are supported by the language ");
1181 descrip_extra
= lang_names
[i
];
1186 if (description
== NULL
)
1190 if (include_flags
& CL_UNDOCUMENTED
)
1191 description
= _("The following options are not documented");
1192 else if (include_flags
& CL_SEPARATE
)
1193 description
= _("The following options take separate arguments");
1194 else if (include_flags
& CL_JOINED
)
1195 description
= _("The following options take joined arguments");
1198 internal_error ("unrecognized include_flags 0x%x passed to print_specific_help",
1205 if (any_flags
& all_langs_mask
)
1206 description
= _("The following options are language-related");
1208 description
= _("The following options are language-independent");
1212 printf ("%s%s:\n", description
, descrip_extra
);
1213 print_filtered_help (include_flags
, exclude_flags
, any_flags
,
1214 opts
->x_help_columns
, opts
, lang_mask
);
1217 /* Handle target- and language-independent options. Return zero to
1218 generate an "unknown option" message. Only options that need
1219 extra handling need to be listed here; if you simply want
1220 DECODED->value assigned to a variable, it happens automatically. */
1223 common_handle_option (struct gcc_options
*opts
,
1224 struct gcc_options
*opts_set
,
1225 const struct cl_decoded_option
*decoded
,
1226 unsigned int lang_mask
, int kind ATTRIBUTE_UNUSED
,
1228 const struct cl_option_handlers
*handlers
,
1229 diagnostic_context
*dc
)
1231 size_t scode
= decoded
->opt_index
;
1232 const char *arg
= decoded
->arg
;
1233 int value
= decoded
->value
;
1234 enum opt_code code
= (enum opt_code
) scode
;
1236 gcc_assert (decoded
->canonical_option_num_elements
<= 2);
1241 handle_param (opts
, opts_set
, loc
, arg
);
1246 unsigned int all_langs_mask
= (1U << cl_lang_count
) - 1;
1247 unsigned int undoc_mask
;
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 print_specific_help (CL_TARGET
, CL_UNDOCUMENTED
, 0, opts
, lang_mask
);
1270 opts
->x_exit_after_options
= true;
1275 const char * a
= arg
;
1276 unsigned int include_flags
= 0;
1277 /* Note - by default we include undocumented options when listing
1278 specific classes. If you only want to see documented options
1279 then add ",^undocumented" to the --help= option. E.g.:
1281 --help=target,^undocumented */
1282 unsigned int exclude_flags
= 0;
1284 /* Walk along the argument string, parsing each word in turn.
1286 arg = [^]{word}[,{arg}]
1287 word = {optimizers|target|warnings|undocumented|
1288 params|common|<language>} */
1293 const char * string
;
1298 { "optimizers", CL_OPTIMIZATION
},
1299 { "target", CL_TARGET
},
1300 { "warnings", CL_WARNING
},
1301 { "undocumented", CL_UNDOCUMENTED
},
1302 { "params", CL_PARAMS
},
1303 { "joined", CL_JOINED
},
1304 { "separate", CL_SEPARATE
},
1305 { "common", CL_COMMON
},
1308 unsigned int * pflags
;
1310 unsigned int lang_flag
, specific_flag
;
1317 pflags
= & exclude_flags
;
1320 pflags
= & include_flags
;
1322 comma
= strchr (a
, ',');
1333 /* Check to see if the string matches an option class name. */
1334 for (i
= 0, specific_flag
= 0; specifics
[i
].string
!= NULL
; i
++)
1335 if (strncasecmp (a
, specifics
[i
].string
, len
) == 0)
1337 specific_flag
= specifics
[i
].flag
;
1341 /* Check to see if the string matches a language name.
1342 Note - we rely upon the alpha-sorted nature of the entries in
1343 the lang_names array, specifically that shorter names appear
1344 before their longer variants. (i.e. C before C++). That way
1345 when we are attempting to match --help=c for example we will
1346 match with C first and not C++. */
1347 for (i
= 0, lang_flag
= 0; i
< cl_lang_count
; i
++)
1348 if (strncasecmp (a
, lang_names
[i
], len
) == 0)
1350 lang_flag
= 1U << i
;
1354 if (specific_flag
!= 0)
1357 * pflags
|= specific_flag
;
1360 /* The option's argument matches both the start of a
1361 language name and the start of an option class name.
1362 We have a special case for when the user has
1363 specified "--help=c", but otherwise we have to issue
1365 if (strncasecmp (a
, "c", len
) == 0)
1366 * pflags
|= lang_flag
;
1369 "--help argument %q.*s is ambiguous, "
1370 "please be more specific",
1374 else if (lang_flag
!= 0)
1375 * pflags
|= lang_flag
;
1378 "unrecognized argument to --help= option: %q.*s",
1387 print_specific_help (include_flags
, exclude_flags
, 0, opts
,
1389 opts
->x_exit_after_options
= true;
1394 opts
->x_exit_after_options
= true;
1400 /* Currently handled in a prescan. */
1404 enable_warning_as_error (arg
, value
, lang_mask
, handlers
,
1405 opts
, opts_set
, loc
, dc
);
1408 case OPT_Wlarger_than_
:
1409 opts
->x_larger_than_size
= value
;
1410 opts
->x_warn_larger_than
= value
!= -1;
1413 case OPT_Wfatal_errors
:
1414 dc
->fatal_errors
= value
;
1417 case OPT_Wframe_larger_than_
:
1418 opts
->x_frame_larger_than_size
= value
;
1419 opts
->x_warn_frame_larger_than
= value
!= -1;
1422 case OPT_Wstack_usage_
:
1423 opts
->x_warn_stack_usage
= value
;
1424 opts
->x_flag_stack_usage_info
= value
!= -1;
1427 case OPT_Wstrict_aliasing
:
1428 set_Wstrict_aliasing (opts
, value
);
1431 case OPT_Wstrict_overflow
:
1432 opts
->x_warn_strict_overflow
= (value
1433 ? (int) WARN_STRICT_OVERFLOW_CONDITIONAL
1437 case OPT_Wsystem_headers
:
1438 dc
->dc_warn_system_headers
= value
;
1442 opts
->x_flag_gen_aux_info
= 1;
1445 case OPT_auxbase_strip
:
1447 char *tmp
= xstrdup (arg
);
1448 strip_off_ending (tmp
, strlen (tmp
));
1450 opts
->x_aux_base_name
= tmp
;
1455 decode_d_option (arg
, opts
, loc
, dc
);
1458 case OPT_fcall_used_
:
1459 case OPT_fcall_saved_
:
1464 case OPT_fdbg_cnt_list
:
1468 case OPT_fdebug_prefix_map_
:
1472 case OPT_fdiagnostics_show_location_
:
1473 diagnostic_prefixing_rule (dc
) = (diagnostic_prefixing_rule_t
) value
;
1476 case OPT_fdiagnostics_show_option
:
1477 dc
->show_option_requested
= value
;
1484 case OPT_ffast_math
:
1485 set_fast_math_flags (opts
, value
);
1488 case OPT_funsafe_math_optimizations
:
1489 set_unsafe_math_optimizations_flags (opts
, value
);
1496 case OPT_finline_limit_
:
1497 set_param_value ("max-inline-insns-single", value
/ 2,
1498 opts
->x_param_values
, opts_set
->x_param_values
);
1499 set_param_value ("max-inline-insns-auto", value
/ 2,
1500 opts
->x_param_values
, opts_set
->x_param_values
);
1503 case OPT_finstrument_functions_exclude_function_list_
:
1504 add_comma_separated_to_vector
1505 (&opts
->x_flag_instrument_functions_exclude_functions
, arg
);
1508 case OPT_finstrument_functions_exclude_file_list_
:
1509 add_comma_separated_to_vector
1510 (&opts
->x_flag_instrument_functions_exclude_files
, arg
);
1513 case OPT_fmessage_length_
:
1514 pp_set_line_maximum_length (dc
->printer
, value
);
1517 case OPT_fpack_struct_
:
1518 if (value
<= 0 || (value
& (value
- 1)) || value
> 16)
1520 "structure alignment must be a small power of two, not %d",
1523 opts
->x_initial_max_fld_align
= value
;
1527 case OPT_fplugin_arg_
:
1531 case OPT_fprofile_use_
:
1532 opts
->x_profile_data_prefix
= xstrdup (arg
);
1533 opts
->x_flag_profile_use
= true;
1535 /* No break here - do -fprofile-use processing. */
1536 case OPT_fprofile_use
:
1537 if (!opts_set
->x_flag_branch_probabilities
)
1538 opts
->x_flag_branch_probabilities
= value
;
1539 if (!opts_set
->x_flag_profile_values
)
1540 opts
->x_flag_profile_values
= value
;
1541 if (!opts_set
->x_flag_unroll_loops
)
1542 opts
->x_flag_unroll_loops
= value
;
1543 if (!opts_set
->x_flag_peel_loops
)
1544 opts
->x_flag_peel_loops
= value
;
1545 if (!opts_set
->x_flag_tracer
)
1546 opts
->x_flag_tracer
= value
;
1547 if (!opts_set
->x_flag_value_profile_transformations
)
1548 opts
->x_flag_value_profile_transformations
= value
;
1549 if (!opts_set
->x_flag_inline_functions
)
1550 opts
->x_flag_inline_functions
= value
;
1551 if (!opts_set
->x_flag_ipa_cp
)
1552 opts
->x_flag_ipa_cp
= value
;
1553 if (!opts_set
->x_flag_ipa_cp_clone
1554 && value
&& opts
->x_flag_ipa_cp
)
1555 opts
->x_flag_ipa_cp_clone
= value
;
1556 if (!opts_set
->x_flag_predictive_commoning
)
1557 opts
->x_flag_predictive_commoning
= value
;
1558 if (!opts_set
->x_flag_unswitch_loops
)
1559 opts
->x_flag_unswitch_loops
= value
;
1560 if (!opts_set
->x_flag_gcse_after_reload
)
1561 opts
->x_flag_gcse_after_reload
= value
;
1564 case OPT_fprofile_generate_
:
1565 opts
->x_profile_data_prefix
= xstrdup (arg
);
1567 /* No break here - do -fprofile-generate processing. */
1568 case OPT_fprofile_generate
:
1569 if (!opts_set
->x_profile_arc_flag
)
1570 opts
->x_profile_arc_flag
= value
;
1571 if (!opts_set
->x_flag_profile_values
)
1572 opts
->x_flag_profile_values
= value
;
1573 if (!opts_set
->x_flag_value_profile_transformations
)
1574 opts
->x_flag_value_profile_transformations
= value
;
1575 if (!opts_set
->x_flag_inline_functions
)
1576 opts
->x_flag_inline_functions
= value
;
1577 /* FIXME: Instrumentation we insert makes ipa-reference bitmaps
1578 quadratic. Disable the pass until better memory representation
1580 if (!opts_set
->x_flag_ipa_reference
&& in_lto_p
)
1581 opts
->x_flag_ipa_reference
= false;
1584 case OPT_fshow_column
:
1585 dc
->show_column
= value
;
1588 case OPT_frandom_seed
:
1589 /* The real switch is -fno-random-seed. */
1595 case OPT_frandom_seed_
:
1599 case OPT_fsched_verbose_
:
1600 #ifdef INSN_SCHEDULING
1601 /* Handled with Var in common.opt. */
1607 case OPT_fsched_stalled_insns_
:
1608 opts
->x_flag_sched_stalled_insns
= value
;
1609 if (opts
->x_flag_sched_stalled_insns
== 0)
1610 opts
->x_flag_sched_stalled_insns
= -1;
1613 case OPT_fsched_stalled_insns_dep_
:
1614 opts
->x_flag_sched_stalled_insns_dep
= value
;
1617 case OPT_fstack_check_
:
1618 if (!strcmp (arg
, "no"))
1619 opts
->x_flag_stack_check
= NO_STACK_CHECK
;
1620 else if (!strcmp (arg
, "generic"))
1621 /* This is the old stack checking method. */
1622 opts
->x_flag_stack_check
= STACK_CHECK_BUILTIN
1623 ? FULL_BUILTIN_STACK_CHECK
1624 : GENERIC_STACK_CHECK
;
1625 else if (!strcmp (arg
, "specific"))
1626 /* This is the new stack checking method. */
1627 opts
->x_flag_stack_check
= STACK_CHECK_BUILTIN
1628 ? FULL_BUILTIN_STACK_CHECK
1629 : STACK_CHECK_STATIC_BUILTIN
1630 ? STATIC_BUILTIN_STACK_CHECK
1631 : GENERIC_STACK_CHECK
;
1633 warning_at (loc
, 0, "unknown stack check parameter \"%s\"", arg
);
1636 case OPT_fstack_limit
:
1637 /* The real switch is -fno-stack-limit. */
1643 case OPT_fstack_limit_register_
:
1644 case OPT_fstack_limit_symbol_
:
1648 case OPT_fstack_usage
:
1649 opts
->x_flag_stack_usage
= value
;
1650 opts
->x_flag_stack_usage_info
= value
!= 0;
1653 case OPT_ftree_vectorizer_verbose_
:
1654 vect_set_verbosity_level (opts
, value
);
1658 set_debug_level (NO_DEBUG
, DEFAULT_GDB_EXTENSIONS
, arg
, opts
, opts_set
,
1663 set_debug_level (SDB_DEBUG
, false, arg
, opts
, opts_set
, loc
);
1667 if (value
< 2 || value
> 4)
1668 error_at (loc
, "dwarf version %d is not supported", value
);
1670 dwarf_version
= value
;
1671 set_debug_level (DWARF2_DEBUG
, false, "", opts
, opts_set
, loc
);
1675 set_debug_level (NO_DEBUG
, 2, arg
, opts
, opts_set
, loc
);
1680 set_debug_level (DBX_DEBUG
, code
== OPT_gstabs_
, arg
, opts
, opts_set
,
1685 set_debug_level (VMS_DEBUG
, false, arg
, opts
, opts_set
, loc
);
1690 set_debug_level (XCOFF_DEBUG
, code
== OPT_gxcoff_
, arg
, opts
, opts_set
,
1694 case OPT_pedantic_errors
:
1695 opts
->x_pedantic
= 1;
1696 dc
->pedantic_errors
= 1;
1700 opts
->x_flag_lto
= value
? "" : NULL
;
1704 dc
->dc_inhibit_warnings
= true;
1707 case OPT_fmax_errors_
:
1708 dc
->max_errors
= value
;
1711 case OPT_fuse_linker_plugin
:
1712 /* No-op. Used by the driver and passed to us because it starts with f.*/
1715 case OPT_Wuninitialized
:
1716 /* Also turn on maybe uninitialized warning. */
1717 warn_maybe_uninitialized
= value
;
1721 /* If the flag was handled in a standard way, assume the lack of
1722 processing here is intentional. */
1723 gcc_assert (option_flag_var (scode
, opts
));
1730 /* Handle --param NAME=VALUE. */
1732 handle_param (struct gcc_options
*opts
, struct gcc_options
*opts_set
,
1733 location_t loc
, const char *carg
)
1738 arg
= xstrdup (carg
);
1739 equal
= strchr (arg
, '=');
1741 error_at (loc
, "%s: --param arguments should be of the form NAME=VALUE",
1745 value
= integral_argument (equal
+ 1);
1747 error_at (loc
, "invalid --param value %qs", equal
+ 1);
1751 set_param_value (arg
, value
,
1752 opts
->x_param_values
, opts_set
->x_param_values
);
1759 /* Used to set the level of strict aliasing warnings in OPTS,
1760 when no level is specified (i.e., when -Wstrict-aliasing, and not
1761 -Wstrict-aliasing=level was given).
1762 ONOFF is assumed to take value 1 when -Wstrict-aliasing is specified,
1763 and 0 otherwise. After calling this function, wstrict_aliasing will be
1764 set to the default value of -Wstrict_aliasing=level, currently 3. */
1766 set_Wstrict_aliasing (struct gcc_options
*opts
, int onoff
)
1768 gcc_assert (onoff
== 0 || onoff
== 1);
1770 opts
->x_warn_strict_aliasing
= 3;
1772 opts
->x_warn_strict_aliasing
= 0;
1775 /* The following routines are useful in setting all the flags that
1776 -ffast-math and -fno-fast-math imply. */
1778 set_fast_math_flags (struct gcc_options
*opts
, int set
)
1780 if (!opts
->frontend_set_flag_unsafe_math_optimizations
)
1782 opts
->x_flag_unsafe_math_optimizations
= set
;
1783 set_unsafe_math_optimizations_flags (opts
, set
);
1785 if (!opts
->frontend_set_flag_finite_math_only
)
1786 opts
->x_flag_finite_math_only
= set
;
1787 if (!opts
->frontend_set_flag_errno_math
)
1788 opts
->x_flag_errno_math
= !set
;
1791 if (!opts
->frontend_set_flag_signaling_nans
)
1792 opts
->x_flag_signaling_nans
= 0;
1793 if (!opts
->frontend_set_flag_rounding_math
)
1794 opts
->x_flag_rounding_math
= 0;
1795 if (!opts
->frontend_set_flag_cx_limited_range
)
1796 opts
->x_flag_cx_limited_range
= 1;
1800 /* When -funsafe-math-optimizations is set the following
1801 flags are set as well. */
1803 set_unsafe_math_optimizations_flags (struct gcc_options
*opts
, int set
)
1805 if (!opts
->frontend_set_flag_trapping_math
)
1806 opts
->x_flag_trapping_math
= !set
;
1807 if (!opts
->frontend_set_flag_signed_zeros
)
1808 opts
->x_flag_signed_zeros
= !set
;
1809 if (!opts
->frontend_set_flag_associative_math
)
1810 opts
->x_flag_associative_math
= set
;
1811 if (!opts
->frontend_set_flag_reciprocal_math
)
1812 opts
->x_flag_reciprocal_math
= set
;
1815 /* Return true iff flags in OPTS are set as if -ffast-math. */
1817 fast_math_flags_set_p (const struct gcc_options
*opts
)
1819 return (!opts
->x_flag_trapping_math
1820 && opts
->x_flag_unsafe_math_optimizations
1821 && opts
->x_flag_finite_math_only
1822 && !opts
->x_flag_signed_zeros
1823 && !opts
->x_flag_errno_math
);
1826 /* Return true iff flags are set as if -ffast-math but using the flags stored
1827 in the struct cl_optimization structure. */
1829 fast_math_flags_struct_set_p (struct cl_optimization
*opt
)
1831 return (!opt
->x_flag_trapping_math
1832 && opt
->x_flag_unsafe_math_optimizations
1833 && opt
->x_flag_finite_math_only
1834 && !opt
->x_flag_signed_zeros
1835 && !opt
->x_flag_errno_math
);
1838 /* Handle a debug output -g switch for options OPTS
1839 (OPTS_SET->x_write_symbols storing whether a debug type was passed
1840 explicitly), location LOC. EXTENDED is true or false to support
1841 extended output (2 is special and means "-ggdb" was given). */
1843 set_debug_level (enum debug_info_type type
, int extended
, const char *arg
,
1844 struct gcc_options
*opts
, struct gcc_options
*opts_set
,
1847 opts
->x_use_gnu_debug_info_extensions
= extended
;
1849 if (type
== NO_DEBUG
)
1851 if (opts
->x_write_symbols
== NO_DEBUG
)
1853 opts
->x_write_symbols
= PREFERRED_DEBUGGING_TYPE
;
1857 #ifdef DWARF2_DEBUGGING_INFO
1858 opts
->x_write_symbols
= DWARF2_DEBUG
;
1859 #elif defined DBX_DEBUGGING_INFO
1860 opts
->x_write_symbols
= DBX_DEBUG
;
1864 if (opts
->x_write_symbols
== NO_DEBUG
)
1865 warning_at (loc
, 0, "target system does not support debug output");
1870 /* Does it conflict with an already selected type? */
1871 if (opts_set
->x_write_symbols
!= NO_DEBUG
1872 && opts
->x_write_symbols
!= NO_DEBUG
1873 && type
!= opts
->x_write_symbols
)
1874 error_at (loc
, "debug format \"%s\" conflicts with prior selection",
1875 debug_type_names
[type
]);
1876 opts
->x_write_symbols
= type
;
1877 opts_set
->x_write_symbols
= type
;
1880 /* A debug flag without a level defaults to level 2. */
1883 if (!opts
->x_debug_info_level
)
1884 opts
->x_debug_info_level
= DINFO_LEVEL_NORMAL
;
1888 int argval
= integral_argument (arg
);
1890 error_at (loc
, "unrecognised debug output level \"%s\"", arg
);
1891 else if (argval
> 3)
1892 error_at (loc
, "debug output level %s is too high", arg
);
1894 opts
->x_debug_info_level
= (enum debug_info_levels
) argval
;
1898 /* Arrange to dump core on error for diagnostic context DC. (The
1899 regular error message is still printed first, except in the case of
1903 setup_core_dumping (diagnostic_context
*dc
)
1906 signal (SIGABRT
, SIG_DFL
);
1908 #if defined(HAVE_SETRLIMIT)
1911 if (getrlimit (RLIMIT_CORE
, &rlim
) != 0)
1912 fatal_error ("getting core file size maximum limit: %m");
1913 rlim
.rlim_cur
= rlim
.rlim_max
;
1914 if (setrlimit (RLIMIT_CORE
, &rlim
) != 0)
1915 fatal_error ("setting core file size limit to maximum: %m");
1918 diagnostic_abort_on_error (dc
);
1921 /* Parse a -d<ARG> command line switch for OPTS, location LOC,
1922 diagnostic context DC. */
1925 decode_d_option (const char *arg
, struct gcc_options
*opts
,
1926 location_t loc
, diagnostic_context
*dc
)
1934 opts
->x_flag_debug_asm
= 1;
1937 opts
->x_flag_print_asm_name
= 1;
1940 opts
->x_flag_dump_rtl_in_asm
= 1;
1941 opts
->x_flag_print_asm_name
= 1;
1944 opts
->x_graph_dump_format
= vcg
;
1947 opts
->x_rtl_dump_and_exit
= 1;
1949 case 'D': /* These are handled by the preprocessor. */
1956 setup_core_dumping (dc
);
1959 opts
->x_flag_dump_all_passed
= true;
1963 warning_at (loc
, 0, "unrecognized gcc debugging option: %c", c
);
1968 /* Enable (or disable if VALUE is 0) a warning option ARG (language
1969 mask LANG_MASK, option handlers HANDLERS) as an error for option
1970 structures OPTS and OPTS_SET, diagnostic context DC (possibly
1971 NULL), location LOC. This is used by -Werror=. */
1974 enable_warning_as_error (const char *arg
, int value
, unsigned int lang_mask
,
1975 const struct cl_option_handlers
*handlers
,
1976 struct gcc_options
*opts
,
1977 struct gcc_options
*opts_set
,
1978 location_t loc
, diagnostic_context
*dc
)
1983 new_option
= XNEWVEC (char, strlen (arg
) + 2);
1984 new_option
[0] = 'W';
1985 strcpy (new_option
+ 1, arg
);
1986 option_index
= find_opt (new_option
, lang_mask
);
1987 if (option_index
== OPT_SPECIAL_unknown
)
1989 error_at (loc
, "-Werror=%s: no option -%s", arg
, new_option
);
1993 const diagnostic_t kind
= value
? DK_ERROR
: DK_WARNING
;
1995 control_warning_option (option_index
, (int) kind
, value
,
1997 handlers
, opts
, opts_set
, dc
);
1998 if (option_index
== OPT_Wuninitialized
)
1999 enable_warning_as_error ("maybe-uninitialized", value
, lang_mask
,
2000 handlers
, opts
, opts_set
, loc
, dc
);
2005 /* Return malloced memory for the name of the option OPTION_INDEX
2006 which enabled a diagnostic (context CONTEXT), originally of type
2007 ORIG_DIAG_KIND but possibly converted to DIAG_KIND by options such
2011 option_name (diagnostic_context
*context
, int option_index
,
2012 diagnostic_t orig_diag_kind
, diagnostic_t diag_kind
)
2016 /* A warning classified as an error. */
2017 if ((orig_diag_kind
== DK_WARNING
|| orig_diag_kind
== DK_PEDWARN
)
2018 && diag_kind
== DK_ERROR
)
2019 return concat (cl_options
[OPT_Werror_
].opt_text
,
2020 /* Skip over "-W". */
2021 cl_options
[option_index
].opt_text
+ 2,
2023 /* A warning with option. */
2025 return xstrdup (cl_options
[option_index
].opt_text
);
2027 /* A warning without option classified as an error. */
2028 else if (orig_diag_kind
== DK_WARNING
|| orig_diag_kind
== DK_PEDWARN
2029 || diag_kind
== DK_WARNING
)
2031 if (context
->warning_as_error_requested
)
2032 return xstrdup (cl_options
[OPT_Werror
].opt_text
);
2034 return xstrdup (_("enabled by default"));