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