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