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