]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/opts.c
PR c++/61339 - add mismatch between struct and class [-Wmismatched-tags] to non-bugs
[thirdparty/gcc.git] / gcc / opts.c
CommitLineData
2772ef3e 1/* Command line option handling.
a5544970 2 Copyright (C) 2002-2019 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"
19ff0049 33#include "spellcheck.h"
5bcc5a3b 34#include "opt-suggestions.h"
2772ef3e 35
65d4f2cd
MLI
36static void set_Wstrict_aliasing (struct gcc_options *opts, int onoff);
37
a7d0d30f
JM
38/* Indexed by enum debug_info_type. */
39const char *const debug_type_names[] =
40{
180295ed 41 "none", "stabs", "dwarf-2", "xcoff", "vms"
a7d0d30f
JM
42};
43
39ef6592
LC
44/* Parse the -femit-struct-debug-detailed option value
45 and set the flag variables. */
46
47#define MATCH( prefix, string ) \
48 ((strncmp (prefix, string, sizeof prefix - 1) == 0) \
49 ? ((string += sizeof prefix - 1), 1) : 0)
50
51void
299404a1
JM
52set_struct_debug_option (struct gcc_options *opts, location_t loc,
53 const char *spec)
39ef6592
LC
54{
55 /* various labels for comparison */
0576d21f
JM
56 static const char dfn_lbl[] = "dfn:", dir_lbl[] = "dir:", ind_lbl[] = "ind:";
57 static const char ord_lbl[] = "ord:", gen_lbl[] = "gen:";
58 static const char none_lbl[] = "none", any_lbl[] = "any";
59 static const char base_lbl[] = "base", sys_lbl[] = "sys";
39ef6592
LC
60
61 enum debug_struct_file files = DINFO_STRUCT_FILE_ANY;
62 /* Default is to apply to as much as possible. */
63 enum debug_info_usage usage = DINFO_USAGE_NUM_ENUMS;
64 int ord = 1, gen = 1;
65
66 /* What usage? */
67 if (MATCH (dfn_lbl, spec))
68 usage = DINFO_USAGE_DFN;
69 else if (MATCH (dir_lbl, spec))
70 usage = DINFO_USAGE_DIR_USE;
71 else if (MATCH (ind_lbl, spec))
72 usage = DINFO_USAGE_IND_USE;
73
74 /* Generics or not? */
75 if (MATCH (ord_lbl, spec))
76 gen = 0;
77 else if (MATCH (gen_lbl, spec))
78 ord = 0;
79
80 /* What allowable environment? */
81 if (MATCH (none_lbl, spec))
82 files = DINFO_STRUCT_FILE_NONE;
83 else if (MATCH (any_lbl, spec))
84 files = DINFO_STRUCT_FILE_ANY;
85 else if (MATCH (sys_lbl, spec))
86 files = DINFO_STRUCT_FILE_SYS;
87 else if (MATCH (base_lbl, spec))
88 files = DINFO_STRUCT_FILE_BASE;
89 else
299404a1
JM
90 error_at (loc,
91 "argument %qs to %<-femit-struct-debug-detailed%> "
92 "not recognized",
93 spec);
39ef6592
LC
94
95 /* Effect the specification. */
96 if (usage == DINFO_USAGE_NUM_ENUMS)
97 {
98 if (ord)
99 {
69ccdddb
JM
100 opts->x_debug_struct_ordinary[DINFO_USAGE_DFN] = files;
101 opts->x_debug_struct_ordinary[DINFO_USAGE_DIR_USE] = files;
102 opts->x_debug_struct_ordinary[DINFO_USAGE_IND_USE] = files;
39ef6592
LC
103 }
104 if (gen)
105 {
69ccdddb
JM
106 opts->x_debug_struct_generic[DINFO_USAGE_DFN] = files;
107 opts->x_debug_struct_generic[DINFO_USAGE_DIR_USE] = files;
108 opts->x_debug_struct_generic[DINFO_USAGE_IND_USE] = files;
39ef6592
LC
109 }
110 }
111 else
112 {
113 if (ord)
69ccdddb 114 opts->x_debug_struct_ordinary[usage] = files;
39ef6592 115 if (gen)
69ccdddb 116 opts->x_debug_struct_generic[usage] = files;
39ef6592
LC
117 }
118
119 if (*spec == ',')
299404a1 120 set_struct_debug_option (opts, loc, spec+1);
39ef6592
LC
121 else
122 {
123 /* No more -femit-struct-debug-detailed specifications.
124 Do final checks. */
125 if (*spec != '\0')
299404a1
JM
126 error_at (loc,
127 "argument %qs to %<-femit-struct-debug-detailed%> unknown",
128 spec);
69ccdddb
JM
129 if (opts->x_debug_struct_ordinary[DINFO_USAGE_DIR_USE]
130 < opts->x_debug_struct_ordinary[DINFO_USAGE_IND_USE]
131 || opts->x_debug_struct_generic[DINFO_USAGE_DIR_USE]
132 < opts->x_debug_struct_generic[DINFO_USAGE_IND_USE])
299404a1
JM
133 error_at (loc,
134 "%<-femit-struct-debug-detailed=dir:...%> must allow "
135 "at least as much as "
136 "%<-femit-struct-debug-detailed=ind:...%>");
39ef6592
LC
137 }
138}
139
c98cd5bf
JM
140/* Strip off a legitimate source ending from the input string NAME of
141 length LEN. Rather than having to know the names used by all of
142 our front ends, we strip off an ending of a period followed by
ed5cd5bc 143 up to fource characters. (C++ uses ".cpp".) */
c98cd5bf
JM
144
145void
146strip_off_ending (char *name, int len)
147{
148 int i;
ed5cd5bc 149 for (i = 2; i < 5 && len > i; i++)
c98cd5bf
JM
150 {
151 if (name[len - i] == '.')
152 {
153 name[len - i] = '\0';
154 break;
155 }
156 }
157}
158
39ef6592
LC
159/* Find the base name of a path, stripping off both directories and
160 a single final extension. */
69ccdddb 161int
39ef6592
LC
162base_of_path (const char *path, const char **base_out)
163{
164 const char *base = path;
165 const char *dot = 0;
166 const char *p = path;
167 char c = *p;
168 while (c)
169 {
c3284718 170 if (IS_DIR_SEPARATOR (c))
39ef6592
LC
171 {
172 base = p + 1;
173 dot = 0;
174 }
175 else if (c == '.')
176 dot = p;
177 c = *++p;
178 }
179 if (!dot)
180 dot = p;
181 *base_out = base;
182 return dot - base;
183}
184
2cc98056 185/* What to print when a switch has no documentation. */
a7b2e184
MS
186static const char undocumented_msg[] = N_("This option lacks documentation.");
187static const char use_diagnosed_msg[] = N_("Uses of this option are diagnosed.");
2cc98056 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 220 const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED,
130fcab0 221 diagnostic_context *dc, void (*) (void))
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
d6874f56 271/* Initialize opts_obstack. */
de5672fc
ML
272
273void
274init_opts_obstack (void)
275{
d6874f56 276 gcc_obstack_init (&opts_obstack);
de5672fc
ML
277}
278
a75bfaa6
JM
279/* Initialize OPTS and OPTS_SET before using them in parsing options. */
280
281void
282init_options_struct (struct gcc_options *opts, struct gcc_options *opts_set)
283{
48476d13
JM
284 size_t num_params = get_num_compiler_params ();
285
d6874f56
DM
286 /* Ensure that opts_obstack has already been initialized by the time
287 that we initialize any gcc_options instances (PR jit/68446). */
288 gcc_assert (opts_obstack.chunk_size > 0);
dc357798 289
a75bfaa6 290 *opts = global_options_init;
bf7b5747
ST
291
292 if (opts_set)
293 memset (opts_set, 0, sizeof (*opts_set));
a75bfaa6 294
48476d13 295 opts->x_param_values = XNEWVEC (int, num_params);
bf7b5747
ST
296
297 if (opts_set)
298 opts_set->x_param_values = XCNEWVEC (int, num_params);
299
48476d13
JM
300 init_param_values (opts->x_param_values);
301
a75bfaa6
JM
302 /* Initialize whether `char' is signed. */
303 opts->x_flag_signed_char = DEFAULT_SIGNED_CHAR;
304 /* Set this to a special "uninitialized" value. The actual default
305 is set after target options have been processed. */
306 opts->x_flag_short_enums = 2;
307
677f3fa8 308 /* Initialize target_flags before default_options_optimization
a75bfaa6 309 so the latter can modify it. */
677f3fa8 310 opts->x_target_flags = targetm_common.default_target_flags;
a75bfaa6
JM
311
312 /* Some targets have ABI-specified unwind tables. */
677f3fa8 313 opts->x_flag_unwind_tables = targetm_common.unwind_tables_default;
7e4aae92
JM
314
315 /* Some targets have other target-specific initialization. */
677f3fa8 316 targetm_common.option_init_struct (opts);
a75bfaa6
JM
317}
318
0ef443cf
DM
319/* Release any allocations owned by OPTS. */
320
321void
322finalize_options_struct (struct gcc_options *opts)
323{
324 XDELETEVEC (opts->x_param_values);
325}
326
3020190e 327/* If indicated by the optimization level LEVEL (-Os if SIZE is set,
bf7a7185
RG
328 -Ofast if FAST is set, -Og if DEBUG is set), apply the option DEFAULT_OPT
329 to OPTS and OPTS_SET, diagnostic context DC, location LOC, with language
330 mask LANG_MASK and option handlers HANDLERS. */
3020190e
JM
331
332static void
333maybe_default_option (struct gcc_options *opts,
334 struct gcc_options *opts_set,
335 const struct default_options *default_opt,
bf7a7185 336 int level, bool size, bool fast, bool debug,
3020190e
JM
337 unsigned int lang_mask,
338 const struct cl_option_handlers *handlers,
a4d8c676 339 location_t loc,
3020190e
JM
340 diagnostic_context *dc)
341{
342 const struct cl_option *option = &cl_options[default_opt->opt_index];
343 bool enabled;
344
345 if (size)
346 gcc_assert (level == 2);
347 if (fast)
348 gcc_assert (level == 3);
bf7a7185
RG
349 if (debug)
350 gcc_assert (level == 1);
3020190e
JM
351
352 switch (default_opt->levels)
353 {
354 case OPT_LEVELS_ALL:
355 enabled = true;
356 break;
357
358 case OPT_LEVELS_0_ONLY:
359 enabled = (level == 0);
360 break;
361
362 case OPT_LEVELS_1_PLUS:
363 enabled = (level >= 1);
364 break;
365
366 case OPT_LEVELS_1_PLUS_SPEED_ONLY:
bf7a7185
RG
367 enabled = (level >= 1 && !size && !debug);
368 break;
369
370 case OPT_LEVELS_1_PLUS_NOT_DEBUG:
371 enabled = (level >= 1 && !debug);
3020190e
JM
372 break;
373
374 case OPT_LEVELS_2_PLUS:
375 enabled = (level >= 2);
376 break;
377
378 case OPT_LEVELS_2_PLUS_SPEED_ONLY:
bf7a7185 379 enabled = (level >= 2 && !size && !debug);
3020190e
JM
380 break;
381
382 case OPT_LEVELS_3_PLUS:
383 enabled = (level >= 3);
384 break;
385
386 case OPT_LEVELS_3_PLUS_AND_SIZE:
387 enabled = (level >= 3 || size);
388 break;
389
390 case OPT_LEVELS_SIZE:
391 enabled = size;
392 break;
393
394 case OPT_LEVELS_FAST:
395 enabled = fast;
396 break;
397
398 case OPT_LEVELS_NONE:
399 default:
400 gcc_unreachable ();
401 }
402
403 if (enabled)
404 handle_generated_option (opts, opts_set, default_opt->opt_index,
405 default_opt->arg, default_opt->value,
a4d8c676 406 lang_mask, DK_UNSPECIFIED, loc,
b9822443 407 handlers, true, dc);
3020190e 408 else if (default_opt->arg == NULL
300d83d9 409 && !option->cl_reject_negative)
3020190e
JM
410 handle_generated_option (opts, opts_set, default_opt->opt_index,
411 default_opt->arg, !default_opt->value,
a4d8c676 412 lang_mask, DK_UNSPECIFIED, loc,
b9822443 413 handlers, true, dc);
3020190e
JM
414}
415
416/* As indicated by the optimization level LEVEL (-Os if SIZE is set,
417 -Ofast if FAST is set), apply the options in array DEFAULT_OPTS to
a4d8c676
JM
418 OPTS and OPTS_SET, diagnostic context DC, location LOC, with
419 language mask LANG_MASK and option handlers HANDLERS. */
3020190e
JM
420
421static void
422maybe_default_options (struct gcc_options *opts,
423 struct gcc_options *opts_set,
424 const struct default_options *default_opts,
bf7a7185 425 int level, bool size, bool fast, bool debug,
3020190e
JM
426 unsigned int lang_mask,
427 const struct cl_option_handlers *handlers,
a4d8c676 428 location_t loc,
3020190e
JM
429 diagnostic_context *dc)
430{
431 size_t i;
432
433 for (i = 0; default_opts[i].levels != OPT_LEVELS_NONE; i++)
434 maybe_default_option (opts, opts_set, &default_opts[i],
bf7a7185
RG
435 level, size, fast, debug,
436 lang_mask, handlers, loc, dc);
3020190e
JM
437}
438
ded7b411
SL
439/* Table of options enabled by default at different levels.
440 Please keep this list sorted by level and alphabetized within
441 each level; this makes it easier to keep the documentation
442 in sync. */
3020190e
JM
443
444static const struct default_options default_options_table[] =
445 {
ded7b411
SL
446 /* -O1 and -Og optimizations. */
447 { OPT_LEVELS_1_PLUS, OPT_fcombine_stack_adjustments, NULL, 1 },
448 { OPT_LEVELS_1_PLUS, OPT_fcompare_elim, NULL, 1 },
3020190e 449 { OPT_LEVELS_1_PLUS, OPT_fcprop_registers, NULL, 1 },
ded7b411 450 { OPT_LEVELS_1_PLUS, OPT_fdefer_pop, NULL, 1 },
3020190e 451 { OPT_LEVELS_1_PLUS, OPT_fforward_propagate, NULL, 1 },
ded7b411
SL
452 { OPT_LEVELS_1_PLUS, OPT_fguess_branch_probability, NULL, 1 },
453 { OPT_LEVELS_1_PLUS, OPT_fipa_profile, NULL, 1 },
3020190e
JM
454 { OPT_LEVELS_1_PLUS, OPT_fipa_pure_const, NULL, 1 },
455 { OPT_LEVELS_1_PLUS, OPT_fipa_reference, NULL, 1 },
2e14744f 456 { OPT_LEVELS_1_PLUS, OPT_fipa_reference_addressable, NULL, 1 },
3020190e 457 { OPT_LEVELS_1_PLUS, OPT_fmerge_constants, NULL, 1 },
ded7b411 458 { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
59faab7c 459 { OPT_LEVELS_1_PLUS, OPT_freorder_blocks, NULL, 1 },
484db665 460 { OPT_LEVELS_1_PLUS, OPT_fshrink_wrap, NULL, 1 },
3020190e 461 { OPT_LEVELS_1_PLUS, OPT_fsplit_wide_types, NULL, 1 },
ded7b411 462 { OPT_LEVELS_1_PLUS, OPT_ftree_builtin_call_dce, NULL, 1 },
3020190e 463 { OPT_LEVELS_1_PLUS, OPT_ftree_ccp, NULL, 1 },
ded7b411 464 { OPT_LEVELS_1_PLUS, OPT_ftree_ch, NULL, 1 },
1f9ceff1 465 { OPT_LEVELS_1_PLUS, OPT_ftree_coalesce_vars, NULL, 1 },
ded7b411 466 { OPT_LEVELS_1_PLUS, OPT_ftree_copy_prop, NULL, 1 },
3020190e
JM
467 { OPT_LEVELS_1_PLUS, OPT_ftree_dce, NULL, 1 },
468 { OPT_LEVELS_1_PLUS, OPT_ftree_dominator_opts, NULL, 1 },
469 { OPT_LEVELS_1_PLUS, OPT_ftree_dse, NULL, 1 },
3020190e 470 { OPT_LEVELS_1_PLUS, OPT_ftree_fre, NULL, 1 },
3020190e 471 { OPT_LEVELS_1_PLUS, OPT_ftree_sink, NULL, 1 },
75cfe445 472 { OPT_LEVELS_1_PLUS, OPT_ftree_slsr, NULL, 1 },
ded7b411
SL
473 { OPT_LEVELS_1_PLUS, OPT_ftree_ter, NULL, 1 },
474
475 /* -O1 (and not -Og) optimizations. */
14379e66 476 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fbranch_count_reg, NULL, 1 },
ded7b411
SL
477#if DELAY_SLOTS
478 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fdelayed_branch, NULL, 1 },
479#endif
480 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fif_conversion, NULL, 1 },
481 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fif_conversion2, NULL, 1 },
482 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_finline_functions_called_once, NULL, 1 },
14379e66 483 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fmove_loop_invariants, NULL, 1 },
68f6df73 484 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fssa_phiopt, NULL, 1 },
ded7b411
SL
485 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_bit_ccp, NULL, 1 },
486 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_sra, NULL, 1 },
487 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_pta, NULL, 1 },
3020190e 488
ded7b411
SL
489 /* -O2 and -Os optimizations. */
490 { OPT_LEVELS_2_PLUS, OPT_fcaller_saves, NULL, 1 },
491 { OPT_LEVELS_2_PLUS, OPT_fcode_hoisting, NULL, 1 },
3020190e 492 { OPT_LEVELS_2_PLUS, OPT_fcrossjumping, NULL, 1 },
3020190e 493 { OPT_LEVELS_2_PLUS, OPT_fcse_follow_jumps, NULL, 1 },
ded7b411
SL
494 { OPT_LEVELS_2_PLUS, OPT_fdevirtualize, NULL, 1 },
495 { OPT_LEVELS_2_PLUS, OPT_fdevirtualize_speculatively, NULL, 1 },
3020190e 496 { OPT_LEVELS_2_PLUS, OPT_fexpensive_optimizations, NULL, 1 },
c29c92c7 497 { OPT_LEVELS_2_PLUS, OPT_ffinite_loops, NULL, 1 },
ded7b411
SL
498 { OPT_LEVELS_2_PLUS, OPT_fgcse, NULL, 1 },
499 { OPT_LEVELS_2_PLUS, OPT_fhoist_adjacent_loads, NULL, 1 },
500 { OPT_LEVELS_2_PLUS, OPT_findirect_inlining, NULL, 1 },
501 { OPT_LEVELS_2_PLUS, OPT_finline_small_functions, NULL, 1 },
502 { OPT_LEVELS_2_PLUS, OPT_fipa_bit_cp, NULL, 1 },
503 { OPT_LEVELS_2_PLUS, OPT_fipa_cp, NULL, 1 },
504 { OPT_LEVELS_2_PLUS, OPT_fipa_icf, NULL, 1 },
505 { OPT_LEVELS_2_PLUS, OPT_fipa_ra, NULL, 1 },
506 { OPT_LEVELS_2_PLUS, OPT_fipa_sra, NULL, 1 },
507 { OPT_LEVELS_2_PLUS, OPT_fipa_vrp, NULL, 1 },
508 { OPT_LEVELS_2_PLUS, OPT_fisolate_erroneous_paths_dereference, NULL, 1 },
509 { OPT_LEVELS_2_PLUS, OPT_flra_remat, NULL, 1 },
510 { OPT_LEVELS_2_PLUS, OPT_foptimize_sibling_calls, NULL, 1 },
511 { OPT_LEVELS_2_PLUS, OPT_fpartial_inlining, NULL, 1 },
3020190e 512 { OPT_LEVELS_2_PLUS, OPT_fpeephole2, NULL, 1 },
ded7b411
SL
513 { OPT_LEVELS_2_PLUS, OPT_freorder_functions, NULL, 1 },
514 { OPT_LEVELS_2_PLUS, OPT_frerun_cse_after_loop, NULL, 1 },
3020190e 515#ifdef INSN_SCHEDULING
3020190e
JM
516 { OPT_LEVELS_2_PLUS, OPT_fschedule_insns2, NULL, 1 },
517#endif
3020190e 518 { OPT_LEVELS_2_PLUS, OPT_fstrict_aliasing, NULL, 1 },
ded7b411
SL
519 { OPT_LEVELS_2_PLUS, OPT_fstore_merging, NULL, 1 },
520 { OPT_LEVELS_2_PLUS, OPT_fthread_jumps, NULL, 1 },
3020190e
JM
521 { OPT_LEVELS_2_PLUS, OPT_ftree_pre, NULL, 1 },
522 { OPT_LEVELS_2_PLUS, OPT_ftree_switch_conversion, NULL, 1 },
c9e93168 523 { OPT_LEVELS_2_PLUS, OPT_ftree_tail_merge, NULL, 1 },
ded7b411 524 { OPT_LEVELS_2_PLUS, OPT_ftree_vrp, NULL, 1 },
d6d11272 525 { OPT_LEVELS_2_PLUS, OPT_fvect_cost_model_, NULL, VECT_COST_MODEL_CHEAP },
ded7b411
SL
526
527 /* -O2 and -Os optimizations. */
528 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_falign_functions, NULL, 1 },
529 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_falign_jumps, NULL, 1 },
530 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_falign_labels, NULL, 1 },
531 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_falign_loops, NULL, 1 },
d8878031 532 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_foptimize_strlen, NULL, 1 },
ded7b411
SL
533 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_freorder_blocks_algorithm_, NULL,
534 REORDER_BLOCKS_ALGORITHM_STC },
535#ifdef INSN_SCHEDULING
536 /* Only run the pre-regalloc scheduling pass if optimizing for speed. */
537 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_fschedule_insns, NULL, 1 },
538#endif
3020190e 539
ded7b411 540 /* -O3 and -Os optimizations. */
3020190e
JM
541 /* Inlining of functions reducing size is a good idea with -Os
542 regardless of them being declared inline. */
543 { OPT_LEVELS_3_PLUS_AND_SIZE, OPT_finline_functions, NULL, 1 },
ded7b411
SL
544
545 /* -O3 optimizations. */
3020190e 546 { OPT_LEVELS_3_PLUS, OPT_fgcse_after_reload, NULL, 1 },
ded7b411
SL
547 { OPT_LEVELS_3_PLUS, OPT_fipa_cp_clone, NULL, 1 },
548 { OPT_LEVELS_3_PLUS, OPT_floop_interchange, NULL, 1 },
549 { OPT_LEVELS_3_PLUS, OPT_floop_unroll_and_jam, NULL, 1 },
550 { OPT_LEVELS_3_PLUS, OPT_fpeel_loops, NULL, 1 },
551 { OPT_LEVELS_3_PLUS, OPT_fpredictive_commoning, NULL, 1 },
552 { OPT_LEVELS_3_PLUS, OPT_fsplit_loops, NULL, 1 },
553 { OPT_LEVELS_3_PLUS, OPT_fsplit_paths, NULL, 1 },
5879ab5f 554 { OPT_LEVELS_2_PLUS, OPT_ftree_loop_distribute_patterns, NULL, 1 },
ded7b411 555 { OPT_LEVELS_3_PLUS, OPT_ftree_loop_distribution, NULL, 1 },
ea0f3e87 556 { OPT_LEVELS_3_PLUS, OPT_ftree_loop_vectorize, NULL, 1 },
ded7b411 557 { OPT_LEVELS_3_PLUS, OPT_ftree_partial_pre, NULL, 1 },
ea0f3e87 558 { OPT_LEVELS_3_PLUS, OPT_ftree_slp_vectorize, NULL, 1 },
ded7b411 559 { OPT_LEVELS_3_PLUS, OPT_funswitch_loops, NULL, 1 },
d6d11272 560 { OPT_LEVELS_3_PLUS, OPT_fvect_cost_model_, NULL, VECT_COST_MODEL_DYNAMIC },
13e08dc9 561 { OPT_LEVELS_3_PLUS, OPT_fversion_loops_for_strides, NULL, 1 },
3020190e
JM
562
563 /* -Ofast adds optimizations to -O3. */
564 { OPT_LEVELS_FAST, OPT_ffast_math, NULL, 1 },
565
566 { OPT_LEVELS_NONE, 0, NULL, 0 }
567 };
568
a75bfaa6
JM
569/* Default the options in OPTS and OPTS_SET based on the optimization
570 settings in DECODED_OPTIONS and DECODED_OPTIONS_COUNT. */
c98cd5bf 571void
a75bfaa6
JM
572default_options_optimization (struct gcc_options *opts,
573 struct gcc_options *opts_set,
574 struct cl_decoded_option *decoded_options,
3020190e 575 unsigned int decoded_options_count,
a4d8c676 576 location_t loc,
3020190e
JM
577 unsigned int lang_mask,
578 const struct cl_option_handlers *handlers,
579 diagnostic_context *dc)
a75bfaa6
JM
580{
581 unsigned int i;
ab442df7 582 int opt2;
597a8ab9 583 bool openacc_mode = false;
9756310a
NB
584
585 /* Scan to see what optimization level has been specified. That will
586 determine the default value of many flags. */
a75bfaa6 587 for (i = 1; i < decoded_options_count; i++)
9756310a 588 {
a75bfaa6 589 struct cl_decoded_option *opt = &decoded_options[i];
6e2f1956 590 switch (opt->opt_index)
9756310a 591 {
6e2f1956
JM
592 case OPT_O:
593 if (*opt->arg == '\0')
be6d3f0e 594 {
3020190e
JM
595 opts->x_optimize = 1;
596 opts->x_optimize_size = 0;
0a8134ca 597 opts->x_optimize_fast = 0;
bf7a7185 598 opts->x_optimize_debug = 0;
9756310a
NB
599 }
600 else
601 {
6e2f1956
JM
602 const int optimize_val = integral_argument (opt->arg);
603 if (optimize_val == -1)
33879b9f
MP
604 error_at (loc, "argument to %<-O%> should be a non-negative "
605 "integer, %<g%>, %<s%> or %<fast%>");
6e2f1956 606 else
9756310a 607 {
3020190e
JM
608 opts->x_optimize = optimize_val;
609 if ((unsigned int) opts->x_optimize > 255)
610 opts->x_optimize = 255;
611 opts->x_optimize_size = 0;
0a8134ca 612 opts->x_optimize_fast = 0;
bf7a7185 613 opts->x_optimize_debug = 0;
9756310a
NB
614 }
615 }
6e2f1956
JM
616 break;
617
618 case OPT_Os:
3020190e 619 opts->x_optimize_size = 1;
6e2f1956
JM
620
621 /* Optimizing for size forces optimize to be 2. */
3020190e 622 opts->x_optimize = 2;
0a8134ca 623 opts->x_optimize_fast = 0;
bf7a7185 624 opts->x_optimize_debug = 0;
6e2f1956
JM
625 break;
626
627 case OPT_Ofast:
628 /* -Ofast only adds flags to -O3. */
3020190e
JM
629 opts->x_optimize_size = 0;
630 opts->x_optimize = 3;
0a8134ca 631 opts->x_optimize_fast = 1;
bf7a7185
RG
632 opts->x_optimize_debug = 0;
633 break;
634
635 case OPT_Og:
636 /* -Og selects optimization level 1. */
637 opts->x_optimize_size = 0;
638 opts->x_optimize = 1;
639 opts->x_optimize_fast = 0;
640 opts->x_optimize_debug = 1;
6e2f1956
JM
641 break;
642
597a8ab9
TV
643 case OPT_fopenacc:
644 if (opt->value)
645 openacc_mode = true;
646 break;
647
6e2f1956
JM
648 default:
649 /* Ignore other options in this prescan. */
650 break;
9756310a
NB
651 }
652 }
b8698a0f 653
3020190e
JM
654 maybe_default_options (opts, opts_set, default_options_table,
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);
3020190e
JM
658
659 /* -O2 param settings. */
660 opt2 = (opts->x_optimize >= 2);
116cb604 661
597a8ab9
TV
662 if (openacc_mode
663 && !opts_set->x_flag_ipa_pta)
664 opts->x_flag_ipa_pta = true;
665
ab442df7 666 /* Track fields in field-sensitive alias analysis. */
48476d13
JM
667 maybe_set_param_value
668 (PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE,
669 opt2 ? 100 : default_param_value (PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE),
670 opts->x_param_values, opts_set->x_param_values);
e9e0aa2c 671
b1fb9f56 672 /* For -O1 only do loop invariant motion for very small loops. */
48476d13
JM
673 maybe_set_param_value
674 (PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP,
2eb8a3e5
RB
675 opt2 ? default_param_value (PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP)
676 : default_param_value (PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP) / 10,
677 opts->x_param_values, opts_set->x_param_values);
678
679 /* For -O1 reduce the maximum number of active local stores for RTL DSE
680 since this can consume huge amounts of memory (PR89115). */
681 maybe_set_param_value
682 (PARAM_MAX_DSE_ACTIVE_LOCAL_STORES,
683 opt2 ? default_param_value (PARAM_MAX_DSE_ACTIVE_LOCAL_STORES)
684 : default_param_value (PARAM_MAX_DSE_ACTIVE_LOCAL_STORES) / 10,
48476d13 685 opts->x_param_values, opts_set->x_param_values);
b1fb9f56 686
680a5a7c
MJ
687 /* At -Ofast, allow store motion to introduce potential race conditions. */
688 maybe_set_param_value
689 (PARAM_ALLOW_STORE_DATA_RACES,
690 opts->x_optimize_fast ? 1
691 : default_param_value (PARAM_ALLOW_STORE_DATA_RACES),
692 opts->x_param_values, opts_set->x_param_values);
693
3020190e
JM
694 if (opts->x_optimize_size)
695 /* We want to crossjump as much as possible. */
696 maybe_set_param_value (PARAM_MIN_CROSSJUMP_INSNS, 1,
697 opts->x_param_values, opts_set->x_param_values);
ab442df7 698 else
128dc8e2 699 maybe_set_param_value (PARAM_MIN_CROSSJUMP_INSNS,
48476d13
JM
700 default_param_value (PARAM_MIN_CROSSJUMP_INSNS),
701 opts->x_param_values, opts_set->x_param_values);
f736cb3e 702
b30e733a
RB
703 /* Restrict the amount of work combine does at -Og while retaining
704 most of its useful transforms. */
705 if (opts->x_optimize_debug)
706 maybe_set_param_value (PARAM_MAX_COMBINE_INSNS, 2,
707 opts->x_param_values, opts_set->x_param_values);
708
a75bfaa6 709 /* Allow default optimizations to be specified on a per-machine basis. */
3020190e 710 maybe_default_options (opts, opts_set,
677f3fa8 711 targetm_common.option_optimization_table,
3020190e 712 opts->x_optimize, opts->x_optimize_size,
bf7a7185
RG
713 opts->x_optimize_fast, opts->x_optimize_debug,
714 lang_mask, handlers, loc, dc);
a75bfaa6
JM
715}
716
6fd6a2ff
QZ
717/* Control IPA optimizations based on different live patching LEVEL. */
718static void
719control_options_for_live_patching (struct gcc_options *opts,
720 struct gcc_options *opts_set,
721 enum live_patching_level level,
722 location_t loc)
723{
724 gcc_assert (level > LIVE_PATCHING_NONE);
725
726 switch (level)
727 {
728 case LIVE_PATCHING_INLINE_ONLY_STATIC:
729 if (opts_set->x_flag_ipa_cp_clone && opts->x_flag_ipa_cp_clone)
730 error_at (loc,
731 "%<-fipa-cp-clone%> is incompatible with "
732 "%<-flive-patching=inline-only-static%>");
733 else
734 opts->x_flag_ipa_cp_clone = 0;
735
736 if (opts_set->x_flag_ipa_sra && opts->x_flag_ipa_sra)
737 error_at (loc,
738 "%<-fipa-sra%> is incompatible with "
739 "%<-flive-patching=inline-only-static%>");
740 else
741 opts->x_flag_ipa_sra = 0;
742
743 if (opts_set->x_flag_partial_inlining && opts->x_flag_partial_inlining)
744 error_at (loc,
745 "%<-fpartial-inlining%> is incompatible with "
746 "%<-flive-patching=inline-only-static%>");
747 else
748 opts->x_flag_partial_inlining = 0;
749
750 if (opts_set->x_flag_ipa_cp && opts->x_flag_ipa_cp)
751 error_at (loc,
752 "%<-fipa-cp%> is incompatible with "
753 "%<-flive-patching=inline-only-static%>");
754 else
755 opts->x_flag_ipa_cp = 0;
756
757 /* FALLTHROUGH. */
758 case LIVE_PATCHING_INLINE_CLONE:
759 /* live patching should disable whole-program optimization. */
760 if (opts_set->x_flag_whole_program && opts->x_flag_whole_program)
761 error_at (loc,
762 "%<-fwhole-program%> is incompatible with "
763 "%<-flive-patching=inline-only-static|inline-clone%>");
764 else
765 opts->x_flag_whole_program = 0;
766
767 /* visibility change should be excluded by !flag_whole_program
768 && !in_lto_p && !flag_ipa_cp_clone && !flag_ipa_sra
769 && !flag_partial_inlining. */
770
771 if (opts_set->x_flag_ipa_pta && opts->x_flag_ipa_pta)
772 error_at (loc,
773 "%<-fipa-pta%> is incompatible with "
774 "%<-flive-patching=inline-only-static|inline-clone%>");
775 else
776 opts->x_flag_ipa_pta = 0;
777
778 if (opts_set->x_flag_ipa_reference && opts->x_flag_ipa_reference)
779 error_at (loc,
780 "%<-fipa-reference%> is incompatible with "
781 "%<-flive-patching=inline-only-static|inline-clone%>");
782 else
783 opts->x_flag_ipa_reference = 0;
784
785 if (opts_set->x_flag_ipa_ra && opts->x_flag_ipa_ra)
786 error_at (loc,
787 "%<-fipa-ra%> is incompatible with "
788 "%<-flive-patching=inline-only-static|inline-clone%>");
789 else
790 opts->x_flag_ipa_ra = 0;
791
792 if (opts_set->x_flag_ipa_icf && opts->x_flag_ipa_icf)
793 error_at (loc,
794 "%<-fipa-icf%> is incompatible with "
795 "%<-flive-patching=inline-only-static|inline-clone%>");
796 else
797 opts->x_flag_ipa_icf = 0;
798
799 if (opts_set->x_flag_ipa_icf_functions && opts->x_flag_ipa_icf_functions)
800 error_at (loc,
801 "%<-fipa-icf-functions%> is incompatible with "
802 "%<-flive-patching=inline-only-static|inline-clone%>");
803 else
804 opts->x_flag_ipa_icf_functions = 0;
805
806 if (opts_set->x_flag_ipa_icf_variables && opts->x_flag_ipa_icf_variables)
807 error_at (loc,
808 "%<-fipa-icf-variables%> is incompatible with "
809 "%<-flive-patching=inline-only-static|inline-clone%>");
810 else
811 opts->x_flag_ipa_icf_variables = 0;
812
813 if (opts_set->x_flag_ipa_bit_cp && opts->x_flag_ipa_bit_cp)
814 error_at (loc,
815 "%<-fipa-bit-cp%> is incompatible with "
816 "%<-flive-patching=inline-only-static|inline-clone%>");
817 else
818 opts->x_flag_ipa_bit_cp = 0;
819
820 if (opts_set->x_flag_ipa_vrp && opts->x_flag_ipa_vrp)
821 error_at (loc,
822 "%<-fipa-vrp%> is incompatible with "
823 "%<-flive-patching=inline-only-static|inline-clone%>");
824 else
825 opts->x_flag_ipa_vrp = 0;
826
827 if (opts_set->x_flag_ipa_pure_const && opts->x_flag_ipa_pure_const)
828 error_at (loc,
829 "%<-fipa-pure-const%> is incompatible with "
830 "%<-flive-patching=inline-only-static|inline-clone%>");
831 else
832 opts->x_flag_ipa_pure_const = 0;
833
834 /* FIXME: disable unreachable code removal. */
835
836 /* discovery of functions/variables with no address taken. */
837 if (opts_set->x_flag_ipa_reference_addressable
838 && opts->x_flag_ipa_reference_addressable)
839 error_at (loc,
840 "%<-fipa-reference-addressable%> is incompatible with "
841 "%<-flive-patching=inline-only-static|inline-clone%>");
842 else
843 opts->x_flag_ipa_reference_addressable = 0;
844
845 /* ipa stack alignment propagation. */
846 if (opts_set->x_flag_ipa_stack_alignment
847 && opts->x_flag_ipa_stack_alignment)
848 error_at (loc,
849 "%<-fipa-stack-alignment%> is incompatible with "
850 "%<-flive-patching=inline-only-static|inline-clone%>");
851 else
852 opts->x_flag_ipa_stack_alignment = 0;
853 break;
854 default:
855 gcc_unreachable ();
856 }
857}
858
2dcfc872 859/* --help option argument if set. */
bc405869 860vec<const char *> help_option_arguments;
2dcfc872 861
2dcfc872 862
299404a1
JM
863/* After all options at LOC have been read into OPTS and OPTS_SET,
864 finalize settings of those options and diagnose incompatible
a75bfaa6 865 combinations. */
c98cd5bf 866void
299404a1 867finish_options (struct gcc_options *opts, struct gcc_options *opts_set,
f66409e0 868 location_t loc)
a75bfaa6 869{
a75bfaa6
JM
870 enum unwind_info_type ui_except;
871
91035653 872 if (opts->x_dump_base_name
91035653 873 && ! opts->x_dump_base_name_prefixed)
e71da632 874 {
f35629b7
NS
875 const char *sep = opts->x_dump_base_name;
876
877 for (; *sep; sep++)
878 if (IS_DIR_SEPARATOR (*sep))
879 break;
880
881 if (*sep)
882 /* If dump_base_path contains subdirectories, don't prepend
883 anything. */;
884 else if (opts->x_dump_dir_name)
885 /* We have a DUMP_DIR_NAME, prepend that. */
dc357798
JJ
886 opts->x_dump_base_name = opts_concat (opts->x_dump_dir_name,
887 opts->x_dump_base_name, NULL);
dd3b31fb
L
888 else if (opts->x_aux_base_name
889 && strcmp (opts->x_aux_base_name, HOST_BIT_BUCKET) != 0)
f35629b7
NS
890 /* AUX_BASE_NAME is set and is not the bit bucket. If it
891 contains a directory component, prepend those directories.
892 Typically this places things in the same directory as the
893 object file. */
e71da632 894 {
d7fb0a6d
L
895 const char *aux_base;
896
d5478783
JM
897 base_of_path (opts->x_aux_base_name, &aux_base);
898 if (opts->x_aux_base_name != aux_base)
d7fb0a6d 899 {
d5478783 900 int dir_len = aux_base - opts->x_aux_base_name;
dc357798
JJ
901 char *new_dump_base_name
902 = XOBNEWVEC (&opts_obstack, char,
903 strlen (opts->x_dump_base_name) + dir_len + 1);
d7fb0a6d 904
d5478783
JM
905 /* Copy directory component from OPTS->X_AUX_BASE_NAME. */
906 memcpy (new_dump_base_name, opts->x_aux_base_name, dir_len);
907 /* Append existing OPTS->X_DUMP_BASE_NAME. */
908 strcpy (new_dump_base_name + dir_len, opts->x_dump_base_name);
909 opts->x_dump_base_name = new_dump_base_name;
d7fb0a6d 910 }
e71da632 911 }
f35629b7
NS
912
913 /* It is definitely prefixed now. */
914 opts->x_dump_base_name_prefixed = true;
e71da632
MH
915 }
916
93a4f5e0
JJ
917 /* Handle related options for unit-at-a-time, toplevel-reorder, and
918 section-anchors. */
d5478783 919 if (!opts->x_flag_unit_at_a_time)
57b08d04 920 {
d5478783 921 if (opts->x_flag_section_anchors && opts_set->x_flag_section_anchors)
299404a1
JM
922 error_at (loc, "section anchors must be disabled when unit-at-a-time "
923 "is disabled");
d5478783
JM
924 opts->x_flag_section_anchors = 0;
925 if (opts->x_flag_toplevel_reorder == 1)
299404a1
JM
926 error_at (loc, "toplevel reorder must be disabled when unit-at-a-time "
927 "is disabled");
d5478783 928 opts->x_flag_toplevel_reorder = 0;
57b08d04 929 }
7ea6b6cf 930
3615816d
AH
931 /* -fself-test depends on the state of the compiler prior to
932 compiling anything. Ideally it should be run on an empty source
933 file. However, in case we get run with actual source, assume
934 -fsyntax-only which will inhibit any compiler initialization
935 which may confuse the self tests. */
936 if (opts->x_flag_self_test)
937 opts->x_flag_syntax_only = 1;
938
ee777b71
AH
939 if (opts->x_flag_tm && opts->x_flag_non_call_exceptions)
940 sorry ("transactional memory is not supported with non-call exceptions");
941
5ffebee7
JJ
942 /* Unless the user has asked for section anchors, we disable toplevel
943 reordering at -O0 to disable transformations that might be surprising
944 to end users and to get -fno-toplevel-reorder tested. */
299404a1 945 if (!opts->x_optimize
d5478783
JM
946 && opts->x_flag_toplevel_reorder == 2
947 && !(opts->x_flag_section_anchors && opts_set->x_flag_section_anchors))
93a4f5e0 948 {
d5478783
JM
949 opts->x_flag_toplevel_reorder = 0;
950 opts->x_flag_section_anchors = 0;
93a4f5e0 951 }
d5478783 952 if (!opts->x_flag_toplevel_reorder)
57b08d04 953 {
d5478783 954 if (opts->x_flag_section_anchors && opts_set->x_flag_section_anchors)
299404a1
JM
955 error_at (loc, "section anchors must be disabled when toplevel reorder"
956 " is disabled");
d5478783 957 opts->x_flag_section_anchors = 0;
57b08d04
ST
958 }
959
299404a1 960 if (!opts->x_flag_opts_finished)
ab442df7 961 {
428b3812
L
962 /* We initialize opts->x_flag_pie to -1 so that targets can set a
963 default value. */
964 if (opts->x_flag_pie == -1)
965 {
b57e6e18
L
966 /* We initialize opts->x_flag_pic to -1 so that we can tell if
967 -fpic, -fPIC, -fno-pic or -fno-PIC is used. */
968 if (opts->x_flag_pic == -1)
428b3812
L
969 opts->x_flag_pie = DEFAULT_FLAG_PIE;
970 else
971 opts->x_flag_pie = 0;
972 }
b57e6e18 973 /* If -fPIE or -fpie is used, turn on PIC. */
d5478783
JM
974 if (opts->x_flag_pie)
975 opts->x_flag_pic = opts->x_flag_pie;
b57e6e18
L
976 else if (opts->x_flag_pic == -1)
977 opts->x_flag_pic = 0;
d5478783
JM
978 if (opts->x_flag_pic && !opts->x_flag_pie)
979 opts->x_flag_shlib = 1;
b294a75e 980 opts->x_flag_opts_finished = true;
ab442df7 981 }
9756310a 982
e0f6cba0
MG
983 /* We initialize opts->x_flag_stack_protect to -1 so that targets
984 can set a default value. */
985 if (opts->x_flag_stack_protect == -1)
986 opts->x_flag_stack_protect = DEFAULT_FLAG_SSP;
987
299404a1 988 if (opts->x_optimize == 0)
9756310a
NB
989 {
990 /* Inlining does not work if not optimizing,
991 so force it not to be done. */
d5478783
JM
992 opts->x_warn_inline = 0;
993 opts->x_flag_no_inline = 1;
9756310a
NB
994 }
995
750054a2
CT
996 /* The optimization to partition hot and cold basic blocks into separate
997 sections of the .o and executable files does not work (currently)
e395963f 998 with exception handling. This is because there is no support for
d5478783
JM
999 generating unwind info. If opts->x_flag_exceptions is turned on
1000 we need to turn off the partitioning optimization. */
750054a2 1001
677f3fa8 1002 ui_except = targetm_common.except_unwind_info (opts);
f0a0390e 1003
d5478783
JM
1004 if (opts->x_flag_exceptions
1005 && opts->x_flag_reorder_blocks_and_partition
bf1431e3 1006 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))
750054a2 1007 {
32ad0f03
TJ
1008 if (opts_set->x_flag_reorder_blocks_and_partition)
1009 inform (loc,
4f4b35a0
ML
1010 "%<-freorder-blocks-and-partition%> does not work "
1011 "with exceptions on this architecture");
d5478783
JM
1012 opts->x_flag_reorder_blocks_and_partition = 0;
1013 opts->x_flag_reorder_blocks = 1;
750054a2 1014 }
c7466dee 1015
e395963f
JW
1016 /* If user requested unwind info, then turn off the partitioning
1017 optimization. */
1018
d5478783 1019 if (opts->x_flag_unwind_tables
677f3fa8 1020 && !targetm_common.unwind_tables_default
d5478783 1021 && opts->x_flag_reorder_blocks_and_partition
bf1431e3 1022 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))
e395963f 1023 {
32ad0f03
TJ
1024 if (opts_set->x_flag_reorder_blocks_and_partition)
1025 inform (loc,
4f4b35a0
ML
1026 "%<-freorder-blocks-and-partition%> does not support "
1027 "unwind info on this architecture");
d5478783
JM
1028 opts->x_flag_reorder_blocks_and_partition = 0;
1029 opts->x_flag_reorder_blocks = 1;
e395963f
JW
1030 }
1031
1032 /* If the target requested unwind info, then turn off the partitioning
1033 optimization with a different message. Likewise, if the target does not
1034 support named sections. */
1035
d5478783 1036 if (opts->x_flag_reorder_blocks_and_partition
677f3fa8 1037 && (!targetm_common.have_named_sections
d5478783 1038 || (opts->x_flag_unwind_tables
677f3fa8 1039 && targetm_common.unwind_tables_default
bf1431e3 1040 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))))
c7466dee 1041 {
32ad0f03
TJ
1042 if (opts_set->x_flag_reorder_blocks_and_partition)
1043 inform (loc,
4f4b35a0
ML
1044 "%<-freorder-blocks-and-partition%> does not work "
1045 "on this architecture");
d5478783
JM
1046 opts->x_flag_reorder_blocks_and_partition = 0;
1047 opts->x_flag_reorder_blocks = 1;
c7466dee 1048 }
ab442df7 1049
940c4160 1050
e855c69d
AB
1051 /* Pipelining of outer loops is only possible when general pipelining
1052 capabilities are requested. */
d5478783
JM
1053 if (!opts->x_flag_sel_sched_pipelining)
1054 opts->x_flag_sel_sched_pipelining_outer_loops = 0;
e855c69d 1055
d5478783 1056 if (opts->x_flag_conserve_stack)
6a78eaa3 1057 {
48476d13
JM
1058 maybe_set_param_value (PARAM_LARGE_STACK_FRAME, 100,
1059 opts->x_param_values, opts_set->x_param_values);
1060 maybe_set_param_value (PARAM_STACK_FRAME_GROWTH, 40,
1061 opts->x_param_values, opts_set->x_param_values);
6a78eaa3
JH
1062 }
1063
014d92e1 1064 if (opts->x_flag_lto)
e3b8749b
RG
1065 {
1066#ifdef ENABLE_LTO
d5478783 1067 opts->x_flag_generate_lto = 1;
e3b8749b
RG
1068
1069 /* When generating IL, do not operate in whole-program mode.
1070 Otherwise, symbols will be privatized too early, causing link
1071 errors later. */
d5478783 1072 opts->x_flag_whole_program = 0;
e3b8749b 1073#else
299404a1 1074 error_at (loc, "LTO support has not been enabled in this configuration");
e3b8749b 1075#endif
063d671d
JH
1076 if (!opts->x_flag_fat_lto_objects
1077 && (!HAVE_LTO_PLUGIN
1078 || (opts_set->x_flag_use_linker_plugin
1079 && !opts->x_flag_use_linker_plugin)))
e9f67e62
JH
1080 {
1081 if (opts_set->x_flag_fat_lto_objects)
4f4b35a0
ML
1082 error_at (loc, "%<-fno-fat-lto-objects%> are supported only with "
1083 "linker plugin");
e9f67e62
JH
1084 opts->x_flag_fat_lto_objects = 1;
1085 }
22fdf6af
RB
1086
1087 /* -gsplit-dwarf isn't compatible with LTO, see PR88389. */
1088 if (opts->x_dwarf_split_debug_info)
1089 {
1090 inform (loc, "%<-gsplit-dwarf%> is not supported with LTO,"
1091 " disabling");
1092 opts->x_dwarf_split_debug_info = 0;
1093 }
e9f67e62 1094 }
e3b8749b 1095
d5478783 1096 /* We initialize opts->x_flag_split_stack to -1 so that targets can set a
7458026b 1097 default value if they choose based on other options. */
d5478783
JM
1098 if (opts->x_flag_split_stack == -1)
1099 opts->x_flag_split_stack = 0;
1100 else if (opts->x_flag_split_stack)
7458026b 1101 {
677f3fa8 1102 if (!targetm_common.supports_split_stack (true, opts))
7458026b 1103 {
299404a1
JM
1104 error_at (loc, "%<-fsplit-stack%> is not supported by "
1105 "this compiler configuration");
d5478783 1106 opts->x_flag_split_stack = 0;
7458026b
ILT
1107 }
1108 }
bfe068c3 1109
227b76c3
JH
1110 /* If stack splitting is turned on, and the user did not explicitly
1111 request function partitioning, turn off partitioning, as it
1112 confuses the linker when trying to handle partitioned split-stack
1113 code that calls a non-split-stack functions. But if partitioning
1114 was turned on explicitly just hope for the best. */
1115 if (opts->x_flag_split_stack
1116 && opts->x_flag_reorder_blocks_and_partition
1117 && !opts_set->x_flag_reorder_blocks_and_partition)
1118 opts->x_flag_reorder_blocks_and_partition = 0;
1119
1120 if (opts->x_flag_reorder_blocks_and_partition
1121 && !opts_set->x_flag_reorder_functions)
1122 opts->x_flag_reorder_functions = 1;
1123
d6d11272
XDL
1124 /* Tune vectorization related parametees according to cost model. */
1125 if (opts->x_flag_vect_cost_model == VECT_COST_MODEL_CHEAP)
1126 {
1127 maybe_set_param_value (PARAM_VECT_MAX_VERSION_FOR_ALIAS_CHECKS,
1128 6, opts->x_param_values, opts_set->x_param_values);
1129 maybe_set_param_value (PARAM_VECT_MAX_VERSION_FOR_ALIGNMENT_CHECKS,
1130 0, opts->x_param_values, opts_set->x_param_values);
1131 maybe_set_param_value (PARAM_VECT_MAX_PEELING_FOR_ALIGNMENT,
1132 0, opts->x_param_values, opts_set->x_param_values);
1133 }
1134
bfe068c3
IR
1135 /* Set PARAM_MAX_STORES_TO_SINK to 0 if either vectorization or if-conversion
1136 is disabled. */
ea0f3e87
XDL
1137 if ((!opts->x_flag_tree_loop_vectorize && !opts->x_flag_tree_slp_vectorize)
1138 || !opts->x_flag_tree_loop_if_convert)
bfe068c3
IR
1139 maybe_set_param_value (PARAM_MAX_STORES_TO_SINK, 0,
1140 opts->x_param_values, opts_set->x_param_values);
e9f8dcf9 1141
bd5c3baa 1142 /* The -gsplit-dwarf option requires -ggnu-pubnames. */
99ea153e 1143 if (opts->x_dwarf_split_debug_info)
bd5c3baa 1144 opts->x_debug_generate_pub_sections = 2;
fec4842d 1145
05abad4c
ML
1146 if ((opts->x_flag_sanitize
1147 & (SANITIZE_USER_ADDRESS | SANITIZE_KERNEL_ADDRESS)) == 0)
1148 {
1149 if (opts->x_flag_sanitize & SANITIZE_POINTER_COMPARE)
1150 error_at (loc,
1151 "%<-fsanitize=pointer-compare%> must be combined with "
1152 "%<-fsanitize=address%> or %<-fsanitize=kernel-address%>");
1153 if (opts->x_flag_sanitize & SANITIZE_POINTER_SUBTRACT)
1154 error_at (loc,
1155 "%<-fsanitize=pointer-subtract%> must be combined with "
1156 "%<-fsanitize=address%> or %<-fsanitize=kernel-address%>");
1157 }
1158
fed4de37 1159 /* Userspace and kernel ASan conflict with each other. */
d95a2703
JJ
1160 if ((opts->x_flag_sanitize & SANITIZE_USER_ADDRESS)
1161 && (opts->x_flag_sanitize & SANITIZE_KERNEL_ADDRESS))
fec4842d 1162 error_at (loc,
6d28654e
ML
1163 "%<-fsanitize=address%> is incompatible with "
1164 "%<-fsanitize=kernel-address%>");
fec4842d 1165
fed4de37 1166 /* And with TSan. */
d95a2703
JJ
1167 if ((opts->x_flag_sanitize & SANITIZE_ADDRESS)
1168 && (opts->x_flag_sanitize & SANITIZE_THREAD))
fec4842d 1169 error_at (loc,
6d28654e
ML
1170 "%<-fsanitize=address%> and %<-fsanitize=kernel-address%> "
1171 "are incompatible with %<-fsanitize=thread%>");
d95a2703 1172
5cc6c41c
ML
1173 if ((opts->x_flag_sanitize & SANITIZE_LEAK)
1174 && (opts->x_flag_sanitize & SANITIZE_THREAD))
1175 error_at (loc,
6d28654e 1176 "%<-fsanitize=leak%> is incompatible with %<-fsanitize=thread%>");
d95a2703 1177
5cc6c41c
ML
1178 /* Check error recovery for -fsanitize-recover option. */
1179 for (int i = 0; sanitizer_opts[i].name != NULL; ++i)
1180 if ((opts->x_flag_sanitize_recover & sanitizer_opts[i].flag)
1181 && !sanitizer_opts[i].can_recover)
6d28654e 1182 error_at (loc, "%<-fsanitize-recover=%s%> is not supported",
5cc6c41c 1183 sanitizer_opts[i].name);
9ca0032c
MZ
1184
1185 /* When instrumenting the pointers, we don't want to remove
1186 the null pointer checks. */
1187 if (opts->x_flag_sanitize & (SANITIZE_NULL | SANITIZE_NONNULL_ATTRIBUTE
1188 | SANITIZE_RETURNS_NONNULL_ATTRIBUTE))
1189 opts->x_flag_delete_null_pointer_checks = 0;
1190
1191 /* Aggressive compiler optimizations may cause false negatives. */
866c72a8 1192 if (opts->x_flag_sanitize & ~(SANITIZE_LEAK | SANITIZE_UNREACHABLE))
2bf54d93 1193 opts->x_flag_aggressive_loop_optimizations = 0;
6dc4a604
ML
1194
1195 /* Enable -fsanitize-address-use-after-scope if address sanitizer is
1196 enabled. */
04bfa1e4 1197 if ((opts->x_flag_sanitize & SANITIZE_USER_ADDRESS)
6dc4a604
ML
1198 && !opts_set->x_flag_sanitize_address_use_after_scope)
1199 opts->x_flag_sanitize_address_use_after_scope = true;
1200
1201 /* Force -fstack-reuse=none in case -fsanitize-address-use-after-scope
1202 is enabled. */
1203 if (opts->x_flag_sanitize_address_use_after_scope)
1204 {
1205 if (opts->x_flag_stack_reuse != SR_NONE
1206 && opts_set->x_flag_stack_reuse != SR_NONE)
1207 error_at (loc,
6d28654e
ML
1208 "%<-fsanitize-address-use-after-scope%> requires "
1209 "%<-fstack-reuse=none%> option");
6dc4a604
ML
1210
1211 opts->x_flag_stack_reuse = SR_NONE;
1212 }
26c5b549
ML
1213
1214 if ((opts->x_flag_sanitize & SANITIZE_USER_ADDRESS) && opts->x_flag_tm)
1215 sorry ("transactional memory is not supported with %<-fsanitize=address%>");
1216
1217 if ((opts->x_flag_sanitize & SANITIZE_KERNEL_ADDRESS) && opts->x_flag_tm)
1218 sorry ("transactional memory is not supported with "
1219 "%<-fsanitize=kernel-address%>");
6fd6a2ff
QZ
1220
1221 /* Currently live patching is not support for LTO. */
1222 if (opts->x_flag_live_patching && opts->x_flag_lto)
1223 sorry ("live patching is not supported with LTO");
1224
1225 /* Control IPA optimizations based on different -flive-patching level. */
1226 if (opts->x_flag_live_patching)
1227 {
1228 control_options_for_live_patching (opts, opts_set,
1229 opts->x_flag_live_patching,
1230 loc);
1231 }
9756310a
NB
1232}
1233
c662432e
NC
1234#define LEFT_COLUMN 27
1235
1236/* Output ITEM, of length ITEM_WIDTH, in the left column,
1237 followed by word-wrapped HELP in a second column. */
1238static void
1239wrap_help (const char *help,
1240 const char *item,
1241 unsigned int item_width,
1242 unsigned int columns)
1243{
1244 unsigned int col_width = LEFT_COLUMN;
1245 unsigned int remaining, room, len;
1246
1247 remaining = strlen (help);
1248
1249 do
1250 {
1251 room = columns - 3 - MAX (col_width, item_width);
1252 if (room > columns)
1253 room = 0;
1254 len = remaining;
1255
1256 if (room < len)
1257 {
1258 unsigned int i;
1259
1260 for (i = 0; help[i]; i++)
1261 {
1262 if (i >= room && len != remaining)
1263 break;
1264 if (help[i] == ' ')
1265 len = i;
1266 else if ((help[i] == '-' || help[i] == '/')
1267 && help[i + 1] != ' '
1268 && i > 0 && ISALPHA (help[i - 1]))
1269 len = i + 1;
1270 }
1271 }
1272
c3284718 1273 printf (" %-*.*s %.*s\n", col_width, item_width, item, len, help);
c662432e
NC
1274 item_width = 0;
1275 while (help[len] == ' ')
1276 len++;
1277 help += len;
1278 remaining -= len;
1279 }
1280 while (remaining);
1281}
1282
c98c2430
ML
1283/* Data structure used to print list of valid option values. */
1284
6c1dae73 1285class option_help_tuple
c98c2430 1286{
6c1dae73 1287public:
c98c2430
ML
1288 option_help_tuple (int code, vec<const char *> values):
1289 m_code (code), m_values (values)
1290 {}
1291
1292 /* Code of an option. */
1293 int m_code;
1294
1295 /* List of possible values. */
1296 vec<const char *> m_values;
1297};
1298
c662432e
NC
1299/* Print help for a specific front-end, etc. */
1300static void
1301print_filtered_help (unsigned int include_flags,
1302 unsigned int exclude_flags,
1303 unsigned int any_flags,
0576d21f 1304 unsigned int columns,
e6d4b984
JM
1305 struct gcc_options *opts,
1306 unsigned int lang_mask)
c662432e
NC
1307{
1308 unsigned int i;
1309 const char *help;
c662432e
NC
1310 bool found = false;
1311 bool displayed = false;
a7b2e184 1312 char new_help[256];
c662432e
NC
1313
1314 if (include_flags == CL_PARAMS)
1315 {
1316 for (i = 0; i < LAST_PARAM; i++)
1317 {
1318 const char *param = compiler_params[i].option;
1319
1320 help = compiler_params[i].help;
1321 if (help == NULL || *help == '\0')
1322 {
1323 if (exclude_flags & CL_UNDOCUMENTED)
1324 continue;
1325 help = undocumented_msg;
1326 }
1327
1328 /* Get the translation. */
1329 help = _(help);
1330
ff5101bf
AK
1331 if (!opts->x_quiet_flag)
1332 {
1333 snprintf (new_help, sizeof (new_help),
1334 _("default %d minimum %d maximum %d"),
1335 compiler_params[i].default_value,
1336 compiler_params[i].min_value,
1337 compiler_params[i].max_value);
1338 help = new_help;
1339 }
c662432e
NC
1340 wrap_help (help, param, strlen (param), columns);
1341 }
1342 putchar ('\n');
1343 return;
1344 }
1345
299404a1
JM
1346 if (!opts->x_help_printed)
1347 opts->x_help_printed = XCNEWVAR (char, cl_options_count);
c662432e 1348
e6d4b984
JM
1349 if (!opts->x_help_enum_printed)
1350 opts->x_help_enum_printed = XCNEWVAR (char, cl_enums_count);
1351
c98c2430
ML
1352 auto_vec<option_help_tuple> help_tuples;
1353
c662432e
NC
1354 for (i = 0; i < cl_options_count; i++)
1355 {
c662432e
NC
1356 const struct cl_option *option = cl_options + i;
1357 unsigned int len;
1358 const char *opt;
1359 const char *tab;
1360
1361 if (include_flags == 0
1362 || ((option->flags & include_flags) != include_flags))
1363 {
1364 if ((option->flags & any_flags) == 0)
1365 continue;
1366 }
1367
1368 /* Skip unwanted switches. */
1369 if ((option->flags & exclude_flags) != 0)
1370 continue;
1371
603349bf
JM
1372 /* The driver currently prints its own help text. */
1373 if ((option->flags & CL_DRIVER) != 0
1374 && (option->flags & (((1U << cl_lang_count) - 1)
1375 | CL_COMMON | CL_TARGET)) == 0)
1376 continue;
1377
c662432e
NC
1378 found = true;
1379 /* Skip switches that have already been printed. */
299404a1 1380 if (opts->x_help_printed[i])
c662432e
NC
1381 continue;
1382
299404a1 1383 opts->x_help_printed[i] = true;
c662432e
NC
1384
1385 help = option->help;
1386 if (help == NULL)
1387 {
1388 if (exclude_flags & CL_UNDOCUMENTED)
1389 continue;
a7b2e184 1390
c662432e
NC
1391 help = undocumented_msg;
1392 }
1393
a7b2e184
MS
1394 if (option->alias_target < N_OPTS
1395 && cl_options [option->alias_target].help)
1396 {
1397 if (help == undocumented_msg)
1398 {
1399 /* For undocumented options that are aliases for other options
1400 that are documented, point the reader to the other option in
1401 preference of the former. */
1402 snprintf (new_help, sizeof new_help,
1403 _("Same as %s. Use the latter option instead."),
1404 cl_options [option->alias_target].opt_text);
1405 }
1406 else
1407 {
1408 /* For documented options with aliases, mention the aliased
1409 option's name for reference. */
1410 snprintf (new_help, sizeof new_help,
1411 _("%s Same as %s."),
1412 help, cl_options [option->alias_target].opt_text);
1413 }
1414
1415 help = new_help;
1416 }
1417
1418 if (option->warn_message)
1419 {
1420 /* Mention that the use of the option will trigger a warning. */
1421 if (help == new_help)
1422 snprintf (new_help + strlen (new_help),
1423 sizeof new_help - strlen (new_help),
1424 " %s", _(use_diagnosed_msg));
1425 else
1426 snprintf (new_help, sizeof new_help,
1427 "%s %s", help, _(use_diagnosed_msg));
1428
1429 help = new_help;
1430 }
1431
c662432e
NC
1432 /* Get the translation. */
1433 help = _(help);
1434
1435 /* Find the gap between the name of the
1436 option and its descriptive text. */
1437 tab = strchr (help, '\t');
1438 if (tab)
1439 {
1440 len = tab - help;
1441 opt = help;
1442 help = tab + 1;
1443 }
1444 else
1445 {
1446 opt = option->opt_text;
1447 len = strlen (opt);
1448 }
1449
1450 /* With the -Q option enabled we change the descriptive text associated
1451 with an option to be an indication of its current setting. */
a7d0d30f 1452 if (!opts->x_quiet_flag)
c662432e 1453 {
0576d21f 1454 void *flag_var = option_flag_var (i, opts);
46625112 1455
c662432e
NC
1456 if (len < (LEFT_COLUMN + 2))
1457 strcpy (new_help, "\t\t");
1458 else
1459 strcpy (new_help, "\t");
1460
21bf1558
JM
1461 if (flag_var != NULL
1462 && option->var_type != CLVC_DEFER)
c662432e
NC
1463 {
1464 if (option->flags & CL_JOINED)
1465 {
1466 if (option->var_type == CLVC_STRING)
1467 {
46625112 1468 if (* (const char **) flag_var != NULL)
c662432e
NC
1469 snprintf (new_help + strlen (new_help),
1470 sizeof (new_help) - strlen (new_help),
81018dcf 1471 "%s", * (const char **) flag_var);
c662432e 1472 }
e6d4b984
JM
1473 else if (option->var_type == CLVC_ENUM)
1474 {
1475 const struct cl_enum *e = &cl_enums[option->var_enum];
1476 int value;
1477 const char *arg = NULL;
1478
1479 value = e->get (flag_var);
1480 enum_value_to_arg (e->values, &arg, value, lang_mask);
1481 if (arg == NULL)
1482 arg = _("[default]");
1483 snprintf (new_help + strlen (new_help),
1484 sizeof (new_help) - strlen (new_help),
81018dcf 1485 "%s", arg);
e6d4b984 1486 }
c662432e
NC
1487 else
1488 sprintf (new_help + strlen (new_help),
9453ba0a 1489 "%d", * (int *) flag_var);
c662432e
NC
1490 }
1491 else
0576d21f 1492 strcat (new_help, option_enabled (i, opts)
c662432e
NC
1493 ? _("[enabled]") : _("[disabled]"));
1494 }
1495
1496 help = new_help;
1497 }
1498
63010089
ML
1499 if (option->range_max != -1)
1500 {
1501 char b[128];
1502 snprintf (b, sizeof (b), "<%d,%d>", option->range_min,
1503 option->range_max);
1504 opt = concat (opt, b, NULL);
1505 len += strlen (b);
1506 }
1507
c662432e
NC
1508 wrap_help (help, opt, len, columns);
1509 displayed = true;
e6d4b984
JM
1510
1511 if (option->var_type == CLVC_ENUM
1512 && opts->x_help_enum_printed[option->var_enum] != 2)
1513 opts->x_help_enum_printed[option->var_enum] = 1;
c98c2430
ML
1514 else
1515 {
1516 vec<const char *> option_values
1517 = targetm_common.get_valid_option_values (i, NULL);
1518 if (!option_values.is_empty ())
1519 help_tuples.safe_push (option_help_tuple (i, option_values));
1520 }
c662432e
NC
1521 }
1522
1523 if (! found)
b3eaaf1a
NC
1524 {
1525 unsigned int langs = include_flags & CL_LANG_ALL;
1526
1527 if (langs == 0)
1528 printf (_(" No options with the desired characteristics were found\n"));
1529 else
1530 {
1531 unsigned int i;
1532
1533 /* PR 31349: Tell the user how to see all of the
1534 options supported by a specific front end. */
1535 for (i = 0; (1U << i) < CL_LANG_ALL; i ++)
1536 if ((1U << i) & langs)
a7b2e184 1537 printf (_(" None found. Use --help=%s to show *all* the options supported by the %s front-end.\n"),
b3eaaf1a
NC
1538 lang_names[i], lang_names[i]);
1539 }
b8698a0f 1540
b3eaaf1a 1541 }
c662432e
NC
1542 else if (! displayed)
1543 printf (_(" All options with the desired characteristics have already been displayed\n"));
1544
1545 putchar ('\n');
e6d4b984
JM
1546
1547 /* Print details of enumerated option arguments, if those
1548 enumerations have help text headings provided. If no help text
1549 is provided, presume that the possible values are listed in the
1550 help text for the relevant options. */
1551 for (i = 0; i < cl_enums_count; i++)
1552 {
1553 unsigned int j, pos;
1554
1555 if (opts->x_help_enum_printed[i] != 1)
1556 continue;
1557 if (cl_enums[i].help == NULL)
1558 continue;
1559 printf (" %s\n ", _(cl_enums[i].help));
1560 pos = 4;
1561 for (j = 0; cl_enums[i].values[j].arg != NULL; j++)
1562 {
1563 unsigned int len = strlen (cl_enums[i].values[j].arg);
1564
1565 if (pos > 4 && pos + 1 + len <= columns)
1566 {
1567 printf (" %s", cl_enums[i].values[j].arg);
1568 pos += 1 + len;
1569 }
1570 else
1571 {
1572 if (pos > 4)
1573 {
1574 printf ("\n ");
1575 pos = 4;
1576 }
1577 printf ("%s", cl_enums[i].values[j].arg);
1578 pos += len;
1579 }
1580 }
1581 printf ("\n\n");
1582 opts->x_help_enum_printed[i] = 2;
1583 }
c98c2430
ML
1584
1585 for (unsigned i = 0; i < help_tuples.length (); i++)
1586 {
1587 const struct cl_option *option = cl_options + help_tuples[i].m_code;
3f58b66d
ML
1588 printf (_(" Known valid arguments for %s option:\n "),
1589 option->opt_text);
c98c2430
ML
1590 for (unsigned j = 0; j < help_tuples[i].m_values.length (); j++)
1591 printf (" %s", help_tuples[i].m_values[j]);
1592 printf ("\n\n");
1593 }
c662432e
NC
1594}
1595
1596/* Display help for a specified type of option.
1597 The options must have ALL of the INCLUDE_FLAGS set
1598 ANY of the flags in the ANY_FLAGS set
0576d21f 1599 and NONE of the EXCLUDE_FLAGS set. The current option state is in
e6d4b984 1600 OPTS; LANG_MASK is used for interpreting enumerated option state. */
c662432e
NC
1601static void
1602print_specific_help (unsigned int include_flags,
1603 unsigned int exclude_flags,
0576d21f 1604 unsigned int any_flags,
e6d4b984
JM
1605 struct gcc_options *opts,
1606 unsigned int lang_mask)
c662432e
NC
1607{
1608 unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1609 const char * description = NULL;
1610 const char * descrip_extra = "";
1611 size_t i;
1612 unsigned int flag;
c662432e
NC
1613
1614 /* Sanity check: Make sure that we do not have more
1615 languages than we have bits available to enumerate them. */
58265ea6 1616 gcc_assert ((1U << cl_lang_count) <= CL_MIN_OPTION_CLASS);
c662432e
NC
1617
1618 /* If we have not done so already, obtain
1619 the desired maximum width of the output. */
299404a1 1620 if (opts->x_help_columns == 0)
c662432e 1621 {
c9db45aa
TB
1622 opts->x_help_columns = get_terminal_width ();
1623 if (opts->x_help_columns == INT_MAX)
c662432e 1624 /* Use a reasonable default. */
299404a1 1625 opts->x_help_columns = 80;
c662432e
NC
1626 }
1627
1628 /* Decide upon the title for the options that we are going to display. */
1629 for (i = 0, flag = 1; flag <= CL_MAX_OPTION_CLASS; flag <<= 1, i ++)
1630 {
1631 switch (flag & include_flags)
1632 {
1633 case 0:
603349bf 1634 case CL_DRIVER:
c662432e
NC
1635 break;
1636
1637 case CL_TARGET:
1638 description = _("The following options are target specific");
1639 break;
1640 case CL_WARNING:
1641 description = _("The following options control compiler warning messages");
1642 break;
1643 case CL_OPTIMIZATION:
1644 description = _("The following options control optimizations");
1645 break;
1646 case CL_COMMON:
1647 description = _("The following options are language-independent");
1648 break;
1649 case CL_PARAMS:
1650 description = _("The --param option recognizes the following as parameters");
1651 break;
1652 default:
1653 if (i >= cl_lang_count)
1654 break;
0631b69f 1655 if (exclude_flags & all_langs_mask)
c01c261d 1656 description = _("The following options are specific to just the language ");
c662432e 1657 else
b5456e04 1658 description = _("The following options are supported by the language ");
b3eaaf1a 1659 descrip_extra = lang_names [i];
c662432e
NC
1660 break;
1661 }
1662 }
1663
1664 if (description == NULL)
1665 {
1666 if (any_flags == 0)
1667 {
0631b69f 1668 if (include_flags & CL_UNDOCUMENTED)
c662432e 1669 description = _("The following options are not documented");
0631b69f
RW
1670 else if (include_flags & CL_SEPARATE)
1671 description = _("The following options take separate arguments");
1672 else if (include_flags & CL_JOINED)
1673 description = _("The following options take joined arguments");
c662432e
NC
1674 else
1675 {
a9c697b8
MS
1676 internal_error ("unrecognized %<include_flags 0x%x%> passed "
1677 "to %<print_specific_help%>",
c662432e
NC
1678 include_flags);
1679 return;
1680 }
1681 }
1682 else
1683 {
1684 if (any_flags & all_langs_mask)
1685 description = _("The following options are language-related");
1686 else
1687 description = _("The following options are language-independent");
1688 }
1689 }
1690
1691 printf ("%s%s:\n", description, descrip_extra);
299404a1 1692 print_filtered_help (include_flags, exclude_flags, any_flags,
e6d4b984 1693 opts->x_help_columns, opts, lang_mask);
c662432e
NC
1694}
1695
be3c16c4
DC
1696/* Enable FDO-related flags. */
1697
1698static void
1699enable_fdo_optimizations (struct gcc_options *opts,
1700 struct gcc_options *opts_set,
1701 int value)
1702{
1703 if (!opts_set->x_flag_branch_probabilities)
1704 opts->x_flag_branch_probabilities = value;
1705 if (!opts_set->x_flag_profile_values)
1706 opts->x_flag_profile_values = value;
1707 if (!opts_set->x_flag_unroll_loops)
1708 opts->x_flag_unroll_loops = value;
1709 if (!opts_set->x_flag_peel_loops)
1710 opts->x_flag_peel_loops = value;
1711 if (!opts_set->x_flag_tracer)
1712 opts->x_flag_tracer = value;
1713 if (!opts_set->x_flag_value_profile_transformations)
1714 opts->x_flag_value_profile_transformations = value;
1715 if (!opts_set->x_flag_inline_functions)
1716 opts->x_flag_inline_functions = value;
1717 if (!opts_set->x_flag_ipa_cp)
1718 opts->x_flag_ipa_cp = value;
1719 if (!opts_set->x_flag_ipa_cp_clone
1720 && value && opts->x_flag_ipa_cp)
1721 opts->x_flag_ipa_cp_clone = value;
209ca542
PK
1722 if (!opts_set->x_flag_ipa_bit_cp
1723 && value && opts->x_flag_ipa_cp)
1724 opts->x_flag_ipa_bit_cp = value;
be3c16c4
DC
1725 if (!opts_set->x_flag_predictive_commoning)
1726 opts->x_flag_predictive_commoning = value;
28df8730
MM
1727 if (!opts_set->x_flag_split_loops)
1728 opts->x_flag_split_loops = value;
be3c16c4
DC
1729 if (!opts_set->x_flag_unswitch_loops)
1730 opts->x_flag_unswitch_loops = value;
1731 if (!opts_set->x_flag_gcse_after_reload)
1732 opts->x_flag_gcse_after_reload = value;
26d476cd 1733 if (!opts_set->x_flag_tree_loop_vectorize)
be3c16c4 1734 opts->x_flag_tree_loop_vectorize = value;
26d476cd 1735 if (!opts_set->x_flag_tree_slp_vectorize)
be3c16c4 1736 opts->x_flag_tree_slp_vectorize = value;
a9a32e56
JH
1737 if (!opts_set->x_flag_version_loops_for_strides)
1738 opts->x_flag_version_loops_for_strides = value;
be3c16c4
DC
1739 if (!opts_set->x_flag_vect_cost_model)
1740 opts->x_flag_vect_cost_model = VECT_COST_MODEL_DYNAMIC;
1741 if (!opts_set->x_flag_tree_loop_distribute_patterns)
1742 opts->x_flag_tree_loop_distribute_patterns = value;
a9a32e56
JH
1743 if (!opts_set->x_flag_loop_interchange)
1744 opts->x_flag_loop_interchange = value;
1745 if (!opts_set->x_flag_unroll_jam)
1746 opts->x_flag_unroll_jam = value;
1747 if (!opts_set->x_flag_tree_loop_distribution)
1748 opts->x_flag_tree_loop_distribution = value;
be3c16c4
DC
1749}
1750
b1b46af0 1751/* -f{,no-}sanitize{,-recover}= suboptions. */
61789eed 1752const struct sanitizer_opts_s sanitizer_opts[] =
b1b46af0 1753{
5cc6c41c
ML
1754#define SANITIZER_OPT(name, flags, recover) \
1755 { #name, flags, sizeof #name - 1, recover }
6dc4a604
ML
1756 SANITIZER_OPT (address, (SANITIZE_ADDRESS | SANITIZE_USER_ADDRESS), true),
1757 SANITIZER_OPT (kernel-address, (SANITIZE_ADDRESS | SANITIZE_KERNEL_ADDRESS),
5cc6c41c 1758 true),
05abad4c
ML
1759 SANITIZER_OPT (pointer-compare, SANITIZE_POINTER_COMPARE, true),
1760 SANITIZER_OPT (pointer-subtract, SANITIZE_POINTER_SUBTRACT, true),
5cc6c41c
ML
1761 SANITIZER_OPT (thread, SANITIZE_THREAD, false),
1762 SANITIZER_OPT (leak, SANITIZE_LEAK, false),
1763 SANITIZER_OPT (shift, SANITIZE_SHIFT, true),
2e955d50
JJ
1764 SANITIZER_OPT (shift-base, SANITIZE_SHIFT_BASE, true),
1765 SANITIZER_OPT (shift-exponent, SANITIZE_SHIFT_EXPONENT, true),
5cc6c41c
ML
1766 SANITIZER_OPT (integer-divide-by-zero, SANITIZE_DIVIDE, true),
1767 SANITIZER_OPT (undefined, SANITIZE_UNDEFINED, true),
1768 SANITIZER_OPT (unreachable, SANITIZE_UNREACHABLE, false),
1769 SANITIZER_OPT (vla-bound, SANITIZE_VLA, true),
1770 SANITIZER_OPT (return, SANITIZE_RETURN, false),
1771 SANITIZER_OPT (null, SANITIZE_NULL, true),
1772 SANITIZER_OPT (signed-integer-overflow, SANITIZE_SI_OVERFLOW, true),
1773 SANITIZER_OPT (bool, SANITIZE_BOOL, true),
1774 SANITIZER_OPT (enum, SANITIZE_ENUM, true),
1775 SANITIZER_OPT (float-divide-by-zero, SANITIZE_FLOAT_DIVIDE, true),
1776 SANITIZER_OPT (float-cast-overflow, SANITIZE_FLOAT_CAST, true),
1777 SANITIZER_OPT (bounds, SANITIZE_BOUNDS, true),
1778 SANITIZER_OPT (bounds-strict, SANITIZE_BOUNDS | SANITIZE_BOUNDS_STRICT, true),
1779 SANITIZER_OPT (alignment, SANITIZE_ALIGNMENT, true),
1780 SANITIZER_OPT (nonnull-attribute, SANITIZE_NONNULL_ATTRIBUTE, true),
1781 SANITIZER_OPT (returns-nonnull-attribute, SANITIZE_RETURNS_NONNULL_ATTRIBUTE,
1782 true),
1783 SANITIZER_OPT (object-size, SANITIZE_OBJECT_SIZE, true),
1784 SANITIZER_OPT (vptr, SANITIZE_VPTR, true),
c9b39a49 1785 SANITIZER_OPT (pointer-overflow, SANITIZE_POINTER_OVERFLOW, true),
07d7c611 1786 SANITIZER_OPT (builtin, SANITIZE_BUILTIN, true),
5cc6c41c 1787 SANITIZER_OPT (all, ~0U, true),
b1b46af0 1788#undef SANITIZER_OPT
5cc6c41c 1789 { NULL, 0U, 0UL, false }
b1b46af0
JJ
1790};
1791
f6e50a7d
WW
1792/* -f{,no-}sanitize-coverage= suboptions. */
1793const struct sanitizer_opts_s coverage_sanitizer_opts[] =
1794{
1795#define COVERAGE_SANITIZER_OPT(name, flags) \
1796 { #name, flags, sizeof #name - 1, true }
1797 COVERAGE_SANITIZER_OPT (trace-pc, SANITIZE_COV_TRACE_PC),
1798 COVERAGE_SANITIZER_OPT (trace-cmp, SANITIZE_COV_TRACE_CMP),
1799#undef COVERAGE_SANITIZER_OPT
1800 { NULL, 0U, 0UL, false }
1801};
1802
19ff0049
DM
1803/* A struct for describing a run of chars within a string. */
1804
6c1dae73 1805class string_fragment
19ff0049 1806{
6c1dae73 1807public:
19ff0049
DM
1808 string_fragment (const char *start, size_t len)
1809 : m_start (start), m_len (len) {}
1810
1811 const char *m_start;
1812 size_t m_len;
1813};
1814
1815/* Specialization of edit_distance_traits for string_fragment,
1816 for use by get_closest_sanitizer_option. */
1817
1818template <>
1819struct edit_distance_traits<const string_fragment &>
1820{
1821 static size_t get_length (const string_fragment &fragment)
1822 {
1823 return fragment.m_len;
1824 }
1825
1826 static const char *get_string (const string_fragment &fragment)
1827 {
1828 return fragment.m_start;
1829 }
1830};
1831
1832/* Given ARG, an unrecognized sanitizer option, return the best
1833 matching sanitizer option, or NULL if there isn't one.
f6e50a7d
WW
1834 OPTS is array of candidate sanitizer options.
1835 CODE is OPT_fsanitize_, OPT_fsanitize_recover_ or
1836 OPT_fsanitize_coverage_.
19ff0049
DM
1837 VALUE is non-zero for the regular form of the option, zero
1838 for the "no-" form (e.g. "-fno-sanitize-recover="). */
1839
1840static const char *
1841get_closest_sanitizer_option (const string_fragment &arg,
f6e50a7d 1842 const struct sanitizer_opts_s *opts,
19ff0049
DM
1843 enum opt_code code, int value)
1844{
1845 best_match <const string_fragment &, const char*> bm (arg);
f6e50a7d 1846 for (int i = 0; opts[i].name != NULL; ++i)
19ff0049
DM
1847 {
1848 /* -fsanitize=all is not valid, so don't offer it. */
f6e50a7d
WW
1849 if (code == OPT_fsanitize_
1850 && opts[i].flag == ~0U
19ff0049
DM
1851 && value)
1852 continue;
1853
1854 /* For -fsanitize-recover= (and not -fno-sanitize-recover=),
1855 don't offer the non-recoverable options. */
f6e50a7d
WW
1856 if (code == OPT_fsanitize_recover_
1857 && !opts[i].can_recover
19ff0049
DM
1858 && value)
1859 continue;
1860
f6e50a7d 1861 bm.consider (opts[i].name);
19ff0049
DM
1862 }
1863 return bm.get_best_meaningful_candidate ();
1864}
1865
b1b46af0
JJ
1866/* Parse comma separated sanitizer suboptions from P for option SCODE,
1867 adjust previous FLAGS and return new ones. If COMPLAIN is false,
1868 don't issue diagnostics. */
1869
1870unsigned int
1871parse_sanitizer_options (const char *p, location_t loc, int scode,
1872 unsigned int flags, int value, bool complain)
1873{
1874 enum opt_code code = (enum opt_code) scode;
f6e50a7d
WW
1875
1876 const struct sanitizer_opts_s *opts;
1877 if (code == OPT_fsanitize_coverage_)
1878 opts = coverage_sanitizer_opts;
1879 else
1880 opts = sanitizer_opts;
1881
b1b46af0
JJ
1882 while (*p != 0)
1883 {
1884 size_t len, i;
1885 bool found = false;
1886 const char *comma = strchr (p, ',');
1887
1888 if (comma == NULL)
1889 len = strlen (p);
1890 else
1891 len = comma - p;
1892 if (len == 0)
1893 {
1894 p = comma + 1;
1895 continue;
1896 }
1897
1898 /* Check to see if the string matches an option class name. */
f6e50a7d
WW
1899 for (i = 0; opts[i].name != NULL; ++i)
1900 if (len == opts[i].len && memcmp (p, opts[i].name, len) == 0)
b1b46af0
JJ
1901 {
1902 /* Handle both -fsanitize and -fno-sanitize cases. */
f6e50a7d 1903 if (value && opts[i].flag == ~0U)
b1b46af0
JJ
1904 {
1905 if (code == OPT_fsanitize_)
1906 {
1907 if (complain)
6d28654e 1908 error_at (loc, "%<-fsanitize=all%> option is not valid");
b1b46af0
JJ
1909 }
1910 else
5cc6c41c
ML
1911 flags |= ~(SANITIZE_THREAD | SANITIZE_LEAK
1912 | SANITIZE_UNREACHABLE | SANITIZE_RETURN);
b1b46af0
JJ
1913 }
1914 else if (value)
5cc6c41c
ML
1915 {
1916 /* Do not enable -fsanitize-recover=unreachable and
1917 -fsanitize-recover=return if -fsanitize-recover=undefined
1918 is selected. */
c944c6a2 1919 if (code == OPT_fsanitize_recover_
f6e50a7d 1920 && opts[i].flag == SANITIZE_UNDEFINED)
5cc6c41c
ML
1921 flags |= (SANITIZE_UNDEFINED
1922 & ~(SANITIZE_UNREACHABLE | SANITIZE_RETURN));
1923 else
f6e50a7d 1924 flags |= opts[i].flag;
5cc6c41c 1925 }
b1b46af0 1926 else
f6e50a7d 1927 flags &= ~opts[i].flag;
b1b46af0
JJ
1928 found = true;
1929 break;
1930 }
1931
1932 if (! found && complain)
19ff0049
DM
1933 {
1934 const char *hint
1935 = get_closest_sanitizer_option (string_fragment (p, len),
f6e50a7d
WW
1936 opts, code, value);
1937
1938 const char *suffix;
1939 if (code == OPT_fsanitize_recover_)
1940 suffix = "-recover";
1941 else if (code == OPT_fsanitize_coverage_)
1942 suffix = "-coverage";
1943 else
1944 suffix = "";
19ff0049
DM
1945
1946 if (hint)
1947 error_at (loc,
a3f9f006
ML
1948 "unrecognized argument to %<-f%ssanitize%s=%> "
1949 "option: %q.*s; did you mean %qs?",
19ff0049 1950 value ? "" : "no-",
f6e50a7d 1951 suffix, (int) len, p, hint);
19ff0049
DM
1952 else
1953 error_at (loc,
a3f9f006
ML
1954 "unrecognized argument to %<-f%ssanitize%s=%> option: "
1955 "%q.*s", value ? "" : "no-",
f6e50a7d 1956 suffix, (int) len, p);
19ff0049 1957 }
b1b46af0
JJ
1958
1959 if (comma == NULL)
1960 break;
1961 p = comma + 1;
1962 }
1963 return flags;
1964}
1965
45b2222a 1966/* Parse string values of no_sanitize attribute passed in VALUE.
3a266bcd 1967 Values are separated with comma. */
45b2222a
ML
1968
1969unsigned int
3a266bcd 1970parse_no_sanitize_attribute (char *value)
45b2222a
ML
1971{
1972 unsigned int flags = 0;
1973 unsigned int i;
1974 char *q = strtok (value, ",");
1975
1976 while (q != NULL)
1977 {
1978 for (i = 0; sanitizer_opts[i].name != NULL; ++i)
1979 if (strcmp (sanitizer_opts[i].name, q) == 0)
1980 {
1981 flags |= sanitizer_opts[i].flag;
1982 if (sanitizer_opts[i].flag == SANITIZE_UNDEFINED)
1983 flags |= SANITIZE_UNDEFINED_NONDEFAULT;
1984 break;
1985 }
1986
1987 if (sanitizer_opts[i].name == NULL)
3a266bcd 1988 warning (OPT_Wattributes,
a9c697b8 1989 "%qs attribute directive ignored", q);
45b2222a
ML
1990
1991 q = strtok (NULL, ",");
1992 }
1993
1994 return flags;
1995}
1996
c518c102
ML
1997/* Parse -falign-NAME format for a FLAG value. Return individual
1998 parsed integer values into RESULT_VALUES array. If REPORT_ERROR is
1999 set, print error message at LOC location. */
2000
2001bool
2002parse_and_check_align_values (const char *flag,
2003 const char *name,
2004 auto_vec<unsigned> &result_values,
2005 bool report_error,
2006 location_t loc)
2007{
2008 char *str = xstrdup (flag);
2009 for (char *p = strtok (str, ":"); p; p = strtok (NULL, ":"))
2010 {
2011 char *end;
2012 int v = strtol (p, &end, 10);
2013 if (*end != '\0' || v < 0)
2014 {
2015 if (report_error)
2016 error_at (loc, "invalid arguments for %<-falign-%s%> option: %qs",
2017 name, flag);
2018
2019 return false;
2020 }
2021
2022 result_values.safe_push ((unsigned)v);
2023 }
2024
2025 free (str);
2026
2027 /* Check that we have a correct number of values. */
49f3f450 2028 if (result_values.is_empty () || result_values.length () > 4)
c518c102
ML
2029 {
2030 if (report_error)
2031 error_at (loc, "invalid number of arguments for %<-falign-%s%> "
2032 "option: %qs", name, flag);
2033 return false;
2034 }
2035
c518c102
ML
2036 for (unsigned i = 0; i < result_values.length (); i++)
2037 if (result_values[i] > MAX_CODE_ALIGN_VALUE)
2038 {
2039 if (report_error)
2040 error_at (loc, "%<-falign-%s%> is not between 0 and %d",
2041 name, MAX_CODE_ALIGN_VALUE);
2042 return false;
2043 }
2044
2045 return true;
2046}
2047
2048/* Check that alignment value FLAG for -falign-NAME is valid at a given
2049 location LOC. */
2050
2051static void
2052check_alignment_argument (location_t loc, const char *flag, const char *name)
2053{
2054 auto_vec<unsigned> align_result;
2055 parse_and_check_align_values (flag, name, align_result, true, loc);
2056}
2057
2dcfc872
ML
2058/* Print help when OPT__help_ is set. */
2059
f66409e0 2060void
bc405869
ML
2061print_help (struct gcc_options *opts, unsigned int lang_mask,
2062 const char *help_option_argument)
2dcfc872
ML
2063{
2064 const char *a = help_option_argument;
2065 unsigned int include_flags = 0;
2066 /* Note - by default we include undocumented options when listing
2067 specific classes. If you only want to see documented options
2068 then add ",^undocumented" to the --help= option. E.g.:
2069
2070 --help=target,^undocumented */
2071 unsigned int exclude_flags = 0;
2072
2073 if (lang_mask == CL_DRIVER)
2074 return;
2075
2076 /* Walk along the argument string, parsing each word in turn.
2077 The format is:
2078 arg = [^]{word}[,{arg}]
2079 word = {optimizers|target|warnings|undocumented|
2080 params|common|<language>} */
2081 while (*a != 0)
2082 {
2083 static const struct
2084 {
2085 const char *string;
2086 unsigned int flag;
2087 }
2088 specifics[] =
2089 {
2090 { "optimizers", CL_OPTIMIZATION },
2091 { "target", CL_TARGET },
2092 { "warnings", CL_WARNING },
2093 { "undocumented", CL_UNDOCUMENTED },
2094 { "params", CL_PARAMS },
2095 { "joined", CL_JOINED },
2096 { "separate", CL_SEPARATE },
2097 { "common", CL_COMMON },
2098 { NULL, 0 }
2099 };
2100 unsigned int *pflags;
2101 const char *comma;
2102 unsigned int lang_flag, specific_flag;
2103 unsigned int len;
2104 unsigned int i;
2105
2106 if (*a == '^')
2107 {
2108 ++a;
2109 if (*a == '\0')
2110 {
2111 error ("missing argument to %qs", "--help=^");
2112 break;
2113 }
2114 pflags = &exclude_flags;
2115 }
2116 else
2117 pflags = &include_flags;
2118
2119 comma = strchr (a, ',');
2120 if (comma == NULL)
2121 len = strlen (a);
2122 else
2123 len = comma - a;
2124 if (len == 0)
2125 {
2126 a = comma + 1;
2127 continue;
2128 }
2129
2130 /* Check to see if the string matches an option class name. */
2131 for (i = 0, specific_flag = 0; specifics[i].string != NULL; i++)
2132 if (strncasecmp (a, specifics[i].string, len) == 0)
2133 {
2134 specific_flag = specifics[i].flag;
2135 break;
2136 }
2137
2138 /* Check to see if the string matches a language name.
2139 Note - we rely upon the alpha-sorted nature of the entries in
2140 the lang_names array, specifically that shorter names appear
2141 before their longer variants. (i.e. C before C++). That way
2142 when we are attempting to match --help=c for example we will
2143 match with C first and not C++. */
2144 for (i = 0, lang_flag = 0; i < cl_lang_count; i++)
2145 if (strncasecmp (a, lang_names[i], len) == 0)
2146 {
2147 lang_flag = 1U << i;
2148 break;
2149 }
2150
2151 if (specific_flag != 0)
2152 {
2153 if (lang_flag == 0)
2154 *pflags |= specific_flag;
2155 else
2156 {
2157 /* The option's argument matches both the start of a
2158 language name and the start of an option class name.
2159 We have a special case for when the user has
2160 specified "--help=c", but otherwise we have to issue
2161 a warning. */
2162 if (strncasecmp (a, "c", len) == 0)
2163 *pflags |= lang_flag;
2164 else
2165 warning (0,
a9c697b8 2166 "%<--help%> argument %q.*s is ambiguous, "
2dcfc872
ML
2167 "please be more specific",
2168 len, a);
2169 }
2170 }
2171 else if (lang_flag != 0)
2172 *pflags |= lang_flag;
2173 else
2174 warning (0,
a9c697b8 2175 "unrecognized argument to %<--help=%> option: %q.*s",
2dcfc872
ML
2176 len, a);
2177
2178 if (comma == NULL)
2179 break;
2180 a = comma + 1;
2181 }
2182
2183 if (include_flags)
2184 print_specific_help (include_flags, exclude_flags, 0, opts,
2185 lang_mask);
2186}
2187
d7b42618 2188/* Handle target- and language-independent options. Return zero to
50431bc4
ZD
2189 generate an "unknown option" message. Only options that need
2190 extra handling need to be listed here; if you simply want
481e1176 2191 DECODED->value assigned to a variable, it happens automatically. */
50431bc4 2192
c98cd5bf 2193bool
46625112 2194common_handle_option (struct gcc_options *opts,
d4d24ba4 2195 struct gcc_options *opts_set,
46625112 2196 const struct cl_decoded_option *decoded,
5f20c657 2197 unsigned int lang_mask, int kind ATTRIBUTE_UNUSED,
a4d8c676 2198 location_t loc,
d5478783 2199 const struct cl_option_handlers *handlers,
130fcab0
ML
2200 diagnostic_context *dc,
2201 void (*target_option_override_hook) (void))
d7b42618 2202{
481e1176
JM
2203 size_t scode = decoded->opt_index;
2204 const char *arg = decoded->arg;
00abf86c 2205 HOST_WIDE_INT value = decoded->value;
d7b42618
NB
2206 enum opt_code code = (enum opt_code) scode;
2207
481e1176
JM
2208 gcc_assert (decoded->canonical_option_num_elements <= 2);
2209
d7b42618
NB
2210 switch (code)
2211 {
903caebf 2212 case OPT__param:
299404a1 2213 handle_param (opts, opts_set, loc, arg);
903caebf
NB
2214 break;
2215
c662432e
NC
2216 case OPT__help:
2217 {
2218 unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
2219 unsigned int undoc_mask;
2220 unsigned int i;
2221
a7d0d30f 2222 if (lang_mask == CL_DRIVER)
6f3d1a5e 2223 break;
a7d0d30f 2224
d5478783
JM
2225 undoc_mask = ((opts->x_verbose_flag | opts->x_extra_warnings)
2226 ? 0
2227 : CL_UNDOCUMENTED);
130fcab0 2228 target_option_override_hook ();
c662432e
NC
2229 /* First display any single language specific options. */
2230 for (i = 0; i < cl_lang_count; i++)
2231 print_specific_help
e6d4b984
JM
2232 (1U << i, (all_langs_mask & (~ (1U << i))) | undoc_mask, 0, opts,
2233 lang_mask);
c662432e 2234 /* Next display any multi language specific options. */
e6d4b984 2235 print_specific_help (0, undoc_mask, all_langs_mask, opts, lang_mask);
c662432e
NC
2236 /* Then display any remaining, non-language options. */
2237 for (i = CL_MIN_OPTION_CLASS; i <= CL_MAX_OPTION_CLASS; i <<= 1)
603349bf 2238 if (i != CL_DRIVER)
e6d4b984 2239 print_specific_help (i, undoc_mask, 0, opts, lang_mask);
0576d21f 2240 opts->x_exit_after_options = true;
c662432e
NC
2241 break;
2242 }
2243
d185d268 2244 case OPT__target_help:
a7d0d30f
JM
2245 if (lang_mask == CL_DRIVER)
2246 break;
2247
130fcab0 2248 target_option_override_hook ();
e6d4b984 2249 print_specific_help (CL_TARGET, CL_UNDOCUMENTED, 0, opts, lang_mask);
0576d21f 2250 opts->x_exit_after_options = true;
d185d268
NB
2251 break;
2252
c662432e
NC
2253 case OPT__help_:
2254 {
bc405869 2255 help_option_arguments.safe_push (arg);
0576d21f 2256 opts->x_exit_after_options = true;
c662432e
NC
2257 break;
2258 }
2259
d185d268 2260 case OPT__version:
a7d0d30f
JM
2261 if (lang_mask == CL_DRIVER)
2262 break;
2263
0576d21f 2264 opts->x_exit_after_options = true;
d185d268
NB
2265 break;
2266
d86c7648
ML
2267 case OPT__completion_:
2268 break;
2269
de5a5fa1 2270 case OPT_fsanitize_:
b1b46af0
JJ
2271 opts->x_flag_sanitize
2272 = parse_sanitizer_options (arg, loc, code,
2273 opts->x_flag_sanitize, value, true);
de5a5fa1 2274
b1b46af0
JJ
2275 /* Kernel ASan implies normal ASan but does not yet support
2276 all features. */
2277 if (opts->x_flag_sanitize & SANITIZE_KERNEL_ADDRESS)
2278 {
2279 maybe_set_param_value (PARAM_ASAN_INSTRUMENTATION_WITH_CALL_THRESHOLD,
2280 0, opts->x_param_values,
2281 opts_set->x_param_values);
2282 maybe_set_param_value (PARAM_ASAN_GLOBALS, 0, opts->x_param_values,
2283 opts_set->x_param_values);
2284 maybe_set_param_value (PARAM_ASAN_STACK, 0, opts->x_param_values,
2285 opts_set->x_param_values);
5094f7d5
MO
2286 maybe_set_param_value (PARAM_ASAN_PROTECT_ALLOCAS, 0,
2287 opts->x_param_values,
2288 opts_set->x_param_values);
b1b46af0
JJ
2289 maybe_set_param_value (PARAM_ASAN_USE_AFTER_RETURN, 0,
2290 opts->x_param_values,
2291 opts_set->x_param_values);
2292 }
2293 break;
fec4842d 2294
b1b46af0
JJ
2295 case OPT_fsanitize_recover_:
2296 opts->x_flag_sanitize_recover
2297 = parse_sanitizer_options (arg, loc, code,
2298 opts->x_flag_sanitize_recover, value, true);
2299 break;
de5a5fa1 2300
fd960af2
YG
2301 case OPT_fasan_shadow_offset_:
2302 /* Deferred. */
2303 break;
2304
6dc4a604
ML
2305 case OPT_fsanitize_address_use_after_scope:
2306 opts->x_flag_sanitize_address_use_after_scope = value;
2307 break;
2308
d95a2703
JJ
2309 case OPT_fsanitize_recover:
2310 if (value)
2311 opts->x_flag_sanitize_recover
45b2222a 2312 |= (SANITIZE_UNDEFINED | SANITIZE_UNDEFINED_NONDEFAULT)
5cc6c41c 2313 & ~(SANITIZE_UNREACHABLE | SANITIZE_RETURN);
d95a2703
JJ
2314 else
2315 opts->x_flag_sanitize_recover
45b2222a 2316 &= ~(SANITIZE_UNDEFINED | SANITIZE_UNDEFINED_NONDEFAULT);
d95a2703
JJ
2317 break;
2318
f6e50a7d
WW
2319 case OPT_fsanitize_coverage_:
2320 opts->x_flag_sanitize_coverage
2321 = parse_sanitizer_options (arg, loc, code,
2322 opts->x_flag_sanitize_coverage, value, true);
2323 break;
2324
903caebf
NB
2325 case OPT_O:
2326 case OPT_Os:
c3a02647 2327 case OPT_Ofast:
bf7a7185 2328 case OPT_Og:
903caebf
NB
2329 /* Currently handled in a prescan. */
2330 break;
2331
aee15221
RG
2332 case OPT_Werror:
2333 dc->warning_as_error_requested = value;
2334 break;
2335
79cf5994 2336 case OPT_Werror_:
a7d0d30f
JM
2337 if (lang_mask == CL_DRIVER)
2338 break;
2339
c5fa0890
JM
2340 enable_warning_as_error (arg, value, lang_mask, handlers,
2341 opts, opts_set, loc, dc);
79cf5994
DD
2342 break;
2343
5f0f4a3b 2344 case OPT_Wfatal_errors:
d5478783 2345 dc->fatal_errors = value;
5f0f4a3b
JM
2346 break;
2347
a11e0df4 2348 case OPT_Wstack_usage_:
a11e0df4
EB
2349 opts->x_flag_stack_usage_info = value != -1;
2350 break;
2351
e01cc6dc 2352 case OPT_Wstrict_aliasing:
d5478783 2353 set_Wstrict_aliasing (opts, value);
e01cc6dc
NB
2354 break;
2355
6ac01510 2356 case OPT_Wstrict_overflow:
d5478783
JM
2357 opts->x_warn_strict_overflow = (value
2358 ? (int) WARN_STRICT_OVERFLOW_CONDITIONAL
2359 : 0);
6ac01510
ILT
2360 break;
2361
5f0f4a3b 2362 case OPT_Wsystem_headers:
d5478783 2363 dc->dc_warn_system_headers = value;
903caebf
NB
2364 break;
2365
d185d268 2366 case OPT_aux_info:
d5478783 2367 opts->x_flag_gen_aux_info = 1;
d185d268
NB
2368 break;
2369
2370 case OPT_auxbase_strip:
2371 {
2372 char *tmp = xstrdup (arg);
2373 strip_off_ending (tmp, strlen (tmp));
2374 if (tmp[0])
d5478783 2375 opts->x_aux_base_name = tmp;
fc429b48
TB
2376 else
2377 free (tmp);
d185d268
NB
2378 }
2379 break;
2380
2381 case OPT_d:
299404a1 2382 decode_d_option (arg, opts, loc, dc);
d185d268
NB
2383 break;
2384
058de654 2385 case OPT_fcall_used_:
058de654 2386 case OPT_fcall_saved_:
21bf1558 2387 /* Deferred. */
058de654 2388 break;
6fb5fa3c
DB
2389
2390 case OPT_fdbg_cnt_:
68d070ac
ML
2391 /* Deferred. */
2392 break;
2393
0a090f42 2394 case OPT_fdbg_cnt_list:
299404a1 2395 /* Deferred. */
68d070ac 2396 opts->x_exit_after_options = true;
0a090f42 2397 break;
058de654 2398
c8aea42c 2399 case OPT_fdebug_prefix_map_:
7365279f 2400 case OPT_ffile_prefix_map_:
299404a1 2401 /* Deferred. */
c8aea42c
PB
2402 break;
2403
de32c0cb 2404 case OPT_fdiagnostics_show_location_:
e6d4b984 2405 diagnostic_prefixing_rule (dc) = (diagnostic_prefixing_rule_t) value;
de32c0cb 2406 break;
9fec0042
MLI
2407
2408 case OPT_fdiagnostics_show_caret:
2409 dc->show_caret = value;
2410 break;
de32c0cb 2411
96e6ae57
DM
2412 case OPT_fdiagnostics_show_labels:
2413 dc->show_labels_p = value;
2414 break;
2415
56b61d7f
DM
2416 case OPT_fdiagnostics_show_line_numbers:
2417 dc->show_line_numbers_p = value;
2418 break;
2419
4b84d650 2420 case OPT_fdiagnostics_color_:
97aa8bb6 2421 diagnostic_color_init (dc, value);
4b84d650
JJ
2422 break;
2423
478dd60d
DM
2424 case OPT_fdiagnostics_format_:
2425 diagnostic_output_format_init (dc,
2426 (enum diagnostics_output_format)value);
2427 break;
2428
a93eac6a
DM
2429 case OPT_fdiagnostics_parseable_fixits:
2430 dc->parseable_fixits_p = value;
2431 break;
2432
2098fe9e 2433 case OPT_fdiagnostics_show_option:
d5478783 2434 dc->show_option_requested = value;
2098fe9e
DD
2435 break;
2436
0141ab44
DM
2437 case OPT_fdiagnostics_minimum_margin_width_:
2438 dc->min_margin_width = value;
2439 break;
2440
6de9cd9a 2441 case OPT_fdump_:
21bf1558 2442 /* Deferred. */
6de9cd9a
DN
2443 break;
2444
058de654 2445 case OPT_ffast_math:
d5478783 2446 set_fast_math_flags (opts, value);
058de654
NB
2447 break;
2448
a1a82611 2449 case OPT_funsafe_math_optimizations:
d5478783 2450 set_unsafe_math_optimizations_flags (opts, value);
a1a82611
RE
2451 break;
2452
058de654 2453 case OPT_ffixed_:
21bf1558 2454 /* Deferred. */
058de654
NB
2455 break;
2456
d302c9d6 2457 case OPT_finline_limit_:
48476d13
JM
2458 set_param_value ("max-inline-insns-single", value / 2,
2459 opts->x_param_values, opts_set->x_param_values);
2460 set_param_value ("max-inline-insns-auto", value / 2,
2461 opts->x_param_values, opts_set->x_param_values);
d302c9d6
NB
2462 break;
2463
8d5a7d1f 2464 case OPT_finstrument_functions_exclude_function_list_:
1ebc7e68 2465 add_comma_separated_to_vector
6a1f6c9c 2466 (&opts->x_flag_instrument_functions_exclude_functions, arg);
8d5a7d1f
ILT
2467 break;
2468
2469 case OPT_finstrument_functions_exclude_file_list_:
1ebc7e68 2470 add_comma_separated_to_vector
6a1f6c9c 2471 (&opts->x_flag_instrument_functions_exclude_files, arg);
8d5a7d1f
ILT
2472 break;
2473
de32c0cb 2474 case OPT_fmessage_length_:
d5478783 2475 pp_set_line_maximum_length (dc->printer, value);
9fec0042 2476 diagnostic_set_caret_max_width (dc, value);
de32c0cb
NB
2477 break;
2478
78c60e3d
SS
2479 case OPT_fopt_info:
2480 case OPT_fopt_info_:
2481 /* Deferred. */
2482 break;
2483
c713ddc0 2484 case OPT_foffload_:
b2b40051
MJ
2485 {
2486 const char *p = arg;
2487 opts->x_flag_disable_hsa = true;
2488 while (*p != 0)
2489 {
2490 const char *comma = strchr (p, ',');
2491
2492 if ((strncmp (p, "disable", 7) == 0)
2493 && (p[7] == ',' || p[7] == '\0'))
2494 {
2495 opts->x_flag_disable_hsa = true;
2496 break;
2497 }
2498
2499 if ((strncmp (p, "hsa", 3) == 0)
2500 && (p[3] == ',' || p[3] == '\0'))
2501 {
2502#ifdef ENABLE_HSA
2503 opts->x_flag_disable_hsa = false;
2504#else
2505 sorry ("HSA has not been enabled during configuration");
2506#endif
2507 }
2508 if (!comma)
2509 break;
2510 p = comma + 1;
2511 }
2512 break;
2513 }
c713ddc0
BS
2514
2515#ifndef ACCEL_COMPILER
2516 case OPT_foffload_abi_:
4f4b35a0 2517 error_at (loc, "%<-foffload-abi%> option can be specified only for "
c713ddc0
BS
2518 "offload compiler");
2519 break;
2520#endif
2521
467cecf3
JB
2522 case OPT_fpack_struct_:
2523 if (value <= 0 || (value & (value - 1)) || value > 16)
299404a1 2524 error_at (loc,
00abf86c 2525 "structure alignment must be a small power of two, not %wu",
299404a1 2526 value);
467cecf3 2527 else
299404a1 2528 opts->x_initial_max_fld_align = value;
467cecf3
JB
2529 break;
2530
68a607d8 2531 case OPT_fplugin_:
68a607d8 2532 case OPT_fplugin_arg_:
21bf1558 2533 /* Deferred. */
68a607d8
DN
2534 break;
2535
2f908293 2536 case OPT_fprofile_use_:
0576d21f 2537 opts->x_profile_data_prefix = xstrdup (arg);
d5478783 2538 opts->x_flag_profile_use = true;
2f908293
SP
2539 value = true;
2540 /* No break here - do -fprofile-use processing. */
191816a3 2541 /* FALLTHRU */
a8a5f53a 2542 case OPT_fprofile_use:
be3c16c4 2543 enable_fdo_optimizations (opts, opts_set, value);
9cec31f4 2544 if (!opts_set->x_flag_profile_reorder_functions)
be3c16c4
DC
2545 opts->x_flag_profile_reorder_functions = value;
2546 /* Indirect call profiling should do all useful transformations
2547 speculative devirtualization does. */
bbc9396b
JH
2548 if (!opts_set->x_flag_devirtualize_speculatively
2549 && opts->x_flag_value_profile_transformations)
2550 opts->x_flag_devirtualize_speculatively = false;
a8a5f53a
JH
2551 break;
2552
be3c16c4
DC
2553 case OPT_fauto_profile_:
2554 opts->x_auto_profile_file = xstrdup (arg);
2555 opts->x_flag_auto_profile = true;
2556 value = true;
2557 /* No break here - do -fauto-profile processing. */
191816a3 2558 /* FALLTHRU */
be3c16c4
DC
2559 case OPT_fauto_profile:
2560 enable_fdo_optimizations (opts, opts_set, value);
2561 if (!opts_set->x_flag_profile_correction)
2562 opts->x_flag_profile_correction = value;
2563 maybe_set_param_value (
2564 PARAM_EARLY_INLINER_MAX_ITERATIONS, 10,
2565 opts->x_param_values, opts_set->x_param_values);
2566 break;
2567
2f908293 2568 case OPT_fprofile_generate_:
0576d21f 2569 opts->x_profile_data_prefix = xstrdup (arg);
2f908293
SP
2570 value = true;
2571 /* No break here - do -fprofile-generate processing. */
191816a3 2572 /* FALLTHRU */
a8a5f53a 2573 case OPT_fprofile_generate:
d4d24ba4 2574 if (!opts_set->x_profile_arc_flag)
d5478783 2575 opts->x_profile_arc_flag = value;
d4d24ba4 2576 if (!opts_set->x_flag_profile_values)
d5478783 2577 opts->x_flag_profile_values = value;
d4d24ba4 2578 if (!opts_set->x_flag_inline_functions)
d5478783 2579 opts->x_flag_inline_functions = value;
37731134
ML
2580 if (!opts_set->x_flag_ipa_bit_cp)
2581 opts->x_flag_ipa_bit_cp = value;
b0223c3e
JH
2582 /* FIXME: Instrumentation we insert makes ipa-reference bitmaps
2583 quadratic. Disable the pass until better memory representation
2584 is done. */
1c58fe29 2585 if (!opts_set->x_flag_ipa_reference)
b0223c3e 2586 opts->x_flag_ipa_reference = false;
a8a5f53a
JH
2587 break;
2588
417ca011
TD
2589 case OPT_fpatchable_function_entry_:
2590 {
2591 char *patch_area_arg = xstrdup (arg);
2592 char *comma = strchr (patch_area_arg, ',');
2593 if (comma)
2594 {
2595 *comma = '\0';
2596 function_entry_patch_area_size =
2597 integral_argument (patch_area_arg);
2598 function_entry_patch_area_start =
2599 integral_argument (comma + 1);
2600 }
2601 else
2602 {
2603 function_entry_patch_area_size =
2604 integral_argument (patch_area_arg);
2605 function_entry_patch_area_start = 0;
2606 }
2607 if (function_entry_patch_area_size < 0
2608 || function_entry_patch_area_start < 0
2609 || function_entry_patch_area_size
2610 < function_entry_patch_area_start)
2611 error ("invalid arguments for %<-fpatchable_function_entry%>");
2612 free (patch_area_arg);
2613 }
2614 break;
2615
ea0f3e87 2616 case OPT_ftree_vectorize:
26d476cd
JG
2617 /* Automatically sets -ftree-loop-vectorize and
2618 -ftree-slp-vectorize. Nothing more to do here. */
ea0f3e87 2619 break;
5f0f4a3b 2620 case OPT_fshow_column:
d5478783 2621 dc->show_column = value;
5f0f4a3b
JM
2622 break;
2623
de32c0cb
NB
2624 case OPT_frandom_seed:
2625 /* The real switch is -fno-random-seed. */
2626 if (value)
5f20c657 2627 return false;
299404a1 2628 /* Deferred. */
de32c0cb
NB
2629 break;
2630
2631 case OPT_frandom_seed_:
299404a1 2632 /* Deferred. */
de32c0cb
NB
2633 break;
2634
de32c0cb
NB
2635 case OPT_fsched_verbose_:
2636#ifdef INSN_SCHEDULING
299404a1 2637 /* Handled with Var in common.opt. */
de32c0cb
NB
2638 break;
2639#else
5f20c657 2640 return false;
de32c0cb
NB
2641#endif
2642
569fa502 2643 case OPT_fsched_stalled_insns_:
d5478783
JM
2644 opts->x_flag_sched_stalled_insns = value;
2645 if (opts->x_flag_sched_stalled_insns == 0)
2646 opts->x_flag_sched_stalled_insns = -1;
569fa502
DN
2647 break;
2648
569fa502 2649 case OPT_fsched_stalled_insns_dep_:
d5478783 2650 opts->x_flag_sched_stalled_insns_dep = value;
569fa502 2651 break;
6ff3a151 2652
b38f3813
EB
2653 case OPT_fstack_check_:
2654 if (!strcmp (arg, "no"))
5e471ea6 2655 opts->x_flag_stack_check = NO_STACK_CHECK;
b38f3813
EB
2656 else if (!strcmp (arg, "generic"))
2657 /* This is the old stack checking method. */
5e471ea6 2658 opts->x_flag_stack_check = STACK_CHECK_BUILTIN
b38f3813
EB
2659 ? FULL_BUILTIN_STACK_CHECK
2660 : GENERIC_STACK_CHECK;
2661 else if (!strcmp (arg, "specific"))
2662 /* This is the new stack checking method. */
5e471ea6 2663 opts->x_flag_stack_check = STACK_CHECK_BUILTIN
b38f3813
EB
2664 ? FULL_BUILTIN_STACK_CHECK
2665 : STACK_CHECK_STATIC_BUILTIN
2666 ? STATIC_BUILTIN_STACK_CHECK
2667 : GENERIC_STACK_CHECK;
2668 else
778e02fd 2669 warning_at (loc, 0, "unknown stack check parameter %qs", arg);
b38f3813
EB
2670 break;
2671
de32c0cb
NB
2672 case OPT_fstack_limit:
2673 /* The real switch is -fno-stack-limit. */
2674 if (value)
5f20c657 2675 return false;
21bf1558 2676 /* Deferred. */
de32c0cb
NB
2677 break;
2678
058de654 2679 case OPT_fstack_limit_register_:
058de654 2680 case OPT_fstack_limit_symbol_:
21bf1558 2681 /* Deferred. */
058de654
NB
2682 break;
2683
a11e0df4
EB
2684 case OPT_fstack_usage:
2685 opts->x_flag_stack_usage = value;
2686 opts->x_flag_stack_usage_info = value != 0;
2687 break;
2688
e01cc6dc 2689 case OPT_g:
bc91b0e0
CC
2690 set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, arg, opts, opts_set,
2691 loc);
df38ffef
NB
2692 break;
2693
6782438d 2694 case OPT_gdwarf:
f0defe58 2695 if (arg && strlen (arg) != 0)
6782438d 2696 {
a3f9f006
ML
2697 error_at (loc, "%<-gdwarf%s%> is ambiguous; "
2698 "use %<-gdwarf-%s%> for DWARF version "
2699 "or %<-gdwarf%> %<-g%s%> for debug level", arg, arg, arg);
6782438d
SKS
2700 break;
2701 }
2702 else
f0defe58
SKS
2703 value = opts->x_dwarf_version;
2704
2705 /* FALLTHRU */
53b2323e 2706 case OPT_gdwarf_:
5d45c9c0 2707 if (value < 2 || value > 5)
00abf86c 2708 error_at (loc, "dwarf version %wu is not supported", value);
53b2323e 2709 else
a7d0d30f 2710 opts->x_dwarf_version = value;
299404a1 2711 set_debug_level (DWARF2_DEBUG, false, "", opts, opts_set, loc);
df38ffef
NB
2712 break;
2713
99ea153e
SA
2714 case OPT_gsplit_dwarf:
2715 set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, "", opts, opts_set,
2716 loc);
2717 break;
2718
df38ffef 2719 case OPT_ggdb:
299404a1 2720 set_debug_level (NO_DEBUG, 2, arg, opts, opts_set, loc);
df38ffef
NB
2721 break;
2722
2723 case OPT_gstabs:
2724 case OPT_gstabs_:
299404a1
JM
2725 set_debug_level (DBX_DEBUG, code == OPT_gstabs_, arg, opts, opts_set,
2726 loc);
df38ffef
NB
2727 break;
2728
2729 case OPT_gvms:
299404a1 2730 set_debug_level (VMS_DEBUG, false, arg, opts, opts_set, loc);
df38ffef
NB
2731 break;
2732
2733 case OPT_gxcoff:
2734 case OPT_gxcoff_:
299404a1
JM
2735 set_debug_level (XCOFF_DEBUG, code == OPT_gxcoff_, arg, opts, opts_set,
2736 loc);
e01cc6dc
NB
2737 break;
2738
29d7cbd1
RO
2739 case OPT_gz:
2740 case OPT_gz_:
2741 /* Handled completely via specs. */
2742 break;
2743
d185d268 2744 case OPT_pedantic_errors:
d5478783 2745 dc->pedantic_errors = 1;
63bbf46d 2746 control_warning_option (OPT_Wpedantic, DK_ERROR, NULL, value,
9b095bf1
MLI
2747 loc, lang_mask,
2748 handlers, opts, opts_set,
2749 dc);
c04b6b38
RG
2750 break;
2751
014d92e1 2752 case OPT_flto:
595c8dfa 2753 opts->x_flag_lto = value ? "" : NULL;
e10909ce
AK
2754 break;
2755
5f0f4a3b 2756 case OPT_w:
d5478783 2757 dc->dc_inhibit_warnings = true;
5f0f4a3b
JM
2758 break;
2759
3a789837
NF
2760 case OPT_fmax_errors_:
2761 dc->max_errors = value;
2762 break;
2763
b352afba
NC
2764 case OPT_fuse_ld_bfd:
2765 case OPT_fuse_ld_gold:
d69ac8b7 2766 case OPT_fuse_ld_lld:
da18ea94
RAE
2767 case OPT_fuse_linker_plugin:
2768 /* No-op. Used by the driver and passed to us because it starts with f.*/
2769 break;
2770
955f5a07
JJ
2771 case OPT_fwrapv:
2772 if (value)
2773 opts->x_flag_trapv = 0;
2774 break;
2775
2776 case OPT_ftrapv:
2777 if (value)
2778 opts->x_flag_wrapv = 0;
2779 break;
2780
3fccbb9e
JJ
2781 case OPT_fstrict_overflow:
2782 opts->x_flag_wrapv = !value;
2783 opts->x_flag_wrapv_pointer = !value;
2784 if (!value)
2785 opts->x_flag_trapv = 0;
2786 break;
2787
b84d4347 2788 case OPT_fipa_icf:
9d4ded75
ML
2789 opts->x_flag_ipa_icf_functions = value;
2790 opts->x_flag_ipa_icf_variables = value;
b84d4347
ML
2791 break;
2792
c518c102
ML
2793 case OPT_falign_loops_:
2794 check_alignment_argument (loc, arg, "loops");
2795 break;
2796
2797 case OPT_falign_jumps_:
2798 check_alignment_argument (loc, arg, "jumps");
2799 break;
2800
2801 case OPT_falign_labels_:
2802 check_alignment_argument (loc, arg, "labels");
2803 break;
2804
2805 case OPT_falign_functions_:
2806 check_alignment_argument (loc, arg, "functions");
2807 break;
2808
50431bc4
ZD
2809 default:
2810 /* If the flag was handled in a standard way, assume the lack of
2811 processing here is intentional. */
46625112 2812 gcc_assert (option_flag_var (scode, opts));
0e61db61 2813 break;
d7b42618
NB
2814 }
2815
7d5a5747
MLI
2816 common_handle_option_auto (opts, opts_set, decoded, lang_mask, kind,
2817 loc, handlers, dc);
5f20c657 2818 return true;
d7b42618 2819}
903caebf
NB
2820
2821/* Handle --param NAME=VALUE. */
2822static void
48476d13 2823handle_param (struct gcc_options *opts, struct gcc_options *opts_set,
299404a1 2824 location_t loc, const char *carg)
903caebf
NB
2825{
2826 char *equal, *arg;
2827 int value;
2828
2829 arg = xstrdup (carg);
2830 equal = strchr (arg, '=');
2831 if (!equal)
a9c697b8
MS
2832 error_at (loc, "%s: %qs arguments should be of the form NAME=VALUE",
2833 arg, "--param");
903caebf
NB
2834 else
2835 {
d78182cc
TV
2836 *equal = '\0';
2837
2838 enum compiler_param index;
2839 if (!find_param (arg, &index))
f4452176
DM
2840 {
2841 const char *suggestion = find_param_fuzzy (arg);
2842 if (suggestion)
a9c697b8
MS
2843 error_at (loc, "invalid %qs name %qs; did you mean %qs?",
2844 "--param", arg, suggestion);
f4452176 2845 else
a9c697b8 2846 error_at (loc, "invalid %qs name %qs", "--param", arg);
f4452176 2847 }
903caebf
NB
2848 else
2849 {
d78182cc
TV
2850 if (!param_string_value_p (index, equal + 1, &value))
2851 value = integral_argument (equal + 1);
2852
2853 if (value == -1)
a9c697b8 2854 error_at (loc, "invalid %qs value %qs", "--param", equal + 1);
d78182cc
TV
2855 else
2856 set_param_value (arg, value,
2857 opts->x_param_values, opts_set->x_param_values);
903caebf
NB
2858 }
2859 }
2860
2861 free (arg);
2862}
2863
d5478783 2864/* Used to set the level of strict aliasing warnings in OPTS,
79bedddc
SR
2865 when no level is specified (i.e., when -Wstrict-aliasing, and not
2866 -Wstrict-aliasing=level was given).
2867 ONOFF is assumed to take value 1 when -Wstrict-aliasing is specified,
2868 and 0 otherwise. After calling this function, wstrict_aliasing will be
2869 set to the default value of -Wstrict_aliasing=level, currently 3. */
65d4f2cd 2870static void
d5478783 2871set_Wstrict_aliasing (struct gcc_options *opts, int onoff)
79bedddc
SR
2872{
2873 gcc_assert (onoff == 0 || onoff == 1);
2874 if (onoff != 0)
d5478783 2875 opts->x_warn_strict_aliasing = 3;
621b5ed6 2876 else
d5478783 2877 opts->x_warn_strict_aliasing = 0;
79bedddc
SR
2878}
2879
058de654
NB
2880/* The following routines are useful in setting all the flags that
2881 -ffast-math and -fno-fast-math imply. */
7bb3487f 2882static void
d5478783 2883set_fast_math_flags (struct gcc_options *opts, int set)
058de654 2884{
5e46b0c6
ILT
2885 if (!opts->frontend_set_flag_unsafe_math_optimizations)
2886 {
2887 opts->x_flag_unsafe_math_optimizations = set;
2888 set_unsafe_math_optimizations_flags (opts, set);
2889 }
2890 if (!opts->frontend_set_flag_finite_math_only)
2891 opts->x_flag_finite_math_only = set;
2892 if (!opts->frontend_set_flag_errno_math)
2893 opts->x_flag_errno_math = !set;
058de654 2894 if (set)
039c3d42 2895 {
314e1b47
JG
2896 if (opts->frontend_set_flag_excess_precision_cmdline
2897 == EXCESS_PRECISION_DEFAULT)
2898 opts->x_flag_excess_precision_cmdline
2899 = set ? EXCESS_PRECISION_FAST : EXCESS_PRECISION_DEFAULT;
5e46b0c6
ILT
2900 if (!opts->frontend_set_flag_signaling_nans)
2901 opts->x_flag_signaling_nans = 0;
2902 if (!opts->frontend_set_flag_rounding_math)
2903 opts->x_flag_rounding_math = 0;
2904 if (!opts->frontend_set_flag_cx_limited_range)
2905 opts->x_flag_cx_limited_range = 1;
039c3d42 2906 }
058de654
NB
2907}
2908
b8698a0f
L
2909/* When -funsafe-math-optimizations is set the following
2910 flags are set as well. */
7bb3487f 2911static void
d5478783 2912set_unsafe_math_optimizations_flags (struct gcc_options *opts, int set)
a1a82611 2913{
5e46b0c6
ILT
2914 if (!opts->frontend_set_flag_trapping_math)
2915 opts->x_flag_trapping_math = !set;
2916 if (!opts->frontend_set_flag_signed_zeros)
2917 opts->x_flag_signed_zeros = !set;
2918 if (!opts->frontend_set_flag_associative_math)
2919 opts->x_flag_associative_math = set;
2920 if (!opts->frontend_set_flag_reciprocal_math)
2921 opts->x_flag_reciprocal_math = set;
a1a82611
RE
2922}
2923
0576d21f 2924/* Return true iff flags in OPTS are set as if -ffast-math. */
058de654 2925bool
0576d21f 2926fast_math_flags_set_p (const struct gcc_options *opts)
058de654 2927{
0576d21f
JM
2928 return (!opts->x_flag_trapping_math
2929 && opts->x_flag_unsafe_math_optimizations
2930 && opts->x_flag_finite_math_only
2931 && !opts->x_flag_signed_zeros
314e1b47
JG
2932 && !opts->x_flag_errno_math
2933 && opts->x_flag_excess_precision_cmdline
2934 == EXCESS_PRECISION_FAST);
058de654 2935}
cf03fd63 2936
ab442df7
MM
2937/* Return true iff flags are set as if -ffast-math but using the flags stored
2938 in the struct cl_optimization structure. */
2939bool
2940fast_math_flags_struct_set_p (struct cl_optimization *opt)
2941{
e3339d0f
JM
2942 return (!opt->x_flag_trapping_math
2943 && opt->x_flag_unsafe_math_optimizations
2944 && opt->x_flag_finite_math_only
2945 && !opt->x_flag_signed_zeros
2946 && !opt->x_flag_errno_math);
ab442df7
MM
2947}
2948
0576d21f
JM
2949/* Handle a debug output -g switch for options OPTS
2950 (OPTS_SET->x_write_symbols storing whether a debug type was passed
299404a1
JM
2951 explicitly), location LOC. EXTENDED is true or false to support
2952 extended output (2 is special and means "-ggdb" was given). */
df38ffef 2953static void
0576d21f 2954set_debug_level (enum debug_info_type type, int extended, const char *arg,
299404a1
JM
2955 struct gcc_options *opts, struct gcc_options *opts_set,
2956 location_t loc)
df38ffef 2957{
0576d21f 2958 opts->x_use_gnu_debug_info_extensions = extended;
df38ffef
NB
2959
2960 if (type == NO_DEBUG)
2961 {
0576d21f 2962 if (opts->x_write_symbols == NO_DEBUG)
df38ffef 2963 {
0576d21f 2964 opts->x_write_symbols = PREFERRED_DEBUGGING_TYPE;
df38ffef
NB
2965
2966 if (extended == 2)
2967 {
c9665100 2968#if defined DWARF2_DEBUGGING_INFO || defined DWARF2_LINENO_DEBUGGING_INFO
0576d21f 2969 opts->x_write_symbols = DWARF2_DEBUG;
df38ffef 2970#elif defined DBX_DEBUGGING_INFO
0576d21f 2971 opts->x_write_symbols = DBX_DEBUG;
df38ffef
NB
2972#endif
2973 }
2974
0576d21f 2975 if (opts->x_write_symbols == NO_DEBUG)
299404a1 2976 warning_at (loc, 0, "target system does not support debug output");
df38ffef
NB
2977 }
2978 }
2979 else
2980 {
2981 /* Does it conflict with an already selected type? */
0576d21f
JM
2982 if (opts_set->x_write_symbols != NO_DEBUG
2983 && opts->x_write_symbols != NO_DEBUG
2984 && type != opts->x_write_symbols)
778e02fd 2985 error_at (loc, "debug format %qs conflicts with prior selection",
299404a1 2986 debug_type_names[type]);
0576d21f
JM
2987 opts->x_write_symbols = type;
2988 opts_set->x_write_symbols = type;
df38ffef
NB
2989 }
2990
bc91b0e0
CC
2991 /* A debug flag without a level defaults to level 2.
2992 If off or at level 1, set it to level 2, but if already
2993 at level 3, don't lower it. */
df38ffef
NB
2994 if (*arg == '\0')
2995 {
bc91b0e0 2996 if (opts->x_debug_info_level < DINFO_LEVEL_NORMAL)
0576d21f 2997 opts->x_debug_info_level = DINFO_LEVEL_NORMAL;
df38ffef
NB
2998 }
2999 else
3000 {
32e8bb8e
ILT
3001 int argval = integral_argument (arg);
3002 if (argval == -1)
bd2c6270 3003 error_at (loc, "unrecognized debug output level %qs", arg);
32e8bb8e 3004 else if (argval > 3)
778e02fd 3005 error_at (loc, "debug output level %qs is too high", arg);
32e8bb8e 3006 else
0576d21f 3007 opts->x_debug_info_level = (enum debug_info_levels) argval;
df38ffef
NB
3008 }
3009}
3010
299404a1
JM
3011/* Arrange to dump core on error for diagnostic context DC. (The
3012 regular error message is still printed first, except in the case of
3013 abort ().) */
75685792 3014
c98cd5bf 3015static void
299404a1 3016setup_core_dumping (diagnostic_context *dc)
75685792 3017{
c98cd5bf
JM
3018#ifdef SIGABRT
3019 signal (SIGABRT, SIG_DFL);
3020#endif
3021#if defined(HAVE_SETRLIMIT)
3022 {
3023 struct rlimit rlim;
3024 if (getrlimit (RLIMIT_CORE, &rlim) != 0)
40fecdd6 3025 fatal_error (input_location, "getting core file size maximum limit: %m");
c98cd5bf
JM
3026 rlim.rlim_cur = rlim.rlim_max;
3027 if (setrlimit (RLIMIT_CORE, &rlim) != 0)
40fecdd6
JM
3028 fatal_error (input_location,
3029 "setting core file size limit to maximum: %m");
c98cd5bf
JM
3030 }
3031#endif
299404a1 3032 diagnostic_abort_on_error (dc);
75685792 3033}
5c60a017 3034
299404a1
JM
3035/* Parse a -d<ARG> command line switch for OPTS, location LOC,
3036 diagnostic context DC. */
5c60a017 3037
c98cd5bf 3038static void
299404a1
JM
3039decode_d_option (const char *arg, struct gcc_options *opts,
3040 location_t loc, diagnostic_context *dc)
5c60a017 3041{
c98cd5bf 3042 int c;
5c60a017 3043
c98cd5bf
JM
3044 while (*arg)
3045 switch (c = *arg++)
3046 {
3047 case 'A':
299404a1 3048 opts->x_flag_debug_asm = 1;
c98cd5bf
JM
3049 break;
3050 case 'p':
299404a1 3051 opts->x_flag_print_asm_name = 1;
c98cd5bf
JM
3052 break;
3053 case 'P':
299404a1
JM
3054 opts->x_flag_dump_rtl_in_asm = 1;
3055 opts->x_flag_print_asm_name = 1;
c98cd5bf 3056 break;
c98cd5bf 3057 case 'x':
299404a1 3058 opts->x_rtl_dump_and_exit = 1;
c98cd5bf
JM
3059 break;
3060 case 'D': /* These are handled by the preprocessor. */
3061 case 'I':
3062 case 'M':
3063 case 'N':
3064 case 'U':
3065 break;
3066 case 'H':
299404a1 3067 setup_core_dumping (dc);
c98cd5bf
JM
3068 break;
3069 case 'a':
299404a1 3070 opts->x_flag_dump_all_passed = true;
c98cd5bf 3071 break;
21bf1558 3072
c98cd5bf 3073 default:
299404a1 3074 warning_at (loc, 0, "unrecognized gcc debugging option: %c", c);
c98cd5bf
JM
3075 break;
3076 }
5c60a017 3077}
dc90f45b 3078
1ebe4b4f 3079/* Enable (or disable if VALUE is 0) a warning option ARG (language
c5fa0890
JM
3080 mask LANG_MASK, option handlers HANDLERS) as an error for option
3081 structures OPTS and OPTS_SET, diagnostic context DC (possibly
3082 NULL), location LOC. This is used by -Werror=. */
dc90f45b 3083
a4d8c676 3084static void
5f20c657 3085enable_warning_as_error (const char *arg, int value, unsigned int lang_mask,
1ebe4b4f 3086 const struct cl_option_handlers *handlers,
c5fa0890
JM
3087 struct gcc_options *opts,
3088 struct gcc_options *opts_set,
a4d8c676 3089 location_t loc, diagnostic_context *dc)
dc90f45b
MLI
3090{
3091 char *new_option;
3092 int option_index;
3093
3094 new_option = XNEWVEC (char, strlen (arg) + 2);
3095 new_option[0] = 'W';
3096 strcpy (new_option + 1, arg);
3097 option_index = find_opt (new_option, lang_mask);
6e2f1956 3098 if (option_index == OPT_SPECIAL_unknown)
5bcc5a3b
ML
3099 {
3100 option_proposer op;
3101 const char *hint = op.suggest_option (new_option);
3102 if (hint)
3103 error_at (loc, "%<-W%serror=%s%>: no option %<-%s%>;"
3104 " did you mean %<-%s%>?", value ? "" : "no-",
3105 arg, new_option, hint);
3106 else
3107 error_at (loc, "%<-W%serror=%s%>: no option %<-%s%>",
3108 value ? "" : "no-", arg, new_option);
3109 }
35632122 3110 else if (!(cl_options[option_index].flags & CL_WARNING))
5bcc5a3b
ML
3111 error_at (loc, "%<-Werror=%s%>: %<-%s%> is not an option that "
3112 "controls warnings", arg, new_option);
dc90f45b
MLI
3113 else
3114 {
87cf0651 3115 const diagnostic_t kind = value ? DK_ERROR : DK_WARNING;
63bbf46d 3116 const char *arg = NULL;
87cf0651 3117
63bbf46d
JJ
3118 if (cl_options[option_index].flags & CL_JOINED)
3119 arg = new_option + cl_options[option_index].opt_len;
3120 control_warning_option (option_index, (int) kind, arg, value,
c5fa0890
JM
3121 loc, lang_mask,
3122 handlers, opts, opts_set, dc);
dc90f45b
MLI
3123 }
3124 free (new_option);
3125}
5f0f4a3b
JM
3126
3127/* Return malloced memory for the name of the option OPTION_INDEX
3128 which enabled a diagnostic (context CONTEXT), originally of type
3129 ORIG_DIAG_KIND but possibly converted to DIAG_KIND by options such
3130 as -Werror. */
3131
3132char *
3133option_name (diagnostic_context *context, int option_index,
3134 diagnostic_t orig_diag_kind, diagnostic_t diag_kind)
3135{
3136 if (option_index)
3137 {
3138 /* A warning classified as an error. */
3139 if ((orig_diag_kind == DK_WARNING || orig_diag_kind == DK_PEDWARN)
3140 && diag_kind == DK_ERROR)
3141 return concat (cl_options[OPT_Werror_].opt_text,
3142 /* Skip over "-W". */
3143 cl_options[option_index].opt_text + 2,
3144 NULL);
3145 /* A warning with option. */
3146 else
3147 return xstrdup (cl_options[option_index].opt_text);
3148 }
3149 /* A warning without option classified as an error. */
9f8da907
RS
3150 else if ((orig_diag_kind == DK_WARNING || orig_diag_kind == DK_PEDWARN
3151 || diag_kind == DK_WARNING)
3152 && context->warning_as_error_requested)
3153 return xstrdup (cl_options[OPT_Werror].opt_text);
5f0f4a3b
JM
3154 else
3155 return NULL;
3156}