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