OSDN Git Service

gcc/
[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 2, 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 COPYING.  If not, write to the Free
20 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
21 02110-1301, USA.  */
22
23 #include "config.h"
24 #include "system.h"
25 #include "intl.h"
26 #include "coretypes.h"
27 #include "tm.h"
28 #include "tree.h"
29 #include "rtl.h"
30 #include "ggc.h"
31 #include "output.h"
32 #include "langhooks.h"
33 #include "opts.h"
34 #include "options.h"
35 #include "flags.h"
36 #include "toplev.h"
37 #include "params.h"
38 #include "diagnostic.h"
39 #include "tm_p.h"               /* For OPTIMIZATION_OPTIONS.  */
40 #include "insn-attr.h"          /* For INSN_SCHEDULING.  */
41 #include "target.h"
42 #include "tree-pass.h"
43 #include "dbgcnt.h"
44
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 thet 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
357 /* Input file names.  */
358 const char **in_fnames;
359 unsigned num_in_fnames;
360
361 static int common_handle_option (size_t scode, const char *arg, int value,
362                                  unsigned int lang_mask);
363 static void handle_param (const char *);
364 static void set_Wextra (int);
365 static unsigned int handle_option (const char **argv, unsigned int lang_mask);
366 static char *write_langs (unsigned int lang_mask);
367 static void complain_wrong_lang (const char *, const struct cl_option *,
368                                  unsigned int lang_mask);
369 static void handle_options (unsigned int, const char **, unsigned int);
370 static void set_debug_level (enum debug_info_type type, int extended,
371                              const char *arg);
372
373 /* If ARG is a non-negative integer made up solely of digits, return its
374    value, otherwise return -1.  */
375 static int
376 integral_argument (const char *arg)
377 {
378   const char *p = arg;
379
380   while (*p && ISDIGIT (*p))
381     p++;
382
383   if (*p == '\0')
384     return atoi (arg);
385
386   return -1;
387 }
388
389 /* Return a malloced slash-separated list of languages in MASK.  */
390 static char *
391 write_langs (unsigned int mask)
392 {
393   unsigned int n = 0, len = 0;
394   const char *lang_name;
395   char *result;
396
397   for (n = 0; (lang_name = lang_names[n]) != 0; n++)
398     if (mask & (1U << n))
399       len += strlen (lang_name) + 1;
400
401   result = XNEWVEC (char, len);
402   len = 0;
403   for (n = 0; (lang_name = lang_names[n]) != 0; n++)
404     if (mask & (1U << n))
405       {
406         if (len)
407           result[len++] = '/';
408         strcpy (result + len, lang_name);
409         len += strlen (lang_name);
410       }
411
412   result[len] = 0;
413
414   return result;
415 }
416
417 /* Complain that switch OPT_INDEX does not apply to this front end.  */
418 static void
419 complain_wrong_lang (const char *text, const struct cl_option *option,
420                      unsigned int lang_mask)
421 {
422   char *ok_langs, *bad_lang;
423
424   ok_langs = write_langs (option->flags);
425   bad_lang = write_langs (lang_mask);
426
427   /* Eventually this should become a hard error IMO.  */
428   warning (0, "command line option \"%s\" is valid for %s but not for %s",
429            text, ok_langs, bad_lang);
430
431   free (ok_langs);
432   free (bad_lang);
433 }
434
435 /* Handle the switch beginning at ARGV for the language indicated by
436    LANG_MASK.  Returns the number of switches consumed.  */
437 static unsigned int
438 handle_option (const char **argv, unsigned int lang_mask)
439 {
440   size_t opt_index;
441   const char *opt, *arg = 0;
442   char *dup = 0;
443   int value = 1;
444   unsigned int result = 0;
445   const struct cl_option *option;
446
447   opt = argv[0];
448
449   opt_index = find_opt (opt + 1, lang_mask | CL_COMMON | CL_TARGET);
450   if (opt_index == cl_options_count
451       && (opt[1] == 'W' || opt[1] == 'f' || opt[1] == 'm')
452       && opt[2] == 'n' && opt[3] == 'o' && opt[4] == '-')
453     {
454       /* Drop the "no-" from negative switches.  */
455       size_t len = strlen (opt) - 3;
456
457       dup = XNEWVEC (char, len + 1);
458       dup[0] = '-';
459       dup[1] = opt[1];
460       memcpy (dup + 2, opt + 5, len - 2 + 1);
461       opt = dup;
462       value = 0;
463       opt_index = find_opt (opt + 1, lang_mask | CL_COMMON | CL_TARGET);
464     }
465
466   if (opt_index == cl_options_count)
467     goto done;
468
469   option = &cl_options[opt_index];
470
471   /* Reject negative form of switches that don't take negatives as
472      unrecognized.  */
473   if (!value && (option->flags & CL_REJECT_NEGATIVE))
474     goto done;
475
476   /* We've recognized this switch.  */
477   result = 1;
478
479   /* Check to see if the option is disabled for this configuration.  */
480   if (option->flags & CL_DISABLED)
481     {
482       error ("command line option %qs"
483              " is not supported by this configuration", opt);
484       goto done;
485     }
486
487   /* Sort out any argument the switch takes.  */
488   if (option->flags & CL_JOINED)
489     {
490       /* Have arg point to the original switch.  This is because
491          some code, such as disable_builtin_function, expects its
492          argument to be persistent until the program exits.  */
493       arg = argv[0] + cl_options[opt_index].opt_len + 1;
494       if (!value)
495         arg += strlen ("no-");
496
497       if (*arg == '\0' && !(option->flags & CL_MISSING_OK))
498         {
499           if (option->flags & CL_SEPARATE)
500             {
501               arg = argv[1];
502               result = 2;
503             }
504           else
505             /* Missing argument.  */
506             arg = NULL;
507         }
508     }
509   else if (option->flags & CL_SEPARATE)
510     {
511       arg = argv[1];
512       result = 2;
513     }
514
515   /* Now we've swallowed any potential argument, complain if this
516      is a switch for a different front end.  */
517   if (!(option->flags & (lang_mask | CL_COMMON | CL_TARGET)))
518     {
519       complain_wrong_lang (argv[0], option, lang_mask);
520       goto done;
521     }
522   else if ((option->flags & CL_TARGET)
523            && (option->flags & CL_LANG_ALL)
524            && !(option->flags & lang_mask))
525     {
526       /* Complain for target flag language mismatches if any languages
527          are specified.  */
528       complain_wrong_lang (argv[0], option, lang_mask);
529       goto done;
530     }
531
532   if (arg == NULL && (option->flags & (CL_JOINED | CL_SEPARATE)))
533     {
534       if (!lang_hooks.missing_argument (opt, opt_index))
535         error ("missing argument to \"%s\"", opt);
536       goto done;
537     }
538
539   /* If the switch takes an integer, convert it.  */
540   if (arg && (option->flags & CL_UINTEGER))
541     {
542       value = integral_argument (arg);
543       if (value == -1)
544         {
545           error ("argument to \"%s\" should be a non-negative integer",
546                  option->opt_text);
547           goto done;
548         }
549     }
550
551   if (option->flag_var)
552     switch (option->var_type)
553       {
554       case CLVC_BOOLEAN:
555         *(int *) option->flag_var = value;
556         break;
557
558       case CLVC_EQUAL:
559         *(int *) option->flag_var = (value
560                                      ? option->var_value
561                                      : !option->var_value);
562         break;
563
564       case CLVC_BIT_CLEAR:
565       case CLVC_BIT_SET:
566         if ((value != 0) == (option->var_type == CLVC_BIT_SET))
567           *(int *) option->flag_var |= option->var_value;
568         else
569           *(int *) option->flag_var &= ~option->var_value;
570         if (option->flag_var == &target_flags)
571           target_flags_explicit |= option->var_value;
572         break;
573
574       case CLVC_STRING:
575         *(const char **) option->flag_var = arg;
576         break;
577       }
578
579   if (option->flags & lang_mask)
580     if (lang_hooks.handle_option (opt_index, arg, value) == 0)
581       result = 0;
582
583   if (result && (option->flags & CL_COMMON))
584     if (common_handle_option (opt_index, arg, value, lang_mask) == 0)
585       result = 0;
586
587   if (result && (option->flags & CL_TARGET))
588     if (!targetm.handle_option (opt_index, arg, value))
589       result = 0;
590
591  done:
592   if (dup)
593     free (dup);
594   return result;
595 }
596
597 /* Handle FILENAME from the command line.  */
598 static void
599 add_input_filename (const char *filename)
600 {
601   num_in_fnames++;
602   in_fnames = xrealloc (in_fnames, num_in_fnames * sizeof (in_fnames[0]));
603   in_fnames[num_in_fnames - 1] = filename;
604 }
605
606 /* Decode and handle the vector of command line options.  LANG_MASK
607    contains has a single bit set representing the current
608    language.  */
609 static void
610 handle_options (unsigned int argc, const char **argv, unsigned int lang_mask)
611 {
612   unsigned int n, i;
613
614   for (i = 1; i < argc; i += n)
615     {
616       const char *opt = argv[i];
617
618       /* Interpret "-" or a non-switch as a file name.  */
619       if (opt[0] != '-' || opt[1] == '\0')
620         {
621           if (main_input_filename == NULL)
622             {
623             main_input_filename = opt;
624               main_input_baselength
625                 = base_of_path (main_input_filename, &main_input_basename);
626             }
627           add_input_filename (opt);
628           n = 1;
629           continue;
630         }
631
632       n = handle_option (argv + i, lang_mask);
633
634       if (!n)
635         {
636           n = 1;
637           error ("unrecognized command line option \"%s\"", opt);
638         }
639     }
640 }
641
642 /* Parse command line options and set default flag values.  Do minimal
643    options processing.  */
644 void
645 decode_options (unsigned int argc, const char **argv)
646 {
647   unsigned int i, lang_mask;
648
649   /* Perform language-specific options initialization.  */
650   lang_mask = lang_hooks.init_options (argc, argv);
651
652   lang_hooks.initialize_diagnostics (global_dc);
653
654   /* Scan to see what optimization level has been specified.  That will
655      determine the default value of many flags.  */
656   for (i = 1; i < argc; i++)
657     {
658       if (!strcmp (argv[i], "-O"))
659         {
660           optimize = 1;
661           optimize_size = 0;
662         }
663       else if (argv[i][0] == '-' && argv[i][1] == 'O')
664         {
665           /* Handle -Os, -O2, -O3, -O69, ...  */
666           const char *p = &argv[i][2];
667
668           if ((p[0] == 's') && (p[1] == 0))
669             {
670               optimize_size = 1;
671
672               /* Optimizing for size forces optimize to be 2.  */
673               optimize = 2;
674             }
675           else
676             {
677               const int optimize_val = read_integral_parameter (p, p - 2, -1);
678               if (optimize_val != -1)
679                 {
680                   optimize = optimize_val;
681                   optimize_size = 0;
682                 }
683             }
684         }
685     }
686
687   if (!optimize)
688     {
689       flag_merge_constants = 0;
690     }
691
692   if (optimize >= 1)
693     {
694       flag_defer_pop = 1;
695 #ifdef DELAY_SLOTS
696       flag_delayed_branch = 1;
697 #endif
698 #ifdef CAN_DEBUG_WITHOUT_FP
699       flag_omit_frame_pointer = 1;
700 #endif
701       flag_guess_branch_prob = 1;
702       flag_cprop_registers = 1;
703       flag_if_conversion = 1;
704       flag_if_conversion2 = 1;
705       flag_ipa_pure_const = 1;
706       flag_ipa_reference = 1;
707       flag_split_wide_types = 1;
708       flag_tree_ccp = 1;
709       flag_tree_dce = 1;
710       flag_tree_dom = 1;
711       flag_tree_dse = 1;
712       flag_tree_ter = 1;
713       flag_tree_sra = 1;
714       flag_tree_copyrename = 1;
715       flag_tree_fre = 1;
716       flag_tree_copy_prop = 1;
717       flag_tree_sink = 1;
718       flag_tree_salias = 1;
719       if (!no_unit_at_a_time_default)
720         flag_unit_at_a_time = 1;
721
722       if (!optimize_size)
723         {
724           /* Loop header copying usually increases size of the code.  This used
725              not to be true, since quite often it is possible to verify that
726              the condition is satisfied in the first iteration and therefore
727              to eliminate it.  Jump threading handles these cases now.  */
728           flag_tree_ch = 1;
729         }
730     }
731
732   if (optimize >= 2)
733     {
734       flag_thread_jumps = 1;
735       flag_crossjumping = 1;
736       flag_optimize_sibling_calls = 1;
737       flag_forward_propagate = 1;
738       flag_cse_follow_jumps = 1;
739       flag_gcse = 1;
740       flag_expensive_optimizations = 1;
741       flag_ipa_type_escape = 1;
742       flag_rerun_cse_after_loop = 1;
743       flag_caller_saves = 1;
744       flag_peephole2 = 1;
745 #ifdef INSN_SCHEDULING
746       flag_schedule_insns = 1;
747       flag_schedule_insns_after_reload = 1;
748 #endif
749       flag_regmove = 1;
750       flag_strict_aliasing = 1;
751       flag_strict_overflow = 1;
752       flag_delete_null_pointer_checks = 1;
753       flag_reorder_blocks = 1;
754       flag_reorder_functions = 1;
755       flag_tree_store_ccp = 1;
756       flag_tree_store_copy_prop = 1;
757       flag_tree_vrp = 1;
758
759       if (!optimize_size)
760         {
761           /* PRE tends to generate bigger code.  */
762           flag_tree_pre = 1;
763         }
764
765       /* Allow more virtual operators to increase alias precision.  */
766       set_param_value ("max-aliased-vops", 500);
767     }
768
769   if (optimize >= 3)
770     {
771       flag_predictive_commoning = 1;
772       flag_inline_functions = 1;
773       flag_unswitch_loops = 1;
774       flag_gcse_after_reload = 1;
775
776       /* Allow even more virtual operators.  */
777       set_param_value ("max-aliased-vops", 1000);
778       set_param_value ("avg-aliased-vops", 3);
779     }
780
781   if (optimize < 2 || optimize_size)
782     {
783       align_loops = 1;
784       align_jumps = 1;
785       align_labels = 1;
786       align_functions = 1;
787
788       /* Don't reorder blocks when optimizing for size because extra
789          jump insns may be created; also barrier may create extra padding.
790
791          More correctly we should have a block reordering mode that tried
792          to minimize the combined size of all the jumps.  This would more
793          or less automatically remove extra jumps, but would also try to
794          use more short jumps instead of long jumps.  */
795       flag_reorder_blocks = 0;
796       flag_reorder_blocks_and_partition = 0;
797     }
798
799   if (optimize_size)
800     {
801       /* Inlining of functions reducing size is a good idea regardless
802          of them being declared inline.  */
803       flag_inline_functions = 1;
804
805       /* We want to crossjump as much as possible.  */
806       set_param_value ("min-crossjump-insns", 1);
807     }
808
809   /* Initialize whether `char' is signed.  */
810   flag_signed_char = DEFAULT_SIGNED_CHAR;
811   /* Set this to a special "uninitialized" value.  The actual default is set
812      after target options have been processed.  */
813   flag_short_enums = 2;
814
815   /* Initialize target_flags before OPTIMIZATION_OPTIONS so the latter can
816      modify it.  */
817   target_flags = targetm.default_target_flags;
818
819   /* Some tagets have ABI-specified unwind tables.  */
820   flag_unwind_tables = targetm.unwind_tables_default;
821
822 #ifdef OPTIMIZATION_OPTIONS
823   /* Allow default optimizations to be specified on a per-machine basis.  */
824   OPTIMIZATION_OPTIONS (optimize, optimize_size);
825 #endif
826
827   handle_options (argc, argv, lang_mask);
828
829   if (flag_pie)
830     flag_pic = flag_pie;
831   if (flag_pic && !flag_pie)
832     flag_shlib = 1;
833
834   if (flag_no_inline == 2)
835     flag_no_inline = 0;
836   else
837     flag_really_no_inline = flag_no_inline;
838
839   /* Set flag_no_inline before the post_options () hook.  The C front
840      ends use it to determine tree inlining defaults.  FIXME: such
841      code should be lang-independent when all front ends use tree
842      inlining, in which case it, and this condition, should be moved
843      to the top of process_options() instead.  */
844   if (optimize == 0)
845     {
846       /* Inlining does not work if not optimizing,
847          so force it not to be done.  */
848       flag_no_inline = 1;
849       warn_inline = 0;
850
851       /* The c_decode_option function and decode_option hook set
852          this to `2' if -Wall is used, so we can avoid giving out
853          lots of errors for people who don't realize what -Wall does.  */
854       if (warn_uninitialized == 1)
855         warning (OPT_Wuninitialized,
856                  "-Wuninitialized is not supported without -O");
857     }
858
859   if (flag_really_no_inline == 2)
860     flag_really_no_inline = flag_no_inline;
861
862   /* The optimization to partition hot and cold basic blocks into separate
863      sections of the .o and executable files does not work (currently)
864      with exception handling.  This is because there is no support for
865      generating unwind info.  If flag_exceptions is turned on we need to
866      turn off the partitioning optimization.  */
867
868   if (flag_exceptions && flag_reorder_blocks_and_partition)
869     {
870       inform
871             ("-freorder-blocks-and-partition does not work with exceptions");
872       flag_reorder_blocks_and_partition = 0;
873       flag_reorder_blocks = 1;
874     }
875
876   /* If user requested unwind info, then turn off the partitioning
877      optimization.  */
878
879   if (flag_unwind_tables && ! targetm.unwind_tables_default
880       && flag_reorder_blocks_and_partition)
881     {
882       inform ("-freorder-blocks-and-partition does not support unwind info");
883       flag_reorder_blocks_and_partition = 0;
884       flag_reorder_blocks = 1;
885     }
886
887   /* If the target requested unwind info, then turn off the partitioning
888      optimization with a different message.  Likewise, if the target does not
889      support named sections.  */
890
891   if (flag_reorder_blocks_and_partition
892       && (!targetm.have_named_sections
893           || (flag_unwind_tables && targetm.unwind_tables_default)))
894     {
895       inform
896        ("-freorder-blocks-and-partition does not work on this architecture");
897       flag_reorder_blocks_and_partition = 0;
898       flag_reorder_blocks = 1;
899     }
900 }
901
902 #define LEFT_COLUMN     27
903
904 /* Output ITEM, of length ITEM_WIDTH, in the left column,
905    followed by word-wrapped HELP in a second column.  */
906 static void
907 wrap_help (const char *help,
908            const char *item,
909            unsigned int item_width,
910            unsigned int columns)
911 {
912   unsigned int col_width = LEFT_COLUMN;
913   unsigned int remaining, room, len;
914
915   remaining = strlen (help);
916
917   do
918     {
919       room = columns - 3 - MAX (col_width, item_width);
920       if (room > columns)
921         room = 0;
922       len = remaining;
923
924       if (room < len)
925         {
926           unsigned int i;
927
928           for (i = 0; help[i]; i++)
929             {
930               if (i >= room && len != remaining)
931                 break;
932               if (help[i] == ' ')
933                 len = i;
934               else if ((help[i] == '-' || help[i] == '/')
935                        && help[i + 1] != ' '
936                        && i > 0 && ISALPHA (help[i - 1]))
937                 len = i + 1;
938             }
939         }
940
941       printf( "  %-*.*s %.*s\n", col_width, item_width, item, len, help);
942       item_width = 0;
943       while (help[len] == ' ')
944         len++;
945       help += len;
946       remaining -= len;
947     }
948   while (remaining);
949 }
950
951 /* Print help for a specific front-end, etc.  */
952 static void
953 print_filtered_help (unsigned int include_flags,
954                      unsigned int exclude_flags,
955                      unsigned int any_flags,
956                      unsigned int columns)
957 {
958   unsigned int i;
959   const char *help;
960   static char *printed = NULL;
961   bool found = false;
962   bool displayed = false;
963
964   if (include_flags == CL_PARAMS)
965     {
966       for (i = 0; i < LAST_PARAM; i++)
967         {
968           const char *param = compiler_params[i].option;
969
970           help = compiler_params[i].help;
971           if (help == NULL || *help == '\0')
972             {
973               if (exclude_flags & CL_UNDOCUMENTED)
974                 continue;
975               help = undocumented_msg;
976             }
977
978           /* Get the translation.  */
979           help = _(help);
980
981           wrap_help (help, param, strlen (param), columns);
982         }
983       putchar ('\n');
984       return;
985     }
986
987   if (!printed)
988     printed = xcalloc (1, cl_options_count);
989
990   for (i = 0; i < cl_options_count; i++)
991     {
992       static char new_help[128];
993       const struct cl_option *option = cl_options + i;
994       unsigned int len;
995       const char *opt;
996       const char *tab;
997
998       if (include_flags == 0
999           || ((option->flags & include_flags) != include_flags))
1000         {
1001           if ((option->flags & any_flags) == 0)
1002             continue;
1003         }
1004
1005       /* Skip unwanted switches.  */
1006       if ((option->flags & exclude_flags) != 0)
1007         continue;
1008
1009       found = true;
1010       /* Skip switches that have already been printed.  */
1011       if (printed[i])
1012         continue;
1013
1014       printed[i] = true;
1015
1016       help = option->help;
1017       if (help == NULL)
1018         {
1019           if (exclude_flags & CL_UNDOCUMENTED)
1020             continue;
1021           help = undocumented_msg;
1022         }
1023
1024       /* Get the translation.  */
1025       help = _(help);
1026
1027       /* Find the gap between the name of the
1028          option and its descriptive text.  */
1029       tab = strchr (help, '\t');
1030       if (tab)
1031         {
1032           len = tab - help;
1033           opt = help;
1034           help = tab + 1;
1035         }
1036       else
1037         {
1038           opt = option->opt_text;
1039           len = strlen (opt);
1040         }
1041
1042       /* With the -Q option enabled we change the descriptive text associated
1043          with an option to be an indication of its current setting.  */
1044       if (!quiet_flag)
1045         {
1046           if (len < (LEFT_COLUMN + 2))
1047             strcpy (new_help, "\t\t");
1048           else
1049             strcpy (new_help, "\t");
1050
1051           if (option->flag_var != NULL)
1052             {
1053               if (option->flags & CL_JOINED)
1054                 {
1055                   if (option->var_type == CLVC_STRING)
1056                     {
1057                       if (* (const char **) option->flag_var != NULL)
1058                         snprintf (new_help + strlen (new_help),
1059                                   sizeof (new_help) - strlen (new_help),
1060                                   * (const char **) option->flag_var);
1061                     }
1062                   else
1063                     sprintf (new_help + strlen (new_help),
1064                              "%#x", * (int *) option->flag_var);
1065                 }
1066               else
1067                 strcat (new_help, option_enabled (i)
1068                         ? _("[enabled]") : _("[disabled]"));
1069             }
1070
1071           help = new_help;
1072         }
1073
1074       wrap_help (help, opt, len, columns);
1075       displayed = true;
1076     }
1077
1078   if (! found)
1079     printf (_(" No options with the desired characteristics were found\n"));
1080   else if (! displayed)
1081     printf (_(" All options with the desired characteristics have already been displayed\n"));
1082
1083   putchar ('\n');
1084 }
1085
1086 /* Display help for a specified type of option.
1087    The options must have ALL of the INCLUDE_FLAGS set
1088    ANY of the flags in the ANY_FLAGS set
1089    and NONE of the EXCLUDE_FLAGS set.  */
1090 static void
1091 print_specific_help (unsigned int include_flags,
1092                      unsigned int exclude_flags,
1093                      unsigned int any_flags)
1094 {
1095   unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1096   const char * description = NULL;
1097   const char * descrip_extra = "";
1098   size_t i;
1099   unsigned int flag;
1100   static unsigned int columns = 0;
1101
1102   /* Sanity check: Make sure that we do not have more
1103      languages than we have bits available to enumerate them.  */
1104   gcc_assert ((1U << cl_lang_count) < CL_MIN_OPTION_CLASS);
1105
1106   /* If we have not done so already, obtain
1107      the desired maximum width of the output.  */
1108   if (columns == 0)
1109     {
1110       const char *p;
1111
1112       GET_ENVIRONMENT (p, "COLUMNS");
1113       if (p != NULL)
1114         {
1115           int value = atoi (p);
1116
1117           if (value > 0)
1118             columns = value;
1119         }
1120
1121       if (columns == 0)
1122         /* Use a reasonable default.  */
1123         columns = 80;
1124     }
1125
1126   /* Decide upon the title for the options that we are going to display.  */
1127   for (i = 0, flag = 1; flag <= CL_MAX_OPTION_CLASS; flag <<= 1, i ++)
1128     {
1129       switch (flag & include_flags)
1130         {
1131         case 0:
1132           break;
1133
1134         case CL_TARGET:
1135           description = _("The following options are target specific");
1136           break;
1137         case CL_WARNING:
1138           description = _("The following options control compiler warning messages");
1139           break;
1140         case CL_OPTIMIZATION:
1141           description = _("The following options control optimizations");
1142           break;
1143         case CL_COMMON:
1144           description = _("The following options are language-independent");
1145           break;
1146         case CL_PARAMS:
1147           description = _("The --param option recognizes the following as parameters");
1148           break;
1149         default:
1150           if (i >= cl_lang_count)
1151             break;
1152           if ((exclude_flags & ((1U << cl_lang_count) - 1)) != 0)
1153             {
1154               description = _("The following options are specific to the language ");
1155               descrip_extra = lang_names [i];
1156             }
1157           else
1158             description = _("The following options are supported by the language ");
1159             descrip_extra = lang_names [i];
1160           break;
1161         }
1162     }
1163
1164   if (description == NULL)
1165     {
1166       if (any_flags == 0)
1167         {
1168           if (include_flags == CL_UNDOCUMENTED)
1169             description = _("The following options are not documented");
1170           else
1171             {
1172               internal_error ("unrecognized include_flags 0x%x passed to print_specific_help",
1173                               include_flags);
1174               return;
1175             }
1176         }
1177       else
1178         {
1179           if (any_flags & all_langs_mask)
1180             description = _("The following options are language-related");
1181           else
1182             description = _("The following options are language-independent");
1183         }
1184     }
1185
1186   printf ("%s%s:\n", description, descrip_extra);
1187   print_filtered_help (include_flags, exclude_flags, any_flags, columns);
1188 }
1189
1190 /* Handle target- and language-independent options.  Return zero to
1191    generate an "unknown option" message.  Only options that need
1192    extra handling need to be listed here; if you simply want
1193    VALUE assigned to a variable, it happens automatically.  */
1194
1195 static int
1196 common_handle_option (size_t scode, const char *arg, int value,
1197                       unsigned int lang_mask)
1198 {
1199   enum opt_code code = (enum opt_code) scode;
1200
1201   switch (code)
1202     {
1203     case OPT__param:
1204       handle_param (arg);
1205       break;
1206
1207     case OPT_fhelp:
1208     case OPT__help:
1209       {
1210         unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1211         unsigned int undoc_mask;
1212         unsigned int i;
1213
1214         undoc_mask = extra_warnings ? 0 : CL_UNDOCUMENTED;
1215         /* First display any single language specific options.  */
1216         for (i = 0; i < cl_lang_count; i++)
1217           print_specific_help
1218             (1U << i, (all_langs_mask & (~ (1U << i))) | undoc_mask, 0);
1219         /* Next display any multi language specific options.  */
1220         print_specific_help (0, undoc_mask, all_langs_mask);
1221         /* Then display any remaining, non-language options.  */
1222         for (i = CL_MIN_OPTION_CLASS; i <= CL_MAX_OPTION_CLASS; i <<= 1)
1223           print_specific_help (i, undoc_mask, 0);
1224         exit_after_options = true;
1225         break;
1226       }
1227
1228     case OPT_ftarget_help:
1229     case OPT__target_help:
1230       print_specific_help (CL_TARGET, CL_UNDOCUMENTED, 0);
1231       exit_after_options = true;
1232       break;
1233
1234     case OPT_fhelp_:
1235     case OPT__help_:
1236       {
1237         const char * a = arg;
1238         unsigned int include_flags = 0;
1239         /* Note - by default we include undocumented options when listing
1240            specific classes.  If you only want to see documented options
1241            then add ",^undocumented" to the --help= option.  e.g.:
1242
1243            --help=target,^undocumented  */
1244         unsigned int exclude_flags = 0;
1245
1246         /* Walk along the argument string, parsing each word in turn.
1247            The format is:
1248            arg = [^]{word}[,{arg}]
1249            word = {optimizers|target|warnings|undocumented|
1250                    params|common|<language>}  */
1251         while (* a != 0)
1252           {
1253             static struct
1254             {
1255               const char * string;
1256               unsigned int flag;
1257             }
1258             specifics[] =
1259             {
1260               { "optimizers", CL_OPTIMIZATION },
1261               { "target", CL_TARGET },
1262               { "warnings", CL_WARNING },
1263               { "undocumented", CL_UNDOCUMENTED },
1264               { "params", CL_PARAMS },
1265               { "joined", CL_JOINED },
1266               { "separate", CL_SEPARATE },
1267               { "common", CL_COMMON },
1268               { NULL, 0 }
1269             };
1270             unsigned int * pflags;
1271             char * comma;
1272             unsigned int len;
1273             unsigned int i;
1274
1275             if (* a == '^')
1276               {
1277                 ++ a;
1278                 pflags = & exclude_flags;
1279               }
1280             else
1281               pflags = & include_flags;
1282
1283             comma = strchr (a, ',');
1284             if (comma == NULL)
1285               len = strlen (a);
1286             else
1287               len = comma - a;
1288
1289             for (i = 0; specifics[i].string != NULL; i++)
1290               if (strncasecmp (a, specifics[i].string, len) == 0)
1291                 {
1292                   * pflags |= specifics[i].flag;
1293                   break;
1294                 }
1295
1296             if (specifics[i].string == NULL)
1297               {
1298                 /* Check to see if the string matches a language name.  */
1299                 for (i = 0; i < cl_lang_count; i++)
1300                   if (strncasecmp (a, lang_names[i], len) == 0)
1301                     {
1302                       * pflags |= 1U << i;
1303                       break;
1304                     }
1305
1306                 if (i == cl_lang_count)
1307                   fnotice (stderr,
1308                            "warning: unrecognized argument to --help= switch: %.*s\n",
1309                            len, a);
1310               }
1311
1312             if (comma == NULL)
1313               break;
1314             a = comma + 1;
1315           }
1316
1317         if (include_flags)
1318           print_specific_help (include_flags, exclude_flags, 0);
1319         exit_after_options = true;
1320         break;
1321       }
1322
1323     case OPT__version:
1324       print_version (stderr, "");
1325       exit_after_options = true;
1326       break;
1327
1328     case OPT_G:
1329       g_switch_value = value;
1330       g_switch_set = true;
1331       break;
1332
1333     case OPT_O:
1334     case OPT_Os:
1335       /* Currently handled in a prescan.  */
1336       break;
1337
1338     case OPT_W:
1339       /* For backward compatibility, -W is the same as -Wextra.  */
1340       set_Wextra (value);
1341       break;
1342
1343     case OPT_Werror_:
1344       enable_warning_as_error (arg, value, lang_mask);
1345       break;
1346
1347     case OPT_Wextra:
1348       set_Wextra (value);
1349       break;
1350
1351     case OPT_Wlarger_than_:
1352       larger_than_size = value;
1353       warn_larger_than = value != -1;
1354       break;
1355
1356     case OPT_Wstrict_aliasing:
1357       set_Wstrict_aliasing (value);
1358       break;
1359
1360     case OPT_Wstrict_aliasing_:
1361       warn_strict_aliasing = value;
1362       break;
1363
1364     case OPT_Wstrict_overflow:
1365       warn_strict_overflow = (value
1366                               ? (int) WARN_STRICT_OVERFLOW_CONDITIONAL
1367                               : 0);
1368       break;
1369
1370     case OPT_Wstrict_overflow_:
1371       warn_strict_overflow = value;
1372       break;
1373
1374     case OPT_Wunused:
1375       set_Wunused (value);
1376       break;
1377
1378     case OPT_aux_info:
1379     case OPT_aux_info_:
1380       aux_info_file_name = arg;
1381       flag_gen_aux_info = 1;
1382       break;
1383
1384     case OPT_auxbase:
1385       aux_base_name = arg;
1386       break;
1387
1388     case OPT_auxbase_strip:
1389       {
1390         char *tmp = xstrdup (arg);
1391         strip_off_ending (tmp, strlen (tmp));
1392         if (tmp[0])
1393           aux_base_name = tmp;
1394       }
1395       break;
1396
1397     case OPT_d:
1398       decode_d_option (arg);
1399       break;
1400
1401     case OPT_dumpbase:
1402       dump_base_name = arg;
1403       break;
1404
1405     case OPT_falign_functions_:
1406       align_functions = value;
1407       break;
1408
1409     case OPT_falign_jumps_:
1410       align_jumps = value;
1411       break;
1412
1413     case OPT_falign_labels_:
1414       align_labels = value;
1415       break;
1416
1417     case OPT_falign_loops_:
1418       align_loops = value;
1419       break;
1420
1421     case OPT_fbranch_probabilities:
1422       flag_branch_probabilities_set = true;
1423       break;
1424
1425     case OPT_fcall_used_:
1426       fix_register (arg, 0, 1);
1427       break;
1428
1429     case OPT_fcall_saved_:
1430       fix_register (arg, 0, 0);
1431       break;
1432
1433     case OPT_fdbg_cnt_:
1434       dbg_cnt_process_opt (arg);
1435       break;
1436
1437     case OPT_fdbg_cnt_list:
1438       dbg_cnt_list_all_counters ();
1439       break;
1440
1441     case OPT_fdiagnostics_show_location_:
1442       if (!strcmp (arg, "once"))
1443         diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
1444       else if (!strcmp (arg, "every-line"))
1445         diagnostic_prefixing_rule (global_dc)
1446           = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE;
1447       else
1448         return 0;
1449       break;
1450
1451     case OPT_fdiagnostics_show_option:
1452       global_dc->show_option_requested = true;
1453       break;
1454
1455     case OPT_fdump_:
1456       if (!dump_switch_p (arg))
1457         return 0;
1458       break;
1459
1460     case OPT_ffast_math:
1461       set_fast_math_flags (value);
1462       break;
1463
1464     case OPT_ffixed_:
1465       fix_register (arg, 1, 1);
1466       break;
1467
1468     case OPT_finline_limit_:
1469     case OPT_finline_limit_eq:
1470       set_param_value ("max-inline-insns-single", value / 2);
1471       set_param_value ("max-inline-insns-auto", value / 2);
1472       break;
1473
1474     case OPT_fmessage_length_:
1475       pp_set_line_maximum_length (global_dc->printer, value);
1476       break;
1477
1478     case OPT_fpack_struct_:
1479       if (value <= 0 || (value & (value - 1)) || value > 16)
1480         error ("structure alignment must be a small power of two, not %d", value);
1481       else
1482         {
1483           initial_max_fld_align = value;
1484           maximum_field_alignment = value * BITS_PER_UNIT;
1485         }
1486       break;
1487
1488     case OPT_fpeel_loops:
1489       flag_peel_loops_set = true;
1490       break;
1491
1492     case OPT_fprofile_arcs:
1493       profile_arc_flag_set = true;
1494       break;
1495
1496     case OPT_fprofile_use:
1497       if (!flag_branch_probabilities_set)
1498         flag_branch_probabilities = value;
1499       if (!flag_profile_values_set)
1500         flag_profile_values = value;
1501       if (!flag_unroll_loops_set)
1502         flag_unroll_loops = value;
1503       if (!flag_peel_loops_set)
1504         flag_peel_loops = value;
1505       if (!flag_tracer_set)
1506         flag_tracer = value;
1507       if (!flag_value_profile_transformations_set)
1508         flag_value_profile_transformations = value;
1509       break;
1510
1511     case OPT_fprofile_generate:
1512       if (!profile_arc_flag_set)
1513         profile_arc_flag = value;
1514       if (!flag_profile_values_set)
1515         flag_profile_values = value;
1516       if (!flag_value_profile_transformations_set)
1517         flag_value_profile_transformations = value;
1518       break;
1519
1520     case OPT_fprofile_values:
1521       flag_profile_values_set = true;
1522       break;
1523
1524     case OPT_fvisibility_:
1525       {
1526         if (!strcmp(arg, "default"))
1527           default_visibility = VISIBILITY_DEFAULT;
1528         else if (!strcmp(arg, "internal"))
1529           default_visibility = VISIBILITY_INTERNAL;
1530         else if (!strcmp(arg, "hidden"))
1531           default_visibility = VISIBILITY_HIDDEN;
1532         else if (!strcmp(arg, "protected"))
1533           default_visibility = VISIBILITY_PROTECTED;
1534         else
1535           error ("unrecognized visibility value \"%s\"", arg);
1536       }
1537       break;
1538
1539     case OPT_fvpt:
1540       flag_value_profile_transformations_set = true;
1541       break;
1542
1543     case OPT_frandom_seed:
1544       /* The real switch is -fno-random-seed.  */
1545       if (value)
1546         return 0;
1547       set_random_seed (NULL);
1548       break;
1549
1550     case OPT_frandom_seed_:
1551       set_random_seed (arg);
1552       break;
1553
1554     case OPT_fsched_verbose_:
1555 #ifdef INSN_SCHEDULING
1556       fix_sched_param ("verbose", arg);
1557       break;
1558 #else
1559       return 0;
1560 #endif
1561
1562     case OPT_fsched_stalled_insns_:
1563       flag_sched_stalled_insns = value;
1564       if (flag_sched_stalled_insns == 0)
1565         flag_sched_stalled_insns = -1;
1566       break;
1567
1568     case OPT_fsched_stalled_insns_dep_:
1569       flag_sched_stalled_insns_dep = value;
1570       break;
1571
1572     case OPT_fstack_limit:
1573       /* The real switch is -fno-stack-limit.  */
1574       if (value)
1575         return 0;
1576       stack_limit_rtx = NULL_RTX;
1577       break;
1578
1579     case OPT_fstack_limit_register_:
1580       {
1581         int reg = decode_reg_name (arg);
1582         if (reg < 0)
1583           error ("unrecognized register name \"%s\"", arg);
1584         else
1585           stack_limit_rtx = gen_rtx_REG (Pmode, reg);
1586       }
1587       break;
1588
1589     case OPT_fstack_limit_symbol_:
1590       stack_limit_rtx = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (arg));
1591       break;
1592
1593     case OPT_ftree_vectorizer_verbose_:
1594       vect_set_verbosity_level (arg);
1595       break;
1596
1597     case OPT_ftls_model_:
1598       if (!strcmp (arg, "global-dynamic"))
1599         flag_tls_default = TLS_MODEL_GLOBAL_DYNAMIC;
1600       else if (!strcmp (arg, "local-dynamic"))
1601         flag_tls_default = TLS_MODEL_LOCAL_DYNAMIC;
1602       else if (!strcmp (arg, "initial-exec"))
1603         flag_tls_default = TLS_MODEL_INITIAL_EXEC;
1604       else if (!strcmp (arg, "local-exec"))
1605         flag_tls_default = TLS_MODEL_LOCAL_EXEC;
1606       else
1607         warning (0, "unknown tls-model \"%s\"", arg);
1608       break;
1609
1610     case OPT_ftracer:
1611       flag_tracer_set = true;
1612       break;
1613
1614     case OPT_funroll_loops:
1615       flag_unroll_loops_set = true;
1616       break;
1617
1618     case OPT_g:
1619       set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, arg);
1620       break;
1621
1622     case OPT_gcoff:
1623       set_debug_level (SDB_DEBUG, false, arg);
1624       break;
1625
1626     case OPT_gdwarf_2:
1627       set_debug_level (DWARF2_DEBUG, false, arg);
1628       break;
1629
1630     case OPT_ggdb:
1631       set_debug_level (NO_DEBUG, 2, arg);
1632       break;
1633
1634     case OPT_gstabs:
1635     case OPT_gstabs_:
1636       set_debug_level (DBX_DEBUG, code == OPT_gstabs_, arg);
1637       break;
1638
1639     case OPT_gvms:
1640       set_debug_level (VMS_DEBUG, false, arg);
1641       break;
1642
1643     case OPT_gxcoff:
1644     case OPT_gxcoff_:
1645       set_debug_level (XCOFF_DEBUG, code == OPT_gxcoff_, arg);
1646       break;
1647
1648     case OPT_o:
1649       asm_file_name = arg;
1650       break;
1651
1652     case OPT_pedantic_errors:
1653       flag_pedantic_errors = pedantic = 1;
1654       break;
1655
1656     case OPT_floop_optimize:
1657     case OPT_frerun_loop_opt:
1658     case OPT_fstrength_reduce:
1659       /* These are no-ops, preserved for backward compatibility.  */
1660       break;
1661
1662     default:
1663       /* If the flag was handled in a standard way, assume the lack of
1664          processing here is intentional.  */
1665       gcc_assert (cl_options[scode].flag_var);
1666       break;
1667     }
1668
1669   return 1;
1670 }
1671
1672 /* Handle --param NAME=VALUE.  */
1673 static void
1674 handle_param (const char *carg)
1675 {
1676   char *equal, *arg;
1677   int value;
1678
1679   arg = xstrdup (carg);
1680   equal = strchr (arg, '=');
1681   if (!equal)
1682     error ("%s: --param arguments should be of the form NAME=VALUE", arg);
1683   else
1684     {
1685       value = integral_argument (equal + 1);
1686       if (value == -1)
1687         error ("invalid --param value %qs", equal + 1);
1688       else
1689         {
1690           *equal = '\0';
1691           set_param_value (arg, value);
1692         }
1693     }
1694
1695   free (arg);
1696 }
1697
1698 /* Handle -W and -Wextra.  */
1699 static void
1700 set_Wextra (int setting)
1701 {
1702   extra_warnings = setting;
1703   warn_unused_parameter = (setting && maybe_warn_unused_parameter);
1704
1705   /* We save the value of warn_uninitialized, since if they put
1706      -Wuninitialized on the command line, we need to generate a
1707      warning about not using it without also specifying -O.  */
1708   if (setting == 0)
1709     warn_uninitialized = 0;
1710   else if (warn_uninitialized != 1)
1711     warn_uninitialized = 2;
1712 }
1713
1714 /* Initialize unused warning flags.  */
1715 void
1716 set_Wunused (int setting)
1717 {
1718   warn_unused_function = setting;
1719   warn_unused_label = setting;
1720   /* Unused function parameter warnings are reported when either
1721      ``-Wextra -Wunused'' or ``-Wunused-parameter'' is specified.
1722      Thus, if -Wextra has already been seen, set warn_unused_parameter;
1723      otherwise set maybe_warn_extra_parameter, which will be picked up
1724      by set_Wextra.  */
1725   maybe_warn_unused_parameter = setting;
1726   warn_unused_parameter = (setting && extra_warnings);
1727   warn_unused_variable = setting;
1728   warn_unused_value = setting;
1729 }
1730
1731 /* Used to set the level of strict aliasing warnings, 
1732    when no level is specified (i.e., when -Wstrict-aliasing, and not
1733    -Wstrict-aliasing=level was given).
1734    ONOFF is assumed to take value 1 when -Wstrict-aliasing is specified,
1735    and 0 otherwise.  After calling this function, wstrict_aliasing will be
1736    set to the default value of -Wstrict_aliasing=level, currently 3.  */
1737 void
1738 set_Wstrict_aliasing (int onoff)
1739 {
1740   gcc_assert (onoff == 0 || onoff == 1);
1741   if (onoff != 0)
1742     warn_strict_aliasing = 3;
1743 }
1744
1745 /* The following routines are useful in setting all the flags that
1746    -ffast-math and -fno-fast-math imply.  */
1747 void
1748 set_fast_math_flags (int set)
1749 {
1750   flag_trapping_math = !set;
1751   flag_unsafe_math_optimizations = set;
1752   flag_finite_math_only = set;
1753   flag_signed_zeros = !set;
1754   flag_errno_math = !set;
1755   if (set)
1756     {
1757       flag_signaling_nans = 0;
1758       flag_rounding_math = 0;
1759       flag_cx_limited_range = 1;
1760     }
1761 }
1762
1763 /* Return true iff flags are set as if -ffast-math.  */
1764 bool
1765 fast_math_flags_set_p (void)
1766 {
1767   return (!flag_trapping_math
1768           && flag_unsafe_math_optimizations
1769           && flag_finite_math_only
1770           && !flag_signed_zeros
1771           && !flag_errno_math);
1772 }
1773
1774 /* Handle a debug output -g switch.  EXTENDED is true or false to support
1775    extended output (2 is special and means "-ggdb" was given).  */
1776 static void
1777 set_debug_level (enum debug_info_type type, int extended, const char *arg)
1778 {
1779   static bool type_explicit;
1780
1781   use_gnu_debug_info_extensions = extended;
1782
1783   if (type == NO_DEBUG)
1784     {
1785       if (write_symbols == NO_DEBUG)
1786         {
1787           write_symbols = PREFERRED_DEBUGGING_TYPE;
1788
1789           if (extended == 2)
1790             {
1791 #ifdef DWARF2_DEBUGGING_INFO
1792               write_symbols = DWARF2_DEBUG;
1793 #elif defined DBX_DEBUGGING_INFO
1794               write_symbols = DBX_DEBUG;
1795 #endif
1796             }
1797
1798           if (write_symbols == NO_DEBUG)
1799             warning (0, "target system does not support debug output");
1800         }
1801     }
1802   else
1803     {
1804       /* Does it conflict with an already selected type?  */
1805       if (type_explicit && write_symbols != NO_DEBUG && type != write_symbols)
1806         error ("debug format \"%s\" conflicts with prior selection",
1807                debug_type_names[type]);
1808       write_symbols = type;
1809       type_explicit = true;
1810     }
1811
1812   /* A debug flag without a level defaults to level 2.  */
1813   if (*arg == '\0')
1814     {
1815       if (!debug_info_level)
1816         debug_info_level = 2;
1817     }
1818   else
1819     {
1820       debug_info_level = integral_argument (arg);
1821       if (debug_info_level == (unsigned int) -1)
1822         error ("unrecognised debug output level \"%s\"", arg);
1823       else if (debug_info_level > 3)
1824         error ("debug output level %s is too high", arg);
1825     }
1826 }
1827
1828 /* Return 1 if OPTION is enabled, 0 if it is disabled, or -1 if it isn't
1829    a simple on-off switch.  */
1830
1831 int
1832 option_enabled (int opt_idx)
1833 {
1834   const struct cl_option *option = &(cl_options[opt_idx]);
1835
1836   if (option->flag_var)
1837     switch (option->var_type)
1838       {
1839       case CLVC_BOOLEAN:
1840         return *(int *) option->flag_var != 0;
1841
1842       case CLVC_EQUAL:
1843         return *(int *) option->flag_var == option->var_value;
1844
1845       case CLVC_BIT_CLEAR:
1846         return (*(int *) option->flag_var & option->var_value) == 0;
1847
1848       case CLVC_BIT_SET:
1849         return (*(int *) option->flag_var & option->var_value) != 0;
1850
1851       case CLVC_STRING:
1852         break;
1853       }
1854   return -1;
1855 }
1856
1857 /* Fill STATE with the current state of option OPTION.  Return true if
1858    there is some state to store.  */
1859
1860 bool
1861 get_option_state (int option, struct cl_option_state *state)
1862 {
1863   if (cl_options[option].flag_var == 0)
1864     return false;
1865
1866   switch (cl_options[option].var_type)
1867     {
1868     case CLVC_BOOLEAN:
1869     case CLVC_EQUAL:
1870       state->data = cl_options[option].flag_var;
1871       state->size = sizeof (int);
1872       break;
1873
1874     case CLVC_BIT_CLEAR:
1875     case CLVC_BIT_SET:
1876       state->ch = option_enabled (option);
1877       state->data = &state->ch;
1878       state->size = 1;
1879       break;
1880
1881     case CLVC_STRING:
1882       state->data = *(const char **) cl_options[option].flag_var;
1883       if (state->data == 0)
1884         state->data = "";
1885       state->size = strlen (state->data) + 1;
1886       break;
1887     }
1888   return true;
1889 }
1890
1891 /* Enable a warning option as an error.  This is used by -Werror= and
1892    also by legacy Werror-implicit-function-declaration.  */
1893
1894 void
1895 enable_warning_as_error (const char *arg, int value, unsigned int lang_mask)
1896 {
1897   char *new_option;
1898   int option_index;
1899
1900   new_option = XNEWVEC (char, strlen (arg) + 2);
1901   new_option[0] = 'W';
1902   strcpy (new_option + 1, arg);
1903   option_index = find_opt (new_option, lang_mask);
1904   if (option_index == N_OPTS)
1905     {
1906       error ("-Werror=%s: No option -%s", arg, new_option);
1907     }
1908   else
1909     {
1910       int kind = value ? DK_ERROR : DK_WARNING;
1911       diagnostic_classify_diagnostic (global_dc, option_index, kind);
1912       
1913       /* -Werror=foo implies -Wfoo.  */
1914       if (cl_options[option_index].var_type == CLVC_BOOLEAN
1915           && cl_options[option_index].flag_var
1916           && kind == DK_ERROR)
1917         *(int *) cl_options[option_index].flag_var = 1;
1918     }
1919   free (new_option);
1920 }