OSDN Git Service

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