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