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