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