]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/opts.c
* tree-core.h (tree_base): Fix typo.
[thirdparty/gcc.git] / gcc / opts.c
CommitLineData
2772ef3e 1/* Command line option handling.
5624e564 2 Copyright (C) 2002-2015 Free Software Foundation, Inc.
2772ef3e
NB
3 Contributed by Neil Booth.
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9dcd6f09 9Software Foundation; either version 3, or (at your option) any later
2772ef3e
NB
10version.
11
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
16
17You should have received a copy of the GNU General Public License
9dcd6f09
NC
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
2772ef3e
NB
20
21#include "config.h"
22#include "system.h"
cf03fd63 23#include "intl.h"
2772ef3e 24#include "coretypes.h"
7d5a5747 25#include "opts.h"
903f5c23 26#include "tm.h"
d7b42618 27#include "flags.h"
903caebf 28#include "params.h"
de32c0cb 29#include "diagnostic.h"
5f0f4a3b 30#include "opts-diagnostic.h"
88a00ef7 31#include "insn-attr-common.h"
677f3fa8 32#include "common/common-target.h"
2772ef3e 33
65d4f2cd
MLI
34static void set_Wstrict_aliasing (struct gcc_options *opts, int onoff);
35
a7d0d30f
JM
36/* Indexed by enum debug_info_type. */
37const char *const debug_type_names[] =
38{
39 "none", "stabs", "coff", "dwarf-2", "xcoff", "vms"
40};
41
39ef6592
LC
42/* Parse the -femit-struct-debug-detailed option value
43 and set the flag variables. */
44
45#define MATCH( prefix, string ) \
46 ((strncmp (prefix, string, sizeof prefix - 1) == 0) \
47 ? ((string += sizeof prefix - 1), 1) : 0)
48
49void
299404a1
JM
50set_struct_debug_option (struct gcc_options *opts, location_t loc,
51 const char *spec)
39ef6592
LC
52{
53 /* various labels for comparison */
0576d21f
JM
54 static const char dfn_lbl[] = "dfn:", dir_lbl[] = "dir:", ind_lbl[] = "ind:";
55 static const char ord_lbl[] = "ord:", gen_lbl[] = "gen:";
56 static const char none_lbl[] = "none", any_lbl[] = "any";
57 static const char base_lbl[] = "base", sys_lbl[] = "sys";
39ef6592
LC
58
59 enum debug_struct_file files = DINFO_STRUCT_FILE_ANY;
60 /* Default is to apply to as much as possible. */
61 enum debug_info_usage usage = DINFO_USAGE_NUM_ENUMS;
62 int ord = 1, gen = 1;
63
64 /* What usage? */
65 if (MATCH (dfn_lbl, spec))
66 usage = DINFO_USAGE_DFN;
67 else if (MATCH (dir_lbl, spec))
68 usage = DINFO_USAGE_DIR_USE;
69 else if (MATCH (ind_lbl, spec))
70 usage = DINFO_USAGE_IND_USE;
71
72 /* Generics or not? */
73 if (MATCH (ord_lbl, spec))
74 gen = 0;
75 else if (MATCH (gen_lbl, spec))
76 ord = 0;
77
78 /* What allowable environment? */
79 if (MATCH (none_lbl, spec))
80 files = DINFO_STRUCT_FILE_NONE;
81 else if (MATCH (any_lbl, spec))
82 files = DINFO_STRUCT_FILE_ANY;
83 else if (MATCH (sys_lbl, spec))
84 files = DINFO_STRUCT_FILE_SYS;
85 else if (MATCH (base_lbl, spec))
86 files = DINFO_STRUCT_FILE_BASE;
87 else
299404a1
JM
88 error_at (loc,
89 "argument %qs to %<-femit-struct-debug-detailed%> "
90 "not recognized",
91 spec);
39ef6592
LC
92
93 /* Effect the specification. */
94 if (usage == DINFO_USAGE_NUM_ENUMS)
95 {
96 if (ord)
97 {
69ccdddb
JM
98 opts->x_debug_struct_ordinary[DINFO_USAGE_DFN] = files;
99 opts->x_debug_struct_ordinary[DINFO_USAGE_DIR_USE] = files;
100 opts->x_debug_struct_ordinary[DINFO_USAGE_IND_USE] = files;
39ef6592
LC
101 }
102 if (gen)
103 {
69ccdddb
JM
104 opts->x_debug_struct_generic[DINFO_USAGE_DFN] = files;
105 opts->x_debug_struct_generic[DINFO_USAGE_DIR_USE] = files;
106 opts->x_debug_struct_generic[DINFO_USAGE_IND_USE] = files;
39ef6592
LC
107 }
108 }
109 else
110 {
111 if (ord)
69ccdddb 112 opts->x_debug_struct_ordinary[usage] = files;
39ef6592 113 if (gen)
69ccdddb 114 opts->x_debug_struct_generic[usage] = files;
39ef6592
LC
115 }
116
117 if (*spec == ',')
299404a1 118 set_struct_debug_option (opts, loc, spec+1);
39ef6592
LC
119 else
120 {
121 /* No more -femit-struct-debug-detailed specifications.
122 Do final checks. */
123 if (*spec != '\0')
299404a1
JM
124 error_at (loc,
125 "argument %qs to %<-femit-struct-debug-detailed%> unknown",
126 spec);
69ccdddb
JM
127 if (opts->x_debug_struct_ordinary[DINFO_USAGE_DIR_USE]
128 < opts->x_debug_struct_ordinary[DINFO_USAGE_IND_USE]
129 || opts->x_debug_struct_generic[DINFO_USAGE_DIR_USE]
130 < opts->x_debug_struct_generic[DINFO_USAGE_IND_USE])
299404a1
JM
131 error_at (loc,
132 "%<-femit-struct-debug-detailed=dir:...%> must allow "
133 "at least as much as "
134 "%<-femit-struct-debug-detailed=ind:...%>");
39ef6592
LC
135 }
136}
137
c98cd5bf
JM
138/* Strip off a legitimate source ending from the input string NAME of
139 length LEN. Rather than having to know the names used by all of
140 our front ends, we strip off an ending of a period followed by
141 up to five characters. (Java uses ".class".) */
142
143void
144strip_off_ending (char *name, int len)
145{
146 int i;
147 for (i = 2; i < 6 && len > i; i++)
148 {
149 if (name[len - i] == '.')
150 {
151 name[len - i] = '\0';
152 break;
153 }
154 }
155}
156
39ef6592
LC
157/* Find the base name of a path, stripping off both directories and
158 a single final extension. */
69ccdddb 159int
39ef6592
LC
160base_of_path (const char *path, const char **base_out)
161{
162 const char *base = path;
163 const char *dot = 0;
164 const char *p = path;
165 char c = *p;
166 while (c)
167 {
c3284718 168 if (IS_DIR_SEPARATOR (c))
39ef6592
LC
169 {
170 base = p + 1;
171 dot = 0;
172 }
173 else if (c == '.')
174 dot = p;
175 c = *++p;
176 }
177 if (!dot)
178 dot = p;
179 *base_out = base;
180 return dot - base;
181}
182
2cc98056
NB
183/* What to print when a switch has no documentation. */
184static const char undocumented_msg[] = N_("This switch lacks documentation");
185
8d5a7d1f 186typedef char *char_p; /* For DEF_VEC_P. */
8d5a7d1f 187
48476d13 188static void handle_param (struct gcc_options *opts,
299404a1
JM
189 struct gcc_options *opts_set, location_t loc,
190 const char *carg);
df38ffef 191static void set_debug_level (enum debug_info_type type, int extended,
0576d21f 192 const char *arg, struct gcc_options *opts,
299404a1
JM
193 struct gcc_options *opts_set,
194 location_t loc);
d5478783 195static void set_fast_math_flags (struct gcc_options *opts, int set);
299404a1
JM
196static void decode_d_option (const char *arg, struct gcc_options *opts,
197 location_t loc, diagnostic_context *dc);
d5478783
JM
198static void set_unsafe_math_optimizations_flags (struct gcc_options *opts,
199 int set);
a4d8c676
JM
200static void enable_warning_as_error (const char *arg, int value,
201 unsigned int lang_mask,
202 const struct cl_option_handlers *handlers,
c5fa0890
JM
203 struct gcc_options *opts,
204 struct gcc_options *opts_set,
a4d8c676
JM
205 location_t loc,
206 diagnostic_context *dc);
2772ef3e 207
5f20c657
JM
208/* Handle a back-end option; arguments and return value as for
209 handle_option. */
2772ef3e 210
c98cd5bf 211bool
46625112 212target_handle_option (struct gcc_options *opts,
d4d24ba4 213 struct gcc_options *opts_set,
46625112 214 const struct cl_decoded_option *decoded,
481e1176 215 unsigned int lang_mask ATTRIBUTE_UNUSED, int kind,
96e45421 216 location_t loc,
d5478783
JM
217 const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED,
218 diagnostic_context *dc)
5f20c657 219{
d5478783 220 gcc_assert (dc == global_dc);
5f20c657 221 gcc_assert (kind == DK_UNSPECIFIED);
677f3fa8 222 return targetm_common.handle_option (opts, opts_set, decoded, loc);
2772ef3e 223}
d7b42618 224
1ebc7e68 225/* Add comma-separated strings to a char_p vector. */
8d5a7d1f
ILT
226
227static void
6a1f6c9c 228add_comma_separated_to_vector (void **pvec, const char *arg)
8d5a7d1f
ILT
229{
230 char *tmp;
231 char *r;
232 char *w;
233 char *token_start;
9771b263
DN
234 vec<char_p> *v = (vec<char_p> *) *pvec;
235
236 vec_check_alloc (v, 1);
8d5a7d1f
ILT
237
238 /* We never free this string. */
239 tmp = xstrdup (arg);
240
241 r = tmp;
242 w = tmp;
243 token_start = tmp;
244
245 while (*r != '\0')
246 {
247 if (*r == ',')
248 {
249 *w++ = '\0';
250 ++r;
9771b263 251 v->safe_push (token_start);
8d5a7d1f
ILT
252 token_start = w;
253 }
254 if (*r == '\\' && r[1] == ',')
255 {
256 *w++ = ',';
257 r += 2;
258 }
259 else
260 *w++ = *r++;
261 }
262 if (*token_start != '\0')
9771b263 263 v->safe_push (token_start);
8d5a7d1f 264
9771b263 265 *pvec = v;
8d5a7d1f
ILT
266}
267
a75bfaa6
JM
268/* Initialize OPTS and OPTS_SET before using them in parsing options. */
269
270void
271init_options_struct (struct gcc_options *opts, struct gcc_options *opts_set)
272{
48476d13
JM
273 size_t num_params = get_num_compiler_params ();
274
dc357798
JJ
275 gcc_obstack_init (&opts_obstack);
276
a75bfaa6 277 *opts = global_options_init;
bf7b5747
ST
278
279 if (opts_set)
280 memset (opts_set, 0, sizeof (*opts_set));
a75bfaa6 281
48476d13 282 opts->x_param_values = XNEWVEC (int, num_params);
bf7b5747
ST
283
284 if (opts_set)
285 opts_set->x_param_values = XCNEWVEC (int, num_params);
286
48476d13
JM
287 init_param_values (opts->x_param_values);
288
a75bfaa6
JM
289 /* Initialize whether `char' is signed. */
290 opts->x_flag_signed_char = DEFAULT_SIGNED_CHAR;
291 /* Set this to a special "uninitialized" value. The actual default
292 is set after target options have been processed. */
293 opts->x_flag_short_enums = 2;
294
677f3fa8 295 /* Initialize target_flags before default_options_optimization
a75bfaa6 296 so the latter can modify it. */
677f3fa8 297 opts->x_target_flags = targetm_common.default_target_flags;
a75bfaa6
JM
298
299 /* Some targets have ABI-specified unwind tables. */
677f3fa8 300 opts->x_flag_unwind_tables = targetm_common.unwind_tables_default;
7e4aae92
JM
301
302 /* Some targets have other target-specific initialization. */
677f3fa8 303 targetm_common.option_init_struct (opts);
a75bfaa6
JM
304}
305
0ef443cf
DM
306/* Release any allocations owned by OPTS. */
307
308void
309finalize_options_struct (struct gcc_options *opts)
310{
311 XDELETEVEC (opts->x_param_values);
312}
313
3020190e 314/* If indicated by the optimization level LEVEL (-Os if SIZE is set,
bf7a7185
RG
315 -Ofast if FAST is set, -Og if DEBUG is set), apply the option DEFAULT_OPT
316 to OPTS and OPTS_SET, diagnostic context DC, location LOC, with language
317 mask LANG_MASK and option handlers HANDLERS. */
3020190e
JM
318
319static void
320maybe_default_option (struct gcc_options *opts,
321 struct gcc_options *opts_set,
322 const struct default_options *default_opt,
bf7a7185 323 int level, bool size, bool fast, bool debug,
3020190e
JM
324 unsigned int lang_mask,
325 const struct cl_option_handlers *handlers,
a4d8c676 326 location_t loc,
3020190e
JM
327 diagnostic_context *dc)
328{
329 const struct cl_option *option = &cl_options[default_opt->opt_index];
330 bool enabled;
331
332 if (size)
333 gcc_assert (level == 2);
334 if (fast)
335 gcc_assert (level == 3);
bf7a7185
RG
336 if (debug)
337 gcc_assert (level == 1);
3020190e
JM
338
339 switch (default_opt->levels)
340 {
341 case OPT_LEVELS_ALL:
342 enabled = true;
343 break;
344
345 case OPT_LEVELS_0_ONLY:
346 enabled = (level == 0);
347 break;
348
349 case OPT_LEVELS_1_PLUS:
350 enabled = (level >= 1);
351 break;
352
353 case OPT_LEVELS_1_PLUS_SPEED_ONLY:
bf7a7185
RG
354 enabled = (level >= 1 && !size && !debug);
355 break;
356
357 case OPT_LEVELS_1_PLUS_NOT_DEBUG:
358 enabled = (level >= 1 && !debug);
3020190e
JM
359 break;
360
361 case OPT_LEVELS_2_PLUS:
362 enabled = (level >= 2);
363 break;
364
365 case OPT_LEVELS_2_PLUS_SPEED_ONLY:
bf7a7185 366 enabled = (level >= 2 && !size && !debug);
3020190e
JM
367 break;
368
369 case OPT_LEVELS_3_PLUS:
370 enabled = (level >= 3);
371 break;
372
373 case OPT_LEVELS_3_PLUS_AND_SIZE:
374 enabled = (level >= 3 || size);
375 break;
376
377 case OPT_LEVELS_SIZE:
378 enabled = size;
379 break;
380
381 case OPT_LEVELS_FAST:
382 enabled = fast;
383 break;
384
385 case OPT_LEVELS_NONE:
386 default:
387 gcc_unreachable ();
388 }
389
390 if (enabled)
391 handle_generated_option (opts, opts_set, default_opt->opt_index,
392 default_opt->arg, default_opt->value,
a4d8c676
JM
393 lang_mask, DK_UNSPECIFIED, loc,
394 handlers, dc);
3020190e 395 else if (default_opt->arg == NULL
300d83d9 396 && !option->cl_reject_negative)
3020190e
JM
397 handle_generated_option (opts, opts_set, default_opt->opt_index,
398 default_opt->arg, !default_opt->value,
a4d8c676
JM
399 lang_mask, DK_UNSPECIFIED, loc,
400 handlers, dc);
3020190e
JM
401}
402
403/* As indicated by the optimization level LEVEL (-Os if SIZE is set,
404 -Ofast if FAST is set), apply the options in array DEFAULT_OPTS to
a4d8c676
JM
405 OPTS and OPTS_SET, diagnostic context DC, location LOC, with
406 language mask LANG_MASK and option handlers HANDLERS. */
3020190e
JM
407
408static void
409maybe_default_options (struct gcc_options *opts,
410 struct gcc_options *opts_set,
411 const struct default_options *default_opts,
bf7a7185 412 int level, bool size, bool fast, bool debug,
3020190e
JM
413 unsigned int lang_mask,
414 const struct cl_option_handlers *handlers,
a4d8c676 415 location_t loc,
3020190e
JM
416 diagnostic_context *dc)
417{
418 size_t i;
419
420 for (i = 0; default_opts[i].levels != OPT_LEVELS_NONE; i++)
421 maybe_default_option (opts, opts_set, &default_opts[i],
bf7a7185
RG
422 level, size, fast, debug,
423 lang_mask, handlers, loc, dc);
3020190e
JM
424}
425
426/* Table of options enabled by default at different levels. */
427
428static const struct default_options default_options_table[] =
429 {
430 /* -O1 optimizations. */
431 { OPT_LEVELS_1_PLUS, OPT_fdefer_pop, NULL, 1 },
432#ifdef DELAY_SLOTS
433 { OPT_LEVELS_1_PLUS, OPT_fdelayed_branch, NULL, 1 },
434#endif
435 { OPT_LEVELS_1_PLUS, OPT_fguess_branch_probability, NULL, 1 },
436 { OPT_LEVELS_1_PLUS, OPT_fcprop_registers, NULL, 1 },
437 { OPT_LEVELS_1_PLUS, OPT_fforward_propagate, NULL, 1 },
eeee2277
JY
438 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fif_conversion, NULL, 1 },
439 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fif_conversion2, NULL, 1 },
3020190e
JM
440 { OPT_LEVELS_1_PLUS, OPT_fipa_pure_const, NULL, 1 },
441 { OPT_LEVELS_1_PLUS, OPT_fipa_reference, NULL, 1 },
442 { OPT_LEVELS_1_PLUS, OPT_fipa_profile, NULL, 1 },
443 { OPT_LEVELS_1_PLUS, OPT_fmerge_constants, NULL, 1 },
484db665 444 { OPT_LEVELS_1_PLUS, OPT_fshrink_wrap, NULL, 1 },
3020190e
JM
445 { OPT_LEVELS_1_PLUS, OPT_fsplit_wide_types, NULL, 1 },
446 { OPT_LEVELS_1_PLUS, OPT_ftree_ccp, NULL, 1 },
78d22941 447 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_bit_ccp, NULL, 1 },
3020190e
JM
448 { OPT_LEVELS_1_PLUS, OPT_ftree_dce, NULL, 1 },
449 { OPT_LEVELS_1_PLUS, OPT_ftree_dominator_opts, NULL, 1 },
450 { OPT_LEVELS_1_PLUS, OPT_ftree_dse, NULL, 1 },
451 { OPT_LEVELS_1_PLUS, OPT_ftree_ter, NULL, 1 },
bf7a7185 452 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_sra, NULL, 1 },
64d7fb90 453 { OPT_LEVELS_1_PLUS, OPT_ftree_copyrename, NULL, 1 },
3020190e
JM
454 { OPT_LEVELS_1_PLUS, OPT_ftree_fre, NULL, 1 },
455 { OPT_LEVELS_1_PLUS, OPT_ftree_copy_prop, NULL, 1 },
456 { OPT_LEVELS_1_PLUS, OPT_ftree_sink, NULL, 1 },
457 { OPT_LEVELS_1_PLUS, OPT_ftree_ch, NULL, 1 },
458 { OPT_LEVELS_1_PLUS, OPT_fcombine_stack_adjustments, NULL, 1 },
e692f276 459 { OPT_LEVELS_1_PLUS, OPT_fcompare_elim, NULL, 1 },
75cfe445 460 { OPT_LEVELS_1_PLUS, OPT_ftree_slsr, NULL, 1 },
14379e66
RB
461 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fbranch_count_reg, NULL, 1 },
462 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fmove_loop_invariants, NULL, 1 },
463 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_pta, NULL, 1 },
68f6df73 464 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fssa_phiopt, NULL, 1 },
3020190e
JM
465
466 /* -O2 optimizations. */
467 { OPT_LEVELS_2_PLUS, OPT_finline_small_functions, NULL, 1 },
468 { OPT_LEVELS_2_PLUS, OPT_findirect_inlining, NULL, 1 },
469 { OPT_LEVELS_2_PLUS, OPT_fpartial_inlining, NULL, 1 },
470 { OPT_LEVELS_2_PLUS, OPT_fthread_jumps, NULL, 1 },
471 { OPT_LEVELS_2_PLUS, OPT_fcrossjumping, NULL, 1 },
472 { OPT_LEVELS_2_PLUS, OPT_foptimize_sibling_calls, NULL, 1 },
473 { OPT_LEVELS_2_PLUS, OPT_fcse_follow_jumps, NULL, 1 },
474 { OPT_LEVELS_2_PLUS, OPT_fgcse, NULL, 1 },
475 { OPT_LEVELS_2_PLUS, OPT_fexpensive_optimizations, NULL, 1 },
476 { OPT_LEVELS_2_PLUS, OPT_frerun_cse_after_loop, NULL, 1 },
477 { OPT_LEVELS_2_PLUS, OPT_fcaller_saves, NULL, 1 },
478 { OPT_LEVELS_2_PLUS, OPT_fpeephole2, NULL, 1 },
479#ifdef INSN_SCHEDULING
480 /* Only run the pre-regalloc scheduling pass if optimizing for speed. */
481 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_fschedule_insns, NULL, 1 },
482 { OPT_LEVELS_2_PLUS, OPT_fschedule_insns2, NULL, 1 },
483#endif
3020190e
JM
484 { OPT_LEVELS_2_PLUS, OPT_fstrict_aliasing, NULL, 1 },
485 { OPT_LEVELS_2_PLUS, OPT_fstrict_overflow, NULL, 1 },
486 { OPT_LEVELS_2_PLUS, OPT_freorder_blocks, NULL, 1 },
487 { OPT_LEVELS_2_PLUS, OPT_freorder_functions, NULL, 1 },
488 { OPT_LEVELS_2_PLUS, OPT_ftree_vrp, NULL, 1 },
489 { OPT_LEVELS_2_PLUS, OPT_ftree_builtin_call_dce, NULL, 1 },
490 { OPT_LEVELS_2_PLUS, OPT_ftree_pre, NULL, 1 },
491 { OPT_LEVELS_2_PLUS, OPT_ftree_switch_conversion, NULL, 1 },
492 { OPT_LEVELS_2_PLUS, OPT_fipa_cp, NULL, 1 },
3c99176a 493 { OPT_LEVELS_2_PLUS, OPT_fipa_cp_alignment, NULL, 1 },
05842ff5 494 { OPT_LEVELS_2_PLUS, OPT_fdevirtualize, NULL, 1 },
bbc9396b 495 { OPT_LEVELS_2_PLUS, OPT_fdevirtualize_speculatively, NULL, 1 },
3020190e
JM
496 { OPT_LEVELS_2_PLUS, OPT_fipa_sra, NULL, 1 },
497 { OPT_LEVELS_2_PLUS, OPT_falign_loops, NULL, 1 },
498 { OPT_LEVELS_2_PLUS, OPT_falign_jumps, NULL, 1 },
499 { OPT_LEVELS_2_PLUS, OPT_falign_labels, NULL, 1 },
500 { OPT_LEVELS_2_PLUS, OPT_falign_functions, NULL, 1 },
c9e93168 501 { OPT_LEVELS_2_PLUS, OPT_ftree_tail_merge, NULL, 1 },
d6d11272 502 { OPT_LEVELS_2_PLUS, OPT_fvect_cost_model_, NULL, VECT_COST_MODEL_CHEAP },
d8878031 503 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_foptimize_strlen, NULL, 1 },
372a6eb8 504 { OPT_LEVELS_2_PLUS, OPT_fhoist_adjacent_loads, NULL, 1 },
b84d4347 505 { OPT_LEVELS_2_PLUS, OPT_fipa_icf, NULL, 1 },
ae93744d 506 { OPT_LEVELS_2_PLUS, OPT_fisolate_erroneous_paths_dereference, NULL, 1 },
1e288103 507 { OPT_LEVELS_2_PLUS, OPT_fipa_ra, NULL, 1 },
d9cf932c 508 { OPT_LEVELS_2_PLUS, OPT_flra_remat, NULL, 1 },
3020190e
JM
509
510 /* -O3 optimizations. */
511 { OPT_LEVELS_3_PLUS, OPT_ftree_loop_distribute_patterns, NULL, 1 },
512 { OPT_LEVELS_3_PLUS, OPT_fpredictive_commoning, NULL, 1 },
513 /* Inlining of functions reducing size is a good idea with -Os
514 regardless of them being declared inline. */
515 { OPT_LEVELS_3_PLUS_AND_SIZE, OPT_finline_functions, NULL, 1 },
bf7a7185 516 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_finline_functions_called_once, NULL, 1 },
3020190e
JM
517 { OPT_LEVELS_3_PLUS, OPT_funswitch_loops, NULL, 1 },
518 { OPT_LEVELS_3_PLUS, OPT_fgcse_after_reload, NULL, 1 },
ea0f3e87
XDL
519 { OPT_LEVELS_3_PLUS, OPT_ftree_loop_vectorize, NULL, 1 },
520 { OPT_LEVELS_3_PLUS, OPT_ftree_slp_vectorize, NULL, 1 },
d6d11272 521 { OPT_LEVELS_3_PLUS, OPT_fvect_cost_model_, NULL, VECT_COST_MODEL_DYNAMIC },
3020190e 522 { OPT_LEVELS_3_PLUS, OPT_fipa_cp_clone, NULL, 1 },
fa06ad0d 523 { OPT_LEVELS_3_PLUS, OPT_ftree_partial_pre, NULL, 1 },
3020190e
JM
524
525 /* -Ofast adds optimizations to -O3. */
526 { OPT_LEVELS_FAST, OPT_ffast_math, NULL, 1 },
527
528 { OPT_LEVELS_NONE, 0, NULL, 0 }
529 };
530
a75bfaa6
JM
531/* Default the options in OPTS and OPTS_SET based on the optimization
532 settings in DECODED_OPTIONS and DECODED_OPTIONS_COUNT. */
c98cd5bf 533void
a75bfaa6
JM
534default_options_optimization (struct gcc_options *opts,
535 struct gcc_options *opts_set,
536 struct cl_decoded_option *decoded_options,
3020190e 537 unsigned int decoded_options_count,
a4d8c676 538 location_t loc,
3020190e
JM
539 unsigned int lang_mask,
540 const struct cl_option_handlers *handlers,
541 diagnostic_context *dc)
a75bfaa6
JM
542{
543 unsigned int i;
ab442df7 544 int opt2;
9756310a
NB
545
546 /* Scan to see what optimization level has been specified. That will
547 determine the default value of many flags. */
a75bfaa6 548 for (i = 1; i < decoded_options_count; i++)
9756310a 549 {
a75bfaa6 550 struct cl_decoded_option *opt = &decoded_options[i];
6e2f1956 551 switch (opt->opt_index)
9756310a 552 {
6e2f1956
JM
553 case OPT_O:
554 if (*opt->arg == '\0')
be6d3f0e 555 {
3020190e
JM
556 opts->x_optimize = 1;
557 opts->x_optimize_size = 0;
0a8134ca 558 opts->x_optimize_fast = 0;
bf7a7185 559 opts->x_optimize_debug = 0;
9756310a
NB
560 }
561 else
562 {
6e2f1956
JM
563 const int optimize_val = integral_argument (opt->arg);
564 if (optimize_val == -1)
33879b9f
MP
565 error_at (loc, "argument to %<-O%> should be a non-negative "
566 "integer, %<g%>, %<s%> or %<fast%>");
6e2f1956 567 else
9756310a 568 {
3020190e
JM
569 opts->x_optimize = optimize_val;
570 if ((unsigned int) opts->x_optimize > 255)
571 opts->x_optimize = 255;
572 opts->x_optimize_size = 0;
0a8134ca 573 opts->x_optimize_fast = 0;
bf7a7185 574 opts->x_optimize_debug = 0;
9756310a
NB
575 }
576 }
6e2f1956
JM
577 break;
578
579 case OPT_Os:
3020190e 580 opts->x_optimize_size = 1;
6e2f1956
JM
581
582 /* Optimizing for size forces optimize to be 2. */
3020190e 583 opts->x_optimize = 2;
0a8134ca 584 opts->x_optimize_fast = 0;
bf7a7185 585 opts->x_optimize_debug = 0;
6e2f1956
JM
586 break;
587
588 case OPT_Ofast:
589 /* -Ofast only adds flags to -O3. */
3020190e
JM
590 opts->x_optimize_size = 0;
591 opts->x_optimize = 3;
0a8134ca 592 opts->x_optimize_fast = 1;
bf7a7185
RG
593 opts->x_optimize_debug = 0;
594 break;
595
596 case OPT_Og:
597 /* -Og selects optimization level 1. */
598 opts->x_optimize_size = 0;
599 opts->x_optimize = 1;
600 opts->x_optimize_fast = 0;
601 opts->x_optimize_debug = 1;
6e2f1956
JM
602 break;
603
604 default:
605 /* Ignore other options in this prescan. */
606 break;
9756310a
NB
607 }
608 }
b8698a0f 609
3020190e
JM
610 maybe_default_options (opts, opts_set, default_options_table,
611 opts->x_optimize, opts->x_optimize_size,
bf7a7185
RG
612 opts->x_optimize_fast, opts->x_optimize_debug,
613 lang_mask, handlers, loc, dc);
3020190e
JM
614
615 /* -O2 param settings. */
616 opt2 = (opts->x_optimize >= 2);
116cb604 617
ab442df7 618 /* Track fields in field-sensitive alias analysis. */
48476d13
JM
619 maybe_set_param_value
620 (PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE,
621 opt2 ? 100 : default_param_value (PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE),
622 opts->x_param_values, opts_set->x_param_values);
e9e0aa2c 623
b1fb9f56 624 /* For -O1 only do loop invariant motion for very small loops. */
48476d13
JM
625 maybe_set_param_value
626 (PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP,
627 opt2 ? default_param_value (PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP) : 1000,
628 opts->x_param_values, opts_set->x_param_values);
b1fb9f56 629
680a5a7c
MJ
630 /* At -Ofast, allow store motion to introduce potential race conditions. */
631 maybe_set_param_value
632 (PARAM_ALLOW_STORE_DATA_RACES,
633 opts->x_optimize_fast ? 1
634 : default_param_value (PARAM_ALLOW_STORE_DATA_RACES),
635 opts->x_param_values, opts_set->x_param_values);
636
3020190e
JM
637 if (opts->x_optimize_size)
638 /* We want to crossjump as much as possible. */
639 maybe_set_param_value (PARAM_MIN_CROSSJUMP_INSNS, 1,
640 opts->x_param_values, opts_set->x_param_values);
ab442df7 641 else
128dc8e2 642 maybe_set_param_value (PARAM_MIN_CROSSJUMP_INSNS,
48476d13
JM
643 default_param_value (PARAM_MIN_CROSSJUMP_INSNS),
644 opts->x_param_values, opts_set->x_param_values);
f736cb3e 645
b30e733a
RB
646 /* Restrict the amount of work combine does at -Og while retaining
647 most of its useful transforms. */
648 if (opts->x_optimize_debug)
649 maybe_set_param_value (PARAM_MAX_COMBINE_INSNS, 2,
650 opts->x_param_values, opts_set->x_param_values);
651
a75bfaa6 652 /* Allow default optimizations to be specified on a per-machine basis. */
3020190e 653 maybe_default_options (opts, opts_set,
677f3fa8 654 targetm_common.option_optimization_table,
3020190e 655 opts->x_optimize, opts->x_optimize_size,
bf7a7185
RG
656 opts->x_optimize_fast, opts->x_optimize_debug,
657 lang_mask, handlers, loc, dc);
a75bfaa6
JM
658}
659
299404a1
JM
660/* After all options at LOC have been read into OPTS and OPTS_SET,
661 finalize settings of those options and diagnose incompatible
a75bfaa6 662 combinations. */
c98cd5bf 663void
299404a1
JM
664finish_options (struct gcc_options *opts, struct gcc_options *opts_set,
665 location_t loc)
a75bfaa6 666{
a75bfaa6
JM
667 enum unwind_info_type ui_except;
668
91035653
JJ
669 if (opts->x_dump_base_name
670 && ! IS_ABSOLUTE_PATH (opts->x_dump_base_name)
671 && ! opts->x_dump_base_name_prefixed)
e71da632 672 {
d5478783
JM
673 /* First try to make OPTS->X_DUMP_BASE_NAME relative to the
674 OPTS->X_DUMP_DIR_NAME directory. Then try to make
675 OPTS->X_DUMP_BASE_NAME relative to the OPTS->X_AUX_BASE_NAME
676 directory, typically the directory to contain the object
677 file. */
678 if (opts->x_dump_dir_name)
dc357798
JJ
679 opts->x_dump_base_name = opts_concat (opts->x_dump_dir_name,
680 opts->x_dump_base_name, NULL);
dd3b31fb
L
681 else if (opts->x_aux_base_name
682 && strcmp (opts->x_aux_base_name, HOST_BIT_BUCKET) != 0)
e71da632 683 {
d7fb0a6d
L
684 const char *aux_base;
685
d5478783
JM
686 base_of_path (opts->x_aux_base_name, &aux_base);
687 if (opts->x_aux_base_name != aux_base)
d7fb0a6d 688 {
d5478783 689 int dir_len = aux_base - opts->x_aux_base_name;
dc357798
JJ
690 char *new_dump_base_name
691 = XOBNEWVEC (&opts_obstack, char,
692 strlen (opts->x_dump_base_name) + dir_len + 1);
d7fb0a6d 693
d5478783
JM
694 /* Copy directory component from OPTS->X_AUX_BASE_NAME. */
695 memcpy (new_dump_base_name, opts->x_aux_base_name, dir_len);
696 /* Append existing OPTS->X_DUMP_BASE_NAME. */
697 strcpy (new_dump_base_name + dir_len, opts->x_dump_base_name);
698 opts->x_dump_base_name = new_dump_base_name;
d7fb0a6d 699 }
e71da632 700 }
91035653 701 opts->x_dump_base_name_prefixed = true;
e71da632
MH
702 }
703
93a4f5e0
JJ
704 /* Handle related options for unit-at-a-time, toplevel-reorder, and
705 section-anchors. */
d5478783 706 if (!opts->x_flag_unit_at_a_time)
57b08d04 707 {
d5478783 708 if (opts->x_flag_section_anchors && opts_set->x_flag_section_anchors)
299404a1
JM
709 error_at (loc, "section anchors must be disabled when unit-at-a-time "
710 "is disabled");
d5478783
JM
711 opts->x_flag_section_anchors = 0;
712 if (opts->x_flag_toplevel_reorder == 1)
299404a1
JM
713 error_at (loc, "toplevel reorder must be disabled when unit-at-a-time "
714 "is disabled");
d5478783 715 opts->x_flag_toplevel_reorder = 0;
57b08d04 716 }
7ea6b6cf 717
ee777b71
AH
718 if (opts->x_flag_tm && opts->x_flag_non_call_exceptions)
719 sorry ("transactional memory is not supported with non-call exceptions");
720
5ffebee7
JJ
721 /* Unless the user has asked for section anchors, we disable toplevel
722 reordering at -O0 to disable transformations that might be surprising
723 to end users and to get -fno-toplevel-reorder tested. */
299404a1 724 if (!opts->x_optimize
d5478783
JM
725 && opts->x_flag_toplevel_reorder == 2
726 && !(opts->x_flag_section_anchors && opts_set->x_flag_section_anchors))
93a4f5e0 727 {
d5478783
JM
728 opts->x_flag_toplevel_reorder = 0;
729 opts->x_flag_section_anchors = 0;
93a4f5e0 730 }
d5478783 731 if (!opts->x_flag_toplevel_reorder)
57b08d04 732 {
d5478783 733 if (opts->x_flag_section_anchors && opts_set->x_flag_section_anchors)
299404a1
JM
734 error_at (loc, "section anchors must be disabled when toplevel reorder"
735 " is disabled");
d5478783 736 opts->x_flag_section_anchors = 0;
57b08d04
ST
737 }
738
299404a1 739 if (!opts->x_flag_opts_finished)
ab442df7 740 {
428b3812
L
741 /* We initialize opts->x_flag_pie to -1 so that targets can set a
742 default value. */
743 if (opts->x_flag_pie == -1)
744 {
745 if (opts->x_flag_pic == 0)
746 opts->x_flag_pie = DEFAULT_FLAG_PIE;
747 else
748 opts->x_flag_pie = 0;
749 }
d5478783
JM
750 if (opts->x_flag_pie)
751 opts->x_flag_pic = opts->x_flag_pie;
752 if (opts->x_flag_pic && !opts->x_flag_pie)
753 opts->x_flag_shlib = 1;
b294a75e 754 opts->x_flag_opts_finished = true;
ab442df7 755 }
9756310a 756
299404a1 757 if (opts->x_optimize == 0)
9756310a
NB
758 {
759 /* Inlining does not work if not optimizing,
760 so force it not to be done. */
d5478783
JM
761 opts->x_warn_inline = 0;
762 opts->x_flag_no_inline = 1;
9756310a
NB
763 }
764
750054a2
CT
765 /* The optimization to partition hot and cold basic blocks into separate
766 sections of the .o and executable files does not work (currently)
e395963f 767 with exception handling. This is because there is no support for
d5478783
JM
768 generating unwind info. If opts->x_flag_exceptions is turned on
769 we need to turn off the partitioning optimization. */
750054a2 770
677f3fa8 771 ui_except = targetm_common.except_unwind_info (opts);
f0a0390e 772
d5478783
JM
773 if (opts->x_flag_exceptions
774 && opts->x_flag_reorder_blocks_and_partition
bf1431e3 775 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))
750054a2 776 {
32ad0f03
TJ
777 if (opts_set->x_flag_reorder_blocks_and_partition)
778 inform (loc,
779 "-freorder-blocks-and-partition does not work "
780 "with exceptions on this architecture");
d5478783
JM
781 opts->x_flag_reorder_blocks_and_partition = 0;
782 opts->x_flag_reorder_blocks = 1;
750054a2 783 }
c7466dee 784
e395963f
JW
785 /* If user requested unwind info, then turn off the partitioning
786 optimization. */
787
d5478783 788 if (opts->x_flag_unwind_tables
677f3fa8 789 && !targetm_common.unwind_tables_default
d5478783 790 && opts->x_flag_reorder_blocks_and_partition
bf1431e3 791 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))
e395963f 792 {
32ad0f03
TJ
793 if (opts_set->x_flag_reorder_blocks_and_partition)
794 inform (loc,
795 "-freorder-blocks-and-partition does not support "
796 "unwind info on this architecture");
d5478783
JM
797 opts->x_flag_reorder_blocks_and_partition = 0;
798 opts->x_flag_reorder_blocks = 1;
e395963f
JW
799 }
800
801 /* If the target requested unwind info, then turn off the partitioning
802 optimization with a different message. Likewise, if the target does not
803 support named sections. */
804
d5478783 805 if (opts->x_flag_reorder_blocks_and_partition
677f3fa8 806 && (!targetm_common.have_named_sections
d5478783 807 || (opts->x_flag_unwind_tables
677f3fa8 808 && targetm_common.unwind_tables_default
bf1431e3 809 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))))
c7466dee 810 {
32ad0f03
TJ
811 if (opts_set->x_flag_reorder_blocks_and_partition)
812 inform (loc,
813 "-freorder-blocks-and-partition does not work "
814 "on this architecture");
d5478783
JM
815 opts->x_flag_reorder_blocks_and_partition = 0;
816 opts->x_flag_reorder_blocks = 1;
c7466dee 817 }
ab442df7 818
940c4160
IS
819 if (opts->x_flag_reorder_blocks_and_partition
820 && !opts_set->x_flag_reorder_functions)
821 opts->x_flag_reorder_functions = 1;
822
e855c69d
AB
823 /* Pipelining of outer loops is only possible when general pipelining
824 capabilities are requested. */
d5478783
JM
825 if (!opts->x_flag_sel_sched_pipelining)
826 opts->x_flag_sel_sched_pipelining_outer_loops = 0;
e855c69d 827
d5478783 828 if (opts->x_flag_conserve_stack)
6a78eaa3 829 {
48476d13
JM
830 maybe_set_param_value (PARAM_LARGE_STACK_FRAME, 100,
831 opts->x_param_values, opts_set->x_param_values);
832 maybe_set_param_value (PARAM_STACK_FRAME_GROWTH, 40,
833 opts->x_param_values, opts_set->x_param_values);
6a78eaa3
JH
834 }
835
014d92e1 836 if (opts->x_flag_lto)
e3b8749b
RG
837 {
838#ifdef ENABLE_LTO
d5478783 839 opts->x_flag_generate_lto = 1;
e3b8749b
RG
840
841 /* When generating IL, do not operate in whole-program mode.
842 Otherwise, symbols will be privatized too early, causing link
843 errors later. */
d5478783 844 opts->x_flag_whole_program = 0;
e3b8749b 845#else
299404a1 846 error_at (loc, "LTO support has not been enabled in this configuration");
e3b8749b 847#endif
063d671d
JH
848 if (!opts->x_flag_fat_lto_objects
849 && (!HAVE_LTO_PLUGIN
850 || (opts_set->x_flag_use_linker_plugin
851 && !opts->x_flag_use_linker_plugin)))
e9f67e62
JH
852 {
853 if (opts_set->x_flag_fat_lto_objects)
063d671d 854 error_at (loc, "-fno-fat-lto-objects are supported only with linker plugin");
e9f67e62
JH
855 opts->x_flag_fat_lto_objects = 1;
856 }
857 }
e3b8749b 858
d5478783 859 /* We initialize opts->x_flag_split_stack to -1 so that targets can set a
7458026b 860 default value if they choose based on other options. */
d5478783
JM
861 if (opts->x_flag_split_stack == -1)
862 opts->x_flag_split_stack = 0;
863 else if (opts->x_flag_split_stack)
7458026b 864 {
677f3fa8 865 if (!targetm_common.supports_split_stack (true, opts))
7458026b 866 {
299404a1
JM
867 error_at (loc, "%<-fsplit-stack%> is not supported by "
868 "this compiler configuration");
d5478783 869 opts->x_flag_split_stack = 0;
7458026b
ILT
870 }
871 }
bfe068c3 872
d6d11272
XDL
873 /* Tune vectorization related parametees according to cost model. */
874 if (opts->x_flag_vect_cost_model == VECT_COST_MODEL_CHEAP)
875 {
876 maybe_set_param_value (PARAM_VECT_MAX_VERSION_FOR_ALIAS_CHECKS,
877 6, opts->x_param_values, opts_set->x_param_values);
878 maybe_set_param_value (PARAM_VECT_MAX_VERSION_FOR_ALIGNMENT_CHECKS,
879 0, opts->x_param_values, opts_set->x_param_values);
880 maybe_set_param_value (PARAM_VECT_MAX_PEELING_FOR_ALIGNMENT,
881 0, opts->x_param_values, opts_set->x_param_values);
882 }
883
bfe068c3
IR
884 /* Set PARAM_MAX_STORES_TO_SINK to 0 if either vectorization or if-conversion
885 is disabled. */
ea0f3e87
XDL
886 if ((!opts->x_flag_tree_loop_vectorize && !opts->x_flag_tree_slp_vectorize)
887 || !opts->x_flag_tree_loop_if_convert)
bfe068c3
IR
888 maybe_set_param_value (PARAM_MAX_STORES_TO_SINK, 0,
889 opts->x_param_values, opts_set->x_param_values);
e9f8dcf9 890
bd5c3baa 891 /* The -gsplit-dwarf option requires -ggnu-pubnames. */
99ea153e 892 if (opts->x_dwarf_split_debug_info)
bd5c3baa 893 opts->x_debug_generate_pub_sections = 2;
fec4842d 894
fed4de37 895 /* Userspace and kernel ASan conflict with each other. */
fec4842d 896
d95a2703
JJ
897 if ((opts->x_flag_sanitize & SANITIZE_USER_ADDRESS)
898 && (opts->x_flag_sanitize & SANITIZE_KERNEL_ADDRESS))
fec4842d 899 error_at (loc,
d95a2703
JJ
900 "-fsanitize=address is incompatible with "
901 "-fsanitize=kernel-address");
fec4842d 902
fed4de37
YG
903 /* And with TSan. */
904
d95a2703
JJ
905 if ((opts->x_flag_sanitize & SANITIZE_ADDRESS)
906 && (opts->x_flag_sanitize & SANITIZE_THREAD))
fec4842d 907 error_at (loc,
d95a2703
JJ
908 "-fsanitize=address and -fsanitize=kernel-address "
909 "are incompatible with -fsanitize=thread");
910
911 /* Error recovery is not allowed for ASan and TSan. */
912
913 if (opts->x_flag_sanitize_recover & SANITIZE_USER_ADDRESS)
914 error_at (loc, "-fsanitize-recover=address is not supported");
915
916 if (opts->x_flag_sanitize_recover & SANITIZE_THREAD)
917 error_at (loc, "-fsanitize-recover=thread is not supported");
918
919 if (opts->x_flag_sanitize_recover & SANITIZE_LEAK)
920 error_at (loc, "-fsanitize-recover=leak is not supported");
9ca0032c
MZ
921
922 /* When instrumenting the pointers, we don't want to remove
923 the null pointer checks. */
924 if (opts->x_flag_sanitize & (SANITIZE_NULL | SANITIZE_NONNULL_ATTRIBUTE
925 | SANITIZE_RETURNS_NONNULL_ATTRIBUTE))
926 opts->x_flag_delete_null_pointer_checks = 0;
927
928 /* Aggressive compiler optimizations may cause false negatives. */
929 if (opts->x_flag_sanitize)
930 {
931 opts->x_flag_aggressive_loop_optimizations = 0;
932 opts->x_flag_strict_overflow = 0;
933 }
9756310a
NB
934}
935
c662432e
NC
936#define LEFT_COLUMN 27
937
938/* Output ITEM, of length ITEM_WIDTH, in the left column,
939 followed by word-wrapped HELP in a second column. */
940static void
941wrap_help (const char *help,
942 const char *item,
943 unsigned int item_width,
944 unsigned int columns)
945{
946 unsigned int col_width = LEFT_COLUMN;
947 unsigned int remaining, room, len;
948
949 remaining = strlen (help);
950
951 do
952 {
953 room = columns - 3 - MAX (col_width, item_width);
954 if (room > columns)
955 room = 0;
956 len = remaining;
957
958 if (room < len)
959 {
960 unsigned int i;
961
962 for (i = 0; help[i]; i++)
963 {
964 if (i >= room && len != remaining)
965 break;
966 if (help[i] == ' ')
967 len = i;
968 else if ((help[i] == '-' || help[i] == '/')
969 && help[i + 1] != ' '
970 && i > 0 && ISALPHA (help[i - 1]))
971 len = i + 1;
972 }
973 }
974
c3284718 975 printf (" %-*.*s %.*s\n", col_width, item_width, item, len, help);
c662432e
NC
976 item_width = 0;
977 while (help[len] == ' ')
978 len++;
979 help += len;
980 remaining -= len;
981 }
982 while (remaining);
983}
984
985/* Print help for a specific front-end, etc. */
986static void
987print_filtered_help (unsigned int include_flags,
988 unsigned int exclude_flags,
989 unsigned int any_flags,
0576d21f 990 unsigned int columns,
e6d4b984
JM
991 struct gcc_options *opts,
992 unsigned int lang_mask)
c662432e
NC
993{
994 unsigned int i;
995 const char *help;
c662432e
NC
996 bool found = false;
997 bool displayed = false;
ff5101bf 998 char new_help[128];
c662432e
NC
999
1000 if (include_flags == CL_PARAMS)
1001 {
1002 for (i = 0; i < LAST_PARAM; i++)
1003 {
1004 const char *param = compiler_params[i].option;
1005
1006 help = compiler_params[i].help;
1007 if (help == NULL || *help == '\0')
1008 {
1009 if (exclude_flags & CL_UNDOCUMENTED)
1010 continue;
1011 help = undocumented_msg;
1012 }
1013
1014 /* Get the translation. */
1015 help = _(help);
1016
ff5101bf
AK
1017 if (!opts->x_quiet_flag)
1018 {
1019 snprintf (new_help, sizeof (new_help),
1020 _("default %d minimum %d maximum %d"),
1021 compiler_params[i].default_value,
1022 compiler_params[i].min_value,
1023 compiler_params[i].max_value);
1024 help = new_help;
1025 }
c662432e
NC
1026 wrap_help (help, param, strlen (param), columns);
1027 }
1028 putchar ('\n');
1029 return;
1030 }
1031
299404a1
JM
1032 if (!opts->x_help_printed)
1033 opts->x_help_printed = XCNEWVAR (char, cl_options_count);
c662432e 1034
e6d4b984
JM
1035 if (!opts->x_help_enum_printed)
1036 opts->x_help_enum_printed = XCNEWVAR (char, cl_enums_count);
1037
c662432e
NC
1038 for (i = 0; i < cl_options_count; i++)
1039 {
c662432e
NC
1040 const struct cl_option *option = cl_options + i;
1041 unsigned int len;
1042 const char *opt;
1043 const char *tab;
1044
1045 if (include_flags == 0
1046 || ((option->flags & include_flags) != include_flags))
1047 {
1048 if ((option->flags & any_flags) == 0)
1049 continue;
1050 }
1051
1052 /* Skip unwanted switches. */
1053 if ((option->flags & exclude_flags) != 0)
1054 continue;
1055
603349bf
JM
1056 /* The driver currently prints its own help text. */
1057 if ((option->flags & CL_DRIVER) != 0
1058 && (option->flags & (((1U << cl_lang_count) - 1)
1059 | CL_COMMON | CL_TARGET)) == 0)
1060 continue;
1061
c662432e
NC
1062 found = true;
1063 /* Skip switches that have already been printed. */
299404a1 1064 if (opts->x_help_printed[i])
c662432e
NC
1065 continue;
1066
299404a1 1067 opts->x_help_printed[i] = true;
c662432e
NC
1068
1069 help = option->help;
1070 if (help == NULL)
1071 {
1072 if (exclude_flags & CL_UNDOCUMENTED)
1073 continue;
1074 help = undocumented_msg;
1075 }
1076
1077 /* Get the translation. */
1078 help = _(help);
1079
1080 /* Find the gap between the name of the
1081 option and its descriptive text. */
1082 tab = strchr (help, '\t');
1083 if (tab)
1084 {
1085 len = tab - help;
1086 opt = help;
1087 help = tab + 1;
1088 }
1089 else
1090 {
1091 opt = option->opt_text;
1092 len = strlen (opt);
1093 }
1094
1095 /* With the -Q option enabled we change the descriptive text associated
1096 with an option to be an indication of its current setting. */
a7d0d30f 1097 if (!opts->x_quiet_flag)
c662432e 1098 {
0576d21f 1099 void *flag_var = option_flag_var (i, opts);
46625112 1100
c662432e
NC
1101 if (len < (LEFT_COLUMN + 2))
1102 strcpy (new_help, "\t\t");
1103 else
1104 strcpy (new_help, "\t");
1105
21bf1558
JM
1106 if (flag_var != NULL
1107 && option->var_type != CLVC_DEFER)
c662432e
NC
1108 {
1109 if (option->flags & CL_JOINED)
1110 {
1111 if (option->var_type == CLVC_STRING)
1112 {
46625112 1113 if (* (const char **) flag_var != NULL)
c662432e
NC
1114 snprintf (new_help + strlen (new_help),
1115 sizeof (new_help) - strlen (new_help),
81018dcf 1116 "%s", * (const char **) flag_var);
c662432e 1117 }
e6d4b984
JM
1118 else if (option->var_type == CLVC_ENUM)
1119 {
1120 const struct cl_enum *e = &cl_enums[option->var_enum];
1121 int value;
1122 const char *arg = NULL;
1123
1124 value = e->get (flag_var);
1125 enum_value_to_arg (e->values, &arg, value, lang_mask);
1126 if (arg == NULL)
1127 arg = _("[default]");
1128 snprintf (new_help + strlen (new_help),
1129 sizeof (new_help) - strlen (new_help),
81018dcf 1130 "%s", arg);
e6d4b984 1131 }
c662432e
NC
1132 else
1133 sprintf (new_help + strlen (new_help),
46625112 1134 "%#x", * (int *) flag_var);
c662432e
NC
1135 }
1136 else
0576d21f 1137 strcat (new_help, option_enabled (i, opts)
c662432e
NC
1138 ? _("[enabled]") : _("[disabled]"));
1139 }
1140
1141 help = new_help;
1142 }
1143
1144 wrap_help (help, opt, len, columns);
1145 displayed = true;
e6d4b984
JM
1146
1147 if (option->var_type == CLVC_ENUM
1148 && opts->x_help_enum_printed[option->var_enum] != 2)
1149 opts->x_help_enum_printed[option->var_enum] = 1;
c662432e
NC
1150 }
1151
1152 if (! found)
b3eaaf1a
NC
1153 {
1154 unsigned int langs = include_flags & CL_LANG_ALL;
1155
1156 if (langs == 0)
1157 printf (_(" No options with the desired characteristics were found\n"));
1158 else
1159 {
1160 unsigned int i;
1161
1162 /* PR 31349: Tell the user how to see all of the
1163 options supported by a specific front end. */
1164 for (i = 0; (1U << i) < CL_LANG_ALL; i ++)
1165 if ((1U << i) & langs)
1166 printf (_(" None found. Use --help=%s to show *all* the options supported by the %s front-end\n"),
1167 lang_names[i], lang_names[i]);
1168 }
b8698a0f 1169
b3eaaf1a 1170 }
c662432e
NC
1171 else if (! displayed)
1172 printf (_(" All options with the desired characteristics have already been displayed\n"));
1173
1174 putchar ('\n');
e6d4b984
JM
1175
1176 /* Print details of enumerated option arguments, if those
1177 enumerations have help text headings provided. If no help text
1178 is provided, presume that the possible values are listed in the
1179 help text for the relevant options. */
1180 for (i = 0; i < cl_enums_count; i++)
1181 {
1182 unsigned int j, pos;
1183
1184 if (opts->x_help_enum_printed[i] != 1)
1185 continue;
1186 if (cl_enums[i].help == NULL)
1187 continue;
1188 printf (" %s\n ", _(cl_enums[i].help));
1189 pos = 4;
1190 for (j = 0; cl_enums[i].values[j].arg != NULL; j++)
1191 {
1192 unsigned int len = strlen (cl_enums[i].values[j].arg);
1193
1194 if (pos > 4 && pos + 1 + len <= columns)
1195 {
1196 printf (" %s", cl_enums[i].values[j].arg);
1197 pos += 1 + len;
1198 }
1199 else
1200 {
1201 if (pos > 4)
1202 {
1203 printf ("\n ");
1204 pos = 4;
1205 }
1206 printf ("%s", cl_enums[i].values[j].arg);
1207 pos += len;
1208 }
1209 }
1210 printf ("\n\n");
1211 opts->x_help_enum_printed[i] = 2;
1212 }
c662432e
NC
1213}
1214
1215/* Display help for a specified type of option.
1216 The options must have ALL of the INCLUDE_FLAGS set
1217 ANY of the flags in the ANY_FLAGS set
0576d21f 1218 and NONE of the EXCLUDE_FLAGS set. The current option state is in
e6d4b984 1219 OPTS; LANG_MASK is used for interpreting enumerated option state. */
c662432e
NC
1220static void
1221print_specific_help (unsigned int include_flags,
1222 unsigned int exclude_flags,
0576d21f 1223 unsigned int any_flags,
e6d4b984
JM
1224 struct gcc_options *opts,
1225 unsigned int lang_mask)
c662432e
NC
1226{
1227 unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1228 const char * description = NULL;
1229 const char * descrip_extra = "";
1230 size_t i;
1231 unsigned int flag;
c662432e
NC
1232
1233 /* Sanity check: Make sure that we do not have more
1234 languages than we have bits available to enumerate them. */
58265ea6 1235 gcc_assert ((1U << cl_lang_count) <= CL_MIN_OPTION_CLASS);
c662432e
NC
1236
1237 /* If we have not done so already, obtain
1238 the desired maximum width of the output. */
299404a1 1239 if (opts->x_help_columns == 0)
c662432e 1240 {
c9db45aa
TB
1241 opts->x_help_columns = get_terminal_width ();
1242 if (opts->x_help_columns == INT_MAX)
c662432e 1243 /* Use a reasonable default. */
299404a1 1244 opts->x_help_columns = 80;
c662432e
NC
1245 }
1246
1247 /* Decide upon the title for the options that we are going to display. */
1248 for (i = 0, flag = 1; flag <= CL_MAX_OPTION_CLASS; flag <<= 1, i ++)
1249 {
1250 switch (flag & include_flags)
1251 {
1252 case 0:
603349bf 1253 case CL_DRIVER:
c662432e
NC
1254 break;
1255
1256 case CL_TARGET:
1257 description = _("The following options are target specific");
1258 break;
1259 case CL_WARNING:
1260 description = _("The following options control compiler warning messages");
1261 break;
1262 case CL_OPTIMIZATION:
1263 description = _("The following options control optimizations");
1264 break;
1265 case CL_COMMON:
1266 description = _("The following options are language-independent");
1267 break;
1268 case CL_PARAMS:
1269 description = _("The --param option recognizes the following as parameters");
1270 break;
1271 default:
1272 if (i >= cl_lang_count)
1273 break;
0631b69f 1274 if (exclude_flags & all_langs_mask)
c01c261d 1275 description = _("The following options are specific to just the language ");
c662432e 1276 else
b5456e04 1277 description = _("The following options are supported by the language ");
b3eaaf1a 1278 descrip_extra = lang_names [i];
c662432e
NC
1279 break;
1280 }
1281 }
1282
1283 if (description == NULL)
1284 {
1285 if (any_flags == 0)
1286 {
0631b69f 1287 if (include_flags & CL_UNDOCUMENTED)
c662432e 1288 description = _("The following options are not documented");
0631b69f
RW
1289 else if (include_flags & CL_SEPARATE)
1290 description = _("The following options take separate arguments");
1291 else if (include_flags & CL_JOINED)
1292 description = _("The following options take joined arguments");
c662432e
NC
1293 else
1294 {
1295 internal_error ("unrecognized include_flags 0x%x passed to print_specific_help",
1296 include_flags);
1297 return;
1298 }
1299 }
1300 else
1301 {
1302 if (any_flags & all_langs_mask)
1303 description = _("The following options are language-related");
1304 else
1305 description = _("The following options are language-independent");
1306 }
1307 }
1308
1309 printf ("%s%s:\n", description, descrip_extra);
299404a1 1310 print_filtered_help (include_flags, exclude_flags, any_flags,
e6d4b984 1311 opts->x_help_columns, opts, lang_mask);
c662432e
NC
1312}
1313
be3c16c4
DC
1314/* Enable FDO-related flags. */
1315
1316static void
1317enable_fdo_optimizations (struct gcc_options *opts,
1318 struct gcc_options *opts_set,
1319 int value)
1320{
1321 if (!opts_set->x_flag_branch_probabilities)
1322 opts->x_flag_branch_probabilities = value;
1323 if (!opts_set->x_flag_profile_values)
1324 opts->x_flag_profile_values = value;
1325 if (!opts_set->x_flag_unroll_loops)
1326 opts->x_flag_unroll_loops = value;
1327 if (!opts_set->x_flag_peel_loops)
1328 opts->x_flag_peel_loops = value;
1329 if (!opts_set->x_flag_tracer)
1330 opts->x_flag_tracer = value;
1331 if (!opts_set->x_flag_value_profile_transformations)
1332 opts->x_flag_value_profile_transformations = value;
1333 if (!opts_set->x_flag_inline_functions)
1334 opts->x_flag_inline_functions = value;
1335 if (!opts_set->x_flag_ipa_cp)
1336 opts->x_flag_ipa_cp = value;
1337 if (!opts_set->x_flag_ipa_cp_clone
1338 && value && opts->x_flag_ipa_cp)
1339 opts->x_flag_ipa_cp_clone = value;
3c99176a
L
1340 if (!opts_set->x_flag_ipa_cp_alignment
1341 && value && opts->x_flag_ipa_cp)
1342 opts->x_flag_ipa_cp_alignment = value;
be3c16c4
DC
1343 if (!opts_set->x_flag_predictive_commoning)
1344 opts->x_flag_predictive_commoning = value;
1345 if (!opts_set->x_flag_unswitch_loops)
1346 opts->x_flag_unswitch_loops = value;
1347 if (!opts_set->x_flag_gcse_after_reload)
1348 opts->x_flag_gcse_after_reload = value;
1349 if (!opts_set->x_flag_tree_loop_vectorize
1350 && !opts_set->x_flag_tree_vectorize)
1351 opts->x_flag_tree_loop_vectorize = value;
1352 if (!opts_set->x_flag_tree_slp_vectorize
1353 && !opts_set->x_flag_tree_vectorize)
1354 opts->x_flag_tree_slp_vectorize = value;
1355 if (!opts_set->x_flag_vect_cost_model)
1356 opts->x_flag_vect_cost_model = VECT_COST_MODEL_DYNAMIC;
1357 if (!opts_set->x_flag_tree_loop_distribute_patterns)
1358 opts->x_flag_tree_loop_distribute_patterns = value;
1359}
1360
d7b42618 1361/* Handle target- and language-independent options. Return zero to
50431bc4
ZD
1362 generate an "unknown option" message. Only options that need
1363 extra handling need to be listed here; if you simply want
481e1176 1364 DECODED->value assigned to a variable, it happens automatically. */
50431bc4 1365
c98cd5bf 1366bool
46625112 1367common_handle_option (struct gcc_options *opts,
d4d24ba4 1368 struct gcc_options *opts_set,
46625112 1369 const struct cl_decoded_option *decoded,
5f20c657 1370 unsigned int lang_mask, int kind ATTRIBUTE_UNUSED,
a4d8c676 1371 location_t loc,
d5478783
JM
1372 const struct cl_option_handlers *handlers,
1373 diagnostic_context *dc)
d7b42618 1374{
481e1176
JM
1375 size_t scode = decoded->opt_index;
1376 const char *arg = decoded->arg;
1377 int value = decoded->value;
d7b42618
NB
1378 enum opt_code code = (enum opt_code) scode;
1379
481e1176
JM
1380 gcc_assert (decoded->canonical_option_num_elements <= 2);
1381
d7b42618
NB
1382 switch (code)
1383 {
903caebf 1384 case OPT__param:
299404a1 1385 handle_param (opts, opts_set, loc, arg);
903caebf
NB
1386 break;
1387
c662432e
NC
1388 case OPT__help:
1389 {
1390 unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1391 unsigned int undoc_mask;
1392 unsigned int i;
1393
a7d0d30f 1394 if (lang_mask == CL_DRIVER)
6f3d1a5e 1395 break;
a7d0d30f 1396
d5478783
JM
1397 undoc_mask = ((opts->x_verbose_flag | opts->x_extra_warnings)
1398 ? 0
1399 : CL_UNDOCUMENTED);
c662432e
NC
1400 /* First display any single language specific options. */
1401 for (i = 0; i < cl_lang_count; i++)
1402 print_specific_help
e6d4b984
JM
1403 (1U << i, (all_langs_mask & (~ (1U << i))) | undoc_mask, 0, opts,
1404 lang_mask);
c662432e 1405 /* Next display any multi language specific options. */
e6d4b984 1406 print_specific_help (0, undoc_mask, all_langs_mask, opts, lang_mask);
c662432e
NC
1407 /* Then display any remaining, non-language options. */
1408 for (i = CL_MIN_OPTION_CLASS; i <= CL_MAX_OPTION_CLASS; i <<= 1)
603349bf 1409 if (i != CL_DRIVER)
e6d4b984 1410 print_specific_help (i, undoc_mask, 0, opts, lang_mask);
0576d21f 1411 opts->x_exit_after_options = true;
c662432e
NC
1412 break;
1413 }
1414
d185d268 1415 case OPT__target_help:
a7d0d30f
JM
1416 if (lang_mask == CL_DRIVER)
1417 break;
1418
e6d4b984 1419 print_specific_help (CL_TARGET, CL_UNDOCUMENTED, 0, opts, lang_mask);
0576d21f 1420 opts->x_exit_after_options = true;
d185d268
NB
1421 break;
1422
c662432e
NC
1423 case OPT__help_:
1424 {
1425 const char * a = arg;
1426 unsigned int include_flags = 0;
1427 /* Note - by default we include undocumented options when listing
1428 specific classes. If you only want to see documented options
fa10beec 1429 then add ",^undocumented" to the --help= option. E.g.:
c662432e
NC
1430
1431 --help=target,^undocumented */
1432 unsigned int exclude_flags = 0;
1433
a7d0d30f
JM
1434 if (lang_mask == CL_DRIVER)
1435 break;
1436
c662432e
NC
1437 /* Walk along the argument string, parsing each word in turn.
1438 The format is:
1439 arg = [^]{word}[,{arg}]
b5456e04
BM
1440 word = {optimizers|target|warnings|undocumented|
1441 params|common|<language>} */
c662432e
NC
1442 while (* a != 0)
1443 {
0576d21f 1444 static const struct
c662432e
NC
1445 {
1446 const char * string;
1447 unsigned int flag;
1448 }
1449 specifics[] =
1450 {
1451 { "optimizers", CL_OPTIMIZATION },
1452 { "target", CL_TARGET },
1453 { "warnings", CL_WARNING },
1454 { "undocumented", CL_UNDOCUMENTED },
1455 { "params", CL_PARAMS },
66811228
RW
1456 { "joined", CL_JOINED },
1457 { "separate", CL_SEPARATE },
b5456e04 1458 { "common", CL_COMMON },
c662432e
NC
1459 { NULL, 0 }
1460 };
1461 unsigned int * pflags;
86373e7e 1462 const char * comma;
b3eaaf1a 1463 unsigned int lang_flag, specific_flag;
c662432e
NC
1464 unsigned int len;
1465 unsigned int i;
1466
1467 if (* a == '^')
1468 {
1469 ++ a;
1470 pflags = & exclude_flags;
1471 }
1472 else
1473 pflags = & include_flags;
1474
1475 comma = strchr (a, ',');
1476 if (comma == NULL)
1477 len = strlen (a);
1478 else
1479 len = comma - a;
0631b69f
RW
1480 if (len == 0)
1481 {
1482 a = comma + 1;
1483 continue;
1484 }
c662432e 1485
b3eaaf1a
NC
1486 /* Check to see if the string matches an option class name. */
1487 for (i = 0, specific_flag = 0; specifics[i].string != NULL; i++)
c662432e
NC
1488 if (strncasecmp (a, specifics[i].string, len) == 0)
1489 {
b3eaaf1a
NC
1490 specific_flag = specifics[i].flag;
1491 break;
1492 }
0631b69f 1493
b3eaaf1a
NC
1494 /* Check to see if the string matches a language name.
1495 Note - we rely upon the alpha-sorted nature of the entries in
1496 the lang_names array, specifically that shorter names appear
fa10beec 1497 before their longer variants. (i.e. C before C++). That way
b3eaaf1a
NC
1498 when we are attempting to match --help=c for example we will
1499 match with C first and not C++. */
1500 for (i = 0, lang_flag = 0; i < cl_lang_count; i++)
1501 if (strncasecmp (a, lang_names[i], len) == 0)
1502 {
1503 lang_flag = 1U << i;
c662432e
NC
1504 break;
1505 }
1506
b3eaaf1a 1507 if (specific_flag != 0)
c662432e 1508 {
b3eaaf1a
NC
1509 if (lang_flag == 0)
1510 * pflags |= specific_flag;
1511 else
1512 {
1513 /* The option's argument matches both the start of a
1514 language name and the start of an option class name.
1515 We have a special case for when the user has
1516 specified "--help=c", but otherwise we have to issue
1517 a warning. */
1518 if (strncasecmp (a, "c", len) == 0)
1519 * pflags |= lang_flag;
1520 else
299404a1
JM
1521 warning_at (loc, 0,
1522 "--help argument %q.*s is ambiguous, "
1523 "please be more specific",
1524 len, a);
b3eaaf1a 1525 }
c662432e 1526 }
b3eaaf1a
NC
1527 else if (lang_flag != 0)
1528 * pflags |= lang_flag;
1529 else
299404a1
JM
1530 warning_at (loc, 0,
1531 "unrecognized argument to --help= option: %q.*s",
1532 len, a);
c662432e
NC
1533
1534 if (comma == NULL)
1535 break;
1536 a = comma + 1;
1537 }
1538
1539 if (include_flags)
e6d4b984
JM
1540 print_specific_help (include_flags, exclude_flags, 0, opts,
1541 lang_mask);
0576d21f 1542 opts->x_exit_after_options = true;
c662432e
NC
1543 break;
1544 }
1545
d185d268 1546 case OPT__version:
a7d0d30f
JM
1547 if (lang_mask == CL_DRIVER)
1548 break;
1549
0576d21f 1550 opts->x_exit_after_options = true;
d185d268
NB
1551 break;
1552
de5a5fa1 1553 case OPT_fsanitize_:
d95a2703 1554 case OPT_fsanitize_recover_:
de5a5fa1
MP
1555 {
1556 const char *p = arg;
d95a2703
JJ
1557 unsigned int *flag
1558 = code == OPT_fsanitize_ ? &opts->x_flag_sanitize
1559 : &opts->x_flag_sanitize_recover;
de5a5fa1
MP
1560 while (*p != 0)
1561 {
1562 static const struct
1563 {
1564 const char *const name;
1565 unsigned int flag;
1566 size_t len;
1567 } spec[] =
1568 {
fec4842d
YG
1569 { "address", SANITIZE_ADDRESS | SANITIZE_USER_ADDRESS,
1570 sizeof "address" - 1 },
1571 { "kernel-address", SANITIZE_ADDRESS | SANITIZE_KERNEL_ADDRESS,
1572 sizeof "kernel-address" - 1 },
de5a5fa1 1573 { "thread", SANITIZE_THREAD, sizeof "thread" - 1 },
9065ada9 1574 { "leak", SANITIZE_LEAK, sizeof "leak" - 1 },
de5a5fa1
MP
1575 { "shift", SANITIZE_SHIFT, sizeof "shift" - 1 },
1576 { "integer-divide-by-zero", SANITIZE_DIVIDE,
1577 sizeof "integer-divide-by-zero" - 1 },
1578 { "undefined", SANITIZE_UNDEFINED, sizeof "undefined" - 1 },
1579 { "unreachable", SANITIZE_UNREACHABLE,
1580 sizeof "unreachable" - 1 },
b906f4ca 1581 { "vla-bound", SANITIZE_VLA, sizeof "vla-bound" - 1 },
0a508bb6 1582 { "return", SANITIZE_RETURN, sizeof "return" - 1 },
b9a55b13 1583 { "null", SANITIZE_NULL, sizeof "null" - 1 },
31e071ae
MP
1584 { "signed-integer-overflow", SANITIZE_SI_OVERFLOW,
1585 sizeof "signed-integer-overflow" -1 },
ac0ff9f2
JJ
1586 { "bool", SANITIZE_BOOL, sizeof "bool" - 1 },
1587 { "enum", SANITIZE_ENUM, sizeof "enum" - 1 },
f8ed5150
MP
1588 { "float-divide-by-zero", SANITIZE_FLOAT_DIVIDE,
1589 sizeof "float-divide-by-zero" - 1 },
85a16bf8
MP
1590 { "float-cast-overflow", SANITIZE_FLOAT_CAST,
1591 sizeof "float-cast-overflow" - 1 },
0e37a2f3 1592 { "bounds", SANITIZE_BOUNDS, sizeof "bounds" - 1 },
e0f0d3b9
MP
1593 { "bounds-strict", SANITIZE_BOUNDS | SANITIZE_BOUNDS_STRICT,
1594 sizeof "bounds-strict" - 1 },
944fa280 1595 { "alignment", SANITIZE_ALIGNMENT, sizeof "alignment" - 1 },
126edc3f
JJ
1596 { "nonnull-attribute", SANITIZE_NONNULL_ATTRIBUTE,
1597 sizeof "nonnull-attribute" - 1 },
1598 { "returns-nonnull-attribute",
1599 SANITIZE_RETURNS_NONNULL_ATTRIBUTE,
1600 sizeof "returns-nonnull-attribute" - 1 },
0e82f089
MP
1601 { "object-size", SANITIZE_OBJECT_SIZE,
1602 sizeof "object-size" - 1 },
35228ac7 1603 { "vptr", SANITIZE_VPTR, sizeof "vptr" - 1 },
fb153d02 1604 { "all", ~0, sizeof "all" - 1 },
de5a5fa1
MP
1605 { NULL, 0, 0 }
1606 };
1607 const char *comma;
1608 size_t len, i;
1609 bool found = false;
1610
1611 comma = strchr (p, ',');
1612 if (comma == NULL)
1613 len = strlen (p);
1614 else
1615 len = comma - p;
1616 if (len == 0)
1617 {
1618 p = comma + 1;
1619 continue;
1620 }
1621
1622 /* Check to see if the string matches an option class name. */
1623 for (i = 0; spec[i].name != NULL; ++i)
1624 if (len == spec[i].len
1625 && memcmp (p, spec[i].name, len) == 0)
1626 {
1627 /* Handle both -fsanitize and -fno-sanitize cases. */
fb153d02
JJ
1628 if (value && spec[i].flag == ~0U)
1629 {
1630 if (code == OPT_fsanitize_)
1631 error_at (loc, "-fsanitize=all option is not valid");
1632 else
1633 *flag |= ~(SANITIZE_USER_ADDRESS | SANITIZE_THREAD
1634 | SANITIZE_LEAK);
1635 }
1636 else if (value)
d95a2703 1637 *flag |= spec[i].flag;
de5a5fa1 1638 else
d95a2703 1639 *flag &= ~spec[i].flag;
de5a5fa1
MP
1640 found = true;
1641 break;
1642 }
1643
1644 if (! found)
c2ac23fe 1645 error_at (loc,
d95a2703
JJ
1646 "unrecognized argument to -fsanitize%s= option: %q.*s",
1647 code == OPT_fsanitize_ ? "" : "-recover", (int) len, p);
de5a5fa1
MP
1648
1649 if (comma == NULL)
1650 break;
1651 p = comma + 1;
1652 }
1653
d95a2703
JJ
1654 if (code != OPT_fsanitize_)
1655 break;
1656
fec4842d
YG
1657 /* Kernel ASan implies normal ASan but does not yet support
1658 all features. */
d95a2703 1659 if (opts->x_flag_sanitize & SANITIZE_KERNEL_ADDRESS)
fec4842d
YG
1660 {
1661 maybe_set_param_value (PARAM_ASAN_INSTRUMENTATION_WITH_CALL_THRESHOLD, 0,
1662 opts->x_param_values,
1663 opts_set->x_param_values);
1664 maybe_set_param_value (PARAM_ASAN_GLOBALS, 0,
1665 opts->x_param_values,
1666 opts_set->x_param_values);
1667 maybe_set_param_value (PARAM_ASAN_STACK, 0,
1668 opts->x_param_values,
1669 opts_set->x_param_values);
1670 maybe_set_param_value (PARAM_ASAN_USE_AFTER_RETURN, 0,
1671 opts->x_param_values,
1672 opts_set->x_param_values);
1673 }
1674
de5a5fa1
MP
1675 break;
1676 }
1677
fd960af2
YG
1678 case OPT_fasan_shadow_offset_:
1679 /* Deferred. */
1680 break;
1681
d95a2703
JJ
1682 case OPT_fsanitize_recover:
1683 if (value)
1684 opts->x_flag_sanitize_recover
1685 |= SANITIZE_UNDEFINED | SANITIZE_NONDEFAULT;
1686 else
1687 opts->x_flag_sanitize_recover
1688 &= ~(SANITIZE_UNDEFINED | SANITIZE_NONDEFAULT);
1689 break;
1690
903caebf
NB
1691 case OPT_O:
1692 case OPT_Os:
c3a02647 1693 case OPT_Ofast:
bf7a7185 1694 case OPT_Og:
903caebf
NB
1695 /* Currently handled in a prescan. */
1696 break;
1697
aee15221
RG
1698 case OPT_Werror:
1699 dc->warning_as_error_requested = value;
1700 break;
1701
79cf5994 1702 case OPT_Werror_:
a7d0d30f
JM
1703 if (lang_mask == CL_DRIVER)
1704 break;
1705
c5fa0890
JM
1706 enable_warning_as_error (arg, value, lang_mask, handlers,
1707 opts, opts_set, loc, dc);
79cf5994
DD
1708 break;
1709
e01cc6dc 1710 case OPT_Wlarger_than_:
d5478783
JM
1711 opts->x_larger_than_size = value;
1712 opts->x_warn_larger_than = value != -1;
e01cc6dc
NB
1713 break;
1714
5f0f4a3b 1715 case OPT_Wfatal_errors:
d5478783 1716 dc->fatal_errors = value;
5f0f4a3b
JM
1717 break;
1718
a214518f 1719 case OPT_Wframe_larger_than_:
d5478783
JM
1720 opts->x_frame_larger_than_size = value;
1721 opts->x_warn_frame_larger_than = value != -1;
a214518f
SP
1722 break;
1723
a11e0df4
EB
1724 case OPT_Wstack_usage_:
1725 opts->x_warn_stack_usage = value;
1726 opts->x_flag_stack_usage_info = value != -1;
1727 break;
1728
e01cc6dc 1729 case OPT_Wstrict_aliasing:
d5478783 1730 set_Wstrict_aliasing (opts, value);
e01cc6dc
NB
1731 break;
1732
6ac01510 1733 case OPT_Wstrict_overflow:
d5478783
JM
1734 opts->x_warn_strict_overflow = (value
1735 ? (int) WARN_STRICT_OVERFLOW_CONDITIONAL
1736 : 0);
6ac01510
ILT
1737 break;
1738
5f0f4a3b 1739 case OPT_Wsystem_headers:
d5478783 1740 dc->dc_warn_system_headers = value;
903caebf
NB
1741 break;
1742
d185d268 1743 case OPT_aux_info:
d5478783 1744 opts->x_flag_gen_aux_info = 1;
d185d268
NB
1745 break;
1746
1747 case OPT_auxbase_strip:
1748 {
1749 char *tmp = xstrdup (arg);
1750 strip_off_ending (tmp, strlen (tmp));
1751 if (tmp[0])
d5478783 1752 opts->x_aux_base_name = tmp;
fc429b48
TB
1753 else
1754 free (tmp);
d185d268
NB
1755 }
1756 break;
1757
1758 case OPT_d:
299404a1 1759 decode_d_option (arg, opts, loc, dc);
d185d268
NB
1760 break;
1761
058de654 1762 case OPT_fcall_used_:
058de654 1763 case OPT_fcall_saved_:
21bf1558 1764 /* Deferred. */
058de654 1765 break;
6fb5fa3c
DB
1766
1767 case OPT_fdbg_cnt_:
68d070ac
ML
1768 /* Deferred. */
1769 break;
1770
0a090f42 1771 case OPT_fdbg_cnt_list:
299404a1 1772 /* Deferred. */
68d070ac 1773 opts->x_exit_after_options = true;
0a090f42 1774 break;
058de654 1775
c8aea42c 1776 case OPT_fdebug_prefix_map_:
299404a1 1777 /* Deferred. */
c8aea42c
PB
1778 break;
1779
de32c0cb 1780 case OPT_fdiagnostics_show_location_:
e6d4b984 1781 diagnostic_prefixing_rule (dc) = (diagnostic_prefixing_rule_t) value;
de32c0cb 1782 break;
9fec0042
MLI
1783
1784 case OPT_fdiagnostics_show_caret:
1785 dc->show_caret = value;
1786 break;
de32c0cb 1787
4b84d650 1788 case OPT_fdiagnostics_color_:
97aa8bb6 1789 diagnostic_color_init (dc, value);
4b84d650
JJ
1790 break;
1791
2098fe9e 1792 case OPT_fdiagnostics_show_option:
d5478783 1793 dc->show_option_requested = value;
2098fe9e
DD
1794 break;
1795
6de9cd9a 1796 case OPT_fdump_:
21bf1558 1797 /* Deferred. */
6de9cd9a
DN
1798 break;
1799
058de654 1800 case OPT_ffast_math:
d5478783 1801 set_fast_math_flags (opts, value);
058de654
NB
1802 break;
1803
a1a82611 1804 case OPT_funsafe_math_optimizations:
d5478783 1805 set_unsafe_math_optimizations_flags (opts, value);
a1a82611
RE
1806 break;
1807
058de654 1808 case OPT_ffixed_:
21bf1558 1809 /* Deferred. */
058de654
NB
1810 break;
1811
d302c9d6 1812 case OPT_finline_limit_:
48476d13
JM
1813 set_param_value ("max-inline-insns-single", value / 2,
1814 opts->x_param_values, opts_set->x_param_values);
1815 set_param_value ("max-inline-insns-auto", value / 2,
1816 opts->x_param_values, opts_set->x_param_values);
d302c9d6
NB
1817 break;
1818
8d5a7d1f 1819 case OPT_finstrument_functions_exclude_function_list_:
1ebc7e68 1820 add_comma_separated_to_vector
6a1f6c9c 1821 (&opts->x_flag_instrument_functions_exclude_functions, arg);
8d5a7d1f
ILT
1822 break;
1823
1824 case OPT_finstrument_functions_exclude_file_list_:
1ebc7e68 1825 add_comma_separated_to_vector
6a1f6c9c 1826 (&opts->x_flag_instrument_functions_exclude_files, arg);
8d5a7d1f
ILT
1827 break;
1828
de32c0cb 1829 case OPT_fmessage_length_:
d5478783 1830 pp_set_line_maximum_length (dc->printer, value);
9fec0042 1831 diagnostic_set_caret_max_width (dc, value);
de32c0cb
NB
1832 break;
1833
78c60e3d
SS
1834 case OPT_fopt_info:
1835 case OPT_fopt_info_:
1836 /* Deferred. */
1837 break;
1838
c713ddc0
BS
1839 case OPT_foffload_:
1840 /* Deferred. */
1841 break;
1842
1843#ifndef ACCEL_COMPILER
1844 case OPT_foffload_abi_:
1845 error_at (loc, "-foffload-abi option can be specified only for "
1846 "offload compiler");
1847 break;
1848#endif
1849
467cecf3
JB
1850 case OPT_fpack_struct_:
1851 if (value <= 0 || (value & (value - 1)) || value > 16)
299404a1
JM
1852 error_at (loc,
1853 "structure alignment must be a small power of two, not %d",
1854 value);
467cecf3 1855 else
299404a1 1856 opts->x_initial_max_fld_align = value;
467cecf3
JB
1857 break;
1858
68a607d8 1859 case OPT_fplugin_:
68a607d8 1860 case OPT_fplugin_arg_:
21bf1558 1861 /* Deferred. */
68a607d8
DN
1862 break;
1863
2f908293 1864 case OPT_fprofile_use_:
0576d21f 1865 opts->x_profile_data_prefix = xstrdup (arg);
d5478783 1866 opts->x_flag_profile_use = true;
2f908293
SP
1867 value = true;
1868 /* No break here - do -fprofile-use processing. */
a8a5f53a 1869 case OPT_fprofile_use:
be3c16c4 1870 enable_fdo_optimizations (opts, opts_set, value);
9cec31f4 1871 if (!opts_set->x_flag_profile_reorder_functions)
be3c16c4
DC
1872 opts->x_flag_profile_reorder_functions = value;
1873 /* Indirect call profiling should do all useful transformations
1874 speculative devirtualization does. */
bbc9396b
JH
1875 if (!opts_set->x_flag_devirtualize_speculatively
1876 && opts->x_flag_value_profile_transformations)
1877 opts->x_flag_devirtualize_speculatively = false;
a8a5f53a
JH
1878 break;
1879
be3c16c4
DC
1880 case OPT_fauto_profile_:
1881 opts->x_auto_profile_file = xstrdup (arg);
1882 opts->x_flag_auto_profile = true;
1883 value = true;
1884 /* No break here - do -fauto-profile processing. */
1885 case OPT_fauto_profile:
1886 enable_fdo_optimizations (opts, opts_set, value);
1887 if (!opts_set->x_flag_profile_correction)
1888 opts->x_flag_profile_correction = value;
1889 maybe_set_param_value (
1890 PARAM_EARLY_INLINER_MAX_ITERATIONS, 10,
1891 opts->x_param_values, opts_set->x_param_values);
1892 break;
1893
2f908293 1894 case OPT_fprofile_generate_:
0576d21f 1895 opts->x_profile_data_prefix = xstrdup (arg);
2f908293
SP
1896 value = true;
1897 /* No break here - do -fprofile-generate processing. */
a8a5f53a 1898 case OPT_fprofile_generate:
d4d24ba4 1899 if (!opts_set->x_profile_arc_flag)
d5478783 1900 opts->x_profile_arc_flag = value;
d4d24ba4 1901 if (!opts_set->x_flag_profile_values)
d5478783 1902 opts->x_flag_profile_values = value;
d4d24ba4 1903 if (!opts_set->x_flag_inline_functions)
d5478783 1904 opts->x_flag_inline_functions = value;
b0223c3e
JH
1905 /* FIXME: Instrumentation we insert makes ipa-reference bitmaps
1906 quadratic. Disable the pass until better memory representation
1907 is done. */
1c58fe29 1908 if (!opts_set->x_flag_ipa_reference)
b0223c3e 1909 opts->x_flag_ipa_reference = false;
a8a5f53a
JH
1910 break;
1911
ea0f3e87
XDL
1912 case OPT_ftree_vectorize:
1913 if (!opts_set->x_flag_tree_loop_vectorize)
1914 opts->x_flag_tree_loop_vectorize = value;
1915 if (!opts_set->x_flag_tree_slp_vectorize)
1916 opts->x_flag_tree_slp_vectorize = value;
1917 break;
5f0f4a3b 1918 case OPT_fshow_column:
d5478783 1919 dc->show_column = value;
5f0f4a3b
JM
1920 break;
1921
de32c0cb
NB
1922 case OPT_frandom_seed:
1923 /* The real switch is -fno-random-seed. */
1924 if (value)
5f20c657 1925 return false;
299404a1 1926 /* Deferred. */
de32c0cb
NB
1927 break;
1928
1929 case OPT_frandom_seed_:
299404a1 1930 /* Deferred. */
de32c0cb
NB
1931 break;
1932
de32c0cb
NB
1933 case OPT_fsched_verbose_:
1934#ifdef INSN_SCHEDULING
299404a1 1935 /* Handled with Var in common.opt. */
de32c0cb
NB
1936 break;
1937#else
5f20c657 1938 return false;
de32c0cb
NB
1939#endif
1940
569fa502 1941 case OPT_fsched_stalled_insns_:
d5478783
JM
1942 opts->x_flag_sched_stalled_insns = value;
1943 if (opts->x_flag_sched_stalled_insns == 0)
1944 opts->x_flag_sched_stalled_insns = -1;
569fa502
DN
1945 break;
1946
569fa502 1947 case OPT_fsched_stalled_insns_dep_:
d5478783 1948 opts->x_flag_sched_stalled_insns_dep = value;
569fa502 1949 break;
6ff3a151 1950
b38f3813
EB
1951 case OPT_fstack_check_:
1952 if (!strcmp (arg, "no"))
5e471ea6 1953 opts->x_flag_stack_check = NO_STACK_CHECK;
b38f3813
EB
1954 else if (!strcmp (arg, "generic"))
1955 /* This is the old stack checking method. */
5e471ea6 1956 opts->x_flag_stack_check = STACK_CHECK_BUILTIN
b38f3813
EB
1957 ? FULL_BUILTIN_STACK_CHECK
1958 : GENERIC_STACK_CHECK;
1959 else if (!strcmp (arg, "specific"))
1960 /* This is the new stack checking method. */
5e471ea6 1961 opts->x_flag_stack_check = STACK_CHECK_BUILTIN
b38f3813
EB
1962 ? FULL_BUILTIN_STACK_CHECK
1963 : STACK_CHECK_STATIC_BUILTIN
1964 ? STATIC_BUILTIN_STACK_CHECK
1965 : GENERIC_STACK_CHECK;
1966 else
778e02fd 1967 warning_at (loc, 0, "unknown stack check parameter %qs", arg);
b38f3813
EB
1968 break;
1969
de32c0cb
NB
1970 case OPT_fstack_limit:
1971 /* The real switch is -fno-stack-limit. */
1972 if (value)
5f20c657 1973 return false;
21bf1558 1974 /* Deferred. */
de32c0cb
NB
1975 break;
1976
058de654 1977 case OPT_fstack_limit_register_:
058de654 1978 case OPT_fstack_limit_symbol_:
21bf1558 1979 /* Deferred. */
058de654
NB
1980 break;
1981
a11e0df4
EB
1982 case OPT_fstack_usage:
1983 opts->x_flag_stack_usage = value;
1984 opts->x_flag_stack_usage_info = value != 0;
1985 break;
1986
e01cc6dc 1987 case OPT_g:
bc91b0e0
CC
1988 set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, arg, opts, opts_set,
1989 loc);
df38ffef
NB
1990 break;
1991
1992 case OPT_gcoff:
299404a1 1993 set_debug_level (SDB_DEBUG, false, arg, opts, opts_set, loc);
df38ffef
NB
1994 break;
1995
6782438d 1996 case OPT_gdwarf:
f0defe58 1997 if (arg && strlen (arg) != 0)
6782438d
SKS
1998 {
1999 error_at (loc, "%<-gdwarf%s%> is ambiguous; "
2000 "use %<-gdwarf-%s%> for DWARF version "
2001 "or %<-gdwarf -g%s%> for debug level", arg, arg, arg);
2002 break;
2003 }
2004 else
f0defe58
SKS
2005 value = opts->x_dwarf_version;
2006
2007 /* FALLTHRU */
53b2323e 2008 case OPT_gdwarf_:
5d45c9c0 2009 if (value < 2 || value > 5)
299404a1 2010 error_at (loc, "dwarf version %d is not supported", value);
53b2323e 2011 else
a7d0d30f 2012 opts->x_dwarf_version = value;
299404a1 2013 set_debug_level (DWARF2_DEBUG, false, "", opts, opts_set, loc);
df38ffef
NB
2014 break;
2015
99ea153e
SA
2016 case OPT_gsplit_dwarf:
2017 set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, "", opts, opts_set,
2018 loc);
2019 break;
2020
df38ffef 2021 case OPT_ggdb:
299404a1 2022 set_debug_level (NO_DEBUG, 2, arg, opts, opts_set, loc);
df38ffef
NB
2023 break;
2024
2025 case OPT_gstabs:
2026 case OPT_gstabs_:
299404a1
JM
2027 set_debug_level (DBX_DEBUG, code == OPT_gstabs_, arg, opts, opts_set,
2028 loc);
df38ffef
NB
2029 break;
2030
2031 case OPT_gvms:
299404a1 2032 set_debug_level (VMS_DEBUG, false, arg, opts, opts_set, loc);
df38ffef
NB
2033 break;
2034
2035 case OPT_gxcoff:
2036 case OPT_gxcoff_:
299404a1
JM
2037 set_debug_level (XCOFF_DEBUG, code == OPT_gxcoff_, arg, opts, opts_set,
2038 loc);
e01cc6dc
NB
2039 break;
2040
29d7cbd1
RO
2041 case OPT_gz:
2042 case OPT_gz_:
2043 /* Handled completely via specs. */
2044 break;
2045
d185d268 2046 case OPT_pedantic_errors:
d5478783 2047 dc->pedantic_errors = 1;
9b095bf1
MLI
2048 control_warning_option (OPT_Wpedantic, DK_ERROR, value,
2049 loc, lang_mask,
2050 handlers, opts, opts_set,
2051 dc);
c04b6b38
RG
2052 break;
2053
014d92e1 2054 case OPT_flto:
595c8dfa 2055 opts->x_flag_lto = value ? "" : NULL;
e10909ce
AK
2056 break;
2057
5f0f4a3b 2058 case OPT_w:
d5478783 2059 dc->dc_inhibit_warnings = true;
5f0f4a3b
JM
2060 break;
2061
3a789837
NF
2062 case OPT_fmax_errors_:
2063 dc->max_errors = value;
2064 break;
2065
b352afba
NC
2066 case OPT_fuse_ld_bfd:
2067 case OPT_fuse_ld_gold:
da18ea94
RAE
2068 case OPT_fuse_linker_plugin:
2069 /* No-op. Used by the driver and passed to us because it starts with f.*/
2070 break;
2071
955f5a07
JJ
2072 case OPT_fwrapv:
2073 if (value)
2074 opts->x_flag_trapv = 0;
2075 break;
2076
2077 case OPT_ftrapv:
2078 if (value)
2079 opts->x_flag_wrapv = 0;
2080 break;
2081
b84d4347 2082 case OPT_fipa_icf:
9d4ded75
ML
2083 opts->x_flag_ipa_icf_functions = value;
2084 opts->x_flag_ipa_icf_variables = value;
b84d4347
ML
2085 break;
2086
50431bc4
ZD
2087 default:
2088 /* If the flag was handled in a standard way, assume the lack of
2089 processing here is intentional. */
46625112 2090 gcc_assert (option_flag_var (scode, opts));
0e61db61 2091 break;
d7b42618
NB
2092 }
2093
7d5a5747
MLI
2094 common_handle_option_auto (opts, opts_set, decoded, lang_mask, kind,
2095 loc, handlers, dc);
5f20c657 2096 return true;
d7b42618 2097}
903caebf
NB
2098
2099/* Handle --param NAME=VALUE. */
2100static void
48476d13 2101handle_param (struct gcc_options *opts, struct gcc_options *opts_set,
299404a1 2102 location_t loc, const char *carg)
903caebf
NB
2103{
2104 char *equal, *arg;
2105 int value;
2106
2107 arg = xstrdup (carg);
2108 equal = strchr (arg, '=');
2109 if (!equal)
299404a1
JM
2110 error_at (loc, "%s: --param arguments should be of the form NAME=VALUE",
2111 arg);
903caebf
NB
2112 else
2113 {
2114 value = integral_argument (equal + 1);
2115 if (value == -1)
299404a1 2116 error_at (loc, "invalid --param value %qs", equal + 1);
903caebf
NB
2117 else
2118 {
2119 *equal = '\0';
48476d13
JM
2120 set_param_value (arg, value,
2121 opts->x_param_values, opts_set->x_param_values);
903caebf
NB
2122 }
2123 }
2124
2125 free (arg);
2126}
2127
d5478783 2128/* Used to set the level of strict aliasing warnings in OPTS,
79bedddc
SR
2129 when no level is specified (i.e., when -Wstrict-aliasing, and not
2130 -Wstrict-aliasing=level was given).
2131 ONOFF is assumed to take value 1 when -Wstrict-aliasing is specified,
2132 and 0 otherwise. After calling this function, wstrict_aliasing will be
2133 set to the default value of -Wstrict_aliasing=level, currently 3. */
65d4f2cd 2134static void
d5478783 2135set_Wstrict_aliasing (struct gcc_options *opts, int onoff)
79bedddc
SR
2136{
2137 gcc_assert (onoff == 0 || onoff == 1);
2138 if (onoff != 0)
d5478783 2139 opts->x_warn_strict_aliasing = 3;
621b5ed6 2140 else
d5478783 2141 opts->x_warn_strict_aliasing = 0;
79bedddc
SR
2142}
2143
058de654
NB
2144/* The following routines are useful in setting all the flags that
2145 -ffast-math and -fno-fast-math imply. */
7bb3487f 2146static void
d5478783 2147set_fast_math_flags (struct gcc_options *opts, int set)
058de654 2148{
5e46b0c6
ILT
2149 if (!opts->frontend_set_flag_unsafe_math_optimizations)
2150 {
2151 opts->x_flag_unsafe_math_optimizations = set;
2152 set_unsafe_math_optimizations_flags (opts, set);
2153 }
2154 if (!opts->frontend_set_flag_finite_math_only)
2155 opts->x_flag_finite_math_only = set;
2156 if (!opts->frontend_set_flag_errno_math)
2157 opts->x_flag_errno_math = !set;
058de654 2158 if (set)
039c3d42 2159 {
5e46b0c6
ILT
2160 if (!opts->frontend_set_flag_signaling_nans)
2161 opts->x_flag_signaling_nans = 0;
2162 if (!opts->frontend_set_flag_rounding_math)
2163 opts->x_flag_rounding_math = 0;
2164 if (!opts->frontend_set_flag_cx_limited_range)
2165 opts->x_flag_cx_limited_range = 1;
039c3d42 2166 }
058de654
NB
2167}
2168
b8698a0f
L
2169/* When -funsafe-math-optimizations is set the following
2170 flags are set as well. */
7bb3487f 2171static void
d5478783 2172set_unsafe_math_optimizations_flags (struct gcc_options *opts, int set)
a1a82611 2173{
5e46b0c6
ILT
2174 if (!opts->frontend_set_flag_trapping_math)
2175 opts->x_flag_trapping_math = !set;
2176 if (!opts->frontend_set_flag_signed_zeros)
2177 opts->x_flag_signed_zeros = !set;
2178 if (!opts->frontend_set_flag_associative_math)
2179 opts->x_flag_associative_math = set;
2180 if (!opts->frontend_set_flag_reciprocal_math)
2181 opts->x_flag_reciprocal_math = set;
a1a82611
RE
2182}
2183
0576d21f 2184/* Return true iff flags in OPTS are set as if -ffast-math. */
058de654 2185bool
0576d21f 2186fast_math_flags_set_p (const struct gcc_options *opts)
058de654 2187{
0576d21f
JM
2188 return (!opts->x_flag_trapping_math
2189 && opts->x_flag_unsafe_math_optimizations
2190 && opts->x_flag_finite_math_only
2191 && !opts->x_flag_signed_zeros
2192 && !opts->x_flag_errno_math);
058de654 2193}
cf03fd63 2194
ab442df7
MM
2195/* Return true iff flags are set as if -ffast-math but using the flags stored
2196 in the struct cl_optimization structure. */
2197bool
2198fast_math_flags_struct_set_p (struct cl_optimization *opt)
2199{
e3339d0f
JM
2200 return (!opt->x_flag_trapping_math
2201 && opt->x_flag_unsafe_math_optimizations
2202 && opt->x_flag_finite_math_only
2203 && !opt->x_flag_signed_zeros
2204 && !opt->x_flag_errno_math);
ab442df7
MM
2205}
2206
0576d21f
JM
2207/* Handle a debug output -g switch for options OPTS
2208 (OPTS_SET->x_write_symbols storing whether a debug type was passed
299404a1
JM
2209 explicitly), location LOC. EXTENDED is true or false to support
2210 extended output (2 is special and means "-ggdb" was given). */
df38ffef 2211static void
0576d21f 2212set_debug_level (enum debug_info_type type, int extended, const char *arg,
299404a1
JM
2213 struct gcc_options *opts, struct gcc_options *opts_set,
2214 location_t loc)
df38ffef 2215{
0576d21f 2216 opts->x_use_gnu_debug_info_extensions = extended;
df38ffef
NB
2217
2218 if (type == NO_DEBUG)
2219 {
0576d21f 2220 if (opts->x_write_symbols == NO_DEBUG)
df38ffef 2221 {
0576d21f 2222 opts->x_write_symbols = PREFERRED_DEBUGGING_TYPE;
df38ffef
NB
2223
2224 if (extended == 2)
2225 {
c9665100 2226#if defined DWARF2_DEBUGGING_INFO || defined DWARF2_LINENO_DEBUGGING_INFO
0576d21f 2227 opts->x_write_symbols = DWARF2_DEBUG;
df38ffef 2228#elif defined DBX_DEBUGGING_INFO
0576d21f 2229 opts->x_write_symbols = DBX_DEBUG;
df38ffef
NB
2230#endif
2231 }
2232
0576d21f 2233 if (opts->x_write_symbols == NO_DEBUG)
299404a1 2234 warning_at (loc, 0, "target system does not support debug output");
df38ffef
NB
2235 }
2236 }
2237 else
2238 {
2239 /* Does it conflict with an already selected type? */
0576d21f
JM
2240 if (opts_set->x_write_symbols != NO_DEBUG
2241 && opts->x_write_symbols != NO_DEBUG
2242 && type != opts->x_write_symbols)
778e02fd 2243 error_at (loc, "debug format %qs conflicts with prior selection",
299404a1 2244 debug_type_names[type]);
0576d21f
JM
2245 opts->x_write_symbols = type;
2246 opts_set->x_write_symbols = type;
df38ffef
NB
2247 }
2248
bc91b0e0
CC
2249 /* A debug flag without a level defaults to level 2.
2250 If off or at level 1, set it to level 2, but if already
2251 at level 3, don't lower it. */
df38ffef
NB
2252 if (*arg == '\0')
2253 {
bc91b0e0 2254 if (opts->x_debug_info_level < DINFO_LEVEL_NORMAL)
0576d21f 2255 opts->x_debug_info_level = DINFO_LEVEL_NORMAL;
df38ffef
NB
2256 }
2257 else
2258 {
32e8bb8e
ILT
2259 int argval = integral_argument (arg);
2260 if (argval == -1)
778e02fd 2261 error_at (loc, "unrecognised debug output level %qs", arg);
32e8bb8e 2262 else if (argval > 3)
778e02fd 2263 error_at (loc, "debug output level %qs is too high", arg);
32e8bb8e 2264 else
0576d21f 2265 opts->x_debug_info_level = (enum debug_info_levels) argval;
df38ffef
NB
2266 }
2267}
2268
299404a1
JM
2269/* Arrange to dump core on error for diagnostic context DC. (The
2270 regular error message is still printed first, except in the case of
2271 abort ().) */
75685792 2272
c98cd5bf 2273static void
299404a1 2274setup_core_dumping (diagnostic_context *dc)
75685792 2275{
c98cd5bf
JM
2276#ifdef SIGABRT
2277 signal (SIGABRT, SIG_DFL);
2278#endif
2279#if defined(HAVE_SETRLIMIT)
2280 {
2281 struct rlimit rlim;
2282 if (getrlimit (RLIMIT_CORE, &rlim) != 0)
40fecdd6 2283 fatal_error (input_location, "getting core file size maximum limit: %m");
c98cd5bf
JM
2284 rlim.rlim_cur = rlim.rlim_max;
2285 if (setrlimit (RLIMIT_CORE, &rlim) != 0)
40fecdd6
JM
2286 fatal_error (input_location,
2287 "setting core file size limit to maximum: %m");
c98cd5bf
JM
2288 }
2289#endif
299404a1 2290 diagnostic_abort_on_error (dc);
75685792 2291}
5c60a017 2292
299404a1
JM
2293/* Parse a -d<ARG> command line switch for OPTS, location LOC,
2294 diagnostic context DC. */
5c60a017 2295
c98cd5bf 2296static void
299404a1
JM
2297decode_d_option (const char *arg, struct gcc_options *opts,
2298 location_t loc, diagnostic_context *dc)
5c60a017 2299{
c98cd5bf 2300 int c;
5c60a017 2301
c98cd5bf
JM
2302 while (*arg)
2303 switch (c = *arg++)
2304 {
2305 case 'A':
299404a1 2306 opts->x_flag_debug_asm = 1;
c98cd5bf
JM
2307 break;
2308 case 'p':
299404a1 2309 opts->x_flag_print_asm_name = 1;
c98cd5bf
JM
2310 break;
2311 case 'P':
299404a1
JM
2312 opts->x_flag_dump_rtl_in_asm = 1;
2313 opts->x_flag_print_asm_name = 1;
c98cd5bf 2314 break;
c98cd5bf 2315 case 'x':
299404a1 2316 opts->x_rtl_dump_and_exit = 1;
c98cd5bf
JM
2317 break;
2318 case 'D': /* These are handled by the preprocessor. */
2319 case 'I':
2320 case 'M':
2321 case 'N':
2322 case 'U':
2323 break;
2324 case 'H':
299404a1 2325 setup_core_dumping (dc);
c98cd5bf
JM
2326 break;
2327 case 'a':
299404a1 2328 opts->x_flag_dump_all_passed = true;
c98cd5bf 2329 break;
21bf1558 2330
c98cd5bf 2331 default:
299404a1 2332 warning_at (loc, 0, "unrecognized gcc debugging option: %c", c);
c98cd5bf
JM
2333 break;
2334 }
5c60a017 2335}
dc90f45b 2336
1ebe4b4f 2337/* Enable (or disable if VALUE is 0) a warning option ARG (language
c5fa0890
JM
2338 mask LANG_MASK, option handlers HANDLERS) as an error for option
2339 structures OPTS and OPTS_SET, diagnostic context DC (possibly
2340 NULL), location LOC. This is used by -Werror=. */
dc90f45b 2341
a4d8c676 2342static void
5f20c657 2343enable_warning_as_error (const char *arg, int value, unsigned int lang_mask,
1ebe4b4f 2344 const struct cl_option_handlers *handlers,
c5fa0890
JM
2345 struct gcc_options *opts,
2346 struct gcc_options *opts_set,
a4d8c676 2347 location_t loc, diagnostic_context *dc)
dc90f45b
MLI
2348{
2349 char *new_option;
2350 int option_index;
2351
2352 new_option = XNEWVEC (char, strlen (arg) + 2);
2353 new_option[0] = 'W';
2354 strcpy (new_option + 1, arg);
2355 option_index = find_opt (new_option, lang_mask);
6e2f1956 2356 if (option_index == OPT_SPECIAL_unknown)
dc90f45b 2357 {
299404a1 2358 error_at (loc, "-Werror=%s: no option -%s", arg, new_option);
dc90f45b
MLI
2359 }
2360 else
2361 {
87cf0651
SB
2362 const diagnostic_t kind = value ? DK_ERROR : DK_WARNING;
2363
c5fa0890
JM
2364 control_warning_option (option_index, (int) kind, value,
2365 loc, lang_mask,
2366 handlers, opts, opts_set, dc);
dc90f45b
MLI
2367 }
2368 free (new_option);
2369}
5f0f4a3b
JM
2370
2371/* Return malloced memory for the name of the option OPTION_INDEX
2372 which enabled a diagnostic (context CONTEXT), originally of type
2373 ORIG_DIAG_KIND but possibly converted to DIAG_KIND by options such
2374 as -Werror. */
2375
2376char *
2377option_name (diagnostic_context *context, int option_index,
2378 diagnostic_t orig_diag_kind, diagnostic_t diag_kind)
2379{
2380 if (option_index)
2381 {
2382 /* A warning classified as an error. */
2383 if ((orig_diag_kind == DK_WARNING || orig_diag_kind == DK_PEDWARN)
2384 && diag_kind == DK_ERROR)
2385 return concat (cl_options[OPT_Werror_].opt_text,
2386 /* Skip over "-W". */
2387 cl_options[option_index].opt_text + 2,
2388 NULL);
2389 /* A warning with option. */
2390 else
2391 return xstrdup (cl_options[option_index].opt_text);
2392 }
2393 /* A warning without option classified as an error. */
9f8da907
RS
2394 else if ((orig_diag_kind == DK_WARNING || orig_diag_kind == DK_PEDWARN
2395 || diag_kind == DK_WARNING)
2396 && context->warning_as_error_requested)
2397 return xstrdup (cl_options[OPT_Werror].opt_text);
5f0f4a3b
JM
2398 else
2399 return NULL;
2400}