]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/opts.c
gcc/ada/ChangeLog:
[thirdparty/gcc.git] / gcc / opts.c
1 /* Command line option handling.
2 Copyright (C) 2002-2019 Free Software Foundation, Inc.
3 Contributed by Neil Booth.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
20
21 #include "config.h"
22 #include "system.h"
23 #include "intl.h"
24 #include "coretypes.h"
25 #include "opts.h"
26 #include "tm.h"
27 #include "flags.h"
28 #include "params.h"
29 #include "diagnostic.h"
30 #include "opts-diagnostic.h"
31 #include "insn-attr-common.h"
32 #include "common/common-target.h"
33 #include "spellcheck.h"
34 #include "opt-suggestions.h"
35
36 static void set_Wstrict_aliasing (struct gcc_options *opts, int onoff);
37
38 /* Indexed by enum debug_info_type. */
39 const char *const debug_type_names[] =
40 {
41 "none", "stabs", "dwarf-2", "xcoff", "vms"
42 };
43
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
51 void
52 set_struct_debug_option (struct gcc_options *opts, location_t loc,
53 const char *spec)
54 {
55 /* various labels for comparison */
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";
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
90 error_at (loc,
91 "argument %qs to %<-femit-struct-debug-detailed%> "
92 "not recognized",
93 spec);
94
95 /* Effect the specification. */
96 if (usage == DINFO_USAGE_NUM_ENUMS)
97 {
98 if (ord)
99 {
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;
103 }
104 if (gen)
105 {
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;
109 }
110 }
111 else
112 {
113 if (ord)
114 opts->x_debug_struct_ordinary[usage] = files;
115 if (gen)
116 opts->x_debug_struct_generic[usage] = files;
117 }
118
119 if (*spec == ',')
120 set_struct_debug_option (opts, loc, spec+1);
121 else
122 {
123 /* No more -femit-struct-debug-detailed specifications.
124 Do final checks. */
125 if (*spec != '\0')
126 error_at (loc,
127 "argument %qs to %<-femit-struct-debug-detailed%> unknown",
128 spec);
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])
133 error_at (loc,
134 "%<-femit-struct-debug-detailed=dir:...%> must allow "
135 "at least as much as "
136 "%<-femit-struct-debug-detailed=ind:...%>");
137 }
138 }
139
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
143 up to fource characters. (C++ uses ".cpp".) */
144
145 void
146 strip_off_ending (char *name, int len)
147 {
148 int i;
149 for (i = 2; i < 5 && len > i; i++)
150 {
151 if (name[len - i] == '.')
152 {
153 name[len - i] = '\0';
154 break;
155 }
156 }
157 }
158
159 /* Find the base name of a path, stripping off both directories and
160 a single final extension. */
161 int
162 base_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 {
170 if (IS_DIR_SEPARATOR (c))
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
185 /* What to print when a switch has no documentation. */
186 static const char undocumented_msg[] = N_("This option lacks documentation.");
187 static const char use_diagnosed_msg[] = N_("Uses of this option are diagnosed.");
188
189 typedef char *char_p; /* For DEF_VEC_P. */
190
191 static void handle_param (struct gcc_options *opts,
192 struct gcc_options *opts_set, location_t loc,
193 const char *carg);
194 static void set_debug_level (enum debug_info_type type, int extended,
195 const char *arg, struct gcc_options *opts,
196 struct gcc_options *opts_set,
197 location_t loc);
198 static void set_fast_math_flags (struct gcc_options *opts, int set);
199 static void decode_d_option (const char *arg, struct gcc_options *opts,
200 location_t loc, diagnostic_context *dc);
201 static void set_unsafe_math_optimizations_flags (struct gcc_options *opts,
202 int set);
203 static void enable_warning_as_error (const char *arg, int value,
204 unsigned int lang_mask,
205 const struct cl_option_handlers *handlers,
206 struct gcc_options *opts,
207 struct gcc_options *opts_set,
208 location_t loc,
209 diagnostic_context *dc);
210
211 /* Handle a back-end option; arguments and return value as for
212 handle_option. */
213
214 bool
215 target_handle_option (struct gcc_options *opts,
216 struct gcc_options *opts_set,
217 const struct cl_decoded_option *decoded,
218 unsigned int lang_mask ATTRIBUTE_UNUSED, int kind,
219 location_t loc,
220 const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED,
221 diagnostic_context *dc, void (*) (void))
222 {
223 gcc_assert (dc == global_dc);
224 gcc_assert (kind == DK_UNSPECIFIED);
225 return targetm_common.handle_option (opts, opts_set, decoded, loc);
226 }
227
228 /* Add comma-separated strings to a char_p vector. */
229
230 static void
231 add_comma_separated_to_vector (void **pvec, const char *arg)
232 {
233 char *tmp;
234 char *r;
235 char *w;
236 char *token_start;
237 vec<char_p> *v = (vec<char_p> *) *pvec;
238
239 vec_check_alloc (v, 1);
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;
254 v->safe_push (token_start);
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')
266 v->safe_push (token_start);
267
268 *pvec = v;
269 }
270
271 /* Initialize opts_obstack. */
272
273 void
274 init_opts_obstack (void)
275 {
276 gcc_obstack_init (&opts_obstack);
277 }
278
279 /* Initialize OPTS and OPTS_SET before using them in parsing options. */
280
281 void
282 init_options_struct (struct gcc_options *opts, struct gcc_options *opts_set)
283 {
284 size_t num_params = get_num_compiler_params ();
285
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);
289
290 *opts = global_options_init;
291
292 if (opts_set)
293 memset (opts_set, 0, sizeof (*opts_set));
294
295 opts->x_param_values = XNEWVEC (int, num_params);
296
297 if (opts_set)
298 opts_set->x_param_values = XCNEWVEC (int, num_params);
299
300 init_param_values (opts->x_param_values);
301
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
308 /* Initialize target_flags before default_options_optimization
309 so the latter can modify it. */
310 opts->x_target_flags = targetm_common.default_target_flags;
311
312 /* Some targets have ABI-specified unwind tables. */
313 opts->x_flag_unwind_tables = targetm_common.unwind_tables_default;
314
315 /* Some targets have other target-specific initialization. */
316 targetm_common.option_init_struct (opts);
317 }
318
319 /* Release any allocations owned by OPTS. */
320
321 void
322 finalize_options_struct (struct gcc_options *opts)
323 {
324 XDELETEVEC (opts->x_param_values);
325 }
326
327 /* If indicated by the optimization level LEVEL (-Os if SIZE is set,
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. */
331
332 static void
333 maybe_default_option (struct gcc_options *opts,
334 struct gcc_options *opts_set,
335 const struct default_options *default_opt,
336 int level, bool size, bool fast, bool debug,
337 unsigned int lang_mask,
338 const struct cl_option_handlers *handlers,
339 location_t loc,
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);
349 if (debug)
350 gcc_assert (level == 1);
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:
367 enabled = (level >= 1 && !size && !debug);
368 break;
369
370 case OPT_LEVELS_1_PLUS_NOT_DEBUG:
371 enabled = (level >= 1 && !debug);
372 break;
373
374 case OPT_LEVELS_2_PLUS:
375 enabled = (level >= 2);
376 break;
377
378 case OPT_LEVELS_2_PLUS_SPEED_ONLY:
379 enabled = (level >= 2 && !size && !debug);
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,
406 lang_mask, DK_UNSPECIFIED, loc,
407 handlers, true, dc);
408 else if (default_opt->arg == NULL
409 && !option->cl_reject_negative)
410 handle_generated_option (opts, opts_set, default_opt->opt_index,
411 default_opt->arg, !default_opt->value,
412 lang_mask, DK_UNSPECIFIED, loc,
413 handlers, true, dc);
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
418 OPTS and OPTS_SET, diagnostic context DC, location LOC, with
419 language mask LANG_MASK and option handlers HANDLERS. */
420
421 static void
422 maybe_default_options (struct gcc_options *opts,
423 struct gcc_options *opts_set,
424 const struct default_options *default_opts,
425 int level, bool size, bool fast, bool debug,
426 unsigned int lang_mask,
427 const struct cl_option_handlers *handlers,
428 location_t loc,
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],
435 level, size, fast, debug,
436 lang_mask, handlers, loc, dc);
437 }
438
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. */
443
444 static const struct default_options default_options_table[] =
445 {
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 },
449 { OPT_LEVELS_1_PLUS, OPT_fcprop_registers, NULL, 1 },
450 { OPT_LEVELS_1_PLUS, OPT_fdefer_pop, NULL, 1 },
451 { OPT_LEVELS_1_PLUS, OPT_fforward_propagate, NULL, 1 },
452 { OPT_LEVELS_1_PLUS, OPT_fguess_branch_probability, NULL, 1 },
453 { OPT_LEVELS_1_PLUS, OPT_fipa_profile, NULL, 1 },
454 { OPT_LEVELS_1_PLUS, OPT_fipa_pure_const, NULL, 1 },
455 { OPT_LEVELS_1_PLUS, OPT_fipa_reference, NULL, 1 },
456 { OPT_LEVELS_1_PLUS, OPT_fipa_reference_addressable, NULL, 1 },
457 { OPT_LEVELS_1_PLUS, OPT_fmerge_constants, NULL, 1 },
458 { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
459 { OPT_LEVELS_1_PLUS, OPT_freorder_blocks, NULL, 1 },
460 { OPT_LEVELS_1_PLUS, OPT_fshrink_wrap, NULL, 1 },
461 { OPT_LEVELS_1_PLUS, OPT_fsplit_wide_types, NULL, 1 },
462 { OPT_LEVELS_1_PLUS, OPT_ftree_builtin_call_dce, NULL, 1 },
463 { OPT_LEVELS_1_PLUS, OPT_ftree_ccp, NULL, 1 },
464 { OPT_LEVELS_1_PLUS, OPT_ftree_ch, NULL, 1 },
465 { OPT_LEVELS_1_PLUS, OPT_ftree_coalesce_vars, NULL, 1 },
466 { OPT_LEVELS_1_PLUS, OPT_ftree_copy_prop, NULL, 1 },
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 },
470 { OPT_LEVELS_1_PLUS, OPT_ftree_fre, NULL, 1 },
471 { OPT_LEVELS_1_PLUS, OPT_ftree_sink, NULL, 1 },
472 { OPT_LEVELS_1_PLUS, OPT_ftree_slsr, NULL, 1 },
473 { OPT_LEVELS_1_PLUS, OPT_ftree_ter, NULL, 1 },
474
475 /* -O1 (and not -Og) optimizations. */
476 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fbranch_count_reg, NULL, 1 },
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 },
483 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fmove_loop_invariants, NULL, 1 },
484 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fssa_phiopt, NULL, 1 },
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 },
488
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 },
492 { OPT_LEVELS_2_PLUS, OPT_fcrossjumping, NULL, 1 },
493 { OPT_LEVELS_2_PLUS, OPT_fcse_follow_jumps, NULL, 1 },
494 { OPT_LEVELS_2_PLUS, OPT_fdevirtualize, NULL, 1 },
495 { OPT_LEVELS_2_PLUS, OPT_fdevirtualize_speculatively, NULL, 1 },
496 { OPT_LEVELS_2_PLUS, OPT_fexpensive_optimizations, NULL, 1 },
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 },
511 { OPT_LEVELS_2_PLUS, OPT_fpeephole2, NULL, 1 },
512 { OPT_LEVELS_2_PLUS, OPT_freorder_functions, NULL, 1 },
513 { OPT_LEVELS_2_PLUS, OPT_frerun_cse_after_loop, NULL, 1 },
514 #ifdef INSN_SCHEDULING
515 { OPT_LEVELS_2_PLUS, OPT_fschedule_insns2, NULL, 1 },
516 #endif
517 { OPT_LEVELS_2_PLUS, OPT_fstrict_aliasing, NULL, 1 },
518 { OPT_LEVELS_2_PLUS, OPT_fstore_merging, NULL, 1 },
519 { OPT_LEVELS_2_PLUS, OPT_fthread_jumps, NULL, 1 },
520 { OPT_LEVELS_2_PLUS, OPT_ftree_pre, NULL, 1 },
521 { OPT_LEVELS_2_PLUS, OPT_ftree_switch_conversion, NULL, 1 },
522 { OPT_LEVELS_2_PLUS, OPT_ftree_tail_merge, NULL, 1 },
523 { OPT_LEVELS_2_PLUS, OPT_ftree_vrp, NULL, 1 },
524 { OPT_LEVELS_2_PLUS, OPT_fvect_cost_model_, NULL, VECT_COST_MODEL_CHEAP },
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 },
531 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_foptimize_strlen, NULL, 1 },
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
538
539 /* -O3 and -Os optimizations. */
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 },
543
544 /* -O3 optimizations. */
545 { OPT_LEVELS_3_PLUS, OPT_fgcse_after_reload, NULL, 1 },
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 },
555 { OPT_LEVELS_3_PLUS, OPT_ftree_loop_vectorize, NULL, 1 },
556 { OPT_LEVELS_3_PLUS, OPT_ftree_partial_pre, NULL, 1 },
557 { OPT_LEVELS_3_PLUS, OPT_ftree_slp_vectorize, NULL, 1 },
558 { OPT_LEVELS_3_PLUS, OPT_funswitch_loops, NULL, 1 },
559 { OPT_LEVELS_3_PLUS, OPT_fvect_cost_model_, NULL, VECT_COST_MODEL_DYNAMIC },
560 { OPT_LEVELS_3_PLUS, OPT_fversion_loops_for_strides, NULL, 1 },
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
568 /* Default the options in OPTS and OPTS_SET based on the optimization
569 settings in DECODED_OPTIONS and DECODED_OPTIONS_COUNT. */
570 void
571 default_options_optimization (struct gcc_options *opts,
572 struct gcc_options *opts_set,
573 struct cl_decoded_option *decoded_options,
574 unsigned int decoded_options_count,
575 location_t loc,
576 unsigned int lang_mask,
577 const struct cl_option_handlers *handlers,
578 diagnostic_context *dc)
579 {
580 unsigned int i;
581 int opt2;
582 bool openacc_mode = false;
583
584 /* Scan to see what optimization level has been specified. That will
585 determine the default value of many flags. */
586 for (i = 1; i < decoded_options_count; i++)
587 {
588 struct cl_decoded_option *opt = &decoded_options[i];
589 switch (opt->opt_index)
590 {
591 case OPT_O:
592 if (*opt->arg == '\0')
593 {
594 opts->x_optimize = 1;
595 opts->x_optimize_size = 0;
596 opts->x_optimize_fast = 0;
597 opts->x_optimize_debug = 0;
598 }
599 else
600 {
601 const int optimize_val = integral_argument (opt->arg);
602 if (optimize_val == -1)
603 error_at (loc, "argument to %<-O%> should be a non-negative "
604 "integer, %<g%>, %<s%> or %<fast%>");
605 else
606 {
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;
611 opts->x_optimize_fast = 0;
612 opts->x_optimize_debug = 0;
613 }
614 }
615 break;
616
617 case OPT_Os:
618 opts->x_optimize_size = 1;
619
620 /* Optimizing for size forces optimize to be 2. */
621 opts->x_optimize = 2;
622 opts->x_optimize_fast = 0;
623 opts->x_optimize_debug = 0;
624 break;
625
626 case OPT_Ofast:
627 /* -Ofast only adds flags to -O3. */
628 opts->x_optimize_size = 0;
629 opts->x_optimize = 3;
630 opts->x_optimize_fast = 1;
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;
640 break;
641
642 case OPT_fopenacc:
643 if (opt->value)
644 openacc_mode = true;
645 break;
646
647 default:
648 /* Ignore other options in this prescan. */
649 break;
650 }
651 }
652
653 maybe_default_options (opts, opts_set, default_options_table,
654 opts->x_optimize, opts->x_optimize_size,
655 opts->x_optimize_fast, opts->x_optimize_debug,
656 lang_mask, handlers, loc, dc);
657
658 /* -O2 param settings. */
659 opt2 = (opts->x_optimize >= 2);
660
661 if (openacc_mode
662 && !opts_set->x_flag_ipa_pta)
663 opts->x_flag_ipa_pta = true;
664
665 /* Track fields in field-sensitive alias analysis. */
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);
670
671 /* For -O1 only do loop invariant motion for very small loops. */
672 maybe_set_param_value
673 (PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP,
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,
684 opts->x_param_values, opts_set->x_param_values);
685
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
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);
697 else
698 maybe_set_param_value (PARAM_MIN_CROSSJUMP_INSNS,
699 default_param_value (PARAM_MIN_CROSSJUMP_INSNS),
700 opts->x_param_values, opts_set->x_param_values);
701
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
708 /* Allow default optimizations to be specified on a per-machine basis. */
709 maybe_default_options (opts, opts_set,
710 targetm_common.option_optimization_table,
711 opts->x_optimize, opts->x_optimize_size,
712 opts->x_optimize_fast, opts->x_optimize_debug,
713 lang_mask, handlers, loc, dc);
714 }
715
716 /* Control IPA optimizations based on different live patching LEVEL. */
717 static void
718 control_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
858 /* --help option argument if set. */
859 const char *help_option_argument = NULL;
860
861
862 /* After all options at LOC have been read into OPTS and OPTS_SET,
863 finalize settings of those options and diagnose incompatible
864 combinations. */
865 void
866 finish_options (struct gcc_options *opts, struct gcc_options *opts_set,
867 location_t loc)
868 {
869 enum unwind_info_type ui_except;
870
871 if (opts->x_dump_base_name
872 && ! opts->x_dump_base_name_prefixed)
873 {
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. */
885 opts->x_dump_base_name = opts_concat (opts->x_dump_dir_name,
886 opts->x_dump_base_name, NULL);
887 else if (opts->x_aux_base_name
888 && strcmp (opts->x_aux_base_name, HOST_BIT_BUCKET) != 0)
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. */
893 {
894 const char *aux_base;
895
896 base_of_path (opts->x_aux_base_name, &aux_base);
897 if (opts->x_aux_base_name != aux_base)
898 {
899 int dir_len = aux_base - opts->x_aux_base_name;
900 char *new_dump_base_name
901 = XOBNEWVEC (&opts_obstack, char,
902 strlen (opts->x_dump_base_name) + dir_len + 1);
903
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;
909 }
910 }
911
912 /* It is definitely prefixed now. */
913 opts->x_dump_base_name_prefixed = true;
914 }
915
916 /* Handle related options for unit-at-a-time, toplevel-reorder, and
917 section-anchors. */
918 if (!opts->x_flag_unit_at_a_time)
919 {
920 if (opts->x_flag_section_anchors && opts_set->x_flag_section_anchors)
921 error_at (loc, "section anchors must be disabled when unit-at-a-time "
922 "is disabled");
923 opts->x_flag_section_anchors = 0;
924 if (opts->x_flag_toplevel_reorder == 1)
925 error_at (loc, "toplevel reorder must be disabled when unit-at-a-time "
926 "is disabled");
927 opts->x_flag_toplevel_reorder = 0;
928 }
929
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
938 if (opts->x_flag_tm && opts->x_flag_non_call_exceptions)
939 sorry ("transactional memory is not supported with non-call exceptions");
940
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. */
944 if (!opts->x_optimize
945 && opts->x_flag_toplevel_reorder == 2
946 && !(opts->x_flag_section_anchors && opts_set->x_flag_section_anchors))
947 {
948 opts->x_flag_toplevel_reorder = 0;
949 opts->x_flag_section_anchors = 0;
950 }
951 if (!opts->x_flag_toplevel_reorder)
952 {
953 if (opts->x_flag_section_anchors && opts_set->x_flag_section_anchors)
954 error_at (loc, "section anchors must be disabled when toplevel reorder"
955 " is disabled");
956 opts->x_flag_section_anchors = 0;
957 }
958
959 if (!opts->x_flag_opts_finished)
960 {
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 {
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)
968 opts->x_flag_pie = DEFAULT_FLAG_PIE;
969 else
970 opts->x_flag_pie = 0;
971 }
972 /* If -fPIE or -fpie is used, turn on PIC. */
973 if (opts->x_flag_pie)
974 opts->x_flag_pic = opts->x_flag_pie;
975 else if (opts->x_flag_pic == -1)
976 opts->x_flag_pic = 0;
977 if (opts->x_flag_pic && !opts->x_flag_pie)
978 opts->x_flag_shlib = 1;
979 opts->x_flag_opts_finished = true;
980 }
981
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
987 if (opts->x_optimize == 0)
988 {
989 /* Inlining does not work if not optimizing,
990 so force it not to be done. */
991 opts->x_warn_inline = 0;
992 opts->x_flag_no_inline = 1;
993 }
994
995 /* The optimization to partition hot and cold basic blocks into separate
996 sections of the .o and executable files does not work (currently)
997 with exception handling. This is because there is no support for
998 generating unwind info. If opts->x_flag_exceptions is turned on
999 we need to turn off the partitioning optimization. */
1000
1001 ui_except = targetm_common.except_unwind_info (opts);
1002
1003 if (opts->x_flag_exceptions
1004 && opts->x_flag_reorder_blocks_and_partition
1005 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))
1006 {
1007 if (opts_set->x_flag_reorder_blocks_and_partition)
1008 inform (loc,
1009 "%<-freorder-blocks-and-partition%> does not work "
1010 "with exceptions on this architecture");
1011 opts->x_flag_reorder_blocks_and_partition = 0;
1012 opts->x_flag_reorder_blocks = 1;
1013 }
1014
1015 /* If user requested unwind info, then turn off the partitioning
1016 optimization. */
1017
1018 if (opts->x_flag_unwind_tables
1019 && !targetm_common.unwind_tables_default
1020 && opts->x_flag_reorder_blocks_and_partition
1021 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))
1022 {
1023 if (opts_set->x_flag_reorder_blocks_and_partition)
1024 inform (loc,
1025 "%<-freorder-blocks-and-partition%> does not support "
1026 "unwind info on this architecture");
1027 opts->x_flag_reorder_blocks_and_partition = 0;
1028 opts->x_flag_reorder_blocks = 1;
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
1035 if (opts->x_flag_reorder_blocks_and_partition
1036 && (!targetm_common.have_named_sections
1037 || (opts->x_flag_unwind_tables
1038 && targetm_common.unwind_tables_default
1039 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))))
1040 {
1041 if (opts_set->x_flag_reorder_blocks_and_partition)
1042 inform (loc,
1043 "%<-freorder-blocks-and-partition%> does not work "
1044 "on this architecture");
1045 opts->x_flag_reorder_blocks_and_partition = 0;
1046 opts->x_flag_reorder_blocks = 1;
1047 }
1048
1049
1050 /* Pipelining of outer loops is only possible when general pipelining
1051 capabilities are requested. */
1052 if (!opts->x_flag_sel_sched_pipelining)
1053 opts->x_flag_sel_sched_pipelining_outer_loops = 0;
1054
1055 if (opts->x_flag_conserve_stack)
1056 {
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);
1061 }
1062
1063 if (opts->x_flag_lto)
1064 {
1065 #ifdef ENABLE_LTO
1066 opts->x_flag_generate_lto = 1;
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. */
1071 opts->x_flag_whole_program = 0;
1072 #else
1073 error_at (loc, "LTO support has not been enabled in this configuration");
1074 #endif
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)))
1079 {
1080 if (opts_set->x_flag_fat_lto_objects)
1081 error_at (loc, "%<-fno-fat-lto-objects%> are supported only with "
1082 "linker plugin");
1083 opts->x_flag_fat_lto_objects = 1;
1084 }
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 }
1093 }
1094
1095 /* We initialize opts->x_flag_split_stack to -1 so that targets can set a
1096 default value if they choose based on other options. */
1097 if (opts->x_flag_split_stack == -1)
1098 opts->x_flag_split_stack = 0;
1099 else if (opts->x_flag_split_stack)
1100 {
1101 if (!targetm_common.supports_split_stack (true, opts))
1102 {
1103 error_at (loc, "%<-fsplit-stack%> is not supported by "
1104 "this compiler configuration");
1105 opts->x_flag_split_stack = 0;
1106 }
1107 }
1108
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
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
1134 /* Set PARAM_MAX_STORES_TO_SINK to 0 if either vectorization or if-conversion
1135 is disabled. */
1136 if ((!opts->x_flag_tree_loop_vectorize && !opts->x_flag_tree_slp_vectorize)
1137 || !opts->x_flag_tree_loop_if_convert)
1138 maybe_set_param_value (PARAM_MAX_STORES_TO_SINK, 0,
1139 opts->x_param_values, opts_set->x_param_values);
1140
1141 /* The -gsplit-dwarf option requires -ggnu-pubnames. */
1142 if (opts->x_dwarf_split_debug_info)
1143 opts->x_debug_generate_pub_sections = 2;
1144
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
1158 /* Userspace and kernel ASan conflict with each other. */
1159 if ((opts->x_flag_sanitize & SANITIZE_USER_ADDRESS)
1160 && (opts->x_flag_sanitize & SANITIZE_KERNEL_ADDRESS))
1161 error_at (loc,
1162 "%<-fsanitize=address%> is incompatible with "
1163 "%<-fsanitize=kernel-address%>");
1164
1165 /* And with TSan. */
1166 if ((opts->x_flag_sanitize & SANITIZE_ADDRESS)
1167 && (opts->x_flag_sanitize & SANITIZE_THREAD))
1168 error_at (loc,
1169 "%<-fsanitize=address%> and %<-fsanitize=kernel-address%> "
1170 "are incompatible with %<-fsanitize=thread%>");
1171
1172 if ((opts->x_flag_sanitize & SANITIZE_LEAK)
1173 && (opts->x_flag_sanitize & SANITIZE_THREAD))
1174 error_at (loc,
1175 "%<-fsanitize=leak%> is incompatible with %<-fsanitize=thread%>");
1176
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)
1181 error_at (loc, "%<-fsanitize-recover=%s%> is not supported",
1182 sanitizer_opts[i].name);
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. */
1191 if (opts->x_flag_sanitize & ~(SANITIZE_LEAK | SANITIZE_UNREACHABLE))
1192 opts->x_flag_aggressive_loop_optimizations = 0;
1193
1194 /* Enable -fsanitize-address-use-after-scope if address sanitizer is
1195 enabled. */
1196 if ((opts->x_flag_sanitize & SANITIZE_USER_ADDRESS)
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,
1207 "%<-fsanitize-address-use-after-scope%> requires "
1208 "%<-fstack-reuse=none%> option");
1209
1210 opts->x_flag_stack_reuse = SR_NONE;
1211 }
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%>");
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 }
1231 }
1232
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. */
1237 static void
1238 wrap_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
1272 printf (" %-*.*s %.*s\n", col_width, item_width, item, len, help);
1273 item_width = 0;
1274 while (help[len] == ' ')
1275 len++;
1276 help += len;
1277 remaining -= len;
1278 }
1279 while (remaining);
1280 }
1281
1282 /* Data structure used to print list of valid option values. */
1283
1284 struct 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
1297 /* Print help for a specific front-end, etc. */
1298 static void
1299 print_filtered_help (unsigned int include_flags,
1300 unsigned int exclude_flags,
1301 unsigned int any_flags,
1302 unsigned int columns,
1303 struct gcc_options *opts,
1304 unsigned int lang_mask)
1305 {
1306 unsigned int i;
1307 const char *help;
1308 bool found = false;
1309 bool displayed = false;
1310 char new_help[256];
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
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 }
1338 wrap_help (help, param, strlen (param), columns);
1339 }
1340 putchar ('\n');
1341 return;
1342 }
1343
1344 if (!opts->x_help_printed)
1345 opts->x_help_printed = XCNEWVAR (char, cl_options_count);
1346
1347 if (!opts->x_help_enum_printed)
1348 opts->x_help_enum_printed = XCNEWVAR (char, cl_enums_count);
1349
1350 auto_vec<option_help_tuple> help_tuples;
1351
1352 for (i = 0; i < cl_options_count; i++)
1353 {
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
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
1376 found = true;
1377 /* Skip switches that have already been printed. */
1378 if (opts->x_help_printed[i])
1379 continue;
1380
1381 opts->x_help_printed[i] = true;
1382
1383 help = option->help;
1384 if (help == NULL)
1385 {
1386 if (exclude_flags & CL_UNDOCUMENTED)
1387 continue;
1388
1389 help = undocumented_msg;
1390 }
1391
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
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. */
1450 if (!opts->x_quiet_flag)
1451 {
1452 void *flag_var = option_flag_var (i, opts);
1453
1454 if (len < (LEFT_COLUMN + 2))
1455 strcpy (new_help, "\t\t");
1456 else
1457 strcpy (new_help, "\t");
1458
1459 if (flag_var != NULL
1460 && option->var_type != CLVC_DEFER)
1461 {
1462 if (option->flags & CL_JOINED)
1463 {
1464 if (option->var_type == CLVC_STRING)
1465 {
1466 if (* (const char **) flag_var != NULL)
1467 snprintf (new_help + strlen (new_help),
1468 sizeof (new_help) - strlen (new_help),
1469 "%s", * (const char **) flag_var);
1470 }
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),
1483 "%s", arg);
1484 }
1485 else
1486 sprintf (new_help + strlen (new_help),
1487 "%d", * (int *) flag_var);
1488 }
1489 else
1490 strcat (new_help, option_enabled (i, opts)
1491 ? _("[enabled]") : _("[disabled]"));
1492 }
1493
1494 help = new_help;
1495 }
1496
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
1506 wrap_help (help, opt, len, columns);
1507 displayed = true;
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;
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 }
1519 }
1520
1521 if (! found)
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)
1535 printf (_(" None found. Use --help=%s to show *all* the options supported by the %s front-end.\n"),
1536 lang_names[i], lang_names[i]);
1537 }
1538
1539 }
1540 else if (! displayed)
1541 printf (_(" All options with the desired characteristics have already been displayed\n"));
1542
1543 putchar ('\n');
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 }
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;
1586 printf (_(" Known valid arguments for %s option:\n "),
1587 option->opt_text);
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 }
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
1597 and NONE of the EXCLUDE_FLAGS set. The current option state is in
1598 OPTS; LANG_MASK is used for interpreting enumerated option state. */
1599 static void
1600 print_specific_help (unsigned int include_flags,
1601 unsigned int exclude_flags,
1602 unsigned int any_flags,
1603 struct gcc_options *opts,
1604 unsigned int lang_mask)
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;
1611
1612 /* Sanity check: Make sure that we do not have more
1613 languages than we have bits available to enumerate them. */
1614 gcc_assert ((1U << cl_lang_count) <= CL_MIN_OPTION_CLASS);
1615
1616 /* If we have not done so already, obtain
1617 the desired maximum width of the output. */
1618 if (opts->x_help_columns == 0)
1619 {
1620 opts->x_help_columns = get_terminal_width ();
1621 if (opts->x_help_columns == INT_MAX)
1622 /* Use a reasonable default. */
1623 opts->x_help_columns = 80;
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:
1632 case CL_DRIVER:
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;
1653 if (exclude_flags & all_langs_mask)
1654 description = _("The following options are specific to just the language ");
1655 else
1656 description = _("The following options are supported by the language ");
1657 descrip_extra = lang_names [i];
1658 break;
1659 }
1660 }
1661
1662 if (description == NULL)
1663 {
1664 if (any_flags == 0)
1665 {
1666 if (include_flags & CL_UNDOCUMENTED)
1667 description = _("The following options are not documented");
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");
1672 else
1673 {
1674 internal_error ("unrecognized %<include_flags 0x%x%> passed "
1675 "to %<print_specific_help%>",
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);
1690 print_filtered_help (include_flags, exclude_flags, any_flags,
1691 opts->x_help_columns, opts, lang_mask);
1692 }
1693
1694 /* Enable FDO-related flags. */
1695
1696 static void
1697 enable_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;
1720 if (!opts_set->x_flag_ipa_bit_cp
1721 && value && opts->x_flag_ipa_cp)
1722 opts->x_flag_ipa_bit_cp = value;
1723 if (!opts_set->x_flag_predictive_commoning)
1724 opts->x_flag_predictive_commoning = value;
1725 if (!opts_set->x_flag_split_loops)
1726 opts->x_flag_split_loops = value;
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;
1731 if (!opts_set->x_flag_tree_loop_vectorize)
1732 opts->x_flag_tree_loop_vectorize = value;
1733 if (!opts_set->x_flag_tree_slp_vectorize)
1734 opts->x_flag_tree_slp_vectorize = value;
1735 if (!opts_set->x_flag_version_loops_for_strides)
1736 opts->x_flag_version_loops_for_strides = value;
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;
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;
1747 }
1748
1749 /* -f{,no-}sanitize{,-recover}= suboptions. */
1750 const struct sanitizer_opts_s sanitizer_opts[] =
1751 {
1752 #define SANITIZER_OPT(name, flags, recover) \
1753 { #name, flags, sizeof #name - 1, recover }
1754 SANITIZER_OPT (address, (SANITIZE_ADDRESS | SANITIZE_USER_ADDRESS), true),
1755 SANITIZER_OPT (kernel-address, (SANITIZE_ADDRESS | SANITIZE_KERNEL_ADDRESS),
1756 true),
1757 SANITIZER_OPT (pointer-compare, SANITIZE_POINTER_COMPARE, true),
1758 SANITIZER_OPT (pointer-subtract, SANITIZE_POINTER_SUBTRACT, true),
1759 SANITIZER_OPT (thread, SANITIZE_THREAD, false),
1760 SANITIZER_OPT (leak, SANITIZE_LEAK, false),
1761 SANITIZER_OPT (shift, SANITIZE_SHIFT, true),
1762 SANITIZER_OPT (shift-base, SANITIZE_SHIFT_BASE, true),
1763 SANITIZER_OPT (shift-exponent, SANITIZE_SHIFT_EXPONENT, true),
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),
1783 SANITIZER_OPT (pointer-overflow, SANITIZE_POINTER_OVERFLOW, true),
1784 SANITIZER_OPT (builtin, SANITIZE_BUILTIN, true),
1785 SANITIZER_OPT (all, ~0U, true),
1786 #undef SANITIZER_OPT
1787 { NULL, 0U, 0UL, false }
1788 };
1789
1790 /* -f{,no-}sanitize-coverage= suboptions. */
1791 const 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
1801 /* A struct for describing a run of chars within a string. */
1802
1803 struct 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
1815 template <>
1816 struct 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.
1831 OPTS is array of candidate sanitizer options.
1832 CODE is OPT_fsanitize_, OPT_fsanitize_recover_ or
1833 OPT_fsanitize_coverage_.
1834 VALUE is non-zero for the regular form of the option, zero
1835 for the "no-" form (e.g. "-fno-sanitize-recover="). */
1836
1837 static const char *
1838 get_closest_sanitizer_option (const string_fragment &arg,
1839 const struct sanitizer_opts_s *opts,
1840 enum opt_code code, int value)
1841 {
1842 best_match <const string_fragment &, const char*> bm (arg);
1843 for (int i = 0; opts[i].name != NULL; ++i)
1844 {
1845 /* -fsanitize=all is not valid, so don't offer it. */
1846 if (code == OPT_fsanitize_
1847 && opts[i].flag == ~0U
1848 && value)
1849 continue;
1850
1851 /* For -fsanitize-recover= (and not -fno-sanitize-recover=),
1852 don't offer the non-recoverable options. */
1853 if (code == OPT_fsanitize_recover_
1854 && !opts[i].can_recover
1855 && value)
1856 continue;
1857
1858 bm.consider (opts[i].name);
1859 }
1860 return bm.get_best_meaningful_candidate ();
1861 }
1862
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
1867 unsigned int
1868 parse_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;
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
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. */
1896 for (i = 0; opts[i].name != NULL; ++i)
1897 if (len == opts[i].len && memcmp (p, opts[i].name, len) == 0)
1898 {
1899 /* Handle both -fsanitize and -fno-sanitize cases. */
1900 if (value && opts[i].flag == ~0U)
1901 {
1902 if (code == OPT_fsanitize_)
1903 {
1904 if (complain)
1905 error_at (loc, "%<-fsanitize=all%> option is not valid");
1906 }
1907 else
1908 flags |= ~(SANITIZE_THREAD | SANITIZE_LEAK
1909 | SANITIZE_UNREACHABLE | SANITIZE_RETURN);
1910 }
1911 else if (value)
1912 {
1913 /* Do not enable -fsanitize-recover=unreachable and
1914 -fsanitize-recover=return if -fsanitize-recover=undefined
1915 is selected. */
1916 if (code == OPT_fsanitize_recover_
1917 && opts[i].flag == SANITIZE_UNDEFINED)
1918 flags |= (SANITIZE_UNDEFINED
1919 & ~(SANITIZE_UNREACHABLE | SANITIZE_RETURN));
1920 else
1921 flags |= opts[i].flag;
1922 }
1923 else
1924 flags &= ~opts[i].flag;
1925 found = true;
1926 break;
1927 }
1928
1929 if (! found && complain)
1930 {
1931 const char *hint
1932 = get_closest_sanitizer_option (string_fragment (p, len),
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 = "";
1942
1943 if (hint)
1944 error_at (loc,
1945 "unrecognized argument to %<-f%ssanitize%s=%> "
1946 "option: %q.*s; did you mean %qs?",
1947 value ? "" : "no-",
1948 suffix, (int) len, p, hint);
1949 else
1950 error_at (loc,
1951 "unrecognized argument to %<-f%ssanitize%s=%> option: "
1952 "%q.*s", value ? "" : "no-",
1953 suffix, (int) len, p);
1954 }
1955
1956 if (comma == NULL)
1957 break;
1958 p = comma + 1;
1959 }
1960 return flags;
1961 }
1962
1963 /* Parse string values of no_sanitize attribute passed in VALUE.
1964 Values are separated with comma. */
1965
1966 unsigned int
1967 parse_no_sanitize_attribute (char *value)
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)
1985 warning (OPT_Wattributes,
1986 "%qs attribute directive ignored", q);
1987
1988 q = strtok (NULL, ",");
1989 }
1990
1991 return flags;
1992 }
1993
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
1998 bool
1999 parse_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
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
2055 static void
2056 check_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
2062 /* Print help when OPT__help_ is set. */
2063
2064 void
2065 print_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,
2169 "%<--help%> argument %q.*s is ambiguous, "
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,
2178 "unrecognized argument to %<--help=%> option: %q.*s",
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
2191 /* Handle target- and language-independent options. Return zero to
2192 generate an "unknown option" message. Only options that need
2193 extra handling need to be listed here; if you simply want
2194 DECODED->value assigned to a variable, it happens automatically. */
2195
2196 bool
2197 common_handle_option (struct gcc_options *opts,
2198 struct gcc_options *opts_set,
2199 const struct cl_decoded_option *decoded,
2200 unsigned int lang_mask, int kind ATTRIBUTE_UNUSED,
2201 location_t loc,
2202 const struct cl_option_handlers *handlers,
2203 diagnostic_context *dc,
2204 void (*target_option_override_hook) (void))
2205 {
2206 size_t scode = decoded->opt_index;
2207 const char *arg = decoded->arg;
2208 HOST_WIDE_INT value = decoded->value;
2209 enum opt_code code = (enum opt_code) scode;
2210
2211 gcc_assert (decoded->canonical_option_num_elements <= 2);
2212
2213 switch (code)
2214 {
2215 case OPT__param:
2216 handle_param (opts, opts_set, loc, arg);
2217 break;
2218
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
2225 if (lang_mask == CL_DRIVER)
2226 break;
2227
2228 undoc_mask = ((opts->x_verbose_flag | opts->x_extra_warnings)
2229 ? 0
2230 : CL_UNDOCUMENTED);
2231 target_option_override_hook ();
2232 /* First display any single language specific options. */
2233 for (i = 0; i < cl_lang_count; i++)
2234 print_specific_help
2235 (1U << i, (all_langs_mask & (~ (1U << i))) | undoc_mask, 0, opts,
2236 lang_mask);
2237 /* Next display any multi language specific options. */
2238 print_specific_help (0, undoc_mask, all_langs_mask, opts, lang_mask);
2239 /* Then display any remaining, non-language options. */
2240 for (i = CL_MIN_OPTION_CLASS; i <= CL_MAX_OPTION_CLASS; i <<= 1)
2241 if (i != CL_DRIVER)
2242 print_specific_help (i, undoc_mask, 0, opts, lang_mask);
2243 opts->x_exit_after_options = true;
2244 break;
2245 }
2246
2247 case OPT__target_help:
2248 if (lang_mask == CL_DRIVER)
2249 break;
2250
2251 target_option_override_hook ();
2252 print_specific_help (CL_TARGET, CL_UNDOCUMENTED, 0, opts, lang_mask);
2253 opts->x_exit_after_options = true;
2254 break;
2255
2256 case OPT__help_:
2257 {
2258 help_option_argument = arg;
2259 opts->x_exit_after_options = true;
2260 break;
2261 }
2262
2263 case OPT__version:
2264 if (lang_mask == CL_DRIVER)
2265 break;
2266
2267 opts->x_exit_after_options = true;
2268 break;
2269
2270 case OPT__completion_:
2271 break;
2272
2273 case OPT_fsanitize_:
2274 opts->x_flag_sanitize
2275 = parse_sanitizer_options (arg, loc, code,
2276 opts->x_flag_sanitize, value, true);
2277
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);
2289 maybe_set_param_value (PARAM_ASAN_PROTECT_ALLOCAS, 0,
2290 opts->x_param_values,
2291 opts_set->x_param_values);
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;
2297
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;
2303
2304 case OPT_fasan_shadow_offset_:
2305 /* Deferred. */
2306 break;
2307
2308 case OPT_fsanitize_address_use_after_scope:
2309 opts->x_flag_sanitize_address_use_after_scope = value;
2310 break;
2311
2312 case OPT_fsanitize_recover:
2313 if (value)
2314 opts->x_flag_sanitize_recover
2315 |= (SANITIZE_UNDEFINED | SANITIZE_UNDEFINED_NONDEFAULT)
2316 & ~(SANITIZE_UNREACHABLE | SANITIZE_RETURN);
2317 else
2318 opts->x_flag_sanitize_recover
2319 &= ~(SANITIZE_UNDEFINED | SANITIZE_UNDEFINED_NONDEFAULT);
2320 break;
2321
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
2328 case OPT_O:
2329 case OPT_Os:
2330 case OPT_Ofast:
2331 case OPT_Og:
2332 /* Currently handled in a prescan. */
2333 break;
2334
2335 case OPT_Werror:
2336 dc->warning_as_error_requested = value;
2337 break;
2338
2339 case OPT_Werror_:
2340 if (lang_mask == CL_DRIVER)
2341 break;
2342
2343 enable_warning_as_error (arg, value, lang_mask, handlers,
2344 opts, opts_set, loc, dc);
2345 break;
2346
2347 case OPT_Wfatal_errors:
2348 dc->fatal_errors = value;
2349 break;
2350
2351 case OPT_Wstack_usage_:
2352 opts->x_flag_stack_usage_info = value != -1;
2353 break;
2354
2355 case OPT_Wstrict_aliasing:
2356 set_Wstrict_aliasing (opts, value);
2357 break;
2358
2359 case OPT_Wstrict_overflow:
2360 opts->x_warn_strict_overflow = (value
2361 ? (int) WARN_STRICT_OVERFLOW_CONDITIONAL
2362 : 0);
2363 break;
2364
2365 case OPT_Wsystem_headers:
2366 dc->dc_warn_system_headers = value;
2367 break;
2368
2369 case OPT_aux_info:
2370 opts->x_flag_gen_aux_info = 1;
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])
2378 opts->x_aux_base_name = tmp;
2379 else
2380 free (tmp);
2381 }
2382 break;
2383
2384 case OPT_d:
2385 decode_d_option (arg, opts, loc, dc);
2386 break;
2387
2388 case OPT_fcall_used_:
2389 case OPT_fcall_saved_:
2390 /* Deferred. */
2391 break;
2392
2393 case OPT_fdbg_cnt_:
2394 /* Deferred. */
2395 break;
2396
2397 case OPT_fdbg_cnt_list:
2398 /* Deferred. */
2399 opts->x_exit_after_options = true;
2400 break;
2401
2402 case OPT_fdebug_prefix_map_:
2403 case OPT_ffile_prefix_map_:
2404 /* Deferred. */
2405 break;
2406
2407 case OPT_fdiagnostics_show_location_:
2408 diagnostic_prefixing_rule (dc) = (diagnostic_prefixing_rule_t) value;
2409 break;
2410
2411 case OPT_fdiagnostics_show_caret:
2412 dc->show_caret = value;
2413 break;
2414
2415 case OPT_fdiagnostics_show_labels:
2416 dc->show_labels_p = value;
2417 break;
2418
2419 case OPT_fdiagnostics_show_line_numbers:
2420 dc->show_line_numbers_p = value;
2421 break;
2422
2423 case OPT_fdiagnostics_color_:
2424 diagnostic_color_init (dc, value);
2425 break;
2426
2427 case OPT_fdiagnostics_format_:
2428 diagnostic_output_format_init (dc,
2429 (enum diagnostics_output_format)value);
2430 break;
2431
2432 case OPT_fdiagnostics_parseable_fixits:
2433 dc->parseable_fixits_p = value;
2434 break;
2435
2436 case OPT_fdiagnostics_show_option:
2437 dc->show_option_requested = value;
2438 break;
2439
2440 case OPT_fdiagnostics_minimum_margin_width_:
2441 dc->min_margin_width = value;
2442 break;
2443
2444 case OPT_fdump_:
2445 /* Deferred. */
2446 break;
2447
2448 case OPT_ffast_math:
2449 set_fast_math_flags (opts, value);
2450 break;
2451
2452 case OPT_funsafe_math_optimizations:
2453 set_unsafe_math_optimizations_flags (opts, value);
2454 break;
2455
2456 case OPT_ffixed_:
2457 /* Deferred. */
2458 break;
2459
2460 case OPT_finline_limit_:
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);
2465 break;
2466
2467 case OPT_finstrument_functions_exclude_function_list_:
2468 add_comma_separated_to_vector
2469 (&opts->x_flag_instrument_functions_exclude_functions, arg);
2470 break;
2471
2472 case OPT_finstrument_functions_exclude_file_list_:
2473 add_comma_separated_to_vector
2474 (&opts->x_flag_instrument_functions_exclude_files, arg);
2475 break;
2476
2477 case OPT_fmessage_length_:
2478 pp_set_line_maximum_length (dc->printer, value);
2479 diagnostic_set_caret_max_width (dc, value);
2480 break;
2481
2482 case OPT_fopt_info:
2483 case OPT_fopt_info_:
2484 /* Deferred. */
2485 break;
2486
2487 case OPT_foffload_:
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 }
2517
2518 #ifndef ACCEL_COMPILER
2519 case OPT_foffload_abi_:
2520 error_at (loc, "%<-foffload-abi%> option can be specified only for "
2521 "offload compiler");
2522 break;
2523 #endif
2524
2525 case OPT_fpack_struct_:
2526 if (value <= 0 || (value & (value - 1)) || value > 16)
2527 error_at (loc,
2528 "structure alignment must be a small power of two, not %wu",
2529 value);
2530 else
2531 opts->x_initial_max_fld_align = value;
2532 break;
2533
2534 case OPT_fplugin_:
2535 case OPT_fplugin_arg_:
2536 /* Deferred. */
2537 break;
2538
2539 case OPT_fprofile_use_:
2540 opts->x_profile_data_prefix = xstrdup (arg);
2541 opts->x_flag_profile_use = true;
2542 value = true;
2543 /* No break here - do -fprofile-use processing. */
2544 /* FALLTHRU */
2545 case OPT_fprofile_use:
2546 enable_fdo_optimizations (opts, opts_set, value);
2547 if (!opts_set->x_flag_profile_reorder_functions)
2548 opts->x_flag_profile_reorder_functions = value;
2549 /* Indirect call profiling should do all useful transformations
2550 speculative devirtualization does. */
2551 if (!opts_set->x_flag_devirtualize_speculatively
2552 && opts->x_flag_value_profile_transformations)
2553 opts->x_flag_devirtualize_speculatively = false;
2554 break;
2555
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. */
2561 /* FALLTHRU */
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
2571 case OPT_fprofile_generate_:
2572 opts->x_profile_data_prefix = xstrdup (arg);
2573 value = true;
2574 /* No break here - do -fprofile-generate processing. */
2575 /* FALLTHRU */
2576 case OPT_fprofile_generate:
2577 if (!opts_set->x_profile_arc_flag)
2578 opts->x_profile_arc_flag = value;
2579 if (!opts_set->x_flag_profile_values)
2580 opts->x_flag_profile_values = value;
2581 if (!opts_set->x_flag_inline_functions)
2582 opts->x_flag_inline_functions = value;
2583 if (!opts_set->x_flag_ipa_bit_cp)
2584 opts->x_flag_ipa_bit_cp = value;
2585 /* FIXME: Instrumentation we insert makes ipa-reference bitmaps
2586 quadratic. Disable the pass until better memory representation
2587 is done. */
2588 if (!opts_set->x_flag_ipa_reference)
2589 opts->x_flag_ipa_reference = false;
2590 break;
2591
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
2619 case OPT_ftree_vectorize:
2620 /* Automatically sets -ftree-loop-vectorize and
2621 -ftree-slp-vectorize. Nothing more to do here. */
2622 break;
2623 case OPT_fshow_column:
2624 dc->show_column = value;
2625 break;
2626
2627 case OPT_frandom_seed:
2628 /* The real switch is -fno-random-seed. */
2629 if (value)
2630 return false;
2631 /* Deferred. */
2632 break;
2633
2634 case OPT_frandom_seed_:
2635 /* Deferred. */
2636 break;
2637
2638 case OPT_fsched_verbose_:
2639 #ifdef INSN_SCHEDULING
2640 /* Handled with Var in common.opt. */
2641 break;
2642 #else
2643 return false;
2644 #endif
2645
2646 case OPT_fsched_stalled_insns_:
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;
2650 break;
2651
2652 case OPT_fsched_stalled_insns_dep_:
2653 opts->x_flag_sched_stalled_insns_dep = value;
2654 break;
2655
2656 case OPT_fstack_check_:
2657 if (!strcmp (arg, "no"))
2658 opts->x_flag_stack_check = NO_STACK_CHECK;
2659 else if (!strcmp (arg, "generic"))
2660 /* This is the old stack checking method. */
2661 opts->x_flag_stack_check = STACK_CHECK_BUILTIN
2662 ? FULL_BUILTIN_STACK_CHECK
2663 : GENERIC_STACK_CHECK;
2664 else if (!strcmp (arg, "specific"))
2665 /* This is the new stack checking method. */
2666 opts->x_flag_stack_check = STACK_CHECK_BUILTIN
2667 ? FULL_BUILTIN_STACK_CHECK
2668 : STACK_CHECK_STATIC_BUILTIN
2669 ? STATIC_BUILTIN_STACK_CHECK
2670 : GENERIC_STACK_CHECK;
2671 else
2672 warning_at (loc, 0, "unknown stack check parameter %qs", arg);
2673 break;
2674
2675 case OPT_fstack_limit:
2676 /* The real switch is -fno-stack-limit. */
2677 if (value)
2678 return false;
2679 /* Deferred. */
2680 break;
2681
2682 case OPT_fstack_limit_register_:
2683 case OPT_fstack_limit_symbol_:
2684 /* Deferred. */
2685 break;
2686
2687 case OPT_fstack_usage:
2688 opts->x_flag_stack_usage = value;
2689 opts->x_flag_stack_usage_info = value != 0;
2690 break;
2691
2692 case OPT_g:
2693 set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, arg, opts, opts_set,
2694 loc);
2695 break;
2696
2697 case OPT_gdwarf:
2698 if (arg && strlen (arg) != 0)
2699 {
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);
2703 break;
2704 }
2705 else
2706 value = opts->x_dwarf_version;
2707
2708 /* FALLTHRU */
2709 case OPT_gdwarf_:
2710 if (value < 2 || value > 5)
2711 error_at (loc, "dwarf version %wu is not supported", value);
2712 else
2713 opts->x_dwarf_version = value;
2714 set_debug_level (DWARF2_DEBUG, false, "", opts, opts_set, loc);
2715 break;
2716
2717 case OPT_gsplit_dwarf:
2718 set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, "", opts, opts_set,
2719 loc);
2720 break;
2721
2722 case OPT_ggdb:
2723 set_debug_level (NO_DEBUG, 2, arg, opts, opts_set, loc);
2724 break;
2725
2726 case OPT_gstabs:
2727 case OPT_gstabs_:
2728 set_debug_level (DBX_DEBUG, code == OPT_gstabs_, arg, opts, opts_set,
2729 loc);
2730 break;
2731
2732 case OPT_gvms:
2733 set_debug_level (VMS_DEBUG, false, arg, opts, opts_set, loc);
2734 break;
2735
2736 case OPT_gxcoff:
2737 case OPT_gxcoff_:
2738 set_debug_level (XCOFF_DEBUG, code == OPT_gxcoff_, arg, opts, opts_set,
2739 loc);
2740 break;
2741
2742 case OPT_gz:
2743 case OPT_gz_:
2744 /* Handled completely via specs. */
2745 break;
2746
2747 case OPT_pedantic_errors:
2748 dc->pedantic_errors = 1;
2749 control_warning_option (OPT_Wpedantic, DK_ERROR, NULL, value,
2750 loc, lang_mask,
2751 handlers, opts, opts_set,
2752 dc);
2753 break;
2754
2755 case OPT_flto:
2756 opts->x_flag_lto = value ? "" : NULL;
2757 break;
2758
2759 case OPT_w:
2760 dc->dc_inhibit_warnings = true;
2761 break;
2762
2763 case OPT_fmax_errors_:
2764 dc->max_errors = value;
2765 break;
2766
2767 case OPT_fuse_ld_bfd:
2768 case OPT_fuse_ld_gold:
2769 case OPT_fuse_ld_lld:
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
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
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
2791 case OPT_fipa_icf:
2792 opts->x_flag_ipa_icf_functions = value;
2793 opts->x_flag_ipa_icf_variables = value;
2794 break;
2795
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
2812 default:
2813 /* If the flag was handled in a standard way, assume the lack of
2814 processing here is intentional. */
2815 gcc_assert (option_flag_var (scode, opts));
2816 break;
2817 }
2818
2819 common_handle_option_auto (opts, opts_set, decoded, lang_mask, kind,
2820 loc, handlers, dc);
2821 return true;
2822 }
2823
2824 /* Handle --param NAME=VALUE. */
2825 static void
2826 handle_param (struct gcc_options *opts, struct gcc_options *opts_set,
2827 location_t loc, const char *carg)
2828 {
2829 char *equal, *arg;
2830 int value;
2831
2832 arg = xstrdup (carg);
2833 equal = strchr (arg, '=');
2834 if (!equal)
2835 error_at (loc, "%s: %qs arguments should be of the form NAME=VALUE",
2836 arg, "--param");
2837 else
2838 {
2839 *equal = '\0';
2840
2841 enum compiler_param index;
2842 if (!find_param (arg, &index))
2843 {
2844 const char *suggestion = find_param_fuzzy (arg);
2845 if (suggestion)
2846 error_at (loc, "invalid %qs name %qs; did you mean %qs?",
2847 "--param", arg, suggestion);
2848 else
2849 error_at (loc, "invalid %qs name %qs", "--param", arg);
2850 }
2851 else
2852 {
2853 if (!param_string_value_p (index, equal + 1, &value))
2854 value = integral_argument (equal + 1);
2855
2856 if (value == -1)
2857 error_at (loc, "invalid %qs value %qs", "--param", equal + 1);
2858 else
2859 set_param_value (arg, value,
2860 opts->x_param_values, opts_set->x_param_values);
2861 }
2862 }
2863
2864 free (arg);
2865 }
2866
2867 /* Used to set the level of strict aliasing warnings in OPTS,
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. */
2873 static void
2874 set_Wstrict_aliasing (struct gcc_options *opts, int onoff)
2875 {
2876 gcc_assert (onoff == 0 || onoff == 1);
2877 if (onoff != 0)
2878 opts->x_warn_strict_aliasing = 3;
2879 else
2880 opts->x_warn_strict_aliasing = 0;
2881 }
2882
2883 /* The following routines are useful in setting all the flags that
2884 -ffast-math and -fno-fast-math imply. */
2885 static void
2886 set_fast_math_flags (struct gcc_options *opts, int set)
2887 {
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;
2897 if (set)
2898 {
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;
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;
2909 }
2910 }
2911
2912 /* When -funsafe-math-optimizations is set the following
2913 flags are set as well. */
2914 static void
2915 set_unsafe_math_optimizations_flags (struct gcc_options *opts, int set)
2916 {
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;
2925 }
2926
2927 /* Return true iff flags in OPTS are set as if -ffast-math. */
2928 bool
2929 fast_math_flags_set_p (const struct gcc_options *opts)
2930 {
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
2935 && !opts->x_flag_errno_math
2936 && opts->x_flag_excess_precision_cmdline
2937 == EXCESS_PRECISION_FAST);
2938 }
2939
2940 /* Return true iff flags are set as if -ffast-math but using the flags stored
2941 in the struct cl_optimization structure. */
2942 bool
2943 fast_math_flags_struct_set_p (struct cl_optimization *opt)
2944 {
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);
2950 }
2951
2952 /* Handle a debug output -g switch for options OPTS
2953 (OPTS_SET->x_write_symbols storing whether a debug type was passed
2954 explicitly), location LOC. EXTENDED is true or false to support
2955 extended output (2 is special and means "-ggdb" was given). */
2956 static void
2957 set_debug_level (enum debug_info_type type, int extended, const char *arg,
2958 struct gcc_options *opts, struct gcc_options *opts_set,
2959 location_t loc)
2960 {
2961 opts->x_use_gnu_debug_info_extensions = extended;
2962
2963 if (type == NO_DEBUG)
2964 {
2965 if (opts->x_write_symbols == NO_DEBUG)
2966 {
2967 opts->x_write_symbols = PREFERRED_DEBUGGING_TYPE;
2968
2969 if (extended == 2)
2970 {
2971 #if defined DWARF2_DEBUGGING_INFO || defined DWARF2_LINENO_DEBUGGING_INFO
2972 opts->x_write_symbols = DWARF2_DEBUG;
2973 #elif defined DBX_DEBUGGING_INFO
2974 opts->x_write_symbols = DBX_DEBUG;
2975 #endif
2976 }
2977
2978 if (opts->x_write_symbols == NO_DEBUG)
2979 warning_at (loc, 0, "target system does not support debug output");
2980 }
2981 }
2982 else
2983 {
2984 /* Does it conflict with an already selected type? */
2985 if (opts_set->x_write_symbols != NO_DEBUG
2986 && opts->x_write_symbols != NO_DEBUG
2987 && type != opts->x_write_symbols)
2988 error_at (loc, "debug format %qs conflicts with prior selection",
2989 debug_type_names[type]);
2990 opts->x_write_symbols = type;
2991 opts_set->x_write_symbols = type;
2992 }
2993
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. */
2997 if (*arg == '\0')
2998 {
2999 if (opts->x_debug_info_level < DINFO_LEVEL_NORMAL)
3000 opts->x_debug_info_level = DINFO_LEVEL_NORMAL;
3001 }
3002 else
3003 {
3004 int argval = integral_argument (arg);
3005 if (argval == -1)
3006 error_at (loc, "unrecognized debug output level %qs", arg);
3007 else if (argval > 3)
3008 error_at (loc, "debug output level %qs is too high", arg);
3009 else
3010 opts->x_debug_info_level = (enum debug_info_levels) argval;
3011 }
3012 }
3013
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 ().) */
3017
3018 static void
3019 setup_core_dumping (diagnostic_context *dc)
3020 {
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)
3028 fatal_error (input_location, "getting core file size maximum limit: %m");
3029 rlim.rlim_cur = rlim.rlim_max;
3030 if (setrlimit (RLIMIT_CORE, &rlim) != 0)
3031 fatal_error (input_location,
3032 "setting core file size limit to maximum: %m");
3033 }
3034 #endif
3035 diagnostic_abort_on_error (dc);
3036 }
3037
3038 /* Parse a -d<ARG> command line switch for OPTS, location LOC,
3039 diagnostic context DC. */
3040
3041 static void
3042 decode_d_option (const char *arg, struct gcc_options *opts,
3043 location_t loc, diagnostic_context *dc)
3044 {
3045 int c;
3046
3047 while (*arg)
3048 switch (c = *arg++)
3049 {
3050 case 'A':
3051 opts->x_flag_debug_asm = 1;
3052 break;
3053 case 'p':
3054 opts->x_flag_print_asm_name = 1;
3055 break;
3056 case 'P':
3057 opts->x_flag_dump_rtl_in_asm = 1;
3058 opts->x_flag_print_asm_name = 1;
3059 break;
3060 case 'x':
3061 opts->x_rtl_dump_and_exit = 1;
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':
3070 setup_core_dumping (dc);
3071 break;
3072 case 'a':
3073 opts->x_flag_dump_all_passed = true;
3074 break;
3075
3076 default:
3077 warning_at (loc, 0, "unrecognized gcc debugging option: %c", c);
3078 break;
3079 }
3080 }
3081
3082 /* Enable (or disable if VALUE is 0) a warning option ARG (language
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=. */
3086
3087 static void
3088 enable_warning_as_error (const char *arg, int value, unsigned int lang_mask,
3089 const struct cl_option_handlers *handlers,
3090 struct gcc_options *opts,
3091 struct gcc_options *opts_set,
3092 location_t loc, diagnostic_context *dc)
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);
3101 if (option_index == OPT_SPECIAL_unknown)
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 }
3113 else if (!(cl_options[option_index].flags & CL_WARNING))
3114 error_at (loc, "%<-Werror=%s%>: %<-%s%> is not an option that "
3115 "controls warnings", arg, new_option);
3116 else
3117 {
3118 const diagnostic_t kind = value ? DK_ERROR : DK_WARNING;
3119 const char *arg = NULL;
3120
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,
3124 loc, lang_mask,
3125 handlers, opts, opts_set, dc);
3126 }
3127 free (new_option);
3128 }
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
3135 char *
3136 option_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. */
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);
3157 else
3158 return NULL;
3159 }