]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/opts.c
Time profile-based function reordering (phase 2).
[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 },
30b10261 497 { OPT_LEVELS_2_PLUS, OPT_fisolate_erroneous_paths_dereference, 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 },
137559b2 1463 { "signed-integer-overflow", SANITIZE_SI_OVERFLOW,
1464 sizeof "signed-integer-overflow" -1 },
9e46467d 1465 { NULL, 0, 0 }
1466 };
1467 const char *comma;
1468 size_t len, i;
1469 bool found = false;
1470
1471 comma = strchr (p, ',');
1472 if (comma == NULL)
1473 len = strlen (p);
1474 else
1475 len = comma - p;
1476 if (len == 0)
1477 {
1478 p = comma + 1;
1479 continue;
1480 }
1481
1482 /* Check to see if the string matches an option class name. */
1483 for (i = 0; spec[i].name != NULL; ++i)
1484 if (len == spec[i].len
1485 && memcmp (p, spec[i].name, len) == 0)
1486 {
1487 /* Handle both -fsanitize and -fno-sanitize cases. */
1488 if (value)
1489 flag_sanitize |= spec[i].flag;
1490 else
1491 flag_sanitize &= ~spec[i].flag;
1492 found = true;
1493 break;
1494 }
1495
1496 if (! found)
1497 warning_at (loc, 0,
1498 "unrecognized argument to -fsanitize= option: %q.*s",
1499 (int) len, p);
1500
1501 if (comma == NULL)
1502 break;
1503 p = comma + 1;
1504 }
1505
19b928d9 1506 /* When instrumenting the pointers, we don't want to remove
1507 the null pointer checks. */
1508 if (flag_sanitize & SANITIZE_NULL)
1509 opts->x_flag_delete_null_pointer_checks = 0;
9e46467d 1510 break;
1511 }
1512
da3b1bab 1513 case OPT_O:
1514 case OPT_Os:
e00798c7 1515 case OPT_Ofast:
9b0d2865 1516 case OPT_Og:
da3b1bab 1517 /* Currently handled in a prescan. */
1518 break;
1519
90e2341f 1520 case OPT_Werror:
1521 dc->warning_as_error_requested = value;
1522 break;
1523
76f02516 1524 case OPT_Werror_:
90336809 1525 if (lang_mask == CL_DRIVER)
1526 break;
1527
c123f04d 1528 enable_warning_as_error (arg, value, lang_mask, handlers,
1529 opts, opts_set, loc, dc);
76f02516 1530 break;
1531
6f2f567f 1532 case OPT_Wlarger_than_:
6bd9d862 1533 opts->x_larger_than_size = value;
1534 opts->x_warn_larger_than = value != -1;
6f2f567f 1535 break;
1536
3c6a9715 1537 case OPT_Wfatal_errors:
6bd9d862 1538 dc->fatal_errors = value;
3c6a9715 1539 break;
1540
6fdade09 1541 case OPT_Wframe_larger_than_:
6bd9d862 1542 opts->x_frame_larger_than_size = value;
1543 opts->x_warn_frame_larger_than = value != -1;
6fdade09 1544 break;
1545
8c0dd614 1546 case OPT_Wstack_usage_:
1547 opts->x_warn_stack_usage = value;
1548 opts->x_flag_stack_usage_info = value != -1;
1549 break;
1550
6f2f567f 1551 case OPT_Wstrict_aliasing:
6bd9d862 1552 set_Wstrict_aliasing (opts, value);
6f2f567f 1553 break;
1554
add6ee5e 1555 case OPT_Wstrict_overflow:
6bd9d862 1556 opts->x_warn_strict_overflow = (value
1557 ? (int) WARN_STRICT_OVERFLOW_CONDITIONAL
1558 : 0);
add6ee5e 1559 break;
1560
3c6a9715 1561 case OPT_Wsystem_headers:
6bd9d862 1562 dc->dc_warn_system_headers = value;
da3b1bab 1563 break;
1564
e690b385 1565 case OPT_aux_info:
6bd9d862 1566 opts->x_flag_gen_aux_info = 1;
e690b385 1567 break;
1568
1569 case OPT_auxbase_strip:
1570 {
1571 char *tmp = xstrdup (arg);
1572 strip_off_ending (tmp, strlen (tmp));
1573 if (tmp[0])
6bd9d862 1574 opts->x_aux_base_name = tmp;
ce0fdb91 1575 else
1576 free (tmp);
e690b385 1577 }
1578 break;
1579
1580 case OPT_d:
9faf44d6 1581 decode_d_option (arg, opts, loc, dc);
e690b385 1582 break;
1583
941a4893 1584 case OPT_fcall_used_:
941a4893 1585 case OPT_fcall_saved_:
f0da0668 1586 /* Deferred. */
941a4893 1587 break;
3072d30e 1588
1589 case OPT_fdbg_cnt_:
d2153a46 1590 case OPT_fdbg_cnt_list:
9faf44d6 1591 /* Deferred. */
d2153a46 1592 break;
941a4893 1593
5f1f2de5 1594 case OPT_fdebug_prefix_map_:
9faf44d6 1595 /* Deferred. */
5f1f2de5 1596 break;
1597
1e06725a 1598 case OPT_fdiagnostics_show_location_:
d62a5950 1599 diagnostic_prefixing_rule (dc) = (diagnostic_prefixing_rule_t) value;
1e06725a 1600 break;
5a983084 1601
1602 case OPT_fdiagnostics_show_caret:
1603 dc->show_caret = value;
1604 break;
1e06725a 1605
41609f8b 1606 case OPT_fdiagnostics_color_:
1607 pp_show_color (dc->printer)
1608 = colorize_init ((diagnostic_color_rule_t) value);
1609 break;
1610
b0932b2f 1611 case OPT_fdiagnostics_show_option:
6bd9d862 1612 dc->show_option_requested = value;
b0932b2f 1613 break;
1614
4ee9c684 1615 case OPT_fdump_:
f0da0668 1616 /* Deferred. */
4ee9c684 1617 break;
1618
941a4893 1619 case OPT_ffast_math:
6bd9d862 1620 set_fast_math_flags (opts, value);
941a4893 1621 break;
1622
49d060d7 1623 case OPT_funsafe_math_optimizations:
6bd9d862 1624 set_unsafe_math_optimizations_flags (opts, value);
49d060d7 1625 break;
1626
941a4893 1627 case OPT_ffixed_:
f0da0668 1628 /* Deferred. */
941a4893 1629 break;
1630
39470ac3 1631 case OPT_finline_limit_:
56f280c4 1632 set_param_value ("max-inline-insns-single", value / 2,
1633 opts->x_param_values, opts_set->x_param_values);
1634 set_param_value ("max-inline-insns-auto", value / 2,
1635 opts->x_param_values, opts_set->x_param_values);
39470ac3 1636 break;
1637
a95c0776 1638 case OPT_finstrument_functions_exclude_function_list_:
b5f30e7c 1639 add_comma_separated_to_vector
470a0ecd 1640 (&opts->x_flag_instrument_functions_exclude_functions, arg);
a95c0776 1641 break;
1642
1643 case OPT_finstrument_functions_exclude_file_list_:
b5f30e7c 1644 add_comma_separated_to_vector
470a0ecd 1645 (&opts->x_flag_instrument_functions_exclude_files, arg);
a95c0776 1646 break;
1647
1e06725a 1648 case OPT_fmessage_length_:
6bd9d862 1649 pp_set_line_maximum_length (dc->printer, value);
5a983084 1650 diagnostic_set_caret_max_width (dc, value);
1e06725a 1651 break;
1652
7bd765d4 1653 case OPT_fopt_info:
1654 case OPT_fopt_info_:
1655 /* Deferred. */
1656 break;
1657
6b5553e5 1658 case OPT_fpack_struct_:
1659 if (value <= 0 || (value & (value - 1)) || value > 16)
9faf44d6 1660 error_at (loc,
1661 "structure alignment must be a small power of two, not %d",
1662 value);
6b5553e5 1663 else
9faf44d6 1664 opts->x_initial_max_fld_align = value;
6b5553e5 1665 break;
1666
9227b6fc 1667 case OPT_fplugin_:
9227b6fc 1668 case OPT_fplugin_arg_:
f0da0668 1669 /* Deferred. */
9227b6fc 1670 break;
1671
3e3a0e9c 1672 case OPT_fprofile_use_:
cc4fa57a 1673 opts->x_profile_data_prefix = xstrdup (arg);
6bd9d862 1674 opts->x_flag_profile_use = true;
3e3a0e9c 1675 value = true;
1676 /* No break here - do -fprofile-use processing. */
7dea76ba 1677 case OPT_fprofile_use:
f83b64ca 1678 if (!opts_set->x_flag_branch_probabilities)
6bd9d862 1679 opts->x_flag_branch_probabilities = value;
f83b64ca 1680 if (!opts_set->x_flag_profile_values)
6bd9d862 1681 opts->x_flag_profile_values = value;
f83b64ca 1682 if (!opts_set->x_flag_unroll_loops)
6bd9d862 1683 opts->x_flag_unroll_loops = value;
f83b64ca 1684 if (!opts_set->x_flag_peel_loops)
6bd9d862 1685 opts->x_flag_peel_loops = value;
f83b64ca 1686 if (!opts_set->x_flag_tracer)
6bd9d862 1687 opts->x_flag_tracer = value;
f83b64ca 1688 if (!opts_set->x_flag_value_profile_transformations)
6bd9d862 1689 opts->x_flag_value_profile_transformations = value;
f83b64ca 1690 if (!opts_set->x_flag_inline_functions)
6bd9d862 1691 opts->x_flag_inline_functions = value;
f83b64ca 1692 if (!opts_set->x_flag_ipa_cp)
6bd9d862 1693 opts->x_flag_ipa_cp = value;
f83b64ca 1694 if (!opts_set->x_flag_ipa_cp_clone
6bd9d862 1695 && value && opts->x_flag_ipa_cp)
1696 opts->x_flag_ipa_cp_clone = value;
f83b64ca 1697 if (!opts_set->x_flag_predictive_commoning)
6bd9d862 1698 opts->x_flag_predictive_commoning = value;
f83b64ca 1699 if (!opts_set->x_flag_unswitch_loops)
6bd9d862 1700 opts->x_flag_unswitch_loops = value;
f83b64ca 1701 if (!opts_set->x_flag_gcse_after_reload)
6bd9d862 1702 opts->x_flag_gcse_after_reload = value;
043115ec 1703 if (!opts_set->x_flag_tree_loop_vectorize
1704 && !opts_set->x_flag_tree_vectorize)
1705 opts->x_flag_tree_loop_vectorize = value;
1706 if (!opts_set->x_flag_tree_slp_vectorize
1707 && !opts_set->x_flag_tree_vectorize)
1708 opts->x_flag_tree_slp_vectorize = value;
5f38d9ef 1709 if (!opts_set->x_flag_vect_cost_model)
1dbf9bd1 1710 opts->x_flag_vect_cost_model = VECT_COST_MODEL_DYNAMIC;
5f38d9ef 1711 if (!opts_set->x_flag_tree_loop_distribute_patterns)
1712 opts->x_flag_tree_loop_distribute_patterns = value;
af48f0b1 1713 if (!opts_set->x_flag_profile_reorder_functions)
1714 opts->x_flag_profile_reorder_functions = value;
84f6cc40 1715 /* Indirect call profiling should do all useful transformations
c7142344 1716 speculative devirtualization does. */
84f6cc40 1717 if (!opts_set->x_flag_devirtualize_speculatively
1718 && opts->x_flag_value_profile_transformations)
1719 opts->x_flag_devirtualize_speculatively = false;
7dea76ba 1720 break;
1721
3e3a0e9c 1722 case OPT_fprofile_generate_:
cc4fa57a 1723 opts->x_profile_data_prefix = xstrdup (arg);
3e3a0e9c 1724 value = true;
1725 /* No break here - do -fprofile-generate processing. */
7dea76ba 1726 case OPT_fprofile_generate:
f83b64ca 1727 if (!opts_set->x_profile_arc_flag)
6bd9d862 1728 opts->x_profile_arc_flag = value;
f83b64ca 1729 if (!opts_set->x_flag_profile_values)
6bd9d862 1730 opts->x_flag_profile_values = value;
f83b64ca 1731 if (!opts_set->x_flag_inline_functions)
6bd9d862 1732 opts->x_flag_inline_functions = value;
02a5f2b9 1733 /* FIXME: Instrumentation we insert makes ipa-reference bitmaps
1734 quadratic. Disable the pass until better memory representation
1735 is done. */
90336809 1736 if (!opts_set->x_flag_ipa_reference && opts->x_in_lto_p)
02a5f2b9 1737 opts->x_flag_ipa_reference = false;
7dea76ba 1738 break;
1739
043115ec 1740 case OPT_ftree_vectorize:
1741 if (!opts_set->x_flag_tree_loop_vectorize)
1742 opts->x_flag_tree_loop_vectorize = value;
1743 if (!opts_set->x_flag_tree_slp_vectorize)
1744 opts->x_flag_tree_slp_vectorize = value;
1745 break;
3c6a9715 1746 case OPT_fshow_column:
6bd9d862 1747 dc->show_column = value;
3c6a9715 1748 break;
1749
1e06725a 1750 case OPT_frandom_seed:
1751 /* The real switch is -fno-random-seed. */
1752 if (value)
b78351e5 1753 return false;
9faf44d6 1754 /* Deferred. */
1e06725a 1755 break;
1756
1757 case OPT_frandom_seed_:
9faf44d6 1758 /* Deferred. */
1e06725a 1759 break;
1760
1e06725a 1761 case OPT_fsched_verbose_:
1762#ifdef INSN_SCHEDULING
9faf44d6 1763 /* Handled with Var in common.opt. */
1e06725a 1764 break;
1765#else
b78351e5 1766 return false;
1e06725a 1767#endif
1768
52c4b43f 1769 case OPT_fsched_stalled_insns_:
6bd9d862 1770 opts->x_flag_sched_stalled_insns = value;
1771 if (opts->x_flag_sched_stalled_insns == 0)
1772 opts->x_flag_sched_stalled_insns = -1;
52c4b43f 1773 break;
1774
52c4b43f 1775 case OPT_fsched_stalled_insns_dep_:
6bd9d862 1776 opts->x_flag_sched_stalled_insns_dep = value;
52c4b43f 1777 break;
ecdb6d1a 1778
4852b829 1779 case OPT_fstack_check_:
1780 if (!strcmp (arg, "no"))
ab3728ee 1781 opts->x_flag_stack_check = NO_STACK_CHECK;
4852b829 1782 else if (!strcmp (arg, "generic"))
1783 /* This is the old stack checking method. */
ab3728ee 1784 opts->x_flag_stack_check = STACK_CHECK_BUILTIN
4852b829 1785 ? FULL_BUILTIN_STACK_CHECK
1786 : GENERIC_STACK_CHECK;
1787 else if (!strcmp (arg, "specific"))
1788 /* This is the new stack checking method. */
ab3728ee 1789 opts->x_flag_stack_check = STACK_CHECK_BUILTIN
4852b829 1790 ? FULL_BUILTIN_STACK_CHECK
1791 : STACK_CHECK_STATIC_BUILTIN
1792 ? STATIC_BUILTIN_STACK_CHECK
1793 : GENERIC_STACK_CHECK;
1794 else
9faf44d6 1795 warning_at (loc, 0, "unknown stack check parameter \"%s\"", arg);
4852b829 1796 break;
1797
1e06725a 1798 case OPT_fstack_limit:
1799 /* The real switch is -fno-stack-limit. */
1800 if (value)
b78351e5 1801 return false;
f0da0668 1802 /* Deferred. */
1e06725a 1803 break;
1804
941a4893 1805 case OPT_fstack_limit_register_:
941a4893 1806 case OPT_fstack_limit_symbol_:
f0da0668 1807 /* Deferred. */
941a4893 1808 break;
1809
8c0dd614 1810 case OPT_fstack_usage:
1811 opts->x_flag_stack_usage = value;
1812 opts->x_flag_stack_usage_info = value != 0;
1813 break;
1814
6f2f567f 1815 case OPT_g:
7fa9fa16 1816 /* -g by itself should force -g2. */
1817 if (*arg == '\0')
1818 set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, "2", opts, opts_set,
1819 loc);
1820 else
1821 set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, arg, opts, opts_set,
1822 loc);
b0e56fb1 1823 break;
1824
1825 case OPT_gcoff:
9faf44d6 1826 set_debug_level (SDB_DEBUG, false, arg, opts, opts_set, loc);
b0e56fb1 1827 break;
1828
8786b72c 1829 case OPT_gdwarf:
6c1f6b49 1830 if (arg && strlen (arg) != 0)
8786b72c 1831 {
1832 error_at (loc, "%<-gdwarf%s%> is ambiguous; "
1833 "use %<-gdwarf-%s%> for DWARF version "
1834 "or %<-gdwarf -g%s%> for debug level", arg, arg, arg);
1835 break;
1836 }
1837 else
6c1f6b49 1838 value = opts->x_dwarf_version;
1839
1840 /* FALLTHRU */
3d3b9d5b 1841 case OPT_gdwarf_:
9845d120 1842 if (value < 2 || value > 4)
9faf44d6 1843 error_at (loc, "dwarf version %d is not supported", value);
3d3b9d5b 1844 else
90336809 1845 opts->x_dwarf_version = value;
9faf44d6 1846 set_debug_level (DWARF2_DEBUG, false, "", opts, opts_set, loc);
b0e56fb1 1847 break;
1848
b35329c7 1849 case OPT_gsplit_dwarf:
1850 set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, "", opts, opts_set,
1851 loc);
1852 break;
1853
b0e56fb1 1854 case OPT_ggdb:
9faf44d6 1855 set_debug_level (NO_DEBUG, 2, arg, opts, opts_set, loc);
b0e56fb1 1856 break;
1857
1858 case OPT_gstabs:
1859 case OPT_gstabs_:
9faf44d6 1860 set_debug_level (DBX_DEBUG, code == OPT_gstabs_, arg, opts, opts_set,
1861 loc);
b0e56fb1 1862 break;
1863
1864 case OPT_gvms:
9faf44d6 1865 set_debug_level (VMS_DEBUG, false, arg, opts, opts_set, loc);
b0e56fb1 1866 break;
1867
1868 case OPT_gxcoff:
1869 case OPT_gxcoff_:
9faf44d6 1870 set_debug_level (XCOFF_DEBUG, code == OPT_gxcoff_, arg, opts, opts_set,
1871 loc);
6f2f567f 1872 break;
1873
e690b385 1874 case OPT_pedantic_errors:
6bd9d862 1875 dc->pedantic_errors = 1;
db490cb6 1876 control_warning_option (OPT_Wpedantic, DK_ERROR, value,
1877 loc, lang_mask,
1878 handlers, opts, opts_set,
1879 dc);
cba6710d 1880 break;
1881
cbcf2791 1882 case OPT_flto:
489113a1 1883 opts->x_flag_lto = value ? "" : NULL;
e990a271 1884 break;
1885
3c6a9715 1886 case OPT_w:
6bd9d862 1887 dc->dc_inhibit_warnings = true;
3c6a9715 1888 break;
1889
566d7c74 1890 case OPT_fmax_errors_:
1891 dc->max_errors = value;
1892 break;
1893
99d5fe2d 1894 case OPT_fuse_ld_bfd:
1895 case OPT_fuse_ld_gold:
386fbe6a 1896 case OPT_fuse_linker_plugin:
1897 /* No-op. Used by the driver and passed to us because it starts with f.*/
1898 break;
1899
8365f6c8 1900 case OPT_fwrapv:
1901 if (value)
1902 opts->x_flag_trapv = 0;
1903 break;
1904
1905 case OPT_ftrapv:
1906 if (value)
1907 opts->x_flag_wrapv = 0;
1908 break;
1909
2e9da478 1910 default:
1911 /* If the flag was handled in a standard way, assume the lack of
1912 processing here is intentional. */
2c5d2e39 1913 gcc_assert (option_flag_var (scode, opts));
1fa3a8f6 1914 break;
3272db82 1915 }
1916
fbb6fbd8 1917 common_handle_option_auto (opts, opts_set, decoded, lang_mask, kind,
1918 loc, handlers, dc);
b78351e5 1919 return true;
3272db82 1920}
da3b1bab 1921
1922/* Handle --param NAME=VALUE. */
1923static void
56f280c4 1924handle_param (struct gcc_options *opts, struct gcc_options *opts_set,
9faf44d6 1925 location_t loc, const char *carg)
da3b1bab 1926{
1927 char *equal, *arg;
1928 int value;
1929
1930 arg = xstrdup (carg);
1931 equal = strchr (arg, '=');
1932 if (!equal)
9faf44d6 1933 error_at (loc, "%s: --param arguments should be of the form NAME=VALUE",
1934 arg);
da3b1bab 1935 else
1936 {
1937 value = integral_argument (equal + 1);
1938 if (value == -1)
9faf44d6 1939 error_at (loc, "invalid --param value %qs", equal + 1);
da3b1bab 1940 else
1941 {
1942 *equal = '\0';
56f280c4 1943 set_param_value (arg, value,
1944 opts->x_param_values, opts_set->x_param_values);
da3b1bab 1945 }
1946 }
1947
1948 free (arg);
1949}
1950
6bd9d862 1951/* Used to set the level of strict aliasing warnings in OPTS,
e6fa0ea6 1952 when no level is specified (i.e., when -Wstrict-aliasing, and not
1953 -Wstrict-aliasing=level was given).
1954 ONOFF is assumed to take value 1 when -Wstrict-aliasing is specified,
1955 and 0 otherwise. After calling this function, wstrict_aliasing will be
1956 set to the default value of -Wstrict_aliasing=level, currently 3. */
77b27208 1957static void
6bd9d862 1958set_Wstrict_aliasing (struct gcc_options *opts, int onoff)
e6fa0ea6 1959{
1960 gcc_assert (onoff == 0 || onoff == 1);
1961 if (onoff != 0)
6bd9d862 1962 opts->x_warn_strict_aliasing = 3;
e629070d 1963 else
6bd9d862 1964 opts->x_warn_strict_aliasing = 0;
e6fa0ea6 1965}
1966
941a4893 1967/* The following routines are useful in setting all the flags that
1968 -ffast-math and -fno-fast-math imply. */
43c54942 1969static void
6bd9d862 1970set_fast_math_flags (struct gcc_options *opts, int set)
941a4893 1971{
ecee1b29 1972 if (!opts->frontend_set_flag_unsafe_math_optimizations)
1973 {
1974 opts->x_flag_unsafe_math_optimizations = set;
1975 set_unsafe_math_optimizations_flags (opts, set);
1976 }
1977 if (!opts->frontend_set_flag_finite_math_only)
1978 opts->x_flag_finite_math_only = set;
1979 if (!opts->frontend_set_flag_errno_math)
1980 opts->x_flag_errno_math = !set;
941a4893 1981 if (set)
5466f589 1982 {
ecee1b29 1983 if (!opts->frontend_set_flag_signaling_nans)
1984 opts->x_flag_signaling_nans = 0;
1985 if (!opts->frontend_set_flag_rounding_math)
1986 opts->x_flag_rounding_math = 0;
1987 if (!opts->frontend_set_flag_cx_limited_range)
1988 opts->x_flag_cx_limited_range = 1;
5466f589 1989 }
941a4893 1990}
1991
48e1416a 1992/* When -funsafe-math-optimizations is set the following
1993 flags are set as well. */
43c54942 1994static void
6bd9d862 1995set_unsafe_math_optimizations_flags (struct gcc_options *opts, int set)
49d060d7 1996{
ecee1b29 1997 if (!opts->frontend_set_flag_trapping_math)
1998 opts->x_flag_trapping_math = !set;
1999 if (!opts->frontend_set_flag_signed_zeros)
2000 opts->x_flag_signed_zeros = !set;
2001 if (!opts->frontend_set_flag_associative_math)
2002 opts->x_flag_associative_math = set;
2003 if (!opts->frontend_set_flag_reciprocal_math)
2004 opts->x_flag_reciprocal_math = set;
49d060d7 2005}
2006
cc4fa57a 2007/* Return true iff flags in OPTS are set as if -ffast-math. */
941a4893 2008bool
cc4fa57a 2009fast_math_flags_set_p (const struct gcc_options *opts)
941a4893 2010{
cc4fa57a 2011 return (!opts->x_flag_trapping_math
2012 && opts->x_flag_unsafe_math_optimizations
2013 && opts->x_flag_finite_math_only
2014 && !opts->x_flag_signed_zeros
2015 && !opts->x_flag_errno_math);
941a4893 2016}
53b8e5c1 2017
46f8e3b0 2018/* Return true iff flags are set as if -ffast-math but using the flags stored
2019 in the struct cl_optimization structure. */
2020bool
2021fast_math_flags_struct_set_p (struct cl_optimization *opt)
2022{
5ae82d58 2023 return (!opt->x_flag_trapping_math
2024 && opt->x_flag_unsafe_math_optimizations
2025 && opt->x_flag_finite_math_only
2026 && !opt->x_flag_signed_zeros
2027 && !opt->x_flag_errno_math);
46f8e3b0 2028}
2029
cc4fa57a 2030/* Handle a debug output -g switch for options OPTS
2031 (OPTS_SET->x_write_symbols storing whether a debug type was passed
9faf44d6 2032 explicitly), location LOC. EXTENDED is true or false to support
2033 extended output (2 is special and means "-ggdb" was given). */
b0e56fb1 2034static void
cc4fa57a 2035set_debug_level (enum debug_info_type type, int extended, const char *arg,
9faf44d6 2036 struct gcc_options *opts, struct gcc_options *opts_set,
2037 location_t loc)
b0e56fb1 2038{
cc4fa57a 2039 opts->x_use_gnu_debug_info_extensions = extended;
b0e56fb1 2040
2041 if (type == NO_DEBUG)
2042 {
cc4fa57a 2043 if (opts->x_write_symbols == NO_DEBUG)
b0e56fb1 2044 {
cc4fa57a 2045 opts->x_write_symbols = PREFERRED_DEBUGGING_TYPE;
b0e56fb1 2046
2047 if (extended == 2)
2048 {
2049#ifdef DWARF2_DEBUGGING_INFO
cc4fa57a 2050 opts->x_write_symbols = DWARF2_DEBUG;
b0e56fb1 2051#elif defined DBX_DEBUGGING_INFO
cc4fa57a 2052 opts->x_write_symbols = DBX_DEBUG;
b0e56fb1 2053#endif
2054 }
2055
cc4fa57a 2056 if (opts->x_write_symbols == NO_DEBUG)
9faf44d6 2057 warning_at (loc, 0, "target system does not support debug output");
b0e56fb1 2058 }
2059 }
2060 else
2061 {
2062 /* Does it conflict with an already selected type? */
cc4fa57a 2063 if (opts_set->x_write_symbols != NO_DEBUG
2064 && opts->x_write_symbols != NO_DEBUG
2065 && type != opts->x_write_symbols)
9faf44d6 2066 error_at (loc, "debug format \"%s\" conflicts with prior selection",
2067 debug_type_names[type]);
cc4fa57a 2068 opts->x_write_symbols = type;
2069 opts_set->x_write_symbols = type;
b0e56fb1 2070 }
2071
2072 /* A debug flag without a level defaults to level 2. */
2073 if (*arg == '\0')
2074 {
cc4fa57a 2075 if (!opts->x_debug_info_level)
2076 opts->x_debug_info_level = DINFO_LEVEL_NORMAL;
b0e56fb1 2077 }
2078 else
2079 {
8458f4ca 2080 int argval = integral_argument (arg);
2081 if (argval == -1)
9faf44d6 2082 error_at (loc, "unrecognised debug output level \"%s\"", arg);
8458f4ca 2083 else if (argval > 3)
9faf44d6 2084 error_at (loc, "debug output level %s is too high", arg);
8458f4ca 2085 else
cc4fa57a 2086 opts->x_debug_info_level = (enum debug_info_levels) argval;
b0e56fb1 2087 }
2088}
2089
9faf44d6 2090/* Arrange to dump core on error for diagnostic context DC. (The
2091 regular error message is still printed first, except in the case of
2092 abort ().) */
ff05e09e 2093
79396169 2094static void
9faf44d6 2095setup_core_dumping (diagnostic_context *dc)
ff05e09e 2096{
79396169 2097#ifdef SIGABRT
2098 signal (SIGABRT, SIG_DFL);
2099#endif
2100#if defined(HAVE_SETRLIMIT)
2101 {
2102 struct rlimit rlim;
2103 if (getrlimit (RLIMIT_CORE, &rlim) != 0)
2104 fatal_error ("getting core file size maximum limit: %m");
2105 rlim.rlim_cur = rlim.rlim_max;
2106 if (setrlimit (RLIMIT_CORE, &rlim) != 0)
2107 fatal_error ("setting core file size limit to maximum: %m");
2108 }
2109#endif
9faf44d6 2110 diagnostic_abort_on_error (dc);
ff05e09e 2111}
7abcc497 2112
9faf44d6 2113/* Parse a -d<ARG> command line switch for OPTS, location LOC,
2114 diagnostic context DC. */
7abcc497 2115
79396169 2116static void
9faf44d6 2117decode_d_option (const char *arg, struct gcc_options *opts,
2118 location_t loc, diagnostic_context *dc)
7abcc497 2119{
79396169 2120 int c;
7abcc497 2121
79396169 2122 while (*arg)
2123 switch (c = *arg++)
2124 {
2125 case 'A':
9faf44d6 2126 opts->x_flag_debug_asm = 1;
79396169 2127 break;
2128 case 'p':
9faf44d6 2129 opts->x_flag_print_asm_name = 1;
79396169 2130 break;
2131 case 'P':
9faf44d6 2132 opts->x_flag_dump_rtl_in_asm = 1;
2133 opts->x_flag_print_asm_name = 1;
79396169 2134 break;
79396169 2135 case 'x':
9faf44d6 2136 opts->x_rtl_dump_and_exit = 1;
79396169 2137 break;
2138 case 'D': /* These are handled by the preprocessor. */
2139 case 'I':
2140 case 'M':
2141 case 'N':
2142 case 'U':
2143 break;
2144 case 'H':
9faf44d6 2145 setup_core_dumping (dc);
79396169 2146 break;
2147 case 'a':
9faf44d6 2148 opts->x_flag_dump_all_passed = true;
79396169 2149 break;
f0da0668 2150
79396169 2151 default:
9faf44d6 2152 warning_at (loc, 0, "unrecognized gcc debugging option: %c", c);
79396169 2153 break;
2154 }
7abcc497 2155}
3ba510aa 2156
24ca3b4e 2157/* Enable (or disable if VALUE is 0) a warning option ARG (language
c123f04d 2158 mask LANG_MASK, option handlers HANDLERS) as an error for option
2159 structures OPTS and OPTS_SET, diagnostic context DC (possibly
2160 NULL), location LOC. This is used by -Werror=. */
3ba510aa 2161
3c6c0e40 2162static void
b78351e5 2163enable_warning_as_error (const char *arg, int value, unsigned int lang_mask,
24ca3b4e 2164 const struct cl_option_handlers *handlers,
c123f04d 2165 struct gcc_options *opts,
2166 struct gcc_options *opts_set,
3c6c0e40 2167 location_t loc, diagnostic_context *dc)
3ba510aa 2168{
2169 char *new_option;
2170 int option_index;
2171
2172 new_option = XNEWVEC (char, strlen (arg) + 2);
2173 new_option[0] = 'W';
2174 strcpy (new_option + 1, arg);
2175 option_index = find_opt (new_option, lang_mask);
615ef0bb 2176 if (option_index == OPT_SPECIAL_unknown)
3ba510aa 2177 {
9faf44d6 2178 error_at (loc, "-Werror=%s: no option -%s", arg, new_option);
3ba510aa 2179 }
2180 else
2181 {
3a79f5da 2182 const diagnostic_t kind = value ? DK_ERROR : DK_WARNING;
2183
c123f04d 2184 control_warning_option (option_index, (int) kind, value,
2185 loc, lang_mask,
2186 handlers, opts, opts_set, dc);
3ba510aa 2187 }
2188 free (new_option);
2189}
3c6a9715 2190
2191/* Return malloced memory for the name of the option OPTION_INDEX
2192 which enabled a diagnostic (context CONTEXT), originally of type
2193 ORIG_DIAG_KIND but possibly converted to DIAG_KIND by options such
2194 as -Werror. */
2195
2196char *
2197option_name (diagnostic_context *context, int option_index,
2198 diagnostic_t orig_diag_kind, diagnostic_t diag_kind)
2199{
2200 if (option_index)
2201 {
2202 /* A warning classified as an error. */
2203 if ((orig_diag_kind == DK_WARNING || orig_diag_kind == DK_PEDWARN)
2204 && diag_kind == DK_ERROR)
2205 return concat (cl_options[OPT_Werror_].opt_text,
2206 /* Skip over "-W". */
2207 cl_options[option_index].opt_text + 2,
2208 NULL);
2209 /* A warning with option. */
2210 else
2211 return xstrdup (cl_options[option_index].opt_text);
2212 }
2213 /* A warning without option classified as an error. */
2214 else if (orig_diag_kind == DK_WARNING || orig_diag_kind == DK_PEDWARN
2215 || diag_kind == DK_WARNING)
2216 {
2217 if (context->warning_as_error_requested)
2218 return xstrdup (cl_options[OPT_Werror].opt_text);
2219 else
2220 return xstrdup (_("enabled by default"));
2221 }
2222 else
2223 return NULL;
2224}