OSDN Git Service

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