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