xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/opts.c (revision bdc22b2e01993381dcefeff2bc9b56ca75a4235c)
1 /* Command line option handling.
2    Copyright (C) 2002-2015 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 
282   if (opts_set)
283     memset (opts_set, 0, sizeof (*opts_set));
284 
285   opts->x_param_values = XNEWVEC (int, num_params);
286 
287   if (opts_set)
288     opts_set->x_param_values = XCNEWVEC (int, num_params);
289 
290   init_param_values (opts->x_param_values);
291 
292   /* Initialize whether `char' is signed.  */
293   opts->x_flag_signed_char = DEFAULT_SIGNED_CHAR;
294   /* Set this to a special "uninitialized" value.  The actual default
295      is set after target options have been processed.  */
296   opts->x_flag_short_enums = 2;
297 
298   /* Initialize target_flags before default_options_optimization
299      so the latter can modify it.  */
300   opts->x_target_flags = targetm_common.default_target_flags;
301 
302   /* Some targets have ABI-specified unwind tables.  */
303   opts->x_flag_unwind_tables = targetm_common.unwind_tables_default;
304 
305   /* Some targets have other target-specific initialization.  */
306   targetm_common.option_init_struct (opts);
307 }
308 
309 /* Release any allocations owned by OPTS.  */
310 
311 void
312 finalize_options_struct (struct gcc_options *opts)
313 {
314   XDELETEVEC (opts->x_param_values);
315 }
316 
317 /* If indicated by the optimization level LEVEL (-Os if SIZE is set,
318    -Ofast if FAST is set, -Og if DEBUG is set), apply the option DEFAULT_OPT
319    to OPTS and OPTS_SET, diagnostic context DC, location LOC, with language
320    mask LANG_MASK and option handlers HANDLERS.  */
321 
322 static void
323 maybe_default_option (struct gcc_options *opts,
324 		      struct gcc_options *opts_set,
325 		      const struct default_options *default_opt,
326 		      int level, bool size, bool fast, bool debug,
327 		      unsigned int lang_mask,
328 		      const struct cl_option_handlers *handlers,
329 		      location_t loc,
330 		      diagnostic_context *dc)
331 {
332   const struct cl_option *option = &cl_options[default_opt->opt_index];
333   bool enabled;
334 
335   if (size)
336     gcc_assert (level == 2);
337   if (fast)
338     gcc_assert (level == 3);
339   if (debug)
340     gcc_assert (level == 1);
341 
342   switch (default_opt->levels)
343     {
344     case OPT_LEVELS_ALL:
345       enabled = true;
346       break;
347 
348     case OPT_LEVELS_0_ONLY:
349       enabled = (level == 0);
350       break;
351 
352     case OPT_LEVELS_1_PLUS:
353       enabled = (level >= 1);
354       break;
355 
356     case OPT_LEVELS_1_PLUS_SPEED_ONLY:
357       enabled = (level >= 1 && !size && !debug);
358       break;
359 
360     case OPT_LEVELS_1_PLUS_NOT_DEBUG:
361       enabled = (level >= 1 && !debug);
362       break;
363 
364     case OPT_LEVELS_2_PLUS:
365       enabled = (level >= 2);
366       break;
367 
368     case OPT_LEVELS_2_PLUS_SPEED_ONLY:
369       enabled = (level >= 2 && !size && !debug);
370       break;
371 
372     case OPT_LEVELS_3_PLUS:
373       enabled = (level >= 3);
374       break;
375 
376     case OPT_LEVELS_3_PLUS_AND_SIZE:
377       enabled = (level >= 3 || size);
378       break;
379 
380     case OPT_LEVELS_SIZE:
381       enabled = size;
382       break;
383 
384     case OPT_LEVELS_FAST:
385       enabled = fast;
386       break;
387 
388     case OPT_LEVELS_NONE:
389     default:
390       gcc_unreachable ();
391     }
392 
393   if (enabled)
394     handle_generated_option (opts, opts_set, default_opt->opt_index,
395 			     default_opt->arg, default_opt->value,
396 			     lang_mask, DK_UNSPECIFIED, loc,
397 			     handlers, dc);
398   else if (default_opt->arg == NULL
399 	   && !option->cl_reject_negative)
400     handle_generated_option (opts, opts_set, default_opt->opt_index,
401 			     default_opt->arg, !default_opt->value,
402 			     lang_mask, DK_UNSPECIFIED, loc,
403 			     handlers, dc);
404 }
405 
406 /* As indicated by the optimization level LEVEL (-Os if SIZE is set,
407    -Ofast if FAST is set), apply the options in array DEFAULT_OPTS to
408    OPTS and OPTS_SET, diagnostic context DC, location LOC, with
409    language mask LANG_MASK and option handlers HANDLERS.  */
410 
411 static void
412 maybe_default_options (struct gcc_options *opts,
413 		       struct gcc_options *opts_set,
414 		       const struct default_options *default_opts,
415 		       int level, bool size, bool fast, bool debug,
416 		       unsigned int lang_mask,
417 		       const struct cl_option_handlers *handlers,
418 		       location_t loc,
419 		       diagnostic_context *dc)
420 {
421   size_t i;
422 
423   for (i = 0; default_opts[i].levels != OPT_LEVELS_NONE; i++)
424     maybe_default_option (opts, opts_set, &default_opts[i],
425 			  level, size, fast, debug,
426 			  lang_mask, handlers, loc, dc);
427 }
428 
429 /* Table of options enabled by default at different levels.  */
430 
431 static const struct default_options default_options_table[] =
432   {
433     /* -O1 optimizations.  */
434     { OPT_LEVELS_1_PLUS, OPT_fdefer_pop, NULL, 1 },
435 #ifdef DELAY_SLOTS
436     { OPT_LEVELS_1_PLUS, OPT_fdelayed_branch, NULL, 1 },
437 #endif
438     { OPT_LEVELS_1_PLUS, OPT_fguess_branch_probability, NULL, 1 },
439     { OPT_LEVELS_1_PLUS, OPT_fcprop_registers, NULL, 1 },
440     { OPT_LEVELS_1_PLUS, OPT_fforward_propagate, NULL, 1 },
441     { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fif_conversion, NULL, 1 },
442     { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fif_conversion2, NULL, 1 },
443     { OPT_LEVELS_1_PLUS, OPT_fipa_pure_const, NULL, 1 },
444     { OPT_LEVELS_1_PLUS, OPT_fipa_reference, NULL, 1 },
445     { OPT_LEVELS_1_PLUS, OPT_fipa_profile, NULL, 1 },
446     { OPT_LEVELS_1_PLUS, OPT_fmerge_constants, NULL, 1 },
447     { OPT_LEVELS_1_PLUS, OPT_fshrink_wrap, NULL, 1 },
448     { OPT_LEVELS_1_PLUS, OPT_fsplit_wide_types, NULL, 1 },
449     { OPT_LEVELS_1_PLUS, OPT_ftree_ccp, NULL, 1 },
450     { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_bit_ccp, NULL, 1 },
451     { OPT_LEVELS_1_PLUS, OPT_ftree_dce, NULL, 1 },
452     { OPT_LEVELS_1_PLUS, OPT_ftree_dominator_opts, NULL, 1 },
453     { OPT_LEVELS_1_PLUS, OPT_ftree_dse, NULL, 1 },
454     { OPT_LEVELS_1_PLUS, OPT_ftree_ter, NULL, 1 },
455     { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_sra, NULL, 1 },
456     { OPT_LEVELS_1_PLUS, OPT_ftree_copyrename, NULL, 1 },
457     { OPT_LEVELS_1_PLUS, OPT_ftree_fre, NULL, 1 },
458     { OPT_LEVELS_1_PLUS, OPT_ftree_copy_prop, NULL, 1 },
459     { OPT_LEVELS_1_PLUS, OPT_ftree_sink, NULL, 1 },
460     { OPT_LEVELS_1_PLUS, OPT_ftree_ch, NULL, 1 },
461     { OPT_LEVELS_1_PLUS, OPT_fcombine_stack_adjustments, NULL, 1 },
462     { OPT_LEVELS_1_PLUS, OPT_fcompare_elim, NULL, 1 },
463     { OPT_LEVELS_1_PLUS, OPT_ftree_slsr, NULL, 1 },
464     { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fbranch_count_reg, NULL, 1 },
465     { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fmove_loop_invariants, NULL, 1 },
466     { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_pta, NULL, 1 },
467     { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fssa_phiopt, NULL, 1 },
468 
469     /* -O2 optimizations.  */
470     { OPT_LEVELS_2_PLUS, OPT_finline_small_functions, NULL, 1 },
471     { OPT_LEVELS_2_PLUS, OPT_findirect_inlining, NULL, 1 },
472     { OPT_LEVELS_2_PLUS, OPT_fpartial_inlining, NULL, 1 },
473     { OPT_LEVELS_2_PLUS, OPT_fthread_jumps, NULL, 1 },
474     { OPT_LEVELS_2_PLUS, OPT_fcrossjumping, NULL, 1 },
475     { OPT_LEVELS_2_PLUS, OPT_foptimize_sibling_calls, NULL, 1 },
476     { OPT_LEVELS_2_PLUS, OPT_fcse_follow_jumps, NULL, 1 },
477     { OPT_LEVELS_2_PLUS, OPT_fgcse, NULL, 1 },
478     { OPT_LEVELS_2_PLUS, OPT_fexpensive_optimizations, NULL, 1 },
479     { OPT_LEVELS_2_PLUS, OPT_frerun_cse_after_loop, NULL, 1 },
480     { OPT_LEVELS_2_PLUS, OPT_fcaller_saves, NULL, 1 },
481     { OPT_LEVELS_2_PLUS, OPT_fpeephole2, NULL, 1 },
482 #ifdef INSN_SCHEDULING
483   /* Only run the pre-regalloc scheduling pass if optimizing for speed.  */
484     { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_fschedule_insns, NULL, 1 },
485     { OPT_LEVELS_2_PLUS, OPT_fschedule_insns2, NULL, 1 },
486 #endif
487     { OPT_LEVELS_2_PLUS, OPT_fstrict_aliasing, NULL, 1 },
488     { OPT_LEVELS_2_PLUS, OPT_fstrict_overflow, NULL, 1 },
489     { OPT_LEVELS_2_PLUS, OPT_freorder_blocks, NULL, 1 },
490     { OPT_LEVELS_2_PLUS, OPT_freorder_functions, NULL, 1 },
491     { OPT_LEVELS_2_PLUS, OPT_ftree_vrp, NULL, 1 },
492     { OPT_LEVELS_2_PLUS, OPT_ftree_builtin_call_dce, NULL, 1 },
493     { OPT_LEVELS_2_PLUS, OPT_ftree_pre, NULL, 1 },
494     { OPT_LEVELS_2_PLUS, OPT_ftree_switch_conversion, NULL, 1 },
495     { OPT_LEVELS_2_PLUS, OPT_fipa_cp, NULL, 1 },
496     { OPT_LEVELS_2_PLUS, OPT_fipa_cp_alignment, NULL, 1 },
497     { OPT_LEVELS_2_PLUS, OPT_fdevirtualize, NULL, 1 },
498     { OPT_LEVELS_2_PLUS, OPT_fdevirtualize_speculatively, NULL, 1 },
499     { OPT_LEVELS_2_PLUS, OPT_fipa_sra, NULL, 1 },
500     { OPT_LEVELS_2_PLUS, OPT_falign_loops, NULL, 1 },
501     { OPT_LEVELS_2_PLUS, OPT_falign_jumps, NULL, 1 },
502     { OPT_LEVELS_2_PLUS, OPT_falign_labels, NULL, 1 },
503     { OPT_LEVELS_2_PLUS, OPT_falign_functions, NULL, 1 },
504     { OPT_LEVELS_2_PLUS, OPT_ftree_tail_merge, NULL, 1 },
505     { OPT_LEVELS_2_PLUS, OPT_fvect_cost_model_, NULL, VECT_COST_MODEL_CHEAP },
506     { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_foptimize_strlen, NULL, 1 },
507     { OPT_LEVELS_2_PLUS, OPT_fhoist_adjacent_loads, NULL, 1 },
508     { OPT_LEVELS_2_PLUS, OPT_fipa_icf, NULL, 1 },
509     { OPT_LEVELS_2_PLUS, OPT_fisolate_erroneous_paths_dereference, NULL, 1 },
510     { OPT_LEVELS_2_PLUS, OPT_fipa_ra, NULL, 1 },
511     { OPT_LEVELS_2_PLUS, OPT_flra_remat, NULL, 1 },
512 
513     /* -O3 optimizations.  */
514     { OPT_LEVELS_3_PLUS, OPT_ftree_loop_distribute_patterns, NULL, 1 },
515     { OPT_LEVELS_3_PLUS, OPT_fpredictive_commoning, NULL, 1 },
516     /* Inlining of functions reducing size is a good idea with -Os
517        regardless of them being declared inline.  */
518     { OPT_LEVELS_3_PLUS_AND_SIZE, OPT_finline_functions, NULL, 1 },
519     { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_finline_functions_called_once, NULL, 1 },
520     { OPT_LEVELS_3_PLUS, OPT_funswitch_loops, NULL, 1 },
521     { OPT_LEVELS_3_PLUS, OPT_fgcse_after_reload, NULL, 1 },
522     { OPT_LEVELS_3_PLUS, OPT_ftree_loop_vectorize, NULL, 1 },
523     { OPT_LEVELS_3_PLUS, OPT_ftree_slp_vectorize, NULL, 1 },
524     { OPT_LEVELS_3_PLUS, OPT_fvect_cost_model_, NULL, VECT_COST_MODEL_DYNAMIC },
525     { OPT_LEVELS_3_PLUS, OPT_fipa_cp_clone, NULL, 1 },
526     { OPT_LEVELS_3_PLUS, OPT_ftree_partial_pre, NULL, 1 },
527 
528     /* -Ofast adds optimizations to -O3.  */
529     { OPT_LEVELS_FAST, OPT_ffast_math, NULL, 1 },
530 
531     { OPT_LEVELS_NONE, 0, NULL, 0 }
532   };
533 
534 /* Default the options in OPTS and OPTS_SET based on the optimization
535    settings in DECODED_OPTIONS and DECODED_OPTIONS_COUNT.  */
536 void
537 default_options_optimization (struct gcc_options *opts,
538 			      struct gcc_options *opts_set,
539 			      struct cl_decoded_option *decoded_options,
540 			      unsigned int decoded_options_count,
541 			      location_t loc,
542 			      unsigned int lang_mask,
543 			      const struct cl_option_handlers *handlers,
544 			      diagnostic_context *dc)
545 {
546   unsigned int i;
547   int opt2;
548 
549   /* Scan to see what optimization level has been specified.  That will
550      determine the default value of many flags.  */
551   for (i = 1; i < decoded_options_count; i++)
552     {
553       struct cl_decoded_option *opt = &decoded_options[i];
554       switch (opt->opt_index)
555 	{
556 	case OPT_O:
557 	  if (*opt->arg == '\0')
558 	    {
559 	      opts->x_optimize = 1;
560 	      opts->x_optimize_size = 0;
561 	      opts->x_optimize_fast = 0;
562 	      opts->x_optimize_debug = 0;
563 	    }
564 	  else
565 	    {
566 	      const int optimize_val = integral_argument (opt->arg);
567 	      if (optimize_val == -1)
568 		error_at (loc, "argument to %<-O%> should be a non-negative "
569 			       "integer, %<g%>, %<s%> or %<fast%>");
570 	      else
571 		{
572 		  opts->x_optimize = optimize_val;
573 		  if ((unsigned int) opts->x_optimize > 255)
574 		    opts->x_optimize = 255;
575 		  opts->x_optimize_size = 0;
576 		  opts->x_optimize_fast = 0;
577 		  opts->x_optimize_debug = 0;
578 		}
579 	    }
580 	  break;
581 
582 	case OPT_Os:
583 	  opts->x_optimize_size = 1;
584 
585 	  /* Optimizing for size forces optimize to be 2.  */
586 	  opts->x_optimize = 2;
587 	  opts->x_optimize_fast = 0;
588 	  opts->x_optimize_debug = 0;
589 	  break;
590 
591 	case OPT_Ofast:
592 	  /* -Ofast only adds flags to -O3.  */
593 	  opts->x_optimize_size = 0;
594 	  opts->x_optimize = 3;
595 	  opts->x_optimize_fast = 1;
596 	  opts->x_optimize_debug = 0;
597 	  break;
598 
599 	case OPT_Og:
600 	  /* -Og selects optimization level 1.  */
601 	  opts->x_optimize_size = 0;
602 	  opts->x_optimize = 1;
603 	  opts->x_optimize_fast = 0;
604 	  opts->x_optimize_debug = 1;
605 	  break;
606 
607 	default:
608 	  /* Ignore other options in this prescan.  */
609 	  break;
610 	}
611     }
612 
613   maybe_default_options (opts, opts_set, default_options_table,
614 			 opts->x_optimize, opts->x_optimize_size,
615 			 opts->x_optimize_fast, opts->x_optimize_debug,
616 			 lang_mask, handlers, loc, dc);
617 
618   /* -O2 param settings.  */
619   opt2 = (opts->x_optimize >= 2);
620 
621   /* Track fields in field-sensitive alias analysis.  */
622   maybe_set_param_value
623     (PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE,
624      opt2 ? 100 : default_param_value (PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE),
625      opts->x_param_values, opts_set->x_param_values);
626 
627   /* For -O1 only do loop invariant motion for very small loops.  */
628   maybe_set_param_value
629     (PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP,
630      opt2 ? default_param_value (PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP) : 1000,
631      opts->x_param_values, opts_set->x_param_values);
632 
633   /* At -Ofast, allow store motion to introduce potential race conditions.  */
634   maybe_set_param_value
635     (PARAM_ALLOW_STORE_DATA_RACES,
636      opts->x_optimize_fast ? 1
637      : default_param_value (PARAM_ALLOW_STORE_DATA_RACES),
638      opts->x_param_values, opts_set->x_param_values);
639 
640   if (opts->x_optimize_size)
641     /* We want to crossjump as much as possible.  */
642     maybe_set_param_value (PARAM_MIN_CROSSJUMP_INSNS, 1,
643 			   opts->x_param_values, opts_set->x_param_values);
644   else
645     maybe_set_param_value (PARAM_MIN_CROSSJUMP_INSNS,
646 			   default_param_value (PARAM_MIN_CROSSJUMP_INSNS),
647 			   opts->x_param_values, opts_set->x_param_values);
648 
649   /* Restrict the amount of work combine does at -Og while retaining
650      most of its useful transforms.  */
651   if (opts->x_optimize_debug)
652     maybe_set_param_value (PARAM_MAX_COMBINE_INSNS, 2,
653 			   opts->x_param_values, opts_set->x_param_values);
654 
655   /* Allow default optimizations to be specified on a per-machine basis.  */
656   maybe_default_options (opts, opts_set,
657 			 targetm_common.option_optimization_table,
658 			 opts->x_optimize, opts->x_optimize_size,
659 			 opts->x_optimize_fast, opts->x_optimize_debug,
660 			 lang_mask, handlers, loc, dc);
661 }
662 
663 /* After all options at LOC have been read into OPTS and OPTS_SET,
664    finalize settings of those options and diagnose incompatible
665    combinations.  */
666 void
667 finish_options (struct gcc_options *opts, struct gcc_options *opts_set,
668 		location_t loc)
669 {
670   enum unwind_info_type ui_except;
671 
672   if (opts->x_dump_base_name
673       && ! IS_ABSOLUTE_PATH (opts->x_dump_base_name)
674       && ! opts->x_dump_base_name_prefixed)
675     {
676       /* First try to make OPTS->X_DUMP_BASE_NAME relative to the
677 	 OPTS->X_DUMP_DIR_NAME directory.  Then try to make
678 	 OPTS->X_DUMP_BASE_NAME relative to the OPTS->X_AUX_BASE_NAME
679 	 directory, typically the directory to contain the object
680 	 file.  */
681       if (opts->x_dump_dir_name)
682 	opts->x_dump_base_name = opts_concat (opts->x_dump_dir_name,
683 					      opts->x_dump_base_name, NULL);
684       else if (opts->x_aux_base_name
685 	       && strcmp (opts->x_aux_base_name, HOST_BIT_BUCKET) != 0)
686 	{
687 	  const char *aux_base;
688 
689 	  base_of_path (opts->x_aux_base_name, &aux_base);
690 	  if (opts->x_aux_base_name != aux_base)
691 	    {
692 	      int dir_len = aux_base - opts->x_aux_base_name;
693 	      char *new_dump_base_name
694 		= XOBNEWVEC (&opts_obstack, char,
695 			     strlen (opts->x_dump_base_name) + dir_len + 1);
696 
697 	      /* Copy directory component from OPTS->X_AUX_BASE_NAME.  */
698 	      memcpy (new_dump_base_name, opts->x_aux_base_name, dir_len);
699 	      /* Append existing OPTS->X_DUMP_BASE_NAME.  */
700 	      strcpy (new_dump_base_name + dir_len, opts->x_dump_base_name);
701 	      opts->x_dump_base_name = new_dump_base_name;
702 	    }
703 	}
704 	opts->x_dump_base_name_prefixed = true;
705     }
706 
707   /* Handle related options for unit-at-a-time, toplevel-reorder, and
708      section-anchors.  */
709   if (!opts->x_flag_unit_at_a_time)
710     {
711       if (opts->x_flag_section_anchors && opts_set->x_flag_section_anchors)
712 	error_at (loc, "section anchors must be disabled when unit-at-a-time "
713 		  "is disabled");
714       opts->x_flag_section_anchors = 0;
715       if (opts->x_flag_toplevel_reorder == 1)
716 	error_at (loc, "toplevel reorder must be disabled when unit-at-a-time "
717 		  "is disabled");
718       opts->x_flag_toplevel_reorder = 0;
719     }
720 
721   if (opts->x_flag_tm && opts->x_flag_non_call_exceptions)
722     sorry ("transactional memory is not supported with non-call exceptions");
723 
724   /* Unless the user has asked for section anchors, we disable toplevel
725      reordering at -O0 to disable transformations that might be surprising
726      to end users and to get -fno-toplevel-reorder tested.  */
727   if (!opts->x_optimize
728       && opts->x_flag_toplevel_reorder == 2
729       && !(opts->x_flag_section_anchors && opts_set->x_flag_section_anchors))
730     {
731       opts->x_flag_toplevel_reorder = 0;
732       opts->x_flag_section_anchors = 0;
733     }
734   if (!opts->x_flag_toplevel_reorder)
735     {
736       if (opts->x_flag_section_anchors && opts_set->x_flag_section_anchors)
737 	error_at (loc, "section anchors must be disabled when toplevel reorder"
738 		  " is disabled");
739       opts->x_flag_section_anchors = 0;
740     }
741 
742   if (!opts->x_flag_opts_finished)
743     {
744       if (opts->x_flag_pie)
745 	opts->x_flag_pic = opts->x_flag_pie;
746       if (opts->x_flag_pic && !opts->x_flag_pie)
747 	opts->x_flag_shlib = 1;
748       opts->x_flag_opts_finished = true;
749     }
750 
751   if (opts->x_optimize == 0)
752     {
753       /* Inlining does not work if not optimizing,
754 	 so force it not to be done.  */
755       opts->x_warn_inline = 0;
756       opts->x_flag_no_inline = 1;
757     }
758 
759   /* The optimization to partition hot and cold basic blocks into separate
760      sections of the .o and executable files does not work (currently)
761      with exception handling.  This is because there is no support for
762      generating unwind info.  If opts->x_flag_exceptions is turned on
763      we need to turn off the partitioning optimization.  */
764 
765   ui_except = targetm_common.except_unwind_info (opts);
766 
767   if (opts->x_flag_exceptions
768       && opts->x_flag_reorder_blocks_and_partition
769       && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))
770     {
771       if (opts_set->x_flag_reorder_blocks_and_partition)
772         inform (loc,
773                 "-freorder-blocks-and-partition does not work "
774                 "with exceptions on this architecture");
775       opts->x_flag_reorder_blocks_and_partition = 0;
776       opts->x_flag_reorder_blocks = 1;
777     }
778 
779   /* If user requested unwind info, then turn off the partitioning
780      optimization.  */
781 
782   if (opts->x_flag_unwind_tables
783       && !targetm_common.unwind_tables_default
784       && opts->x_flag_reorder_blocks_and_partition
785       && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))
786     {
787       if (opts_set->x_flag_reorder_blocks_and_partition)
788         inform (loc,
789                 "-freorder-blocks-and-partition does not support "
790                 "unwind info on this architecture");
791       opts->x_flag_reorder_blocks_and_partition = 0;
792       opts->x_flag_reorder_blocks = 1;
793     }
794 
795   /* If the target requested unwind info, then turn off the partitioning
796      optimization with a different message.  Likewise, if the target does not
797      support named sections.  */
798 
799   if (opts->x_flag_reorder_blocks_and_partition
800       && (!targetm_common.have_named_sections
801 	  || (opts->x_flag_unwind_tables
802 	      && targetm_common.unwind_tables_default
803 	      && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))))
804     {
805       if (opts_set->x_flag_reorder_blocks_and_partition)
806         inform (loc,
807                 "-freorder-blocks-and-partition does not work "
808                 "on this architecture");
809       opts->x_flag_reorder_blocks_and_partition = 0;
810       opts->x_flag_reorder_blocks = 1;
811     }
812 
813   if (opts->x_flag_reorder_blocks_and_partition
814       && !opts_set->x_flag_reorder_functions)
815     opts->x_flag_reorder_functions = 1;
816 
817   /* Pipelining of outer loops is only possible when general pipelining
818      capabilities are requested.  */
819   if (!opts->x_flag_sel_sched_pipelining)
820     opts->x_flag_sel_sched_pipelining_outer_loops = 0;
821 
822   if (opts->x_flag_conserve_stack)
823     {
824       maybe_set_param_value (PARAM_LARGE_STACK_FRAME, 100,
825 			     opts->x_param_values, opts_set->x_param_values);
826       maybe_set_param_value (PARAM_STACK_FRAME_GROWTH, 40,
827 			     opts->x_param_values, opts_set->x_param_values);
828     }
829 
830   if (opts->x_flag_lto)
831     {
832 #ifdef ENABLE_LTO
833       opts->x_flag_generate_lto = 1;
834 
835       /* When generating IL, do not operate in whole-program mode.
836 	 Otherwise, symbols will be privatized too early, causing link
837 	 errors later.  */
838       opts->x_flag_whole_program = 0;
839 #else
840       error_at (loc, "LTO support has not been enabled in this configuration");
841 #endif
842       if (!opts->x_flag_fat_lto_objects
843 	  && (!HAVE_LTO_PLUGIN
844 	      || (opts_set->x_flag_use_linker_plugin
845 		  && !opts->x_flag_use_linker_plugin)))
846 	{
847 	  if (opts_set->x_flag_fat_lto_objects)
848             error_at (loc, "-fno-fat-lto-objects are supported only with linker plugin");
849 	  opts->x_flag_fat_lto_objects = 1;
850 	}
851     }
852 
853   /* We initialize opts->x_flag_split_stack to -1 so that targets can set a
854      default value if they choose based on other options.  */
855   if (opts->x_flag_split_stack == -1)
856     opts->x_flag_split_stack = 0;
857   else if (opts->x_flag_split_stack)
858     {
859       if (!targetm_common.supports_split_stack (true, opts))
860 	{
861 	  error_at (loc, "%<-fsplit-stack%> is not supported by "
862 		    "this compiler configuration");
863 	  opts->x_flag_split_stack = 0;
864 	}
865     }
866 
867   /* Tune vectorization related parametees according to cost model.  */
868   if (opts->x_flag_vect_cost_model == VECT_COST_MODEL_CHEAP)
869     {
870       maybe_set_param_value (PARAM_VECT_MAX_VERSION_FOR_ALIAS_CHECKS,
871             6, opts->x_param_values, opts_set->x_param_values);
872       maybe_set_param_value (PARAM_VECT_MAX_VERSION_FOR_ALIGNMENT_CHECKS,
873             0, opts->x_param_values, opts_set->x_param_values);
874       maybe_set_param_value (PARAM_VECT_MAX_PEELING_FOR_ALIGNMENT,
875             0, opts->x_param_values, opts_set->x_param_values);
876     }
877 
878   /* Set PARAM_MAX_STORES_TO_SINK to 0 if either vectorization or if-conversion
879      is disabled.  */
880   if ((!opts->x_flag_tree_loop_vectorize && !opts->x_flag_tree_slp_vectorize)
881        || !opts->x_flag_tree_loop_if_convert)
882     maybe_set_param_value (PARAM_MAX_STORES_TO_SINK, 0,
883                            opts->x_param_values, opts_set->x_param_values);
884 
885   /* The -gsplit-dwarf option requires -ggnu-pubnames.  */
886   if (opts->x_dwarf_split_debug_info)
887     opts->x_debug_generate_pub_sections = 2;
888 
889   /* Userspace and kernel ASan conflict with each other.  */
890 
891   if ((opts->x_flag_sanitize & SANITIZE_USER_ADDRESS)
892       && (opts->x_flag_sanitize & SANITIZE_KERNEL_ADDRESS))
893     error_at (loc,
894 	      "-fsanitize=address is incompatible with "
895 	      "-fsanitize=kernel-address");
896 
897   /* And with TSan.  */
898 
899   if ((opts->x_flag_sanitize & SANITIZE_ADDRESS)
900       && (opts->x_flag_sanitize & SANITIZE_THREAD))
901     error_at (loc,
902 	      "-fsanitize=address and -fsanitize=kernel-address "
903 	      "are incompatible with -fsanitize=thread");
904 
905   /* Error recovery is not allowed for ASan and TSan.  */
906 
907   if (opts->x_flag_sanitize_recover & SANITIZE_USER_ADDRESS)
908     error_at (loc, "-fsanitize-recover=address is not supported");
909 
910   if (opts->x_flag_sanitize_recover & SANITIZE_THREAD)
911     error_at (loc, "-fsanitize-recover=thread is not supported");
912 
913   if (opts->x_flag_sanitize_recover & SANITIZE_LEAK)
914     error_at (loc, "-fsanitize-recover=leak is not supported");
915 
916   /* When instrumenting the pointers, we don't want to remove
917      the null pointer checks.  */
918   if (opts->x_flag_sanitize & (SANITIZE_NULL | SANITIZE_NONNULL_ATTRIBUTE
919 				| SANITIZE_RETURNS_NONNULL_ATTRIBUTE))
920     opts->x_flag_delete_null_pointer_checks = 0;
921 
922   /* Aggressive compiler optimizations may cause false negatives.  */
923   if (opts->x_flag_sanitize)
924     {
925       opts->x_flag_aggressive_loop_optimizations = 0;
926       opts->x_flag_strict_overflow = 0;
927     }
928 }
929 
930 #define LEFT_COLUMN	27
931 
932 /* Output ITEM, of length ITEM_WIDTH, in the left column,
933    followed by word-wrapped HELP in a second column.  */
934 static void
935 wrap_help (const char *help,
936 	   const char *item,
937 	   unsigned int item_width,
938 	   unsigned int columns)
939 {
940   unsigned int col_width = LEFT_COLUMN;
941   unsigned int remaining, room, len;
942 
943   remaining = strlen (help);
944 
945   do
946     {
947       room = columns - 3 - MAX (col_width, item_width);
948       if (room > columns)
949 	room = 0;
950       len = remaining;
951 
952       if (room < len)
953 	{
954 	  unsigned int i;
955 
956 	  for (i = 0; help[i]; i++)
957 	    {
958 	      if (i >= room && len != remaining)
959 		break;
960 	      if (help[i] == ' ')
961 		len = i;
962 	      else if ((help[i] == '-' || help[i] == '/')
963 		       && help[i + 1] != ' '
964 		       && i > 0 && ISALPHA (help[i - 1]))
965 		len = i + 1;
966 	    }
967 	}
968 
969       printf ("  %-*.*s %.*s\n", col_width, item_width, item, len, help);
970       item_width = 0;
971       while (help[len] == ' ')
972 	len++;
973       help += len;
974       remaining -= len;
975     }
976   while (remaining);
977 }
978 
979 /* Print help for a specific front-end, etc.  */
980 static void
981 print_filtered_help (unsigned int include_flags,
982 		     unsigned int exclude_flags,
983 		     unsigned int any_flags,
984 		     unsigned int columns,
985 		     struct gcc_options *opts,
986 		     unsigned int lang_mask)
987 {
988   unsigned int i;
989   const char *help;
990   bool found = false;
991   bool displayed = false;
992   char new_help[128];
993 
994   if (include_flags == CL_PARAMS)
995     {
996       for (i = 0; i < LAST_PARAM; i++)
997 	{
998 	  const char *param = compiler_params[i].option;
999 
1000 	  help = compiler_params[i].help;
1001 	  if (help == NULL || *help == '\0')
1002 	    {
1003 	      if (exclude_flags & CL_UNDOCUMENTED)
1004 		continue;
1005 	      help = undocumented_msg;
1006 	    }
1007 
1008 	  /* Get the translation.  */
1009 	  help = _(help);
1010 
1011 	  if (!opts->x_quiet_flag)
1012 	    {
1013 	      snprintf (new_help, sizeof (new_help),
1014 			_("default %d minimum %d maximum %d"),
1015 			compiler_params[i].default_value,
1016 			compiler_params[i].min_value,
1017 			compiler_params[i].max_value);
1018 	      help = new_help;
1019 	    }
1020 	  wrap_help (help, param, strlen (param), columns);
1021 	}
1022       putchar ('\n');
1023       return;
1024     }
1025 
1026   if (!opts->x_help_printed)
1027     opts->x_help_printed = XCNEWVAR (char, cl_options_count);
1028 
1029   if (!opts->x_help_enum_printed)
1030     opts->x_help_enum_printed = XCNEWVAR (char, cl_enums_count);
1031 
1032   for (i = 0; i < cl_options_count; i++)
1033     {
1034       const struct cl_option *option = cl_options + i;
1035       unsigned int len;
1036       const char *opt;
1037       const char *tab;
1038 
1039       if (include_flags == 0
1040 	  || ((option->flags & include_flags) != include_flags))
1041 	{
1042 	  if ((option->flags & any_flags) == 0)
1043 	    continue;
1044 	}
1045 
1046       /* Skip unwanted switches.  */
1047       if ((option->flags & exclude_flags) != 0)
1048 	continue;
1049 
1050       /* The driver currently prints its own help text.  */
1051       if ((option->flags & CL_DRIVER) != 0
1052 	  && (option->flags & (((1U << cl_lang_count) - 1)
1053 			       | CL_COMMON | CL_TARGET)) == 0)
1054 	continue;
1055 
1056       found = true;
1057       /* Skip switches that have already been printed.  */
1058       if (opts->x_help_printed[i])
1059 	continue;
1060 
1061       opts->x_help_printed[i] = true;
1062 
1063       help = option->help;
1064       if (help == NULL)
1065 	{
1066 	  if (exclude_flags & CL_UNDOCUMENTED)
1067 	    continue;
1068 	  help = undocumented_msg;
1069 	}
1070 
1071       /* Get the translation.  */
1072       help = _(help);
1073 
1074       /* Find the gap between the name of the
1075 	 option and its descriptive text.  */
1076       tab = strchr (help, '\t');
1077       if (tab)
1078 	{
1079 	  len = tab - help;
1080 	  opt = help;
1081 	  help = tab + 1;
1082 	}
1083       else
1084 	{
1085 	  opt = option->opt_text;
1086 	  len = strlen (opt);
1087 	}
1088 
1089       /* With the -Q option enabled we change the descriptive text associated
1090 	 with an option to be an indication of its current setting.  */
1091       if (!opts->x_quiet_flag)
1092 	{
1093 	  void *flag_var = option_flag_var (i, opts);
1094 
1095 	  if (len < (LEFT_COLUMN + 2))
1096 	    strcpy (new_help, "\t\t");
1097 	  else
1098 	    strcpy (new_help, "\t");
1099 
1100 	  if (flag_var != NULL
1101 	      && option->var_type != CLVC_DEFER)
1102 	    {
1103 	      if (option->flags & CL_JOINED)
1104 		{
1105 		  if (option->var_type == CLVC_STRING)
1106 		    {
1107 		      if (* (const char **) flag_var != NULL)
1108 			snprintf (new_help + strlen (new_help),
1109 				  sizeof (new_help) - strlen (new_help),
1110 				  "%s", * (const char **) flag_var);
1111 		    }
1112 		  else if (option->var_type == CLVC_ENUM)
1113 		    {
1114 		      const struct cl_enum *e = &cl_enums[option->var_enum];
1115 		      int value;
1116 		      const char *arg = NULL;
1117 
1118 		      value = e->get (flag_var);
1119 		      enum_value_to_arg (e->values, &arg, value, lang_mask);
1120 		      if (arg == NULL)
1121 			arg = _("[default]");
1122 		      snprintf (new_help + strlen (new_help),
1123 				sizeof (new_help) - strlen (new_help),
1124 				"%s", arg);
1125 		    }
1126 		  else
1127 		    sprintf (new_help + strlen (new_help),
1128 			     "%#x", * (int *) flag_var);
1129 		}
1130 	      else
1131 		strcat (new_help, option_enabled (i, opts)
1132 			? _("[enabled]") : _("[disabled]"));
1133 	    }
1134 
1135 	  help = new_help;
1136 	}
1137 
1138       wrap_help (help, opt, len, columns);
1139       displayed = true;
1140 
1141       if (option->var_type == CLVC_ENUM
1142 	  && opts->x_help_enum_printed[option->var_enum] != 2)
1143 	opts->x_help_enum_printed[option->var_enum] = 1;
1144     }
1145 
1146   if (! found)
1147     {
1148       unsigned int langs = include_flags & CL_LANG_ALL;
1149 
1150       if (langs == 0)
1151 	printf (_(" No options with the desired characteristics were found\n"));
1152       else
1153 	{
1154 	  unsigned int i;
1155 
1156 	  /* PR 31349: Tell the user how to see all of the
1157 	     options supported by a specific front end.  */
1158 	  for (i = 0; (1U << i) < CL_LANG_ALL; i ++)
1159 	    if ((1U << i) & langs)
1160 	      printf (_(" None found.  Use --help=%s to show *all* the options supported by the %s front-end\n"),
1161 		      lang_names[i], lang_names[i]);
1162 	}
1163 
1164     }
1165   else if (! displayed)
1166     printf (_(" All options with the desired characteristics have already been displayed\n"));
1167 
1168   putchar ('\n');
1169 
1170   /* Print details of enumerated option arguments, if those
1171      enumerations have help text headings provided.  If no help text
1172      is provided, presume that the possible values are listed in the
1173      help text for the relevant options.  */
1174   for (i = 0; i < cl_enums_count; i++)
1175     {
1176       unsigned int j, pos;
1177 
1178       if (opts->x_help_enum_printed[i] != 1)
1179 	continue;
1180       if (cl_enums[i].help == NULL)
1181 	continue;
1182       printf ("  %s\n    ", _(cl_enums[i].help));
1183       pos = 4;
1184       for (j = 0; cl_enums[i].values[j].arg != NULL; j++)
1185 	{
1186 	  unsigned int len = strlen (cl_enums[i].values[j].arg);
1187 
1188 	  if (pos > 4 && pos + 1 + len <= columns)
1189 	    {
1190 	      printf (" %s", cl_enums[i].values[j].arg);
1191 	      pos += 1 + len;
1192 	    }
1193 	  else
1194 	    {
1195 	      if (pos > 4)
1196 		{
1197 		  printf ("\n    ");
1198 		  pos = 4;
1199 		}
1200 	      printf ("%s", cl_enums[i].values[j].arg);
1201 	      pos += len;
1202 	    }
1203 	}
1204       printf ("\n\n");
1205       opts->x_help_enum_printed[i] = 2;
1206     }
1207 }
1208 
1209 /* Display help for a specified type of option.
1210    The options must have ALL of the INCLUDE_FLAGS set
1211    ANY of the flags in the ANY_FLAGS set
1212    and NONE of the EXCLUDE_FLAGS set.  The current option state is in
1213    OPTS; LANG_MASK is used for interpreting enumerated option state.  */
1214 static void
1215 print_specific_help (unsigned int include_flags,
1216 		     unsigned int exclude_flags,
1217 		     unsigned int any_flags,
1218 		     struct gcc_options *opts,
1219 		     unsigned int lang_mask)
1220 {
1221   unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1222   const char * description = NULL;
1223   const char * descrip_extra = "";
1224   size_t i;
1225   unsigned int flag;
1226 
1227   /* Sanity check: Make sure that we do not have more
1228      languages than we have bits available to enumerate them.  */
1229   gcc_assert ((1U << cl_lang_count) <= CL_MIN_OPTION_CLASS);
1230 
1231   /* If we have not done so already, obtain
1232      the desired maximum width of the output.  */
1233   if (opts->x_help_columns == 0)
1234     {
1235       opts->x_help_columns = get_terminal_width ();
1236       if (opts->x_help_columns == INT_MAX)
1237 	/* Use a reasonable default.  */
1238 	opts->x_help_columns = 80;
1239     }
1240 
1241   /* Decide upon the title for the options that we are going to display.  */
1242   for (i = 0, flag = 1; flag <= CL_MAX_OPTION_CLASS; flag <<= 1, i ++)
1243     {
1244       switch (flag & include_flags)
1245 	{
1246 	case 0:
1247 	case CL_DRIVER:
1248 	  break;
1249 
1250 	case CL_TARGET:
1251 	  description = _("The following options are target specific");
1252 	  break;
1253 	case CL_WARNING:
1254 	  description = _("The following options control compiler warning messages");
1255 	  break;
1256 	case CL_OPTIMIZATION:
1257 	  description = _("The following options control optimizations");
1258 	  break;
1259 	case CL_COMMON:
1260 	  description = _("The following options are language-independent");
1261 	  break;
1262 	case CL_PARAMS:
1263 	  description = _("The --param option recognizes the following as parameters");
1264 	  break;
1265 	default:
1266 	  if (i >= cl_lang_count)
1267 	    break;
1268 	  if (exclude_flags & all_langs_mask)
1269 	    description = _("The following options are specific to just the language ");
1270 	  else
1271 	    description = _("The following options are supported by the language ");
1272 	  descrip_extra = lang_names [i];
1273 	  break;
1274 	}
1275     }
1276 
1277   if (description == NULL)
1278     {
1279       if (any_flags == 0)
1280 	{
1281 	  if (include_flags & CL_UNDOCUMENTED)
1282 	    description = _("The following options are not documented");
1283 	  else if (include_flags & CL_SEPARATE)
1284 	    description = _("The following options take separate arguments");
1285 	  else if (include_flags & CL_JOINED)
1286 	    description = _("The following options take joined arguments");
1287 	  else
1288 	    {
1289 	      internal_error ("unrecognized include_flags 0x%x passed to print_specific_help",
1290 			      include_flags);
1291 	      return;
1292 	    }
1293 	}
1294       else
1295 	{
1296 	  if (any_flags & all_langs_mask)
1297 	    description = _("The following options are language-related");
1298 	  else
1299 	    description = _("The following options are language-independent");
1300 	}
1301     }
1302 
1303   printf ("%s%s:\n", description, descrip_extra);
1304   print_filtered_help (include_flags, exclude_flags, any_flags,
1305 		       opts->x_help_columns, opts, lang_mask);
1306 }
1307 
1308 /* Enable FDO-related flags.  */
1309 
1310 static void
1311 enable_fdo_optimizations (struct gcc_options *opts,
1312 			  struct gcc_options *opts_set,
1313 			  int value)
1314 {
1315   if (!opts_set->x_flag_branch_probabilities)
1316     opts->x_flag_branch_probabilities = value;
1317   if (!opts_set->x_flag_profile_values)
1318     opts->x_flag_profile_values = value;
1319   if (!opts_set->x_flag_unroll_loops)
1320     opts->x_flag_unroll_loops = value;
1321   if (!opts_set->x_flag_peel_loops)
1322     opts->x_flag_peel_loops = value;
1323   if (!opts_set->x_flag_tracer)
1324     opts->x_flag_tracer = value;
1325   if (!opts_set->x_flag_value_profile_transformations)
1326     opts->x_flag_value_profile_transformations = value;
1327   if (!opts_set->x_flag_inline_functions)
1328     opts->x_flag_inline_functions = value;
1329   if (!opts_set->x_flag_ipa_cp)
1330     opts->x_flag_ipa_cp = value;
1331   if (!opts_set->x_flag_ipa_cp_clone
1332       && value && opts->x_flag_ipa_cp)
1333     opts->x_flag_ipa_cp_clone = value;
1334   if (!opts_set->x_flag_ipa_cp_alignment
1335       && value && opts->x_flag_ipa_cp)
1336     opts->x_flag_ipa_cp_alignment = value;
1337   if (!opts_set->x_flag_predictive_commoning)
1338     opts->x_flag_predictive_commoning = value;
1339   if (!opts_set->x_flag_unswitch_loops)
1340     opts->x_flag_unswitch_loops = value;
1341   if (!opts_set->x_flag_gcse_after_reload)
1342     opts->x_flag_gcse_after_reload = value;
1343   if (!opts_set->x_flag_tree_loop_vectorize
1344       && !opts_set->x_flag_tree_vectorize)
1345     opts->x_flag_tree_loop_vectorize = value;
1346   if (!opts_set->x_flag_tree_slp_vectorize
1347       && !opts_set->x_flag_tree_vectorize)
1348     opts->x_flag_tree_slp_vectorize = value;
1349   if (!opts_set->x_flag_vect_cost_model)
1350     opts->x_flag_vect_cost_model = VECT_COST_MODEL_DYNAMIC;
1351   if (!opts_set->x_flag_tree_loop_distribute_patterns)
1352     opts->x_flag_tree_loop_distribute_patterns = value;
1353 }
1354 
1355 /* Handle target- and language-independent options.  Return zero to
1356    generate an "unknown option" message.  Only options that need
1357    extra handling need to be listed here; if you simply want
1358    DECODED->value assigned to a variable, it happens automatically.  */
1359 
1360 bool
1361 common_handle_option (struct gcc_options *opts,
1362 		      struct gcc_options *opts_set,
1363 		      const struct cl_decoded_option *decoded,
1364 		      unsigned int lang_mask, int kind ATTRIBUTE_UNUSED,
1365 		      location_t loc,
1366 		      const struct cl_option_handlers *handlers,
1367 		      diagnostic_context *dc)
1368 {
1369   size_t scode = decoded->opt_index;
1370   const char *arg = decoded->arg;
1371   int value = decoded->value;
1372   enum opt_code code = (enum opt_code) scode;
1373 
1374   gcc_assert (decoded->canonical_option_num_elements <= 2);
1375 
1376   switch (code)
1377     {
1378     case OPT__param:
1379       handle_param (opts, opts_set, loc, arg);
1380       break;
1381 
1382     case OPT__help:
1383       {
1384 	unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1385 	unsigned int undoc_mask;
1386 	unsigned int i;
1387 
1388 	if (lang_mask == CL_DRIVER)
1389 	  break;;
1390 
1391 	undoc_mask = ((opts->x_verbose_flag | opts->x_extra_warnings)
1392 		      ? 0
1393 		      : CL_UNDOCUMENTED);
1394 	/* First display any single language specific options.  */
1395 	for (i = 0; i < cl_lang_count; i++)
1396 	  print_specific_help
1397 	    (1U << i, (all_langs_mask & (~ (1U << i))) | undoc_mask, 0, opts,
1398 	     lang_mask);
1399 	/* Next display any multi language specific options.  */
1400 	print_specific_help (0, undoc_mask, all_langs_mask, opts, lang_mask);
1401 	/* Then display any remaining, non-language options.  */
1402 	for (i = CL_MIN_OPTION_CLASS; i <= CL_MAX_OPTION_CLASS; i <<= 1)
1403 	  if (i != CL_DRIVER)
1404 	    print_specific_help (i, undoc_mask, 0, opts, lang_mask);
1405 	opts->x_exit_after_options = true;
1406 	break;
1407       }
1408 
1409     case OPT__target_help:
1410       if (lang_mask == CL_DRIVER)
1411 	break;
1412 
1413       print_specific_help (CL_TARGET, CL_UNDOCUMENTED, 0, opts, lang_mask);
1414       opts->x_exit_after_options = true;
1415       break;
1416 
1417     case OPT__help_:
1418       {
1419 	const char * a = arg;
1420 	unsigned int include_flags = 0;
1421 	/* Note - by default we include undocumented options when listing
1422 	   specific classes.  If you only want to see documented options
1423 	   then add ",^undocumented" to the --help= option.  E.g.:
1424 
1425 	   --help=target,^undocumented  */
1426 	unsigned int exclude_flags = 0;
1427 
1428 	if (lang_mask == CL_DRIVER)
1429 	  break;
1430 
1431 	/* Walk along the argument string, parsing each word in turn.
1432 	   The format is:
1433 	   arg = [^]{word}[,{arg}]
1434 	   word = {optimizers|target|warnings|undocumented|
1435 		   params|common|<language>}  */
1436 	while (* a != 0)
1437 	  {
1438 	    static const struct
1439 	    {
1440 	      const char * string;
1441 	      unsigned int flag;
1442 	    }
1443 	    specifics[] =
1444 	    {
1445 	      { "optimizers", CL_OPTIMIZATION },
1446 	      { "target", CL_TARGET },
1447 	      { "warnings", CL_WARNING },
1448 	      { "undocumented", CL_UNDOCUMENTED },
1449 	      { "params", CL_PARAMS },
1450 	      { "joined", CL_JOINED },
1451 	      { "separate", CL_SEPARATE },
1452 	      { "common", CL_COMMON },
1453 	      { NULL, 0 }
1454 	    };
1455 	    unsigned int * pflags;
1456 	    const char * comma;
1457 	    unsigned int lang_flag, specific_flag;
1458 	    unsigned int len;
1459 	    unsigned int i;
1460 
1461 	    if (* a == '^')
1462 	      {
1463 		++ a;
1464 		pflags = & exclude_flags;
1465 	      }
1466 	    else
1467 	      pflags = & include_flags;
1468 
1469 	    comma = strchr (a, ',');
1470 	    if (comma == NULL)
1471 	      len = strlen (a);
1472 	    else
1473 	      len = comma - a;
1474 	    if (len == 0)
1475 	      {
1476 		a = comma + 1;
1477 		continue;
1478 	      }
1479 
1480 	    /* Check to see if the string matches an option class name.  */
1481 	    for (i = 0, specific_flag = 0; specifics[i].string != NULL; i++)
1482 	      if (strncasecmp (a, specifics[i].string, len) == 0)
1483 		{
1484 		  specific_flag = specifics[i].flag;
1485 		  break;
1486 		}
1487 
1488 	    /* Check to see if the string matches a language name.
1489 	       Note - we rely upon the alpha-sorted nature of the entries in
1490 	       the lang_names array, specifically that shorter names appear
1491 	       before their longer variants.  (i.e. C before C++).  That way
1492 	       when we are attempting to match --help=c for example we will
1493 	       match with C first and not C++.  */
1494 	    for (i = 0, lang_flag = 0; i < cl_lang_count; i++)
1495 	      if (strncasecmp (a, lang_names[i], len) == 0)
1496 		{
1497 		  lang_flag = 1U << i;
1498 		  break;
1499 		}
1500 
1501 	    if (specific_flag != 0)
1502 	      {
1503 		if (lang_flag == 0)
1504 		  * pflags |= specific_flag;
1505 		else
1506 		  {
1507 		    /* The option's argument matches both the start of a
1508 		       language name and the start of an option class name.
1509 		       We have a special case for when the user has
1510 		       specified "--help=c", but otherwise we have to issue
1511 		       a warning.  */
1512 		    if (strncasecmp (a, "c", len) == 0)
1513 		      * pflags |= lang_flag;
1514 		    else
1515 		      warning_at (loc, 0,
1516 				  "--help argument %q.*s is ambiguous, "
1517 				  "please be more specific",
1518 				  len, a);
1519 		  }
1520 	      }
1521 	    else if (lang_flag != 0)
1522 	      * pflags |= lang_flag;
1523 	    else
1524 	      warning_at (loc, 0,
1525 			  "unrecognized argument to --help= option: %q.*s",
1526 			  len, a);
1527 
1528 	    if (comma == NULL)
1529 	      break;
1530 	    a = comma + 1;
1531 	  }
1532 
1533 	if (include_flags)
1534 	  print_specific_help (include_flags, exclude_flags, 0, opts,
1535 			       lang_mask);
1536 	opts->x_exit_after_options = true;
1537 	break;
1538       }
1539 
1540     case OPT__version:
1541       if (lang_mask == CL_DRIVER)
1542 	break;
1543 
1544       opts->x_exit_after_options = true;
1545       break;
1546 
1547     case OPT_fsanitize_:
1548     case OPT_fsanitize_recover_:
1549       {
1550 	const char *p = arg;
1551 	unsigned int *flag
1552 	  = code == OPT_fsanitize_ ? &opts->x_flag_sanitize
1553 	  : &opts->x_flag_sanitize_recover;
1554 	while (*p != 0)
1555 	  {
1556 	    static const struct
1557 	    {
1558 	      const char *const name;
1559 	      unsigned int flag;
1560 	      size_t len;
1561 	    } spec[] =
1562 	    {
1563 	      { "address", SANITIZE_ADDRESS | SANITIZE_USER_ADDRESS,
1564 		sizeof "address" - 1 },
1565 	      { "kernel-address", SANITIZE_ADDRESS | SANITIZE_KERNEL_ADDRESS,
1566 		sizeof "kernel-address" - 1 },
1567 	      { "thread", SANITIZE_THREAD, sizeof "thread" - 1 },
1568 	      { "leak", SANITIZE_LEAK, sizeof "leak" - 1 },
1569 	      { "shift", SANITIZE_SHIFT, sizeof "shift" - 1 },
1570 	      { "integer-divide-by-zero", SANITIZE_DIVIDE,
1571 		sizeof "integer-divide-by-zero" - 1 },
1572 	      { "undefined", SANITIZE_UNDEFINED, sizeof "undefined" - 1 },
1573 	      { "unreachable", SANITIZE_UNREACHABLE,
1574 		sizeof "unreachable" - 1 },
1575 	      { "vla-bound", SANITIZE_VLA, sizeof "vla-bound" - 1 },
1576 	      { "return", SANITIZE_RETURN, sizeof "return" - 1 },
1577 	      { "null", SANITIZE_NULL, sizeof "null" - 1 },
1578 	      { "signed-integer-overflow", SANITIZE_SI_OVERFLOW,
1579 		sizeof "signed-integer-overflow" -1 },
1580 	      { "bool", SANITIZE_BOOL, sizeof "bool" - 1 },
1581 	      { "enum", SANITIZE_ENUM, sizeof "enum" - 1 },
1582 	      { "float-divide-by-zero", SANITIZE_FLOAT_DIVIDE,
1583 		sizeof "float-divide-by-zero" - 1 },
1584 	      { "float-cast-overflow", SANITIZE_FLOAT_CAST,
1585 		sizeof "float-cast-overflow" - 1 },
1586 	      { "bounds", SANITIZE_BOUNDS, sizeof "bounds" - 1 },
1587 	      { "alignment", SANITIZE_ALIGNMENT, sizeof "alignment" - 1 },
1588 	      { "nonnull-attribute", SANITIZE_NONNULL_ATTRIBUTE,
1589 		sizeof "nonnull-attribute" - 1 },
1590 	      { "returns-nonnull-attribute",
1591 		SANITIZE_RETURNS_NONNULL_ATTRIBUTE,
1592 		sizeof "returns-nonnull-attribute" - 1 },
1593 	      { "object-size", SANITIZE_OBJECT_SIZE,
1594 		sizeof "object-size" - 1 },
1595 	      { "vptr", SANITIZE_VPTR, sizeof "vptr" - 1 },
1596 	      { "all", ~0, sizeof "all" - 1 },
1597 	      { NULL, 0, 0 }
1598 	    };
1599 	    const char *comma;
1600 	    size_t len, i;
1601 	    bool found = false;
1602 
1603 	    comma = strchr (p, ',');
1604 	    if (comma == NULL)
1605 	      len = strlen (p);
1606 	    else
1607 	      len = comma - p;
1608 	    if (len == 0)
1609 	      {
1610 		p = comma + 1;
1611 		continue;
1612 	      }
1613 
1614 	    /* Check to see if the string matches an option class name.  */
1615 	    for (i = 0; spec[i].name != NULL; ++i)
1616 	      if (len == spec[i].len
1617 		  && memcmp (p, spec[i].name, len) == 0)
1618 		{
1619 		  /* Handle both -fsanitize and -fno-sanitize cases.  */
1620 		  if (value && spec[i].flag == ~0U)
1621 		    {
1622 		      if (code == OPT_fsanitize_)
1623 			error_at (loc, "-fsanitize=all option is not valid");
1624 		      else
1625 			*flag |= ~(SANITIZE_USER_ADDRESS | SANITIZE_THREAD
1626 				   | SANITIZE_LEAK);
1627 		    }
1628 		  else if (value)
1629 		    *flag |= spec[i].flag;
1630 		  else
1631 		    *flag &= ~spec[i].flag;
1632 		  found = true;
1633 		  break;
1634 		}
1635 
1636 	    if (! found)
1637 	      error_at (loc,
1638 			"unrecognized argument to -fsanitize%s= option: %q.*s",
1639 			code == OPT_fsanitize_ ? "" : "-recover", (int) len, p);
1640 
1641 	    if (comma == NULL)
1642 	      break;
1643 	    p = comma + 1;
1644 	  }
1645 
1646 	if (code != OPT_fsanitize_)
1647 	  break;
1648 
1649 	/* Kernel ASan implies normal ASan but does not yet support
1650 	   all features.  */
1651 	if (opts->x_flag_sanitize & SANITIZE_KERNEL_ADDRESS)
1652 	  {
1653 	    maybe_set_param_value (PARAM_ASAN_INSTRUMENTATION_WITH_CALL_THRESHOLD, 0,
1654 				   opts->x_param_values,
1655 				   opts_set->x_param_values);
1656 	    maybe_set_param_value (PARAM_ASAN_GLOBALS, 0,
1657 				   opts->x_param_values,
1658 				   opts_set->x_param_values);
1659 	    maybe_set_param_value (PARAM_ASAN_STACK, 0,
1660 				   opts->x_param_values,
1661 				   opts_set->x_param_values);
1662 	    maybe_set_param_value (PARAM_ASAN_USE_AFTER_RETURN, 0,
1663 				   opts->x_param_values,
1664 				   opts_set->x_param_values);
1665 	  }
1666 
1667 	break;
1668       }
1669 
1670     case OPT_fasan_shadow_offset_:
1671       /* Deferred.  */
1672       break;
1673 
1674     case OPT_fsanitize_recover:
1675       if (value)
1676 	opts->x_flag_sanitize_recover
1677 	  |= SANITIZE_UNDEFINED | SANITIZE_NONDEFAULT;
1678       else
1679 	opts->x_flag_sanitize_recover
1680 	  &= ~(SANITIZE_UNDEFINED | SANITIZE_NONDEFAULT);
1681       break;
1682 
1683     case OPT_O:
1684     case OPT_Os:
1685     case OPT_Ofast:
1686     case OPT_Og:
1687       /* Currently handled in a prescan.  */
1688       break;
1689 
1690     case OPT_Werror:
1691       dc->warning_as_error_requested = value;
1692       break;
1693 
1694     case OPT_Werror_:
1695       if (lang_mask == CL_DRIVER)
1696 	break;
1697 
1698       enable_warning_as_error (arg, value, lang_mask, handlers,
1699 			       opts, opts_set, loc, dc);
1700       break;
1701 
1702     case OPT_Wlarger_than_:
1703       opts->x_larger_than_size = value;
1704       opts->x_warn_larger_than = value != -1;
1705       break;
1706 
1707     case OPT_Wfatal_errors:
1708       dc->fatal_errors = value;
1709       break;
1710 
1711     case OPT_Wframe_larger_than_:
1712       opts->x_frame_larger_than_size = value;
1713       opts->x_warn_frame_larger_than = value != -1;
1714       break;
1715 
1716     case OPT_Wstack_usage_:
1717       opts->x_warn_stack_usage = value;
1718       opts->x_flag_stack_usage_info = value != -1;
1719       break;
1720 
1721     case OPT_Wstrict_aliasing:
1722       set_Wstrict_aliasing (opts, value);
1723       break;
1724 
1725     case OPT_Wstrict_overflow:
1726       opts->x_warn_strict_overflow = (value
1727 				      ? (int) WARN_STRICT_OVERFLOW_CONDITIONAL
1728 				      : 0);
1729       break;
1730 
1731     case OPT_Wsystem_headers:
1732       dc->dc_warn_system_headers = value;
1733       break;
1734 
1735     case OPT_aux_info:
1736       opts->x_flag_gen_aux_info = 1;
1737       break;
1738 
1739     case OPT_auxbase_strip:
1740       {
1741 	char *tmp = xstrdup (arg);
1742 	strip_off_ending (tmp, strlen (tmp));
1743 	if (tmp[0])
1744 	  opts->x_aux_base_name = tmp;
1745 	else
1746 	  free (tmp);
1747       }
1748       break;
1749 
1750     case OPT_d:
1751       decode_d_option (arg, opts, loc, dc);
1752       break;
1753 
1754     case OPT_fcall_used_:
1755     case OPT_fcall_saved_:
1756       /* Deferred.  */
1757       break;
1758 
1759     case OPT_fdbg_cnt_:
1760     case OPT_fdbg_cnt_list:
1761       /* Deferred.  */
1762       break;
1763 
1764     case OPT_fdebug_prefix_map_:
1765       /* Deferred.  */
1766       break;
1767 
1768     case OPT_fdebug_regex_map_:
1769       /* Deferred.  */
1770       break;
1771 
1772     case OPT_fdiagnostics_show_location_:
1773       diagnostic_prefixing_rule (dc) = (diagnostic_prefixing_rule_t) value;
1774       break;
1775 
1776     case OPT_fdiagnostics_show_caret:
1777       dc->show_caret = value;
1778       break;
1779 
1780     case OPT_fdiagnostics_color_:
1781       diagnostic_color_init (dc, value);
1782       break;
1783 
1784     case OPT_fdiagnostics_show_option:
1785       dc->show_option_requested = value;
1786       break;
1787 
1788     case OPT_fdump_:
1789       /* Deferred.  */
1790       break;
1791 
1792     case OPT_ffast_math:
1793       set_fast_math_flags (opts, value);
1794       break;
1795 
1796     case OPT_funsafe_math_optimizations:
1797       set_unsafe_math_optimizations_flags (opts, value);
1798       break;
1799 
1800     case OPT_ffixed_:
1801       /* Deferred.  */
1802       break;
1803 
1804     case OPT_finline_limit_:
1805       set_param_value ("max-inline-insns-single", value / 2,
1806 		       opts->x_param_values, opts_set->x_param_values);
1807       set_param_value ("max-inline-insns-auto", value / 2,
1808 		       opts->x_param_values, opts_set->x_param_values);
1809       break;
1810 
1811     case OPT_finstrument_functions_exclude_function_list_:
1812       add_comma_separated_to_vector
1813 	(&opts->x_flag_instrument_functions_exclude_functions, arg);
1814       break;
1815 
1816     case OPT_finstrument_functions_exclude_file_list_:
1817       add_comma_separated_to_vector
1818 	(&opts->x_flag_instrument_functions_exclude_files, arg);
1819       break;
1820 
1821     case OPT_fmessage_length_:
1822       pp_set_line_maximum_length (dc->printer, value);
1823       diagnostic_set_caret_max_width (dc, value);
1824       break;
1825 
1826     case OPT_fopt_info:
1827     case OPT_fopt_info_:
1828       /* Deferred.  */
1829       break;
1830 
1831     case OPT_foffload_:
1832       /* Deferred.  */
1833       break;
1834 
1835 #ifndef ACCEL_COMPILER
1836     case OPT_foffload_abi_:
1837       error_at (loc, "-foffload-abi option can be specified only for "
1838 		"offload compiler");
1839       break;
1840 #endif
1841 
1842     case OPT_fpack_struct_:
1843       if (value <= 0 || (value & (value - 1)) || value > 16)
1844 	error_at (loc,
1845 		  "structure alignment must be a small power of two, not %d",
1846 		  value);
1847       else
1848 	opts->x_initial_max_fld_align = value;
1849       break;
1850 
1851     case OPT_fplugin_:
1852     case OPT_fplugin_arg_:
1853       /* Deferred.  */
1854       break;
1855 
1856     case OPT_fprofile_use_:
1857       opts->x_profile_data_prefix = xstrdup (arg);
1858       opts->x_flag_profile_use = true;
1859       value = true;
1860       /* No break here - do -fprofile-use processing. */
1861     case OPT_fprofile_use:
1862       enable_fdo_optimizations (opts, opts_set, value);
1863       if (!opts_set->x_flag_profile_reorder_functions)
1864 	  opts->x_flag_profile_reorder_functions = value;
1865 	/* Indirect call profiling should do all useful transformations
1866 	   speculative devirtualization does.  */
1867       if (!opts_set->x_flag_devirtualize_speculatively
1868 	  && opts->x_flag_value_profile_transformations)
1869 	opts->x_flag_devirtualize_speculatively = false;
1870       break;
1871 
1872     case OPT_fauto_profile_:
1873       opts->x_auto_profile_file = xstrdup (arg);
1874       opts->x_flag_auto_profile = true;
1875       value = true;
1876       /* No break here - do -fauto-profile processing. */
1877     case OPT_fauto_profile:
1878       enable_fdo_optimizations (opts, opts_set, value);
1879       if (!opts_set->x_flag_profile_correction)
1880 	opts->x_flag_profile_correction = value;
1881       maybe_set_param_value (
1882 	PARAM_EARLY_INLINER_MAX_ITERATIONS, 10,
1883 	opts->x_param_values, opts_set->x_param_values);
1884       break;
1885 
1886     case OPT_fprofile_generate_:
1887       opts->x_profile_data_prefix = xstrdup (arg);
1888       value = true;
1889       /* No break here - do -fprofile-generate processing. */
1890     case OPT_fprofile_generate:
1891       if (!opts_set->x_profile_arc_flag)
1892 	opts->x_profile_arc_flag = value;
1893       if (!opts_set->x_flag_profile_values)
1894 	opts->x_flag_profile_values = value;
1895       if (!opts_set->x_flag_inline_functions)
1896 	opts->x_flag_inline_functions = value;
1897       /* FIXME: Instrumentation we insert makes ipa-reference bitmaps
1898 	 quadratic.  Disable the pass until better memory representation
1899 	 is done.  */
1900       if (!opts_set->x_flag_ipa_reference)
1901         opts->x_flag_ipa_reference = false;
1902       break;
1903 
1904     case OPT_ftree_vectorize:
1905       if (!opts_set->x_flag_tree_loop_vectorize)
1906         opts->x_flag_tree_loop_vectorize = value;
1907       if (!opts_set->x_flag_tree_slp_vectorize)
1908         opts->x_flag_tree_slp_vectorize = value;
1909       break;
1910     case OPT_fshow_column:
1911       dc->show_column = value;
1912       break;
1913 
1914     case OPT_frandom_seed:
1915       /* The real switch is -fno-random-seed.  */
1916       if (value)
1917 	return false;
1918       /* Deferred.  */
1919       break;
1920 
1921     case OPT_frandom_seed_:
1922       /* Deferred.  */
1923       break;
1924 
1925     case OPT_fsched_verbose_:
1926 #ifdef INSN_SCHEDULING
1927       /* Handled with Var in common.opt.  */
1928       break;
1929 #else
1930       return false;
1931 #endif
1932 
1933     case OPT_fsched_stalled_insns_:
1934       opts->x_flag_sched_stalled_insns = value;
1935       if (opts->x_flag_sched_stalled_insns == 0)
1936 	opts->x_flag_sched_stalled_insns = -1;
1937       break;
1938 
1939     case OPT_fsched_stalled_insns_dep_:
1940       opts->x_flag_sched_stalled_insns_dep = value;
1941       break;
1942 
1943     case OPT_fstack_check_:
1944       if (!strcmp (arg, "no"))
1945 	opts->x_flag_stack_check = NO_STACK_CHECK;
1946       else if (!strcmp (arg, "generic"))
1947 	/* This is the old stack checking method.  */
1948 	opts->x_flag_stack_check = STACK_CHECK_BUILTIN
1949 			   ? FULL_BUILTIN_STACK_CHECK
1950 			   : GENERIC_STACK_CHECK;
1951       else if (!strcmp (arg, "specific"))
1952 	/* This is the new stack checking method.  */
1953 	opts->x_flag_stack_check = STACK_CHECK_BUILTIN
1954 			   ? FULL_BUILTIN_STACK_CHECK
1955 			   : STACK_CHECK_STATIC_BUILTIN
1956 			     ? STATIC_BUILTIN_STACK_CHECK
1957 			     : GENERIC_STACK_CHECK;
1958       else
1959 	warning_at (loc, 0, "unknown stack check parameter %qs", arg);
1960       break;
1961 
1962     case OPT_fstack_limit:
1963       /* The real switch is -fno-stack-limit.  */
1964       if (value)
1965 	return false;
1966       /* Deferred.  */
1967       break;
1968 
1969     case OPT_fstack_limit_register_:
1970     case OPT_fstack_limit_symbol_:
1971       /* Deferred.  */
1972       break;
1973 
1974     case OPT_fstack_usage:
1975       opts->x_flag_stack_usage = value;
1976       opts->x_flag_stack_usage_info = value != 0;
1977       break;
1978 
1979     case OPT_g:
1980       set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, arg, opts, opts_set,
1981                        loc);
1982       break;
1983 
1984     case OPT_gcoff:
1985       set_debug_level (SDB_DEBUG, false, arg, opts, opts_set, loc);
1986       break;
1987 
1988     case OPT_gdwarf:
1989       if (arg && strlen (arg) != 0)
1990         {
1991           error_at (loc, "%<-gdwarf%s%> is ambiguous; "
1992                     "use %<-gdwarf-%s%> for DWARF version "
1993                     "or %<-gdwarf -g%s%> for debug level", arg, arg, arg);
1994           break;
1995         }
1996       else
1997         value = opts->x_dwarf_version;
1998 
1999       /* FALLTHRU */
2000     case OPT_gdwarf_:
2001       if (value < 2 || value > 5)
2002 	error_at (loc, "dwarf version %d is not supported", value);
2003       else
2004 	opts->x_dwarf_version = value;
2005       set_debug_level (DWARF2_DEBUG, false, "", opts, opts_set, loc);
2006       break;
2007 
2008     case OPT_gsplit_dwarf:
2009       set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, "", opts, opts_set,
2010 		       loc);
2011       break;
2012 
2013     case OPT_ggdb:
2014       set_debug_level (NO_DEBUG, 2, arg, opts, opts_set, loc);
2015       break;
2016 
2017     case OPT_gstabs:
2018     case OPT_gstabs_:
2019       set_debug_level (DBX_DEBUG, code == OPT_gstabs_, arg, opts, opts_set,
2020 		       loc);
2021       break;
2022 
2023     case OPT_gvms:
2024       set_debug_level (VMS_DEBUG, false, arg, opts, opts_set, loc);
2025       break;
2026 
2027     case OPT_gxcoff:
2028     case OPT_gxcoff_:
2029       set_debug_level (XCOFF_DEBUG, code == OPT_gxcoff_, arg, opts, opts_set,
2030 		       loc);
2031       break;
2032 
2033     case OPT_gz:
2034     case OPT_gz_:
2035       /* Handled completely via specs.  */
2036       break;
2037 
2038     case OPT_pedantic_errors:
2039       dc->pedantic_errors = 1;
2040       control_warning_option (OPT_Wpedantic, DK_ERROR, value,
2041 			      loc, lang_mask,
2042 			      handlers, opts, opts_set,
2043                               dc);
2044       break;
2045 
2046     case OPT_flto:
2047       opts->x_flag_lto = value ? "" : NULL;
2048       break;
2049 
2050     case OPT_w:
2051       dc->dc_inhibit_warnings = true;
2052       break;
2053 
2054     case OPT_fmax_errors_:
2055       dc->max_errors = value;
2056       break;
2057 
2058     case OPT_fuse_ld_bfd:
2059     case OPT_fuse_ld_gold:
2060     case OPT_fuse_linker_plugin:
2061       /* No-op. Used by the driver and passed to us because it starts with f.*/
2062       break;
2063 
2064     case OPT_fwrapv:
2065       if (value)
2066 	opts->x_flag_trapv = 0;
2067       break;
2068 
2069     case OPT_ftrapv:
2070       if (value)
2071 	opts->x_flag_wrapv = 0;
2072       break;
2073 
2074     case OPT_fipa_icf:
2075       opts->x_flag_ipa_icf_functions = value;
2076       opts->x_flag_ipa_icf_variables = value;
2077       break;
2078 
2079     default:
2080       /* If the flag was handled in a standard way, assume the lack of
2081 	 processing here is intentional.  */
2082       gcc_assert (option_flag_var (scode, opts));
2083       break;
2084     }
2085 
2086   common_handle_option_auto (opts, opts_set, decoded, lang_mask, kind,
2087                              loc, handlers, dc);
2088   return true;
2089 }
2090 
2091 /* Handle --param NAME=VALUE.  */
2092 static void
2093 handle_param (struct gcc_options *opts, struct gcc_options *opts_set,
2094 	      location_t loc, const char *carg)
2095 {
2096   char *equal, *arg;
2097   int value;
2098 
2099   arg = xstrdup (carg);
2100   equal = strchr (arg, '=');
2101   if (!equal)
2102     error_at (loc, "%s: --param arguments should be of the form NAME=VALUE",
2103 	      arg);
2104   else
2105     {
2106       value = integral_argument (equal + 1);
2107       if (value == -1)
2108 	error_at (loc, "invalid --param value %qs", equal + 1);
2109       else
2110 	{
2111 	  *equal = '\0';
2112 	  set_param_value (arg, value,
2113 			   opts->x_param_values, opts_set->x_param_values);
2114 	}
2115     }
2116 
2117   free (arg);
2118 }
2119 
2120 /* Used to set the level of strict aliasing warnings in OPTS,
2121    when no level is specified (i.e., when -Wstrict-aliasing, and not
2122    -Wstrict-aliasing=level was given).
2123    ONOFF is assumed to take value 1 when -Wstrict-aliasing is specified,
2124    and 0 otherwise.  After calling this function, wstrict_aliasing will be
2125    set to the default value of -Wstrict_aliasing=level, currently 3.  */
2126 static void
2127 set_Wstrict_aliasing (struct gcc_options *opts, int onoff)
2128 {
2129   gcc_assert (onoff == 0 || onoff == 1);
2130   if (onoff != 0)
2131     opts->x_warn_strict_aliasing = 3;
2132   else
2133     opts->x_warn_strict_aliasing = 0;
2134 }
2135 
2136 /* The following routines are useful in setting all the flags that
2137    -ffast-math and -fno-fast-math imply.  */
2138 static void
2139 set_fast_math_flags (struct gcc_options *opts, int set)
2140 {
2141   if (!opts->frontend_set_flag_unsafe_math_optimizations)
2142     {
2143       opts->x_flag_unsafe_math_optimizations = set;
2144       set_unsafe_math_optimizations_flags (opts, set);
2145     }
2146   if (!opts->frontend_set_flag_finite_math_only)
2147     opts->x_flag_finite_math_only = set;
2148   if (!opts->frontend_set_flag_errno_math)
2149     opts->x_flag_errno_math = !set;
2150   if (set)
2151     {
2152       if (!opts->frontend_set_flag_signaling_nans)
2153 	opts->x_flag_signaling_nans = 0;
2154       if (!opts->frontend_set_flag_rounding_math)
2155 	opts->x_flag_rounding_math = 0;
2156       if (!opts->frontend_set_flag_cx_limited_range)
2157 	opts->x_flag_cx_limited_range = 1;
2158     }
2159 }
2160 
2161 /* When -funsafe-math-optimizations is set the following
2162    flags are set as well.  */
2163 static void
2164 set_unsafe_math_optimizations_flags (struct gcc_options *opts, int set)
2165 {
2166   if (!opts->frontend_set_flag_trapping_math)
2167     opts->x_flag_trapping_math = !set;
2168   if (!opts->frontend_set_flag_signed_zeros)
2169     opts->x_flag_signed_zeros = !set;
2170   if (!opts->frontend_set_flag_associative_math)
2171     opts->x_flag_associative_math = set;
2172   if (!opts->frontend_set_flag_reciprocal_math)
2173     opts->x_flag_reciprocal_math = set;
2174 }
2175 
2176 /* Return true iff flags in OPTS are set as if -ffast-math.  */
2177 bool
2178 fast_math_flags_set_p (const struct gcc_options *opts)
2179 {
2180   return (!opts->x_flag_trapping_math
2181 	  && opts->x_flag_unsafe_math_optimizations
2182 	  && opts->x_flag_finite_math_only
2183 	  && !opts->x_flag_signed_zeros
2184 	  && !opts->x_flag_errno_math);
2185 }
2186 
2187 /* Return true iff flags are set as if -ffast-math but using the flags stored
2188    in the struct cl_optimization structure.  */
2189 bool
2190 fast_math_flags_struct_set_p (struct cl_optimization *opt)
2191 {
2192   return (!opt->x_flag_trapping_math
2193 	  && opt->x_flag_unsafe_math_optimizations
2194 	  && opt->x_flag_finite_math_only
2195 	  && !opt->x_flag_signed_zeros
2196 	  && !opt->x_flag_errno_math);
2197 }
2198 
2199 /* Handle a debug output -g switch for options OPTS
2200    (OPTS_SET->x_write_symbols storing whether a debug type was passed
2201    explicitly), location LOC.  EXTENDED is true or false to support
2202    extended output (2 is special and means "-ggdb" was given).  */
2203 static void
2204 set_debug_level (enum debug_info_type type, int extended, const char *arg,
2205 		 struct gcc_options *opts, struct gcc_options *opts_set,
2206 		 location_t loc)
2207 {
2208   opts->x_use_gnu_debug_info_extensions = extended;
2209 
2210   if (type == NO_DEBUG)
2211     {
2212       if (opts->x_write_symbols == NO_DEBUG)
2213 	{
2214 	  opts->x_write_symbols = PREFERRED_DEBUGGING_TYPE;
2215 
2216 	  if (extended == 2)
2217 	    {
2218 #ifdef DWARF2_DEBUGGING_INFO
2219 	      opts->x_write_symbols = DWARF2_DEBUG;
2220 #elif defined DBX_DEBUGGING_INFO
2221 	      opts->x_write_symbols = DBX_DEBUG;
2222 #endif
2223 	    }
2224 
2225 	  if (opts->x_write_symbols == NO_DEBUG)
2226 	    warning_at (loc, 0, "target system does not support debug output");
2227 	}
2228     }
2229   else
2230     {
2231       /* Does it conflict with an already selected type?  */
2232       if (opts_set->x_write_symbols != NO_DEBUG
2233 	  && opts->x_write_symbols != NO_DEBUG
2234 	  && type != opts->x_write_symbols)
2235 	error_at (loc, "debug format %qs conflicts with prior selection",
2236 		  debug_type_names[type]);
2237       opts->x_write_symbols = type;
2238       opts_set->x_write_symbols = type;
2239     }
2240 
2241   /* A debug flag without a level defaults to level 2.
2242      If off or at level 1, set it to level 2, but if already
2243      at level 3, don't lower it.  */
2244   if (*arg == '\0')
2245     {
2246       if (opts->x_debug_info_level < DINFO_LEVEL_NORMAL)
2247 	opts->x_debug_info_level = DINFO_LEVEL_NORMAL;
2248     }
2249   else
2250     {
2251       int argval = integral_argument (arg);
2252       if (argval == -1)
2253 	error_at (loc, "unrecognised debug output level %qs", arg);
2254       else if (argval > 3)
2255 	error_at (loc, "debug output level %qs is too high", arg);
2256       else
2257 	opts->x_debug_info_level = (enum debug_info_levels) argval;
2258     }
2259 }
2260 
2261 /* Arrange to dump core on error for diagnostic context DC.  (The
2262    regular error message is still printed first, except in the case of
2263    abort ().)  */
2264 
2265 static void
2266 setup_core_dumping (diagnostic_context *dc)
2267 {
2268 #ifdef SIGABRT
2269   signal (SIGABRT, SIG_DFL);
2270 #endif
2271 #if defined(HAVE_SETRLIMIT)
2272   {
2273     struct rlimit rlim;
2274     if (getrlimit (RLIMIT_CORE, &rlim) != 0)
2275       fatal_error (input_location, "getting core file size maximum limit: %m");
2276     rlim.rlim_cur = rlim.rlim_max;
2277     if (setrlimit (RLIMIT_CORE, &rlim) != 0)
2278       fatal_error (input_location,
2279 		   "setting core file size limit to maximum: %m");
2280   }
2281 #endif
2282   diagnostic_abort_on_error (dc);
2283 }
2284 
2285 /* Parse a -d<ARG> command line switch for OPTS, location LOC,
2286    diagnostic context DC.  */
2287 
2288 static void
2289 decode_d_option (const char *arg, struct gcc_options *opts,
2290 		 location_t loc, diagnostic_context *dc)
2291 {
2292   int c;
2293 
2294   while (*arg)
2295     switch (c = *arg++)
2296       {
2297       case 'A':
2298 	opts->x_flag_debug_asm = 1;
2299 	break;
2300       case 'p':
2301 	opts->x_flag_print_asm_name = 1;
2302 	break;
2303       case 'P':
2304 	opts->x_flag_dump_rtl_in_asm = 1;
2305 	opts->x_flag_print_asm_name = 1;
2306 	break;
2307       case 'x':
2308 	opts->x_rtl_dump_and_exit = 1;
2309 	break;
2310       case 'D':	/* These are handled by the preprocessor.  */
2311       case 'I':
2312       case 'M':
2313       case 'N':
2314       case 'U':
2315 	break;
2316       case 'H':
2317 	setup_core_dumping (dc);
2318 	break;
2319       case 'a':
2320 	opts->x_flag_dump_all_passed = true;
2321 	break;
2322 
2323       default:
2324 	  warning_at (loc, 0, "unrecognized gcc debugging option: %c", c);
2325 	break;
2326       }
2327 }
2328 
2329 /* Enable (or disable if VALUE is 0) a warning option ARG (language
2330    mask LANG_MASK, option handlers HANDLERS) as an error for option
2331    structures OPTS and OPTS_SET, diagnostic context DC (possibly
2332    NULL), location LOC.  This is used by -Werror=.  */
2333 
2334 static void
2335 enable_warning_as_error (const char *arg, int value, unsigned int lang_mask,
2336 			 const struct cl_option_handlers *handlers,
2337 			 struct gcc_options *opts,
2338 			 struct gcc_options *opts_set,
2339 			 location_t loc, diagnostic_context *dc)
2340 {
2341   char *new_option;
2342   int option_index;
2343 
2344   new_option = XNEWVEC (char, strlen (arg) + 2);
2345   new_option[0] = 'W';
2346   strcpy (new_option + 1, arg);
2347   option_index = find_opt (new_option, lang_mask);
2348   if (option_index == OPT_SPECIAL_unknown)
2349     {
2350       error_at (loc, "-Werror=%s: no option -%s", arg, new_option);
2351     }
2352   else
2353     {
2354       const diagnostic_t kind = value ? DK_ERROR : DK_WARNING;
2355 
2356       control_warning_option (option_index, (int) kind, value,
2357 			      loc, lang_mask,
2358 			      handlers, opts, opts_set, dc);
2359     }
2360   free (new_option);
2361 }
2362 
2363 /* Return malloced memory for the name of the option OPTION_INDEX
2364    which enabled a diagnostic (context CONTEXT), originally of type
2365    ORIG_DIAG_KIND but possibly converted to DIAG_KIND by options such
2366    as -Werror.  */
2367 
2368 char *
2369 option_name (diagnostic_context *context, int option_index,
2370 	     diagnostic_t orig_diag_kind, diagnostic_t diag_kind)
2371 {
2372   if (option_index)
2373     {
2374       /* A warning classified as an error.  */
2375       if ((orig_diag_kind == DK_WARNING || orig_diag_kind == DK_PEDWARN)
2376 	  && diag_kind == DK_ERROR)
2377 	return concat (cl_options[OPT_Werror_].opt_text,
2378 		       /* Skip over "-W".  */
2379 		       cl_options[option_index].opt_text + 2,
2380 		       NULL);
2381       /* A warning with option.  */
2382       else
2383 	return xstrdup (cl_options[option_index].opt_text);
2384     }
2385   /* A warning without option classified as an error.  */
2386   else if ((orig_diag_kind == DK_WARNING || orig_diag_kind == DK_PEDWARN
2387 	    || diag_kind == DK_WARNING)
2388 	   && context->warning_as_error_requested)
2389     return xstrdup (cl_options[OPT_Werror].opt_text);
2390   else
2391     return NULL;
2392 }
2393