OSDN Git Service

Merge dataflow branch into mainline
[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_fdiagnostics_show_location_:
1438       if (!strcmp (arg, "once"))
1439         diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
1440       else if (!strcmp (arg, "every-line"))
1441         diagnostic_prefixing_rule (global_dc)
1442           = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE;
1443       else
1444         return 0;
1445       break;
1446
1447     case OPT_fdiagnostics_show_option:
1448       global_dc->show_option_requested = true;
1449       break;
1450
1451     case OPT_fdump_:
1452       if (!dump_switch_p (arg))
1453         return 0;
1454       break;
1455
1456     case OPT_ffast_math:
1457       set_fast_math_flags (value);
1458       break;
1459
1460     case OPT_ffixed_:
1461       fix_register (arg, 1, 1);
1462       break;
1463
1464     case OPT_finline_limit_:
1465     case OPT_finline_limit_eq:
1466       set_param_value ("max-inline-insns-single", value / 2);
1467       set_param_value ("max-inline-insns-auto", value / 2);
1468       break;
1469
1470     case OPT_fmessage_length_:
1471       pp_set_line_maximum_length (global_dc->printer, value);
1472       break;
1473
1474     case OPT_fpack_struct_:
1475       if (value <= 0 || (value & (value - 1)) || value > 16)
1476         error ("structure alignment must be a small power of two, not %d", value);
1477       else
1478         {
1479           initial_max_fld_align = value;
1480           maximum_field_alignment = value * BITS_PER_UNIT;
1481         }
1482       break;
1483
1484     case OPT_fpeel_loops:
1485       flag_peel_loops_set = true;
1486       break;
1487
1488     case OPT_fprofile_arcs:
1489       profile_arc_flag_set = true;
1490       break;
1491
1492     case OPT_fprofile_use:
1493       if (!flag_branch_probabilities_set)
1494         flag_branch_probabilities = value;
1495       if (!flag_profile_values_set)
1496         flag_profile_values = value;
1497       if (!flag_unroll_loops_set)
1498         flag_unroll_loops = value;
1499       if (!flag_peel_loops_set)
1500         flag_peel_loops = value;
1501       if (!flag_tracer_set)
1502         flag_tracer = value;
1503       if (!flag_value_profile_transformations_set)
1504         flag_value_profile_transformations = value;
1505       break;
1506
1507     case OPT_fprofile_generate:
1508       if (!profile_arc_flag_set)
1509         profile_arc_flag = value;
1510       if (!flag_profile_values_set)
1511         flag_profile_values = value;
1512       if (!flag_value_profile_transformations_set)
1513         flag_value_profile_transformations = value;
1514       break;
1515
1516     case OPT_fprofile_values:
1517       flag_profile_values_set = true;
1518       break;
1519
1520     case OPT_fvisibility_:
1521       {
1522         if (!strcmp(arg, "default"))
1523           default_visibility = VISIBILITY_DEFAULT;
1524         else if (!strcmp(arg, "internal"))
1525           default_visibility = VISIBILITY_INTERNAL;
1526         else if (!strcmp(arg, "hidden"))
1527           default_visibility = VISIBILITY_HIDDEN;
1528         else if (!strcmp(arg, "protected"))
1529           default_visibility = VISIBILITY_PROTECTED;
1530         else
1531           error ("unrecognized visibility value \"%s\"", arg);
1532       }
1533       break;
1534
1535     case OPT_fvpt:
1536       flag_value_profile_transformations_set = true;
1537       break;
1538
1539     case OPT_frandom_seed:
1540       /* The real switch is -fno-random-seed.  */
1541       if (value)
1542         return 0;
1543       set_random_seed (NULL);
1544       break;
1545
1546     case OPT_frandom_seed_:
1547       set_random_seed (arg);
1548       break;
1549
1550     case OPT_fsched_verbose_:
1551 #ifdef INSN_SCHEDULING
1552       fix_sched_param ("verbose", arg);
1553       break;
1554 #else
1555       return 0;
1556 #endif
1557
1558     case OPT_fsched_stalled_insns_:
1559       flag_sched_stalled_insns = value;
1560       if (flag_sched_stalled_insns == 0)
1561         flag_sched_stalled_insns = -1;
1562       break;
1563
1564     case OPT_fsched_stalled_insns_dep_:
1565       flag_sched_stalled_insns_dep = value;
1566       break;
1567
1568     case OPT_fstack_limit:
1569       /* The real switch is -fno-stack-limit.  */
1570       if (value)
1571         return 0;
1572       stack_limit_rtx = NULL_RTX;
1573       break;
1574
1575     case OPT_fstack_limit_register_:
1576       {
1577         int reg = decode_reg_name (arg);
1578         if (reg < 0)
1579           error ("unrecognized register name \"%s\"", arg);
1580         else
1581           stack_limit_rtx = gen_rtx_REG (Pmode, reg);
1582       }
1583       break;
1584
1585     case OPT_fstack_limit_symbol_:
1586       stack_limit_rtx = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (arg));
1587       break;
1588
1589     case OPT_ftree_vectorizer_verbose_:
1590       vect_set_verbosity_level (arg);
1591       break;
1592
1593     case OPT_ftls_model_:
1594       if (!strcmp (arg, "global-dynamic"))
1595         flag_tls_default = TLS_MODEL_GLOBAL_DYNAMIC;
1596       else if (!strcmp (arg, "local-dynamic"))
1597         flag_tls_default = TLS_MODEL_LOCAL_DYNAMIC;
1598       else if (!strcmp (arg, "initial-exec"))
1599         flag_tls_default = TLS_MODEL_INITIAL_EXEC;
1600       else if (!strcmp (arg, "local-exec"))
1601         flag_tls_default = TLS_MODEL_LOCAL_EXEC;
1602       else
1603         warning (0, "unknown tls-model \"%s\"", arg);
1604       break;
1605
1606     case OPT_ftracer:
1607       flag_tracer_set = true;
1608       break;
1609
1610     case OPT_funroll_loops:
1611       flag_unroll_loops_set = true;
1612       break;
1613
1614     case OPT_g:
1615       set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, arg);
1616       break;
1617
1618     case OPT_gcoff:
1619       set_debug_level (SDB_DEBUG, false, arg);
1620       break;
1621
1622     case OPT_gdwarf_2:
1623       set_debug_level (DWARF2_DEBUG, false, arg);
1624       break;
1625
1626     case OPT_ggdb:
1627       set_debug_level (NO_DEBUG, 2, arg);
1628       break;
1629
1630     case OPT_gstabs:
1631     case OPT_gstabs_:
1632       set_debug_level (DBX_DEBUG, code == OPT_gstabs_, arg);
1633       break;
1634
1635     case OPT_gvms:
1636       set_debug_level (VMS_DEBUG, false, arg);
1637       break;
1638
1639     case OPT_gxcoff:
1640     case OPT_gxcoff_:
1641       set_debug_level (XCOFF_DEBUG, code == OPT_gxcoff_, arg);
1642       break;
1643
1644     case OPT_o:
1645       asm_file_name = arg;
1646       break;
1647
1648     case OPT_pedantic_errors:
1649       flag_pedantic_errors = pedantic = 1;
1650       break;
1651
1652     case OPT_floop_optimize:
1653     case OPT_frerun_loop_opt:
1654     case OPT_fstrength_reduce:
1655       /* These are no-ops, preserved for backward compatibility.  */
1656       break;
1657
1658     default:
1659       /* If the flag was handled in a standard way, assume the lack of
1660          processing here is intentional.  */
1661       gcc_assert (cl_options[scode].flag_var);
1662       break;
1663     }
1664
1665   return 1;
1666 }
1667
1668 /* Handle --param NAME=VALUE.  */
1669 static void
1670 handle_param (const char *carg)
1671 {
1672   char *equal, *arg;
1673   int value;
1674
1675   arg = xstrdup (carg);
1676   equal = strchr (arg, '=');
1677   if (!equal)
1678     error ("%s: --param arguments should be of the form NAME=VALUE", arg);
1679   else
1680     {
1681       value = integral_argument (equal + 1);
1682       if (value == -1)
1683         error ("invalid --param value %qs", equal + 1);
1684       else
1685         {
1686           *equal = '\0';
1687           set_param_value (arg, value);
1688         }
1689     }
1690
1691   free (arg);
1692 }
1693
1694 /* Handle -W and -Wextra.  */
1695 static void
1696 set_Wextra (int setting)
1697 {
1698   extra_warnings = setting;
1699   warn_unused_parameter = (setting && maybe_warn_unused_parameter);
1700
1701   /* We save the value of warn_uninitialized, since if they put
1702      -Wuninitialized on the command line, we need to generate a
1703      warning about not using it without also specifying -O.  */
1704   if (setting == 0)
1705     warn_uninitialized = 0;
1706   else if (warn_uninitialized != 1)
1707     warn_uninitialized = 2;
1708 }
1709
1710 /* Initialize unused warning flags.  */
1711 void
1712 set_Wunused (int setting)
1713 {
1714   warn_unused_function = setting;
1715   warn_unused_label = setting;
1716   /* Unused function parameter warnings are reported when either
1717      ``-Wextra -Wunused'' or ``-Wunused-parameter'' is specified.
1718      Thus, if -Wextra has already been seen, set warn_unused_parameter;
1719      otherwise set maybe_warn_extra_parameter, which will be picked up
1720      by set_Wextra.  */
1721   maybe_warn_unused_parameter = setting;
1722   warn_unused_parameter = (setting && extra_warnings);
1723   warn_unused_variable = setting;
1724   warn_unused_value = setting;
1725 }
1726
1727 /* Used to set the level of strict aliasing warnings, 
1728    when no level is specified (i.e., when -Wstrict-aliasing, and not
1729    -Wstrict-aliasing=level was given).
1730    ONOFF is assumed to take value 1 when -Wstrict-aliasing is specified,
1731    and 0 otherwise.  After calling this function, wstrict_aliasing will be
1732    set to the default value of -Wstrict_aliasing=level, currently 3.  */
1733 void
1734 set_Wstrict_aliasing (int onoff)
1735 {
1736   gcc_assert (onoff == 0 || onoff == 1);
1737   if (onoff != 0)
1738     warn_strict_aliasing = 3;
1739 }
1740
1741 /* The following routines are useful in setting all the flags that
1742    -ffast-math and -fno-fast-math imply.  */
1743 void
1744 set_fast_math_flags (int set)
1745 {
1746   flag_trapping_math = !set;
1747   flag_unsafe_math_optimizations = set;
1748   flag_finite_math_only = set;
1749   flag_signed_zeros = !set;
1750   flag_errno_math = !set;
1751   if (set)
1752     {
1753       flag_signaling_nans = 0;
1754       flag_rounding_math = 0;
1755       flag_cx_limited_range = 1;
1756     }
1757 }
1758
1759 /* Return true iff flags are set as if -ffast-math.  */
1760 bool
1761 fast_math_flags_set_p (void)
1762 {
1763   return (!flag_trapping_math
1764           && flag_unsafe_math_optimizations
1765           && flag_finite_math_only
1766           && !flag_signed_zeros
1767           && !flag_errno_math);
1768 }
1769
1770 /* Handle a debug output -g switch.  EXTENDED is true or false to support
1771    extended output (2 is special and means "-ggdb" was given).  */
1772 static void
1773 set_debug_level (enum debug_info_type type, int extended, const char *arg)
1774 {
1775   static bool type_explicit;
1776
1777   use_gnu_debug_info_extensions = extended;
1778
1779   if (type == NO_DEBUG)
1780     {
1781       if (write_symbols == NO_DEBUG)
1782         {
1783           write_symbols = PREFERRED_DEBUGGING_TYPE;
1784
1785           if (extended == 2)
1786             {
1787 #ifdef DWARF2_DEBUGGING_INFO
1788               write_symbols = DWARF2_DEBUG;
1789 #elif defined DBX_DEBUGGING_INFO
1790               write_symbols = DBX_DEBUG;
1791 #endif
1792             }
1793
1794           if (write_symbols == NO_DEBUG)
1795             warning (0, "target system does not support debug output");
1796         }
1797     }
1798   else
1799     {
1800       /* Does it conflict with an already selected type?  */
1801       if (type_explicit && write_symbols != NO_DEBUG && type != write_symbols)
1802         error ("debug format \"%s\" conflicts with prior selection",
1803                debug_type_names[type]);
1804       write_symbols = type;
1805       type_explicit = true;
1806     }
1807
1808   /* A debug flag without a level defaults to level 2.  */
1809   if (*arg == '\0')
1810     {
1811       if (!debug_info_level)
1812         debug_info_level = 2;
1813     }
1814   else
1815     {
1816       debug_info_level = integral_argument (arg);
1817       if (debug_info_level == (unsigned int) -1)
1818         error ("unrecognised debug output level \"%s\"", arg);
1819       else if (debug_info_level > 3)
1820         error ("debug output level %s is too high", arg);
1821     }
1822 }
1823
1824 /* Return 1 if OPTION is enabled, 0 if it is disabled, or -1 if it isn't
1825    a simple on-off switch.  */
1826
1827 int
1828 option_enabled (int opt_idx)
1829 {
1830   const struct cl_option *option = &(cl_options[opt_idx]);
1831
1832   if (option->flag_var)
1833     switch (option->var_type)
1834       {
1835       case CLVC_BOOLEAN:
1836         return *(int *) option->flag_var != 0;
1837
1838       case CLVC_EQUAL:
1839         return *(int *) option->flag_var == option->var_value;
1840
1841       case CLVC_BIT_CLEAR:
1842         return (*(int *) option->flag_var & option->var_value) == 0;
1843
1844       case CLVC_BIT_SET:
1845         return (*(int *) option->flag_var & option->var_value) != 0;
1846
1847       case CLVC_STRING:
1848         break;
1849       }
1850   return -1;
1851 }
1852
1853 /* Fill STATE with the current state of option OPTION.  Return true if
1854    there is some state to store.  */
1855
1856 bool
1857 get_option_state (int option, struct cl_option_state *state)
1858 {
1859   if (cl_options[option].flag_var == 0)
1860     return false;
1861
1862   switch (cl_options[option].var_type)
1863     {
1864     case CLVC_BOOLEAN:
1865     case CLVC_EQUAL:
1866       state->data = cl_options[option].flag_var;
1867       state->size = sizeof (int);
1868       break;
1869
1870     case CLVC_BIT_CLEAR:
1871     case CLVC_BIT_SET:
1872       state->ch = option_enabled (option);
1873       state->data = &state->ch;
1874       state->size = 1;
1875       break;
1876
1877     case CLVC_STRING:
1878       state->data = *(const char **) cl_options[option].flag_var;
1879       if (state->data == 0)
1880         state->data = "";
1881       state->size = strlen (state->data) + 1;
1882       break;
1883     }
1884   return true;
1885 }
1886
1887 /* Enable a warning option as an error.  This is used by -Werror= and
1888    also by legacy Werror-implicit-function-declaration.  */
1889
1890 void
1891 enable_warning_as_error (const char *arg, int value, unsigned int lang_mask)
1892 {
1893   char *new_option;
1894   int option_index;
1895
1896   new_option = XNEWVEC (char, strlen (arg) + 2);
1897   new_option[0] = 'W';
1898   strcpy (new_option + 1, arg);
1899   option_index = find_opt (new_option, lang_mask);
1900   if (option_index == N_OPTS)
1901     {
1902       error ("-Werror=%s: No option -%s", arg, new_option);
1903     }
1904   else
1905     {
1906       int kind = value ? DK_ERROR : DK_WARNING;
1907       diagnostic_classify_diagnostic (global_dc, option_index, kind);
1908       
1909       /* -Werror=foo implies -Wfoo.  */
1910       if (cl_options[option_index].var_type == CLVC_BOOLEAN
1911           && cl_options[option_index].flag_var
1912           && kind == DK_ERROR)
1913         *(int *) cl_options[option_index].flag_var = 1;
1914     }
1915   free (new_option);
1916 }