OSDN Git Service

* diagnostic.c (error_at): New.
[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   /* -fno-unit-at-a-time and -fno-toplevel-reorder handling.  */
1012   if (!flag_unit_at_a_time)
1013     {
1014       flag_section_anchors = 0;
1015       flag_toplevel_reorder = 0;
1016     }
1017   else if (!optimize && flag_toplevel_reorder == 2)
1018     /* We disable toplevel reordering at -O0 to disable transformations that
1019        might be surprising to end users and to get -fno-toplevel-reorder
1020        tested, but we keep section anchors.  */
1021     flag_toplevel_reorder = 0;
1022   else if (!flag_toplevel_reorder)
1023     {
1024       if (flag_section_anchors == 1)
1025         error ("section anchors must be disabled when toplevel reorder is disabled");
1026       flag_section_anchors = 0;
1027     }
1028
1029   if (first_time_p)
1030     {
1031       if (flag_pie)
1032         flag_pic = flag_pie;
1033       if (flag_pic && !flag_pie)
1034         flag_shlib = 1;
1035     }
1036
1037   if (optimize == 0)
1038     {
1039       /* Inlining does not work if not optimizing,
1040          so force it not to be done.  */
1041       warn_inline = 0;
1042       flag_no_inline = 1;
1043     }
1044
1045   /* The optimization to partition hot and cold basic blocks into separate
1046      sections of the .o and executable files does not work (currently)
1047      with exception handling.  This is because there is no support for
1048      generating unwind info.  If flag_exceptions is turned on we need to
1049      turn off the partitioning optimization.  */
1050
1051   if (flag_exceptions && flag_reorder_blocks_and_partition)
1052     {
1053       inform (input_location, 
1054               "-freorder-blocks-and-partition does not work with exceptions");
1055       flag_reorder_blocks_and_partition = 0;
1056       flag_reorder_blocks = 1;
1057     }
1058
1059   /* If user requested unwind info, then turn off the partitioning
1060      optimization.  */
1061
1062   if (flag_unwind_tables && ! targetm.unwind_tables_default
1063       && flag_reorder_blocks_and_partition)
1064     {
1065       inform (input_location, "-freorder-blocks-and-partition does not support unwind info");
1066       flag_reorder_blocks_and_partition = 0;
1067       flag_reorder_blocks = 1;
1068     }
1069
1070   /* If the target requested unwind info, then turn off the partitioning
1071      optimization with a different message.  Likewise, if the target does not
1072      support named sections.  */
1073
1074   if (flag_reorder_blocks_and_partition
1075       && (!targetm.have_named_sections
1076           || (flag_unwind_tables && targetm.unwind_tables_default)))
1077     {
1078       inform (input_location,
1079               "-freorder-blocks-and-partition does not work on this architecture");
1080       flag_reorder_blocks_and_partition = 0;
1081       flag_reorder_blocks = 1;
1082     }
1083
1084   /* Pipelining of outer loops is only possible when general pipelining
1085      capabilities are requested.  */
1086   if (!flag_sel_sched_pipelining)
1087     flag_sel_sched_pipelining_outer_loops = 0;
1088
1089 #ifndef IRA_COVER_CLASSES
1090   if (flag_ira)
1091     {
1092       inform (input_location, "-fira does not work on this architecture");
1093       flag_ira = 0;
1094     }
1095 #endif
1096
1097   /* Save the current optimization options if this is the first call.  */
1098   if (first_time_p)
1099     {
1100       optimization_default_node = build_optimization_node ();
1101       optimization_current_node = optimization_default_node;
1102       first_time_p = false;
1103     }
1104 }
1105
1106 #define LEFT_COLUMN     27
1107
1108 /* Output ITEM, of length ITEM_WIDTH, in the left column,
1109    followed by word-wrapped HELP in a second column.  */
1110 static void
1111 wrap_help (const char *help,
1112            const char *item,
1113            unsigned int item_width,
1114            unsigned int columns)
1115 {
1116   unsigned int col_width = LEFT_COLUMN;
1117   unsigned int remaining, room, len;
1118
1119   remaining = strlen (help);
1120
1121   do
1122     {
1123       room = columns - 3 - MAX (col_width, item_width);
1124       if (room > columns)
1125         room = 0;
1126       len = remaining;
1127
1128       if (room < len)
1129         {
1130           unsigned int i;
1131
1132           for (i = 0; help[i]; i++)
1133             {
1134               if (i >= room && len != remaining)
1135                 break;
1136               if (help[i] == ' ')
1137                 len = i;
1138               else if ((help[i] == '-' || help[i] == '/')
1139                        && help[i + 1] != ' '
1140                        && i > 0 && ISALPHA (help[i - 1]))
1141                 len = i + 1;
1142             }
1143         }
1144
1145       printf( "  %-*.*s %.*s\n", col_width, item_width, item, len, help);
1146       item_width = 0;
1147       while (help[len] == ' ')
1148         len++;
1149       help += len;
1150       remaining -= len;
1151     }
1152   while (remaining);
1153 }
1154
1155 /* Print help for a specific front-end, etc.  */
1156 static void
1157 print_filtered_help (unsigned int include_flags,
1158                      unsigned int exclude_flags,
1159                      unsigned int any_flags,
1160                      unsigned int columns)
1161 {
1162   unsigned int i;
1163   const char *help;
1164   static char *printed = NULL;
1165   bool found = false;
1166   bool displayed = false;
1167
1168   if (include_flags == CL_PARAMS)
1169     {
1170       for (i = 0; i < LAST_PARAM; i++)
1171         {
1172           const char *param = compiler_params[i].option;
1173
1174           help = compiler_params[i].help;
1175           if (help == NULL || *help == '\0')
1176             {
1177               if (exclude_flags & CL_UNDOCUMENTED)
1178                 continue;
1179               help = undocumented_msg;
1180             }
1181
1182           /* Get the translation.  */
1183           help = _(help);
1184
1185           wrap_help (help, param, strlen (param), columns);
1186         }
1187       putchar ('\n');
1188       return;
1189     }
1190
1191   if (!printed)
1192     printed = XCNEWVAR (char, cl_options_count);
1193
1194   for (i = 0; i < cl_options_count; i++)
1195     {
1196       static char new_help[128];
1197       const struct cl_option *option = cl_options + i;
1198       unsigned int len;
1199       const char *opt;
1200       const char *tab;
1201
1202       if (include_flags == 0
1203           || ((option->flags & include_flags) != include_flags))
1204         {
1205           if ((option->flags & any_flags) == 0)
1206             continue;
1207         }
1208
1209       /* Skip unwanted switches.  */
1210       if ((option->flags & exclude_flags) != 0)
1211         continue;
1212
1213       found = true;
1214       /* Skip switches that have already been printed.  */
1215       if (printed[i])
1216         continue;
1217
1218       printed[i] = true;
1219
1220       help = option->help;
1221       if (help == NULL)
1222         {
1223           if (exclude_flags & CL_UNDOCUMENTED)
1224             continue;
1225           help = undocumented_msg;
1226         }
1227
1228       /* Get the translation.  */
1229       help = _(help);
1230
1231       /* Find the gap between the name of the
1232          option and its descriptive text.  */
1233       tab = strchr (help, '\t');
1234       if (tab)
1235         {
1236           len = tab - help;
1237           opt = help;
1238           help = tab + 1;
1239         }
1240       else
1241         {
1242           opt = option->opt_text;
1243           len = strlen (opt);
1244         }
1245
1246       /* With the -Q option enabled we change the descriptive text associated
1247          with an option to be an indication of its current setting.  */
1248       if (!quiet_flag)
1249         {
1250           if (len < (LEFT_COLUMN + 2))
1251             strcpy (new_help, "\t\t");
1252           else
1253             strcpy (new_help, "\t");
1254
1255           if (option->flag_var != NULL)
1256             {
1257               if (option->flags & CL_JOINED)
1258                 {
1259                   if (option->var_type == CLVC_STRING)
1260                     {
1261                       if (* (const char **) option->flag_var != NULL)
1262                         snprintf (new_help + strlen (new_help),
1263                                   sizeof (new_help) - strlen (new_help),
1264                                   * (const char **) option->flag_var);
1265                     }
1266                   else
1267                     sprintf (new_help + strlen (new_help),
1268                              "%#x", * (int *) option->flag_var);
1269                 }
1270               else
1271                 strcat (new_help, option_enabled (i)
1272                         ? _("[enabled]") : _("[disabled]"));
1273             }
1274
1275           help = new_help;
1276         }
1277
1278       wrap_help (help, opt, len, columns);
1279       displayed = true;
1280     }
1281
1282   if (! found)
1283     {
1284       unsigned int langs = include_flags & CL_LANG_ALL;
1285
1286       if (langs == 0)
1287         printf (_(" No options with the desired characteristics were found\n"));
1288       else
1289         {
1290           unsigned int i;
1291
1292           /* PR 31349: Tell the user how to see all of the
1293              options supported by a specific front end.  */
1294           for (i = 0; (1U << i) < CL_LANG_ALL; i ++)
1295             if ((1U << i) & langs)
1296               printf (_(" None found.  Use --help=%s to show *all* the options supported by the %s front-end\n"),
1297                       lang_names[i], lang_names[i]);
1298         }
1299         
1300     }
1301   else if (! displayed)
1302     printf (_(" All options with the desired characteristics have already been displayed\n"));
1303
1304   putchar ('\n');
1305 }
1306
1307 /* Display help for a specified type of option.
1308    The options must have ALL of the INCLUDE_FLAGS set
1309    ANY of the flags in the ANY_FLAGS set
1310    and NONE of the EXCLUDE_FLAGS set.  */
1311 static void
1312 print_specific_help (unsigned int include_flags,
1313                      unsigned int exclude_flags,
1314                      unsigned int any_flags)
1315 {
1316   unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1317   const char * description = NULL;
1318   const char * descrip_extra = "";
1319   size_t i;
1320   unsigned int flag;
1321   static unsigned int columns = 0;
1322
1323   /* Sanity check: Make sure that we do not have more
1324      languages than we have bits available to enumerate them.  */
1325   gcc_assert ((1U << cl_lang_count) < CL_MIN_OPTION_CLASS);
1326
1327   /* If we have not done so already, obtain
1328      the desired maximum width of the output.  */
1329   if (columns == 0)
1330     {
1331       const char *p;
1332
1333       GET_ENVIRONMENT (p, "COLUMNS");
1334       if (p != NULL)
1335         {
1336           int value = atoi (p);
1337
1338           if (value > 0)
1339             columns = value;
1340         }
1341
1342       if (columns == 0)
1343         /* Use a reasonable default.  */
1344         columns = 80;
1345     }
1346
1347   /* Decide upon the title for the options that we are going to display.  */
1348   for (i = 0, flag = 1; flag <= CL_MAX_OPTION_CLASS; flag <<= 1, i ++)
1349     {
1350       switch (flag & include_flags)
1351         {
1352         case 0:
1353           break;
1354
1355         case CL_TARGET:
1356           description = _("The following options are target specific");
1357           break;
1358         case CL_WARNING:
1359           description = _("The following options control compiler warning messages");
1360           break;
1361         case CL_OPTIMIZATION:
1362           description = _("The following options control optimizations");
1363           break;
1364         case CL_COMMON:
1365           description = _("The following options are language-independent");
1366           break;
1367         case CL_PARAMS:
1368           description = _("The --param option recognizes the following as parameters");
1369           break;
1370         default:
1371           if (i >= cl_lang_count)
1372             break;
1373           if ((exclude_flags & ((1U << cl_lang_count) - 1)) != 0)
1374             description = _("The following options are specific to just the language ");
1375           else
1376             description = _("The following options are supported by the language ");
1377           descrip_extra = lang_names [i];
1378           break;
1379         }
1380     }
1381
1382   if (description == NULL)
1383     {
1384       if (any_flags == 0)
1385         {
1386           if (include_flags == CL_UNDOCUMENTED)
1387             description = _("The following options are not documented");
1388           else
1389             {
1390               internal_error ("unrecognized include_flags 0x%x passed to print_specific_help",
1391                               include_flags);
1392               return;
1393             }
1394         }
1395       else
1396         {
1397           if (any_flags & all_langs_mask)
1398             description = _("The following options are language-related");
1399           else
1400             description = _("The following options are language-independent");
1401         }
1402     }
1403
1404   printf ("%s%s:\n", description, descrip_extra);
1405   print_filtered_help (include_flags, exclude_flags, any_flags, columns);
1406 }
1407
1408 /* Handle target- and language-independent options.  Return zero to
1409    generate an "unknown option" message.  Only options that need
1410    extra handling need to be listed here; if you simply want
1411    VALUE assigned to a variable, it happens automatically.  */
1412
1413 static int
1414 common_handle_option (size_t scode, const char *arg, int value,
1415                       unsigned int lang_mask)
1416 {
1417   static bool verbose = false;
1418   enum opt_code code = (enum opt_code) scode;
1419
1420   switch (code)
1421     {
1422     case OPT__param:
1423       handle_param (arg);
1424       break;
1425
1426     case OPT_v:
1427       verbose = true;
1428       break;
1429
1430     case OPT_fhelp:
1431     case OPT__help:
1432       {
1433         unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1434         unsigned int undoc_mask;
1435         unsigned int i;
1436
1437         undoc_mask = (verbose | extra_warnings) ? 0 : CL_UNDOCUMENTED;
1438         /* First display any single language specific options.  */
1439         for (i = 0; i < cl_lang_count; i++)
1440           print_specific_help
1441             (1U << i, (all_langs_mask & (~ (1U << i))) | undoc_mask, 0);
1442         /* Next display any multi language specific options.  */
1443         print_specific_help (0, undoc_mask, all_langs_mask);
1444         /* Then display any remaining, non-language options.  */
1445         for (i = CL_MIN_OPTION_CLASS; i <= CL_MAX_OPTION_CLASS; i <<= 1)
1446           print_specific_help (i, undoc_mask, 0);
1447         exit_after_options = true;
1448         break;
1449       }
1450
1451     case OPT_ftarget_help:
1452     case OPT__target_help:
1453       print_specific_help (CL_TARGET, CL_UNDOCUMENTED, 0);
1454       exit_after_options = true;
1455
1456       /* Allow the target a chance to give the user some additional information.  */
1457       if (targetm.target_help)
1458         targetm.target_help ();
1459       break;
1460
1461     case OPT_fhelp_:
1462     case OPT__help_:
1463       {
1464         const char * a = arg;
1465         unsigned int include_flags = 0;
1466         /* Note - by default we include undocumented options when listing
1467            specific classes.  If you only want to see documented options
1468            then add ",^undocumented" to the --help= option.  E.g.:
1469
1470            --help=target,^undocumented  */
1471         unsigned int exclude_flags = 0;
1472
1473         /* Walk along the argument string, parsing each word in turn.
1474            The format is:
1475            arg = [^]{word}[,{arg}]
1476            word = {optimizers|target|warnings|undocumented|
1477                    params|common|<language>}  */
1478         while (* a != 0)
1479           {
1480             static struct
1481             {
1482               const char * string;
1483               unsigned int flag;
1484             }
1485             specifics[] =
1486             {
1487               { "optimizers", CL_OPTIMIZATION },
1488               { "target", CL_TARGET },
1489               { "warnings", CL_WARNING },
1490               { "undocumented", CL_UNDOCUMENTED },
1491               { "params", CL_PARAMS },
1492               { "joined", CL_JOINED },
1493               { "separate", CL_SEPARATE },
1494               { "common", CL_COMMON },
1495               { NULL, 0 }
1496             };
1497             unsigned int * pflags;
1498             char * comma;
1499             unsigned int lang_flag, specific_flag;
1500             unsigned int len;
1501             unsigned int i;
1502
1503             if (* a == '^')
1504               {
1505                 ++ a;
1506                 pflags = & exclude_flags;
1507               }
1508             else
1509               pflags = & include_flags;
1510
1511             comma = strchr (a, ',');
1512             if (comma == NULL)
1513               len = strlen (a);
1514             else
1515               len = comma - a;
1516
1517             /* Check to see if the string matches an option class name.  */
1518             for (i = 0, specific_flag = 0; specifics[i].string != NULL; i++)
1519               if (strncasecmp (a, specifics[i].string, len) == 0)
1520                 {
1521                   specific_flag = specifics[i].flag;
1522                   break;
1523                 }
1524             
1525             /* Check to see if the string matches a language name.
1526                Note - we rely upon the alpha-sorted nature of the entries in
1527                the lang_names array, specifically that shorter names appear
1528                before their longer variants.  (i.e. C before C++).  That way
1529                when we are attempting to match --help=c for example we will
1530                match with C first and not C++.  */
1531             for (i = 0, lang_flag = 0; i < cl_lang_count; i++)
1532               if (strncasecmp (a, lang_names[i], len) == 0)
1533                 {
1534                   lang_flag = 1U << i;
1535                   break;
1536                 }
1537
1538             if (specific_flag != 0)
1539               {
1540                 if (lang_flag == 0)
1541                   * pflags |= specific_flag;
1542                 else
1543                   {
1544                     /* The option's argument matches both the start of a
1545                        language name and the start of an option class name.
1546                        We have a special case for when the user has
1547                        specified "--help=c", but otherwise we have to issue
1548                        a warning.  */
1549                     if (strncasecmp (a, "c", len) == 0)
1550                       * pflags |= lang_flag;
1551                     else
1552                       fnotice (stderr,
1553                                "warning: --help argument %.*s is ambiguous, please be more specific\n",
1554                                len, a);
1555                   }
1556               }
1557             else if (lang_flag != 0)
1558               * pflags |= lang_flag;
1559             else
1560               fnotice (stderr,
1561                        "warning: unrecognized argument to --help= option: %.*s\n",
1562                        len, a);
1563
1564             if (comma == NULL)
1565               break;
1566             a = comma + 1;
1567           }
1568
1569         if (include_flags)
1570           print_specific_help (include_flags, exclude_flags, 0);
1571         exit_after_options = true;
1572         break;
1573       }
1574
1575     case OPT__version:
1576       print_version (stderr, "");
1577       exit_after_options = true;
1578       break;
1579
1580     case OPT_G:
1581       g_switch_value = value;
1582       g_switch_set = true;
1583       break;
1584
1585     case OPT_O:
1586     case OPT_Os:
1587       /* Currently handled in a prescan.  */
1588       break;
1589
1590     case OPT_W:
1591       /* For backward compatibility, -W is the same as -Wextra.  */
1592       set_Wextra (value);
1593       break;
1594
1595     case OPT_Wdisallowed_function_list_:
1596       warn_disallowed_functions = true;
1597       add_comma_separated_to_vector
1598         (&warning_disallowed_functions, arg);
1599       break;
1600
1601     case OPT_Werror_:
1602       enable_warning_as_error (arg, value, lang_mask);
1603       break;
1604
1605     case OPT_Wextra:
1606       set_Wextra (value);
1607       break;
1608
1609     case OPT_Wlarger_than_:
1610       /* This form corresponds to -Wlarger-than-.  
1611          Kept for backward compatibility. 
1612          Don't use it as the first argument of warning().  */
1613
1614     case OPT_Wlarger_than_eq:
1615       larger_than_size = value;
1616       warn_larger_than = value != -1;
1617       break;
1618
1619     case OPT_Wframe_larger_than_:
1620       frame_larger_than_size = value;
1621       warn_frame_larger_than = value != -1;
1622       break;
1623
1624     case OPT_Wstrict_aliasing:
1625       set_Wstrict_aliasing (value);
1626       break;
1627
1628     case OPT_Wstrict_aliasing_:
1629       warn_strict_aliasing = value;
1630       break;
1631
1632     case OPT_Wstrict_overflow:
1633       warn_strict_overflow = (value
1634                               ? (int) WARN_STRICT_OVERFLOW_CONDITIONAL
1635                               : 0);
1636       break;
1637
1638     case OPT_Wstrict_overflow_:
1639       warn_strict_overflow = value;
1640       break;
1641
1642     case OPT_Wunused:
1643       warn_unused = value;
1644       break;
1645
1646     case OPT_aux_info:
1647     case OPT_aux_info_:
1648       aux_info_file_name = arg;
1649       flag_gen_aux_info = 1;
1650       break;
1651
1652     case OPT_auxbase:
1653       aux_base_name = arg;
1654       break;
1655
1656     case OPT_auxbase_strip:
1657       {
1658         char *tmp = xstrdup (arg);
1659         strip_off_ending (tmp, strlen (tmp));
1660         if (tmp[0])
1661           aux_base_name = tmp;
1662       }
1663       break;
1664
1665     case OPT_d:
1666       decode_d_option (arg);
1667       break;
1668
1669     case OPT_dumpbase:
1670       dump_base_name = arg;
1671       break;
1672
1673     case OPT_falign_functions_:
1674       align_functions = value;
1675       break;
1676
1677     case OPT_falign_jumps_:
1678       align_jumps = value;
1679       break;
1680
1681     case OPT_falign_labels_:
1682       align_labels = value;
1683       break;
1684
1685     case OPT_falign_loops_:
1686       align_loops = value;
1687       break;
1688
1689     case OPT_fbranch_probabilities:
1690       flag_branch_probabilities_set = true;
1691       break;
1692
1693     case OPT_fcall_used_:
1694       fix_register (arg, 0, 1);
1695       break;
1696
1697     case OPT_fcall_saved_:
1698       fix_register (arg, 0, 0);
1699       break;
1700
1701     case OPT_fdbg_cnt_:
1702       dbg_cnt_process_opt (arg);
1703       break;
1704
1705     case OPT_fdbg_cnt_list:
1706       dbg_cnt_list_all_counters ();
1707       break;
1708
1709     case OPT_fdebug_prefix_map_:
1710       add_debug_prefix_map (arg);
1711       break;
1712
1713     case OPT_fdiagnostics_show_location_:
1714       if (!strcmp (arg, "once"))
1715         diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
1716       else if (!strcmp (arg, "every-line"))
1717         diagnostic_prefixing_rule (global_dc)
1718           = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE;
1719       else
1720         return 0;
1721       break;
1722
1723     case OPT_fdiagnostics_show_option:
1724       global_dc->show_option_requested = true;
1725       break;
1726
1727     case OPT_fdump_:
1728       if (!dump_switch_p (arg))
1729         return 0;
1730       break;
1731
1732     case OPT_ffast_math:
1733       set_fast_math_flags (value);
1734       break;
1735
1736     case OPT_funsafe_math_optimizations:
1737       set_unsafe_math_optimizations_flags (value);
1738       break;
1739
1740     case OPT_ffixed_:
1741       fix_register (arg, 1, 1);
1742       break;
1743
1744     case OPT_finline_limit_:
1745     case OPT_finline_limit_eq:
1746       set_param_value ("max-inline-insns-single", value / 2);
1747       set_param_value ("max-inline-insns-auto", value / 2);
1748       break;
1749
1750     case OPT_finstrument_functions_exclude_function_list_:
1751       add_comma_separated_to_vector
1752         (&flag_instrument_functions_exclude_functions, arg);
1753       break;
1754
1755     case OPT_finstrument_functions_exclude_file_list_:
1756       add_comma_separated_to_vector
1757         (&flag_instrument_functions_exclude_files, arg);
1758       break;
1759
1760     case OPT_fmessage_length_:
1761       pp_set_line_maximum_length (global_dc->printer, value);
1762       break;
1763
1764     case OPT_fpack_struct_:
1765       if (value <= 0 || (value & (value - 1)) || value > 16)
1766         error ("structure alignment must be a small power of two, not %d", value);
1767       else
1768         {
1769           initial_max_fld_align = value;
1770           maximum_field_alignment = value * BITS_PER_UNIT;
1771         }
1772       break;
1773
1774     case OPT_fpeel_loops:
1775       flag_peel_loops_set = true;
1776       break;
1777
1778     case OPT_fprofile_arcs:
1779       profile_arc_flag_set = true;
1780       break;
1781
1782     case OPT_finline_functions:
1783       flag_inline_functions_set = true;
1784       break;
1785
1786     case OPT_fprofile_dir_:
1787       profile_data_prefix = xstrdup (arg);
1788       break;
1789
1790     case OPT_fprofile_use_:
1791       profile_data_prefix = xstrdup (arg);
1792       flag_profile_use = true;
1793       value = true;
1794       /* No break here - do -fprofile-use processing. */
1795     case OPT_fprofile_use:
1796       if (!flag_branch_probabilities_set)
1797         flag_branch_probabilities = value;
1798       if (!flag_profile_values_set)
1799         flag_profile_values = value;
1800       if (!flag_unroll_loops_set)
1801         flag_unroll_loops = value;
1802       if (!flag_peel_loops_set)
1803         flag_peel_loops = value;
1804       if (!flag_tracer_set)
1805         flag_tracer = value;
1806       if (!flag_value_profile_transformations_set)
1807         flag_value_profile_transformations = value;
1808       if (!flag_inline_functions_set)
1809         flag_inline_functions = value;
1810       if (!flag_ipa_cp_set)
1811         flag_ipa_cp = value;
1812       if (!flag_ipa_cp_clone_set
1813           && value && flag_ipa_cp)
1814         flag_ipa_cp_clone = value;
1815       if (!flag_predictive_commoning_set)
1816         flag_predictive_commoning = value;
1817       if (!flag_unswitch_loops_set)
1818         flag_unswitch_loops = value;
1819       if (!flag_gcse_after_reload_set)
1820         flag_gcse_after_reload = value;
1821       break;
1822
1823     case OPT_fprofile_generate_:
1824       profile_data_prefix = xstrdup (arg);
1825       value = true;
1826       /* No break here - do -fprofile-generate processing. */
1827     case OPT_fprofile_generate:
1828       if (!profile_arc_flag_set)
1829         profile_arc_flag = value;
1830       if (!flag_profile_values_set)
1831         flag_profile_values = value;
1832       if (!flag_value_profile_transformations_set)
1833         flag_value_profile_transformations = value;
1834       if (!flag_inline_functions_set)
1835         flag_inline_functions = value;
1836       break;
1837
1838     case OPT_fprofile_values:
1839       flag_profile_values_set = true;
1840       break;
1841
1842     case OPT_fvisibility_:
1843       {
1844         if (!strcmp(arg, "default"))
1845           default_visibility = VISIBILITY_DEFAULT;
1846         else if (!strcmp(arg, "internal"))
1847           default_visibility = VISIBILITY_INTERNAL;
1848         else if (!strcmp(arg, "hidden"))
1849           default_visibility = VISIBILITY_HIDDEN;
1850         else if (!strcmp(arg, "protected"))
1851           default_visibility = VISIBILITY_PROTECTED;
1852         else
1853           error ("unrecognized visibility value \"%s\"", arg);
1854       }
1855       break;
1856
1857     case OPT_fvpt:
1858       flag_value_profile_transformations_set = true;
1859       break;
1860
1861     case OPT_frandom_seed:
1862       /* The real switch is -fno-random-seed.  */
1863       if (value)
1864         return 0;
1865       set_random_seed (NULL);
1866       break;
1867
1868     case OPT_frandom_seed_:
1869       set_random_seed (arg);
1870       break;
1871
1872     case OPT_fselective_scheduling:
1873     case OPT_fselective_scheduling2:
1874       sel_sched_switch_set = true;
1875       break;
1876
1877     case OPT_fsched_verbose_:
1878 #ifdef INSN_SCHEDULING
1879       fix_sched_param ("verbose", arg);
1880       break;
1881 #else
1882       return 0;
1883 #endif
1884
1885     case OPT_fsched_stalled_insns_:
1886       flag_sched_stalled_insns = value;
1887       if (flag_sched_stalled_insns == 0)
1888         flag_sched_stalled_insns = -1;
1889       break;
1890
1891     case OPT_fsched_stalled_insns_dep_:
1892       flag_sched_stalled_insns_dep = value;
1893       break;
1894
1895     case OPT_fstack_check_:
1896       if (!strcmp (arg, "no"))
1897         flag_stack_check = NO_STACK_CHECK;
1898       else if (!strcmp (arg, "generic"))
1899         /* This is the old stack checking method.  */
1900         flag_stack_check = STACK_CHECK_BUILTIN
1901                            ? FULL_BUILTIN_STACK_CHECK
1902                            : GENERIC_STACK_CHECK;
1903       else if (!strcmp (arg, "specific"))
1904         /* This is the new stack checking method.  */
1905         flag_stack_check = STACK_CHECK_BUILTIN
1906                            ? FULL_BUILTIN_STACK_CHECK
1907                            : STACK_CHECK_STATIC_BUILTIN
1908                              ? STATIC_BUILTIN_STACK_CHECK
1909                              : GENERIC_STACK_CHECK;
1910       else
1911         warning (0, "unknown stack check parameter \"%s\"", arg);
1912       break;
1913
1914     case OPT_fstack_check:
1915       /* This is the same as the "specific" mode above.  */
1916       if (value)
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         flag_stack_check = NO_STACK_CHECK;
1924       break;
1925
1926     case OPT_fstack_limit:
1927       /* The real switch is -fno-stack-limit.  */
1928       if (value)
1929         return 0;
1930       stack_limit_rtx = NULL_RTX;
1931       break;
1932
1933     case OPT_fstack_limit_register_:
1934       {
1935         int reg = decode_reg_name (arg);
1936         if (reg < 0)
1937           error ("unrecognized register name \"%s\"", arg);
1938         else
1939           stack_limit_rtx = gen_rtx_REG (Pmode, reg);
1940       }
1941       break;
1942
1943     case OPT_fstack_limit_symbol_:
1944       stack_limit_rtx = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (arg));
1945       break;
1946
1947     case OPT_ftree_vectorizer_verbose_:
1948       vect_set_verbosity_level (arg);
1949       break;
1950
1951     case OPT_ftls_model_:
1952       if (!strcmp (arg, "global-dynamic"))
1953         flag_tls_default = TLS_MODEL_GLOBAL_DYNAMIC;
1954       else if (!strcmp (arg, "local-dynamic"))
1955         flag_tls_default = TLS_MODEL_LOCAL_DYNAMIC;
1956       else if (!strcmp (arg, "initial-exec"))
1957         flag_tls_default = TLS_MODEL_INITIAL_EXEC;
1958       else if (!strcmp (arg, "local-exec"))
1959         flag_tls_default = TLS_MODEL_LOCAL_EXEC;
1960       else
1961         warning (0, "unknown tls-model \"%s\"", arg);
1962       break;
1963
1964     case OPT_fira_algorithm_:
1965       if (!strcmp (arg, "regional"))
1966         flag_ira_algorithm = IRA_ALGORITHM_REGIONAL;
1967       else if (!strcmp (arg, "CB"))
1968         flag_ira_algorithm = IRA_ALGORITHM_CB;
1969       else if (!strcmp (arg, "mixed"))
1970         flag_ira_algorithm = IRA_ALGORITHM_MIXED;
1971       else
1972         warning (0, "unknown ira algorithm \"%s\"", arg);
1973       break;
1974
1975     case OPT_fira_verbose_:
1976       flag_ira_verbose = value;
1977       break;
1978
1979     case OPT_ftracer:
1980       flag_tracer_set = true;
1981       break;
1982
1983     case OPT_fipa_cp:
1984       flag_ipa_cp_set = true;
1985       break;
1986
1987     case OPT_fipa_cp_clone:
1988       flag_ipa_cp_clone_set = true;
1989       break;
1990
1991     case OPT_fpredictive_commoning:
1992       flag_predictive_commoning_set = true;
1993       break;
1994
1995     case OPT_funswitch_loops:
1996       flag_unswitch_loops_set = true;
1997       break;
1998
1999     case OPT_fgcse_after_reload:
2000       flag_gcse_after_reload_set = true;
2001       break;
2002
2003     case OPT_funroll_loops:
2004       flag_unroll_loops_set = true;
2005       break;
2006
2007     case OPT_g:
2008       set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, arg);
2009       break;
2010
2011     case OPT_gcoff:
2012       set_debug_level (SDB_DEBUG, false, arg);
2013       break;
2014
2015     case OPT_gdwarf_2:
2016       set_debug_level (DWARF2_DEBUG, false, arg);
2017       break;
2018
2019     case OPT_ggdb:
2020       set_debug_level (NO_DEBUG, 2, arg);
2021       break;
2022
2023     case OPT_gstabs:
2024     case OPT_gstabs_:
2025       set_debug_level (DBX_DEBUG, code == OPT_gstabs_, arg);
2026       break;
2027
2028     case OPT_gvms:
2029       set_debug_level (VMS_DEBUG, false, arg);
2030       break;
2031
2032     case OPT_gxcoff:
2033     case OPT_gxcoff_:
2034       set_debug_level (XCOFF_DEBUG, code == OPT_gxcoff_, arg);
2035       break;
2036
2037     case OPT_o:
2038       asm_file_name = arg;
2039       break;
2040
2041     case OPT_pedantic_errors:
2042       flag_pedantic_errors = pedantic = 1;
2043       break;
2044
2045     case OPT_floop_optimize:
2046     case OPT_frerun_loop_opt:
2047     case OPT_fstrength_reduce:
2048     case OPT_ftree_store_copy_prop:
2049     case OPT_fforce_addr:
2050     case OPT_ftree_salias:
2051       /* These are no-ops, preserved for backward compatibility.  */
2052       break;
2053
2054     default:
2055       /* If the flag was handled in a standard way, assume the lack of
2056          processing here is intentional.  */
2057       gcc_assert (cl_options[scode].flag_var);
2058       break;
2059     }
2060
2061   return 1;
2062 }
2063
2064 /* Handle --param NAME=VALUE.  */
2065 static void
2066 handle_param (const char *carg)
2067 {
2068   char *equal, *arg;
2069   int value;
2070
2071   arg = xstrdup (carg);
2072   equal = strchr (arg, '=');
2073   if (!equal)
2074     error ("%s: --param arguments should be of the form NAME=VALUE", arg);
2075   else
2076     {
2077       value = integral_argument (equal + 1);
2078       if (value == -1)
2079         error ("invalid --param value %qs", equal + 1);
2080       else
2081         {
2082           *equal = '\0';
2083           set_param_value (arg, value);
2084         }
2085     }
2086
2087   free (arg);
2088 }
2089
2090 /* Handle -W and -Wextra.  */
2091 static void
2092 set_Wextra (int setting)
2093 {
2094   extra_warnings = setting;
2095
2096   /* We save the value of warn_uninitialized, since if they put
2097      -Wuninitialized on the command line, we need to generate a
2098      warning about not using it without also specifying -O.  */
2099   if (setting == 0)
2100     warn_uninitialized = 0;
2101   else if (warn_uninitialized != 1)
2102     warn_uninitialized = 2;
2103 }
2104
2105 /* Used to set the level of strict aliasing warnings, 
2106    when no level is specified (i.e., when -Wstrict-aliasing, and not
2107    -Wstrict-aliasing=level was given).
2108    ONOFF is assumed to take value 1 when -Wstrict-aliasing is specified,
2109    and 0 otherwise.  After calling this function, wstrict_aliasing will be
2110    set to the default value of -Wstrict_aliasing=level, currently 3.  */
2111 void
2112 set_Wstrict_aliasing (int onoff)
2113 {
2114   gcc_assert (onoff == 0 || onoff == 1);
2115   if (onoff != 0)
2116     warn_strict_aliasing = 3;
2117   else
2118     warn_strict_aliasing = 0;
2119 }
2120
2121 /* The following routines are useful in setting all the flags that
2122    -ffast-math and -fno-fast-math imply.  */
2123 void
2124 set_fast_math_flags (int set)
2125 {
2126   flag_unsafe_math_optimizations = set;
2127   set_unsafe_math_optimizations_flags (set);
2128   flag_finite_math_only = set;
2129   flag_errno_math = !set;
2130   if (set)
2131     {
2132       flag_signaling_nans = 0;
2133       flag_rounding_math = 0;
2134       flag_cx_limited_range = 1;
2135     }
2136 }
2137
2138 /* When -funsafe-math-optimizations is set the following 
2139    flags are set as well.  */ 
2140 void
2141 set_unsafe_math_optimizations_flags (int set)
2142 {
2143   flag_trapping_math = !set;
2144   flag_signed_zeros = !set;
2145   flag_associative_math = set;
2146   flag_reciprocal_math = set;
2147 }
2148
2149 /* Return true iff flags are set as if -ffast-math.  */
2150 bool
2151 fast_math_flags_set_p (void)
2152 {
2153   return (!flag_trapping_math
2154           && flag_unsafe_math_optimizations
2155           && flag_finite_math_only
2156           && !flag_signed_zeros
2157           && !flag_errno_math);
2158 }
2159
2160 /* Return true iff flags are set as if -ffast-math but using the flags stored
2161    in the struct cl_optimization structure.  */
2162 bool
2163 fast_math_flags_struct_set_p (struct cl_optimization *opt)
2164 {
2165   return (!opt->flag_trapping_math
2166           && opt->flag_unsafe_math_optimizations
2167           && opt->flag_finite_math_only
2168           && !opt->flag_signed_zeros
2169           && !opt->flag_errno_math);
2170 }
2171
2172 /* Handle a debug output -g switch.  EXTENDED is true or false to support
2173    extended output (2 is special and means "-ggdb" was given).  */
2174 static void
2175 set_debug_level (enum debug_info_type type, int extended, const char *arg)
2176 {
2177   static bool type_explicit;
2178
2179   use_gnu_debug_info_extensions = extended;
2180
2181   if (type == NO_DEBUG)
2182     {
2183       if (write_symbols == NO_DEBUG)
2184         {
2185           write_symbols = PREFERRED_DEBUGGING_TYPE;
2186
2187           if (extended == 2)
2188             {
2189 #ifdef DWARF2_DEBUGGING_INFO
2190               write_symbols = DWARF2_DEBUG;
2191 #elif defined DBX_DEBUGGING_INFO
2192               write_symbols = DBX_DEBUG;
2193 #endif
2194             }
2195
2196           if (write_symbols == NO_DEBUG)
2197             warning (0, "target system does not support debug output");
2198         }
2199     }
2200   else
2201     {
2202       /* Does it conflict with an already selected type?  */
2203       if (type_explicit && write_symbols != NO_DEBUG && type != write_symbols)
2204         error ("debug format \"%s\" conflicts with prior selection",
2205                debug_type_names[type]);
2206       write_symbols = type;
2207       type_explicit = true;
2208     }
2209
2210   /* A debug flag without a level defaults to level 2.  */
2211   if (*arg == '\0')
2212     {
2213       if (!debug_info_level)
2214         debug_info_level = 2;
2215     }
2216   else
2217     {
2218       debug_info_level = integral_argument (arg);
2219       if (debug_info_level == (unsigned int) -1)
2220         error ("unrecognised debug output level \"%s\"", arg);
2221       else if (debug_info_level > 3)
2222         error ("debug output level %s is too high", arg);
2223     }
2224 }
2225
2226 /* Return 1 if OPTION is enabled, 0 if it is disabled, or -1 if it isn't
2227    a simple on-off switch.  */
2228
2229 int
2230 option_enabled (int opt_idx)
2231 {
2232   const struct cl_option *option = &(cl_options[opt_idx]);
2233
2234   if (option->flag_var)
2235     switch (option->var_type)
2236       {
2237       case CLVC_BOOLEAN:
2238         return *(int *) option->flag_var != 0;
2239
2240       case CLVC_EQUAL:
2241         return *(int *) option->flag_var == option->var_value;
2242
2243       case CLVC_BIT_CLEAR:
2244         return (*(int *) option->flag_var & option->var_value) == 0;
2245
2246       case CLVC_BIT_SET:
2247         return (*(int *) option->flag_var & option->var_value) != 0;
2248
2249       case CLVC_STRING:
2250         break;
2251       }
2252   return -1;
2253 }
2254
2255 /* Fill STATE with the current state of option OPTION.  Return true if
2256    there is some state to store.  */
2257
2258 bool
2259 get_option_state (int option, struct cl_option_state *state)
2260 {
2261   if (cl_options[option].flag_var == 0)
2262     return false;
2263
2264   switch (cl_options[option].var_type)
2265     {
2266     case CLVC_BOOLEAN:
2267     case CLVC_EQUAL:
2268       state->data = cl_options[option].flag_var;
2269       state->size = sizeof (int);
2270       break;
2271
2272     case CLVC_BIT_CLEAR:
2273     case CLVC_BIT_SET:
2274       state->ch = option_enabled (option);
2275       state->data = &state->ch;
2276       state->size = 1;
2277       break;
2278
2279     case CLVC_STRING:
2280       state->data = *(const char **) cl_options[option].flag_var;
2281       if (state->data == 0)
2282         state->data = "";
2283       state->size = strlen ((const char *) state->data) + 1;
2284       break;
2285     }
2286   return true;
2287 }
2288
2289 /* Enable a warning option as an error.  This is used by -Werror= and
2290    also by legacy Werror-implicit-function-declaration.  */
2291
2292 void
2293 enable_warning_as_error (const char *arg, int value, unsigned int lang_mask)
2294 {
2295   char *new_option;
2296   int option_index;
2297
2298   new_option = XNEWVEC (char, strlen (arg) + 2);
2299   new_option[0] = 'W';
2300   strcpy (new_option + 1, arg);
2301   option_index = find_opt (new_option, lang_mask);
2302   if (option_index == N_OPTS)
2303     {
2304       error ("-Werror=%s: No option -%s", arg, new_option);
2305     }
2306   else
2307     {
2308       int kind = value ? DK_ERROR : DK_WARNING;
2309       diagnostic_classify_diagnostic (global_dc, option_index, kind);
2310       
2311       /* -Werror=foo implies -Wfoo.  */
2312       if (cl_options[option_index].var_type == CLVC_BOOLEAN
2313           && cl_options[option_index].flag_var
2314           && kind == DK_ERROR)
2315         *(int *) cl_options[option_index].flag_var = 1;
2316     }
2317   free (new_option);
2318 }