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 "tm_p.h" /* For OPTIMIZATION_OPTIONS. */
41 #include "insn-attr.h" /* For INSN_SCHEDULING. */
43 #include "tree-pass.h"
48 #include "lto-streamer.h"
50 /* Value of the -G xx switch, and whether it was passed or not. */
51 unsigned HOST_WIDE_INT g_switch_value
;
54 /* Same for selective scheduling. */
55 bool sel_sched_switch_set
;
57 /* True if we should exit after parsing options. */
58 bool exit_after_options
;
60 /* True to warn about any objects definitions whose size is larger
61 than N bytes. Also want about function definitions whose returned
62 values are larger than N bytes, where N is `larger_than_size'. */
63 bool warn_larger_than
;
64 HOST_WIDE_INT larger_than_size
;
66 /* True to warn about any function whose frame size is larger
68 bool warn_frame_larger_than
;
69 HOST_WIDE_INT frame_larger_than_size
;
71 /* Type(s) of debugging information we are producing (if any). See
72 flags.h for the definitions of the different possible types of
73 debugging information. */
74 enum debug_info_type write_symbols
= NO_DEBUG
;
76 /* Level of debugging information we are producing. See flags.h for
77 the definitions of the different possible levels. */
78 enum debug_info_level debug_info_level
= DINFO_LEVEL_NONE
;
80 /* A major contribution to object and executable size is debug
81 information size. A major contribution to debug information size
82 is struct descriptions replicated in several object files. The
83 following flags attempt to reduce this information. The basic
84 idea is to not emit struct debugging information in the current
85 compilation unit when that information will be generated by
86 another compilation unit.
88 Debug information for a struct defined in the current source
89 file should be generated in the object file. Likewise the
90 debug information for a struct defined in a header should be
91 generated in the object file of the corresponding source file.
92 Both of these case are handled when the base name of the file of
93 the struct definition matches the base name of the source file
94 of the current compilation unit. This matching emits minimal
95 struct debugging information.
97 The base file name matching rule above will fail to emit debug
98 information for structs defined in system headers. So a second
99 category of files includes system headers in addition to files
102 The remaining types of files are library headers and application
103 headers. We cannot currently distinguish these two types. */
105 enum debug_struct_file
107 DINFO_STRUCT_FILE_NONE
, /* Debug no structs. */
108 DINFO_STRUCT_FILE_BASE
, /* Debug structs defined in files with the
109 same base name as the compilation unit. */
110 DINFO_STRUCT_FILE_SYS
, /* Also debug structs defined in system
112 DINFO_STRUCT_FILE_ANY
/* Debug structs defined in all files. */
115 /* Generic structs (e.g. templates not explicitly specialized)
116 may not have a compilation unit associated with them, and so
117 may need to be treated differently from ordinary structs.
119 Structs only handled by reference (indirectly), will also usually
120 not need as much debugging information. */
122 static enum debug_struct_file debug_struct_ordinary
[DINFO_USAGE_NUM_ENUMS
]
123 = { DINFO_STRUCT_FILE_ANY
, DINFO_STRUCT_FILE_ANY
, DINFO_STRUCT_FILE_ANY
};
124 static enum debug_struct_file debug_struct_generic
[DINFO_USAGE_NUM_ENUMS
]
125 = { DINFO_STRUCT_FILE_ANY
, DINFO_STRUCT_FILE_ANY
, DINFO_STRUCT_FILE_ANY
};
127 /* Parse the -femit-struct-debug-detailed option value
128 and set the flag variables. */
130 #define MATCH( prefix, string ) \
131 ((strncmp (prefix, string, sizeof prefix - 1) == 0) \
132 ? ((string += sizeof prefix - 1), 1) : 0)
135 set_struct_debug_option (const char *spec
)
137 /* various labels for comparison */
138 static char dfn_lbl
[] = "dfn:", dir_lbl
[] = "dir:", ind_lbl
[] = "ind:";
139 static char ord_lbl
[] = "ord:", gen_lbl
[] = "gen:";
140 static char none_lbl
[] = "none", any_lbl
[] = "any";
141 static char base_lbl
[] = "base", sys_lbl
[] = "sys";
143 enum debug_struct_file files
= DINFO_STRUCT_FILE_ANY
;
144 /* Default is to apply to as much as possible. */
145 enum debug_info_usage usage
= DINFO_USAGE_NUM_ENUMS
;
146 int ord
= 1, gen
= 1;
149 if (MATCH (dfn_lbl
, spec
))
150 usage
= DINFO_USAGE_DFN
;
151 else if (MATCH (dir_lbl
, spec
))
152 usage
= DINFO_USAGE_DIR_USE
;
153 else if (MATCH (ind_lbl
, spec
))
154 usage
= DINFO_USAGE_IND_USE
;
156 /* Generics or not? */
157 if (MATCH (ord_lbl
, spec
))
159 else if (MATCH (gen_lbl
, spec
))
162 /* What allowable environment? */
163 if (MATCH (none_lbl
, spec
))
164 files
= DINFO_STRUCT_FILE_NONE
;
165 else if (MATCH (any_lbl
, spec
))
166 files
= DINFO_STRUCT_FILE_ANY
;
167 else if (MATCH (sys_lbl
, spec
))
168 files
= DINFO_STRUCT_FILE_SYS
;
169 else if (MATCH (base_lbl
, spec
))
170 files
= DINFO_STRUCT_FILE_BASE
;
172 error ("argument %qs to %<-femit-struct-debug-detailed%> not recognized",
175 /* Effect the specification. */
176 if (usage
== DINFO_USAGE_NUM_ENUMS
)
180 debug_struct_ordinary
[DINFO_USAGE_DFN
] = files
;
181 debug_struct_ordinary
[DINFO_USAGE_DIR_USE
] = files
;
182 debug_struct_ordinary
[DINFO_USAGE_IND_USE
] = files
;
186 debug_struct_generic
[DINFO_USAGE_DFN
] = files
;
187 debug_struct_generic
[DINFO_USAGE_DIR_USE
] = files
;
188 debug_struct_generic
[DINFO_USAGE_IND_USE
] = files
;
194 debug_struct_ordinary
[usage
] = files
;
196 debug_struct_generic
[usage
] = files
;
200 set_struct_debug_option (spec
+1);
203 /* No more -femit-struct-debug-detailed specifications.
206 error ("argument %qs to %<-femit-struct-debug-detailed%> unknown",
208 if (debug_struct_ordinary
[DINFO_USAGE_DIR_USE
]
209 < debug_struct_ordinary
[DINFO_USAGE_IND_USE
]
210 || debug_struct_generic
[DINFO_USAGE_DIR_USE
]
211 < debug_struct_generic
[DINFO_USAGE_IND_USE
])
212 error ("%<-femit-struct-debug-detailed=dir:...%> must allow at least"
213 " as much as %<-femit-struct-debug-detailed=ind:...%>");
217 /* Find the base name of a path, stripping off both directories and
218 a single final extension. */
220 base_of_path (const char *path
, const char **base_out
)
222 const char *base
= path
;
224 const char *p
= path
;
228 if (IS_DIR_SEPARATOR(c
))
243 /* Match the base name of a file to the base name of a compilation unit. */
245 static const char *main_input_basename
;
246 static int main_input_baselength
;
249 matches_main_base (const char *path
)
251 /* Cache the last query. */
252 static const char *last_path
= NULL
;
253 static int last_match
= 0;
254 if (path
!= last_path
)
257 int length
= base_of_path (path
, &base
);
259 last_match
= (length
== main_input_baselength
260 && memcmp (base
, main_input_basename
, length
) == 0);
265 #ifdef DEBUG_DEBUG_STRUCT
268 dump_struct_debug (tree type
, enum debug_info_usage usage
,
269 enum debug_struct_file criterion
, int generic
,
270 int matches
, int result
)
272 /* Find the type name. */
273 tree type_decl
= TYPE_STUB_DECL (type
);
275 const char *name
= 0;
276 if (TREE_CODE (t
) == TYPE_DECL
)
279 name
= IDENTIFIER_POINTER (t
);
281 fprintf (stderr
, " struct %d %s %s %s %s %d %p %s\n",
283 DECL_IN_SYSTEM_HEADER (type_decl
) ? "sys" : "usr",
284 matches
? "bas" : "hdr",
285 generic
? "gen" : "ord",
286 usage
== DINFO_USAGE_DFN
? ";" :
287 usage
== DINFO_USAGE_DIR_USE
? "." : "*",
289 (void*) type_decl
, name
);
292 #define DUMP_GSTRUCT(type, usage, criterion, generic, matches, result) \
293 dump_struct_debug (type, usage, criterion, generic, matches, result)
297 #define DUMP_GSTRUCT(type, usage, criterion, generic, matches, result) \
304 should_emit_struct_debug (tree type
, enum debug_info_usage usage
)
306 enum debug_struct_file criterion
;
308 bool generic
= lang_hooks
.types
.generic_p (type
);
311 criterion
= debug_struct_generic
[usage
];
313 criterion
= debug_struct_ordinary
[usage
];
315 if (criterion
== DINFO_STRUCT_FILE_NONE
)
316 return DUMP_GSTRUCT (type
, usage
, criterion
, generic
, false, false);
317 if (criterion
== DINFO_STRUCT_FILE_ANY
)
318 return DUMP_GSTRUCT (type
, usage
, criterion
, generic
, false, true);
320 type_decl
= TYPE_STUB_DECL (type
);
322 if (criterion
== DINFO_STRUCT_FILE_SYS
&& DECL_IN_SYSTEM_HEADER (type_decl
))
323 return DUMP_GSTRUCT (type
, usage
, criterion
, generic
, false, true);
325 if (matches_main_base (DECL_SOURCE_FILE (type_decl
)))
326 return DUMP_GSTRUCT (type
, usage
, criterion
, generic
, true, true);
327 return DUMP_GSTRUCT (type
, usage
, criterion
, generic
, false, false);
330 /* Nonzero means use GNU-only extensions in the generated symbolic
331 debugging information. Currently, this only has an effect when
332 write_symbols is set to DBX_DEBUG, XCOFF_DEBUG, or DWARF_DEBUG. */
333 bool use_gnu_debug_info_extensions
;
335 /* The default visibility for all symbols (unless overridden) */
336 enum symbol_visibility default_visibility
= VISIBILITY_DEFAULT
;
338 /* Global visibility options. */
339 struct visibility_flags visibility_options
;
341 /* What to print when a switch has no documentation. */
342 static const char undocumented_msg
[] = N_("This switch lacks documentation");
344 /* Used for bookkeeping on whether user set these flags so
345 -fprofile-use/-fprofile-generate does not use them. */
346 static bool profile_arc_flag_set
, flag_profile_values_set
;
347 static bool flag_unroll_loops_set
, flag_tracer_set
;
348 static bool flag_value_profile_transformations_set
;
349 static bool flag_peel_loops_set
, flag_branch_probabilities_set
;
350 static bool flag_inline_functions_set
, flag_ipa_cp_set
, flag_ipa_cp_clone_set
;
351 static bool flag_predictive_commoning_set
, flag_unswitch_loops_set
, flag_gcse_after_reload_set
;
353 /* Functions excluded from profiling. */
355 typedef char *char_p
; /* For DEF_VEC_P. */
357 DEF_VEC_ALLOC_P(char_p
,heap
);
359 static VEC(char_p
,heap
) *flag_instrument_functions_exclude_functions
;
360 static VEC(char_p
,heap
) *flag_instrument_functions_exclude_files
;
362 typedef const char *const_char_p
; /* For DEF_VEC_P. */
363 DEF_VEC_P(const_char_p
);
364 DEF_VEC_ALLOC_P(const_char_p
,heap
);
366 static VEC(const_char_p
,heap
) *ignored_options
;
368 /* Language specific warning pass for unused results. */
369 bool flag_warn_unused_result
= false;
371 /* Input file names. */
372 const char **in_fnames
;
373 unsigned num_in_fnames
;
375 static int common_handle_option (size_t scode
, const char *arg
, int value
,
376 unsigned int lang_mask
, int kind
);
377 static void handle_param (const char *);
378 static char *write_langs (unsigned int lang_mask
);
379 static void complain_wrong_lang (const char *, const struct cl_option
*,
380 unsigned int lang_mask
);
381 static void set_debug_level (enum debug_info_type type
, int extended
,
384 /* If ARG is a non-negative integer made up solely of digits, return its
385 value, otherwise return -1. */
387 integral_argument (const char *arg
)
391 while (*p
&& ISDIGIT (*p
))
400 /* Return a malloced slash-separated list of languages in MASK. */
402 write_langs (unsigned int mask
)
404 unsigned int n
= 0, len
= 0;
405 const char *lang_name
;
408 for (n
= 0; (lang_name
= lang_names
[n
]) != 0; n
++)
409 if (mask
& (1U << n
))
410 len
+= strlen (lang_name
) + 1;
412 result
= XNEWVEC (char, len
);
414 for (n
= 0; (lang_name
= lang_names
[n
]) != 0; n
++)
415 if (mask
& (1U << n
))
419 strcpy (result
+ len
, lang_name
);
420 len
+= strlen (lang_name
);
428 /* Complain that switch OPT_INDEX does not apply to this front end. */
430 complain_wrong_lang (const char *text
, const struct cl_option
*option
,
431 unsigned int lang_mask
)
433 char *ok_langs
, *bad_lang
;
435 /* The LTO front end inherits all the options from the first front
436 end that was used. However, not all the original front end
437 options make sense in LTO.
439 A real solution would be to filter this in collect2, but collect2
440 does not have access to all the option attributes to know what to
441 filter. So, in lto1 we silently accept inherited flags and do
443 if (lang_mask
& CL_LTO
)
446 ok_langs
= write_langs (option
->flags
);
447 bad_lang
= write_langs (lang_mask
);
449 /* Eventually this should become a hard error IMO. */
450 warning (0, "command line option \"%s\" is valid for %s but not for %s",
451 text
, ok_langs
, bad_lang
);
457 /* Buffer the unknown option described by the string OPT. Currently,
458 we only complain about unknown -Wno-* options if they may have
459 prevented a diagnostic. Otherwise, we just ignore them.
460 Note that if we do complain, it is only as a warning, not an error;
461 passing the compiler an unrecognised -Wno-* option should never
462 change whether the compilation succeeds or fails. */
464 static void postpone_unknown_option_warning(const char *opt
)
466 VEC_safe_push (const_char_p
, heap
, ignored_options
, opt
);
469 /* Produce a warning for each option previously buffered. */
471 void print_ignored_options (void)
473 location_t saved_loc
= input_location
;
477 while (!VEC_empty (const_char_p
, ignored_options
))
480 opt
= VEC_pop (const_char_p
, ignored_options
);
481 warning (0, "unrecognized command line option \"%s\"", opt
);
484 input_location
= saved_loc
;
488 /* Handle option OPT_INDEX, and argument ARG, for the language
489 indicated by LANG_MASK. VALUE is true, unless no- form of an -f or
490 -W option was given. KIND is the diagnostic_t if this is a
491 diagnostics option, DK_UNSPECIFIED otherwise. Returns false if the
492 switch was invalid. */
494 handle_option (int opt_index
, int value
, const char *arg
,
495 unsigned int lang_mask
, int kind
)
497 const struct cl_option
*option
= &cl_options
[opt_index
];
499 if (option
->flag_var
)
500 set_option (opt_index
, value
, arg
, kind
);
502 if (option
->flags
& lang_mask
)
504 if (lang_hooks
.handle_option (opt_index
, arg
, value
, kind
) == 0)
508 lto_register_user_option (opt_index
, arg
, value
, lang_mask
);
512 if (option
->flags
& CL_COMMON
)
514 if (common_handle_option (opt_index
, arg
, value
, lang_mask
, kind
) == 0)
518 lto_register_user_option (opt_index
, arg
, value
, CL_COMMON
);
522 if (option
->flags
& CL_TARGET
)
524 if (!targetm
.handle_option (opt_index
, arg
, value
))
528 lto_register_user_option (opt_index
, arg
, value
, CL_TARGET
);
534 /* Handle the switch beginning at ARGV for the language indicated by
535 LANG_MASK. Returns the number of switches consumed. */
537 read_cmdline_option (const char **argv
, unsigned int lang_mask
)
540 const char *opt
, *arg
= 0;
543 unsigned int result
= 0;
544 const struct cl_option
*option
;
548 opt_index
= find_opt (opt
+ 1, lang_mask
| CL_COMMON
| CL_TARGET
);
549 if (opt_index
== cl_options_count
550 && (opt
[1] == 'W' || opt
[1] == 'f' || opt
[1] == 'm')
551 && opt
[2] == 'n' && opt
[3] == 'o' && opt
[4] == '-')
553 /* Drop the "no-" from negative switches. */
554 size_t len
= strlen (opt
) - 3;
556 dup
= XNEWVEC (char, len
+ 1);
559 memcpy (dup
+ 2, opt
+ 5, len
- 2 + 1);
562 opt_index
= find_opt (opt
+ 1, lang_mask
| CL_COMMON
| CL_TARGET
);
563 if (opt_index
== cl_options_count
&& opt
[1] == 'W')
565 /* We don't generate warnings for unknown -Wno-* options
566 unless we issue diagnostics. */
567 postpone_unknown_option_warning (argv
[0]);
573 if (opt_index
== cl_options_count
)
576 option
= &cl_options
[opt_index
];
578 /* Reject negative form of switches that don't take negatives as
580 if (!value
&& (option
->flags
& CL_REJECT_NEGATIVE
))
583 /* We've recognized this switch. */
586 /* Check to see if the option is disabled for this configuration. */
587 if (option
->flags
& CL_DISABLED
)
589 error ("command line option %qs"
590 " is not supported by this configuration", opt
);
594 /* Sort out any argument the switch takes. */
595 if (option
->flags
& CL_JOINED
)
597 /* Have arg point to the original switch. This is because
598 some code, such as disable_builtin_function, expects its
599 argument to be persistent until the program exits. */
600 arg
= argv
[0] + cl_options
[opt_index
].opt_len
+ 1;
602 arg
+= strlen ("no-");
604 if (*arg
== '\0' && !(option
->flags
& CL_MISSING_OK
))
606 if (option
->flags
& CL_SEPARATE
)
612 /* Missing argument. */
616 else if (option
->flags
& CL_SEPARATE
)
622 /* Now we've swallowed any potential argument, complain if this
623 is a switch for a different front end. */
624 if (!(option
->flags
& (lang_mask
| CL_COMMON
| CL_TARGET
)))
626 complain_wrong_lang (argv
[0], option
, lang_mask
);
629 else if ((option
->flags
& CL_TARGET
)
630 && (option
->flags
& CL_LANG_ALL
)
631 && !(option
->flags
& lang_mask
))
633 /* Complain for target flag language mismatches if any languages
635 complain_wrong_lang (argv
[0], option
, lang_mask
);
639 if (arg
== NULL
&& (option
->flags
& (CL_JOINED
| CL_SEPARATE
)))
641 if (!lang_hooks
.missing_argument (opt
, opt_index
))
642 error ("missing argument to \"%s\"", opt
);
646 /* If the switch takes an integer, convert it. */
647 if (arg
&& (option
->flags
& CL_UINTEGER
))
649 value
= integral_argument (arg
);
652 error ("argument to \"%s\" should be a non-negative integer",
658 if (!handle_option (opt_index
, value
, arg
, lang_mask
, DK_UNSPECIFIED
))
667 /* Handle FILENAME from the command line. */
669 add_input_filename (const char *filename
)
672 in_fnames
= XRESIZEVEC (const char *, in_fnames
, num_in_fnames
);
673 in_fnames
[num_in_fnames
- 1] = filename
;
676 /* Add comma-separated strings to a char_p vector. */
679 add_comma_separated_to_vector (VEC(char_p
,heap
) **pvec
, const char* arg
)
686 /* We never free this string. */
699 VEC_safe_push (char_p
, heap
, *pvec
, token_start
);
702 if (*r
== '\\' && r
[1] == ',')
710 if (*token_start
!= '\0')
711 VEC_safe_push (char_p
, heap
, *pvec
, token_start
);
714 /* Return whether we should exclude FNDECL from instrumentation. */
717 flag_instrument_functions_exclude_p (tree fndecl
)
719 if (VEC_length (char_p
, flag_instrument_functions_exclude_functions
) > 0)
725 name
= lang_hooks
.decl_printable_name (fndecl
, 0);
727 VEC_iterate (char_p
, flag_instrument_functions_exclude_functions
,
731 if (strstr (name
, s
) != NULL
)
736 if (VEC_length (char_p
, flag_instrument_functions_exclude_files
) > 0)
742 name
= DECL_SOURCE_FILE (fndecl
);
744 VEC_iterate (char_p
, flag_instrument_functions_exclude_files
, i
, s
);
747 if (strstr (name
, s
) != NULL
)
756 /* Decode and handle the vector of command line options. LANG_MASK
757 contains has a single bit set representing the current
760 read_cmdline_options (unsigned int argc
, const char **argv
, unsigned int lang_mask
)
764 for (i
= 1; i
< argc
; i
+= n
)
766 const char *opt
= argv
[i
];
768 /* Interpret "-" or a non-switch as a file name. */
769 if (opt
[0] != '-' || opt
[1] == '\0')
771 if (main_input_filename
== NULL
)
773 main_input_filename
= opt
;
774 main_input_baselength
775 = base_of_path (main_input_filename
, &main_input_basename
);
777 add_input_filename (opt
);
782 n
= read_cmdline_option (argv
+ i
, lang_mask
);
787 error ("unrecognized command line option \"%s\"", opt
);
792 /* Parse command line options and set default flag values. Do minimal
793 options processing. */
795 decode_options (unsigned int argc
, const char **argv
)
797 static bool first_time_p
= true;
798 static int initial_min_crossjump_insns
;
799 static int initial_max_fields_for_field_sensitive
;
800 static int initial_loop_invariant_max_bbs_in_loop
;
801 static unsigned int initial_lang_mask
;
803 unsigned int i
, lang_mask
;
812 /* Perform language-specific options initialization. */
813 initial_lang_mask
= lang_mask
= lang_hooks
.init_options (argc
, argv
);
815 lang_hooks
.initialize_diagnostics (global_dc
);
817 /* Save initial values of parameters we reset. */
818 initial_min_crossjump_insns
819 = compiler_params
[PARAM_MIN_CROSSJUMP_INSNS
].value
;
820 initial_max_fields_for_field_sensitive
821 = compiler_params
[PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE
].value
;
822 initial_loop_invariant_max_bbs_in_loop
823 = compiler_params
[PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP
].value
;
826 lang_mask
= initial_lang_mask
;
828 /* Scan to see what optimization level has been specified. That will
829 determine the default value of many flags. */
830 for (i
= 1; i
< argc
; i
++)
832 if (!strcmp (argv
[i
], "-O"))
838 else if (argv
[i
][0] == '-' && argv
[i
][1] == 'O')
840 /* Handle -Os, -O2, -O3, -O69, ... */
841 const char *p
= &argv
[i
][2];
843 if ((p
[0] == 's') && (p
[1] == 0))
847 /* Optimizing for size forces optimize to be 2. */
851 else if (strcmp (p
, "fast") == 0)
853 /* -Ofast only adds flags to -O3. */
860 const int optimize_val
= read_integral_parameter (p
, p
- 2, -1);
861 if (optimize_val
!= -1)
863 optimize
= optimize_val
;
864 if ((unsigned int) optimize
> 255)
873 /* Use priority coloring if cover classes is not defined for the
875 if (targetm
.ira_cover_classes
== NULL
)
876 flag_ira_algorithm
= IRA_ALGORITHM_PRIORITY
;
878 /* -O1 optimizations. */
879 opt1
= (optimize
>= 1);
880 flag_defer_pop
= opt1
;
882 flag_delayed_branch
= opt1
;
884 #ifdef CAN_DEBUG_WITHOUT_FP
885 flag_omit_frame_pointer
= opt1
;
887 flag_guess_branch_prob
= opt1
;
888 flag_cprop_registers
= opt1
;
889 flag_forward_propagate
= opt1
;
890 flag_if_conversion
= opt1
;
891 flag_if_conversion2
= opt1
;
892 flag_ipa_pure_const
= opt1
;
893 flag_ipa_reference
= opt1
;
894 flag_ipa_profile
= opt1
;
895 flag_merge_constants
= opt1
;
896 flag_split_wide_types
= opt1
;
897 flag_tree_ccp
= opt1
;
898 flag_tree_dce
= opt1
;
899 flag_tree_dom
= opt1
;
900 flag_tree_dse
= opt1
;
901 flag_tree_ter
= opt1
;
902 flag_tree_sra
= opt1
;
903 flag_tree_copyrename
= opt1
;
904 flag_tree_fre
= opt1
;
905 flag_tree_copy_prop
= opt1
;
906 flag_tree_sink
= opt1
;
909 /* -O2 optimizations. */
910 opt2
= (optimize
>= 2);
911 flag_inline_small_functions
= opt2
;
912 flag_indirect_inlining
= opt2
;
913 flag_thread_jumps
= opt2
;
914 flag_crossjumping
= opt2
;
915 flag_optimize_sibling_calls
= opt2
;
916 flag_cse_follow_jumps
= opt2
;
918 flag_expensive_optimizations
= opt2
;
919 flag_rerun_cse_after_loop
= opt2
;
920 flag_caller_saves
= opt2
;
921 flag_peephole2
= opt2
;
922 #ifdef INSN_SCHEDULING
923 /* Only run the pre-regalloc scheduling pass if optimizing for speed. */
924 flag_schedule_insns
= opt2
&& ! optimize_size
;
925 flag_schedule_insns_after_reload
= opt2
;
928 flag_strict_aliasing
= opt2
;
929 flag_strict_overflow
= opt2
;
930 flag_reorder_blocks
= opt2
;
931 flag_reorder_functions
= opt2
;
932 flag_tree_vrp
= opt2
;
933 flag_tree_builtin_call_dce
= opt2
;
934 flag_tree_pre
= opt2
;
935 flag_tree_switch_conversion
= opt2
;
939 /* Track fields in field-sensitive alias analysis. */
940 set_param_value ("max-fields-for-field-sensitive",
941 (opt2
) ? 100 : initial_max_fields_for_field_sensitive
);
943 /* For -O1 only do loop invariant motion for very small loops. */
944 set_param_value ("loop-invariant-max-bbs-in-loop",
945 (opt2
) ? initial_loop_invariant_max_bbs_in_loop
: 1000);
947 /* -O3 optimizations. */
948 opt3
= (optimize
>= 3);
949 flag_predictive_commoning
= opt3
;
950 flag_inline_functions
= opt3
;
951 flag_unswitch_loops
= opt3
;
952 flag_gcse_after_reload
= opt3
;
953 flag_tree_vectorize
= opt3
;
954 flag_ipa_cp_clone
= opt3
;
955 if (flag_ipa_cp_clone
)
958 /* Just -O1/-O0 optimizations. */
959 opt1_max
= (optimize
<= 1);
960 align_loops
= opt1_max
;
961 align_jumps
= opt1_max
;
962 align_labels
= opt1_max
;
963 align_functions
= opt1_max
;
967 /* Inlining of functions reducing size is a good idea regardless of them
968 being declared inline. */
969 flag_inline_functions
= 1;
971 /* Basic optimization options. */
976 /* We want to crossjump as much as possible. */
977 set_param_value ("min-crossjump-insns", 1);
980 set_param_value ("min-crossjump-insns", initial_min_crossjump_insns
);
982 /* -Ofast adds optimizations to -O3. */
985 /* Which is -ffast-math for now. */
986 set_fast_math_flags (1);
987 /* Allow targets to enable extra options with -Ofast
988 before general options processing so disabling them
989 again afterwards works. */
990 targetm
.handle_ofast ();
993 /* Enable -Werror=coverage-mismatch by default */
994 enable_warning_as_error("coverage-mismatch", 1, lang_mask
);
998 /* Initialize whether `char' is signed. */
999 flag_signed_char
= DEFAULT_SIGNED_CHAR
;
1000 /* Set this to a special "uninitialized" value. The actual default is
1001 set after target options have been processed. */
1002 flag_short_enums
= 2;
1004 /* Initialize target_flags before OPTIMIZATION_OPTIONS so the latter can
1006 target_flags
= targetm
.default_target_flags
;
1008 /* Some targets have ABI-specified unwind tables. */
1009 flag_unwind_tables
= targetm
.unwind_tables_default
;
1013 /* Clear any options currently held for LTO. */
1014 lto_clear_user_options ();
1017 #ifdef OPTIMIZATION_OPTIONS
1018 /* Allow default optimizations to be specified on a per-machine basis. */
1019 OPTIMIZATION_OPTIONS (optimize
, optimize_size
);
1022 read_cmdline_options (argc
, argv
, lang_mask
);
1024 if (dump_base_name
&& ! IS_ABSOLUTE_PATH (dump_base_name
))
1026 /* First try to make DUMP_BASE_NAME relative to the DUMP_DIR_NAME
1027 directory. Then try to make DUMP_BASE_NAME relative to the
1028 AUX_BASE_NAME directory, typically the directory to contain
1031 dump_base_name
= concat (dump_dir_name
, dump_base_name
, NULL
);
1032 else if (aux_base_name
)
1034 const char *aux_base
;
1036 base_of_path (aux_base_name
, &aux_base
);
1037 if (aux_base_name
!= aux_base
)
1039 int dir_len
= aux_base
- aux_base_name
;
1040 char *new_dump_base_name
=
1041 XNEWVEC (char, strlen(dump_base_name
) + dir_len
+ 1);
1043 /* Copy directory component from AUX_BASE_NAME. */
1044 memcpy (new_dump_base_name
, aux_base_name
, dir_len
);
1045 /* Append existing DUMP_BASE_NAME. */
1046 strcpy (new_dump_base_name
+ dir_len
, dump_base_name
);
1047 dump_base_name
= new_dump_base_name
;
1052 /* Handle related options for unit-at-a-time, toplevel-reorder, and
1054 if (!flag_unit_at_a_time
)
1056 if (flag_section_anchors
== 1)
1057 error ("Section anchors must be disabled when unit-at-a-time "
1059 flag_section_anchors
= 0;
1060 if (flag_toplevel_reorder
== 1)
1061 error ("Toplevel reorder must be disabled when unit-at-a-time "
1063 flag_toplevel_reorder
= 0;
1065 /* Unless the user has asked for section anchors, we disable toplevel
1066 reordering at -O0 to disable transformations that might be surprising
1067 to end users and to get -fno-toplevel-reorder tested. */
1068 if (!optimize
&& flag_toplevel_reorder
== 2 && flag_section_anchors
!= 1)
1070 flag_toplevel_reorder
= 0;
1071 flag_section_anchors
= 0;
1073 if (!flag_toplevel_reorder
)
1075 if (flag_section_anchors
== 1)
1076 error ("section anchors must be disabled when toplevel reorder"
1078 flag_section_anchors
= 0;
1084 flag_pic
= flag_pie
;
1085 if (flag_pic
&& !flag_pie
)
1087 first_time_p
= false;
1092 /* Inlining does not work if not optimizing,
1093 so force it not to be done. */
1098 /* The optimization to partition hot and cold basic blocks into separate
1099 sections of the .o and executable files does not work (currently)
1100 with exception handling. This is because there is no support for
1101 generating unwind info. If flag_exceptions is turned on we need to
1102 turn off the partitioning optimization. */
1104 if (flag_exceptions
&& flag_reorder_blocks_and_partition
1105 && (USING_SJLJ_EXCEPTIONS
1106 #ifdef TARGET_UNWIND_INFO
1111 inform (input_location
,
1112 "-freorder-blocks-and-partition does not work with exceptions on this architecture");
1113 flag_reorder_blocks_and_partition
= 0;
1114 flag_reorder_blocks
= 1;
1117 /* If user requested unwind info, then turn off the partitioning
1120 if (flag_unwind_tables
&& ! targetm
.unwind_tables_default
1121 && flag_reorder_blocks_and_partition
1122 && (USING_SJLJ_EXCEPTIONS
1123 #ifdef TARGET_UNWIND_INFO
1128 inform (input_location
,
1129 "-freorder-blocks-and-partition does not support unwind info on this architecture");
1130 flag_reorder_blocks_and_partition
= 0;
1131 flag_reorder_blocks
= 1;
1134 /* If the target requested unwind info, then turn off the partitioning
1135 optimization with a different message. Likewise, if the target does not
1136 support named sections. */
1138 if (flag_reorder_blocks_and_partition
1139 && (!targetm
.have_named_sections
1140 || (flag_unwind_tables
&& targetm
.unwind_tables_default
1141 && (USING_SJLJ_EXCEPTIONS
1142 #ifdef TARGET_UNWIND_INFO
1147 inform (input_location
,
1148 "-freorder-blocks-and-partition does not work on this architecture");
1149 flag_reorder_blocks_and_partition
= 0;
1150 flag_reorder_blocks
= 1;
1153 /* Pipelining of outer loops is only possible when general pipelining
1154 capabilities are requested. */
1155 if (!flag_sel_sched_pipelining
)
1156 flag_sel_sched_pipelining_outer_loops
= 0;
1158 if (!targetm
.ira_cover_classes
1159 && flag_ira_algorithm
== IRA_ALGORITHM_CB
)
1161 inform (input_location
,
1162 "-fira-algorithm=CB does not work on this architecture");
1163 flag_ira_algorithm
= IRA_ALGORITHM_PRIORITY
;
1166 if (flag_conserve_stack
)
1168 if (!PARAM_SET_P (PARAM_LARGE_STACK_FRAME
))
1169 PARAM_VALUE (PARAM_LARGE_STACK_FRAME
) = 100;
1170 if (!PARAM_SET_P (PARAM_STACK_FRAME_GROWTH
))
1171 PARAM_VALUE (PARAM_STACK_FRAME_GROWTH
) = 40;
1173 if (flag_wpa
|| flag_ltrans
)
1175 /* These passes are not WHOPR compatible yet. */
1177 flag_ipa_struct_reorg
= 0;
1180 if (flag_lto
|| flag_whopr
)
1183 flag_generate_lto
= 1;
1185 /* When generating IL, do not operate in whole-program mode.
1186 Otherwise, symbols will be privatized too early, causing link
1188 flag_whole_program
= 0;
1190 error ("LTO support has not been enabled in this configuration");
1194 /* Reconcile -flto and -fwhopr. Set additional flags as appropriate and
1195 check option consistency. */
1196 if (flag_lto
&& flag_whopr
)
1197 error ("-flto and -fwhopr are mutually exclusive");
1200 #define LEFT_COLUMN 27
1202 /* Output ITEM, of length ITEM_WIDTH, in the left column,
1203 followed by word-wrapped HELP in a second column. */
1205 wrap_help (const char *help
,
1207 unsigned int item_width
,
1208 unsigned int columns
)
1210 unsigned int col_width
= LEFT_COLUMN
;
1211 unsigned int remaining
, room
, len
;
1213 remaining
= strlen (help
);
1217 room
= columns
- 3 - MAX (col_width
, item_width
);
1226 for (i
= 0; help
[i
]; i
++)
1228 if (i
>= room
&& len
!= remaining
)
1232 else if ((help
[i
] == '-' || help
[i
] == '/')
1233 && help
[i
+ 1] != ' '
1234 && i
> 0 && ISALPHA (help
[i
- 1]))
1239 printf( " %-*.*s %.*s\n", col_width
, item_width
, item
, len
, help
);
1241 while (help
[len
] == ' ')
1249 /* Print help for a specific front-end, etc. */
1251 print_filtered_help (unsigned int include_flags
,
1252 unsigned int exclude_flags
,
1253 unsigned int any_flags
,
1254 unsigned int columns
)
1258 static char *printed
= NULL
;
1260 bool displayed
= false;
1262 if (include_flags
== CL_PARAMS
)
1264 for (i
= 0; i
< LAST_PARAM
; i
++)
1266 const char *param
= compiler_params
[i
].option
;
1268 help
= compiler_params
[i
].help
;
1269 if (help
== NULL
|| *help
== '\0')
1271 if (exclude_flags
& CL_UNDOCUMENTED
)
1273 help
= undocumented_msg
;
1276 /* Get the translation. */
1279 wrap_help (help
, param
, strlen (param
), columns
);
1286 printed
= XCNEWVAR (char, cl_options_count
);
1288 for (i
= 0; i
< cl_options_count
; i
++)
1290 static char new_help
[128];
1291 const struct cl_option
*option
= cl_options
+ i
;
1296 if (include_flags
== 0
1297 || ((option
->flags
& include_flags
) != include_flags
))
1299 if ((option
->flags
& any_flags
) == 0)
1303 /* Skip unwanted switches. */
1304 if ((option
->flags
& exclude_flags
) != 0)
1308 /* Skip switches that have already been printed. */
1314 help
= option
->help
;
1317 if (exclude_flags
& CL_UNDOCUMENTED
)
1319 help
= undocumented_msg
;
1322 /* Get the translation. */
1325 /* Find the gap between the name of the
1326 option and its descriptive text. */
1327 tab
= strchr (help
, '\t');
1336 opt
= option
->opt_text
;
1340 /* With the -Q option enabled we change the descriptive text associated
1341 with an option to be an indication of its current setting. */
1344 if (len
< (LEFT_COLUMN
+ 2))
1345 strcpy (new_help
, "\t\t");
1347 strcpy (new_help
, "\t");
1349 if (option
->flag_var
!= NULL
)
1351 if (option
->flags
& CL_JOINED
)
1353 if (option
->var_type
== CLVC_STRING
)
1355 if (* (const char **) option
->flag_var
!= NULL
)
1356 snprintf (new_help
+ strlen (new_help
),
1357 sizeof (new_help
) - strlen (new_help
),
1358 * (const char **) option
->flag_var
);
1361 sprintf (new_help
+ strlen (new_help
),
1362 "%#x", * (int *) option
->flag_var
);
1365 strcat (new_help
, option_enabled (i
)
1366 ? _("[enabled]") : _("[disabled]"));
1372 wrap_help (help
, opt
, len
, columns
);
1378 unsigned int langs
= include_flags
& CL_LANG_ALL
;
1381 printf (_(" No options with the desired characteristics were found\n"));
1386 /* PR 31349: Tell the user how to see all of the
1387 options supported by a specific front end. */
1388 for (i
= 0; (1U << i
) < CL_LANG_ALL
; i
++)
1389 if ((1U << i
) & langs
)
1390 printf (_(" None found. Use --help=%s to show *all* the options supported by the %s front-end\n"),
1391 lang_names
[i
], lang_names
[i
]);
1395 else if (! displayed
)
1396 printf (_(" All options with the desired characteristics have already been displayed\n"));
1401 /* Display help for a specified type of option.
1402 The options must have ALL of the INCLUDE_FLAGS set
1403 ANY of the flags in the ANY_FLAGS set
1404 and NONE of the EXCLUDE_FLAGS set. */
1406 print_specific_help (unsigned int include_flags
,
1407 unsigned int exclude_flags
,
1408 unsigned int any_flags
)
1410 unsigned int all_langs_mask
= (1U << cl_lang_count
) - 1;
1411 const char * description
= NULL
;
1412 const char * descrip_extra
= "";
1415 static unsigned int columns
= 0;
1417 /* Sanity check: Make sure that we do not have more
1418 languages than we have bits available to enumerate them. */
1419 gcc_assert ((1U << cl_lang_count
) < CL_MIN_OPTION_CLASS
);
1421 /* If we have not done so already, obtain
1422 the desired maximum width of the output. */
1427 GET_ENVIRONMENT (p
, "COLUMNS");
1430 int value
= atoi (p
);
1437 /* Use a reasonable default. */
1441 /* Decide upon the title for the options that we are going to display. */
1442 for (i
= 0, flag
= 1; flag
<= CL_MAX_OPTION_CLASS
; flag
<<= 1, i
++)
1444 switch (flag
& include_flags
)
1450 description
= _("The following options are target specific");
1453 description
= _("The following options control compiler warning messages");
1455 case CL_OPTIMIZATION
:
1456 description
= _("The following options control optimizations");
1459 description
= _("The following options are language-independent");
1462 description
= _("The --param option recognizes the following as parameters");
1465 if (i
>= cl_lang_count
)
1467 if (exclude_flags
& all_langs_mask
)
1468 description
= _("The following options are specific to just the language ");
1470 description
= _("The following options are supported by the language ");
1471 descrip_extra
= lang_names
[i
];
1476 if (description
== NULL
)
1480 if (include_flags
& CL_UNDOCUMENTED
)
1481 description
= _("The following options are not documented");
1482 else if (include_flags
& CL_SEPARATE
)
1483 description
= _("The following options take separate arguments");
1484 else if (include_flags
& CL_JOINED
)
1485 description
= _("The following options take joined arguments");
1488 internal_error ("unrecognized include_flags 0x%x passed to print_specific_help",
1495 if (any_flags
& all_langs_mask
)
1496 description
= _("The following options are language-related");
1498 description
= _("The following options are language-independent");
1502 printf ("%s%s:\n", description
, descrip_extra
);
1503 print_filtered_help (include_flags
, exclude_flags
, any_flags
, columns
);
1506 /* Handle target- and language-independent options. Return zero to
1507 generate an "unknown option" message. Only options that need
1508 extra handling need to be listed here; if you simply want
1509 VALUE assigned to a variable, it happens automatically. */
1512 common_handle_option (size_t scode
, const char *arg
, int value
,
1513 unsigned int lang_mask
, int kind ATTRIBUTE_UNUSED
)
1515 static bool verbose
= false;
1516 enum opt_code code
= (enum opt_code
) scode
;
1531 unsigned int all_langs_mask
= (1U << cl_lang_count
) - 1;
1532 unsigned int undoc_mask
;
1535 undoc_mask
= (verbose
| extra_warnings
) ? 0 : CL_UNDOCUMENTED
;
1536 /* First display any single language specific options. */
1537 for (i
= 0; i
< cl_lang_count
; i
++)
1539 (1U << i
, (all_langs_mask
& (~ (1U << i
))) | undoc_mask
, 0);
1540 /* Next display any multi language specific options. */
1541 print_specific_help (0, undoc_mask
, all_langs_mask
);
1542 /* Then display any remaining, non-language options. */
1543 for (i
= CL_MIN_OPTION_CLASS
; i
<= CL_MAX_OPTION_CLASS
; i
<<= 1)
1544 print_specific_help (i
, undoc_mask
, 0);
1545 exit_after_options
= true;
1549 case OPT_ftarget_help
:
1550 case OPT__target_help
:
1551 print_specific_help (CL_TARGET
, CL_UNDOCUMENTED
, 0);
1552 exit_after_options
= true;
1554 /* Allow the target a chance to give the user some additional information. */
1555 if (targetm
.target_help
)
1556 targetm
.target_help ();
1562 const char * a
= arg
;
1563 unsigned int include_flags
= 0;
1564 /* Note - by default we include undocumented options when listing
1565 specific classes. If you only want to see documented options
1566 then add ",^undocumented" to the --help= option. E.g.:
1568 --help=target,^undocumented */
1569 unsigned int exclude_flags
= 0;
1571 /* Walk along the argument string, parsing each word in turn.
1573 arg = [^]{word}[,{arg}]
1574 word = {optimizers|target|warnings|undocumented|
1575 params|common|<language>} */
1580 const char * string
;
1585 { "optimizers", CL_OPTIMIZATION
},
1586 { "target", CL_TARGET
},
1587 { "warnings", CL_WARNING
},
1588 { "undocumented", CL_UNDOCUMENTED
},
1589 { "params", CL_PARAMS
},
1590 { "joined", CL_JOINED
},
1591 { "separate", CL_SEPARATE
},
1592 { "common", CL_COMMON
},
1595 unsigned int * pflags
;
1597 unsigned int lang_flag
, specific_flag
;
1604 pflags
= & exclude_flags
;
1607 pflags
= & include_flags
;
1609 comma
= strchr (a
, ',');
1620 /* Check to see if the string matches an option class name. */
1621 for (i
= 0, specific_flag
= 0; specifics
[i
].string
!= NULL
; i
++)
1622 if (strncasecmp (a
, specifics
[i
].string
, len
) == 0)
1624 specific_flag
= specifics
[i
].flag
;
1628 /* Check to see if the string matches a language name.
1629 Note - we rely upon the alpha-sorted nature of the entries in
1630 the lang_names array, specifically that shorter names appear
1631 before their longer variants. (i.e. C before C++). That way
1632 when we are attempting to match --help=c for example we will
1633 match with C first and not C++. */
1634 for (i
= 0, lang_flag
= 0; i
< cl_lang_count
; i
++)
1635 if (strncasecmp (a
, lang_names
[i
], len
) == 0)
1637 lang_flag
= 1U << i
;
1641 if (specific_flag
!= 0)
1644 * pflags
|= specific_flag
;
1647 /* The option's argument matches both the start of a
1648 language name and the start of an option class name.
1649 We have a special case for when the user has
1650 specified "--help=c", but otherwise we have to issue
1652 if (strncasecmp (a
, "c", len
) == 0)
1653 * pflags
|= lang_flag
;
1656 "warning: --help argument %.*s is ambiguous, please be more specific\n",
1660 else if (lang_flag
!= 0)
1661 * pflags
|= lang_flag
;
1664 "warning: unrecognized argument to --help= option: %.*s\n",
1673 print_specific_help (include_flags
, exclude_flags
, 0);
1674 exit_after_options
= true;
1680 exit_after_options
= true;
1684 g_switch_value
= value
;
1685 g_switch_set
= true;
1691 /* Currently handled in a prescan. */
1695 enable_warning_as_error (arg
, value
, lang_mask
);
1698 case OPT_Wlarger_than_
:
1699 /* This form corresponds to -Wlarger-than-.
1700 Kept for backward compatibility.
1701 Don't use it as the first argument of warning(). */
1703 case OPT_Wlarger_than_eq
:
1704 larger_than_size
= value
;
1705 warn_larger_than
= value
!= -1;
1708 case OPT_Wfatal_errors
:
1709 global_dc
->fatal_errors
= value
;
1712 case OPT_Wframe_larger_than_
:
1713 frame_larger_than_size
= value
;
1714 warn_frame_larger_than
= value
!= -1;
1717 case OPT_Wstrict_aliasing
:
1718 set_Wstrict_aliasing (value
);
1721 case OPT_Wstrict_aliasing_
:
1722 warn_strict_aliasing
= value
;
1725 case OPT_Wstrict_overflow
:
1726 warn_strict_overflow
= (value
1727 ? (int) WARN_STRICT_OVERFLOW_CONDITIONAL
1731 case OPT_Wstrict_overflow_
:
1732 warn_strict_overflow
= value
;
1735 case OPT_Wsystem_headers
:
1736 global_dc
->warn_system_headers
= value
;
1740 warn_unused
= value
;
1745 aux_info_file_name
= arg
;
1746 flag_gen_aux_info
= 1;
1750 aux_base_name
= arg
;
1753 case OPT_auxbase_strip
:
1755 char *tmp
= xstrdup (arg
);
1756 strip_off_ending (tmp
, strlen (tmp
));
1758 aux_base_name
= tmp
;
1763 decode_d_option (arg
);
1767 dump_base_name
= arg
;
1771 dump_dir_name
= arg
;
1774 case OPT_falign_functions_
:
1775 align_functions
= value
;
1778 case OPT_falign_jumps_
:
1779 align_jumps
= value
;
1782 case OPT_falign_labels_
:
1783 align_labels
= value
;
1786 case OPT_falign_loops_
:
1787 align_loops
= value
;
1790 case OPT_fbranch_probabilities
:
1791 flag_branch_probabilities_set
= true;
1794 case OPT_fcall_used_
:
1795 fix_register (arg
, 0, 1);
1798 case OPT_fcall_saved_
:
1799 fix_register (arg
, 0, 0);
1803 dbg_cnt_process_opt (arg
);
1806 case OPT_fdbg_cnt_list
:
1807 dbg_cnt_list_all_counters ();
1810 case OPT_fdebug_prefix_map_
:
1811 add_debug_prefix_map (arg
);
1814 case OPT_fdiagnostics_show_location_
:
1815 if (!strcmp (arg
, "once"))
1816 diagnostic_prefixing_rule (global_dc
) = DIAGNOSTICS_SHOW_PREFIX_ONCE
;
1817 else if (!strcmp (arg
, "every-line"))
1818 diagnostic_prefixing_rule (global_dc
)
1819 = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE
;
1824 case OPT_fdiagnostics_show_option
:
1825 global_dc
->show_option_requested
= value
;
1829 if (!dump_switch_p (arg
))
1833 case OPT_fexcess_precision_
:
1834 if (!strcmp (arg
, "fast"))
1835 flag_excess_precision_cmdline
= EXCESS_PRECISION_FAST
;
1836 else if (!strcmp (arg
, "standard"))
1837 flag_excess_precision_cmdline
= EXCESS_PRECISION_STANDARD
;
1839 error ("unknown excess precision style \"%s\"", arg
);
1842 case OPT_ffast_math
:
1843 set_fast_math_flags (value
);
1846 case OPT_funsafe_math_optimizations
:
1847 set_unsafe_math_optimizations_flags (value
);
1851 fix_register (arg
, 1, 1);
1854 case OPT_finline_limit_
:
1855 case OPT_finline_limit_eq
:
1856 set_param_value ("max-inline-insns-single", value
/ 2);
1857 set_param_value ("max-inline-insns-auto", value
/ 2);
1860 case OPT_finstrument_functions_exclude_function_list_
:
1861 add_comma_separated_to_vector
1862 (&flag_instrument_functions_exclude_functions
, arg
);
1865 case OPT_finstrument_functions_exclude_file_list_
:
1866 add_comma_separated_to_vector
1867 (&flag_instrument_functions_exclude_files
, arg
);
1870 case OPT_fmessage_length_
:
1871 pp_set_line_maximum_length (global_dc
->printer
, value
);
1874 case OPT_fpack_struct_
:
1875 if (value
<= 0 || (value
& (value
- 1)) || value
> 16)
1876 error ("structure alignment must be a small power of two, not %d", value
);
1879 initial_max_fld_align
= value
;
1880 maximum_field_alignment
= value
* BITS_PER_UNIT
;
1884 case OPT_fpeel_loops
:
1885 flag_peel_loops_set
= true;
1889 #ifdef ENABLE_PLUGIN
1890 add_new_plugin (arg
);
1892 error ("Plugin support is disabled. Configure with --enable-plugin.");
1896 case OPT_fplugin_arg_
:
1897 #ifdef ENABLE_PLUGIN
1898 parse_plugin_arg_opt (arg
);
1900 error ("Plugin support is disabled. Configure with --enable-plugin.");
1904 case OPT_fprofile_arcs
:
1905 profile_arc_flag_set
= true;
1908 case OPT_finline_functions
:
1909 flag_inline_functions_set
= true;
1912 case OPT_fprofile_dir_
:
1913 profile_data_prefix
= xstrdup (arg
);
1916 case OPT_fprofile_use_
:
1917 profile_data_prefix
= xstrdup (arg
);
1918 flag_profile_use
= true;
1920 /* No break here - do -fprofile-use processing. */
1921 case OPT_fprofile_use
:
1922 if (!flag_branch_probabilities_set
)
1923 flag_branch_probabilities
= value
;
1924 if (!flag_profile_values_set
)
1925 flag_profile_values
= value
;
1926 if (!flag_unroll_loops_set
)
1927 flag_unroll_loops
= value
;
1928 if (!flag_peel_loops_set
)
1929 flag_peel_loops
= value
;
1930 if (!flag_tracer_set
)
1931 flag_tracer
= value
;
1932 if (!flag_value_profile_transformations_set
)
1933 flag_value_profile_transformations
= value
;
1934 if (!flag_inline_functions_set
)
1935 flag_inline_functions
= value
;
1936 if (!flag_ipa_cp_set
)
1937 flag_ipa_cp
= value
;
1938 if (!flag_ipa_cp_clone_set
1939 && value
&& flag_ipa_cp
)
1940 flag_ipa_cp_clone
= value
;
1941 if (!flag_predictive_commoning_set
)
1942 flag_predictive_commoning
= value
;
1943 if (!flag_unswitch_loops_set
)
1944 flag_unswitch_loops
= value
;
1945 if (!flag_gcse_after_reload_set
)
1946 flag_gcse_after_reload
= value
;
1949 case OPT_fprofile_generate_
:
1950 profile_data_prefix
= xstrdup (arg
);
1952 /* No break here - do -fprofile-generate processing. */
1953 case OPT_fprofile_generate
:
1954 if (!profile_arc_flag_set
)
1955 profile_arc_flag
= value
;
1956 if (!flag_profile_values_set
)
1957 flag_profile_values
= value
;
1958 if (!flag_value_profile_transformations_set
)
1959 flag_value_profile_transformations
= value
;
1960 if (!flag_inline_functions_set
)
1961 flag_inline_functions
= value
;
1964 case OPT_fprofile_values
:
1965 flag_profile_values_set
= true;
1968 case OPT_fshow_column
:
1969 global_dc
->show_column
= value
;
1972 case OPT_fvisibility_
:
1974 if (!strcmp(arg
, "default"))
1975 default_visibility
= VISIBILITY_DEFAULT
;
1976 else if (!strcmp(arg
, "internal"))
1977 default_visibility
= VISIBILITY_INTERNAL
;
1978 else if (!strcmp(arg
, "hidden"))
1979 default_visibility
= VISIBILITY_HIDDEN
;
1980 else if (!strcmp(arg
, "protected"))
1981 default_visibility
= VISIBILITY_PROTECTED
;
1983 error ("unrecognized visibility value \"%s\"", arg
);
1988 flag_value_profile_transformations_set
= true;
1991 case OPT_frandom_seed
:
1992 /* The real switch is -fno-random-seed. */
1995 set_random_seed (NULL
);
1998 case OPT_frandom_seed_
:
1999 set_random_seed (arg
);
2002 case OPT_fselective_scheduling
:
2003 case OPT_fselective_scheduling2
:
2004 sel_sched_switch_set
= true;
2007 case OPT_fsched_verbose_
:
2008 #ifdef INSN_SCHEDULING
2009 fix_sched_param ("verbose", arg
);
2015 case OPT_fsched_stalled_insns_
:
2016 flag_sched_stalled_insns
= value
;
2017 if (flag_sched_stalled_insns
== 0)
2018 flag_sched_stalled_insns
= -1;
2021 case OPT_fsched_stalled_insns_dep_
:
2022 flag_sched_stalled_insns_dep
= value
;
2025 case OPT_fstack_check_
:
2026 if (!strcmp (arg
, "no"))
2027 flag_stack_check
= NO_STACK_CHECK
;
2028 else if (!strcmp (arg
, "generic"))
2029 /* This is the old stack checking method. */
2030 flag_stack_check
= STACK_CHECK_BUILTIN
2031 ? FULL_BUILTIN_STACK_CHECK
2032 : GENERIC_STACK_CHECK
;
2033 else if (!strcmp (arg
, "specific"))
2034 /* This is the new stack checking method. */
2035 flag_stack_check
= STACK_CHECK_BUILTIN
2036 ? FULL_BUILTIN_STACK_CHECK
2037 : STACK_CHECK_STATIC_BUILTIN
2038 ? STATIC_BUILTIN_STACK_CHECK
2039 : GENERIC_STACK_CHECK
;
2041 warning (0, "unknown stack check parameter \"%s\"", arg
);
2044 case OPT_fstack_check
:
2045 /* This is the same as the "specific" mode above. */
2047 flag_stack_check
= STACK_CHECK_BUILTIN
2048 ? FULL_BUILTIN_STACK_CHECK
2049 : STACK_CHECK_STATIC_BUILTIN
2050 ? STATIC_BUILTIN_STACK_CHECK
2051 : GENERIC_STACK_CHECK
;
2053 flag_stack_check
= NO_STACK_CHECK
;
2056 case OPT_fstack_limit
:
2057 /* The real switch is -fno-stack-limit. */
2060 stack_limit_rtx
= NULL_RTX
;
2063 case OPT_fstack_limit_register_
:
2065 int reg
= decode_reg_name (arg
);
2067 error ("unrecognized register name \"%s\"", arg
);
2069 stack_limit_rtx
= gen_rtx_REG (Pmode
, reg
);
2073 case OPT_fstack_limit_symbol_
:
2074 stack_limit_rtx
= gen_rtx_SYMBOL_REF (Pmode
, ggc_strdup (arg
));
2077 case OPT_ftree_vectorizer_verbose_
:
2078 vect_set_verbosity_level (arg
);
2081 case OPT_ftls_model_
:
2082 if (!strcmp (arg
, "global-dynamic"))
2083 flag_tls_default
= TLS_MODEL_GLOBAL_DYNAMIC
;
2084 else if (!strcmp (arg
, "local-dynamic"))
2085 flag_tls_default
= TLS_MODEL_LOCAL_DYNAMIC
;
2086 else if (!strcmp (arg
, "initial-exec"))
2087 flag_tls_default
= TLS_MODEL_INITIAL_EXEC
;
2088 else if (!strcmp (arg
, "local-exec"))
2089 flag_tls_default
= TLS_MODEL_LOCAL_EXEC
;
2091 warning (0, "unknown tls-model \"%s\"", arg
);
2094 case OPT_fira_algorithm_
:
2095 if (!strcmp (arg
, "CB"))
2096 flag_ira_algorithm
= IRA_ALGORITHM_CB
;
2097 else if (!strcmp (arg
, "priority"))
2098 flag_ira_algorithm
= IRA_ALGORITHM_PRIORITY
;
2100 warning (0, "unknown ira algorithm \"%s\"", arg
);
2103 case OPT_fira_region_
:
2104 if (!strcmp (arg
, "one"))
2105 flag_ira_region
= IRA_REGION_ONE
;
2106 else if (!strcmp (arg
, "all"))
2107 flag_ira_region
= IRA_REGION_ALL
;
2108 else if (!strcmp (arg
, "mixed"))
2109 flag_ira_region
= IRA_REGION_MIXED
;
2111 warning (0, "unknown ira region \"%s\"", arg
);
2114 case OPT_fira_verbose_
:
2115 flag_ira_verbose
= value
;
2119 flag_tracer_set
= true;
2123 flag_ipa_cp_set
= true;
2126 case OPT_fipa_cp_clone
:
2127 flag_ipa_cp_clone_set
= true;
2130 case OPT_fpredictive_commoning
:
2131 flag_predictive_commoning_set
= true;
2134 case OPT_funswitch_loops
:
2135 flag_unswitch_loops_set
= true;
2138 case OPT_fgcse_after_reload
:
2139 flag_gcse_after_reload_set
= true;
2142 case OPT_funroll_loops
:
2143 flag_unroll_loops_set
= true;
2147 set_debug_level (NO_DEBUG
, DEFAULT_GDB_EXTENSIONS
, arg
);
2151 set_debug_level (SDB_DEBUG
, false, arg
);
2155 if (value
< 2 || value
> 4)
2156 error ("dwarf version %d is not supported", value
);
2158 dwarf_version
= value
;
2159 set_debug_level (DWARF2_DEBUG
, false, "");
2163 set_debug_level (NO_DEBUG
, 2, arg
);
2168 set_debug_level (DBX_DEBUG
, code
== OPT_gstabs_
, arg
);
2172 set_debug_level (VMS_DEBUG
, false, arg
);
2177 set_debug_level (XCOFF_DEBUG
, code
== OPT_gxcoff_
, arg
);
2181 asm_file_name
= arg
;
2184 case OPT_pedantic_errors
:
2185 global_dc
->pedantic_errors
= flag_pedantic_errors
= pedantic
= 1;
2193 global_dc
->inhibit_warnings
= true;
2197 case OPT_fcse_skip_blocks
:
2198 case OPT_floop_optimize
:
2199 case OPT_frerun_loop_opt
:
2200 case OPT_fsched2_use_traces
:
2201 case OPT_fstrength_reduce
:
2202 case OPT_ftree_store_copy_prop
:
2203 case OPT_fforce_addr
:
2204 case OPT_ftree_salias
:
2205 case OPT_ftree_store_ccp
:
2206 case OPT_Wunreachable_code
:
2207 case OPT_fargument_alias
:
2208 case OPT_fargument_noalias
:
2209 case OPT_fargument_noalias_anything
:
2210 case OPT_fargument_noalias_global
:
2211 /* These are no-ops, preserved for backward compatibility. */
2214 case OPT_fuse_linker_plugin
:
2215 /* No-op. Used by the driver and passed to us because it starts with f.*/
2219 /* If the flag was handled in a standard way, assume the lack of
2220 processing here is intentional. */
2221 gcc_assert (cl_options
[scode
].flag_var
);
2228 /* Handle --param NAME=VALUE. */
2230 handle_param (const char *carg
)
2235 arg
= xstrdup (carg
);
2236 equal
= strchr (arg
, '=');
2238 error ("%s: --param arguments should be of the form NAME=VALUE", arg
);
2241 value
= integral_argument (equal
+ 1);
2243 error ("invalid --param value %qs", equal
+ 1);
2247 set_param_value (arg
, value
);
2254 /* Used to set the level of strict aliasing warnings,
2255 when no level is specified (i.e., when -Wstrict-aliasing, and not
2256 -Wstrict-aliasing=level was given).
2257 ONOFF is assumed to take value 1 when -Wstrict-aliasing is specified,
2258 and 0 otherwise. After calling this function, wstrict_aliasing will be
2259 set to the default value of -Wstrict_aliasing=level, currently 3. */
2261 set_Wstrict_aliasing (int onoff
)
2263 gcc_assert (onoff
== 0 || onoff
== 1);
2265 warn_strict_aliasing
= 3;
2267 warn_strict_aliasing
= 0;
2270 /* The following routines are useful in setting all the flags that
2271 -ffast-math and -fno-fast-math imply. */
2273 set_fast_math_flags (int set
)
2275 flag_unsafe_math_optimizations
= set
;
2276 set_unsafe_math_optimizations_flags (set
);
2277 flag_finite_math_only
= set
;
2278 flag_errno_math
= !set
;
2281 flag_signaling_nans
= 0;
2282 flag_rounding_math
= 0;
2283 flag_cx_limited_range
= 1;
2287 /* When -funsafe-math-optimizations is set the following
2288 flags are set as well. */
2290 set_unsafe_math_optimizations_flags (int set
)
2292 flag_trapping_math
= !set
;
2293 flag_signed_zeros
= !set
;
2294 flag_associative_math
= set
;
2295 flag_reciprocal_math
= set
;
2298 /* Return true iff flags are set as if -ffast-math. */
2300 fast_math_flags_set_p (void)
2302 return (!flag_trapping_math
2303 && flag_unsafe_math_optimizations
2304 && flag_finite_math_only
2305 && !flag_signed_zeros
2306 && !flag_errno_math
);
2309 /* Return true iff flags are set as if -ffast-math but using the flags stored
2310 in the struct cl_optimization structure. */
2312 fast_math_flags_struct_set_p (struct cl_optimization
*opt
)
2314 return (!opt
->flag_trapping_math
2315 && opt
->flag_unsafe_math_optimizations
2316 && opt
->flag_finite_math_only
2317 && !opt
->flag_signed_zeros
2318 && !opt
->flag_errno_math
);
2321 /* Handle a debug output -g switch. EXTENDED is true or false to support
2322 extended output (2 is special and means "-ggdb" was given). */
2324 set_debug_level (enum debug_info_type type
, int extended
, const char *arg
)
2326 static bool type_explicit
;
2328 use_gnu_debug_info_extensions
= extended
;
2330 if (type
== NO_DEBUG
)
2332 if (write_symbols
== NO_DEBUG
)
2334 write_symbols
= PREFERRED_DEBUGGING_TYPE
;
2338 #ifdef DWARF2_DEBUGGING_INFO
2339 write_symbols
= DWARF2_DEBUG
;
2340 #elif defined DBX_DEBUGGING_INFO
2341 write_symbols
= DBX_DEBUG
;
2345 if (write_symbols
== NO_DEBUG
)
2346 warning (0, "target system does not support debug output");
2351 /* Does it conflict with an already selected type? */
2352 if (type_explicit
&& write_symbols
!= NO_DEBUG
&& type
!= write_symbols
)
2353 error ("debug format \"%s\" conflicts with prior selection",
2354 debug_type_names
[type
]);
2355 write_symbols
= type
;
2356 type_explicit
= true;
2359 /* A debug flag without a level defaults to level 2. */
2362 if (!debug_info_level
)
2363 debug_info_level
= DINFO_LEVEL_NORMAL
;
2367 int argval
= integral_argument (arg
);
2369 error ("unrecognised debug output level \"%s\"", arg
);
2370 else if (argval
> 3)
2371 error ("debug output level %s is too high", arg
);
2373 debug_info_level
= (enum debug_info_level
) argval
;
2377 /* Return 1 if OPTION is enabled, 0 if it is disabled, or -1 if it isn't
2378 a simple on-off switch. */
2381 option_enabled (int opt_idx
)
2383 const struct cl_option
*option
= &(cl_options
[opt_idx
]);
2385 if (option
->flag_var
)
2386 switch (option
->var_type
)
2389 return *(int *) option
->flag_var
!= 0;
2392 return *(int *) option
->flag_var
== option
->var_value
;
2394 case CLVC_BIT_CLEAR
:
2395 return (*(int *) option
->flag_var
& option
->var_value
) == 0;
2398 return (*(int *) option
->flag_var
& option
->var_value
) != 0;
2406 /* Fill STATE with the current state of option OPTION. Return true if
2407 there is some state to store. */
2410 get_option_state (int option
, struct cl_option_state
*state
)
2412 if (cl_options
[option
].flag_var
== 0)
2415 switch (cl_options
[option
].var_type
)
2419 state
->data
= cl_options
[option
].flag_var
;
2420 state
->size
= sizeof (int);
2423 case CLVC_BIT_CLEAR
:
2425 state
->ch
= option_enabled (option
);
2426 state
->data
= &state
->ch
;
2431 state
->data
= *(const char **) cl_options
[option
].flag_var
;
2432 if (state
->data
== 0)
2434 state
->size
= strlen ((const char *) state
->data
) + 1;
2440 /* Set *OPTION according to VALUE and ARG. */
2443 set_option (int opt_index
, int value
, const char *arg
, int kind
)
2445 const struct cl_option
*option
= &cl_options
[opt_index
];
2447 if (!option
->flag_var
)
2450 switch (option
->var_type
)
2453 *(int *) option
->flag_var
= value
;
2457 *(int *) option
->flag_var
= (value
2459 : !option
->var_value
);
2462 case CLVC_BIT_CLEAR
:
2464 if ((value
!= 0) == (option
->var_type
== CLVC_BIT_SET
))
2465 *(int *) option
->flag_var
|= option
->var_value
;
2467 *(int *) option
->flag_var
&= ~option
->var_value
;
2468 if (option
->flag_var
== &target_flags
)
2469 target_flags_explicit
|= option
->var_value
;
2473 *(const char **) option
->flag_var
= arg
;
2477 if ((diagnostic_t
)kind
!= DK_UNSPECIFIED
)
2478 diagnostic_classify_diagnostic (global_dc
, opt_index
, (diagnostic_t
)kind
);
2482 /* Callback function, called when -Werror= enables a warning. */
2484 static void (*warning_as_error_callback
) (int) = NULL
;
2486 /* Register a callback for enable_warning_as_error calls. */
2489 register_warning_as_error_callback (void (*callback
) (int))
2491 gcc_assert (warning_as_error_callback
== NULL
|| callback
== NULL
);
2492 warning_as_error_callback
= callback
;
2495 /* Enable a warning option as an error. This is used by -Werror= and
2496 also by legacy Werror-implicit-function-declaration. */
2499 enable_warning_as_error (const char *arg
, int value
, unsigned int lang_mask
)
2504 new_option
= XNEWVEC (char, strlen (arg
) + 2);
2505 new_option
[0] = 'W';
2506 strcpy (new_option
+ 1, arg
);
2507 option_index
= find_opt (new_option
, lang_mask
);
2508 if (option_index
== N_OPTS
)
2510 error ("-Werror=%s: No option -%s", arg
, new_option
);
2514 const diagnostic_t kind
= value
? DK_ERROR
: DK_WARNING
;
2516 diagnostic_classify_diagnostic (global_dc
, option_index
, kind
);
2517 if (kind
== DK_ERROR
)
2519 const struct cl_option
* const option
= cl_options
+ option_index
;
2521 /* -Werror=foo implies -Wfoo. */
2522 if (option
->var_type
== CLVC_BOOLEAN
)
2523 handle_option (option_index
, value
, arg
, lang_mask
, (int)kind
);
2525 if (warning_as_error_callback
)
2526 warning_as_error_callback (option_index
);
2532 /* Return malloced memory for the name of the option OPTION_INDEX
2533 which enabled a diagnostic (context CONTEXT), originally of type
2534 ORIG_DIAG_KIND but possibly converted to DIAG_KIND by options such
2538 option_name (diagnostic_context
*context
, int option_index
,
2539 diagnostic_t orig_diag_kind
, diagnostic_t diag_kind
)
2543 /* A warning classified as an error. */
2544 if ((orig_diag_kind
== DK_WARNING
|| orig_diag_kind
== DK_PEDWARN
)
2545 && diag_kind
== DK_ERROR
)
2546 return concat (cl_options
[OPT_Werror_
].opt_text
,
2547 /* Skip over "-W". */
2548 cl_options
[option_index
].opt_text
+ 2,
2550 /* A warning with option. */
2552 return xstrdup (cl_options
[option_index
].opt_text
);
2554 /* A warning without option classified as an error. */
2555 else if (orig_diag_kind
== DK_WARNING
|| orig_diag_kind
== DK_PEDWARN
2556 || diag_kind
== DK_WARNING
)
2558 if (context
->warning_as_error_requested
)
2559 return xstrdup (cl_options
[OPT_Werror
].opt_text
);
2561 return xstrdup (_("enabled by default"));