Merge branch 'vendor/GCC44'
[dragonfly.git] / contrib / gcc-4.4 / gcc / opts.c
1 /* Command line option handling.
2    Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
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"
27 #include "tree.h"
28 #include "rtl.h"
29 #include "expr.h"
30 #include "ggc.h"
31 #include "output.h"
32 #include "langhooks.h"
33 #include "opts.h"
34 #include "options.h"
35 #include "flags.h"
36 #include "toplev.h"
37 #include "params.h"
38 #include "diagnostic.h"
39 #include "tm_p.h"               /* For OPTIMIZATION_OPTIONS.  */
40 #include "insn-attr.h"          /* For INSN_SCHEDULING.  */
41 #include "target.h"
42 #include "tree-pass.h"
43 #include "dbgcnt.h"
44 #include "debug.h"
45
46 /* Value of the -G xx switch, and whether it was passed or not.  */
47 unsigned HOST_WIDE_INT g_switch_value;
48 bool g_switch_set;
49
50 /* Same for selective scheduling.  */
51 bool sel_sched_switch_set;
52
53 /* True if we should exit after parsing options.  */
54 bool exit_after_options;
55
56 /* Print various extra warnings.  -W/-Wextra.  */
57 bool extra_warnings;
58
59 /* True to warn about any objects definitions whose size is larger
60    than N bytes.  Also want about function definitions whose returned
61    values are larger than N bytes, where N is `larger_than_size'.  */
62 bool warn_larger_than;
63 HOST_WIDE_INT larger_than_size;
64
65 /* True to warn about any function whose frame size is larger
66  * than N bytes. */
67 bool warn_frame_larger_than;
68 HOST_WIDE_INT frame_larger_than_size;
69
70 /* Type(s) of debugging information we are producing (if any).  See
71    flags.h for the definitions of the different possible types of
72    debugging information.  */
73 enum debug_info_type write_symbols = NO_DEBUG;
74
75 /* Level of debugging information we are producing.  See flags.h for
76    the definitions of the different possible levels.  */
77 enum debug_info_level debug_info_level = DINFO_LEVEL_NONE;
78
79 /* A major contribution to object and executable size is debug
80    information size.  A major contribution to debug information size
81    is struct descriptions replicated in several object files. The
82    following flags attempt to reduce this information.  The basic
83    idea is to not emit struct debugging information in the current
84    compilation unit when that information will be generated by
85    another compilation unit.
86
87    Debug information for a struct defined in the current source
88    file should be generated in the object file.  Likewise the
89    debug information for a struct defined in a header should be
90    generated in the object file of the corresponding source file.
91    Both of these case are handled when the base name of the file of
92    the struct definition matches the base name of the source file
93    of the current compilation unit.  This matching emits minimal
94    struct debugging information.
95
96    The base file name matching rule above will fail to emit debug
97    information for structs defined in system headers.  So a second
98    category of files includes system headers in addition to files
99    with matching bases.
100
101    The remaining types of files are library headers and application
102    headers.  We cannot currently distinguish these two types.  */
103
104 enum debug_struct_file
105 {
106   DINFO_STRUCT_FILE_NONE,   /* Debug no structs. */
107   DINFO_STRUCT_FILE_BASE,   /* Debug structs defined in files with the
108                                same base name as the compilation unit. */
109   DINFO_STRUCT_FILE_SYS,    /* Also debug structs defined in system
110                                header files.  */
111   DINFO_STRUCT_FILE_ANY     /* Debug structs defined in all files. */
112 };
113
114 /* Generic structs (e.g. templates not explicitly specialized)
115    may not have a compilation unit associated with them, and so
116    may need to be treated differently from ordinary structs.
117
118    Structs only handled by reference (indirectly), will also usually
119    not need as much debugging information.  */
120
121 static enum debug_struct_file debug_struct_ordinary[DINFO_USAGE_NUM_ENUMS]
122   = { DINFO_STRUCT_FILE_ANY, DINFO_STRUCT_FILE_ANY, DINFO_STRUCT_FILE_ANY };
123 static enum debug_struct_file debug_struct_generic[DINFO_USAGE_NUM_ENUMS]
124   = { DINFO_STRUCT_FILE_ANY, DINFO_STRUCT_FILE_ANY, DINFO_STRUCT_FILE_ANY };
125
126 /* Parse the -femit-struct-debug-detailed option value
127    and set the flag variables. */
128
129 #define MATCH( prefix, string ) \
130   ((strncmp (prefix, string, sizeof prefix - 1) == 0) \
131    ? ((string += sizeof prefix - 1), 1) : 0)
132
133 void
134 set_struct_debug_option (const char *spec)
135 {
136   /* various labels for comparison */
137   static char dfn_lbl[] = "dfn:", dir_lbl[] = "dir:", ind_lbl[] = "ind:";
138   static char ord_lbl[] = "ord:", gen_lbl[] = "gen:";
139   static char none_lbl[] = "none", any_lbl[] = "any";
140   static char base_lbl[] = "base", sys_lbl[] = "sys";
141
142   enum debug_struct_file files = DINFO_STRUCT_FILE_ANY;
143   /* Default is to apply to as much as possible. */
144   enum debug_info_usage usage = DINFO_USAGE_NUM_ENUMS;
145   int ord = 1, gen = 1;
146
147   /* What usage? */
148   if (MATCH (dfn_lbl, spec))
149     usage = DINFO_USAGE_DFN;
150   else if (MATCH (dir_lbl, spec))
151     usage = DINFO_USAGE_DIR_USE;
152   else if (MATCH (ind_lbl, spec))
153     usage = DINFO_USAGE_IND_USE;
154
155   /* Generics or not? */
156   if (MATCH (ord_lbl, spec))
157     gen = 0;
158   else if (MATCH (gen_lbl, spec))
159     ord = 0;
160
161   /* What allowable environment? */
162   if (MATCH (none_lbl, spec))
163     files = DINFO_STRUCT_FILE_NONE;
164   else if (MATCH (any_lbl, spec))
165     files = DINFO_STRUCT_FILE_ANY;
166   else if (MATCH (sys_lbl, spec))
167     files = DINFO_STRUCT_FILE_SYS;
168   else if (MATCH (base_lbl, spec))
169     files = DINFO_STRUCT_FILE_BASE;
170   else
171     error ("argument %qs to %<-femit-struct-debug-detailed%> not recognized",
172            spec);
173
174   /* Effect the specification. */
175   if (usage == DINFO_USAGE_NUM_ENUMS)
176     {
177       if (ord)
178         {
179           debug_struct_ordinary[DINFO_USAGE_DFN] = files;
180           debug_struct_ordinary[DINFO_USAGE_DIR_USE] = files;
181           debug_struct_ordinary[DINFO_USAGE_IND_USE] = files;
182         }
183       if (gen)
184         {
185           debug_struct_generic[DINFO_USAGE_DFN] = files;
186           debug_struct_generic[DINFO_USAGE_DIR_USE] = files;
187           debug_struct_generic[DINFO_USAGE_IND_USE] = files;
188         }
189     }
190   else
191     {
192       if (ord)
193         debug_struct_ordinary[usage] = files;
194       if (gen)
195         debug_struct_generic[usage] = files;
196     }
197
198   if (*spec == ',')
199     set_struct_debug_option (spec+1);
200   else
201     {
202       /* No more -femit-struct-debug-detailed specifications.
203          Do final checks. */
204       if (*spec != '\0')
205         error ("argument %qs to %<-femit-struct-debug-detailed%> unknown",
206                spec);
207       if (debug_struct_ordinary[DINFO_USAGE_DIR_USE]
208                 < debug_struct_ordinary[DINFO_USAGE_IND_USE]
209           || debug_struct_generic[DINFO_USAGE_DIR_USE]
210                 < debug_struct_generic[DINFO_USAGE_IND_USE])
211         error ("%<-femit-struct-debug-detailed=dir:...%> must allow at least"
212                " as much as %<-femit-struct-debug-detailed=ind:...%>");
213     }
214 }
215
216 /* Find the base name of a path, stripping off both directories and
217    a single final extension. */
218 static int
219 base_of_path (const char *path, const char **base_out)
220 {
221   const char *base = path;
222   const char *dot = 0;
223   const char *p = path;
224   char c = *p;
225   while (c)
226     {
227       if (IS_DIR_SEPARATOR(c))
228         {
229           base = p + 1;
230           dot = 0;
231         }
232       else if (c == '.')
233         dot = p;
234       c = *++p;
235     }
236   if (!dot)
237     dot = p;
238   *base_out = base;
239   return dot - base;
240 }
241
242 /* Match the base name of a file to the base name of a compilation unit. */
243
244 static const char *main_input_basename;
245 static int main_input_baselength;
246
247 static int
248 matches_main_base (const char *path)
249 {
250   /* Cache the last query. */
251   static const char *last_path = NULL;
252   static int last_match = 0;
253   if (path != last_path)
254     {
255       const char *base;
256       int length = base_of_path (path, &base);
257       last_path = path;
258       last_match = (length == main_input_baselength
259                     && memcmp (base, main_input_basename, length) == 0);
260     }
261   return last_match;
262 }
263
264 #ifdef DEBUG_DEBUG_STRUCT
265
266 static int
267 dump_struct_debug (tree type, enum debug_info_usage usage,
268                    enum debug_struct_file criterion, int generic,
269                    int matches, int result)
270 {
271   /* Find the type name. */
272   tree type_decl = TYPE_STUB_DECL (type);
273   tree t = type_decl;
274   const char *name = 0;
275   if (TREE_CODE (t) == TYPE_DECL)
276     t = DECL_NAME (t);
277   if (t)
278     name = IDENTIFIER_POINTER (t);
279
280   fprintf (stderr, "    struct %d %s %s %s %s %d %p %s\n",
281            criterion,
282            DECL_IN_SYSTEM_HEADER (type_decl) ? "sys" : "usr",
283            matches ? "bas" : "hdr",
284            generic ? "gen" : "ord",
285            usage == DINFO_USAGE_DFN ? ";" :
286              usage == DINFO_USAGE_DIR_USE ? "." : "*",
287            result,
288            (void*) type_decl, name);
289   return result;
290 }
291 #define DUMP_GSTRUCT(type, usage, criterion, generic, matches, result) \
292   dump_struct_debug (type, usage, criterion, generic, matches, result)
293
294 #else
295
296 #define DUMP_GSTRUCT(type, usage, criterion, generic, matches, result) \
297   (result)
298
299 #endif
300
301
302 bool
303 should_emit_struct_debug (tree type, enum debug_info_usage usage)
304 {
305   enum debug_struct_file criterion;
306   tree type_decl;
307   bool generic = lang_hooks.types.generic_p (type);
308
309   if (generic)
310     criterion = debug_struct_generic[usage];
311   else
312     criterion = debug_struct_ordinary[usage];
313
314   if (criterion == DINFO_STRUCT_FILE_NONE)
315     return DUMP_GSTRUCT (type, usage, criterion, generic, false, false);
316   if (criterion == DINFO_STRUCT_FILE_ANY)
317     return DUMP_GSTRUCT (type, usage, criterion, generic, false, true);
318
319   type_decl = TYPE_STUB_DECL (type);
320
321   if (criterion == DINFO_STRUCT_FILE_SYS && DECL_IN_SYSTEM_HEADER (type_decl))
322     return DUMP_GSTRUCT (type, usage, criterion, generic, false, true);
323
324   if (matches_main_base (DECL_SOURCE_FILE (type_decl)))
325     return DUMP_GSTRUCT (type, usage, criterion, generic, true, true);
326   return DUMP_GSTRUCT (type, usage, criterion, generic, false, false);
327 }
328
329 /* Nonzero means use GNU-only extensions in the generated symbolic
330    debugging information.  Currently, this only has an effect when
331    write_symbols is set to DBX_DEBUG, XCOFF_DEBUG, or DWARF_DEBUG.  */
332 bool use_gnu_debug_info_extensions;
333
334 /* The default visibility for all symbols (unless overridden) */
335 enum symbol_visibility default_visibility = VISIBILITY_DEFAULT;
336
337 /* Global visibility options.  */
338 struct visibility_flags visibility_options;
339
340 /* What to print when a switch has no documentation.  */
341 #ifdef ENABLE_CHECKING
342 static const char undocumented_msg[] = N_("This switch lacks documentation");
343 #else
344 static const char undocumented_msg[] = "";
345 #endif
346
347 /* Used for bookkeeping on whether user set these flags so
348    -fprofile-use/-fprofile-generate does not use them.  */
349 static bool profile_arc_flag_set, flag_profile_values_set;
350 static bool flag_unroll_loops_set, flag_tracer_set;
351 static bool flag_value_profile_transformations_set;
352 static bool flag_peel_loops_set, flag_branch_probabilities_set;
353 static bool flag_inline_functions_set, flag_ipa_cp_set, flag_ipa_cp_clone_set;
354 static bool flag_predictive_commoning_set, flag_unswitch_loops_set, flag_gcse_after_reload_set;
355
356 /* Functions excluded from profiling.  */
357
358 typedef char *char_p; /* For DEF_VEC_P.  */
359 DEF_VEC_P(char_p);
360 DEF_VEC_ALLOC_P(char_p,heap);
361
362 static VEC(char_p,heap) *flag_instrument_functions_exclude_functions;
363 static VEC(char_p,heap) *flag_instrument_functions_exclude_files;
364
365 typedef const char *const_char_p; /* For DEF_VEC_P.  */
366 DEF_VEC_P(const_char_p);
367 DEF_VEC_ALLOC_P(const_char_p,heap);
368
369 static VEC(const_char_p,heap) *ignored_options;
370
371 /* Input file names.  */
372 const char **in_fnames;
373 unsigned num_in_fnames;
374
375 static int common_handle_option (size_t scode, const char *arg, int value,
376                                  unsigned int lang_mask);
377 static void handle_param (const char *);
378 static void set_Wextra (int);
379 static unsigned int handle_option (const char **argv, unsigned int lang_mask);
380 static char *write_langs (unsigned int lang_mask);
381 static void complain_wrong_lang (const char *, const struct cl_option *,
382                                  unsigned int lang_mask);
383 static void handle_options (unsigned int, const char **, unsigned int);
384 static void set_debug_level (enum debug_info_type type, int extended,
385                              const char *arg);
386
387 /* If ARG is a non-negative integer made up solely of digits, return its
388    value, otherwise return -1.  */
389 static int
390 integral_argument (const char *arg)
391 {
392   const char *p = arg;
393
394   while (*p && ISDIGIT (*p))
395     p++;
396
397   if (*p == '\0')
398     return atoi (arg);
399
400   return -1;
401 }
402
403 /* Return a malloced slash-separated list of languages in MASK.  */
404 static char *
405 write_langs (unsigned int mask)
406 {
407   unsigned int n = 0, len = 0;
408   const char *lang_name;
409   char *result;
410
411   for (n = 0; (lang_name = lang_names[n]) != 0; n++)
412     if (mask & (1U << n))
413       len += strlen (lang_name) + 1;
414
415   result = XNEWVEC (char, len);
416   len = 0;
417   for (n = 0; (lang_name = lang_names[n]) != 0; n++)
418     if (mask & (1U << n))
419       {
420         if (len)
421           result[len++] = '/';
422         strcpy (result + len, lang_name);
423         len += strlen (lang_name);
424       }
425
426   result[len] = 0;
427
428   return result;
429 }
430
431 /* Complain that switch OPT_INDEX does not apply to this front end.  */
432 static void
433 complain_wrong_lang (const char *text, const struct cl_option *option,
434                      unsigned int lang_mask)
435 {
436   char *ok_langs, *bad_lang;
437
438   ok_langs = write_langs (option->flags);
439   bad_lang = write_langs (lang_mask);
440
441   /* Eventually this should become a hard error IMO.  */
442   warning (0, "command line option \"%s\" is valid for %s but not for %s",
443            text, ok_langs, bad_lang);
444
445   free (ok_langs);
446   free (bad_lang);
447 }
448
449 /* Buffer the unknown option described by the string OPT.  Currently,
450    we only complain about unknown -Wno-* options if they may have
451    prevented a diagnostic. Otherwise, we just ignore them.
452    Note that if we do complain, it is only as a warning, not an error;
453    passing the compiler an unrecognised -Wno-* option should never
454    change whether the compilation succeeds or fails.  */
455
456 static void postpone_unknown_option_warning(const char *opt)
457 {
458   VEC_safe_push (const_char_p, heap, ignored_options, opt);
459 }
460
461 /* Produce a warning for each option previously buffered.  */
462
463 void print_ignored_options (void)
464 {
465   location_t saved_loc = input_location;
466
467   input_location = 0;
468
469   while (!VEC_empty (const_char_p, ignored_options))
470     {
471       const char *opt;
472       opt = VEC_pop (const_char_p, ignored_options);
473       warning (0, "unrecognized command line option \"%s\"", opt);
474     }
475
476   input_location = saved_loc;
477 }
478
479 /* Handle the switch beginning at ARGV for the language indicated by
480    LANG_MASK.  Returns the number of switches consumed.  */
481 static unsigned int
482 handle_option (const char **argv, unsigned int lang_mask)
483 {
484   size_t opt_index;
485   const char *opt, *arg = 0;
486   char *dup = 0;
487   int value = 1;
488   unsigned int result = 0;
489   const struct cl_option *option;
490
491   opt = argv[0];
492
493   opt_index = find_opt (opt + 1, lang_mask | CL_COMMON | CL_TARGET);
494   if (opt_index == cl_options_count
495       && (opt[1] == 'W' || opt[1] == 'f' || opt[1] == 'm')
496       && opt[2] == 'n' && opt[3] == 'o' && opt[4] == '-')
497     {
498       /* Drop the "no-" from negative switches.  */
499       size_t len = strlen (opt) - 3;
500
501       dup = XNEWVEC (char, len + 1);
502       dup[0] = '-';
503       dup[1] = opt[1];
504       memcpy (dup + 2, opt + 5, len - 2 + 1);
505       opt = dup;
506       value = 0;
507       opt_index = find_opt (opt + 1, lang_mask | CL_COMMON | CL_TARGET);
508       if (opt_index == cl_options_count && opt[1] == 'W')
509         {
510           /* We don't generate warnings for unknown -Wno-* options
511              unless we issue diagnostics.  */
512           postpone_unknown_option_warning (argv[0]);
513           result = 1;
514           goto done;
515         }
516     }
517
518   if (opt_index == cl_options_count)
519     goto done;
520
521   option = &cl_options[opt_index];
522
523   /* Reject negative form of switches that don't take negatives as
524      unrecognized.  */
525   if (!value && (option->flags & CL_REJECT_NEGATIVE))
526     goto done;
527
528   /* We've recognized this switch.  */
529   result = 1;
530
531   /* Check to see if the option is disabled for this configuration.  */
532   if (option->flags & CL_DISABLED)
533     {
534       error ("command line option %qs"
535              " is not supported by this configuration", opt);
536       goto done;
537     }
538
539   /* Sort out any argument the switch takes.  */
540   if (option->flags & CL_JOINED)
541     {
542       /* Have arg point to the original switch.  This is because
543          some code, such as disable_builtin_function, expects its
544          argument to be persistent until the program exits.  */
545       arg = argv[0] + cl_options[opt_index].opt_len + 1;
546       if (!value)
547         arg += strlen ("no-");
548
549       if (*arg == '\0' && !(option->flags & CL_MISSING_OK))
550         {
551           if (option->flags & CL_SEPARATE)
552             {
553               arg = argv[1];
554               result = 2;
555             }
556           else
557             /* Missing argument.  */
558             arg = NULL;
559         }
560     }
561   else if (option->flags & CL_SEPARATE)
562     {
563       arg = argv[1];
564       result = 2;
565     }
566
567   /* Now we've swallowed any potential argument, complain if this
568      is a switch for a different front end.  */
569   if (!(option->flags & (lang_mask | CL_COMMON | CL_TARGET)))
570     {
571       complain_wrong_lang (argv[0], option, lang_mask);
572       goto done;
573     }
574   else if ((option->flags & CL_TARGET)
575            && (option->flags & CL_LANG_ALL)
576            && !(option->flags & lang_mask))
577     {
578       /* Complain for target flag language mismatches if any languages
579          are specified.  */
580       complain_wrong_lang (argv[0], option, lang_mask);
581       goto done;
582     }
583
584   if (arg == NULL && (option->flags & (CL_JOINED | CL_SEPARATE)))
585     {
586       if (!lang_hooks.missing_argument (opt, opt_index))
587         error ("missing argument to \"%s\"", opt);
588       goto done;
589     }
590
591   /* If the switch takes an integer, convert it.  */
592   if (arg && (option->flags & CL_UINTEGER))
593     {
594       value = integral_argument (arg);
595       if (value == -1)
596         {
597           error ("argument to \"%s\" should be a non-negative integer",
598                  option->opt_text);
599           goto done;
600         }
601     }
602
603   if (option->flag_var)
604     switch (option->var_type)
605       {
606       case CLVC_BOOLEAN:
607         *(int *) option->flag_var = value;
608         break;
609
610       case CLVC_EQUAL:
611         *(int *) option->flag_var = (value
612                                      ? option->var_value
613                                      : !option->var_value);
614         break;
615
616       case CLVC_BIT_CLEAR:
617       case CLVC_BIT_SET:
618         if ((value != 0) == (option->var_type == CLVC_BIT_SET))
619           *(int *) option->flag_var |= option->var_value;
620         else
621           *(int *) option->flag_var &= ~option->var_value;
622         if (option->flag_var == &target_flags)
623           target_flags_explicit |= option->var_value;
624         break;
625
626       case CLVC_STRING:
627         *(const char **) option->flag_var = arg;
628         break;
629       }
630
631   if (option->flags & lang_mask)
632     if (lang_hooks.handle_option (opt_index, arg, value) == 0)
633       result = 0;
634
635   if (result && (option->flags & CL_COMMON))
636     if (common_handle_option (opt_index, arg, value, lang_mask) == 0)
637       result = 0;
638
639   if (result && (option->flags & CL_TARGET))
640     if (!targetm.handle_option (opt_index, arg, value))
641       result = 0;
642
643  done:
644   if (dup)
645     free (dup);
646   return result;
647 }
648
649 /* Handle FILENAME from the command line.  */
650 static void
651 add_input_filename (const char *filename)
652 {
653   num_in_fnames++;
654   in_fnames = XRESIZEVEC (const char *, in_fnames, num_in_fnames);
655   in_fnames[num_in_fnames - 1] = filename;
656 }
657
658 /* Add comma-separated strings to a char_p vector.  */
659
660 static void
661 add_comma_separated_to_vector (VEC(char_p,heap) **pvec, const char* arg)
662 {
663   char *tmp;
664   char *r;
665   char *w;
666   char *token_start;
667
668   /* We never free this string.  */
669   tmp = xstrdup (arg);
670
671   r = tmp;
672   w = tmp;
673   token_start = tmp;
674
675   while (*r != '\0')
676     {
677       if (*r == ',')
678         {
679           *w++ = '\0';
680           ++r;
681           VEC_safe_push (char_p, heap, *pvec, token_start);
682           token_start = w;
683         }
684       if (*r == '\\' && r[1] == ',')
685         {
686           *w++ = ',';
687           r += 2;
688         }
689       else
690         *w++ = *r++;
691     }
692   if (*token_start != '\0')
693     VEC_safe_push (char_p, heap, *pvec, token_start);
694 }
695
696 /* Return whether we should exclude FNDECL from instrumentation.  */
697
698 bool
699 flag_instrument_functions_exclude_p (tree fndecl)
700 {
701   if (VEC_length (char_p, flag_instrument_functions_exclude_functions) > 0)
702     {
703       const char *name;
704       int i;
705       char *s;
706
707       name = lang_hooks.decl_printable_name (fndecl, 0);
708       for (i = 0;
709            VEC_iterate (char_p, flag_instrument_functions_exclude_functions,
710                         i, s);
711            ++i)
712         {
713           if (strstr (name, s) != NULL)
714             return true;
715         }
716     }
717
718   if (VEC_length (char_p, flag_instrument_functions_exclude_files) > 0)
719     {
720       const char *name;
721       int i;
722       char *s;
723
724       name = DECL_SOURCE_FILE (fndecl);
725       for (i = 0;
726            VEC_iterate (char_p, flag_instrument_functions_exclude_files, i, s);
727            ++i)
728         {
729           if (strstr (name, s) != NULL)
730             return true;
731         }
732     }
733
734   return false;
735 }
736
737
738 /* Decode and handle the vector of command line options.  LANG_MASK
739    contains has a single bit set representing the current
740    language.  */
741 static void
742 handle_options (unsigned int argc, const char **argv, unsigned int lang_mask)
743 {
744   unsigned int n, i;
745
746   for (i = 1; i < argc; i += n)
747     {
748       const char *opt = argv[i];
749
750       /* Interpret "-" or a non-switch as a file name.  */
751       if (opt[0] != '-' || opt[1] == '\0')
752         {
753           if (main_input_filename == NULL)
754             {
755               main_input_filename = opt;
756               main_input_baselength
757                 = base_of_path (main_input_filename, &main_input_basename);
758             }
759           add_input_filename (opt);
760           n = 1;
761           continue;
762         }
763
764       n = handle_option (argv + i, lang_mask);
765
766       if (!n)
767         {
768           n = 1;
769           error ("unrecognized command line option \"%s\"", opt);
770         }
771     }
772 }
773
774 /* Parse command line options and set default flag values.  Do minimal
775    options processing.  */
776 void
777 decode_options (unsigned int argc, const char **argv)
778 {
779   static bool first_time_p = true;
780   static int initial_max_aliased_vops;
781   static int initial_avg_aliased_vops;
782   static int initial_min_crossjump_insns;
783   static int initial_max_fields_for_field_sensitive;
784   static int initial_loop_invariant_max_bbs_in_loop;
785   static unsigned int initial_lang_mask;
786
787   unsigned int i, lang_mask;
788   int opt1;
789   int opt2;
790   int opt3;
791   int opt1_max;
792
793   if (first_time_p)
794     {
795       /* Perform language-specific options initialization.  */
796       initial_lang_mask = lang_mask = lang_hooks.init_options (argc, argv);
797
798       lang_hooks.initialize_diagnostics (global_dc);
799
800       /* Save initial values of parameters we reset.  */
801       initial_max_aliased_vops = MAX_ALIASED_VOPS;
802       initial_avg_aliased_vops = AVG_ALIASED_VOPS;
803       initial_min_crossjump_insns
804         = compiler_params[PARAM_MIN_CROSSJUMP_INSNS].value;
805       initial_max_fields_for_field_sensitive
806         = compiler_params[PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE].value;
807       initial_loop_invariant_max_bbs_in_loop
808         = compiler_params[PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP].value;
809     }
810   else
811     lang_mask = initial_lang_mask;
812
813   /* Scan to see what optimization level has been specified.  That will
814      determine the default value of many flags.  */
815   for (i = 1; i < argc; i++)
816     {
817       if (!strcmp (argv[i], "-O"))
818         {
819           optimize = 1;
820           optimize_size = 0;
821         }
822       else if (argv[i][0] == '-' && argv[i][1] == 'O')
823         {
824           /* Handle -Os, -O2, -O3, -O69, ...  */
825           const char *p = &argv[i][2];
826
827           if ((p[0] == 's') && (p[1] == 0))
828             {
829               optimize_size = 1;
830
831               /* Optimizing for size forces optimize to be 2.  */
832               optimize = 2;
833             }
834           else
835             {
836               const int optimize_val = read_integral_parameter (p, p - 2, -1);
837               if (optimize_val != -1)
838                 {
839                   optimize = optimize_val;
840                   if ((unsigned int) optimize > 255)
841                     optimize = 255;
842                   optimize_size = 0;
843                 }
844             }
845         }
846     }
847   
848   /* Use priority coloring if cover classes is not defined for the
849      target.  */
850   if (targetm.ira_cover_classes == NULL)
851     flag_ira_algorithm = IRA_ALGORITHM_PRIORITY;
852
853   /* -O1 optimizations.  */
854   opt1 = (optimize >= 1);
855   flag_defer_pop = opt1;
856 #ifdef DELAY_SLOTS
857   flag_delayed_branch = opt1;
858 #endif
859 #ifdef CAN_DEBUG_WITHOUT_FP
860   flag_omit_frame_pointer = opt1;
861 #endif
862   flag_guess_branch_prob = opt1;
863   flag_cprop_registers = opt1;
864   flag_if_conversion = opt1;
865   flag_if_conversion2 = opt1;
866   flag_ipa_pure_const = opt1;
867   flag_ipa_reference = opt1;
868   flag_merge_constants = opt1;
869   flag_split_wide_types = opt1;
870   flag_tree_ccp = opt1;
871   flag_tree_dce = opt1;
872   flag_tree_dom = opt1;
873   flag_tree_dse = opt1;
874   flag_tree_ter = opt1;
875   flag_tree_sra = opt1;
876   flag_tree_copyrename = opt1;
877   flag_tree_fre = opt1;
878   flag_tree_copy_prop = opt1;
879   flag_tree_sink = opt1;
880   flag_tree_ch = opt1;
881
882   /* -O2 optimizations.  */
883   opt2 = (optimize >= 2);
884   flag_inline_small_functions = opt2;
885   flag_indirect_inlining = opt2;
886   flag_thread_jumps = opt2;
887   flag_crossjumping = opt2;
888   flag_optimize_sibling_calls = opt2;
889   flag_forward_propagate = opt2;
890   flag_cse_follow_jumps = opt2;
891   flag_gcse = opt2;
892   flag_expensive_optimizations = opt2;
893   flag_rerun_cse_after_loop = opt2;
894   flag_caller_saves = opt2;
895   flag_peephole2 = opt2;
896 #ifdef INSN_SCHEDULING
897   flag_schedule_insns = opt2;
898   flag_schedule_insns_after_reload = opt2;
899 #endif
900   flag_regmove = opt2;
901   flag_strict_aliasing = opt2;
902   flag_strict_overflow = opt2;
903   flag_delete_null_pointer_checks = opt2;
904   flag_reorder_blocks = opt2;
905   flag_reorder_functions = opt2;
906   flag_tree_vrp = opt2;
907   flag_tree_builtin_call_dce = opt2;
908   flag_tree_pre = opt2;
909   flag_tree_switch_conversion = 1;
910   flag_ipa_cp = opt2;
911
912   /* Allow more virtual operators to increase alias precision.  */
913
914   set_param_value ("max-aliased-vops",
915                    (opt2) ? 500 : initial_max_aliased_vops);
916
917   /* Track fields in field-sensitive alias analysis.  */
918   set_param_value ("max-fields-for-field-sensitive",
919                    (opt2) ? 100 : initial_max_fields_for_field_sensitive);
920
921   /* For -O1 only do loop invariant motion for very small loops.  */
922   set_param_value ("loop-invariant-max-bbs-in-loop",
923                    (opt2) ? initial_loop_invariant_max_bbs_in_loop : 1000);
924
925   /* -O3 optimizations.  */
926   opt3 = (optimize >= 3);
927   flag_predictive_commoning = opt3;
928   flag_inline_functions = opt3;
929   flag_unswitch_loops = opt3;
930   flag_gcse_after_reload = opt3;
931   flag_tree_vectorize = opt3;
932   flag_ipa_cp_clone = opt3;
933   if (flag_ipa_cp_clone)
934     flag_ipa_cp = 1;
935
936   /* Allow even more virtual operators.  Max-aliased-vops was set above for
937      -O2, so don't reset it unless we are at -O3.  */
938   if (opt3)
939     set_param_value ("max-aliased-vops", 1000);
940
941   set_param_value ("avg-aliased-vops", (opt3) ? 3 : initial_avg_aliased_vops);
942
943   /* Just -O1/-O0 optimizations.  */
944   opt1_max = (optimize <= 1);
945   align_loops = opt1_max;
946   align_jumps = opt1_max;
947   align_labels = opt1_max;
948   align_functions = opt1_max;
949
950   if (optimize_size)
951     {
952       /* Inlining of functions reducing size is a good idea regardless of them
953          being declared inline.  */
954       flag_inline_functions = 1;
955
956       /* Basic optimization options.  */
957       optimize_size = 1;
958       if (optimize > 2)
959         optimize = 2;
960
961       /* We want to crossjump as much as possible.  */
962       set_param_value ("min-crossjump-insns", 1);
963     }
964   else
965     set_param_value ("min-crossjump-insns", initial_min_crossjump_insns);
966
967   if (first_time_p)
968     {
969       /* Initialize whether `char' is signed.  */
970       flag_signed_char = DEFAULT_SIGNED_CHAR;
971       /* Set this to a special "uninitialized" value.  The actual default is
972          set after target options have been processed.  */
973       flag_short_enums = 2;
974
975       /* Initialize target_flags before OPTIMIZATION_OPTIONS so the latter can
976          modify it.  */
977       target_flags = targetm.default_target_flags;
978
979       /* Some targets have ABI-specified unwind tables.  */
980       flag_unwind_tables = targetm.unwind_tables_default;
981     }
982
983 #ifdef OPTIMIZATION_OPTIONS
984   /* Allow default optimizations to be specified on a per-machine basis.  */
985   OPTIMIZATION_OPTIONS (optimize, optimize_size);
986 #endif
987
988   handle_options (argc, argv, lang_mask);
989
990   /* Handle related options for unit-at-a-time, toplevel-reorder, and
991      section-anchors.  */
992   if (!flag_unit_at_a_time)
993     {
994       if (flag_section_anchors == 1)
995         error ("Section anchors must be disabled when unit-at-a-time "
996                "is disabled.");
997       flag_section_anchors = 0;
998       if (flag_toplevel_reorder == 1)
999         error ("Toplevel reorder must be disabled when unit-at-a-time "
1000                "is disabled.");
1001       flag_toplevel_reorder = 0;
1002     }
1003   /* Unless the user has asked for section anchors, we disable toplevel
1004      reordering at -O0 to disable transformations that might be surprising
1005      to end users and to get -fno-toplevel-reorder tested.  */
1006   if (!optimize && flag_toplevel_reorder == 2 && flag_section_anchors != 1)
1007     {
1008       flag_toplevel_reorder = 0;
1009       flag_section_anchors = 0;
1010     }
1011   if (!flag_toplevel_reorder)
1012     {
1013       if (flag_section_anchors == 1)
1014         error ("section anchors must be disabled when toplevel reorder"
1015                " is disabled");
1016       flag_section_anchors = 0;
1017     }
1018
1019   if (first_time_p)
1020     {
1021       if (flag_pie)
1022         flag_pic = flag_pie;
1023       if (flag_pic && !flag_pie)
1024         flag_shlib = 1;
1025     }
1026
1027   if (optimize == 0)
1028     {
1029       /* Inlining does not work if not optimizing,
1030          so force it not to be done.  */
1031       warn_inline = 0;
1032       flag_no_inline = 1;
1033     }
1034
1035   /* The optimization to partition hot and cold basic blocks into separate
1036      sections of the .o and executable files does not work (currently)
1037      with exception handling.  This is because there is no support for
1038      generating unwind info.  If flag_exceptions is turned on we need to
1039      turn off the partitioning optimization.  */
1040
1041   if (flag_exceptions && flag_reorder_blocks_and_partition)
1042     {
1043       inform (input_location, 
1044               "-freorder-blocks-and-partition does not work with exceptions");
1045       flag_reorder_blocks_and_partition = 0;
1046       flag_reorder_blocks = 1;
1047     }
1048
1049   /* If user requested unwind info, then turn off the partitioning
1050      optimization.  */
1051
1052   if (flag_unwind_tables && ! targetm.unwind_tables_default
1053       && flag_reorder_blocks_and_partition)
1054     {
1055       inform (input_location, "-freorder-blocks-and-partition does not support unwind info");
1056       flag_reorder_blocks_and_partition = 0;
1057       flag_reorder_blocks = 1;
1058     }
1059
1060   /* If the target requested unwind info, then turn off the partitioning
1061      optimization with a different message.  Likewise, if the target does not
1062      support named sections.  */
1063
1064   if (flag_reorder_blocks_and_partition
1065       && (!targetm.have_named_sections
1066           || (flag_unwind_tables && targetm.unwind_tables_default)))
1067     {
1068       inform (input_location,
1069               "-freorder-blocks-and-partition does not work on this architecture");
1070       flag_reorder_blocks_and_partition = 0;
1071       flag_reorder_blocks = 1;
1072     }
1073
1074   /* Pipelining of outer loops is only possible when general pipelining
1075      capabilities are requested.  */
1076   if (!flag_sel_sched_pipelining)
1077     flag_sel_sched_pipelining_outer_loops = 0;
1078
1079   if (!targetm.ira_cover_classes
1080       && flag_ira_algorithm == IRA_ALGORITHM_CB)
1081     {
1082       inform (input_location,
1083               "-fira-algorithm=CB does not work on this architecture");
1084       flag_ira_algorithm = IRA_ALGORITHM_PRIORITY;
1085     }
1086
1087   /* Save the current optimization options if this is the first call.  */
1088   if (first_time_p)
1089     {
1090       optimization_default_node = build_optimization_node ();
1091       optimization_current_node = optimization_default_node;
1092       first_time_p = false;
1093     }
1094   if (flag_conserve_stack)
1095     {
1096       if (!PARAM_SET_P (PARAM_LARGE_STACK_FRAME))
1097         PARAM_VALUE (PARAM_LARGE_STACK_FRAME) = 100;
1098       if (!PARAM_SET_P (PARAM_STACK_FRAME_GROWTH))
1099         PARAM_VALUE (PARAM_STACK_FRAME_GROWTH) = 40;
1100     }
1101
1102 }
1103
1104 #define LEFT_COLUMN     27
1105
1106 /* Output ITEM, of length ITEM_WIDTH, in the left column,
1107    followed by word-wrapped HELP in a second column.  */
1108 static void
1109 wrap_help (const char *help,
1110            const char *item,
1111            unsigned int item_width,
1112            unsigned int columns)
1113 {
1114   unsigned int col_width = LEFT_COLUMN;
1115   unsigned int remaining, room, len;
1116
1117   remaining = strlen (help);
1118
1119   do
1120     {
1121       room = columns - 3 - MAX (col_width, item_width);
1122       if (room > columns)
1123         room = 0;
1124       len = remaining;
1125
1126       if (room < len)
1127         {
1128           unsigned int i;
1129
1130           for (i = 0; help[i]; i++)
1131             {
1132               if (i >= room && len != remaining)
1133                 break;
1134               if (help[i] == ' ')
1135                 len = i;
1136               else if ((help[i] == '-' || help[i] == '/')
1137                        && help[i + 1] != ' '
1138                        && i > 0 && ISALPHA (help[i - 1]))
1139                 len = i + 1;
1140             }
1141         }
1142
1143       printf( "  %-*.*s %.*s\n", col_width, item_width, item, len, help);
1144       item_width = 0;
1145       while (help[len] == ' ')
1146         len++;
1147       help += len;
1148       remaining -= len;
1149     }
1150   while (remaining);
1151 }
1152
1153 /* Print help for a specific front-end, etc.  */
1154 static void
1155 print_filtered_help (unsigned int include_flags,
1156                      unsigned int exclude_flags,
1157                      unsigned int any_flags,
1158                      unsigned int columns)
1159 {
1160   unsigned int i;
1161   const char *help;
1162   static char *printed = NULL;
1163   bool found = false;
1164   bool displayed = false;
1165
1166   if (include_flags == CL_PARAMS)
1167     {
1168       for (i = 0; i < LAST_PARAM; i++)
1169         {
1170           const char *param = compiler_params[i].option;
1171
1172           help = compiler_params[i].help;
1173           if (help == NULL || *help == '\0')
1174             {
1175               if (exclude_flags & CL_UNDOCUMENTED)
1176                 continue;
1177               help = undocumented_msg;
1178             }
1179
1180           /* Get the translation.  */
1181           help = _(help);
1182
1183           wrap_help (help, param, strlen (param), columns);
1184         }
1185       putchar ('\n');
1186       return;
1187     }
1188
1189   if (!printed)
1190     printed = XCNEWVAR (char, cl_options_count);
1191
1192   for (i = 0; i < cl_options_count; i++)
1193     {
1194       static char new_help[128];
1195       const struct cl_option *option = cl_options + i;
1196       unsigned int len;
1197       const char *opt;
1198       const char *tab;
1199
1200       if (include_flags == 0
1201           || ((option->flags & include_flags) != include_flags))
1202         {
1203           if ((option->flags & any_flags) == 0)
1204             continue;
1205         }
1206
1207       /* Skip unwanted switches.  */
1208       if ((option->flags & exclude_flags) != 0)
1209         continue;
1210
1211       found = true;
1212       /* Skip switches that have already been printed.  */
1213       if (printed[i])
1214         continue;
1215
1216       printed[i] = true;
1217
1218       help = option->help;
1219       if (help == NULL)
1220         {
1221           if (exclude_flags & CL_UNDOCUMENTED)
1222             continue;
1223           help = undocumented_msg;
1224         }
1225
1226       /* Get the translation.  */
1227       help = _(help);
1228
1229       /* Find the gap between the name of the
1230          option and its descriptive text.  */
1231       tab = strchr (help, '\t');
1232       if (tab)
1233         {
1234           len = tab - help;
1235           opt = help;
1236           help = tab + 1;
1237         }
1238       else
1239         {
1240           opt = option->opt_text;
1241           len = strlen (opt);
1242         }
1243
1244       /* With the -Q option enabled we change the descriptive text associated
1245          with an option to be an indication of its current setting.  */
1246       if (!quiet_flag)
1247         {
1248           if (len < (LEFT_COLUMN + 2))
1249             strcpy (new_help, "\t\t");
1250           else
1251             strcpy (new_help, "\t");
1252
1253           if (option->flag_var != NULL)
1254             {
1255               if (option->flags & CL_JOINED)
1256                 {
1257                   if (option->var_type == CLVC_STRING)
1258                     {
1259                       if (* (const char **) option->flag_var != NULL)
1260                         snprintf (new_help + strlen (new_help),
1261                                   sizeof (new_help) - strlen (new_help),
1262                                   * (const char **) option->flag_var);
1263                     }
1264                   else
1265                     sprintf (new_help + strlen (new_help),
1266                              "%#x", * (int *) option->flag_var);
1267                 }
1268               else
1269                 strcat (new_help, option_enabled (i)
1270                         ? _("[enabled]") : _("[disabled]"));
1271             }
1272
1273           help = new_help;
1274         }
1275
1276       wrap_help (help, opt, len, columns);
1277       displayed = true;
1278     }
1279
1280   if (! found)
1281     {
1282       unsigned int langs = include_flags & CL_LANG_ALL;
1283
1284       if (langs == 0)
1285         printf (_(" No options with the desired characteristics were found\n"));
1286       else
1287         {
1288           unsigned int i;
1289
1290           /* PR 31349: Tell the user how to see all of the
1291              options supported by a specific front end.  */
1292           for (i = 0; (1U << i) < CL_LANG_ALL; i ++)
1293             if ((1U << i) & langs)
1294               printf (_(" None found.  Use --help=%s to show *all* the options supported by the %s front-end\n"),
1295                       lang_names[i], lang_names[i]);
1296         }
1297         
1298     }
1299   else if (! displayed)
1300     printf (_(" All options with the desired characteristics have already been displayed\n"));
1301
1302   putchar ('\n');
1303 }
1304
1305 /* Display help for a specified type of option.
1306    The options must have ALL of the INCLUDE_FLAGS set
1307    ANY of the flags in the ANY_FLAGS set
1308    and NONE of the EXCLUDE_FLAGS set.  */
1309 static void
1310 print_specific_help (unsigned int include_flags,
1311                      unsigned int exclude_flags,
1312                      unsigned int any_flags)
1313 {
1314   unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1315   const char * description = NULL;
1316   const char * descrip_extra = "";
1317   size_t i;
1318   unsigned int flag;
1319   static unsigned int columns = 0;
1320
1321   /* Sanity check: Make sure that we do not have more
1322      languages than we have bits available to enumerate them.  */
1323   gcc_assert ((1U << cl_lang_count) < CL_MIN_OPTION_CLASS);
1324
1325   /* If we have not done so already, obtain
1326      the desired maximum width of the output.  */
1327   if (columns == 0)
1328     {
1329       const char *p;
1330
1331       GET_ENVIRONMENT (p, "COLUMNS");
1332       if (p != NULL)
1333         {
1334           int value = atoi (p);
1335
1336           if (value > 0)
1337             columns = value;
1338         }
1339
1340       if (columns == 0)
1341         /* Use a reasonable default.  */
1342         columns = 80;
1343     }
1344
1345   /* Decide upon the title for the options that we are going to display.  */
1346   for (i = 0, flag = 1; flag <= CL_MAX_OPTION_CLASS; flag <<= 1, i ++)
1347     {
1348       switch (flag & include_flags)
1349         {
1350         case 0:
1351           break;
1352
1353         case CL_TARGET:
1354           description = _("The following options are target specific");
1355           break;
1356         case CL_WARNING:
1357           description = _("The following options control compiler warning messages");
1358           break;
1359         case CL_OPTIMIZATION:
1360           description = _("The following options control optimizations");
1361           break;
1362         case CL_COMMON:
1363           description = _("The following options are language-independent");
1364           break;
1365         case CL_PARAMS:
1366           description = _("The --param option recognizes the following as parameters");
1367           break;
1368         default:
1369           if (i >= cl_lang_count)
1370             break;
1371           if (exclude_flags & all_langs_mask)
1372             description = _("The following options are specific to just the language ");
1373           else
1374             description = _("The following options are supported by the language ");
1375           descrip_extra = lang_names [i];
1376           break;
1377         }
1378     }
1379
1380   if (description == NULL)
1381     {
1382       if (any_flags == 0)
1383         {
1384           if (include_flags & CL_UNDOCUMENTED)
1385             description = _("The following options are not documented");
1386           else if (include_flags & CL_SEPARATE)
1387             description = _("The following options take separate arguments");
1388           else if (include_flags & CL_JOINED)
1389             description = _("The following options take joined arguments");
1390           else
1391             {
1392               internal_error ("unrecognized include_flags 0x%x passed to print_specific_help",
1393                               include_flags);
1394               return;
1395             }
1396         }
1397       else
1398         {
1399           if (any_flags & all_langs_mask)
1400             description = _("The following options are language-related");
1401           else
1402             description = _("The following options are language-independent");
1403         }
1404     }
1405
1406   printf ("%s%s:\n", description, descrip_extra);
1407   print_filtered_help (include_flags, exclude_flags, any_flags, columns);
1408 }
1409
1410 /* Handle target- and language-independent options.  Return zero to
1411    generate an "unknown option" message.  Only options that need
1412    extra handling need to be listed here; if you simply want
1413    VALUE assigned to a variable, it happens automatically.  */
1414
1415 static int
1416 common_handle_option (size_t scode, const char *arg, int value,
1417                       unsigned int lang_mask)
1418 {
1419   static bool verbose = false;
1420   enum opt_code code = (enum opt_code) scode;
1421
1422   switch (code)
1423     {
1424     case OPT__param:
1425       handle_param (arg);
1426       break;
1427
1428     case OPT_v:
1429       verbose = true;
1430       break;
1431
1432     case OPT_fhelp:
1433     case OPT__help:
1434       {
1435         unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1436         unsigned int undoc_mask;
1437         unsigned int i;
1438
1439         undoc_mask = (verbose | extra_warnings) ? 0 : CL_UNDOCUMENTED;
1440         /* First display any single language specific options.  */
1441         for (i = 0; i < cl_lang_count; i++)
1442           print_specific_help
1443             (1U << i, (all_langs_mask & (~ (1U << i))) | undoc_mask, 0);
1444         /* Next display any multi language specific options.  */
1445         print_specific_help (0, undoc_mask, all_langs_mask);
1446         /* Then display any remaining, non-language options.  */
1447         for (i = CL_MIN_OPTION_CLASS; i <= CL_MAX_OPTION_CLASS; i <<= 1)
1448           print_specific_help (i, undoc_mask, 0);
1449         exit_after_options = true;
1450         break;
1451       }
1452
1453     case OPT_ftarget_help:
1454     case OPT__target_help:
1455       print_specific_help (CL_TARGET, CL_UNDOCUMENTED, 0);
1456       exit_after_options = true;
1457
1458       /* Allow the target a chance to give the user some additional information.  */
1459       if (targetm.target_help)
1460         targetm.target_help ();
1461       break;
1462
1463     case OPT_fhelp_:
1464     case OPT__help_:
1465       {
1466         const char * a = arg;
1467         unsigned int include_flags = 0;
1468         /* Note - by default we include undocumented options when listing
1469            specific classes.  If you only want to see documented options
1470            then add ",^undocumented" to the --help= option.  E.g.:
1471
1472            --help=target,^undocumented  */
1473         unsigned int exclude_flags = 0;
1474
1475         /* Walk along the argument string, parsing each word in turn.
1476            The format is:
1477            arg = [^]{word}[,{arg}]
1478            word = {optimizers|target|warnings|undocumented|
1479                    params|common|<language>}  */
1480         while (* a != 0)
1481           {
1482             static struct
1483             {
1484               const char * string;
1485               unsigned int flag;
1486             }
1487             specifics[] =
1488             {
1489               { "optimizers", CL_OPTIMIZATION },
1490               { "target", CL_TARGET },
1491               { "warnings", CL_WARNING },
1492               { "undocumented", CL_UNDOCUMENTED },
1493               { "params", CL_PARAMS },
1494               { "joined", CL_JOINED },
1495               { "separate", CL_SEPARATE },
1496               { "common", CL_COMMON },
1497               { NULL, 0 }
1498             };
1499             unsigned int * pflags;
1500             char * comma;
1501             unsigned int lang_flag, specific_flag;
1502             unsigned int len;
1503             unsigned int i;
1504
1505             if (* a == '^')
1506               {
1507                 ++ a;
1508                 pflags = & exclude_flags;
1509               }
1510             else
1511               pflags = & include_flags;
1512
1513             comma = strchr (a, ',');
1514             if (comma == NULL)
1515               len = strlen (a);
1516             else
1517               len = comma - a;
1518             if (len == 0)
1519               {
1520                 a = comma + 1;
1521                 continue;
1522               }
1523
1524             /* Check to see if the string matches an option class name.  */
1525             for (i = 0, specific_flag = 0; specifics[i].string != NULL; i++)
1526               if (strncasecmp (a, specifics[i].string, len) == 0)
1527                 {
1528                   specific_flag = specifics[i].flag;
1529                   break;
1530                 }
1531
1532             /* Check to see if the string matches a language name.
1533                Note - we rely upon the alpha-sorted nature of the entries in
1534                the lang_names array, specifically that shorter names appear
1535                before their longer variants.  (i.e. C before C++).  That way
1536                when we are attempting to match --help=c for example we will
1537                match with C first and not C++.  */
1538             for (i = 0, lang_flag = 0; i < cl_lang_count; i++)
1539               if (strncasecmp (a, lang_names[i], len) == 0)
1540                 {
1541                   lang_flag = 1U << i;
1542                   break;
1543                 }
1544
1545             if (specific_flag != 0)
1546               {
1547                 if (lang_flag == 0)
1548                   * pflags |= specific_flag;
1549                 else
1550                   {
1551                     /* The option's argument matches both the start of a
1552                        language name and the start of an option class name.
1553                        We have a special case for when the user has
1554                        specified "--help=c", but otherwise we have to issue
1555                        a warning.  */
1556                     if (strncasecmp (a, "c", len) == 0)
1557                       * pflags |= lang_flag;
1558                     else
1559                       fnotice (stderr,
1560                                "warning: --help argument %.*s is ambiguous, please be more specific\n",
1561                                len, a);
1562                   }
1563               }
1564             else if (lang_flag != 0)
1565               * pflags |= lang_flag;
1566             else
1567               fnotice (stderr,
1568                        "warning: unrecognized argument to --help= option: %.*s\n",
1569                        len, a);
1570
1571             if (comma == NULL)
1572               break;
1573             a = comma + 1;
1574           }
1575
1576         if (include_flags)
1577           print_specific_help (include_flags, exclude_flags, 0);
1578         exit_after_options = true;
1579         break;
1580       }
1581
1582     case OPT__version:
1583       print_version (stderr, "");
1584       exit_after_options = true;
1585       break;
1586
1587     case OPT_G:
1588       g_switch_value = value;
1589       g_switch_set = true;
1590       break;
1591
1592     case OPT_O:
1593     case OPT_Os:
1594       /* Currently handled in a prescan.  */
1595       break;
1596
1597     case OPT_W:
1598       /* For backward compatibility, -W is the same as -Wextra.  */
1599       set_Wextra (value);
1600       break;
1601
1602     case OPT_Werror_:
1603       enable_warning_as_error (arg, value, lang_mask);
1604       break;
1605
1606     case OPT_Wextra:
1607       set_Wextra (value);
1608       break;
1609
1610     case OPT_Wlarger_than_:
1611       /* This form corresponds to -Wlarger-than-.  
1612          Kept for backward compatibility. 
1613          Don't use it as the first argument of warning().  */
1614
1615     case OPT_Wlarger_than_eq:
1616       larger_than_size = value;
1617       warn_larger_than = value != -1;
1618       break;
1619
1620     case OPT_Wframe_larger_than_:
1621       frame_larger_than_size = value;
1622       warn_frame_larger_than = value != -1;
1623       break;
1624
1625     case OPT_Wstrict_aliasing:
1626       set_Wstrict_aliasing (value);
1627       break;
1628
1629     case OPT_Wstrict_aliasing_:
1630       warn_strict_aliasing = value;
1631       break;
1632
1633     case OPT_Wstrict_overflow:
1634       warn_strict_overflow = (value
1635                               ? (int) WARN_STRICT_OVERFLOW_CONDITIONAL
1636                               : 0);
1637       break;
1638
1639     case OPT_Wstrict_overflow_:
1640       warn_strict_overflow = value;
1641       break;
1642
1643     case OPT_Wunused:
1644       warn_unused = value;
1645       break;
1646
1647     case OPT_aux_info:
1648     case OPT_aux_info_:
1649       aux_info_file_name = arg;
1650       flag_gen_aux_info = 1;
1651       break;
1652
1653     case OPT_auxbase:
1654       aux_base_name = arg;
1655       break;
1656
1657     case OPT_auxbase_strip:
1658       {
1659         char *tmp = xstrdup (arg);
1660         strip_off_ending (tmp, strlen (tmp));
1661         if (tmp[0])
1662           aux_base_name = tmp;
1663       }
1664       break;
1665
1666     case OPT_d:
1667       decode_d_option (arg);
1668       break;
1669
1670     case OPT_dumpbase:
1671       dump_base_name = arg;
1672       break;
1673
1674     case OPT_falign_functions_:
1675       align_functions = value;
1676       break;
1677
1678     case OPT_falign_jumps_:
1679       align_jumps = value;
1680       break;
1681
1682     case OPT_falign_labels_:
1683       align_labels = value;
1684       break;
1685
1686     case OPT_falign_loops_:
1687       align_loops = value;
1688       break;
1689
1690     case OPT_fbranch_probabilities:
1691       flag_branch_probabilities_set = true;
1692       break;
1693
1694     case OPT_fcall_used_:
1695       fix_register (arg, 0, 1);
1696       break;
1697
1698     case OPT_fcall_saved_:
1699       fix_register (arg, 0, 0);
1700       break;
1701
1702     case OPT_fdbg_cnt_:
1703       dbg_cnt_process_opt (arg);
1704       break;
1705
1706     case OPT_fdbg_cnt_list:
1707       dbg_cnt_list_all_counters ();
1708       break;
1709
1710     case OPT_fdebug_prefix_map_:
1711       add_debug_prefix_map (arg);
1712       break;
1713
1714     case OPT_fdiagnostics_show_location_:
1715       if (!strcmp (arg, "once"))
1716         diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
1717       else if (!strcmp (arg, "every-line"))
1718         diagnostic_prefixing_rule (global_dc)
1719           = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE;
1720       else
1721         return 0;
1722       break;
1723
1724     case OPT_fdiagnostics_show_option:
1725       global_dc->show_option_requested = true;
1726       break;
1727
1728     case OPT_fdump_:
1729       if (!dump_switch_p (arg))
1730         return 0;
1731       break;
1732
1733     case OPT_ffast_math:
1734       set_fast_math_flags (value);
1735       break;
1736
1737     case OPT_funsafe_math_optimizations:
1738       set_unsafe_math_optimizations_flags (value);
1739       break;
1740
1741     case OPT_ffixed_:
1742       fix_register (arg, 1, 1);
1743       break;
1744
1745     case OPT_finline_limit_:
1746     case OPT_finline_limit_eq:
1747       set_param_value ("max-inline-insns-single", value / 2);
1748       set_param_value ("max-inline-insns-auto", value / 2);
1749       break;
1750
1751     case OPT_finstrument_functions_exclude_function_list_:
1752       add_comma_separated_to_vector
1753         (&flag_instrument_functions_exclude_functions, arg);
1754       break;
1755
1756     case OPT_finstrument_functions_exclude_file_list_:
1757       add_comma_separated_to_vector
1758         (&flag_instrument_functions_exclude_files, arg);
1759       break;
1760
1761     case OPT_fmessage_length_:
1762       pp_set_line_maximum_length (global_dc->printer, value);
1763       break;
1764
1765     case OPT_fpack_struct_:
1766       if (value <= 0 || (value & (value - 1)) || value > 16)
1767         error ("structure alignment must be a small power of two, not %d", value);
1768       else
1769         {
1770           initial_max_fld_align = value;
1771           maximum_field_alignment = value * BITS_PER_UNIT;
1772         }
1773       break;
1774
1775     case OPT_fpeel_loops:
1776       flag_peel_loops_set = true;
1777       break;
1778
1779     case OPT_fprofile_arcs:
1780       profile_arc_flag_set = true;
1781       break;
1782
1783     case OPT_finline_functions:
1784       flag_inline_functions_set = true;
1785       break;
1786
1787     case OPT_fprofile_dir_:
1788       profile_data_prefix = xstrdup (arg);
1789       break;
1790
1791     case OPT_fprofile_use_:
1792       profile_data_prefix = xstrdup (arg);
1793       flag_profile_use = true;
1794       value = true;
1795       /* No break here - do -fprofile-use processing. */
1796     case OPT_fprofile_use:
1797       if (!flag_branch_probabilities_set)
1798         flag_branch_probabilities = value;
1799       if (!flag_profile_values_set)
1800         flag_profile_values = value;
1801       if (!flag_unroll_loops_set)
1802         flag_unroll_loops = value;
1803       if (!flag_peel_loops_set)
1804         flag_peel_loops = value;
1805       if (!flag_tracer_set)
1806         flag_tracer = value;
1807       if (!flag_value_profile_transformations_set)
1808         flag_value_profile_transformations = value;
1809       if (!flag_inline_functions_set)
1810         flag_inline_functions = value;
1811       if (!flag_ipa_cp_set)
1812         flag_ipa_cp = value;
1813       if (!flag_ipa_cp_clone_set
1814           && value && flag_ipa_cp)
1815         flag_ipa_cp_clone = value;
1816       if (!flag_predictive_commoning_set)
1817         flag_predictive_commoning = value;
1818       if (!flag_unswitch_loops_set)
1819         flag_unswitch_loops = value;
1820       if (!flag_gcse_after_reload_set)
1821         flag_gcse_after_reload = value;
1822       break;
1823
1824     case OPT_fprofile_generate_:
1825       profile_data_prefix = xstrdup (arg);
1826       value = true;
1827       /* No break here - do -fprofile-generate processing. */
1828     case OPT_fprofile_generate:
1829       if (!profile_arc_flag_set)
1830         profile_arc_flag = value;
1831       if (!flag_profile_values_set)
1832         flag_profile_values = value;
1833       if (!flag_value_profile_transformations_set)
1834         flag_value_profile_transformations = value;
1835       if (!flag_inline_functions_set)
1836         flag_inline_functions = value;
1837       break;
1838
1839     case OPT_fprofile_values:
1840       flag_profile_values_set = true;
1841       break;
1842
1843     case OPT_fvisibility_:
1844       {
1845         if (!strcmp(arg, "default"))
1846           default_visibility = VISIBILITY_DEFAULT;
1847         else if (!strcmp(arg, "internal"))
1848           default_visibility = VISIBILITY_INTERNAL;
1849         else if (!strcmp(arg, "hidden"))
1850           default_visibility = VISIBILITY_HIDDEN;
1851         else if (!strcmp(arg, "protected"))
1852           default_visibility = VISIBILITY_PROTECTED;
1853         else
1854           error ("unrecognized visibility value \"%s\"", arg);
1855       }
1856       break;
1857
1858     case OPT_fvpt:
1859       flag_value_profile_transformations_set = true;
1860       break;
1861
1862     case OPT_frandom_seed:
1863       /* The real switch is -fno-random-seed.  */
1864       if (value)
1865         return 0;
1866       set_random_seed (NULL);
1867       break;
1868
1869     case OPT_frandom_seed_:
1870       set_random_seed (arg);
1871       break;
1872
1873     case OPT_fselective_scheduling:
1874     case OPT_fselective_scheduling2:
1875       sel_sched_switch_set = true;
1876       break;
1877
1878     case OPT_fsched_verbose_:
1879 #ifdef INSN_SCHEDULING
1880       fix_sched_param ("verbose", arg);
1881       break;
1882 #else
1883       return 0;
1884 #endif
1885
1886     case OPT_fsched_stalled_insns_:
1887       flag_sched_stalled_insns = value;
1888       if (flag_sched_stalled_insns == 0)
1889         flag_sched_stalled_insns = -1;
1890       break;
1891
1892     case OPT_fsched_stalled_insns_dep_:
1893       flag_sched_stalled_insns_dep = value;
1894       break;
1895
1896     case OPT_fstack_check_:
1897       if (!strcmp (arg, "no"))
1898         flag_stack_check = NO_STACK_CHECK;
1899       else if (!strcmp (arg, "generic"))
1900         /* This is the old stack checking method.  */
1901         flag_stack_check = STACK_CHECK_BUILTIN
1902                            ? FULL_BUILTIN_STACK_CHECK
1903                            : GENERIC_STACK_CHECK;
1904       else if (!strcmp (arg, "specific"))
1905         /* This is the new stack checking method.  */
1906         flag_stack_check = STACK_CHECK_BUILTIN
1907                            ? FULL_BUILTIN_STACK_CHECK
1908                            : STACK_CHECK_STATIC_BUILTIN
1909                              ? STATIC_BUILTIN_STACK_CHECK
1910                              : GENERIC_STACK_CHECK;
1911       else
1912         warning (0, "unknown stack check parameter \"%s\"", arg);
1913       break;
1914
1915     case OPT_fstack_check:
1916       /* This is the same as the "specific" mode above.  */
1917       if (value)
1918         flag_stack_check = STACK_CHECK_BUILTIN
1919                            ? FULL_BUILTIN_STACK_CHECK
1920                            : STACK_CHECK_STATIC_BUILTIN
1921                              ? STATIC_BUILTIN_STACK_CHECK
1922                              : GENERIC_STACK_CHECK;
1923       else
1924         flag_stack_check = NO_STACK_CHECK;
1925       break;
1926
1927     case OPT_fstack_limit:
1928       /* The real switch is -fno-stack-limit.  */
1929       if (value)
1930         return 0;
1931       stack_limit_rtx = NULL_RTX;
1932       break;
1933
1934     case OPT_fstack_limit_register_:
1935       {
1936         int reg = decode_reg_name (arg);
1937         if (reg < 0)
1938           error ("unrecognized register name \"%s\"", arg);
1939         else
1940           stack_limit_rtx = gen_rtx_REG (Pmode, reg);
1941       }
1942       break;
1943
1944     case OPT_fstack_limit_symbol_:
1945       stack_limit_rtx = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (arg));
1946       break;
1947
1948     case OPT_ftree_vectorizer_verbose_:
1949       vect_set_verbosity_level (arg);
1950       break;
1951
1952     case OPT_ftls_model_:
1953       if (!strcmp (arg, "global-dynamic"))
1954         flag_tls_default = TLS_MODEL_GLOBAL_DYNAMIC;
1955       else if (!strcmp (arg, "local-dynamic"))
1956         flag_tls_default = TLS_MODEL_LOCAL_DYNAMIC;
1957       else if (!strcmp (arg, "initial-exec"))
1958         flag_tls_default = TLS_MODEL_INITIAL_EXEC;
1959       else if (!strcmp (arg, "local-exec"))
1960         flag_tls_default = TLS_MODEL_LOCAL_EXEC;
1961       else
1962         warning (0, "unknown tls-model \"%s\"", arg);
1963       break;
1964
1965     case OPT_fira_algorithm_:
1966       if (!strcmp (arg, "CB"))
1967         flag_ira_algorithm = IRA_ALGORITHM_CB;
1968       else if (!strcmp (arg, "priority"))
1969         flag_ira_algorithm = IRA_ALGORITHM_PRIORITY;
1970       else
1971         warning (0, "unknown ira algorithm \"%s\"", arg);
1972       break;
1973
1974     case OPT_fira_region_:
1975       if (!strcmp (arg, "one"))
1976         flag_ira_region = IRA_REGION_ONE;
1977       else if (!strcmp (arg, "all"))
1978         flag_ira_region = IRA_REGION_ALL;
1979       else if (!strcmp (arg, "mixed"))
1980         flag_ira_region = IRA_REGION_MIXED;
1981       else
1982         warning (0, "unknown ira region \"%s\"", arg);
1983       break;
1984
1985     case OPT_fira_verbose_:
1986       flag_ira_verbose = value;
1987       break;
1988
1989     case OPT_ftracer:
1990       flag_tracer_set = true;
1991       break;
1992
1993     case OPT_fipa_cp:
1994       flag_ipa_cp_set = true;
1995       break;
1996
1997     case OPT_fipa_cp_clone:
1998       flag_ipa_cp_clone_set = true;
1999       break;
2000
2001     case OPT_fpredictive_commoning:
2002       flag_predictive_commoning_set = true;
2003       break;
2004
2005     case OPT_funswitch_loops:
2006       flag_unswitch_loops_set = true;
2007       break;
2008
2009     case OPT_fgcse_after_reload:
2010       flag_gcse_after_reload_set = true;
2011       break;
2012
2013     case OPT_funroll_loops:
2014       flag_unroll_loops_set = true;
2015       break;
2016
2017     case OPT_g:
2018       set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, arg);
2019       break;
2020
2021     case OPT_gcoff:
2022       set_debug_level (SDB_DEBUG, false, arg);
2023       break;
2024
2025     case OPT_gdwarf_2:
2026       set_debug_level (DWARF2_DEBUG, false, arg);
2027       break;
2028
2029     case OPT_ggdb:
2030       set_debug_level (NO_DEBUG, 2, arg);
2031       break;
2032
2033     case OPT_gstabs:
2034     case OPT_gstabs_:
2035       set_debug_level (DBX_DEBUG, code == OPT_gstabs_, arg);
2036       break;
2037
2038     case OPT_gvms:
2039       set_debug_level (VMS_DEBUG, false, arg);
2040       break;
2041
2042     case OPT_gxcoff:
2043     case OPT_gxcoff_:
2044       set_debug_level (XCOFF_DEBUG, code == OPT_gxcoff_, arg);
2045       break;
2046
2047     case OPT_o:
2048       asm_file_name = arg;
2049       break;
2050
2051     case OPT_pedantic_errors:
2052       flag_pedantic_errors = pedantic = 1;
2053       break;
2054
2055     case OPT_floop_optimize:
2056     case OPT_frerun_loop_opt:
2057     case OPT_fstrength_reduce:
2058     case OPT_ftree_store_copy_prop:
2059     case OPT_fforce_addr:
2060     case OPT_ftree_salias:
2061     case OPT_ftree_store_ccp:
2062       /* These are no-ops, preserved for backward compatibility.  */
2063       break;
2064
2065     default:
2066       /* If the flag was handled in a standard way, assume the lack of
2067          processing here is intentional.  */
2068       gcc_assert (cl_options[scode].flag_var);
2069       break;
2070     }
2071
2072   return 1;
2073 }
2074
2075 /* Handle --param NAME=VALUE.  */
2076 static void
2077 handle_param (const char *carg)
2078 {
2079   char *equal, *arg;
2080   int value;
2081
2082   arg = xstrdup (carg);
2083   equal = strchr (arg, '=');
2084   if (!equal)
2085     error ("%s: --param arguments should be of the form NAME=VALUE", arg);
2086   else
2087     {
2088       value = integral_argument (equal + 1);
2089       if (value == -1)
2090         error ("invalid --param value %qs", equal + 1);
2091       else
2092         {
2093           *equal = '\0';
2094           set_param_value (arg, value);
2095         }
2096     }
2097
2098   free (arg);
2099 }
2100
2101 /* Handle -W and -Wextra.  */
2102 static void
2103 set_Wextra (int setting)
2104 {
2105   extra_warnings = setting;
2106
2107   /* We save the value of warn_uninitialized, since if they put
2108      -Wuninitialized on the command line, we need to generate a
2109      warning about not using it without also specifying -O.  */
2110   if (setting == 0)
2111     warn_uninitialized = 0;
2112   else if (warn_uninitialized != 1)
2113     warn_uninitialized = 2;
2114 }
2115
2116 /* Used to set the level of strict aliasing warnings, 
2117    when no level is specified (i.e., when -Wstrict-aliasing, and not
2118    -Wstrict-aliasing=level was given).
2119    ONOFF is assumed to take value 1 when -Wstrict-aliasing is specified,
2120    and 0 otherwise.  After calling this function, wstrict_aliasing will be
2121    set to the default value of -Wstrict_aliasing=level, currently 3.  */
2122 void
2123 set_Wstrict_aliasing (int onoff)
2124 {
2125   gcc_assert (onoff == 0 || onoff == 1);
2126   if (onoff != 0)
2127     warn_strict_aliasing = 3;
2128   else
2129     warn_strict_aliasing = 0;
2130 }
2131
2132 /* The following routines are useful in setting all the flags that
2133    -ffast-math and -fno-fast-math imply.  */
2134 void
2135 set_fast_math_flags (int set)
2136 {
2137   flag_unsafe_math_optimizations = set;
2138   set_unsafe_math_optimizations_flags (set);
2139   flag_finite_math_only = set;
2140   flag_errno_math = !set;
2141   if (set)
2142     {
2143       flag_signaling_nans = 0;
2144       flag_rounding_math = 0;
2145       flag_cx_limited_range = 1;
2146     }
2147 }
2148
2149 /* When -funsafe-math-optimizations is set the following 
2150    flags are set as well.  */ 
2151 void
2152 set_unsafe_math_optimizations_flags (int set)
2153 {
2154   flag_trapping_math = !set;
2155   flag_signed_zeros = !set;
2156   flag_associative_math = set;
2157   flag_reciprocal_math = set;
2158 }
2159
2160 /* Return true iff flags are set as if -ffast-math.  */
2161 bool
2162 fast_math_flags_set_p (void)
2163 {
2164   return (!flag_trapping_math
2165           && flag_unsafe_math_optimizations
2166           && flag_finite_math_only
2167           && !flag_signed_zeros
2168           && !flag_errno_math);
2169 }
2170
2171 /* Return true iff flags are set as if -ffast-math but using the flags stored
2172    in the struct cl_optimization structure.  */
2173 bool
2174 fast_math_flags_struct_set_p (struct cl_optimization *opt)
2175 {
2176   return (!opt->flag_trapping_math
2177           && opt->flag_unsafe_math_optimizations
2178           && opt->flag_finite_math_only
2179           && !opt->flag_signed_zeros
2180           && !opt->flag_errno_math);
2181 }
2182
2183 /* Handle a debug output -g switch.  EXTENDED is true or false to support
2184    extended output (2 is special and means "-ggdb" was given).  */
2185 static void
2186 set_debug_level (enum debug_info_type type, int extended, const char *arg)
2187 {
2188   static bool type_explicit;
2189
2190   use_gnu_debug_info_extensions = extended;
2191
2192   if (type == NO_DEBUG)
2193     {
2194       if (write_symbols == NO_DEBUG)
2195         {
2196           write_symbols = PREFERRED_DEBUGGING_TYPE;
2197
2198           if (extended == 2)
2199             {
2200 #ifdef DWARF2_DEBUGGING_INFO
2201               write_symbols = DWARF2_DEBUG;
2202 #elif defined DBX_DEBUGGING_INFO
2203               write_symbols = DBX_DEBUG;
2204 #endif
2205             }
2206
2207           if (write_symbols == NO_DEBUG)
2208             warning (0, "target system does not support debug output");
2209         }
2210     }
2211   else
2212     {
2213       /* Does it conflict with an already selected type?  */
2214       if (type_explicit && write_symbols != NO_DEBUG && type != write_symbols)
2215         error ("debug format \"%s\" conflicts with prior selection",
2216                debug_type_names[type]);
2217       write_symbols = type;
2218       type_explicit = true;
2219     }
2220
2221   /* A debug flag without a level defaults to level 2.  */
2222   if (*arg == '\0')
2223     {
2224       if (!debug_info_level)
2225         debug_info_level = 2;
2226     }
2227   else
2228     {
2229       debug_info_level = integral_argument (arg);
2230       if (debug_info_level == (unsigned int) -1)
2231         error ("unrecognised debug output level \"%s\"", arg);
2232       else if (debug_info_level > 3)
2233         error ("debug output level %s is too high", arg);
2234     }
2235 }
2236
2237 /* Return 1 if OPTION is enabled, 0 if it is disabled, or -1 if it isn't
2238    a simple on-off switch.  */
2239
2240 int
2241 option_enabled (int opt_idx)
2242 {
2243   const struct cl_option *option = &(cl_options[opt_idx]);
2244
2245   if (option->flag_var)
2246     switch (option->var_type)
2247       {
2248       case CLVC_BOOLEAN:
2249         return *(int *) option->flag_var != 0;
2250
2251       case CLVC_EQUAL:
2252         return *(int *) option->flag_var == option->var_value;
2253
2254       case CLVC_BIT_CLEAR:
2255         return (*(int *) option->flag_var & option->var_value) == 0;
2256
2257       case CLVC_BIT_SET:
2258         return (*(int *) option->flag_var & option->var_value) != 0;
2259
2260       case CLVC_STRING:
2261         break;
2262       }
2263   return -1;
2264 }
2265
2266 /* Fill STATE with the current state of option OPTION.  Return true if
2267    there is some state to store.  */
2268
2269 bool
2270 get_option_state (int option, struct cl_option_state *state)
2271 {
2272   if (cl_options[option].flag_var == 0)
2273     return false;
2274
2275   switch (cl_options[option].var_type)
2276     {
2277     case CLVC_BOOLEAN:
2278     case CLVC_EQUAL:
2279       state->data = cl_options[option].flag_var;
2280       state->size = sizeof (int);
2281       break;
2282
2283     case CLVC_BIT_CLEAR:
2284     case CLVC_BIT_SET:
2285       state->ch = option_enabled (option);
2286       state->data = &state->ch;
2287       state->size = 1;
2288       break;
2289
2290     case CLVC_STRING:
2291       state->data = *(const char **) cl_options[option].flag_var;
2292       if (state->data == 0)
2293         state->data = "";
2294       state->size = strlen ((const char *) state->data) + 1;
2295       break;
2296     }
2297   return true;
2298 }
2299
2300 /* Enable a warning option as an error.  This is used by -Werror= and
2301    also by legacy Werror-implicit-function-declaration.  */
2302
2303 void
2304 enable_warning_as_error (const char *arg, int value, unsigned int lang_mask)
2305 {
2306   char *new_option;
2307   int option_index;
2308
2309   new_option = XNEWVEC (char, strlen (arg) + 2);
2310   new_option[0] = 'W';
2311   strcpy (new_option + 1, arg);
2312   option_index = find_opt (new_option, lang_mask);
2313   if (option_index == N_OPTS)
2314     {
2315       error ("-Werror=%s: No option -%s", arg, new_option);
2316     }
2317   else
2318     {
2319       int kind = value ? DK_ERROR : DK_WARNING;
2320       diagnostic_classify_diagnostic (global_dc, option_index, kind);
2321       
2322       /* -Werror=foo implies -Wfoo.  */
2323       if (cl_options[option_index].var_type == CLVC_BOOLEAN
2324           && cl_options[option_index].flag_var
2325           && kind == DK_ERROR)
2326         *(int *) cl_options[option_index].flag_var = 1;
2327     }
2328   free (new_option);
2329 }