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