OSDN Git Service

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