OSDN Git Service

* reg-stack.c (struct tree_opt_pass pass_stack_regs): Nullify name
[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
1233       /* Allow the target a chance to give the user some additional information.  */
1234       if (targetm.target_help)
1235         targetm.target_help ();
1236       break;
1237
1238     case OPT_fhelp_:
1239     case OPT__help_:
1240       {
1241         const char * a = arg;
1242         unsigned int include_flags = 0;
1243         /* Note - by default we include undocumented options when listing
1244            specific classes.  If you only want to see documented options
1245            then add ",^undocumented" to the --help= option.  e.g.:
1246
1247            --help=target,^undocumented  */
1248         unsigned int exclude_flags = 0;
1249
1250         /* Walk along the argument string, parsing each word in turn.
1251            The format is:
1252            arg = [^]{word}[,{arg}]
1253            word = {optimizers|target|warnings|undocumented|
1254                    params|common|<language>}  */
1255         while (* a != 0)
1256           {
1257             static struct
1258             {
1259               const char * string;
1260               unsigned int flag;
1261             }
1262             specifics[] =
1263             {
1264               { "optimizers", CL_OPTIMIZATION },
1265               { "target", CL_TARGET },
1266               { "warnings", CL_WARNING },
1267               { "undocumented", CL_UNDOCUMENTED },
1268               { "params", CL_PARAMS },
1269               { "joined", CL_JOINED },
1270               { "separate", CL_SEPARATE },
1271               { "common", CL_COMMON },
1272               { NULL, 0 }
1273             };
1274             unsigned int * pflags;
1275             char * comma;
1276             unsigned int len;
1277             unsigned int i;
1278
1279             if (* a == '^')
1280               {
1281                 ++ a;
1282                 pflags = & exclude_flags;
1283               }
1284             else
1285               pflags = & include_flags;
1286
1287             comma = strchr (a, ',');
1288             if (comma == NULL)
1289               len = strlen (a);
1290             else
1291               len = comma - a;
1292
1293             for (i = 0; specifics[i].string != NULL; i++)
1294               if (strncasecmp (a, specifics[i].string, len) == 0)
1295                 {
1296                   * pflags |= specifics[i].flag;
1297                   break;
1298                 }
1299
1300             if (specifics[i].string == NULL)
1301               {
1302                 /* Check to see if the string matches a language name.  */
1303                 for (i = 0; i < cl_lang_count; i++)
1304                   if (strncasecmp (a, lang_names[i], len) == 0)
1305                     {
1306                       * pflags |= 1U << i;
1307                       break;
1308                     }
1309
1310                 if (i == cl_lang_count)
1311                   fnotice (stderr,
1312                            "warning: unrecognized argument to --help= switch: %.*s\n",
1313                            len, a);
1314               }
1315
1316             if (comma == NULL)
1317               break;
1318             a = comma + 1;
1319           }
1320
1321         if (include_flags)
1322           print_specific_help (include_flags, exclude_flags, 0);
1323         exit_after_options = true;
1324         break;
1325       }
1326
1327     case OPT__version:
1328       print_version (stderr, "");
1329       exit_after_options = true;
1330       break;
1331
1332     case OPT_G:
1333       g_switch_value = value;
1334       g_switch_set = true;
1335       break;
1336
1337     case OPT_O:
1338     case OPT_Os:
1339       /* Currently handled in a prescan.  */
1340       break;
1341
1342     case OPT_W:
1343       /* For backward compatibility, -W is the same as -Wextra.  */
1344       set_Wextra (value);
1345       break;
1346
1347     case OPT_Werror_:
1348       enable_warning_as_error (arg, value, lang_mask);
1349       break;
1350
1351     case OPT_Wextra:
1352       set_Wextra (value);
1353       break;
1354
1355     case OPT_Wlarger_than_:
1356       larger_than_size = value;
1357       warn_larger_than = value != -1;
1358       break;
1359
1360     case OPT_Wstrict_aliasing:
1361       set_Wstrict_aliasing (value);
1362       break;
1363
1364     case OPT_Wstrict_aliasing_:
1365       warn_strict_aliasing = value;
1366       break;
1367
1368     case OPT_Wstrict_overflow:
1369       warn_strict_overflow = (value
1370                               ? (int) WARN_STRICT_OVERFLOW_CONDITIONAL
1371                               : 0);
1372       break;
1373
1374     case OPT_Wstrict_overflow_:
1375       warn_strict_overflow = value;
1376       break;
1377
1378     case OPT_Wunused:
1379       set_Wunused (value);
1380       break;
1381
1382     case OPT_aux_info:
1383     case OPT_aux_info_:
1384       aux_info_file_name = arg;
1385       flag_gen_aux_info = 1;
1386       break;
1387
1388     case OPT_auxbase:
1389       aux_base_name = arg;
1390       break;
1391
1392     case OPT_auxbase_strip:
1393       {
1394         char *tmp = xstrdup (arg);
1395         strip_off_ending (tmp, strlen (tmp));
1396         if (tmp[0])
1397           aux_base_name = tmp;
1398       }
1399       break;
1400
1401     case OPT_d:
1402       decode_d_option (arg);
1403       break;
1404
1405     case OPT_dumpbase:
1406       dump_base_name = arg;
1407       break;
1408
1409     case OPT_falign_functions_:
1410       align_functions = value;
1411       break;
1412
1413     case OPT_falign_jumps_:
1414       align_jumps = value;
1415       break;
1416
1417     case OPT_falign_labels_:
1418       align_labels = value;
1419       break;
1420
1421     case OPT_falign_loops_:
1422       align_loops = value;
1423       break;
1424
1425     case OPT_fbranch_probabilities:
1426       flag_branch_probabilities_set = true;
1427       break;
1428
1429     case OPT_fcall_used_:
1430       fix_register (arg, 0, 1);
1431       break;
1432
1433     case OPT_fcall_saved_:
1434       fix_register (arg, 0, 0);
1435       break;
1436
1437     case OPT_fdbg_cnt_:
1438       dbg_cnt_process_opt (arg);
1439       break;
1440
1441     case OPT_fdbg_cnt_list:
1442       dbg_cnt_list_all_counters ();
1443       break;
1444
1445     case OPT_fdiagnostics_show_location_:
1446       if (!strcmp (arg, "once"))
1447         diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
1448       else if (!strcmp (arg, "every-line"))
1449         diagnostic_prefixing_rule (global_dc)
1450           = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE;
1451       else
1452         return 0;
1453       break;
1454
1455     case OPT_fdiagnostics_show_option:
1456       global_dc->show_option_requested = true;
1457       break;
1458
1459     case OPT_fdump_:
1460       if (!dump_switch_p (arg))
1461         return 0;
1462       break;
1463
1464     case OPT_ffast_math:
1465       set_fast_math_flags (value);
1466       break;
1467
1468     case OPT_ffixed_:
1469       fix_register (arg, 1, 1);
1470       break;
1471
1472     case OPT_finline_limit_:
1473     case OPT_finline_limit_eq:
1474       set_param_value ("max-inline-insns-single", value / 2);
1475       set_param_value ("max-inline-insns-auto", value / 2);
1476       break;
1477
1478     case OPT_fmessage_length_:
1479       pp_set_line_maximum_length (global_dc->printer, value);
1480       break;
1481
1482     case OPT_fpack_struct_:
1483       if (value <= 0 || (value & (value - 1)) || value > 16)
1484         error ("structure alignment must be a small power of two, not %d", value);
1485       else
1486         {
1487           initial_max_fld_align = value;
1488           maximum_field_alignment = value * BITS_PER_UNIT;
1489         }
1490       break;
1491
1492     case OPT_fpeel_loops:
1493       flag_peel_loops_set = true;
1494       break;
1495
1496     case OPT_fprofile_arcs:
1497       profile_arc_flag_set = true;
1498       break;
1499
1500     case OPT_fprofile_use:
1501       if (!flag_branch_probabilities_set)
1502         flag_branch_probabilities = value;
1503       if (!flag_profile_values_set)
1504         flag_profile_values = value;
1505       if (!flag_unroll_loops_set)
1506         flag_unroll_loops = value;
1507       if (!flag_peel_loops_set)
1508         flag_peel_loops = value;
1509       if (!flag_tracer_set)
1510         flag_tracer = value;
1511       if (!flag_value_profile_transformations_set)
1512         flag_value_profile_transformations = value;
1513       break;
1514
1515     case OPT_fprofile_generate:
1516       if (!profile_arc_flag_set)
1517         profile_arc_flag = value;
1518       if (!flag_profile_values_set)
1519         flag_profile_values = value;
1520       if (!flag_value_profile_transformations_set)
1521         flag_value_profile_transformations = value;
1522       break;
1523
1524     case OPT_fprofile_values:
1525       flag_profile_values_set = true;
1526       break;
1527
1528     case OPT_fvisibility_:
1529       {
1530         if (!strcmp(arg, "default"))
1531           default_visibility = VISIBILITY_DEFAULT;
1532         else if (!strcmp(arg, "internal"))
1533           default_visibility = VISIBILITY_INTERNAL;
1534         else if (!strcmp(arg, "hidden"))
1535           default_visibility = VISIBILITY_HIDDEN;
1536         else if (!strcmp(arg, "protected"))
1537           default_visibility = VISIBILITY_PROTECTED;
1538         else
1539           error ("unrecognized visibility value \"%s\"", arg);
1540       }
1541       break;
1542
1543     case OPT_fvpt:
1544       flag_value_profile_transformations_set = true;
1545       break;
1546
1547     case OPT_frandom_seed:
1548       /* The real switch is -fno-random-seed.  */
1549       if (value)
1550         return 0;
1551       set_random_seed (NULL);
1552       break;
1553
1554     case OPT_frandom_seed_:
1555       set_random_seed (arg);
1556       break;
1557
1558     case OPT_fsched_verbose_:
1559 #ifdef INSN_SCHEDULING
1560       fix_sched_param ("verbose", arg);
1561       break;
1562 #else
1563       return 0;
1564 #endif
1565
1566     case OPT_fsched_stalled_insns_:
1567       flag_sched_stalled_insns = value;
1568       if (flag_sched_stalled_insns == 0)
1569         flag_sched_stalled_insns = -1;
1570       break;
1571
1572     case OPT_fsched_stalled_insns_dep_:
1573       flag_sched_stalled_insns_dep = value;
1574       break;
1575
1576     case OPT_fstack_limit:
1577       /* The real switch is -fno-stack-limit.  */
1578       if (value)
1579         return 0;
1580       stack_limit_rtx = NULL_RTX;
1581       break;
1582
1583     case OPT_fstack_limit_register_:
1584       {
1585         int reg = decode_reg_name (arg);
1586         if (reg < 0)
1587           error ("unrecognized register name \"%s\"", arg);
1588         else
1589           stack_limit_rtx = gen_rtx_REG (Pmode, reg);
1590       }
1591       break;
1592
1593     case OPT_fstack_limit_symbol_:
1594       stack_limit_rtx = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (arg));
1595       break;
1596
1597     case OPT_ftree_vectorizer_verbose_:
1598       vect_set_verbosity_level (arg);
1599       break;
1600
1601     case OPT_ftls_model_:
1602       if (!strcmp (arg, "global-dynamic"))
1603         flag_tls_default = TLS_MODEL_GLOBAL_DYNAMIC;
1604       else if (!strcmp (arg, "local-dynamic"))
1605         flag_tls_default = TLS_MODEL_LOCAL_DYNAMIC;
1606       else if (!strcmp (arg, "initial-exec"))
1607         flag_tls_default = TLS_MODEL_INITIAL_EXEC;
1608       else if (!strcmp (arg, "local-exec"))
1609         flag_tls_default = TLS_MODEL_LOCAL_EXEC;
1610       else
1611         warning (0, "unknown tls-model \"%s\"", arg);
1612       break;
1613
1614     case OPT_ftracer:
1615       flag_tracer_set = true;
1616       break;
1617
1618     case OPT_funroll_loops:
1619       flag_unroll_loops_set = true;
1620       break;
1621
1622     case OPT_g:
1623       set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, arg);
1624       break;
1625
1626     case OPT_gcoff:
1627       set_debug_level (SDB_DEBUG, false, arg);
1628       break;
1629
1630     case OPT_gdwarf_2:
1631       set_debug_level (DWARF2_DEBUG, false, arg);
1632       break;
1633
1634     case OPT_ggdb:
1635       set_debug_level (NO_DEBUG, 2, arg);
1636       break;
1637
1638     case OPT_gstabs:
1639     case OPT_gstabs_:
1640       set_debug_level (DBX_DEBUG, code == OPT_gstabs_, arg);
1641       break;
1642
1643     case OPT_gvms:
1644       set_debug_level (VMS_DEBUG, false, arg);
1645       break;
1646
1647     case OPT_gxcoff:
1648     case OPT_gxcoff_:
1649       set_debug_level (XCOFF_DEBUG, code == OPT_gxcoff_, arg);
1650       break;
1651
1652     case OPT_o:
1653       asm_file_name = arg;
1654       break;
1655
1656     case OPT_pedantic_errors:
1657       flag_pedantic_errors = pedantic = 1;
1658       break;
1659
1660     case OPT_floop_optimize:
1661     case OPT_frerun_loop_opt:
1662     case OPT_fstrength_reduce:
1663       /* These are no-ops, preserved for backward compatibility.  */
1664       break;
1665
1666     default:
1667       /* If the flag was handled in a standard way, assume the lack of
1668          processing here is intentional.  */
1669       gcc_assert (cl_options[scode].flag_var);
1670       break;
1671     }
1672
1673   return 1;
1674 }
1675
1676 /* Handle --param NAME=VALUE.  */
1677 static void
1678 handle_param (const char *carg)
1679 {
1680   char *equal, *arg;
1681   int value;
1682
1683   arg = xstrdup (carg);
1684   equal = strchr (arg, '=');
1685   if (!equal)
1686     error ("%s: --param arguments should be of the form NAME=VALUE", arg);
1687   else
1688     {
1689       value = integral_argument (equal + 1);
1690       if (value == -1)
1691         error ("invalid --param value %qs", equal + 1);
1692       else
1693         {
1694           *equal = '\0';
1695           set_param_value (arg, value);
1696         }
1697     }
1698
1699   free (arg);
1700 }
1701
1702 /* Handle -W and -Wextra.  */
1703 static void
1704 set_Wextra (int setting)
1705 {
1706   extra_warnings = setting;
1707   warn_unused_parameter = (setting && maybe_warn_unused_parameter);
1708
1709   /* We save the value of warn_uninitialized, since if they put
1710      -Wuninitialized on the command line, we need to generate a
1711      warning about not using it without also specifying -O.  */
1712   if (setting == 0)
1713     warn_uninitialized = 0;
1714   else if (warn_uninitialized != 1)
1715     warn_uninitialized = 2;
1716 }
1717
1718 /* Initialize unused warning flags.  */
1719 void
1720 set_Wunused (int setting)
1721 {
1722   warn_unused_function = setting;
1723   warn_unused_label = setting;
1724   /* Unused function parameter warnings are reported when either
1725      ``-Wextra -Wunused'' or ``-Wunused-parameter'' is specified.
1726      Thus, if -Wextra has already been seen, set warn_unused_parameter;
1727      otherwise set maybe_warn_extra_parameter, which will be picked up
1728      by set_Wextra.  */
1729   maybe_warn_unused_parameter = setting;
1730   warn_unused_parameter = (setting && extra_warnings);
1731   warn_unused_variable = setting;
1732   warn_unused_value = setting;
1733 }
1734
1735 /* Used to set the level of strict aliasing warnings, 
1736    when no level is specified (i.e., when -Wstrict-aliasing, and not
1737    -Wstrict-aliasing=level was given).
1738    ONOFF is assumed to take value 1 when -Wstrict-aliasing is specified,
1739    and 0 otherwise.  After calling this function, wstrict_aliasing will be
1740    set to the default value of -Wstrict_aliasing=level, currently 3.  */
1741 void
1742 set_Wstrict_aliasing (int onoff)
1743 {
1744   gcc_assert (onoff == 0 || onoff == 1);
1745   if (onoff != 0)
1746     warn_strict_aliasing = 3;
1747 }
1748
1749 /* The following routines are useful in setting all the flags that
1750    -ffast-math and -fno-fast-math imply.  */
1751 void
1752 set_fast_math_flags (int set)
1753 {
1754   flag_trapping_math = !set;
1755   flag_unsafe_math_optimizations = set;
1756   flag_finite_math_only = set;
1757   flag_signed_zeros = !set;
1758   flag_errno_math = !set;
1759   if (set)
1760     {
1761       flag_signaling_nans = 0;
1762       flag_rounding_math = 0;
1763       flag_cx_limited_range = 1;
1764     }
1765 }
1766
1767 /* Return true iff flags are set as if -ffast-math.  */
1768 bool
1769 fast_math_flags_set_p (void)
1770 {
1771   return (!flag_trapping_math
1772           && flag_unsafe_math_optimizations
1773           && flag_finite_math_only
1774           && !flag_signed_zeros
1775           && !flag_errno_math);
1776 }
1777
1778 /* Handle a debug output -g switch.  EXTENDED is true or false to support
1779    extended output (2 is special and means "-ggdb" was given).  */
1780 static void
1781 set_debug_level (enum debug_info_type type, int extended, const char *arg)
1782 {
1783   static bool type_explicit;
1784
1785   use_gnu_debug_info_extensions = extended;
1786
1787   if (type == NO_DEBUG)
1788     {
1789       if (write_symbols == NO_DEBUG)
1790         {
1791           write_symbols = PREFERRED_DEBUGGING_TYPE;
1792
1793           if (extended == 2)
1794             {
1795 #ifdef DWARF2_DEBUGGING_INFO
1796               write_symbols = DWARF2_DEBUG;
1797 #elif defined DBX_DEBUGGING_INFO
1798               write_symbols = DBX_DEBUG;
1799 #endif
1800             }
1801
1802           if (write_symbols == NO_DEBUG)
1803             warning (0, "target system does not support debug output");
1804         }
1805     }
1806   else
1807     {
1808       /* Does it conflict with an already selected type?  */
1809       if (type_explicit && write_symbols != NO_DEBUG && type != write_symbols)
1810         error ("debug format \"%s\" conflicts with prior selection",
1811                debug_type_names[type]);
1812       write_symbols = type;
1813       type_explicit = true;
1814     }
1815
1816   /* A debug flag without a level defaults to level 2.  */
1817   if (*arg == '\0')
1818     {
1819       if (!debug_info_level)
1820         debug_info_level = 2;
1821     }
1822   else
1823     {
1824       debug_info_level = integral_argument (arg);
1825       if (debug_info_level == (unsigned int) -1)
1826         error ("unrecognised debug output level \"%s\"", arg);
1827       else if (debug_info_level > 3)
1828         error ("debug output level %s is too high", arg);
1829     }
1830 }
1831
1832 /* Return 1 if OPTION is enabled, 0 if it is disabled, or -1 if it isn't
1833    a simple on-off switch.  */
1834
1835 int
1836 option_enabled (int opt_idx)
1837 {
1838   const struct cl_option *option = &(cl_options[opt_idx]);
1839
1840   if (option->flag_var)
1841     switch (option->var_type)
1842       {
1843       case CLVC_BOOLEAN:
1844         return *(int *) option->flag_var != 0;
1845
1846       case CLVC_EQUAL:
1847         return *(int *) option->flag_var == option->var_value;
1848
1849       case CLVC_BIT_CLEAR:
1850         return (*(int *) option->flag_var & option->var_value) == 0;
1851
1852       case CLVC_BIT_SET:
1853         return (*(int *) option->flag_var & option->var_value) != 0;
1854
1855       case CLVC_STRING:
1856         break;
1857       }
1858   return -1;
1859 }
1860
1861 /* Fill STATE with the current state of option OPTION.  Return true if
1862    there is some state to store.  */
1863
1864 bool
1865 get_option_state (int option, struct cl_option_state *state)
1866 {
1867   if (cl_options[option].flag_var == 0)
1868     return false;
1869
1870   switch (cl_options[option].var_type)
1871     {
1872     case CLVC_BOOLEAN:
1873     case CLVC_EQUAL:
1874       state->data = cl_options[option].flag_var;
1875       state->size = sizeof (int);
1876       break;
1877
1878     case CLVC_BIT_CLEAR:
1879     case CLVC_BIT_SET:
1880       state->ch = option_enabled (option);
1881       state->data = &state->ch;
1882       state->size = 1;
1883       break;
1884
1885     case CLVC_STRING:
1886       state->data = *(const char **) cl_options[option].flag_var;
1887       if (state->data == 0)
1888         state->data = "";
1889       state->size = strlen (state->data) + 1;
1890       break;
1891     }
1892   return true;
1893 }
1894
1895 /* Enable a warning option as an error.  This is used by -Werror= and
1896    also by legacy Werror-implicit-function-declaration.  */
1897
1898 void
1899 enable_warning_as_error (const char *arg, int value, unsigned int lang_mask)
1900 {
1901   char *new_option;
1902   int option_index;
1903
1904   new_option = XNEWVEC (char, strlen (arg) + 2);
1905   new_option[0] = 'W';
1906   strcpy (new_option + 1, arg);
1907   option_index = find_opt (new_option, lang_mask);
1908   if (option_index == N_OPTS)
1909     {
1910       error ("-Werror=%s: No option -%s", arg, new_option);
1911     }
1912   else
1913     {
1914       int kind = value ? DK_ERROR : DK_WARNING;
1915       diagnostic_classify_diagnostic (global_dc, option_index, kind);
1916       
1917       /* -Werror=foo implies -Wfoo.  */
1918       if (cl_options[option_index].var_type == CLVC_BOOLEAN
1919           && cl_options[option_index].flag_var
1920           && kind == DK_ERROR)
1921         *(int *) cl_options[option_index].flag_var = 1;
1922     }
1923   free (new_option);
1924 }