OSDN Git Service

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