OSDN Git Service

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