1 /* Command line option handling.
2 Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008
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 "tm_p.h" /* For OPTIMIZATION_OPTIONS. */
40 #include "insn-attr.h" /* For INSN_SCHEDULING. */
42 #include "tree-pass.h"
46 /* Value of the -G xx switch, and whether it was passed or not. */
47 unsigned HOST_WIDE_INT g_switch_value
;
50 /* True if we should exit after parsing options. */
51 bool exit_after_options
;
53 /* Print various extra warnings. -W/-Wextra. */
56 /* True to warn about any objects definitions whose size is larger
57 than N bytes. Also want about function definitions whose returned
58 values are larger than N bytes, where N is `larger_than_size'. */
59 bool warn_larger_than
;
60 HOST_WIDE_INT larger_than_size
;
62 /* True to warn about any function whose frame size is larger
64 bool warn_frame_larger_than
;
65 HOST_WIDE_INT frame_larger_than_size
;
67 /* Type(s) of debugging information we are producing (if any). See
68 flags.h for the definitions of the different possible types of
69 debugging information. */
70 enum debug_info_type write_symbols
= NO_DEBUG
;
72 /* Level of debugging information we are producing. See flags.h for
73 the definitions of the different possible levels. */
74 enum debug_info_level debug_info_level
= DINFO_LEVEL_NONE
;
76 /* A major contribution to object and executable size is debug
77 information size. A major contribution to debug information size
78 is struct descriptions replicated in several object files. The
79 following flags attempt to reduce this information. The basic
80 idea is to not emit struct debugging information in the current
81 compilation unit when that information will be generated by
82 another compilation unit.
84 Debug information for a struct defined in the current source
85 file should be generated in the object file. Likewise the
86 debug information for a struct defined in a header should be
87 generated in the object file of the corresponding source file.
88 Both of these case are handled when the base name of the file of
89 the struct definition matches the base name of the source file
90 of the current compilation unit. This matching emits minimal
91 struct debugging information.
93 The base file name matching rule above will fail to emit debug
94 information for structs defined in system headers. So a second
95 category of files includes system headers in addition to files
98 The remaining types of files are library headers and application
99 headers. We cannot currently distinguish these two types. */
101 enum debug_struct_file
103 DINFO_STRUCT_FILE_NONE
, /* Debug no structs. */
104 DINFO_STRUCT_FILE_BASE
, /* Debug structs defined in files with the
105 same base name as the compilation unit. */
106 DINFO_STRUCT_FILE_SYS
, /* Also debug structs defined in system
108 DINFO_STRUCT_FILE_ANY
/* Debug structs defined in all files. */
111 /* Generic structs (e.g. templates not explicitly specialized)
112 may not have a compilation unit associated with them, and so
113 may need to be treated differently from ordinary structs.
115 Structs only handled by reference (indirectly), will also usually
116 not need as much debugging information. */
118 static enum debug_struct_file debug_struct_ordinary
[DINFO_USAGE_NUM_ENUMS
]
119 = { DINFO_STRUCT_FILE_ANY
, DINFO_STRUCT_FILE_ANY
, DINFO_STRUCT_FILE_ANY
};
120 static enum debug_struct_file debug_struct_generic
[DINFO_USAGE_NUM_ENUMS
]
121 = { DINFO_STRUCT_FILE_ANY
, DINFO_STRUCT_FILE_ANY
, DINFO_STRUCT_FILE_ANY
};
123 /* Parse the -femit-struct-debug-detailed option value
124 and set the flag variables. */
126 #define MATCH( prefix, string ) \
127 ((strncmp (prefix, string, sizeof prefix - 1) == 0) \
128 ? ((string += sizeof prefix - 1), 1) : 0)
131 set_struct_debug_option (const char *spec
)
133 /* various labels for comparison */
134 static char dfn_lbl
[] = "dfn:", dir_lbl
[] = "dir:", ind_lbl
[] = "ind:";
135 static char ord_lbl
[] = "ord:", gen_lbl
[] = "gen:";
136 static char none_lbl
[] = "none", any_lbl
[] = "any";
137 static char base_lbl
[] = "base", sys_lbl
[] = "sys";
139 enum debug_struct_file files
= DINFO_STRUCT_FILE_ANY
;
140 /* Default is to apply to as much as possible. */
141 enum debug_info_usage usage
= DINFO_USAGE_NUM_ENUMS
;
142 int ord
= 1, gen
= 1;
145 if (MATCH (dfn_lbl
, spec
))
146 usage
= DINFO_USAGE_DFN
;
147 else if (MATCH (dir_lbl
, spec
))
148 usage
= DINFO_USAGE_DIR_USE
;
149 else if (MATCH (ind_lbl
, spec
))
150 usage
= DINFO_USAGE_IND_USE
;
152 /* Generics or not? */
153 if (MATCH (ord_lbl
, spec
))
155 else if (MATCH (gen_lbl
, spec
))
158 /* What allowable environment? */
159 if (MATCH (none_lbl
, spec
))
160 files
= DINFO_STRUCT_FILE_NONE
;
161 else if (MATCH (any_lbl
, spec
))
162 files
= DINFO_STRUCT_FILE_ANY
;
163 else if (MATCH (sys_lbl
, spec
))
164 files
= DINFO_STRUCT_FILE_SYS
;
165 else if (MATCH (base_lbl
, spec
))
166 files
= DINFO_STRUCT_FILE_BASE
;
168 error ("argument %qs to %<-femit-struct-debug-detailed%> not recognized",
171 /* Effect the specification. */
172 if (usage
== DINFO_USAGE_NUM_ENUMS
)
176 debug_struct_ordinary
[DINFO_USAGE_DFN
] = files
;
177 debug_struct_ordinary
[DINFO_USAGE_DIR_USE
] = files
;
178 debug_struct_ordinary
[DINFO_USAGE_IND_USE
] = files
;
182 debug_struct_generic
[DINFO_USAGE_DFN
] = files
;
183 debug_struct_generic
[DINFO_USAGE_DIR_USE
] = files
;
184 debug_struct_generic
[DINFO_USAGE_IND_USE
] = files
;
190 debug_struct_ordinary
[usage
] = files
;
192 debug_struct_generic
[usage
] = files
;
196 set_struct_debug_option (spec
+1);
199 /* No more -femit-struct-debug-detailed specifications.
202 error ("argument %qs to %<-femit-struct-debug-detailed%> unknown",
204 if (debug_struct_ordinary
[DINFO_USAGE_DIR_USE
]
205 < debug_struct_ordinary
[DINFO_USAGE_IND_USE
]
206 || debug_struct_generic
[DINFO_USAGE_DIR_USE
]
207 < debug_struct_generic
[DINFO_USAGE_IND_USE
])
208 error ("%<-femit-struct-debug-detailed=dir:...%> must allow at least"
209 " as much as %<-femit-struct-debug-detailed=ind:...%>");
213 /* Find the base name of a path, stripping off both directories and
214 a single final extension. */
216 base_of_path (const char *path
, const char **base_out
)
218 const char *base
= path
;
220 const char *p
= path
;
224 if (IS_DIR_SEPARATOR(c
))
239 /* Match the base name of a file to the base name of a compilation unit. */
241 static const char *main_input_basename
;
242 static int main_input_baselength
;
245 matches_main_base (const char *path
)
247 /* Cache the last query. */
248 static const char *last_path
= NULL
;
249 static int last_match
= 0;
250 if (path
!= last_path
)
253 int length
= base_of_path (path
, &base
);
255 last_match
= (length
== main_input_baselength
256 && memcmp (base
, main_input_basename
, length
) == 0);
261 #ifdef DEBUG_DEBUG_STRUCT
264 dump_struct_debug (tree type
, enum debug_info_usage usage
,
265 enum debug_struct_file criterion
, int generic
,
266 int matches
, int result
)
268 /* Find the type name. */
269 tree type_decl
= TYPE_STUB_DECL (type
);
271 const char *name
= 0;
272 if (TREE_CODE (t
) == TYPE_DECL
)
275 name
= IDENTIFIER_POINTER (t
);
277 fprintf (stderr
, " struct %d %s %s %s %s %d %p %s\n",
279 DECL_IN_SYSTEM_HEADER (type_decl
) ? "sys" : "usr",
280 matches
? "bas" : "hdr",
281 generic
? "gen" : "ord",
282 usage
== DINFO_USAGE_DFN
? ";" :
283 usage
== DINFO_USAGE_DIR_USE
? "." : "*",
285 (void*) type_decl
, name
);
288 #define DUMP_GSTRUCT(type, usage, criterion, generic, matches, result) \
289 dump_struct_debug (type, usage, criterion, generic, matches, result)
293 #define DUMP_GSTRUCT(type, usage, criterion, generic, matches, result) \
300 should_emit_struct_debug (tree type
, enum debug_info_usage usage
)
302 enum debug_struct_file criterion
;
304 bool generic
= lang_hooks
.types
.generic_p (type
);
307 criterion
= debug_struct_generic
[usage
];
309 criterion
= debug_struct_ordinary
[usage
];
311 if (criterion
== DINFO_STRUCT_FILE_NONE
)
312 return DUMP_GSTRUCT (type
, usage
, criterion
, generic
, false, false);
313 if (criterion
== DINFO_STRUCT_FILE_ANY
)
314 return DUMP_GSTRUCT (type
, usage
, criterion
, generic
, false, true);
316 type_decl
= TYPE_STUB_DECL (type
);
318 if (criterion
== DINFO_STRUCT_FILE_SYS
&& DECL_IN_SYSTEM_HEADER (type_decl
))
319 return DUMP_GSTRUCT (type
, usage
, criterion
, generic
, false, true);
321 if (matches_main_base (DECL_SOURCE_FILE (type_decl
)))
322 return DUMP_GSTRUCT (type
, usage
, criterion
, generic
, true, true);
323 return DUMP_GSTRUCT (type
, usage
, criterion
, generic
, false, false);
326 /* Nonzero means use GNU-only extensions in the generated symbolic
327 debugging information. Currently, this only has an effect when
328 write_symbols is set to DBX_DEBUG, XCOFF_DEBUG, or DWARF_DEBUG. */
329 bool use_gnu_debug_info_extensions
;
331 /* The default visibility for all symbols (unless overridden) */
332 enum symbol_visibility default_visibility
= VISIBILITY_DEFAULT
;
334 /* Global visibility options. */
335 struct visibility_flags visibility_options
;
337 /* What to print when a switch has no documentation. */
338 #ifdef ENABLE_CHECKING
339 static const char undocumented_msg
[] = N_("This switch lacks documentation");
341 static const char undocumented_msg
[] = "";
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
;
352 /* Functions excluded from profiling. */
354 typedef char *char_p
; /* For DEF_VEC_P. */
356 DEF_VEC_ALLOC_P(char_p
,heap
);
358 static VEC(char_p
,heap
) *flag_instrument_functions_exclude_functions
;
359 static VEC(char_p
,heap
) *flag_instrument_functions_exclude_files
;
361 typedef const char *const_char_p
; /* For DEF_VEC_P. */
362 DEF_VEC_P(const_char_p
);
363 DEF_VEC_ALLOC_P(const_char_p
,heap
);
365 static VEC(const_char_p
,heap
) *ignored_options
;
367 /* Function calls disallowed under -Wdisallowed-function-list=... */
368 static VEC(char_p
,heap
) *warning_disallowed_functions
;
370 /* If -Wdisallowed-function-list=... */
371 bool warn_disallowed_functions
= false;
373 /* Input file names. */
374 const char **in_fnames
;
375 unsigned num_in_fnames
;
377 static int common_handle_option (size_t scode
, const char *arg
, int value
,
378 unsigned int lang_mask
);
379 static void handle_param (const char *);
380 static void set_Wextra (int);
381 static unsigned int handle_option (const char **argv
, unsigned int lang_mask
);
382 static char *write_langs (unsigned int lang_mask
);
383 static void complain_wrong_lang (const char *, const struct cl_option
*,
384 unsigned int lang_mask
);
385 static void handle_options (unsigned int, const char **, unsigned int);
386 static void set_debug_level (enum debug_info_type type
, int extended
,
389 /* If ARG is a non-negative integer made up solely of digits, return its
390 value, otherwise return -1. */
392 integral_argument (const char *arg
)
396 while (*p
&& ISDIGIT (*p
))
405 /* Return a malloced slash-separated list of languages in MASK. */
407 write_langs (unsigned int mask
)
409 unsigned int n
= 0, len
= 0;
410 const char *lang_name
;
413 for (n
= 0; (lang_name
= lang_names
[n
]) != 0; n
++)
414 if (mask
& (1U << n
))
415 len
+= strlen (lang_name
) + 1;
417 result
= XNEWVEC (char, len
);
419 for (n
= 0; (lang_name
= lang_names
[n
]) != 0; n
++)
420 if (mask
& (1U << n
))
424 strcpy (result
+ len
, lang_name
);
425 len
+= strlen (lang_name
);
433 /* Complain that switch OPT_INDEX does not apply to this front end. */
435 complain_wrong_lang (const char *text
, const struct cl_option
*option
,
436 unsigned int lang_mask
)
438 char *ok_langs
, *bad_lang
;
440 ok_langs
= write_langs (option
->flags
);
441 bad_lang
= write_langs (lang_mask
);
443 /* Eventually this should become a hard error IMO. */
444 warning (0, "command line option \"%s\" is valid for %s but not for %s",
445 text
, ok_langs
, bad_lang
);
451 /* Buffer the unknown option described by the string OPT. Currently,
452 we only complain about unknown -Wno-* options if they may have
453 prevented a diagnostic. Otherwise, we just ignore them.
454 Note that if we do complain, it is only as a warning, not an error;
455 passing the compiler an unrecognised -Wno-* option should never
456 change whether the compilation succeeds or fails. */
458 static void postpone_unknown_option_warning(const char *opt
)
460 VEC_safe_push (const_char_p
, heap
, ignored_options
, opt
);
463 /* Produce a warning for each option previously buffered. */
465 void print_ignored_options (void)
467 location_t saved_loc
= input_location
;
471 while (!VEC_empty (const_char_p
, ignored_options
))
474 opt
= VEC_pop (const_char_p
, ignored_options
);
475 warning (0, "unrecognized command line option \"%s\"", opt
);
478 input_location
= saved_loc
;
481 /* Handle the switch beginning at ARGV for the language indicated by
482 LANG_MASK. Returns the number of switches consumed. */
484 handle_option (const char **argv
, unsigned int lang_mask
)
487 const char *opt
, *arg
= 0;
490 unsigned int result
= 0;
491 const struct cl_option
*option
;
495 opt_index
= find_opt (opt
+ 1, lang_mask
| CL_COMMON
| CL_TARGET
);
496 if (opt_index
== cl_options_count
497 && (opt
[1] == 'W' || opt
[1] == 'f' || opt
[1] == 'm')
498 && opt
[2] == 'n' && opt
[3] == 'o' && opt
[4] == '-')
500 /* Drop the "no-" from negative switches. */
501 size_t len
= strlen (opt
) - 3;
503 dup
= XNEWVEC (char, len
+ 1);
506 memcpy (dup
+ 2, opt
+ 5, len
- 2 + 1);
509 opt_index
= find_opt (opt
+ 1, lang_mask
| CL_COMMON
| CL_TARGET
);
510 if (opt_index
== cl_options_count
&& opt
[1] == 'W')
512 /* We don't generate warnings for unknown -Wno-* options
513 unless we issue diagnostics. */
514 postpone_unknown_option_warning (argv
[0]);
520 if (opt_index
== cl_options_count
)
523 option
= &cl_options
[opt_index
];
525 /* Reject negative form of switches that don't take negatives as
527 if (!value
&& (option
->flags
& CL_REJECT_NEGATIVE
))
530 /* We've recognized this switch. */
533 /* Check to see if the option is disabled for this configuration. */
534 if (option
->flags
& CL_DISABLED
)
536 error ("command line option %qs"
537 " is not supported by this configuration", opt
);
541 /* Sort out any argument the switch takes. */
542 if (option
->flags
& CL_JOINED
)
544 /* Have arg point to the original switch. This is because
545 some code, such as disable_builtin_function, expects its
546 argument to be persistent until the program exits. */
547 arg
= argv
[0] + cl_options
[opt_index
].opt_len
+ 1;
549 arg
+= strlen ("no-");
551 if (*arg
== '\0' && !(option
->flags
& CL_MISSING_OK
))
553 if (option
->flags
& CL_SEPARATE
)
559 /* Missing argument. */
563 else if (option
->flags
& CL_SEPARATE
)
569 /* Now we've swallowed any potential argument, complain if this
570 is a switch for a different front end. */
571 if (!(option
->flags
& (lang_mask
| CL_COMMON
| CL_TARGET
)))
573 complain_wrong_lang (argv
[0], option
, lang_mask
);
576 else if ((option
->flags
& CL_TARGET
)
577 && (option
->flags
& CL_LANG_ALL
)
578 && !(option
->flags
& lang_mask
))
580 /* Complain for target flag language mismatches if any languages
582 complain_wrong_lang (argv
[0], option
, lang_mask
);
586 if (arg
== NULL
&& (option
->flags
& (CL_JOINED
| CL_SEPARATE
)))
588 if (!lang_hooks
.missing_argument (opt
, opt_index
))
589 error ("missing argument to \"%s\"", opt
);
593 /* If the switch takes an integer, convert it. */
594 if (arg
&& (option
->flags
& CL_UINTEGER
))
596 value
= integral_argument (arg
);
599 error ("argument to \"%s\" should be a non-negative integer",
605 if (option
->flag_var
)
606 switch (option
->var_type
)
609 *(int *) option
->flag_var
= value
;
613 *(int *) option
->flag_var
= (value
615 : !option
->var_value
);
620 if ((value
!= 0) == (option
->var_type
== CLVC_BIT_SET
))
621 *(int *) option
->flag_var
|= option
->var_value
;
623 *(int *) option
->flag_var
&= ~option
->var_value
;
624 if (option
->flag_var
== &target_flags
)
625 target_flags_explicit
|= option
->var_value
;
629 *(const char **) option
->flag_var
= arg
;
633 if (option
->flags
& lang_mask
)
634 if (lang_hooks
.handle_option (opt_index
, arg
, value
) == 0)
637 if (result
&& (option
->flags
& CL_COMMON
))
638 if (common_handle_option (opt_index
, arg
, value
, lang_mask
) == 0)
641 if (result
&& (option
->flags
& CL_TARGET
))
642 if (!targetm
.handle_option (opt_index
, arg
, value
))
651 /* Handle FILENAME from the command line. */
653 add_input_filename (const char *filename
)
656 in_fnames
= XRESIZEVEC (const char *, in_fnames
, num_in_fnames
);
657 in_fnames
[num_in_fnames
- 1] = filename
;
660 /* Add comma-separated strings to a char_p vector. */
663 add_comma_separated_to_vector (VEC(char_p
,heap
) **pvec
, const char* arg
)
670 /* We never free this string. */
683 VEC_safe_push (char_p
, heap
, *pvec
, token_start
);
686 if (*r
== '\\' && r
[1] == ',')
694 if (*token_start
!= '\0')
695 VEC_safe_push (char_p
, heap
, *pvec
, token_start
);
698 /* Return whether we should exclude FNDECL from instrumentation. */
701 flag_instrument_functions_exclude_p (tree fndecl
)
703 if (VEC_length (char_p
, flag_instrument_functions_exclude_functions
) > 0)
709 name
= lang_hooks
.decl_printable_name (fndecl
, 0);
711 VEC_iterate (char_p
, flag_instrument_functions_exclude_functions
,
715 if (strstr (name
, s
) != NULL
)
720 if (VEC_length (char_p
, flag_instrument_functions_exclude_files
) > 0)
726 name
= DECL_SOURCE_FILE (fndecl
);
728 VEC_iterate (char_p
, flag_instrument_functions_exclude_files
, i
, s
);
731 if (strstr (name
, s
) != NULL
)
740 /* Return whether this function call is disallowed. */
742 warn_if_disallowed_function_p (const_tree exp
)
744 if (TREE_CODE(exp
) == CALL_EXPR
745 && VEC_length (char_p
, warning_disallowed_functions
) > 0)
750 IDENTIFIER_POINTER (DECL_NAME (get_callee_fndecl (exp
)));
751 for (i
= 0; VEC_iterate (char_p
, warning_disallowed_functions
, i
, s
);
754 if (strcmp (fnname
, s
) == 0)
756 warning (OPT_Wdisallowed_function_list_
,
757 "disallowed call to %qs", fnname
);
764 /* Decode and handle the vector of command line options. LANG_MASK
765 contains has a single bit set representing the current
768 handle_options (unsigned int argc
, const char **argv
, unsigned int lang_mask
)
772 for (i
= 1; i
< argc
; i
+= n
)
774 const char *opt
= argv
[i
];
776 /* Interpret "-" or a non-switch as a file name. */
777 if (opt
[0] != '-' || opt
[1] == '\0')
779 if (main_input_filename
== NULL
)
781 main_input_filename
= opt
;
782 main_input_baselength
783 = base_of_path (main_input_filename
, &main_input_basename
);
785 add_input_filename (opt
);
790 n
= handle_option (argv
+ i
, lang_mask
);
795 error ("unrecognized command line option \"%s\"", opt
);
800 /* Parse command line options and set default flag values. Do minimal
801 options processing. */
803 decode_options (unsigned int argc
, const char **argv
)
805 static bool first_time_p
= true;
806 static int initial_max_aliased_vops
;
807 static int initial_avg_aliased_vops
;
808 static int initial_min_crossjump_insns
;
809 static int initial_max_fields_for_field_sensitive
;
810 static unsigned int initial_lang_mask
;
812 unsigned int i
, lang_mask
;
820 /* Perform language-specific options initialization. */
821 initial_lang_mask
= lang_mask
= lang_hooks
.init_options (argc
, argv
);
823 lang_hooks
.initialize_diagnostics (global_dc
);
825 /* Save initial values of parameters we reset. */
826 initial_max_aliased_vops
= MAX_ALIASED_VOPS
;
827 initial_avg_aliased_vops
= AVG_ALIASED_VOPS
;
828 initial_min_crossjump_insns
829 = compiler_params
[PARAM_MIN_CROSSJUMP_INSNS
].value
;
830 initial_max_fields_for_field_sensitive
831 = compiler_params
[PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE
].value
;
834 lang_mask
= initial_lang_mask
;
836 /* Scan to see what optimization level has been specified. That will
837 determine the default value of many flags. */
838 for (i
= 1; i
< argc
; i
++)
840 if (!strcmp (argv
[i
], "-O"))
845 else if (argv
[i
][0] == '-' && argv
[i
][1] == 'O')
847 /* Handle -Os, -O2, -O3, -O69, ... */
848 const char *p
= &argv
[i
][2];
850 if ((p
[0] == 's') && (p
[1] == 0))
854 /* Optimizing for size forces optimize to be 2. */
859 const int optimize_val
= read_integral_parameter (p
, p
- 2, -1);
860 if (optimize_val
!= -1)
862 optimize
= optimize_val
;
869 if (!flag_unit_at_a_time
)
871 flag_section_anchors
= 0;
872 flag_toplevel_reorder
= 0;
874 if (!flag_toplevel_reorder
)
876 if (flag_section_anchors
== 1)
877 error ("Section anchors must be disabled when toplevel reorder is disabled.");
878 flag_section_anchors
= 0;
881 /* Originally we just set the variables if a particular optimization level,
882 but with the advent of being able to change the optimization level for a
883 function, we need to reset optimizations. */
886 flag_merge_constants
= 0;
888 /* We disable toplevel reordering at -O0 to disable transformations that
889 might be surprising to end users and to get -fno-toplevel-reorder
890 tested, but we keep section anchors. */
891 if (flag_toplevel_reorder
== 2)
892 flag_toplevel_reorder
= 0;
895 flag_merge_constants
= 1;
897 /* -O1 optimizations. */
898 opt1
= (optimize
>= 1);
899 flag_defer_pop
= opt1
;
901 flag_delayed_branch
= opt1
;
903 #ifdef CAN_DEBUG_WITHOUT_FP
904 flag_omit_frame_pointer
= opt1
;
906 flag_guess_branch_prob
= opt1
;
907 flag_cprop_registers
= opt1
;
908 flag_if_conversion
= opt1
;
909 flag_if_conversion2
= opt1
;
910 flag_ipa_pure_const
= opt1
;
911 flag_ipa_reference
= opt1
;
912 flag_split_wide_types
= opt1
;
913 flag_tree_ccp
= opt1
;
914 flag_tree_dce
= opt1
;
915 flag_tree_dom
= opt1
;
916 flag_tree_dse
= opt1
;
917 flag_tree_ter
= opt1
;
918 flag_tree_sra
= opt1
;
919 flag_tree_copyrename
= opt1
;
920 flag_tree_fre
= opt1
;
921 flag_tree_copy_prop
= opt1
;
922 flag_tree_sink
= opt1
;
925 /* -O2 optimizations. */
926 opt2
= (optimize
>= 2);
927 flag_inline_small_functions
= opt2
;
928 flag_indirect_inlining
= opt2
;
929 flag_thread_jumps
= opt2
;
930 flag_crossjumping
= opt2
;
931 flag_optimize_sibling_calls
= opt2
;
932 flag_forward_propagate
= opt2
;
933 flag_cse_follow_jumps
= opt2
;
935 flag_expensive_optimizations
= opt2
;
936 flag_rerun_cse_after_loop
= opt2
;
937 flag_caller_saves
= opt2
;
938 flag_peephole2
= opt2
;
939 #ifdef INSN_SCHEDULING
940 flag_schedule_insns
= opt2
;
941 flag_schedule_insns_after_reload
= opt2
;
944 flag_strict_aliasing
= opt2
;
945 flag_strict_overflow
= opt2
;
946 flag_delete_null_pointer_checks
= opt2
;
947 flag_reorder_blocks
= opt2
;
948 flag_reorder_functions
= opt2
;
949 flag_tree_store_ccp
= opt2
;
950 flag_tree_vrp
= opt2
;
951 flag_tree_builtin_call_dce
= opt2
;
952 flag_tree_pre
= opt2
;
953 flag_tree_switch_conversion
= 1;
955 /* Allow more virtual operators to increase alias precision. */
957 set_param_value ("max-aliased-vops",
958 (opt2
) ? 500 : initial_max_aliased_vops
);
960 /* Track fields in field-sensitive alias analysis. */
961 set_param_value ("max-fields-for-field-sensitive",
962 (opt2
) ? 100 : initial_max_fields_for_field_sensitive
);
964 /* -O3 optimizations. */
965 opt3
= (optimize
>= 3);
966 flag_predictive_commoning
= opt3
;
967 flag_inline_functions
= opt3
;
968 flag_unswitch_loops
= opt3
;
969 flag_gcse_after_reload
= opt3
;
970 flag_tree_vectorize
= opt3
;
972 /* Allow even more virtual operators. Max-aliased-vops was set above for
973 -O2, so don't reset it unless we are at -O3. */
975 set_param_value ("max-aliased-vops", 1000);
977 set_param_value ("avg-aliased-vops", (opt3
) ? 3 : initial_avg_aliased_vops
);
979 /* Just -O1/-O0 optimizations. */
980 opt1_max
= (optimize
<= 1);
981 align_loops
= opt1_max
;
982 align_jumps
= opt1_max
;
983 align_labels
= opt1_max
;
984 align_functions
= opt1_max
;
988 /* Loop header copying usually increases size of the code. This used not to
989 be true, since quite often it is possible to verify that the condition is
990 satisfied in the first iteration and therefore to eliminate it. Jump
991 threading handles these cases now. */
994 /* Conditional DCE generates bigger code. */
995 flag_tree_builtin_call_dce
= 0;
997 /* PRE tends to generate bigger code. */
1000 /* These options are set with -O3, so reset for -Os */
1001 flag_predictive_commoning
= 0;
1002 flag_inline_functions
= 0;
1003 flag_unswitch_loops
= 0;
1004 flag_gcse_after_reload
= 0;
1005 flag_tree_vectorize
= 0;
1007 /* Don't reorder blocks when optimizing for size because extra jump insns may
1008 be created; also barrier may create extra padding.
1010 More correctly we should have a block reordering mode that tried to
1011 minimize the combined size of all the jumps. This would more or less
1012 automatically remove extra jumps, but would also try to use more short
1013 jumps instead of long jumps. */
1014 flag_reorder_blocks
= 0;
1015 flag_reorder_blocks_and_partition
= 0;
1017 /* Inlining of functions reducing size is a good idea regardless of them
1018 being declared inline. */
1019 flag_inline_functions
= 1;
1021 /* Don't align code. */
1025 align_functions
= 1;
1027 /* Unroll/prefetch switches that may be set on the command line, and tend to
1028 generate bigger code. */
1029 flag_unroll_loops
= 0;
1030 flag_unroll_all_loops
= 0;
1031 flag_prefetch_loop_arrays
= 0;
1033 /* Basic optimization options. */
1038 /* We want to crossjump as much as possible. */
1039 set_param_value ("min-crossjump-insns", 1);
1042 set_param_value ("min-crossjump-insns", initial_min_crossjump_insns
);
1046 /* Initialize whether `char' is signed. */
1047 flag_signed_char
= DEFAULT_SIGNED_CHAR
;
1048 /* Set this to a special "uninitialized" value. The actual default is
1049 set after target options have been processed. */
1050 flag_short_enums
= 2;
1052 /* Initialize target_flags before OPTIMIZATION_OPTIONS so the latter can
1054 target_flags
= targetm
.default_target_flags
;
1056 /* Some targets have ABI-specified unwind tables. */
1057 flag_unwind_tables
= targetm
.unwind_tables_default
;
1060 #ifdef OPTIMIZATION_OPTIONS
1061 /* Allow default optimizations to be specified on a per-machine basis. */
1062 OPTIMIZATION_OPTIONS (optimize
, optimize_size
);
1065 handle_options (argc
, argv
, lang_mask
);
1070 flag_pic
= flag_pie
;
1071 if (flag_pic
&& !flag_pie
)
1077 /* Inlining does not work if not optimizing,
1078 so force it not to be done. */
1083 /* The optimization to partition hot and cold basic blocks into separate
1084 sections of the .o and executable files does not work (currently)
1085 with exception handling. This is because there is no support for
1086 generating unwind info. If flag_exceptions is turned on we need to
1087 turn off the partitioning optimization. */
1089 if (flag_exceptions
&& flag_reorder_blocks_and_partition
)
1091 inform (input_location
,
1092 "-freorder-blocks-and-partition does not work with exceptions");
1093 flag_reorder_blocks_and_partition
= 0;
1094 flag_reorder_blocks
= 1;
1097 /* If user requested unwind info, then turn off the partitioning
1100 if (flag_unwind_tables
&& ! targetm
.unwind_tables_default
1101 && flag_reorder_blocks_and_partition
)
1103 inform (input_location
, "-freorder-blocks-and-partition does not support unwind info");
1104 flag_reorder_blocks_and_partition
= 0;
1105 flag_reorder_blocks
= 1;
1108 /* If the target requested unwind info, then turn off the partitioning
1109 optimization with a different message. Likewise, if the target does not
1110 support named sections. */
1112 if (flag_reorder_blocks_and_partition
1113 && (!targetm
.have_named_sections
1114 || (flag_unwind_tables
&& targetm
.unwind_tables_default
)))
1116 inform (input_location
,
1117 "-freorder-blocks-and-partition does not work on this architecture");
1118 flag_reorder_blocks_and_partition
= 0;
1119 flag_reorder_blocks
= 1;
1122 /* Save the current optimization options if this is the first call. */
1125 optimization_default_node
= build_optimization_node ();
1126 optimization_current_node
= optimization_default_node
;
1127 first_time_p
= false;
1131 #define LEFT_COLUMN 27
1133 /* Output ITEM, of length ITEM_WIDTH, in the left column,
1134 followed by word-wrapped HELP in a second column. */
1136 wrap_help (const char *help
,
1138 unsigned int item_width
,
1139 unsigned int columns
)
1141 unsigned int col_width
= LEFT_COLUMN
;
1142 unsigned int remaining
, room
, len
;
1144 remaining
= strlen (help
);
1148 room
= columns
- 3 - MAX (col_width
, item_width
);
1157 for (i
= 0; help
[i
]; i
++)
1159 if (i
>= room
&& len
!= remaining
)
1163 else if ((help
[i
] == '-' || help
[i
] == '/')
1164 && help
[i
+ 1] != ' '
1165 && i
> 0 && ISALPHA (help
[i
- 1]))
1170 printf( " %-*.*s %.*s\n", col_width
, item_width
, item
, len
, help
);
1172 while (help
[len
] == ' ')
1180 /* Print help for a specific front-end, etc. */
1182 print_filtered_help (unsigned int include_flags
,
1183 unsigned int exclude_flags
,
1184 unsigned int any_flags
,
1185 unsigned int columns
)
1189 static char *printed
= NULL
;
1191 bool displayed
= false;
1193 if (include_flags
== CL_PARAMS
)
1195 for (i
= 0; i
< LAST_PARAM
; i
++)
1197 const char *param
= compiler_params
[i
].option
;
1199 help
= compiler_params
[i
].help
;
1200 if (help
== NULL
|| *help
== '\0')
1202 if (exclude_flags
& CL_UNDOCUMENTED
)
1204 help
= undocumented_msg
;
1207 /* Get the translation. */
1210 wrap_help (help
, param
, strlen (param
), columns
);
1217 printed
= XCNEWVAR (char, cl_options_count
);
1219 for (i
= 0; i
< cl_options_count
; i
++)
1221 static char new_help
[128];
1222 const struct cl_option
*option
= cl_options
+ i
;
1227 if (include_flags
== 0
1228 || ((option
->flags
& include_flags
) != include_flags
))
1230 if ((option
->flags
& any_flags
) == 0)
1234 /* Skip unwanted switches. */
1235 if ((option
->flags
& exclude_flags
) != 0)
1239 /* Skip switches that have already been printed. */
1245 help
= option
->help
;
1248 if (exclude_flags
& CL_UNDOCUMENTED
)
1250 help
= undocumented_msg
;
1253 /* Get the translation. */
1256 /* Find the gap between the name of the
1257 option and its descriptive text. */
1258 tab
= strchr (help
, '\t');
1267 opt
= option
->opt_text
;
1271 /* With the -Q option enabled we change the descriptive text associated
1272 with an option to be an indication of its current setting. */
1275 if (len
< (LEFT_COLUMN
+ 2))
1276 strcpy (new_help
, "\t\t");
1278 strcpy (new_help
, "\t");
1280 if (option
->flag_var
!= NULL
)
1282 if (option
->flags
& CL_JOINED
)
1284 if (option
->var_type
== CLVC_STRING
)
1286 if (* (const char **) option
->flag_var
!= NULL
)
1287 snprintf (new_help
+ strlen (new_help
),
1288 sizeof (new_help
) - strlen (new_help
),
1289 * (const char **) option
->flag_var
);
1292 sprintf (new_help
+ strlen (new_help
),
1293 "%#x", * (int *) option
->flag_var
);
1296 strcat (new_help
, option_enabled (i
)
1297 ? _("[enabled]") : _("[disabled]"));
1303 wrap_help (help
, opt
, len
, columns
);
1309 unsigned int langs
= include_flags
& CL_LANG_ALL
;
1312 printf (_(" No options with the desired characteristics were found\n"));
1317 /* PR 31349: Tell the user how to see all of the
1318 options supported by a specific front end. */
1319 for (i
= 0; (1U << i
) < CL_LANG_ALL
; i
++)
1320 if ((1U << i
) & langs
)
1321 printf (_(" None found. Use --help=%s to show *all* the options supported by the %s front-end\n"),
1322 lang_names
[i
], lang_names
[i
]);
1326 else if (! displayed
)
1327 printf (_(" All options with the desired characteristics have already been displayed\n"));
1332 /* Display help for a specified type of option.
1333 The options must have ALL of the INCLUDE_FLAGS set
1334 ANY of the flags in the ANY_FLAGS set
1335 and NONE of the EXCLUDE_FLAGS set. */
1337 print_specific_help (unsigned int include_flags
,
1338 unsigned int exclude_flags
,
1339 unsigned int any_flags
)
1341 unsigned int all_langs_mask
= (1U << cl_lang_count
) - 1;
1342 const char * description
= NULL
;
1343 const char * descrip_extra
= "";
1346 static unsigned int columns
= 0;
1348 /* Sanity check: Make sure that we do not have more
1349 languages than we have bits available to enumerate them. */
1350 gcc_assert ((1U << cl_lang_count
) < CL_MIN_OPTION_CLASS
);
1352 /* If we have not done so already, obtain
1353 the desired maximum width of the output. */
1358 GET_ENVIRONMENT (p
, "COLUMNS");
1361 int value
= atoi (p
);
1368 /* Use a reasonable default. */
1372 /* Decide upon the title for the options that we are going to display. */
1373 for (i
= 0, flag
= 1; flag
<= CL_MAX_OPTION_CLASS
; flag
<<= 1, i
++)
1375 switch (flag
& include_flags
)
1381 description
= _("The following options are target specific");
1384 description
= _("The following options control compiler warning messages");
1386 case CL_OPTIMIZATION
:
1387 description
= _("The following options control optimizations");
1390 description
= _("The following options are language-independent");
1393 description
= _("The --param option recognizes the following as parameters");
1396 if (i
>= cl_lang_count
)
1398 if ((exclude_flags
& ((1U << cl_lang_count
) - 1)) != 0)
1399 description
= _("The following options are specific to just the language ");
1401 description
= _("The following options are supported by the language ");
1402 descrip_extra
= lang_names
[i
];
1407 if (description
== NULL
)
1411 if (include_flags
== CL_UNDOCUMENTED
)
1412 description
= _("The following options are not documented");
1415 internal_error ("unrecognized include_flags 0x%x passed to print_specific_help",
1422 if (any_flags
& all_langs_mask
)
1423 description
= _("The following options are language-related");
1425 description
= _("The following options are language-independent");
1429 printf ("%s%s:\n", description
, descrip_extra
);
1430 print_filtered_help (include_flags
, exclude_flags
, any_flags
, columns
);
1433 /* Handle target- and language-independent options. Return zero to
1434 generate an "unknown option" message. Only options that need
1435 extra handling need to be listed here; if you simply want
1436 VALUE assigned to a variable, it happens automatically. */
1439 common_handle_option (size_t scode
, const char *arg
, int value
,
1440 unsigned int lang_mask
)
1442 static bool verbose
= false;
1443 enum opt_code code
= (enum opt_code
) scode
;
1458 unsigned int all_langs_mask
= (1U << cl_lang_count
) - 1;
1459 unsigned int undoc_mask
;
1462 undoc_mask
= (verbose
| extra_warnings
) ? 0 : CL_UNDOCUMENTED
;
1463 /* First display any single language specific options. */
1464 for (i
= 0; i
< cl_lang_count
; i
++)
1466 (1U << i
, (all_langs_mask
& (~ (1U << i
))) | undoc_mask
, 0);
1467 /* Next display any multi language specific options. */
1468 print_specific_help (0, undoc_mask
, all_langs_mask
);
1469 /* Then display any remaining, non-language options. */
1470 for (i
= CL_MIN_OPTION_CLASS
; i
<= CL_MAX_OPTION_CLASS
; i
<<= 1)
1471 print_specific_help (i
, undoc_mask
, 0);
1472 exit_after_options
= true;
1476 case OPT_ftarget_help
:
1477 case OPT__target_help
:
1478 print_specific_help (CL_TARGET
, CL_UNDOCUMENTED
, 0);
1479 exit_after_options
= true;
1481 /* Allow the target a chance to give the user some additional information. */
1482 if (targetm
.target_help
)
1483 targetm
.target_help ();
1489 const char * a
= arg
;
1490 unsigned int include_flags
= 0;
1491 /* Note - by default we include undocumented options when listing
1492 specific classes. If you only want to see documented options
1493 then add ",^undocumented" to the --help= option. E.g.:
1495 --help=target,^undocumented */
1496 unsigned int exclude_flags
= 0;
1498 /* Walk along the argument string, parsing each word in turn.
1500 arg = [^]{word}[,{arg}]
1501 word = {optimizers|target|warnings|undocumented|
1502 params|common|<language>} */
1507 const char * string
;
1512 { "optimizers", CL_OPTIMIZATION
},
1513 { "target", CL_TARGET
},
1514 { "warnings", CL_WARNING
},
1515 { "undocumented", CL_UNDOCUMENTED
},
1516 { "params", CL_PARAMS
},
1517 { "joined", CL_JOINED
},
1518 { "separate", CL_SEPARATE
},
1519 { "common", CL_COMMON
},
1522 unsigned int * pflags
;
1524 unsigned int lang_flag
, specific_flag
;
1531 pflags
= & exclude_flags
;
1534 pflags
= & include_flags
;
1536 comma
= strchr (a
, ',');
1542 /* Check to see if the string matches an option class name. */
1543 for (i
= 0, specific_flag
= 0; specifics
[i
].string
!= NULL
; i
++)
1544 if (strncasecmp (a
, specifics
[i
].string
, len
) == 0)
1546 specific_flag
= specifics
[i
].flag
;
1550 /* Check to see if the string matches a language name.
1551 Note - we rely upon the alpha-sorted nature of the entries in
1552 the lang_names array, specifically that shorter names appear
1553 before their longer variants. (i.e. C before C++). That way
1554 when we are attempting to match --help=c for example we will
1555 match with C first and not C++. */
1556 for (i
= 0, lang_flag
= 0; i
< cl_lang_count
; i
++)
1557 if (strncasecmp (a
, lang_names
[i
], len
) == 0)
1559 lang_flag
= 1U << i
;
1563 if (specific_flag
!= 0)
1566 * pflags
|= specific_flag
;
1569 /* The option's argument matches both the start of a
1570 language name and the start of an option class name.
1571 We have a special case for when the user has
1572 specified "--help=c", but otherwise we have to issue
1574 if (strncasecmp (a
, "c", len
) == 0)
1575 * pflags
|= lang_flag
;
1578 "warning: --help argument %.*s is ambiguous, please be more specific\n",
1582 else if (lang_flag
!= 0)
1583 * pflags
|= lang_flag
;
1586 "warning: unrecognized argument to --help= option: %.*s\n",
1595 print_specific_help (include_flags
, exclude_flags
, 0);
1596 exit_after_options
= true;
1601 print_version (stderr
, "");
1602 exit_after_options
= true;
1606 g_switch_value
= value
;
1607 g_switch_set
= true;
1612 /* Currently handled in a prescan. */
1616 /* For backward compatibility, -W is the same as -Wextra. */
1620 case OPT_Wdisallowed_function_list_
:
1621 warn_disallowed_functions
= true;
1622 add_comma_separated_to_vector
1623 (&warning_disallowed_functions
, arg
);
1627 enable_warning_as_error (arg
, value
, lang_mask
);
1634 case OPT_Wlarger_than_
:
1635 /* This form corresponds to -Wlarger-than-.
1636 Kept for backward compatibility.
1637 Don't use it as the first argument of warning(). */
1639 case OPT_Wlarger_than_eq
:
1640 larger_than_size
= value
;
1641 warn_larger_than
= value
!= -1;
1644 case OPT_Wframe_larger_than_
:
1645 frame_larger_than_size
= value
;
1646 warn_frame_larger_than
= value
!= -1;
1649 case OPT_Wstrict_aliasing
:
1650 set_Wstrict_aliasing (value
);
1653 case OPT_Wstrict_aliasing_
:
1654 warn_strict_aliasing
= value
;
1657 case OPT_Wstrict_overflow
:
1658 warn_strict_overflow
= (value
1659 ? (int) WARN_STRICT_OVERFLOW_CONDITIONAL
1663 case OPT_Wstrict_overflow_
:
1664 warn_strict_overflow
= value
;
1668 warn_unused
= value
;
1673 aux_info_file_name
= arg
;
1674 flag_gen_aux_info
= 1;
1678 aux_base_name
= arg
;
1681 case OPT_auxbase_strip
:
1683 char *tmp
= xstrdup (arg
);
1684 strip_off_ending (tmp
, strlen (tmp
));
1686 aux_base_name
= tmp
;
1691 decode_d_option (arg
);
1695 dump_base_name
= arg
;
1698 case OPT_falign_functions_
:
1699 align_functions
= value
;
1702 case OPT_falign_jumps_
:
1703 align_jumps
= value
;
1706 case OPT_falign_labels_
:
1707 align_labels
= value
;
1710 case OPT_falign_loops_
:
1711 align_loops
= value
;
1714 case OPT_fbranch_probabilities
:
1715 flag_branch_probabilities_set
= true;
1718 case OPT_fcall_used_
:
1719 fix_register (arg
, 0, 1);
1722 case OPT_fcall_saved_
:
1723 fix_register (arg
, 0, 0);
1727 dbg_cnt_process_opt (arg
);
1730 case OPT_fdbg_cnt_list
:
1731 dbg_cnt_list_all_counters ();
1734 case OPT_fdebug_prefix_map_
:
1735 add_debug_prefix_map (arg
);
1738 case OPT_fdiagnostics_show_location_
:
1739 if (!strcmp (arg
, "once"))
1740 diagnostic_prefixing_rule (global_dc
) = DIAGNOSTICS_SHOW_PREFIX_ONCE
;
1741 else if (!strcmp (arg
, "every-line"))
1742 diagnostic_prefixing_rule (global_dc
)
1743 = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE
;
1748 case OPT_fdiagnostics_show_option
:
1749 global_dc
->show_option_requested
= true;
1753 if (!dump_switch_p (arg
))
1757 case OPT_ffast_math
:
1758 set_fast_math_flags (value
);
1761 case OPT_funsafe_math_optimizations
:
1762 set_unsafe_math_optimizations_flags (value
);
1766 fix_register (arg
, 1, 1);
1769 case OPT_finline_limit_
:
1770 case OPT_finline_limit_eq
:
1771 set_param_value ("max-inline-insns-single", value
/ 2);
1772 set_param_value ("max-inline-insns-auto", value
/ 2);
1775 case OPT_finstrument_functions_exclude_function_list_
:
1776 add_comma_separated_to_vector
1777 (&flag_instrument_functions_exclude_functions
, arg
);
1780 case OPT_finstrument_functions_exclude_file_list_
:
1781 add_comma_separated_to_vector
1782 (&flag_instrument_functions_exclude_files
, arg
);
1785 case OPT_fmessage_length_
:
1786 pp_set_line_maximum_length (global_dc
->printer
, value
);
1789 case OPT_fpack_struct_
:
1790 if (value
<= 0 || (value
& (value
- 1)) || value
> 16)
1791 error ("structure alignment must be a small power of two, not %d", value
);
1794 initial_max_fld_align
= value
;
1795 maximum_field_alignment
= value
* BITS_PER_UNIT
;
1799 case OPT_fpeel_loops
:
1800 flag_peel_loops_set
= true;
1803 case OPT_fprofile_arcs
:
1804 profile_arc_flag_set
= true;
1807 case OPT_finline_functions
:
1808 flag_inline_functions_set
= true;
1811 case OPT_fprofile_dir_
:
1812 profile_data_prefix
= xstrdup (arg
);
1815 case OPT_fprofile_use_
:
1816 profile_data_prefix
= xstrdup (arg
);
1817 flag_profile_use
= true;
1819 /* No break here - do -fprofile-use processing. */
1820 case OPT_fprofile_use
:
1821 if (!flag_branch_probabilities_set
)
1822 flag_branch_probabilities
= value
;
1823 if (!flag_profile_values_set
)
1824 flag_profile_values
= value
;
1825 if (!flag_unroll_loops_set
)
1826 flag_unroll_loops
= value
;
1827 if (!flag_peel_loops_set
)
1828 flag_peel_loops
= value
;
1829 if (!flag_tracer_set
)
1830 flag_tracer
= value
;
1831 if (!flag_value_profile_transformations_set
)
1832 flag_value_profile_transformations
= value
;
1833 if (!flag_inline_functions_set
)
1834 flag_inline_functions
= value
;
1837 case OPT_fprofile_generate_
:
1838 profile_data_prefix
= xstrdup (arg
);
1840 /* No break here - do -fprofile-generate processing. */
1841 case OPT_fprofile_generate
:
1842 if (!profile_arc_flag_set
)
1843 profile_arc_flag
= value
;
1844 if (!flag_profile_values_set
)
1845 flag_profile_values
= value
;
1846 if (!flag_value_profile_transformations_set
)
1847 flag_value_profile_transformations
= value
;
1848 if (!flag_inline_functions_set
)
1849 flag_inline_functions
= value
;
1852 case OPT_fprofile_values
:
1853 flag_profile_values_set
= true;
1856 case OPT_fvisibility_
:
1858 if (!strcmp(arg
, "default"))
1859 default_visibility
= VISIBILITY_DEFAULT
;
1860 else if (!strcmp(arg
, "internal"))
1861 default_visibility
= VISIBILITY_INTERNAL
;
1862 else if (!strcmp(arg
, "hidden"))
1863 default_visibility
= VISIBILITY_HIDDEN
;
1864 else if (!strcmp(arg
, "protected"))
1865 default_visibility
= VISIBILITY_PROTECTED
;
1867 error ("unrecognized visibility value \"%s\"", arg
);
1872 flag_value_profile_transformations_set
= true;
1875 case OPT_frandom_seed
:
1876 /* The real switch is -fno-random-seed. */
1879 set_random_seed (NULL
);
1882 case OPT_frandom_seed_
:
1883 set_random_seed (arg
);
1886 case OPT_fsched_verbose_
:
1887 #ifdef INSN_SCHEDULING
1888 fix_sched_param ("verbose", arg
);
1894 case OPT_fsched_stalled_insns_
:
1895 flag_sched_stalled_insns
= value
;
1896 if (flag_sched_stalled_insns
== 0)
1897 flag_sched_stalled_insns
= -1;
1900 case OPT_fsched_stalled_insns_dep_
:
1901 flag_sched_stalled_insns_dep
= value
;
1904 case OPT_fstack_check_
:
1905 if (!strcmp (arg
, "no"))
1906 flag_stack_check
= NO_STACK_CHECK
;
1907 else if (!strcmp (arg
, "generic"))
1908 /* This is the old stack checking method. */
1909 flag_stack_check
= STACK_CHECK_BUILTIN
1910 ? FULL_BUILTIN_STACK_CHECK
1911 : GENERIC_STACK_CHECK
;
1912 else if (!strcmp (arg
, "specific"))
1913 /* This is the new stack checking method. */
1914 flag_stack_check
= STACK_CHECK_BUILTIN
1915 ? FULL_BUILTIN_STACK_CHECK
1916 : STACK_CHECK_STATIC_BUILTIN
1917 ? STATIC_BUILTIN_STACK_CHECK
1918 : GENERIC_STACK_CHECK
;
1920 warning (0, "unknown stack check parameter \"%s\"", arg
);
1923 case OPT_fstack_check
:
1924 /* This is the same as the "specific" mode above. */
1926 flag_stack_check
= STACK_CHECK_BUILTIN
1927 ? FULL_BUILTIN_STACK_CHECK
1928 : STACK_CHECK_STATIC_BUILTIN
1929 ? STATIC_BUILTIN_STACK_CHECK
1930 : GENERIC_STACK_CHECK
;
1932 flag_stack_check
= NO_STACK_CHECK
;
1935 case OPT_fstack_limit
:
1936 /* The real switch is -fno-stack-limit. */
1939 stack_limit_rtx
= NULL_RTX
;
1942 case OPT_fstack_limit_register_
:
1944 int reg
= decode_reg_name (arg
);
1946 error ("unrecognized register name \"%s\"", arg
);
1948 stack_limit_rtx
= gen_rtx_REG (Pmode
, reg
);
1952 case OPT_fstack_limit_symbol_
:
1953 stack_limit_rtx
= gen_rtx_SYMBOL_REF (Pmode
, ggc_strdup (arg
));
1956 case OPT_ftree_vectorizer_verbose_
:
1957 vect_set_verbosity_level (arg
);
1960 case OPT_ftls_model_
:
1961 if (!strcmp (arg
, "global-dynamic"))
1962 flag_tls_default
= TLS_MODEL_GLOBAL_DYNAMIC
;
1963 else if (!strcmp (arg
, "local-dynamic"))
1964 flag_tls_default
= TLS_MODEL_LOCAL_DYNAMIC
;
1965 else if (!strcmp (arg
, "initial-exec"))
1966 flag_tls_default
= TLS_MODEL_INITIAL_EXEC
;
1967 else if (!strcmp (arg
, "local-exec"))
1968 flag_tls_default
= TLS_MODEL_LOCAL_EXEC
;
1970 warning (0, "unknown tls-model \"%s\"", arg
);
1974 flag_tracer_set
= true;
1977 case OPT_funroll_loops
:
1978 flag_unroll_loops_set
= true;
1982 set_debug_level (NO_DEBUG
, DEFAULT_GDB_EXTENSIONS
, arg
);
1986 set_debug_level (SDB_DEBUG
, false, arg
);
1990 set_debug_level (DWARF2_DEBUG
, false, arg
);
1994 set_debug_level (NO_DEBUG
, 2, arg
);
1999 set_debug_level (DBX_DEBUG
, code
== OPT_gstabs_
, arg
);
2003 set_debug_level (VMS_DEBUG
, false, arg
);
2008 set_debug_level (XCOFF_DEBUG
, code
== OPT_gxcoff_
, arg
);
2012 asm_file_name
= arg
;
2015 case OPT_pedantic_errors
:
2016 flag_pedantic_errors
= pedantic
= 1;
2019 case OPT_floop_optimize
:
2020 case OPT_frerun_loop_opt
:
2021 case OPT_fstrength_reduce
:
2022 case OPT_ftree_store_copy_prop
:
2023 case OPT_fforce_addr
:
2024 case OPT_ftree_salias
:
2025 /* These are no-ops, preserved for backward compatibility. */
2029 /* If the flag was handled in a standard way, assume the lack of
2030 processing here is intentional. */
2031 gcc_assert (cl_options
[scode
].flag_var
);
2038 /* Handle --param NAME=VALUE. */
2040 handle_param (const char *carg
)
2045 arg
= xstrdup (carg
);
2046 equal
= strchr (arg
, '=');
2048 error ("%s: --param arguments should be of the form NAME=VALUE", arg
);
2051 value
= integral_argument (equal
+ 1);
2053 error ("invalid --param value %qs", equal
+ 1);
2057 set_param_value (arg
, value
);
2064 /* Handle -W and -Wextra. */
2066 set_Wextra (int setting
)
2068 extra_warnings
= setting
;
2070 /* We save the value of warn_uninitialized, since if they put
2071 -Wuninitialized on the command line, we need to generate a
2072 warning about not using it without also specifying -O. */
2074 warn_uninitialized
= 0;
2075 else if (warn_uninitialized
!= 1)
2076 warn_uninitialized
= 2;
2079 /* Used to set the level of strict aliasing warnings,
2080 when no level is specified (i.e., when -Wstrict-aliasing, and not
2081 -Wstrict-aliasing=level was given).
2082 ONOFF is assumed to take value 1 when -Wstrict-aliasing is specified,
2083 and 0 otherwise. After calling this function, wstrict_aliasing will be
2084 set to the default value of -Wstrict_aliasing=level, currently 3. */
2086 set_Wstrict_aliasing (int onoff
)
2088 gcc_assert (onoff
== 0 || onoff
== 1);
2090 warn_strict_aliasing
= 3;
2092 warn_strict_aliasing
= 0;
2095 /* The following routines are useful in setting all the flags that
2096 -ffast-math and -fno-fast-math imply. */
2098 set_fast_math_flags (int set
)
2100 flag_unsafe_math_optimizations
= set
;
2101 set_unsafe_math_optimizations_flags (set
);
2102 flag_finite_math_only
= set
;
2103 flag_errno_math
= !set
;
2106 flag_signaling_nans
= 0;
2107 flag_rounding_math
= 0;
2108 flag_cx_limited_range
= 1;
2112 /* When -funsafe-math-optimizations is set the following
2113 flags are set as well. */
2115 set_unsafe_math_optimizations_flags (int set
)
2117 flag_trapping_math
= !set
;
2118 flag_signed_zeros
= !set
;
2119 flag_associative_math
= set
;
2120 flag_reciprocal_math
= set
;
2123 /* Return true iff flags are set as if -ffast-math. */
2125 fast_math_flags_set_p (void)
2127 return (!flag_trapping_math
2128 && flag_unsafe_math_optimizations
2129 && flag_finite_math_only
2130 && !flag_signed_zeros
2131 && !flag_errno_math
);
2134 /* Return true iff flags are set as if -ffast-math but using the flags stored
2135 in the struct cl_optimization structure. */
2137 fast_math_flags_struct_set_p (struct cl_optimization
*opt
)
2139 return (!opt
->flag_trapping_math
2140 && opt
->flag_unsafe_math_optimizations
2141 && opt
->flag_finite_math_only
2142 && !opt
->flag_signed_zeros
2143 && !opt
->flag_errno_math
);
2146 /* Handle a debug output -g switch. EXTENDED is true or false to support
2147 extended output (2 is special and means "-ggdb" was given). */
2149 set_debug_level (enum debug_info_type type
, int extended
, const char *arg
)
2151 static bool type_explicit
;
2153 use_gnu_debug_info_extensions
= extended
;
2155 if (type
== NO_DEBUG
)
2157 if (write_symbols
== NO_DEBUG
)
2159 write_symbols
= PREFERRED_DEBUGGING_TYPE
;
2163 #ifdef DWARF2_DEBUGGING_INFO
2164 write_symbols
= DWARF2_DEBUG
;
2165 #elif defined DBX_DEBUGGING_INFO
2166 write_symbols
= DBX_DEBUG
;
2170 if (write_symbols
== NO_DEBUG
)
2171 warning (0, "target system does not support debug output");
2176 /* Does it conflict with an already selected type? */
2177 if (type_explicit
&& write_symbols
!= NO_DEBUG
&& type
!= write_symbols
)
2178 error ("debug format \"%s\" conflicts with prior selection",
2179 debug_type_names
[type
]);
2180 write_symbols
= type
;
2181 type_explicit
= true;
2184 /* A debug flag without a level defaults to level 2. */
2187 if (!debug_info_level
)
2188 debug_info_level
= 2;
2192 debug_info_level
= integral_argument (arg
);
2193 if (debug_info_level
== (unsigned int) -1)
2194 error ("unrecognised debug output level \"%s\"", arg
);
2195 else if (debug_info_level
> 3)
2196 error ("debug output level %s is too high", arg
);
2200 /* Return 1 if OPTION is enabled, 0 if it is disabled, or -1 if it isn't
2201 a simple on-off switch. */
2204 option_enabled (int opt_idx
)
2206 const struct cl_option
*option
= &(cl_options
[opt_idx
]);
2208 if (option
->flag_var
)
2209 switch (option
->var_type
)
2212 return *(int *) option
->flag_var
!= 0;
2215 return *(int *) option
->flag_var
== option
->var_value
;
2217 case CLVC_BIT_CLEAR
:
2218 return (*(int *) option
->flag_var
& option
->var_value
) == 0;
2221 return (*(int *) option
->flag_var
& option
->var_value
) != 0;
2229 /* Fill STATE with the current state of option OPTION. Return true if
2230 there is some state to store. */
2233 get_option_state (int option
, struct cl_option_state
*state
)
2235 if (cl_options
[option
].flag_var
== 0)
2238 switch (cl_options
[option
].var_type
)
2242 state
->data
= cl_options
[option
].flag_var
;
2243 state
->size
= sizeof (int);
2246 case CLVC_BIT_CLEAR
:
2248 state
->ch
= option_enabled (option
);
2249 state
->data
= &state
->ch
;
2254 state
->data
= *(const char **) cl_options
[option
].flag_var
;
2255 if (state
->data
== 0)
2257 state
->size
= strlen ((const char *) state
->data
) + 1;
2263 /* Enable a warning option as an error. This is used by -Werror= and
2264 also by legacy Werror-implicit-function-declaration. */
2267 enable_warning_as_error (const char *arg
, int value
, unsigned int lang_mask
)
2272 new_option
= XNEWVEC (char, strlen (arg
) + 2);
2273 new_option
[0] = 'W';
2274 strcpy (new_option
+ 1, arg
);
2275 option_index
= find_opt (new_option
, lang_mask
);
2276 if (option_index
== N_OPTS
)
2278 error ("-Werror=%s: No option -%s", arg
, new_option
);
2282 int kind
= value
? DK_ERROR
: DK_WARNING
;
2283 diagnostic_classify_diagnostic (global_dc
, option_index
, kind
);
2285 /* -Werror=foo implies -Wfoo. */
2286 if (cl_options
[option_index
].var_type
== CLVC_BOOLEAN
2287 && cl_options
[option_index
].flag_var
2288 && kind
== DK_ERROR
)
2289 *(int *) cl_options
[option_index
].flag_var
= 1;