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