OSDN Git Service

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