1 /* Command line option handling.
2 Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
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"
32 #include "langhooks.h"
38 #include "diagnostic.h"
39 #include "opts-diagnostic.h"
40 #include "insn-attr.h" /* For INSN_SCHEDULING. */
42 #include "tree-pass.h"
47 #include "lto-streamer.h"
49 /* True if we should exit after parsing options. */
50 bool exit_after_options
;
52 /* Type(s) of debugging information we are producing (if any). See
53 flags.h for the definitions of the different possible types of
54 debugging information. */
55 enum debug_info_type write_symbols
= NO_DEBUG
;
57 /* Level of debugging information we are producing. See flags.h for
58 the definitions of the different possible levels. */
59 enum debug_info_level debug_info_level
= DINFO_LEVEL_NONE
;
61 /* A major contribution to object and executable size is debug
62 information size. A major contribution to debug information size
63 is struct descriptions replicated in several object files. The
64 following flags attempt to reduce this information. The basic
65 idea is to not emit struct debugging information in the current
66 compilation unit when that information will be generated by
67 another compilation unit.
69 Debug information for a struct defined in the current source
70 file should be generated in the object file. Likewise the
71 debug information for a struct defined in a header should be
72 generated in the object file of the corresponding source file.
73 Both of these case are handled when the base name of the file of
74 the struct definition matches the base name of the source file
75 of the current compilation unit. This matching emits minimal
76 struct debugging information.
78 The base file name matching rule above will fail to emit debug
79 information for structs defined in system headers. So a second
80 category of files includes system headers in addition to files
83 The remaining types of files are library headers and application
84 headers. We cannot currently distinguish these two types. */
86 enum debug_struct_file
88 DINFO_STRUCT_FILE_NONE
, /* Debug no structs. */
89 DINFO_STRUCT_FILE_BASE
, /* Debug structs defined in files with the
90 same base name as the compilation unit. */
91 DINFO_STRUCT_FILE_SYS
, /* Also debug structs defined in system
93 DINFO_STRUCT_FILE_ANY
/* Debug structs defined in all files. */
96 /* Generic structs (e.g. templates not explicitly specialized)
97 may not have a compilation unit associated with them, and so
98 may need to be treated differently from ordinary structs.
100 Structs only handled by reference (indirectly), will also usually
101 not need as much debugging information. */
103 static enum debug_struct_file debug_struct_ordinary
[DINFO_USAGE_NUM_ENUMS
]
104 = { DINFO_STRUCT_FILE_ANY
, DINFO_STRUCT_FILE_ANY
, DINFO_STRUCT_FILE_ANY
};
105 static enum debug_struct_file debug_struct_generic
[DINFO_USAGE_NUM_ENUMS
]
106 = { DINFO_STRUCT_FILE_ANY
, DINFO_STRUCT_FILE_ANY
, DINFO_STRUCT_FILE_ANY
};
108 /* Run the second compilation of -fcompare-debug. Not defined using
109 Var in common.opt because this is used in Ada code and so must be
110 an actual variable not a macro. */
111 int flag_compare_debug
;
113 /* Parse the -femit-struct-debug-detailed option value
114 and set the flag variables. */
116 #define MATCH( prefix, string ) \
117 ((strncmp (prefix, string, sizeof prefix - 1) == 0) \
118 ? ((string += sizeof prefix - 1), 1) : 0)
121 set_struct_debug_option (const char *spec
)
123 /* various labels for comparison */
124 static char dfn_lbl
[] = "dfn:", dir_lbl
[] = "dir:", ind_lbl
[] = "ind:";
125 static char ord_lbl
[] = "ord:", gen_lbl
[] = "gen:";
126 static char none_lbl
[] = "none", any_lbl
[] = "any";
127 static char base_lbl
[] = "base", sys_lbl
[] = "sys";
129 enum debug_struct_file files
= DINFO_STRUCT_FILE_ANY
;
130 /* Default is to apply to as much as possible. */
131 enum debug_info_usage usage
= DINFO_USAGE_NUM_ENUMS
;
132 int ord
= 1, gen
= 1;
135 if (MATCH (dfn_lbl
, spec
))
136 usage
= DINFO_USAGE_DFN
;
137 else if (MATCH (dir_lbl
, spec
))
138 usage
= DINFO_USAGE_DIR_USE
;
139 else if (MATCH (ind_lbl
, spec
))
140 usage
= DINFO_USAGE_IND_USE
;
142 /* Generics or not? */
143 if (MATCH (ord_lbl
, spec
))
145 else if (MATCH (gen_lbl
, spec
))
148 /* What allowable environment? */
149 if (MATCH (none_lbl
, spec
))
150 files
= DINFO_STRUCT_FILE_NONE
;
151 else if (MATCH (any_lbl
, spec
))
152 files
= DINFO_STRUCT_FILE_ANY
;
153 else if (MATCH (sys_lbl
, spec
))
154 files
= DINFO_STRUCT_FILE_SYS
;
155 else if (MATCH (base_lbl
, spec
))
156 files
= DINFO_STRUCT_FILE_BASE
;
158 error ("argument %qs to %<-femit-struct-debug-detailed%> not recognized",
161 /* Effect the specification. */
162 if (usage
== DINFO_USAGE_NUM_ENUMS
)
166 debug_struct_ordinary
[DINFO_USAGE_DFN
] = files
;
167 debug_struct_ordinary
[DINFO_USAGE_DIR_USE
] = files
;
168 debug_struct_ordinary
[DINFO_USAGE_IND_USE
] = files
;
172 debug_struct_generic
[DINFO_USAGE_DFN
] = files
;
173 debug_struct_generic
[DINFO_USAGE_DIR_USE
] = files
;
174 debug_struct_generic
[DINFO_USAGE_IND_USE
] = files
;
180 debug_struct_ordinary
[usage
] = files
;
182 debug_struct_generic
[usage
] = files
;
186 set_struct_debug_option (spec
+1);
189 /* No more -femit-struct-debug-detailed specifications.
192 error ("argument %qs to %<-femit-struct-debug-detailed%> unknown",
194 if (debug_struct_ordinary
[DINFO_USAGE_DIR_USE
]
195 < debug_struct_ordinary
[DINFO_USAGE_IND_USE
]
196 || debug_struct_generic
[DINFO_USAGE_DIR_USE
]
197 < debug_struct_generic
[DINFO_USAGE_IND_USE
])
198 error ("%<-femit-struct-debug-detailed=dir:...%> must allow at least"
199 " as much as %<-femit-struct-debug-detailed=ind:...%>");
203 /* Find the base name of a path, stripping off both directories and
204 a single final extension. */
206 base_of_path (const char *path
, const char **base_out
)
208 const char *base
= path
;
210 const char *p
= path
;
214 if (IS_DIR_SEPARATOR(c
))
229 /* Match the base name of a file to the base name of a compilation unit. */
231 static const char *main_input_basename
;
232 static int main_input_baselength
;
235 matches_main_base (const char *path
)
237 /* Cache the last query. */
238 static const char *last_path
= NULL
;
239 static int last_match
= 0;
240 if (path
!= last_path
)
243 int length
= base_of_path (path
, &base
);
245 last_match
= (length
== main_input_baselength
246 && memcmp (base
, main_input_basename
, length
) == 0);
251 #ifdef DEBUG_DEBUG_STRUCT
254 dump_struct_debug (tree type
, enum debug_info_usage usage
,
255 enum debug_struct_file criterion
, int generic
,
256 int matches
, int result
)
258 /* Find the type name. */
259 tree type_decl
= TYPE_STUB_DECL (type
);
261 const char *name
= 0;
262 if (TREE_CODE (t
) == TYPE_DECL
)
265 name
= IDENTIFIER_POINTER (t
);
267 fprintf (stderr
, " struct %d %s %s %s %s %d %p %s\n",
269 DECL_IN_SYSTEM_HEADER (type_decl
) ? "sys" : "usr",
270 matches
? "bas" : "hdr",
271 generic
? "gen" : "ord",
272 usage
== DINFO_USAGE_DFN
? ";" :
273 usage
== DINFO_USAGE_DIR_USE
? "." : "*",
275 (void*) type_decl
, name
);
278 #define DUMP_GSTRUCT(type, usage, criterion, generic, matches, result) \
279 dump_struct_debug (type, usage, criterion, generic, matches, result)
283 #define DUMP_GSTRUCT(type, usage, criterion, generic, matches, result) \
290 should_emit_struct_debug (tree type
, enum debug_info_usage usage
)
292 enum debug_struct_file criterion
;
294 bool generic
= lang_hooks
.types
.generic_p (type
);
297 criterion
= debug_struct_generic
[usage
];
299 criterion
= debug_struct_ordinary
[usage
];
301 if (criterion
== DINFO_STRUCT_FILE_NONE
)
302 return DUMP_GSTRUCT (type
, usage
, criterion
, generic
, false, false);
303 if (criterion
== DINFO_STRUCT_FILE_ANY
)
304 return DUMP_GSTRUCT (type
, usage
, criterion
, generic
, false, true);
306 type_decl
= TYPE_STUB_DECL (type
);
308 if (criterion
== DINFO_STRUCT_FILE_SYS
&& DECL_IN_SYSTEM_HEADER (type_decl
))
309 return DUMP_GSTRUCT (type
, usage
, criterion
, generic
, false, true);
311 if (matches_main_base (DECL_SOURCE_FILE (type_decl
)))
312 return DUMP_GSTRUCT (type
, usage
, criterion
, generic
, true, true);
313 return DUMP_GSTRUCT (type
, usage
, criterion
, generic
, false, false);
316 /* Nonzero means use GNU-only extensions in the generated symbolic
317 debugging information. Currently, this only has an effect when
318 write_symbols is set to DBX_DEBUG, XCOFF_DEBUG, or DWARF_DEBUG. */
319 bool use_gnu_debug_info_extensions
;
321 /* Global visibility options. */
322 struct visibility_flags visibility_options
;
324 /* What to print when a switch has no documentation. */
325 static const char undocumented_msg
[] = N_("This switch lacks documentation");
327 /* Functions excluded from profiling. */
329 typedef char *char_p
; /* For DEF_VEC_P. */
331 DEF_VEC_ALLOC_P(char_p
,heap
);
333 static VEC(char_p
,heap
) *flag_instrument_functions_exclude_functions
;
334 static VEC(char_p
,heap
) *flag_instrument_functions_exclude_files
;
336 typedef const char *const_char_p
; /* For DEF_VEC_P. */
337 DEF_VEC_P(const_char_p
);
338 DEF_VEC_ALLOC_P(const_char_p
,heap
);
340 static VEC(const_char_p
,heap
) *ignored_options
;
342 /* Input file names. */
343 const char **in_fnames
;
344 unsigned num_in_fnames
;
346 static bool common_handle_option (struct gcc_options
*opts
,
347 struct gcc_options
*opts_set
,
348 const struct cl_decoded_option
*decoded
,
349 unsigned int lang_mask
, int kind
,
350 const struct cl_option_handlers
*handlers
,
351 diagnostic_context
*dc
);
352 static void handle_param (struct gcc_options
*opts
,
353 struct gcc_options
*opts_set
, const char *carg
);
354 static char *write_langs (unsigned int lang_mask
);
355 static void complain_wrong_lang (const struct cl_decoded_option
*,
356 unsigned int lang_mask
);
357 static void set_debug_level (enum debug_info_type type
, int extended
,
359 static void set_fast_math_flags (struct gcc_options
*opts
, int set
);
360 static void set_unsafe_math_optimizations_flags (struct gcc_options
*opts
,
363 /* Return a malloced slash-separated list of languages in MASK. */
365 write_langs (unsigned int mask
)
367 unsigned int n
= 0, len
= 0;
368 const char *lang_name
;
371 for (n
= 0; (lang_name
= lang_names
[n
]) != 0; n
++)
372 if (mask
& (1U << n
))
373 len
+= strlen (lang_name
) + 1;
375 result
= XNEWVEC (char, len
);
377 for (n
= 0; (lang_name
= lang_names
[n
]) != 0; n
++)
378 if (mask
& (1U << n
))
382 strcpy (result
+ len
, lang_name
);
383 len
+= strlen (lang_name
);
391 /* Complain that switch DECODED does not apply to this front end (mask
394 complain_wrong_lang (const struct cl_decoded_option
*decoded
,
395 unsigned int lang_mask
)
397 const struct cl_option
*option
= &cl_options
[decoded
->opt_index
];
398 const char *text
= decoded
->orig_option_with_args_text
;
399 char *ok_langs
= NULL
, *bad_lang
= NULL
;
400 unsigned int opt_flags
= option
->flags
;
402 if (!lang_hooks
.complain_wrong_lang_p (option
))
405 opt_flags
&= ((1U << cl_lang_count
) - 1) | CL_DRIVER
;
406 if (opt_flags
!= CL_DRIVER
)
407 ok_langs
= write_langs (opt_flags
);
408 if (lang_mask
!= CL_DRIVER
)
409 bad_lang
= write_langs (lang_mask
);
411 if (opt_flags
== CL_DRIVER
)
412 error ("command line option %qs is valid for the driver but not for %s",
414 else if (lang_mask
== CL_DRIVER
)
417 /* Eventually this should become a hard error IMO. */
418 warning (0, "command line option %qs is valid for %s but not for %s",
419 text
, ok_langs
, bad_lang
);
425 /* Buffer the unknown option described by the string OPT. Currently,
426 we only complain about unknown -Wno-* options if they may have
427 prevented a diagnostic. Otherwise, we just ignore them.
428 Note that if we do complain, it is only as a warning, not an error;
429 passing the compiler an unrecognised -Wno-* option should never
430 change whether the compilation succeeds or fails. */
432 static void postpone_unknown_option_warning(const char *opt
)
434 VEC_safe_push (const_char_p
, heap
, ignored_options
, opt
);
437 /* Produce a warning for each option previously buffered. */
439 void print_ignored_options (void)
441 location_t saved_loc
= input_location
;
445 while (!VEC_empty (const_char_p
, ignored_options
))
448 opt
= VEC_pop (const_char_p
, ignored_options
);
449 warning (0, "unrecognized command line option \"%s\"", opt
);
452 input_location
= saved_loc
;
455 /* Handle an unknown option DECODED, returning true if an error should be
459 unknown_option_callback (const struct cl_decoded_option
*decoded
)
461 const char *opt
= decoded
->arg
;
463 if (opt
[1] == 'W' && opt
[2] == 'n' && opt
[3] == 'o' && opt
[4] == '-'
464 && !(decoded
->errors
& CL_ERR_NEGATIVE
))
466 /* We don't generate warnings for unknown -Wno-* options unless
467 we issue diagnostics. */
468 postpone_unknown_option_warning (opt
);
475 /* Note that an option DECODED has been successfully handled with a
476 handler for mask MASK. */
479 post_handling_callback (const struct cl_decoded_option
*decoded ATTRIBUTE_UNUSED
,
480 unsigned int mask ATTRIBUTE_UNUSED
)
483 lto_register_user_option (decoded
->opt_index
, decoded
->arg
,
484 decoded
->value
, mask
);
488 /* Handle a front-end option; arguments and return value as for
492 lang_handle_option (struct gcc_options
*opts
,
493 struct gcc_options
*opts_set
,
494 const struct cl_decoded_option
*decoded
,
495 unsigned int lang_mask ATTRIBUTE_UNUSED
, int kind
,
496 const struct cl_option_handlers
*handlers
,
497 diagnostic_context
*dc
)
499 gcc_assert (opts
== &global_options
);
500 gcc_assert (opts_set
== &global_options_set
);
501 gcc_assert (dc
== global_dc
);
502 gcc_assert (decoded
->canonical_option_num_elements
<= 2);
503 return lang_hooks
.handle_option (decoded
->opt_index
, decoded
->arg
,
504 decoded
->value
, kind
, handlers
);
507 /* Handle a back-end option; arguments and return value as for
511 target_handle_option (struct gcc_options
*opts
,
512 struct gcc_options
*opts_set
,
513 const struct cl_decoded_option
*decoded
,
514 unsigned int lang_mask ATTRIBUTE_UNUSED
, int kind
,
515 const struct cl_option_handlers
*handlers ATTRIBUTE_UNUSED
,
516 diagnostic_context
*dc
)
518 gcc_assert (opts
== &global_options
);
519 gcc_assert (opts_set
== &global_options_set
);
520 gcc_assert (dc
== global_dc
);
521 gcc_assert (decoded
->canonical_option_num_elements
<= 2);
522 gcc_assert (kind
== DK_UNSPECIFIED
);
523 return targetm
.handle_option (decoded
->opt_index
, decoded
->arg
,
527 /* Handle FILENAME from the command line. */
529 add_input_filename (const char *filename
)
532 in_fnames
= XRESIZEVEC (const char *, in_fnames
, num_in_fnames
);
533 in_fnames
[num_in_fnames
- 1] = filename
;
536 /* Add comma-separated strings to a char_p vector. */
539 add_comma_separated_to_vector (VEC(char_p
,heap
) **pvec
, const char* arg
)
546 /* We never free this string. */
559 VEC_safe_push (char_p
, heap
, *pvec
, token_start
);
562 if (*r
== '\\' && r
[1] == ',')
570 if (*token_start
!= '\0')
571 VEC_safe_push (char_p
, heap
, *pvec
, token_start
);
574 /* Return whether we should exclude FNDECL from instrumentation. */
577 flag_instrument_functions_exclude_p (tree fndecl
)
579 if (VEC_length (char_p
, flag_instrument_functions_exclude_functions
) > 0)
585 name
= lang_hooks
.decl_printable_name (fndecl
, 0);
586 FOR_EACH_VEC_ELT (char_p
, flag_instrument_functions_exclude_functions
,
588 if (strstr (name
, s
) != NULL
)
592 if (VEC_length (char_p
, flag_instrument_functions_exclude_files
) > 0)
598 name
= DECL_SOURCE_FILE (fndecl
);
599 FOR_EACH_VEC_ELT (char_p
, flag_instrument_functions_exclude_files
, i
, s
)
600 if (strstr (name
, s
) != NULL
)
608 /* Handle the vector of command line options, storing the results of
609 processing DECODED_OPTIONS and DECODED_OPTIONS_COUNT in OPTS and
610 OPTS_SET and using DC for diagnostic state. LANG_MASK contains has
611 a single bit set representing the current language. HANDLERS
612 describes what functions to call for the options. */
614 read_cmdline_options (struct gcc_options
*opts
, struct gcc_options
*opts_set
,
615 struct cl_decoded_option
*decoded_options
,
616 unsigned int decoded_options_count
,
617 unsigned int lang_mask
,
618 const struct cl_option_handlers
*handlers
,
619 diagnostic_context
*dc
)
623 for (i
= 1; i
< decoded_options_count
; i
++)
625 if (decoded_options
[i
].opt_index
== OPT_SPECIAL_input_file
)
627 /* Input files should only ever appear on the main command
629 gcc_assert (opts
== &global_options
);
630 gcc_assert (opts_set
== &global_options_set
);
632 if (main_input_filename
== NULL
)
634 main_input_filename
= decoded_options
[i
].arg
;
635 main_input_baselength
636 = base_of_path (main_input_filename
, &main_input_basename
);
638 add_input_filename (decoded_options
[i
].arg
);
642 read_cmdline_option (opts
, opts_set
,
643 decoded_options
+ i
, lang_mask
, handlers
,
648 /* Language mask determined at initialization. */
649 static unsigned int initial_lang_mask
;
651 /* Initialize global options-related settings at start-up. */
654 init_options_once (void)
656 /* Perform language-specific options initialization. */
657 initial_lang_mask
= lang_hooks
.option_lang_mask ();
659 lang_hooks
.initialize_diagnostics (global_dc
);
662 /* Initialize OPTS and OPTS_SET before using them in parsing options. */
665 init_options_struct (struct gcc_options
*opts
, struct gcc_options
*opts_set
)
667 size_t num_params
= get_num_compiler_params ();
669 *opts
= global_options_init
;
670 memset (opts_set
, 0, sizeof (*opts_set
));
672 opts
->x_param_values
= XNEWVEC (int, num_params
);
673 opts_set
->x_param_values
= XCNEWVEC (int, num_params
);
674 init_param_values (opts
->x_param_values
);
676 /* Use priority coloring if cover classes is not defined for the
678 if (targetm
.ira_cover_classes
== NULL
)
679 opts
->x_flag_ira_algorithm
= IRA_ALGORITHM_PRIORITY
;
681 /* Initialize whether `char' is signed. */
682 opts
->x_flag_signed_char
= DEFAULT_SIGNED_CHAR
;
683 /* Set this to a special "uninitialized" value. The actual default
684 is set after target options have been processed. */
685 opts
->x_flag_short_enums
= 2;
687 /* Initialize target_flags before targetm.target_option.optimization
688 so the latter can modify it. */
689 opts
->x_target_flags
= targetm
.default_target_flags
;
691 /* Some targets have ABI-specified unwind tables. */
692 opts
->x_flag_unwind_tables
= targetm
.unwind_tables_default
;
694 /* Some targets have other target-specific initialization. */
695 targetm
.target_option
.init_struct (opts
);
698 /* Decode command-line options to an array, like
699 decode_cmdline_options_to_array and with the same arguments but
700 using the default lang_mask. */
703 decode_cmdline_options_to_array_default_mask (unsigned int argc
,
705 struct cl_decoded_option
**decoded_options
,
706 unsigned int *decoded_options_count
)
708 decode_cmdline_options_to_array (argc
, argv
,
709 initial_lang_mask
| CL_COMMON
| CL_TARGET
,
710 decoded_options
, decoded_options_count
);
713 /* If indicated by the optimization level LEVEL (-Os if SIZE is set,
714 -Ofast if FAST is set), apply the option DEFAULT_OPT to OPTS and
715 OPTS_SET, diagnostic context DC, with language mask LANG_MASK and
716 option handlers HANDLERS. */
719 maybe_default_option (struct gcc_options
*opts
,
720 struct gcc_options
*opts_set
,
721 const struct default_options
*default_opt
,
722 int level
, bool size
, bool fast
,
723 unsigned int lang_mask
,
724 const struct cl_option_handlers
*handlers
,
725 diagnostic_context
*dc
)
727 const struct cl_option
*option
= &cl_options
[default_opt
->opt_index
];
731 gcc_assert (level
== 2);
733 gcc_assert (level
== 3);
735 switch (default_opt
->levels
)
741 case OPT_LEVELS_0_ONLY
:
742 enabled
= (level
== 0);
745 case OPT_LEVELS_1_PLUS
:
746 enabled
= (level
>= 1);
749 case OPT_LEVELS_1_PLUS_SPEED_ONLY
:
750 enabled
= (level
>= 1 && !size
);
753 case OPT_LEVELS_2_PLUS
:
754 enabled
= (level
>= 2);
757 case OPT_LEVELS_2_PLUS_SPEED_ONLY
:
758 enabled
= (level
>= 2 && !size
);
761 case OPT_LEVELS_3_PLUS
:
762 enabled
= (level
>= 3);
765 case OPT_LEVELS_3_PLUS_AND_SIZE
:
766 enabled
= (level
>= 3 || size
);
769 case OPT_LEVELS_SIZE
:
773 case OPT_LEVELS_FAST
:
777 case OPT_LEVELS_NONE
:
783 handle_generated_option (opts
, opts_set
, default_opt
->opt_index
,
784 default_opt
->arg
, default_opt
->value
,
785 lang_mask
, DK_UNSPECIFIED
, handlers
, dc
);
786 else if (default_opt
->arg
== NULL
787 && !(option
->flags
& CL_REJECT_NEGATIVE
))
788 handle_generated_option (opts
, opts_set
, default_opt
->opt_index
,
789 default_opt
->arg
, !default_opt
->value
,
790 lang_mask
, DK_UNSPECIFIED
, handlers
, dc
);
793 /* As indicated by the optimization level LEVEL (-Os if SIZE is set,
794 -Ofast if FAST is set), apply the options in array DEFAULT_OPTS to
795 OPTS and OPTS_SET, diagnostic context DC, with language mask
796 LANG_MASK and option handlers HANDLERS. */
799 maybe_default_options (struct gcc_options
*opts
,
800 struct gcc_options
*opts_set
,
801 const struct default_options
*default_opts
,
802 int level
, bool size
, bool fast
,
803 unsigned int lang_mask
,
804 const struct cl_option_handlers
*handlers
,
805 diagnostic_context
*dc
)
809 for (i
= 0; default_opts
[i
].levels
!= OPT_LEVELS_NONE
; i
++)
810 maybe_default_option (opts
, opts_set
, &default_opts
[i
],
811 level
, size
, fast
, lang_mask
, handlers
, dc
);
814 /* Table of options enabled by default at different levels. */
816 static const struct default_options default_options_table
[] =
818 /* -O1 optimizations. */
819 { OPT_LEVELS_1_PLUS
, OPT_fdefer_pop
, NULL
, 1 },
821 { OPT_LEVELS_1_PLUS
, OPT_fdelayed_branch
, NULL
, 1 },
823 { OPT_LEVELS_1_PLUS
, OPT_fguess_branch_probability
, NULL
, 1 },
824 { OPT_LEVELS_1_PLUS
, OPT_fcprop_registers
, NULL
, 1 },
825 { OPT_LEVELS_1_PLUS
, OPT_fforward_propagate
, NULL
, 1 },
826 { OPT_LEVELS_1_PLUS
, OPT_fif_conversion
, NULL
, 1 },
827 { OPT_LEVELS_1_PLUS
, OPT_fif_conversion2
, NULL
, 1 },
828 { OPT_LEVELS_1_PLUS
, OPT_fipa_pure_const
, NULL
, 1 },
829 { OPT_LEVELS_1_PLUS
, OPT_fipa_reference
, NULL
, 1 },
830 { OPT_LEVELS_1_PLUS
, OPT_fipa_profile
, NULL
, 1 },
831 { OPT_LEVELS_1_PLUS
, OPT_fmerge_constants
, NULL
, 1 },
832 { OPT_LEVELS_1_PLUS
, OPT_fsplit_wide_types
, NULL
, 1 },
833 { OPT_LEVELS_1_PLUS
, OPT_ftree_ccp
, NULL
, 1 },
834 { OPT_LEVELS_1_PLUS
, OPT_ftree_bit_ccp
, NULL
, 1 },
835 { OPT_LEVELS_1_PLUS
, OPT_ftree_dce
, NULL
, 1 },
836 { OPT_LEVELS_1_PLUS
, OPT_ftree_dominator_opts
, NULL
, 1 },
837 { OPT_LEVELS_1_PLUS
, OPT_ftree_dse
, NULL
, 1 },
838 { OPT_LEVELS_1_PLUS
, OPT_ftree_ter
, NULL
, 1 },
839 { OPT_LEVELS_1_PLUS
, OPT_ftree_sra
, NULL
, 1 },
840 { OPT_LEVELS_1_PLUS
, OPT_ftree_copyrename
, NULL
, 1 },
841 { OPT_LEVELS_1_PLUS
, OPT_ftree_fre
, NULL
, 1 },
842 { OPT_LEVELS_1_PLUS
, OPT_ftree_copy_prop
, NULL
, 1 },
843 { OPT_LEVELS_1_PLUS
, OPT_ftree_sink
, NULL
, 1 },
844 { OPT_LEVELS_1_PLUS
, OPT_ftree_ch
, NULL
, 1 },
845 { OPT_LEVELS_1_PLUS
, OPT_fcombine_stack_adjustments
, NULL
, 1 },
847 /* -O2 optimizations. */
848 { OPT_LEVELS_2_PLUS
, OPT_finline_small_functions
, NULL
, 1 },
849 { OPT_LEVELS_2_PLUS
, OPT_findirect_inlining
, NULL
, 1 },
850 { OPT_LEVELS_2_PLUS
, OPT_fpartial_inlining
, NULL
, 1 },
851 { OPT_LEVELS_2_PLUS
, OPT_fthread_jumps
, NULL
, 1 },
852 { OPT_LEVELS_2_PLUS
, OPT_fcrossjumping
, NULL
, 1 },
853 { OPT_LEVELS_2_PLUS
, OPT_foptimize_sibling_calls
, NULL
, 1 },
854 { OPT_LEVELS_2_PLUS
, OPT_fcse_follow_jumps
, NULL
, 1 },
855 { OPT_LEVELS_2_PLUS
, OPT_fgcse
, NULL
, 1 },
856 { OPT_LEVELS_2_PLUS
, OPT_fexpensive_optimizations
, NULL
, 1 },
857 { OPT_LEVELS_2_PLUS
, OPT_frerun_cse_after_loop
, NULL
, 1 },
858 { OPT_LEVELS_2_PLUS
, OPT_fcaller_saves
, NULL
, 1 },
859 { OPT_LEVELS_2_PLUS
, OPT_fpeephole2
, NULL
, 1 },
860 #ifdef INSN_SCHEDULING
861 /* Only run the pre-regalloc scheduling pass if optimizing for speed. */
862 { OPT_LEVELS_2_PLUS_SPEED_ONLY
, OPT_fschedule_insns
, NULL
, 1 },
863 { OPT_LEVELS_2_PLUS
, OPT_fschedule_insns2
, NULL
, 1 },
865 { OPT_LEVELS_2_PLUS
, OPT_fregmove
, NULL
, 1 },
866 { OPT_LEVELS_2_PLUS
, OPT_fstrict_aliasing
, NULL
, 1 },
867 { OPT_LEVELS_2_PLUS
, OPT_fstrict_overflow
, NULL
, 1 },
868 { OPT_LEVELS_2_PLUS
, OPT_freorder_blocks
, NULL
, 1 },
869 { OPT_LEVELS_2_PLUS
, OPT_freorder_functions
, NULL
, 1 },
870 { OPT_LEVELS_2_PLUS
, OPT_ftree_vrp
, NULL
, 1 },
871 { OPT_LEVELS_2_PLUS
, OPT_ftree_builtin_call_dce
, NULL
, 1 },
872 { OPT_LEVELS_2_PLUS
, OPT_ftree_pre
, NULL
, 1 },
873 { OPT_LEVELS_2_PLUS
, OPT_ftree_switch_conversion
, NULL
, 1 },
874 { OPT_LEVELS_2_PLUS
, OPT_fipa_cp
, NULL
, 1 },
875 { OPT_LEVELS_2_PLUS
, OPT_fipa_sra
, NULL
, 1 },
876 { OPT_LEVELS_2_PLUS
, OPT_falign_loops
, NULL
, 1 },
877 { OPT_LEVELS_2_PLUS
, OPT_falign_jumps
, NULL
, 1 },
878 { OPT_LEVELS_2_PLUS
, OPT_falign_labels
, NULL
, 1 },
879 { OPT_LEVELS_2_PLUS
, OPT_falign_functions
, NULL
, 1 },
881 /* -O3 optimizations. */
882 { OPT_LEVELS_3_PLUS
, OPT_ftree_loop_distribute_patterns
, NULL
, 1 },
883 { OPT_LEVELS_3_PLUS
, OPT_fpredictive_commoning
, NULL
, 1 },
884 /* Inlining of functions reducing size is a good idea with -Os
885 regardless of them being declared inline. */
886 { OPT_LEVELS_3_PLUS_AND_SIZE
, OPT_finline_functions
, NULL
, 1 },
887 { OPT_LEVELS_3_PLUS
, OPT_funswitch_loops
, NULL
, 1 },
888 { OPT_LEVELS_3_PLUS
, OPT_fgcse_after_reload
, NULL
, 1 },
889 { OPT_LEVELS_3_PLUS
, OPT_ftree_vectorize
, NULL
, 1 },
890 { OPT_LEVELS_3_PLUS
, OPT_fipa_cp_clone
, NULL
, 1 },
892 /* -Ofast adds optimizations to -O3. */
893 { OPT_LEVELS_FAST
, OPT_ffast_math
, NULL
, 1 },
895 { OPT_LEVELS_NONE
, 0, NULL
, 0 }
898 /* Default the options in OPTS and OPTS_SET based on the optimization
899 settings in DECODED_OPTIONS and DECODED_OPTIONS_COUNT. */
901 default_options_optimization (struct gcc_options
*opts
,
902 struct gcc_options
*opts_set
,
903 struct cl_decoded_option
*decoded_options
,
904 unsigned int decoded_options_count
,
905 unsigned int lang_mask
,
906 const struct cl_option_handlers
*handlers
,
907 diagnostic_context
*dc
)
913 /* Scan to see what optimization level has been specified. That will
914 determine the default value of many flags. */
915 for (i
= 1; i
< decoded_options_count
; i
++)
917 struct cl_decoded_option
*opt
= &decoded_options
[i
];
918 switch (opt
->opt_index
)
921 if (*opt
->arg
== '\0')
923 opts
->x_optimize
= 1;
924 opts
->x_optimize_size
= 0;
929 const int optimize_val
= integral_argument (opt
->arg
);
930 if (optimize_val
== -1)
931 error ("argument to %qs should be a non-negative integer",
935 opts
->x_optimize
= optimize_val
;
936 if ((unsigned int) opts
->x_optimize
> 255)
937 opts
->x_optimize
= 255;
938 opts
->x_optimize_size
= 0;
945 opts
->x_optimize_size
= 1;
947 /* Optimizing for size forces optimize to be 2. */
948 opts
->x_optimize
= 2;
953 /* -Ofast only adds flags to -O3. */
954 opts
->x_optimize_size
= 0;
955 opts
->x_optimize
= 3;
960 /* Ignore other options in this prescan. */
965 maybe_default_options (opts
, opts_set
, default_options_table
,
966 opts
->x_optimize
, opts
->x_optimize_size
,
967 ofast
, lang_mask
, handlers
, dc
);
969 /* -O2 param settings. */
970 opt2
= (opts
->x_optimize
>= 2);
972 /* Track fields in field-sensitive alias analysis. */
973 maybe_set_param_value
974 (PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE
,
975 opt2
? 100 : default_param_value (PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE
),
976 opts
->x_param_values
, opts_set
->x_param_values
);
978 /* For -O1 only do loop invariant motion for very small loops. */
979 maybe_set_param_value
980 (PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP
,
981 opt2
? default_param_value (PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP
) : 1000,
982 opts
->x_param_values
, opts_set
->x_param_values
);
984 if (opts
->x_optimize_size
)
985 /* We want to crossjump as much as possible. */
986 maybe_set_param_value (PARAM_MIN_CROSSJUMP_INSNS
, 1,
987 opts
->x_param_values
, opts_set
->x_param_values
);
989 maybe_set_param_value (PARAM_MIN_CROSSJUMP_INSNS
,
990 default_param_value (PARAM_MIN_CROSSJUMP_INSNS
),
991 opts
->x_param_values
, opts_set
->x_param_values
);
993 /* Allow default optimizations to be specified on a per-machine basis. */
994 maybe_default_options (opts
, opts_set
,
995 targetm
.target_option
.optimization_table
,
996 opts
->x_optimize
, opts
->x_optimize_size
,
997 ofast
, lang_mask
, handlers
, dc
);
1000 static void finish_options (struct gcc_options
*, struct gcc_options
*);
1002 /* Parse command line options and set default flag values. Do minimal
1003 options processing. The decoded options are in *DECODED_OPTIONS
1004 and *DECODED_OPTIONS_COUNT; settings go in OPTS, OPTS_SET and DC. */
1006 decode_options (struct gcc_options
*opts
, struct gcc_options
*opts_set
,
1007 struct cl_decoded_option
*decoded_options
,
1008 unsigned int decoded_options_count
,
1009 diagnostic_context
*dc
)
1011 struct cl_option_handlers handlers
;
1013 unsigned int lang_mask
;
1015 lang_mask
= initial_lang_mask
;
1017 handlers
.unknown_option_callback
= unknown_option_callback
;
1018 handlers
.wrong_lang_callback
= complain_wrong_lang
;
1019 handlers
.post_handling_callback
= post_handling_callback
;
1020 handlers
.num_handlers
= 3;
1021 handlers
.handlers
[0].handler
= lang_handle_option
;
1022 handlers
.handlers
[0].mask
= lang_mask
;
1023 handlers
.handlers
[1].handler
= common_handle_option
;
1024 handlers
.handlers
[1].mask
= CL_COMMON
;
1025 handlers
.handlers
[2].handler
= target_handle_option
;
1026 handlers
.handlers
[2].mask
= CL_TARGET
;
1028 /* Enable -Werror=coverage-mismatch by default */
1029 enable_warning_as_error ("coverage-mismatch", 1, lang_mask
, &handlers
,
1032 default_options_optimization (opts
, opts_set
,
1033 decoded_options
, decoded_options_count
,
1034 lang_mask
, &handlers
, dc
);
1037 /* Clear any options currently held for LTO. */
1038 lto_clear_user_options ();
1041 read_cmdline_options (opts
, opts_set
,
1042 decoded_options
, decoded_options_count
, lang_mask
,
1045 finish_options (opts
, opts_set
);
1048 /* After all options have been read into OPTS and OPTS_SET, finalize
1049 settings of those options and diagnose incompatible
1052 finish_options (struct gcc_options
*opts
, struct gcc_options
*opts_set
)
1054 static bool first_time_p
= true;
1055 enum unwind_info_type ui_except
;
1057 gcc_assert (opts
== &global_options
);
1058 gcc_assert (opts_set
= &global_options_set
);
1060 if (opts
->x_dump_base_name
&& ! IS_ABSOLUTE_PATH (opts
->x_dump_base_name
))
1062 /* First try to make OPTS->X_DUMP_BASE_NAME relative to the
1063 OPTS->X_DUMP_DIR_NAME directory. Then try to make
1064 OPTS->X_DUMP_BASE_NAME relative to the OPTS->X_AUX_BASE_NAME
1065 directory, typically the directory to contain the object
1067 if (opts
->x_dump_dir_name
)
1068 opts
->x_dump_base_name
= concat (opts
->x_dump_dir_name
,
1069 opts
->x_dump_base_name
, NULL
);
1070 else if (opts
->x_aux_base_name
)
1072 const char *aux_base
;
1074 base_of_path (opts
->x_aux_base_name
, &aux_base
);
1075 if (opts
->x_aux_base_name
!= aux_base
)
1077 int dir_len
= aux_base
- opts
->x_aux_base_name
;
1078 char *new_dump_base_name
=
1079 XNEWVEC (char, strlen (opts
->x_dump_base_name
) + dir_len
+ 1);
1081 /* Copy directory component from OPTS->X_AUX_BASE_NAME. */
1082 memcpy (new_dump_base_name
, opts
->x_aux_base_name
, dir_len
);
1083 /* Append existing OPTS->X_DUMP_BASE_NAME. */
1084 strcpy (new_dump_base_name
+ dir_len
, opts
->x_dump_base_name
);
1085 opts
->x_dump_base_name
= new_dump_base_name
;
1090 /* Handle related options for unit-at-a-time, toplevel-reorder, and
1092 if (!opts
->x_flag_unit_at_a_time
)
1094 if (opts
->x_flag_section_anchors
&& opts_set
->x_flag_section_anchors
)
1095 error ("section anchors must be disabled when unit-at-a-time "
1097 opts
->x_flag_section_anchors
= 0;
1098 if (opts
->x_flag_toplevel_reorder
== 1)
1099 error ("toplevel reorder must be disabled when unit-at-a-time "
1101 opts
->x_flag_toplevel_reorder
= 0;
1104 /* -Wmissing-noreturn is alias for -Wsuggest-attribute=noreturn. */
1105 if (opts
->x_warn_missing_noreturn
)
1106 opts
->x_warn_suggest_attribute_noreturn
= true;
1108 /* Unless the user has asked for section anchors, we disable toplevel
1109 reordering at -O0 to disable transformations that might be surprising
1110 to end users and to get -fno-toplevel-reorder tested. */
1112 && opts
->x_flag_toplevel_reorder
== 2
1113 && !(opts
->x_flag_section_anchors
&& opts_set
->x_flag_section_anchors
))
1115 opts
->x_flag_toplevel_reorder
= 0;
1116 opts
->x_flag_section_anchors
= 0;
1118 if (!opts
->x_flag_toplevel_reorder
)
1120 if (opts
->x_flag_section_anchors
&& opts_set
->x_flag_section_anchors
)
1121 error ("section anchors must be disabled when toplevel reorder"
1123 opts
->x_flag_section_anchors
= 0;
1128 if (opts
->x_flag_pie
)
1129 opts
->x_flag_pic
= opts
->x_flag_pie
;
1130 if (opts
->x_flag_pic
&& !opts
->x_flag_pie
)
1131 opts
->x_flag_shlib
= 1;
1132 first_time_p
= false;
1137 /* Inlining does not work if not optimizing,
1138 so force it not to be done. */
1139 opts
->x_warn_inline
= 0;
1140 opts
->x_flag_no_inline
= 1;
1143 /* The optimization to partition hot and cold basic blocks into separate
1144 sections of the .o and executable files does not work (currently)
1145 with exception handling. This is because there is no support for
1146 generating unwind info. If opts->x_flag_exceptions is turned on
1147 we need to turn off the partitioning optimization. */
1149 ui_except
= targetm
.except_unwind_info ();
1151 if (opts
->x_flag_exceptions
1152 && opts
->x_flag_reorder_blocks_and_partition
1153 && (ui_except
== UI_SJLJ
|| ui_except
== UI_TARGET
))
1155 inform (input_location
,
1156 "-freorder-blocks-and-partition does not work "
1157 "with exceptions on this architecture");
1158 opts
->x_flag_reorder_blocks_and_partition
= 0;
1159 opts
->x_flag_reorder_blocks
= 1;
1162 /* If user requested unwind info, then turn off the partitioning
1165 if (opts
->x_flag_unwind_tables
1166 && !targetm
.unwind_tables_default
1167 && opts
->x_flag_reorder_blocks_and_partition
1168 && (ui_except
== UI_SJLJ
|| ui_except
== UI_TARGET
))
1170 inform (input_location
,
1171 "-freorder-blocks-and-partition does not support "
1172 "unwind info on this architecture");
1173 opts
->x_flag_reorder_blocks_and_partition
= 0;
1174 opts
->x_flag_reorder_blocks
= 1;
1177 /* If the target requested unwind info, then turn off the partitioning
1178 optimization with a different message. Likewise, if the target does not
1179 support named sections. */
1181 if (opts
->x_flag_reorder_blocks_and_partition
1182 && (!targetm
.have_named_sections
1183 || (opts
->x_flag_unwind_tables
1184 && targetm
.unwind_tables_default
1185 && (ui_except
== UI_SJLJ
|| ui_except
== UI_TARGET
))))
1187 inform (input_location
,
1188 "-freorder-blocks-and-partition does not work "
1189 "on this architecture");
1190 opts
->x_flag_reorder_blocks_and_partition
= 0;
1191 opts
->x_flag_reorder_blocks
= 1;
1194 /* Pipelining of outer loops is only possible when general pipelining
1195 capabilities are requested. */
1196 if (!opts
->x_flag_sel_sched_pipelining
)
1197 opts
->x_flag_sel_sched_pipelining_outer_loops
= 0;
1199 if (!targetm
.ira_cover_classes
1200 && opts
->x_flag_ira_algorithm
== IRA_ALGORITHM_CB
)
1202 inform (input_location
,
1203 "-fira-algorithm=CB does not work on this architecture");
1204 opts
->x_flag_ira_algorithm
= IRA_ALGORITHM_PRIORITY
;
1207 if (opts
->x_flag_conserve_stack
)
1209 maybe_set_param_value (PARAM_LARGE_STACK_FRAME
, 100,
1210 opts
->x_param_values
, opts_set
->x_param_values
);
1211 maybe_set_param_value (PARAM_STACK_FRAME_GROWTH
, 40,
1212 opts
->x_param_values
, opts_set
->x_param_values
);
1214 if (opts
->x_flag_wpa
|| opts
->x_flag_ltrans
)
1216 /* These passes are not WHOPR compatible yet. */
1217 opts
->x_flag_ipa_pta
= 0;
1218 opts
->x_flag_ipa_struct_reorg
= 0;
1221 if (opts
->x_flag_lto
)
1224 opts
->x_flag_generate_lto
= 1;
1226 /* When generating IL, do not operate in whole-program mode.
1227 Otherwise, symbols will be privatized too early, causing link
1229 opts
->x_flag_whole_program
= 0;
1231 error ("LTO support has not been enabled in this configuration");
1234 if ((opts
->x_flag_lto_partition_balanced
!= 0) + (opts
->x_flag_lto_partition_1to1
!= 0)
1235 + (opts
->x_flag_lto_partition_none
!= 0) >= 1)
1237 if ((opts
->x_flag_lto_partition_balanced
!= 0)
1238 + (opts
->x_flag_lto_partition_1to1
!= 0)
1239 + (opts
->x_flag_lto_partition_none
!= 0) > 1)
1240 error ("only one -flto-partition value can be specified");
1241 if (!opts
->x_flag_lto
&& !opts
->x_flag_wpa
&& !opts
->x_flag_ltrans
)
1242 error ("-flto-partition has no effect without -flto");
1245 /* We initialize opts->x_flag_split_stack to -1 so that targets can set a
1246 default value if they choose based on other options. */
1247 if (opts
->x_flag_split_stack
== -1)
1248 opts
->x_flag_split_stack
= 0;
1249 else if (opts
->x_flag_split_stack
)
1251 if (!targetm
.supports_split_stack (true))
1253 error ("%<-fsplit-stack%> is not supported by "
1254 "this compiler configuration");
1255 opts
->x_flag_split_stack
= 0;
1260 #define LEFT_COLUMN 27
1262 /* Output ITEM, of length ITEM_WIDTH, in the left column,
1263 followed by word-wrapped HELP in a second column. */
1265 wrap_help (const char *help
,
1267 unsigned int item_width
,
1268 unsigned int columns
)
1270 unsigned int col_width
= LEFT_COLUMN
;
1271 unsigned int remaining
, room
, len
;
1273 remaining
= strlen (help
);
1277 room
= columns
- 3 - MAX (col_width
, item_width
);
1286 for (i
= 0; help
[i
]; i
++)
1288 if (i
>= room
&& len
!= remaining
)
1292 else if ((help
[i
] == '-' || help
[i
] == '/')
1293 && help
[i
+ 1] != ' '
1294 && i
> 0 && ISALPHA (help
[i
- 1]))
1299 printf( " %-*.*s %.*s\n", col_width
, item_width
, item
, len
, help
);
1301 while (help
[len
] == ' ')
1309 /* Print help for a specific front-end, etc. */
1311 print_filtered_help (unsigned int include_flags
,
1312 unsigned int exclude_flags
,
1313 unsigned int any_flags
,
1314 unsigned int columns
)
1318 static char *printed
= NULL
;
1320 bool displayed
= false;
1322 if (include_flags
== CL_PARAMS
)
1324 for (i
= 0; i
< LAST_PARAM
; i
++)
1326 const char *param
= compiler_params
[i
].option
;
1328 help
= compiler_params
[i
].help
;
1329 if (help
== NULL
|| *help
== '\0')
1331 if (exclude_flags
& CL_UNDOCUMENTED
)
1333 help
= undocumented_msg
;
1336 /* Get the translation. */
1339 wrap_help (help
, param
, strlen (param
), columns
);
1346 printed
= XCNEWVAR (char, cl_options_count
);
1348 for (i
= 0; i
< cl_options_count
; i
++)
1350 static char new_help
[128];
1351 const struct cl_option
*option
= cl_options
+ i
;
1356 if (include_flags
== 0
1357 || ((option
->flags
& include_flags
) != include_flags
))
1359 if ((option
->flags
& any_flags
) == 0)
1363 /* Skip unwanted switches. */
1364 if ((option
->flags
& exclude_flags
) != 0)
1367 /* The driver currently prints its own help text. */
1368 if ((option
->flags
& CL_DRIVER
) != 0
1369 && (option
->flags
& (((1U << cl_lang_count
) - 1)
1370 | CL_COMMON
| CL_TARGET
)) == 0)
1374 /* Skip switches that have already been printed. */
1380 help
= option
->help
;
1383 if (exclude_flags
& CL_UNDOCUMENTED
)
1385 help
= undocumented_msg
;
1388 /* Get the translation. */
1391 /* Find the gap between the name of the
1392 option and its descriptive text. */
1393 tab
= strchr (help
, '\t');
1402 opt
= option
->opt_text
;
1406 /* With the -Q option enabled we change the descriptive text associated
1407 with an option to be an indication of its current setting. */
1410 void *flag_var
= option_flag_var (i
, &global_options
);
1412 if (len
< (LEFT_COLUMN
+ 2))
1413 strcpy (new_help
, "\t\t");
1415 strcpy (new_help
, "\t");
1417 if (flag_var
!= NULL
)
1419 if (option
->flags
& CL_JOINED
)
1421 if (option
->var_type
== CLVC_STRING
)
1423 if (* (const char **) flag_var
!= NULL
)
1424 snprintf (new_help
+ strlen (new_help
),
1425 sizeof (new_help
) - strlen (new_help
),
1426 * (const char **) flag_var
);
1429 sprintf (new_help
+ strlen (new_help
),
1430 "%#x", * (int *) flag_var
);
1433 strcat (new_help
, option_enabled (i
, &global_options
)
1434 ? _("[enabled]") : _("[disabled]"));
1440 wrap_help (help
, opt
, len
, columns
);
1446 unsigned int langs
= include_flags
& CL_LANG_ALL
;
1449 printf (_(" No options with the desired characteristics were found\n"));
1454 /* PR 31349: Tell the user how to see all of the
1455 options supported by a specific front end. */
1456 for (i
= 0; (1U << i
) < CL_LANG_ALL
; i
++)
1457 if ((1U << i
) & langs
)
1458 printf (_(" None found. Use --help=%s to show *all* the options supported by the %s front-end\n"),
1459 lang_names
[i
], lang_names
[i
]);
1463 else if (! displayed
)
1464 printf (_(" All options with the desired characteristics have already been displayed\n"));
1469 /* Display help for a specified type of option.
1470 The options must have ALL of the INCLUDE_FLAGS set
1471 ANY of the flags in the ANY_FLAGS set
1472 and NONE of the EXCLUDE_FLAGS set. */
1474 print_specific_help (unsigned int include_flags
,
1475 unsigned int exclude_flags
,
1476 unsigned int any_flags
)
1478 unsigned int all_langs_mask
= (1U << cl_lang_count
) - 1;
1479 const char * description
= NULL
;
1480 const char * descrip_extra
= "";
1483 static unsigned int columns
= 0;
1485 /* Sanity check: Make sure that we do not have more
1486 languages than we have bits available to enumerate them. */
1487 gcc_assert ((1U << cl_lang_count
) < CL_MIN_OPTION_CLASS
);
1489 /* If we have not done so already, obtain
1490 the desired maximum width of the output. */
1495 GET_ENVIRONMENT (p
, "COLUMNS");
1498 int value
= atoi (p
);
1505 /* Use a reasonable default. */
1509 /* Decide upon the title for the options that we are going to display. */
1510 for (i
= 0, flag
= 1; flag
<= CL_MAX_OPTION_CLASS
; flag
<<= 1, i
++)
1512 switch (flag
& include_flags
)
1519 description
= _("The following options are target specific");
1522 description
= _("The following options control compiler warning messages");
1524 case CL_OPTIMIZATION
:
1525 description
= _("The following options control optimizations");
1528 description
= _("The following options are language-independent");
1531 description
= _("The --param option recognizes the following as parameters");
1534 if (i
>= cl_lang_count
)
1536 if (exclude_flags
& all_langs_mask
)
1537 description
= _("The following options are specific to just the language ");
1539 description
= _("The following options are supported by the language ");
1540 descrip_extra
= lang_names
[i
];
1545 if (description
== NULL
)
1549 if (include_flags
& CL_UNDOCUMENTED
)
1550 description
= _("The following options are not documented");
1551 else if (include_flags
& CL_SEPARATE
)
1552 description
= _("The following options take separate arguments");
1553 else if (include_flags
& CL_JOINED
)
1554 description
= _("The following options take joined arguments");
1557 internal_error ("unrecognized include_flags 0x%x passed to print_specific_help",
1564 if (any_flags
& all_langs_mask
)
1565 description
= _("The following options are language-related");
1567 description
= _("The following options are language-independent");
1571 printf ("%s%s:\n", description
, descrip_extra
);
1572 print_filtered_help (include_flags
, exclude_flags
, any_flags
, columns
);
1575 /* Handle target- and language-independent options. Return zero to
1576 generate an "unknown option" message. Only options that need
1577 extra handling need to be listed here; if you simply want
1578 DECODED->value assigned to a variable, it happens automatically. */
1581 common_handle_option (struct gcc_options
*opts
,
1582 struct gcc_options
*opts_set
,
1583 const struct cl_decoded_option
*decoded
,
1584 unsigned int lang_mask
, int kind ATTRIBUTE_UNUSED
,
1585 const struct cl_option_handlers
*handlers
,
1586 diagnostic_context
*dc
)
1588 size_t scode
= decoded
->opt_index
;
1589 const char *arg
= decoded
->arg
;
1590 int value
= decoded
->value
;
1591 enum opt_code code
= (enum opt_code
) scode
;
1593 gcc_assert (opts
== &global_options
);
1594 gcc_assert (opts_set
== &global_options_set
);
1595 gcc_assert (dc
== global_dc
);
1596 gcc_assert (decoded
->canonical_option_num_elements
<= 2);
1601 handle_param (opts
, opts_set
, arg
);
1606 unsigned int all_langs_mask
= (1U << cl_lang_count
) - 1;
1607 unsigned int undoc_mask
;
1610 undoc_mask
= ((opts
->x_verbose_flag
| opts
->x_extra_warnings
)
1613 /* First display any single language specific options. */
1614 for (i
= 0; i
< cl_lang_count
; i
++)
1616 (1U << i
, (all_langs_mask
& (~ (1U << i
))) | undoc_mask
, 0);
1617 /* Next display any multi language specific options. */
1618 print_specific_help (0, undoc_mask
, all_langs_mask
);
1619 /* Then display any remaining, non-language options. */
1620 for (i
= CL_MIN_OPTION_CLASS
; i
<= CL_MAX_OPTION_CLASS
; i
<<= 1)
1622 print_specific_help (i
, undoc_mask
, 0);
1623 exit_after_options
= true;
1627 case OPT__target_help
:
1628 print_specific_help (CL_TARGET
, CL_UNDOCUMENTED
, 0);
1629 exit_after_options
= true;
1631 /* Allow the target a chance to give the user some additional information. */
1638 const char * a
= arg
;
1639 unsigned int include_flags
= 0;
1640 /* Note - by default we include undocumented options when listing
1641 specific classes. If you only want to see documented options
1642 then add ",^undocumented" to the --help= option. E.g.:
1644 --help=target,^undocumented */
1645 unsigned int exclude_flags
= 0;
1647 /* Walk along the argument string, parsing each word in turn.
1649 arg = [^]{word}[,{arg}]
1650 word = {optimizers|target|warnings|undocumented|
1651 params|common|<language>} */
1656 const char * string
;
1661 { "optimizers", CL_OPTIMIZATION
},
1662 { "target", CL_TARGET
},
1663 { "warnings", CL_WARNING
},
1664 { "undocumented", CL_UNDOCUMENTED
},
1665 { "params", CL_PARAMS
},
1666 { "joined", CL_JOINED
},
1667 { "separate", CL_SEPARATE
},
1668 { "common", CL_COMMON
},
1671 unsigned int * pflags
;
1673 unsigned int lang_flag
, specific_flag
;
1680 pflags
= & exclude_flags
;
1683 pflags
= & include_flags
;
1685 comma
= strchr (a
, ',');
1696 /* Check to see if the string matches an option class name. */
1697 for (i
= 0, specific_flag
= 0; specifics
[i
].string
!= NULL
; i
++)
1698 if (strncasecmp (a
, specifics
[i
].string
, len
) == 0)
1700 specific_flag
= specifics
[i
].flag
;
1704 /* Check to see if the string matches a language name.
1705 Note - we rely upon the alpha-sorted nature of the entries in
1706 the lang_names array, specifically that shorter names appear
1707 before their longer variants. (i.e. C before C++). That way
1708 when we are attempting to match --help=c for example we will
1709 match with C first and not C++. */
1710 for (i
= 0, lang_flag
= 0; i
< cl_lang_count
; i
++)
1711 if (strncasecmp (a
, lang_names
[i
], len
) == 0)
1713 lang_flag
= 1U << i
;
1717 if (specific_flag
!= 0)
1720 * pflags
|= specific_flag
;
1723 /* The option's argument matches both the start of a
1724 language name and the start of an option class name.
1725 We have a special case for when the user has
1726 specified "--help=c", but otherwise we have to issue
1728 if (strncasecmp (a
, "c", len
) == 0)
1729 * pflags
|= lang_flag
;
1732 "warning: --help argument %.*s is ambiguous, please be more specific\n",
1736 else if (lang_flag
!= 0)
1737 * pflags
|= lang_flag
;
1740 "warning: unrecognized argument to --help= option: %.*s\n",
1749 print_specific_help (include_flags
, exclude_flags
, 0);
1750 exit_after_options
= true;
1755 exit_after_options
= true;
1761 /* Currently handled in a prescan. */
1765 enable_warning_as_error (arg
, value
, lang_mask
, handlers
, dc
);
1768 case OPT_Wlarger_than_
:
1769 opts
->x_larger_than_size
= value
;
1770 opts
->x_warn_larger_than
= value
!= -1;
1773 case OPT_Wfatal_errors
:
1774 dc
->fatal_errors
= value
;
1777 case OPT_Wframe_larger_than_
:
1778 opts
->x_frame_larger_than_size
= value
;
1779 opts
->x_warn_frame_larger_than
= value
!= -1;
1782 case OPT_Wstrict_aliasing
:
1783 set_Wstrict_aliasing (opts
, value
);
1786 case OPT_Wstrict_overflow
:
1787 opts
->x_warn_strict_overflow
= (value
1788 ? (int) WARN_STRICT_OVERFLOW_CONDITIONAL
1792 case OPT_Wsystem_headers
:
1793 dc
->dc_warn_system_headers
= value
;
1797 opts
->x_flag_gen_aux_info
= 1;
1800 case OPT_auxbase_strip
:
1802 char *tmp
= xstrdup (arg
);
1803 strip_off_ending (tmp
, strlen (tmp
));
1805 opts
->x_aux_base_name
= tmp
;
1810 decode_d_option (arg
);
1813 case OPT_fcall_used_
:
1814 fix_register (arg
, 0, 1);
1817 case OPT_fcall_saved_
:
1818 fix_register (arg
, 0, 0);
1821 case OPT_fcompare_debug_second
:
1822 flag_compare_debug
= value
;
1826 dbg_cnt_process_opt (arg
);
1829 case OPT_fdbg_cnt_list
:
1830 dbg_cnt_list_all_counters ();
1833 case OPT_fdebug_prefix_map_
:
1834 add_debug_prefix_map (arg
);
1837 case OPT_fdiagnostics_show_location_
:
1838 if (!strcmp (arg
, "once"))
1839 diagnostic_prefixing_rule (dc
) = DIAGNOSTICS_SHOW_PREFIX_ONCE
;
1840 else if (!strcmp (arg
, "every-line"))
1841 diagnostic_prefixing_rule (dc
)
1842 = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE
;
1847 case OPT_fdiagnostics_show_option
:
1848 dc
->show_option_requested
= value
;
1852 if (!dump_switch_p (arg
))
1856 case OPT_ffp_contract_
:
1857 if (!strcmp (arg
, "on"))
1858 /* Not implemented, fall back to conservative FP_CONTRACT_OFF. */
1859 opts
->x_flag_fp_contract_mode
= FP_CONTRACT_OFF
;
1860 else if (!strcmp (arg
, "off"))
1861 opts
->x_flag_fp_contract_mode
= FP_CONTRACT_OFF
;
1862 else if (!strcmp (arg
, "fast"))
1863 opts
->x_flag_fp_contract_mode
= FP_CONTRACT_FAST
;
1865 error ("unknown floating point contraction style \"%s\"", arg
);
1868 case OPT_fexcess_precision_
:
1869 if (!strcmp (arg
, "fast"))
1870 opts
->x_flag_excess_precision_cmdline
= EXCESS_PRECISION_FAST
;
1871 else if (!strcmp (arg
, "standard"))
1872 opts
->x_flag_excess_precision_cmdline
= EXCESS_PRECISION_STANDARD
;
1874 error ("unknown excess precision style \"%s\"", arg
);
1877 case OPT_ffast_math
:
1878 set_fast_math_flags (opts
, value
);
1881 case OPT_funsafe_math_optimizations
:
1882 set_unsafe_math_optimizations_flags (opts
, value
);
1886 fix_register (arg
, 1, 1);
1889 case OPT_finline_limit_
:
1890 set_param_value ("max-inline-insns-single", value
/ 2,
1891 opts
->x_param_values
, opts_set
->x_param_values
);
1892 set_param_value ("max-inline-insns-auto", value
/ 2,
1893 opts
->x_param_values
, opts_set
->x_param_values
);
1896 case OPT_finstrument_functions_exclude_function_list_
:
1897 add_comma_separated_to_vector
1898 (&flag_instrument_functions_exclude_functions
, arg
);
1901 case OPT_finstrument_functions_exclude_file_list_
:
1902 add_comma_separated_to_vector
1903 (&flag_instrument_functions_exclude_files
, arg
);
1906 case OPT_fmessage_length_
:
1907 pp_set_line_maximum_length (dc
->printer
, value
);
1910 case OPT_fpack_struct_
:
1911 if (value
<= 0 || (value
& (value
- 1)) || value
> 16)
1912 error ("structure alignment must be a small power of two, not %d", value
);
1915 initial_max_fld_align
= value
;
1916 maximum_field_alignment
= value
* BITS_PER_UNIT
;
1921 #ifdef ENABLE_PLUGIN
1922 add_new_plugin (arg
);
1924 error ("plugin support is disabled; configure with --enable-plugin");
1928 case OPT_fplugin_arg_
:
1929 #ifdef ENABLE_PLUGIN
1930 parse_plugin_arg_opt (arg
);
1932 error ("plugin support is disabled; configure with --enable-plugin");
1936 case OPT_fprofile_dir_
:
1937 profile_data_prefix
= xstrdup (arg
);
1940 case OPT_fprofile_use_
:
1941 profile_data_prefix
= xstrdup (arg
);
1942 opts
->x_flag_profile_use
= true;
1944 /* No break here - do -fprofile-use processing. */
1945 case OPT_fprofile_use
:
1946 if (!opts_set
->x_flag_branch_probabilities
)
1947 opts
->x_flag_branch_probabilities
= value
;
1948 if (!opts_set
->x_flag_profile_values
)
1949 opts
->x_flag_profile_values
= value
;
1950 if (!opts_set
->x_flag_unroll_loops
)
1951 opts
->x_flag_unroll_loops
= value
;
1952 if (!opts_set
->x_flag_peel_loops
)
1953 opts
->x_flag_peel_loops
= value
;
1954 if (!opts_set
->x_flag_tracer
)
1955 opts
->x_flag_tracer
= value
;
1956 if (!opts_set
->x_flag_value_profile_transformations
)
1957 opts
->x_flag_value_profile_transformations
= value
;
1958 if (!opts_set
->x_flag_inline_functions
)
1959 opts
->x_flag_inline_functions
= value
;
1960 if (!opts_set
->x_flag_ipa_cp
)
1961 opts
->x_flag_ipa_cp
= value
;
1962 if (!opts_set
->x_flag_ipa_cp_clone
1963 && value
&& opts
->x_flag_ipa_cp
)
1964 opts
->x_flag_ipa_cp_clone
= value
;
1965 if (!opts_set
->x_flag_predictive_commoning
)
1966 opts
->x_flag_predictive_commoning
= value
;
1967 if (!opts_set
->x_flag_unswitch_loops
)
1968 opts
->x_flag_unswitch_loops
= value
;
1969 if (!opts_set
->x_flag_gcse_after_reload
)
1970 opts
->x_flag_gcse_after_reload
= value
;
1973 case OPT_fprofile_generate_
:
1974 profile_data_prefix
= xstrdup (arg
);
1976 /* No break here - do -fprofile-generate processing. */
1977 case OPT_fprofile_generate
:
1978 if (!opts_set
->x_profile_arc_flag
)
1979 opts
->x_profile_arc_flag
= value
;
1980 if (!opts_set
->x_flag_profile_values
)
1981 opts
->x_flag_profile_values
= value
;
1982 if (!opts_set
->x_flag_value_profile_transformations
)
1983 opts
->x_flag_value_profile_transformations
= value
;
1984 if (!opts_set
->x_flag_inline_functions
)
1985 opts
->x_flag_inline_functions
= value
;
1988 case OPT_fshow_column
:
1989 dc
->show_column
= value
;
1992 case OPT_fvisibility_
:
1994 if (!strcmp(arg
, "default"))
1995 opts
->x_default_visibility
= VISIBILITY_DEFAULT
;
1996 else if (!strcmp(arg
, "internal"))
1997 opts
->x_default_visibility
= VISIBILITY_INTERNAL
;
1998 else if (!strcmp(arg
, "hidden"))
1999 opts
->x_default_visibility
= VISIBILITY_HIDDEN
;
2000 else if (!strcmp(arg
, "protected"))
2001 opts
->x_default_visibility
= VISIBILITY_PROTECTED
;
2003 error ("unrecognized visibility value \"%s\"", arg
);
2007 case OPT_frandom_seed
:
2008 /* The real switch is -fno-random-seed. */
2011 set_random_seed (NULL
);
2014 case OPT_frandom_seed_
:
2015 set_random_seed (arg
);
2018 case OPT_fsched_verbose_
:
2019 #ifdef INSN_SCHEDULING
2020 fix_sched_param ("verbose", arg
);
2026 case OPT_fsched_stalled_insns_
:
2027 opts
->x_flag_sched_stalled_insns
= value
;
2028 if (opts
->x_flag_sched_stalled_insns
== 0)
2029 opts
->x_flag_sched_stalled_insns
= -1;
2032 case OPT_fsched_stalled_insns_dep_
:
2033 opts
->x_flag_sched_stalled_insns_dep
= value
;
2036 case OPT_fstack_check_
:
2037 if (!strcmp (arg
, "no"))
2038 flag_stack_check
= NO_STACK_CHECK
;
2039 else if (!strcmp (arg
, "generic"))
2040 /* This is the old stack checking method. */
2041 flag_stack_check
= STACK_CHECK_BUILTIN
2042 ? FULL_BUILTIN_STACK_CHECK
2043 : GENERIC_STACK_CHECK
;
2044 else if (!strcmp (arg
, "specific"))
2045 /* This is the new stack checking method. */
2046 flag_stack_check
= STACK_CHECK_BUILTIN
2047 ? FULL_BUILTIN_STACK_CHECK
2048 : STACK_CHECK_STATIC_BUILTIN
2049 ? STATIC_BUILTIN_STACK_CHECK
2050 : GENERIC_STACK_CHECK
;
2052 warning (0, "unknown stack check parameter \"%s\"", arg
);
2055 case OPT_fstack_limit
:
2056 /* The real switch is -fno-stack-limit. */
2059 stack_limit_rtx
= NULL_RTX
;
2062 case OPT_fstack_limit_register_
:
2064 int reg
= decode_reg_name (arg
);
2066 error ("unrecognized register name \"%s\"", arg
);
2068 stack_limit_rtx
= gen_rtx_REG (Pmode
, reg
);
2072 case OPT_fstack_limit_symbol_
:
2073 stack_limit_rtx
= gen_rtx_SYMBOL_REF (Pmode
, ggc_strdup (arg
));
2076 case OPT_ftree_vectorizer_verbose_
:
2077 vect_set_verbosity_level (arg
);
2080 case OPT_ftls_model_
:
2081 if (!strcmp (arg
, "global-dynamic"))
2082 opts
->x_flag_tls_default
= TLS_MODEL_GLOBAL_DYNAMIC
;
2083 else if (!strcmp (arg
, "local-dynamic"))
2084 opts
->x_flag_tls_default
= TLS_MODEL_LOCAL_DYNAMIC
;
2085 else if (!strcmp (arg
, "initial-exec"))
2086 opts
->x_flag_tls_default
= TLS_MODEL_INITIAL_EXEC
;
2087 else if (!strcmp (arg
, "local-exec"))
2088 opts
->x_flag_tls_default
= TLS_MODEL_LOCAL_EXEC
;
2090 warning (0, "unknown tls-model \"%s\"", arg
);
2093 case OPT_fira_algorithm_
:
2094 if (!strcmp (arg
, "CB"))
2095 opts
->x_flag_ira_algorithm
= IRA_ALGORITHM_CB
;
2096 else if (!strcmp (arg
, "priority"))
2097 opts
->x_flag_ira_algorithm
= IRA_ALGORITHM_PRIORITY
;
2099 warning (0, "unknown ira algorithm \"%s\"", arg
);
2102 case OPT_fira_region_
:
2103 if (!strcmp (arg
, "one"))
2104 opts
->x_flag_ira_region
= IRA_REGION_ONE
;
2105 else if (!strcmp (arg
, "all"))
2106 opts
->x_flag_ira_region
= IRA_REGION_ALL
;
2107 else if (!strcmp (arg
, "mixed"))
2108 opts
->x_flag_ira_region
= IRA_REGION_MIXED
;
2110 warning (0, "unknown ira region \"%s\"", arg
);
2114 set_debug_level (NO_DEBUG
, DEFAULT_GDB_EXTENSIONS
, arg
);
2118 set_debug_level (SDB_DEBUG
, false, arg
);
2122 if (value
< 2 || value
> 4)
2123 error ("dwarf version %d is not supported", value
);
2125 dwarf_version
= value
;
2126 set_debug_level (DWARF2_DEBUG
, false, "");
2130 set_debug_level (NO_DEBUG
, 2, arg
);
2135 set_debug_level (DBX_DEBUG
, code
== OPT_gstabs_
, arg
);
2139 set_debug_level (VMS_DEBUG
, false, arg
);
2144 set_debug_level (XCOFF_DEBUG
, code
== OPT_gxcoff_
, arg
);
2147 case OPT_pedantic_errors
:
2148 opts
->x_pedantic
= 1;
2149 dc
->pedantic_errors
= 1;
2153 opts
->x_flag_lto
= "";
2157 dc
->dc_inhibit_warnings
= true;
2160 case OPT_fuse_linker_plugin
:
2161 /* No-op. Used by the driver and passed to us because it starts with f.*/
2165 /* If the flag was handled in a standard way, assume the lack of
2166 processing here is intentional. */
2167 gcc_assert (option_flag_var (scode
, opts
));
2174 /* Handle --param NAME=VALUE. */
2176 handle_param (struct gcc_options
*opts
, struct gcc_options
*opts_set
,
2182 arg
= xstrdup (carg
);
2183 equal
= strchr (arg
, '=');
2185 error ("%s: --param arguments should be of the form NAME=VALUE", arg
);
2188 value
= integral_argument (equal
+ 1);
2190 error ("invalid --param value %qs", equal
+ 1);
2194 set_param_value (arg
, value
,
2195 opts
->x_param_values
, opts_set
->x_param_values
);
2202 /* Used to set the level of strict aliasing warnings in OPTS,
2203 when no level is specified (i.e., when -Wstrict-aliasing, and not
2204 -Wstrict-aliasing=level was given).
2205 ONOFF is assumed to take value 1 when -Wstrict-aliasing is specified,
2206 and 0 otherwise. After calling this function, wstrict_aliasing will be
2207 set to the default value of -Wstrict_aliasing=level, currently 3. */
2209 set_Wstrict_aliasing (struct gcc_options
*opts
, int onoff
)
2211 gcc_assert (onoff
== 0 || onoff
== 1);
2213 opts
->x_warn_strict_aliasing
= 3;
2215 opts
->x_warn_strict_aliasing
= 0;
2218 /* The following routines are useful in setting all the flags that
2219 -ffast-math and -fno-fast-math imply. */
2221 set_fast_math_flags (struct gcc_options
*opts
, int set
)
2223 opts
->x_flag_unsafe_math_optimizations
= set
;
2224 set_unsafe_math_optimizations_flags (opts
, set
);
2225 opts
->x_flag_finite_math_only
= set
;
2226 opts
->x_flag_errno_math
= !set
;
2229 opts
->x_flag_signaling_nans
= 0;
2230 opts
->x_flag_rounding_math
= 0;
2231 opts
->x_flag_cx_limited_range
= 1;
2235 /* When -funsafe-math-optimizations is set the following
2236 flags are set as well. */
2238 set_unsafe_math_optimizations_flags (struct gcc_options
*opts
, int set
)
2240 opts
->x_flag_trapping_math
= !set
;
2241 opts
->x_flag_signed_zeros
= !set
;
2242 opts
->x_flag_associative_math
= set
;
2243 opts
->x_flag_reciprocal_math
= set
;
2246 /* Return true iff flags are set as if -ffast-math. */
2248 fast_math_flags_set_p (void)
2250 return (!flag_trapping_math
2251 && flag_unsafe_math_optimizations
2252 && flag_finite_math_only
2253 && !flag_signed_zeros
2254 && !flag_errno_math
);
2257 /* Return true iff flags are set as if -ffast-math but using the flags stored
2258 in the struct cl_optimization structure. */
2260 fast_math_flags_struct_set_p (struct cl_optimization
*opt
)
2262 return (!opt
->x_flag_trapping_math
2263 && opt
->x_flag_unsafe_math_optimizations
2264 && opt
->x_flag_finite_math_only
2265 && !opt
->x_flag_signed_zeros
2266 && !opt
->x_flag_errno_math
);
2269 /* Handle a debug output -g switch. EXTENDED is true or false to support
2270 extended output (2 is special and means "-ggdb" was given). */
2272 set_debug_level (enum debug_info_type type
, int extended
, const char *arg
)
2274 static bool type_explicit
;
2276 use_gnu_debug_info_extensions
= extended
;
2278 if (type
== NO_DEBUG
)
2280 if (write_symbols
== NO_DEBUG
)
2282 write_symbols
= PREFERRED_DEBUGGING_TYPE
;
2286 #ifdef DWARF2_DEBUGGING_INFO
2287 write_symbols
= DWARF2_DEBUG
;
2288 #elif defined DBX_DEBUGGING_INFO
2289 write_symbols
= DBX_DEBUG
;
2293 if (write_symbols
== NO_DEBUG
)
2294 warning (0, "target system does not support debug output");
2299 /* Does it conflict with an already selected type? */
2300 if (type_explicit
&& write_symbols
!= NO_DEBUG
&& type
!= write_symbols
)
2301 error ("debug format \"%s\" conflicts with prior selection",
2302 debug_type_names
[type
]);
2303 write_symbols
= type
;
2304 type_explicit
= true;
2307 /* A debug flag without a level defaults to level 2. */
2310 if (!debug_info_level
)
2311 debug_info_level
= DINFO_LEVEL_NORMAL
;
2315 int argval
= integral_argument (arg
);
2317 error ("unrecognised debug output level \"%s\"", arg
);
2318 else if (argval
> 3)
2319 error ("debug output level %s is too high", arg
);
2321 debug_info_level
= (enum debug_info_level
) argval
;
2325 /* Return 1 if option OPT_IDX is enabled in OPTS, 0 if it is disabled,
2326 or -1 if it isn't a simple on-off switch. */
2329 option_enabled (int opt_idx
, void *opts
)
2331 const struct cl_option
*option
= &(cl_options
[opt_idx
]);
2332 struct gcc_options
*optsg
= (struct gcc_options
*) opts
;
2333 void *flag_var
= option_flag_var (opt_idx
, optsg
);
2336 switch (option
->var_type
)
2339 return *(int *) flag_var
!= 0;
2342 return *(int *) flag_var
== option
->var_value
;
2344 case CLVC_BIT_CLEAR
:
2345 return (*(int *) flag_var
& option
->var_value
) == 0;
2348 return (*(int *) flag_var
& option
->var_value
) != 0;
2356 /* Fill STATE with the current state of option OPTION in OPTS. Return
2357 true if there is some state to store. */
2360 get_option_state (struct gcc_options
*opts
, int option
,
2361 struct cl_option_state
*state
)
2363 void *flag_var
= option_flag_var (option
, opts
);
2368 switch (cl_options
[option
].var_type
)
2372 state
->data
= flag_var
;
2373 state
->size
= sizeof (int);
2376 case CLVC_BIT_CLEAR
:
2378 state
->ch
= option_enabled (option
, opts
);
2379 state
->data
= &state
->ch
;
2384 state
->data
= *(const char **) flag_var
;
2385 if (state
->data
== 0)
2387 state
->size
= strlen ((const char *) state
->data
) + 1;
2393 /* Enable (or disable if VALUE is 0) a warning option ARG (language
2394 mask LANG_MASK, option handlers HANDLERS) as an error for
2395 diagnostic context DC (possibly NULL). This is used by
2399 enable_warning_as_error (const char *arg
, int value
, unsigned int lang_mask
,
2400 const struct cl_option_handlers
*handlers
,
2401 diagnostic_context
*dc
)
2406 new_option
= XNEWVEC (char, strlen (arg
) + 2);
2407 new_option
[0] = 'W';
2408 strcpy (new_option
+ 1, arg
);
2409 option_index
= find_opt (new_option
, lang_mask
);
2410 if (option_index
== OPT_SPECIAL_unknown
)
2412 error ("-Werror=%s: No option -%s", arg
, new_option
);
2416 const struct cl_option
*option
= &cl_options
[option_index
];
2417 const diagnostic_t kind
= value
? DK_ERROR
: DK_WARNING
;
2419 if (option
->alias_target
!= N_OPTS
)
2420 option_index
= option
->alias_target
;
2421 if (option_index
== OPT_SPECIAL_ignore
)
2424 diagnostic_classify_diagnostic (dc
, option_index
, kind
,
2426 if (kind
== DK_ERROR
)
2428 const struct cl_option
* const option
= cl_options
+ option_index
;
2430 /* -Werror=foo implies -Wfoo. */
2431 if (option
->var_type
== CLVC_BOOLEAN
)
2432 handle_generated_option (&global_options
, &global_options_set
,
2433 option_index
, NULL
, value
, lang_mask
,
2434 (int)kind
, handlers
,
2441 /* Return malloced memory for the name of the option OPTION_INDEX
2442 which enabled a diagnostic (context CONTEXT), originally of type
2443 ORIG_DIAG_KIND but possibly converted to DIAG_KIND by options such
2447 option_name (diagnostic_context
*context
, int option_index
,
2448 diagnostic_t orig_diag_kind
, diagnostic_t diag_kind
)
2452 /* A warning classified as an error. */
2453 if ((orig_diag_kind
== DK_WARNING
|| orig_diag_kind
== DK_PEDWARN
)
2454 && diag_kind
== DK_ERROR
)
2455 return concat (cl_options
[OPT_Werror_
].opt_text
,
2456 /* Skip over "-W". */
2457 cl_options
[option_index
].opt_text
+ 2,
2459 /* A warning with option. */
2461 return xstrdup (cl_options
[option_index
].opt_text
);
2463 /* A warning without option classified as an error. */
2464 else if (orig_diag_kind
== DK_WARNING
|| orig_diag_kind
== DK_PEDWARN
2465 || diag_kind
== DK_WARNING
)
2467 if (context
->warning_as_error_requested
)
2468 return xstrdup (cl_options
[OPT_Werror
].opt_text
);
2470 return xstrdup (_("enabled by default"));