OSDN Git Service

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