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