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