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