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