OSDN Git Service

2007-12-19 Ed Schonberg <schonberg@adacore.com>
[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   /* The optimization to partition hot and cold basic blocks into separate
954      sections of the .o and executable files does not work (currently)
955      with exception handling.  This is because there is no support for
956      generating unwind info.  If flag_exceptions is turned on we need to
957      turn off the partitioning optimization.  */
958
959   if (flag_exceptions && flag_reorder_blocks_and_partition)
960     {
961       inform
962             ("-freorder-blocks-and-partition does not work with exceptions");
963       flag_reorder_blocks_and_partition = 0;
964       flag_reorder_blocks = 1;
965     }
966
967   /* If user requested unwind info, then turn off the partitioning
968      optimization.  */
969
970   if (flag_unwind_tables && ! targetm.unwind_tables_default
971       && flag_reorder_blocks_and_partition)
972     {
973       inform ("-freorder-blocks-and-partition does not support unwind info");
974       flag_reorder_blocks_and_partition = 0;
975       flag_reorder_blocks = 1;
976     }
977
978   /* If the target requested unwind info, then turn off the partitioning
979      optimization with a different message.  Likewise, if the target does not
980      support named sections.  */
981
982   if (flag_reorder_blocks_and_partition
983       && (!targetm.have_named_sections
984           || (flag_unwind_tables && targetm.unwind_tables_default)))
985     {
986       inform
987        ("-freorder-blocks-and-partition does not work on this architecture");
988       flag_reorder_blocks_and_partition = 0;
989       flag_reorder_blocks = 1;
990     }
991 }
992
993 #define LEFT_COLUMN     27
994
995 /* Output ITEM, of length ITEM_WIDTH, in the left column,
996    followed by word-wrapped HELP in a second column.  */
997 static void
998 wrap_help (const char *help,
999            const char *item,
1000            unsigned int item_width,
1001            unsigned int columns)
1002 {
1003   unsigned int col_width = LEFT_COLUMN;
1004   unsigned int remaining, room, len;
1005
1006   remaining = strlen (help);
1007
1008   do
1009     {
1010       room = columns - 3 - MAX (col_width, item_width);
1011       if (room > columns)
1012         room = 0;
1013       len = remaining;
1014
1015       if (room < len)
1016         {
1017           unsigned int i;
1018
1019           for (i = 0; help[i]; i++)
1020             {
1021               if (i >= room && len != remaining)
1022                 break;
1023               if (help[i] == ' ')
1024                 len = i;
1025               else if ((help[i] == '-' || help[i] == '/')
1026                        && help[i + 1] != ' '
1027                        && i > 0 && ISALPHA (help[i - 1]))
1028                 len = i + 1;
1029             }
1030         }
1031
1032       printf( "  %-*.*s %.*s\n", col_width, item_width, item, len, help);
1033       item_width = 0;
1034       while (help[len] == ' ')
1035         len++;
1036       help += len;
1037       remaining -= len;
1038     }
1039   while (remaining);
1040 }
1041
1042 /* Print help for a specific front-end, etc.  */
1043 static void
1044 print_filtered_help (unsigned int include_flags,
1045                      unsigned int exclude_flags,
1046                      unsigned int any_flags,
1047                      unsigned int columns)
1048 {
1049   unsigned int i;
1050   const char *help;
1051   static char *printed = NULL;
1052   bool found = false;
1053   bool displayed = false;
1054
1055   if (include_flags == CL_PARAMS)
1056     {
1057       for (i = 0; i < LAST_PARAM; i++)
1058         {
1059           const char *param = compiler_params[i].option;
1060
1061           help = compiler_params[i].help;
1062           if (help == NULL || *help == '\0')
1063             {
1064               if (exclude_flags & CL_UNDOCUMENTED)
1065                 continue;
1066               help = undocumented_msg;
1067             }
1068
1069           /* Get the translation.  */
1070           help = _(help);
1071
1072           wrap_help (help, param, strlen (param), columns);
1073         }
1074       putchar ('\n');
1075       return;
1076     }
1077
1078   if (!printed)
1079     printed = xcalloc (1, cl_options_count);
1080
1081   for (i = 0; i < cl_options_count; i++)
1082     {
1083       static char new_help[128];
1084       const struct cl_option *option = cl_options + i;
1085       unsigned int len;
1086       const char *opt;
1087       const char *tab;
1088
1089       if (include_flags == 0
1090           || ((option->flags & include_flags) != include_flags))
1091         {
1092           if ((option->flags & any_flags) == 0)
1093             continue;
1094         }
1095
1096       /* Skip unwanted switches.  */
1097       if ((option->flags & exclude_flags) != 0)
1098         continue;
1099
1100       found = true;
1101       /* Skip switches that have already been printed.  */
1102       if (printed[i])
1103         continue;
1104
1105       printed[i] = true;
1106
1107       help = option->help;
1108       if (help == NULL)
1109         {
1110           if (exclude_flags & CL_UNDOCUMENTED)
1111             continue;
1112           help = undocumented_msg;
1113         }
1114
1115       /* Get the translation.  */
1116       help = _(help);
1117
1118       /* Find the gap between the name of the
1119          option and its descriptive text.  */
1120       tab = strchr (help, '\t');
1121       if (tab)
1122         {
1123           len = tab - help;
1124           opt = help;
1125           help = tab + 1;
1126         }
1127       else
1128         {
1129           opt = option->opt_text;
1130           len = strlen (opt);
1131         }
1132
1133       /* With the -Q option enabled we change the descriptive text associated
1134          with an option to be an indication of its current setting.  */
1135       if (!quiet_flag)
1136         {
1137           if (len < (LEFT_COLUMN + 2))
1138             strcpy (new_help, "\t\t");
1139           else
1140             strcpy (new_help, "\t");
1141
1142           if (option->flag_var != NULL)
1143             {
1144               if (option->flags & CL_JOINED)
1145                 {
1146                   if (option->var_type == CLVC_STRING)
1147                     {
1148                       if (* (const char **) option->flag_var != NULL)
1149                         snprintf (new_help + strlen (new_help),
1150                                   sizeof (new_help) - strlen (new_help),
1151                                   * (const char **) option->flag_var);
1152                     }
1153                   else
1154                     sprintf (new_help + strlen (new_help),
1155                              "%#x", * (int *) option->flag_var);
1156                 }
1157               else
1158                 strcat (new_help, option_enabled (i)
1159                         ? _("[enabled]") : _("[disabled]"));
1160             }
1161
1162           help = new_help;
1163         }
1164
1165       wrap_help (help, opt, len, columns);
1166       displayed = true;
1167     }
1168
1169   if (! found)
1170     printf (_(" No options with the desired characteristics were found\n"));
1171   else if (! displayed)
1172     printf (_(" All options with the desired characteristics have already been displayed\n"));
1173
1174   putchar ('\n');
1175 }
1176
1177 /* Display help for a specified type of option.
1178    The options must have ALL of the INCLUDE_FLAGS set
1179    ANY of the flags in the ANY_FLAGS set
1180    and NONE of the EXCLUDE_FLAGS set.  */
1181 static void
1182 print_specific_help (unsigned int include_flags,
1183                      unsigned int exclude_flags,
1184                      unsigned int any_flags)
1185 {
1186   unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1187   const char * description = NULL;
1188   const char * descrip_extra = "";
1189   size_t i;
1190   unsigned int flag;
1191   static unsigned int columns = 0;
1192
1193   /* Sanity check: Make sure that we do not have more
1194      languages than we have bits available to enumerate them.  */
1195   gcc_assert ((1U << cl_lang_count) < CL_MIN_OPTION_CLASS);
1196
1197   /* If we have not done so already, obtain
1198      the desired maximum width of the output.  */
1199   if (columns == 0)
1200     {
1201       const char *p;
1202
1203       GET_ENVIRONMENT (p, "COLUMNS");
1204       if (p != NULL)
1205         {
1206           int value = atoi (p);
1207
1208           if (value > 0)
1209             columns = value;
1210         }
1211
1212       if (columns == 0)
1213         /* Use a reasonable default.  */
1214         columns = 80;
1215     }
1216
1217   /* Decide upon the title for the options that we are going to display.  */
1218   for (i = 0, flag = 1; flag <= CL_MAX_OPTION_CLASS; flag <<= 1, i ++)
1219     {
1220       switch (flag & include_flags)
1221         {
1222         case 0:
1223           break;
1224
1225         case CL_TARGET:
1226           description = _("The following options are target specific");
1227           break;
1228         case CL_WARNING:
1229           description = _("The following options control compiler warning messages");
1230           break;
1231         case CL_OPTIMIZATION:
1232           description = _("The following options control optimizations");
1233           break;
1234         case CL_COMMON:
1235           description = _("The following options are language-independent");
1236           break;
1237         case CL_PARAMS:
1238           description = _("The --param option recognizes the following as parameters");
1239           break;
1240         default:
1241           if (i >= cl_lang_count)
1242             break;
1243           if ((exclude_flags & ((1U << cl_lang_count) - 1)) != 0)
1244             {
1245               description = _("The following options are specific to the language ");
1246               descrip_extra = lang_names [i];
1247             }
1248           else
1249             description = _("The following options are supported by the language ");
1250             descrip_extra = lang_names [i];
1251           break;
1252         }
1253     }
1254
1255   if (description == NULL)
1256     {
1257       if (any_flags == 0)
1258         {
1259           if (include_flags == CL_UNDOCUMENTED)
1260             description = _("The following options are not documented");
1261           else
1262             {
1263               internal_error ("unrecognized include_flags 0x%x passed to print_specific_help",
1264                               include_flags);
1265               return;
1266             }
1267         }
1268       else
1269         {
1270           if (any_flags & all_langs_mask)
1271             description = _("The following options are language-related");
1272           else
1273             description = _("The following options are language-independent");
1274         }
1275     }
1276
1277   printf ("%s%s:\n", description, descrip_extra);
1278   print_filtered_help (include_flags, exclude_flags, any_flags, columns);
1279 }
1280
1281 /* Handle target- and language-independent options.  Return zero to
1282    generate an "unknown option" message.  Only options that need
1283    extra handling need to be listed here; if you simply want
1284    VALUE assigned to a variable, it happens automatically.  */
1285
1286 static int
1287 common_handle_option (size_t scode, const char *arg, int value,
1288                       unsigned int lang_mask)
1289 {
1290   enum opt_code code = (enum opt_code) scode;
1291
1292   switch (code)
1293     {
1294     case OPT__param:
1295       handle_param (arg);
1296       break;
1297
1298     case OPT_fhelp:
1299     case OPT__help:
1300       {
1301         unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1302         unsigned int undoc_mask;
1303         unsigned int i;
1304
1305         undoc_mask = extra_warnings ? 0 : CL_UNDOCUMENTED;
1306         /* First display any single language specific options.  */
1307         for (i = 0; i < cl_lang_count; i++)
1308           print_specific_help
1309             (1U << i, (all_langs_mask & (~ (1U << i))) | undoc_mask, 0);
1310         /* Next display any multi language specific options.  */
1311         print_specific_help (0, undoc_mask, all_langs_mask);
1312         /* Then display any remaining, non-language options.  */
1313         for (i = CL_MIN_OPTION_CLASS; i <= CL_MAX_OPTION_CLASS; i <<= 1)
1314           print_specific_help (i, undoc_mask, 0);
1315         exit_after_options = true;
1316         break;
1317       }
1318
1319     case OPT_ftarget_help:
1320     case OPT__target_help:
1321       print_specific_help (CL_TARGET, CL_UNDOCUMENTED, 0);
1322       exit_after_options = true;
1323
1324       /* Allow the target a chance to give the user some additional information.  */
1325       if (targetm.target_help)
1326         targetm.target_help ();
1327       break;
1328
1329     case OPT_fhelp_:
1330     case OPT__help_:
1331       {
1332         const char * a = arg;
1333         unsigned int include_flags = 0;
1334         /* Note - by default we include undocumented options when listing
1335            specific classes.  If you only want to see documented options
1336            then add ",^undocumented" to the --help= option.  e.g.:
1337
1338            --help=target,^undocumented  */
1339         unsigned int exclude_flags = 0;
1340
1341         /* Walk along the argument string, parsing each word in turn.
1342            The format is:
1343            arg = [^]{word}[,{arg}]
1344            word = {optimizers|target|warnings|undocumented|
1345                    params|common|<language>}  */
1346         while (* a != 0)
1347           {
1348             static struct
1349             {
1350               const char * string;
1351               unsigned int flag;
1352             }
1353             specifics[] =
1354             {
1355               { "optimizers", CL_OPTIMIZATION },
1356               { "target", CL_TARGET },
1357               { "warnings", CL_WARNING },
1358               { "undocumented", CL_UNDOCUMENTED },
1359               { "params", CL_PARAMS },
1360               { "joined", CL_JOINED },
1361               { "separate", CL_SEPARATE },
1362               { "common", CL_COMMON },
1363               { NULL, 0 }
1364             };
1365             unsigned int * pflags;
1366             char * comma;
1367             unsigned int len;
1368             unsigned int i;
1369
1370             if (* a == '^')
1371               {
1372                 ++ a;
1373                 pflags = & exclude_flags;
1374               }
1375             else
1376               pflags = & include_flags;
1377
1378             comma = strchr (a, ',');
1379             if (comma == NULL)
1380               len = strlen (a);
1381             else
1382               len = comma - a;
1383
1384             for (i = 0; specifics[i].string != NULL; i++)
1385               if (strncasecmp (a, specifics[i].string, len) == 0)
1386                 {
1387                   * pflags |= specifics[i].flag;
1388                   break;
1389                 }
1390
1391             if (specifics[i].string == NULL)
1392               {
1393                 /* Check to see if the string matches a language name.  */
1394                 for (i = 0; i < cl_lang_count; i++)
1395                   if (strncasecmp (a, lang_names[i], len) == 0)
1396                     {
1397                       * pflags |= 1U << i;
1398                       break;
1399                     }
1400
1401                 if (i == cl_lang_count)
1402                   fnotice (stderr,
1403                            "warning: unrecognized argument to --help= switch: %.*s\n",
1404                            len, a);
1405               }
1406
1407             if (comma == NULL)
1408               break;
1409             a = comma + 1;
1410           }
1411
1412         if (include_flags)
1413           print_specific_help (include_flags, exclude_flags, 0);
1414         exit_after_options = true;
1415         break;
1416       }
1417
1418     case OPT__version:
1419       print_version (stderr, "");
1420       exit_after_options = true;
1421       break;
1422
1423     case OPT_G:
1424       g_switch_value = value;
1425       g_switch_set = true;
1426       break;
1427
1428     case OPT_O:
1429     case OPT_Os:
1430       /* Currently handled in a prescan.  */
1431       break;
1432
1433     case OPT_W:
1434       /* For backward compatibility, -W is the same as -Wextra.  */
1435       set_Wextra (value);
1436       break;
1437
1438     case OPT_Werror_:
1439       enable_warning_as_error (arg, value, lang_mask);
1440       break;
1441
1442     case OPT_Wextra:
1443       set_Wextra (value);
1444       break;
1445
1446     case OPT_Wlarger_than_:
1447       larger_than_size = value;
1448       warn_larger_than = value != -1;
1449       break;
1450
1451     case OPT_Wstrict_aliasing:
1452       set_Wstrict_aliasing (value);
1453       break;
1454
1455     case OPT_Wstrict_aliasing_:
1456       warn_strict_aliasing = value;
1457       break;
1458
1459     case OPT_Wstrict_overflow:
1460       warn_strict_overflow = (value
1461                               ? (int) WARN_STRICT_OVERFLOW_CONDITIONAL
1462                               : 0);
1463       break;
1464
1465     case OPT_Wstrict_overflow_:
1466       warn_strict_overflow = value;
1467       break;
1468
1469     case OPT_Wunused:
1470       set_Wunused (value);
1471       break;
1472
1473     case OPT_aux_info:
1474     case OPT_aux_info_:
1475       aux_info_file_name = arg;
1476       flag_gen_aux_info = 1;
1477       break;
1478
1479     case OPT_auxbase:
1480       aux_base_name = arg;
1481       break;
1482
1483     case OPT_auxbase_strip:
1484       {
1485         char *tmp = xstrdup (arg);
1486         strip_off_ending (tmp, strlen (tmp));
1487         if (tmp[0])
1488           aux_base_name = tmp;
1489       }
1490       break;
1491
1492     case OPT_d:
1493       decode_d_option (arg);
1494       break;
1495
1496     case OPT_dumpbase:
1497       dump_base_name = arg;
1498       break;
1499
1500     case OPT_falign_functions_:
1501       align_functions = value;
1502       break;
1503
1504     case OPT_falign_jumps_:
1505       align_jumps = value;
1506       break;
1507
1508     case OPT_falign_labels_:
1509       align_labels = value;
1510       break;
1511
1512     case OPT_falign_loops_:
1513       align_loops = value;
1514       break;
1515
1516     case OPT_fbranch_probabilities:
1517       flag_branch_probabilities_set = true;
1518       break;
1519
1520     case OPT_fcall_used_:
1521       fix_register (arg, 0, 1);
1522       break;
1523
1524     case OPT_fcall_saved_:
1525       fix_register (arg, 0, 0);
1526       break;
1527
1528     case OPT_fdbg_cnt_:
1529       dbg_cnt_process_opt (arg);
1530       break;
1531
1532     case OPT_fdbg_cnt_list:
1533       dbg_cnt_list_all_counters ();
1534       break;
1535
1536     case OPT_fdebug_prefix_map_:
1537       add_debug_prefix_map (arg);
1538       break;
1539
1540     case OPT_fdiagnostics_show_location_:
1541       if (!strcmp (arg, "once"))
1542         diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
1543       else if (!strcmp (arg, "every-line"))
1544         diagnostic_prefixing_rule (global_dc)
1545           = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE;
1546       else
1547         return 0;
1548       break;
1549
1550     case OPT_fdiagnostics_show_option:
1551       global_dc->show_option_requested = true;
1552       break;
1553
1554     case OPT_fdump_:
1555       if (!dump_switch_p (arg))
1556         return 0;
1557       break;
1558
1559     case OPT_ffast_math:
1560       set_fast_math_flags (value);
1561       break;
1562
1563     case OPT_funsafe_math_optimizations:
1564       set_unsafe_math_optimizations_flags (value);
1565       break;
1566
1567     case OPT_ffixed_:
1568       fix_register (arg, 1, 1);
1569       break;
1570
1571     case OPT_finline_limit_:
1572     case OPT_finline_limit_eq:
1573       set_param_value ("max-inline-insns-single", value / 2);
1574       set_param_value ("max-inline-insns-auto", value / 2);
1575       break;
1576
1577     case OPT_finstrument_functions_exclude_function_list_:
1578       add_instrument_functions_exclude_list
1579         (&flag_instrument_functions_exclude_functions, arg);
1580       break;
1581
1582     case OPT_finstrument_functions_exclude_file_list_:
1583       add_instrument_functions_exclude_list
1584         (&flag_instrument_functions_exclude_files, arg);
1585       break;
1586
1587     case OPT_fmessage_length_:
1588       pp_set_line_maximum_length (global_dc->printer, value);
1589       break;
1590
1591     case OPT_fpack_struct_:
1592       if (value <= 0 || (value & (value - 1)) || value > 16)
1593         error ("structure alignment must be a small power of two, not %d", value);
1594       else
1595         {
1596           initial_max_fld_align = value;
1597           maximum_field_alignment = value * BITS_PER_UNIT;
1598         }
1599       break;
1600
1601     case OPT_fpeel_loops:
1602       flag_peel_loops_set = true;
1603       break;
1604
1605     case OPT_fprofile_arcs:
1606       profile_arc_flag_set = true;
1607       break;
1608
1609     case OPT_finline_functions:
1610       flag_inline_functions_set = true;
1611       break;
1612
1613     case OPT_fprofile_use:
1614       if (!flag_branch_probabilities_set)
1615         flag_branch_probabilities = value;
1616       if (!flag_profile_values_set)
1617         flag_profile_values = value;
1618       if (!flag_unroll_loops_set)
1619         flag_unroll_loops = value;
1620       if (!flag_peel_loops_set)
1621         flag_peel_loops = value;
1622       if (!flag_tracer_set)
1623         flag_tracer = value;
1624       if (!flag_value_profile_transformations_set)
1625         flag_value_profile_transformations = value;
1626       if (!flag_inline_functions_set)
1627         flag_inline_functions = value;
1628       break;
1629
1630     case OPT_fprofile_generate:
1631       if (!profile_arc_flag_set)
1632         profile_arc_flag = value;
1633       if (!flag_profile_values_set)
1634         flag_profile_values = value;
1635       if (!flag_value_profile_transformations_set)
1636         flag_value_profile_transformations = value;
1637       if (!flag_inline_functions_set)
1638         flag_inline_functions = value;
1639       break;
1640
1641     case OPT_fprofile_values:
1642       flag_profile_values_set = true;
1643       break;
1644
1645     case OPT_fvisibility_:
1646       {
1647         if (!strcmp(arg, "default"))
1648           default_visibility = VISIBILITY_DEFAULT;
1649         else if (!strcmp(arg, "internal"))
1650           default_visibility = VISIBILITY_INTERNAL;
1651         else if (!strcmp(arg, "hidden"))
1652           default_visibility = VISIBILITY_HIDDEN;
1653         else if (!strcmp(arg, "protected"))
1654           default_visibility = VISIBILITY_PROTECTED;
1655         else
1656           error ("unrecognized visibility value \"%s\"", arg);
1657       }
1658       break;
1659
1660     case OPT_fvpt:
1661       flag_value_profile_transformations_set = true;
1662       break;
1663
1664     case OPT_frandom_seed:
1665       /* The real switch is -fno-random-seed.  */
1666       if (value)
1667         return 0;
1668       set_random_seed (NULL);
1669       break;
1670
1671     case OPT_frandom_seed_:
1672       set_random_seed (arg);
1673       break;
1674
1675     case OPT_fsched_verbose_:
1676 #ifdef INSN_SCHEDULING
1677       fix_sched_param ("verbose", arg);
1678       break;
1679 #else
1680       return 0;
1681 #endif
1682
1683     case OPT_fsched_stalled_insns_:
1684       flag_sched_stalled_insns = value;
1685       if (flag_sched_stalled_insns == 0)
1686         flag_sched_stalled_insns = -1;
1687       break;
1688
1689     case OPT_fsched_stalled_insns_dep_:
1690       flag_sched_stalled_insns_dep = value;
1691       break;
1692
1693     case OPT_fstack_limit:
1694       /* The real switch is -fno-stack-limit.  */
1695       if (value)
1696         return 0;
1697       stack_limit_rtx = NULL_RTX;
1698       break;
1699
1700     case OPT_fstack_limit_register_:
1701       {
1702         int reg = decode_reg_name (arg);
1703         if (reg < 0)
1704           error ("unrecognized register name \"%s\"", arg);
1705         else
1706           stack_limit_rtx = gen_rtx_REG (Pmode, reg);
1707       }
1708       break;
1709
1710     case OPT_fstack_limit_symbol_:
1711       stack_limit_rtx = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (arg));
1712       break;
1713
1714     case OPT_ftree_vectorizer_verbose_:
1715       vect_set_verbosity_level (arg);
1716       break;
1717
1718     case OPT_ftls_model_:
1719       if (!strcmp (arg, "global-dynamic"))
1720         flag_tls_default = TLS_MODEL_GLOBAL_DYNAMIC;
1721       else if (!strcmp (arg, "local-dynamic"))
1722         flag_tls_default = TLS_MODEL_LOCAL_DYNAMIC;
1723       else if (!strcmp (arg, "initial-exec"))
1724         flag_tls_default = TLS_MODEL_INITIAL_EXEC;
1725       else if (!strcmp (arg, "local-exec"))
1726         flag_tls_default = TLS_MODEL_LOCAL_EXEC;
1727       else
1728         warning (0, "unknown tls-model \"%s\"", arg);
1729       break;
1730
1731     case OPT_ftracer:
1732       flag_tracer_set = true;
1733       break;
1734
1735     case OPT_funroll_loops:
1736       flag_unroll_loops_set = true;
1737       break;
1738
1739     case OPT_g:
1740       set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, arg);
1741       break;
1742
1743     case OPT_gcoff:
1744       set_debug_level (SDB_DEBUG, false, arg);
1745       break;
1746
1747     case OPT_gdwarf_2:
1748       set_debug_level (DWARF2_DEBUG, false, arg);
1749       break;
1750
1751     case OPT_ggdb:
1752       set_debug_level (NO_DEBUG, 2, arg);
1753       break;
1754
1755     case OPT_gstabs:
1756     case OPT_gstabs_:
1757       set_debug_level (DBX_DEBUG, code == OPT_gstabs_, arg);
1758       break;
1759
1760     case OPT_gvms:
1761       set_debug_level (VMS_DEBUG, false, arg);
1762       break;
1763
1764     case OPT_gxcoff:
1765     case OPT_gxcoff_:
1766       set_debug_level (XCOFF_DEBUG, code == OPT_gxcoff_, arg);
1767       break;
1768
1769     case OPT_o:
1770       asm_file_name = arg;
1771       break;
1772
1773     case OPT_pedantic_errors:
1774       flag_pedantic_errors = pedantic = 1;
1775       break;
1776
1777     case OPT_floop_optimize:
1778     case OPT_frerun_loop_opt:
1779     case OPT_fstrength_reduce:
1780     case OPT_ftree_store_copy_prop:
1781     case OPT_fforce_addr:
1782       /* These are no-ops, preserved for backward compatibility.  */
1783       break;
1784
1785     default:
1786       /* If the flag was handled in a standard way, assume the lack of
1787          processing here is intentional.  */
1788       gcc_assert (cl_options[scode].flag_var);
1789       break;
1790     }
1791
1792   return 1;
1793 }
1794
1795 /* Handle --param NAME=VALUE.  */
1796 static void
1797 handle_param (const char *carg)
1798 {
1799   char *equal, *arg;
1800   int value;
1801
1802   arg = xstrdup (carg);
1803   equal = strchr (arg, '=');
1804   if (!equal)
1805     error ("%s: --param arguments should be of the form NAME=VALUE", arg);
1806   else
1807     {
1808       value = integral_argument (equal + 1);
1809       if (value == -1)
1810         error ("invalid --param value %qs", equal + 1);
1811       else
1812         {
1813           *equal = '\0';
1814           set_param_value (arg, value);
1815         }
1816     }
1817
1818   free (arg);
1819 }
1820
1821 /* Handle -W and -Wextra.  */
1822 static void
1823 set_Wextra (int setting)
1824 {
1825   extra_warnings = setting;
1826   warn_unused_parameter = (setting && maybe_warn_unused_parameter);
1827
1828   /* We save the value of warn_uninitialized, since if they put
1829      -Wuninitialized on the command line, we need to generate a
1830      warning about not using it without also specifying -O.  */
1831   if (setting == 0)
1832     warn_uninitialized = 0;
1833   else if (warn_uninitialized != 1)
1834     warn_uninitialized = 2;
1835 }
1836
1837 /* Initialize unused warning flags.  */
1838 void
1839 set_Wunused (int setting)
1840 {
1841   warn_unused_function = setting;
1842   warn_unused_label = setting;
1843   /* Unused function parameter warnings are reported when either
1844      ``-Wextra -Wunused'' or ``-Wunused-parameter'' is specified.
1845      Thus, if -Wextra has already been seen, set warn_unused_parameter;
1846      otherwise set maybe_warn_extra_parameter, which will be picked up
1847      by set_Wextra.  */
1848   maybe_warn_unused_parameter = setting;
1849   warn_unused_parameter = (setting && extra_warnings);
1850   warn_unused_variable = setting;
1851   warn_unused_value = setting;
1852 }
1853
1854 /* Used to set the level of strict aliasing warnings, 
1855    when no level is specified (i.e., when -Wstrict-aliasing, and not
1856    -Wstrict-aliasing=level was given).
1857    ONOFF is assumed to take value 1 when -Wstrict-aliasing is specified,
1858    and 0 otherwise.  After calling this function, wstrict_aliasing will be
1859    set to the default value of -Wstrict_aliasing=level, currently 3.  */
1860 void
1861 set_Wstrict_aliasing (int onoff)
1862 {
1863   gcc_assert (onoff == 0 || onoff == 1);
1864   if (onoff != 0)
1865     warn_strict_aliasing = 3;
1866 }
1867
1868 /* The following routines are useful in setting all the flags that
1869    -ffast-math and -fno-fast-math imply.  */
1870 void
1871 set_fast_math_flags (int set)
1872 {
1873   flag_unsafe_math_optimizations = set;
1874   set_unsafe_math_optimizations_flags (set);
1875   flag_finite_math_only = set;
1876   flag_errno_math = !set;
1877   if (set)
1878     {
1879       flag_signaling_nans = 0;
1880       flag_rounding_math = 0;
1881       flag_cx_limited_range = 1;
1882     }
1883 }
1884
1885 /* When -funsafe-math-optimizations is set the following 
1886    flags are set as well.  */ 
1887 void
1888 set_unsafe_math_optimizations_flags (int set)
1889 {
1890   flag_trapping_math = !set;
1891   flag_signed_zeros = !set;
1892   flag_associative_math = set;
1893   flag_reciprocal_math = set;
1894 }
1895
1896 /* Return true iff flags are set as if -ffast-math.  */
1897 bool
1898 fast_math_flags_set_p (void)
1899 {
1900   return (!flag_trapping_math
1901           && flag_unsafe_math_optimizations
1902           && flag_finite_math_only
1903           && !flag_signed_zeros
1904           && !flag_errno_math);
1905 }
1906
1907 /* Handle a debug output -g switch.  EXTENDED is true or false to support
1908    extended output (2 is special and means "-ggdb" was given).  */
1909 static void
1910 set_debug_level (enum debug_info_type type, int extended, const char *arg)
1911 {
1912   static bool type_explicit;
1913
1914   use_gnu_debug_info_extensions = extended;
1915
1916   if (type == NO_DEBUG)
1917     {
1918       if (write_symbols == NO_DEBUG)
1919         {
1920           write_symbols = PREFERRED_DEBUGGING_TYPE;
1921
1922           if (extended == 2)
1923             {
1924 #ifdef DWARF2_DEBUGGING_INFO
1925               write_symbols = DWARF2_DEBUG;
1926 #elif defined DBX_DEBUGGING_INFO
1927               write_symbols = DBX_DEBUG;
1928 #endif
1929             }
1930
1931           if (write_symbols == NO_DEBUG)
1932             warning (0, "target system does not support debug output");
1933         }
1934     }
1935   else
1936     {
1937       /* Does it conflict with an already selected type?  */
1938       if (type_explicit && write_symbols != NO_DEBUG && type != write_symbols)
1939         error ("debug format \"%s\" conflicts with prior selection",
1940                debug_type_names[type]);
1941       write_symbols = type;
1942       type_explicit = true;
1943     }
1944
1945   /* A debug flag without a level defaults to level 2.  */
1946   if (*arg == '\0')
1947     {
1948       if (!debug_info_level)
1949         debug_info_level = 2;
1950     }
1951   else
1952     {
1953       debug_info_level = integral_argument (arg);
1954       if (debug_info_level == (unsigned int) -1)
1955         error ("unrecognised debug output level \"%s\"", arg);
1956       else if (debug_info_level > 3)
1957         error ("debug output level %s is too high", arg);
1958     }
1959 }
1960
1961 /* Return 1 if OPTION is enabled, 0 if it is disabled, or -1 if it isn't
1962    a simple on-off switch.  */
1963
1964 int
1965 option_enabled (int opt_idx)
1966 {
1967   const struct cl_option *option = &(cl_options[opt_idx]);
1968
1969   if (option->flag_var)
1970     switch (option->var_type)
1971       {
1972       case CLVC_BOOLEAN:
1973         return *(int *) option->flag_var != 0;
1974
1975       case CLVC_EQUAL:
1976         return *(int *) option->flag_var == option->var_value;
1977
1978       case CLVC_BIT_CLEAR:
1979         return (*(int *) option->flag_var & option->var_value) == 0;
1980
1981       case CLVC_BIT_SET:
1982         return (*(int *) option->flag_var & option->var_value) != 0;
1983
1984       case CLVC_STRING:
1985         break;
1986       }
1987   return -1;
1988 }
1989
1990 /* Fill STATE with the current state of option OPTION.  Return true if
1991    there is some state to store.  */
1992
1993 bool
1994 get_option_state (int option, struct cl_option_state *state)
1995 {
1996   if (cl_options[option].flag_var == 0)
1997     return false;
1998
1999   switch (cl_options[option].var_type)
2000     {
2001     case CLVC_BOOLEAN:
2002     case CLVC_EQUAL:
2003       state->data = cl_options[option].flag_var;
2004       state->size = sizeof (int);
2005       break;
2006
2007     case CLVC_BIT_CLEAR:
2008     case CLVC_BIT_SET:
2009       state->ch = option_enabled (option);
2010       state->data = &state->ch;
2011       state->size = 1;
2012       break;
2013
2014     case CLVC_STRING:
2015       state->data = *(const char **) cl_options[option].flag_var;
2016       if (state->data == 0)
2017         state->data = "";
2018       state->size = strlen (state->data) + 1;
2019       break;
2020     }
2021   return true;
2022 }
2023
2024 /* Enable a warning option as an error.  This is used by -Werror= and
2025    also by legacy Werror-implicit-function-declaration.  */
2026
2027 void
2028 enable_warning_as_error (const char *arg, int value, unsigned int lang_mask)
2029 {
2030   char *new_option;
2031   int option_index;
2032
2033   new_option = XNEWVEC (char, strlen (arg) + 2);
2034   new_option[0] = 'W';
2035   strcpy (new_option + 1, arg);
2036   option_index = find_opt (new_option, lang_mask);
2037   if (option_index == N_OPTS)
2038     {
2039       error ("-Werror=%s: No option -%s", arg, new_option);
2040     }
2041   else
2042     {
2043       int kind = value ? DK_ERROR : DK_WARNING;
2044       diagnostic_classify_diagnostic (global_dc, option_index, kind);
2045       
2046       /* -Werror=foo implies -Wfoo.  */
2047       if (cl_options[option_index].var_type == CLVC_BOOLEAN
2048           && cl_options[option_index].flag_var
2049           && kind == DK_ERROR)
2050         *(int *) cl_options[option_index].flag_var = 1;
2051     }
2052   free (new_option);
2053 }