OSDN Git Service

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