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