OSDN Git Service

PR target/34982
[pf3gnuchains/gcc-fork.git] / gcc / opts.c
1 /* Command line option handling.
2    Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007
3    Free Software Foundation, Inc.
4    Contributed by Neil Booth.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "intl.h"
25 #include "coretypes.h"
26 #include "tm.h"
27 #include "tree.h"
28 #include "rtl.h"
29 #include "ggc.h"
30 #include "output.h"
31 #include "langhooks.h"
32 #include "opts.h"
33 #include "options.h"
34 #include "flags.h"
35 #include "toplev.h"
36 #include "params.h"
37 #include "diagnostic.h"
38 #include "tm_p.h"               /* For OPTIMIZATION_OPTIONS.  */
39 #include "insn-attr.h"          /* For INSN_SCHEDULING.  */
40 #include "target.h"
41 #include "tree-pass.h"
42 #include "dbgcnt.h"
43 #include "debug.h"
44
45 /* Value of the -G xx switch, and whether it was passed or not.  */
46 unsigned HOST_WIDE_INT g_switch_value;
47 bool g_switch_set;
48
49 /* True if we should exit after parsing options.  */
50 bool exit_after_options;
51
52 /* Print various extra warnings.  -W/-Wextra.  */
53 bool extra_warnings;
54
55 /* True to warn about any objects definitions whose size is larger
56    than N bytes.  Also want about function definitions whose returned
57    values are larger than N bytes, where N is `larger_than_size'.  */
58 bool warn_larger_than;
59 HOST_WIDE_INT larger_than_size;
60
61 /* Hack for cooperation between set_Wunused and set_Wextra.  */
62 static bool maybe_warn_unused_parameter;
63
64 /* Type(s) of debugging information we are producing (if any).  See
65    flags.h for the definitions of the different possible types of
66    debugging information.  */
67 enum debug_info_type write_symbols = NO_DEBUG;
68
69 /* Level of debugging information we are producing.  See flags.h for
70    the definitions of the different possible levels.  */
71 enum debug_info_level debug_info_level = DINFO_LEVEL_NONE;
72
73 /* A major contribution to object and executable size is debug
74    information size.  A major contribution to debug information size
75    is struct descriptions replicated in several object files. The
76    following flags attempt to reduce this information.  The basic
77    idea is to not emit struct debugging information in the current
78    compilation unit when that information will be generated by
79    another compilation unit.
80
81    Debug information for a struct defined in the current source
82    file should be generated in the object file.  Likewise the
83    debug information for a struct defined in a header should be
84    generated in the object file of the corresponding source file.
85    Both of these case are handled when the base name of the file of
86    the struct definition matches the base name of the source file
87    of the current compilation unit.  This matching emits minimal
88    struct debugging information.
89
90    The base file name matching rule above will fail to emit debug
91    information for structs defined in system headers.  So a second
92    category of files includes system headers in addition to files
93    with matching bases.
94
95    The remaining types of files are library headers and application
96    headers.  We cannot currently distinguish these two types.  */
97
98 enum debug_struct_file
99 {
100   DINFO_STRUCT_FILE_NONE,   /* Debug no structs. */
101   DINFO_STRUCT_FILE_BASE,   /* Debug structs defined in files with the
102                                same base name as the compilation unit. */
103   DINFO_STRUCT_FILE_SYS,    /* Also debug structs defined in system
104                                header files.  */
105   DINFO_STRUCT_FILE_ANY     /* Debug structs defined in all files. */
106 };
107
108 /* Generic structs (e.g. templates not explicitly specialized)
109    may not have a compilation unit associated with them, and so
110    may need to be treated differently from ordinary structs.
111
112    Structs only handled by reference (indirectly), will also usually
113    not need as much debugging information.  */
114
115 static enum debug_struct_file debug_struct_ordinary[DINFO_USAGE_NUM_ENUMS]
116   = { DINFO_STRUCT_FILE_ANY, DINFO_STRUCT_FILE_ANY, DINFO_STRUCT_FILE_ANY };
117 static enum debug_struct_file debug_struct_generic[DINFO_USAGE_NUM_ENUMS]
118   = { DINFO_STRUCT_FILE_ANY, DINFO_STRUCT_FILE_ANY, DINFO_STRUCT_FILE_ANY };
119
120 /* Parse the -femit-struct-debug-detailed option value
121    and set the flag variables. */
122
123 #define MATCH( prefix, string ) \
124   ((strncmp (prefix, string, sizeof prefix - 1) == 0) \
125    ? ((string += sizeof prefix - 1), 1) : 0)
126
127 void
128 set_struct_debug_option (const char *spec)
129 {
130   /* various labels for comparison */
131   static char dfn_lbl[] = "dfn:", dir_lbl[] = "dir:", ind_lbl[] = "ind:";
132   static char ord_lbl[] = "ord:", gen_lbl[] = "gen:";
133   static char none_lbl[] = "none", any_lbl[] = "any";
134   static char base_lbl[] = "base", sys_lbl[] = "sys";
135
136   enum debug_struct_file files = DINFO_STRUCT_FILE_ANY;
137   /* Default is to apply to as much as possible. */
138   enum debug_info_usage usage = DINFO_USAGE_NUM_ENUMS;
139   int ord = 1, gen = 1;
140
141   /* What usage? */
142   if (MATCH (dfn_lbl, spec))
143     usage = DINFO_USAGE_DFN;
144   else if (MATCH (dir_lbl, spec))
145     usage = DINFO_USAGE_DIR_USE;
146   else if (MATCH (ind_lbl, spec))
147     usage = DINFO_USAGE_IND_USE;
148
149   /* Generics or not? */
150   if (MATCH (ord_lbl, spec))
151     gen = 0;
152   else if (MATCH (gen_lbl, spec))
153     ord = 0;
154
155   /* What allowable environment? */
156   if (MATCH (none_lbl, spec))
157     files = DINFO_STRUCT_FILE_NONE;
158   else if (MATCH (any_lbl, spec))
159     files = DINFO_STRUCT_FILE_ANY;
160   else if (MATCH (sys_lbl, spec))
161     files = DINFO_STRUCT_FILE_SYS;
162   else if (MATCH (base_lbl, spec))
163     files = DINFO_STRUCT_FILE_BASE;
164   else
165     error ("argument %qs to %<-femit-struct-debug-detailed%> not recognized",
166            spec);
167
168   /* Effect the specification. */
169   if (usage == DINFO_USAGE_NUM_ENUMS)
170     {
171       if (ord)
172         {
173           debug_struct_ordinary[DINFO_USAGE_DFN] = files;
174           debug_struct_ordinary[DINFO_USAGE_DIR_USE] = files;
175           debug_struct_ordinary[DINFO_USAGE_IND_USE] = files;
176         }
177       if (gen)
178         {
179           debug_struct_generic[DINFO_USAGE_DFN] = files;
180           debug_struct_generic[DINFO_USAGE_DIR_USE] = files;
181           debug_struct_generic[DINFO_USAGE_IND_USE] = files;
182         }
183     }
184   else
185     {
186       if (ord)
187         debug_struct_ordinary[usage] = files;
188       if (gen)
189         debug_struct_generic[usage] = files;
190     }
191
192   if (*spec == ',')
193     set_struct_debug_option (spec+1);
194   else
195     {
196       /* No more -femit-struct-debug-detailed specifications.
197          Do final checks. */
198       if (*spec != '\0')
199         error ("argument %qs to %<-femit-struct-debug-detailed%> unknown",
200                spec);
201       if (debug_struct_ordinary[DINFO_USAGE_DIR_USE]
202                 < debug_struct_ordinary[DINFO_USAGE_IND_USE]
203           || debug_struct_generic[DINFO_USAGE_DIR_USE]
204                 < debug_struct_generic[DINFO_USAGE_IND_USE])
205         error ("%<-femit-struct-debug-detailed=dir:...%> must allow at least"
206                " as much as %<-femit-struct-debug-detailed=ind:...%>");
207     }
208 }
209
210 /* Find the base name of a path, stripping off both directories and
211    a single final extension. */
212 static int
213 base_of_path (const char *path, const char **base_out)
214 {
215   const char *base = path;
216   const char *dot = 0;
217   const char *p = path;
218   char c = *p;
219   while (c)
220     {
221       if (IS_DIR_SEPARATOR(c))
222         {
223           base = p + 1;
224           dot = 0;
225         }
226       else if (c == '.')
227         dot = p;
228       c = *++p;
229     }
230   if (!dot)
231     dot = p;
232   *base_out = base;
233   return dot - base;
234 }
235
236 /* Match the base name of a file to the base name of a compilation unit. */
237
238 static const char *main_input_basename;
239 static int main_input_baselength;
240
241 static int
242 matches_main_base (const char *path)
243 {
244   /* Cache the last query. */
245   static const char *last_path = NULL;
246   static int last_match = 0;
247   if (path != last_path)
248     {
249       const char *base;
250       int length = base_of_path (path, &base);
251       last_path = path;
252       last_match = (length == main_input_baselength
253                     && memcmp (base, main_input_basename, length) == 0);
254     }
255   return last_match;
256 }
257
258 #ifdef DEBUG_DEBUG_STRUCT
259
260 static int
261 dump_struct_debug (tree type, enum debug_info_usage usage,
262                    enum debug_struct_file criterion, int generic,
263                    int matches, int result)
264 {
265   /* Find the type name. */
266   tree type_decl = TYPE_STUB_DECL (type);
267   tree t = type_decl;
268   const char *name = 0;
269   if (TREE_CODE (t) == TYPE_DECL)
270     t = DECL_NAME (t);
271   if (t)
272     name = IDENTIFIER_POINTER (t);
273
274   fprintf (stderr, "    struct %d %s %s %s %s %d %p %s\n",
275            criterion,
276            DECL_IN_SYSTEM_HEADER (type_decl) ? "sys" : "usr",
277            matches ? "bas" : "hdr",
278            generic ? "gen" : "ord",
279            usage == DINFO_USAGE_DFN ? ";" :
280              usage == DINFO_USAGE_DIR_USE ? "." : "*",
281            result,
282            (void*) type_decl, name);
283   return result;
284 }
285 #define DUMP_GSTRUCT(type, usage, criterion, generic, matches, result) \
286   dump_struct_debug (type, usage, criterion, generic, matches, result)
287
288 #else
289
290 #define DUMP_GSTRUCT(type, usage, criterion, generic, matches, result) \
291   (result)
292
293 #endif
294
295
296 bool
297 should_emit_struct_debug (tree type, enum debug_info_usage usage)
298 {
299   enum debug_struct_file criterion;
300   tree type_decl;
301   bool generic = lang_hooks.types.generic_p (type);
302
303   if (generic)
304     criterion = debug_struct_generic[usage];
305   else
306     criterion = debug_struct_ordinary[usage];
307
308   if (criterion == DINFO_STRUCT_FILE_NONE)
309     return DUMP_GSTRUCT (type, usage, criterion, generic, false, false);
310   if (criterion == DINFO_STRUCT_FILE_ANY)
311     return DUMP_GSTRUCT (type, usage, criterion, generic, false, true);
312
313   type_decl = TYPE_STUB_DECL (type);
314
315   if (criterion == DINFO_STRUCT_FILE_SYS && DECL_IN_SYSTEM_HEADER (type_decl))
316     return DUMP_GSTRUCT (type, usage, criterion, generic, false, true);
317
318   if (matches_main_base (DECL_SOURCE_FILE (type_decl)))
319     return DUMP_GSTRUCT (type, usage, criterion, generic, true, true);
320   return DUMP_GSTRUCT (type, usage, criterion, generic, false, false);
321 }
322
323 /* Nonzero means use GNU-only extensions in the generated symbolic
324    debugging information.  Currently, this only has an effect when
325    write_symbols is set to DBX_DEBUG, XCOFF_DEBUG, or DWARF_DEBUG.  */
326 bool use_gnu_debug_info_extensions;
327
328 /* The default visibility for all symbols (unless overridden) */
329 enum symbol_visibility default_visibility = VISIBILITY_DEFAULT;
330
331 /* Disable unit-at-a-time for frontends that might be still broken in this
332    respect.  */
333
334 bool no_unit_at_a_time_default;
335
336 /* Global visibility options.  */
337 struct visibility_flags visibility_options;
338
339 /* What to print when a switch has no documentation.  */
340 static const char undocumented_msg[] = N_("This switch lacks documentation");
341
342 /* Used for bookkeeping on whether user set these flags so
343    -fprofile-use/-fprofile-generate does not use them.  */
344 static bool profile_arc_flag_set, flag_profile_values_set;
345 static bool flag_unroll_loops_set, flag_tracer_set;
346 static bool flag_value_profile_transformations_set;
347 static bool flag_peel_loops_set, flag_branch_probabilities_set;
348 static bool flag_inline_functions_set;
349
350 /* Functions excluded from profiling.  */
351
352 typedef char *char_p; /* For DEF_VEC_P.  */
353 DEF_VEC_P(char_p);
354 DEF_VEC_ALLOC_P(char_p,heap);
355
356 static VEC(char_p,heap) *flag_instrument_functions_exclude_functions;
357 static VEC(char_p,heap) *flag_instrument_functions_exclude_files;
358
359 /* Input file names.  */
360 const char **in_fnames;
361 unsigned num_in_fnames;
362
363 static int common_handle_option (size_t scode, const char *arg, int value,
364                                  unsigned int lang_mask);
365 static void handle_param (const char *);
366 static void set_Wextra (int);
367 static unsigned int handle_option (const char **argv, unsigned int lang_mask);
368 static char *write_langs (unsigned int lang_mask);
369 static void complain_wrong_lang (const char *, const struct cl_option *,
370                                  unsigned int lang_mask);
371 static void handle_options (unsigned int, const char **, unsigned int);
372 static void set_debug_level (enum debug_info_type type, int extended,
373                              const char *arg);
374
375 /* If ARG is a non-negative integer made up solely of digits, return its
376    value, otherwise return -1.  */
377 static int
378 integral_argument (const char *arg)
379 {
380   const char *p = arg;
381
382   while (*p && ISDIGIT (*p))
383     p++;
384
385   if (*p == '\0')
386     return atoi (arg);
387
388   return -1;
389 }
390
391 /* Return a malloced slash-separated list of languages in MASK.  */
392 static char *
393 write_langs (unsigned int mask)
394 {
395   unsigned int n = 0, len = 0;
396   const char *lang_name;
397   char *result;
398
399   for (n = 0; (lang_name = lang_names[n]) != 0; n++)
400     if (mask & (1U << n))
401       len += strlen (lang_name) + 1;
402
403   result = XNEWVEC (char, len);
404   len = 0;
405   for (n = 0; (lang_name = lang_names[n]) != 0; n++)
406     if (mask & (1U << n))
407       {
408         if (len)
409           result[len++] = '/';
410         strcpy (result + len, lang_name);
411         len += strlen (lang_name);
412       }
413
414   result[len] = 0;
415
416   return result;
417 }
418
419 /* Complain that switch OPT_INDEX does not apply to this front end.  */
420 static void
421 complain_wrong_lang (const char *text, const struct cl_option *option,
422                      unsigned int lang_mask)
423 {
424   char *ok_langs, *bad_lang;
425
426   ok_langs = write_langs (option->flags);
427   bad_lang = write_langs (lang_mask);
428
429   /* Eventually this should become a hard error IMO.  */
430   warning (0, "command line option \"%s\" is valid for %s but not for %s",
431            text, ok_langs, bad_lang);
432
433   free (ok_langs);
434   free (bad_lang);
435 }
436
437 /* Handle the switch beginning at ARGV for the language indicated by
438    LANG_MASK.  Returns the number of switches consumed.  */
439 static unsigned int
440 handle_option (const char **argv, unsigned int lang_mask)
441 {
442   size_t opt_index;
443   const char *opt, *arg = 0;
444   char *dup = 0;
445   int value = 1;
446   unsigned int result = 0;
447   const struct cl_option *option;
448
449   opt = argv[0];
450
451   opt_index = find_opt (opt + 1, lang_mask | CL_COMMON | CL_TARGET);
452   if (opt_index == cl_options_count
453       && (opt[1] == 'W' || opt[1] == 'f' || opt[1] == 'm')
454       && opt[2] == 'n' && opt[3] == 'o' && opt[4] == '-')
455     {
456       /* Drop the "no-" from negative switches.  */
457       size_t len = strlen (opt) - 3;
458
459       dup = XNEWVEC (char, len + 1);
460       dup[0] = '-';
461       dup[1] = opt[1];
462       memcpy (dup + 2, opt + 5, len - 2 + 1);
463       opt = dup;
464       value = 0;
465       opt_index = find_opt (opt + 1, lang_mask | CL_COMMON | CL_TARGET);
466     }
467
468   if (opt_index == cl_options_count)
469     goto done;
470
471   option = &cl_options[opt_index];
472
473   /* Reject negative form of switches that don't take negatives as
474      unrecognized.  */
475   if (!value && (option->flags & CL_REJECT_NEGATIVE))
476     goto done;
477
478   /* We've recognized this switch.  */
479   result = 1;
480
481   /* Check to see if the option is disabled for this configuration.  */
482   if (option->flags & CL_DISABLED)
483     {
484       error ("command line option %qs"
485              " is not supported by this configuration", opt);
486       goto done;
487     }
488
489   /* Sort out any argument the switch takes.  */
490   if (option->flags & CL_JOINED)
491     {
492       /* Have arg point to the original switch.  This is because
493          some code, such as disable_builtin_function, expects its
494          argument to be persistent until the program exits.  */
495       arg = argv[0] + cl_options[opt_index].opt_len + 1;
496       if (!value)
497         arg += strlen ("no-");
498
499       if (*arg == '\0' && !(option->flags & CL_MISSING_OK))
500         {
501           if (option->flags & CL_SEPARATE)
502             {
503               arg = argv[1];
504               result = 2;
505             }
506           else
507             /* Missing argument.  */
508             arg = NULL;
509         }
510     }
511   else if (option->flags & CL_SEPARATE)
512     {
513       arg = argv[1];
514       result = 2;
515     }
516
517   /* Now we've swallowed any potential argument, complain if this
518      is a switch for a different front end.  */
519   if (!(option->flags & (lang_mask | CL_COMMON | CL_TARGET)))
520     {
521       complain_wrong_lang (argv[0], option, lang_mask);
522       goto done;
523     }
524   else if ((option->flags & CL_TARGET)
525            && (option->flags & CL_LANG_ALL)
526            && !(option->flags & lang_mask))
527     {
528       /* Complain for target flag language mismatches if any languages
529          are specified.  */
530       complain_wrong_lang (argv[0], option, lang_mask);
531       goto done;
532     }
533
534   if (arg == NULL && (option->flags & (CL_JOINED | CL_SEPARATE)))
535     {
536       if (!lang_hooks.missing_argument (opt, opt_index))
537         error ("missing argument to \"%s\"", opt);
538       goto done;
539     }
540
541   /* If the switch takes an integer, convert it.  */
542   if (arg && (option->flags & CL_UINTEGER))
543     {
544       value = integral_argument (arg);
545       if (value == -1)
546         {
547           error ("argument to \"%s\" should be a non-negative integer",
548                  option->opt_text);
549           goto done;
550         }
551     }
552
553   if (option->flag_var)
554     switch (option->var_type)
555       {
556       case CLVC_BOOLEAN:
557         *(int *) option->flag_var = value;
558         break;
559
560       case CLVC_EQUAL:
561         *(int *) option->flag_var = (value
562                                      ? option->var_value
563                                      : !option->var_value);
564         break;
565
566       case CLVC_BIT_CLEAR:
567       case CLVC_BIT_SET:
568         if ((value != 0) == (option->var_type == CLVC_BIT_SET))
569           *(int *) option->flag_var |= option->var_value;
570         else
571           *(int *) option->flag_var &= ~option->var_value;
572         if (option->flag_var == &target_flags)
573           target_flags_explicit |= option->var_value;
574         break;
575
576       case CLVC_STRING:
577         *(const char **) option->flag_var = arg;
578         break;
579       }
580
581   if (option->flags & lang_mask)
582     if (lang_hooks.handle_option (opt_index, arg, value) == 0)
583       result = 0;
584
585   if (result && (option->flags & CL_COMMON))
586     if (common_handle_option (opt_index, arg, value, lang_mask) == 0)
587       result = 0;
588
589   if (result && (option->flags & CL_TARGET))
590     if (!targetm.handle_option (opt_index, arg, value))
591       result = 0;
592
593  done:
594   if (dup)
595     free (dup);
596   return result;
597 }
598
599 /* Handle FILENAME from the command line.  */
600 static void
601 add_input_filename (const char *filename)
602 {
603   num_in_fnames++;
604   in_fnames = xrealloc (in_fnames, num_in_fnames * sizeof (in_fnames[0]));
605   in_fnames[num_in_fnames - 1] = filename;
606 }
607
608 /* Add functions or file names to a vector of names to exclude from
609    instrumentation.  */
610
611 static void
612 add_instrument_functions_exclude_list (VEC(char_p,heap) **pvec,
613                                        const char* arg)
614 {
615   char *tmp;
616   char *r;
617   char *w;
618   char *token_start;
619
620   /* We never free this string.  */
621   tmp = xstrdup (arg);
622
623   r = tmp;
624   w = tmp;
625   token_start = tmp;
626
627   while (*r != '\0')
628     {
629       if (*r == ',')
630         {
631           *w++ = '\0';
632           ++r;
633           VEC_safe_push (char_p, heap, *pvec, token_start);
634           token_start = w;
635         }
636       if (*r == '\\' && r[1] == ',')
637         {
638           *w++ = ',';
639           r += 2;
640         }
641       else
642         *w++ = *r++;
643     }
644   if (*token_start != '\0')
645     VEC_safe_push (char_p, heap, *pvec, token_start);
646 }
647
648 /* Return whether we should exclude FNDECL from instrumentation.  */
649
650 bool
651 flag_instrument_functions_exclude_p (tree fndecl)
652 {
653   if (VEC_length (char_p, flag_instrument_functions_exclude_functions) > 0)
654     {
655       const char *name;
656       int i;
657       char *s;
658
659       name = lang_hooks.decl_printable_name (fndecl, 0);
660       for (i = 0;
661            VEC_iterate (char_p, flag_instrument_functions_exclude_functions,
662                         i, s);
663            ++i)
664         {
665           if (strstr (name, s) != NULL)
666             return true;
667         }
668     }
669
670   if (VEC_length (char_p, flag_instrument_functions_exclude_files) > 0)
671     {
672       const char *name;
673       int i;
674       char *s;
675
676       name = DECL_SOURCE_FILE (fndecl);
677       for (i = 0;
678            VEC_iterate (char_p, flag_instrument_functions_exclude_files, i, s);
679            ++i)
680         {
681           if (strstr (name, s) != NULL)
682             return true;
683         }
684     }
685
686   return false;
687 }
688
689 /* Decode and handle the vector of command line options.  LANG_MASK
690    contains has a single bit set representing the current
691    language.  */
692 static void
693 handle_options (unsigned int argc, const char **argv, unsigned int lang_mask)
694 {
695   unsigned int n, i;
696
697   for (i = 1; i < argc; i += n)
698     {
699       const char *opt = argv[i];
700
701       /* Interpret "-" or a non-switch as a file name.  */
702       if (opt[0] != '-' || opt[1] == '\0')
703         {
704           if (main_input_filename == NULL)
705             {
706             main_input_filename = opt;
707               main_input_baselength
708                 = base_of_path (main_input_filename, &main_input_basename);
709             }
710           add_input_filename (opt);
711           n = 1;
712           continue;
713         }
714
715       n = handle_option (argv + i, lang_mask);
716
717       if (!n)
718         {
719           n = 1;
720           error ("unrecognized command line option \"%s\"", opt);
721         }
722     }
723 }
724
725 /* Parse command line options and set default flag values.  Do minimal
726    options processing.  */
727 void
728 decode_options (unsigned int argc, const char **argv)
729 {
730   unsigned int i, lang_mask;
731
732   /* Perform language-specific options initialization.  */
733   lang_mask = lang_hooks.init_options (argc, argv);
734
735   lang_hooks.initialize_diagnostics (global_dc);
736
737   /* Scan to see what optimization level has been specified.  That will
738      determine the default value of many flags.  */
739   for (i = 1; i < argc; i++)
740     {
741       if (!strcmp (argv[i], "-O"))
742         {
743           optimize = 1;
744           optimize_size = 0;
745         }
746       else if (argv[i][0] == '-' && argv[i][1] == 'O')
747         {
748           /* Handle -Os, -O2, -O3, -O69, ...  */
749           const char *p = &argv[i][2];
750
751           if ((p[0] == 's') && (p[1] == 0))
752             {
753               optimize_size = 1;
754
755               /* Optimizing for size forces optimize to be 2.  */
756               optimize = 2;
757             }
758           else
759             {
760               const int optimize_val = read_integral_parameter (p, p - 2, -1);
761               if (optimize_val != -1)
762                 {
763                   optimize = optimize_val;
764                   optimize_size = 0;
765                 }
766             }
767         }
768     }
769
770   if (!optimize)
771     {
772       flag_merge_constants = 0;
773     }
774
775   if (optimize >= 1)
776     {
777       flag_defer_pop = 1;
778 #ifdef DELAY_SLOTS
779       flag_delayed_branch = 1;
780 #endif
781 #ifdef CAN_DEBUG_WITHOUT_FP
782       flag_omit_frame_pointer = 1;
783 #endif
784       flag_guess_branch_prob = 1;
785       flag_cprop_registers = 1;
786       flag_if_conversion = 1;
787       flag_if_conversion2 = 1;
788       flag_ipa_pure_const = 1;
789       flag_ipa_reference = 1;
790       flag_split_wide_types = 1;
791       flag_tree_ccp = 1;
792       flag_tree_dce = 1;
793       flag_tree_dom = 1;
794       flag_tree_dse = 1;
795       flag_tree_ter = 1;
796       flag_tree_sra = 1;
797       flag_tree_copyrename = 1;
798       flag_tree_fre = 1;
799       flag_tree_copy_prop = 1;
800       flag_tree_sink = 1;
801       flag_tree_salias = 1;
802       if (!no_unit_at_a_time_default)
803         flag_unit_at_a_time = 1;
804
805       if (!optimize_size)
806         {
807           /* Loop header copying usually increases size of the code.  This used
808              not to be true, since quite often it is possible to verify that
809              the condition is satisfied in the first iteration and therefore
810              to eliminate it.  Jump threading handles these cases now.  */
811           flag_tree_ch = 1;
812         }
813     }
814
815   if (optimize >= 2)
816     {
817       flag_inline_small_functions = 1;
818       flag_thread_jumps = 1;
819       flag_crossjumping = 1;
820       flag_optimize_sibling_calls = 1;
821       flag_forward_propagate = 1;
822       flag_cse_follow_jumps = 1;
823       flag_gcse = 1;
824       flag_expensive_optimizations = 1;
825       flag_rerun_cse_after_loop = 1;
826       flag_caller_saves = 1;
827       flag_peephole2 = 1;
828 #ifdef INSN_SCHEDULING
829       flag_schedule_insns = 1;
830       flag_schedule_insns_after_reload = 1;
831 #endif
832       flag_regmove = 1;
833       flag_strict_aliasing = 1;
834       flag_strict_overflow = 1;
835       flag_delete_null_pointer_checks = 1;
836       flag_reorder_blocks = 1;
837       flag_reorder_functions = 1;
838       flag_tree_store_ccp = 1;
839       flag_tree_vrp = 1;
840
841       if (!optimize_size)
842         {
843           /* PRE tends to generate bigger code.  */
844           flag_tree_pre = 1;
845         }
846
847       /* Allow more virtual operators to increase alias precision.  */
848       set_param_value ("max-aliased-vops", 500);
849     }
850
851   if (optimize >= 3)
852     {
853       flag_predictive_commoning = 1;
854       flag_inline_functions = 1;
855       flag_unswitch_loops = 1;
856       flag_gcse_after_reload = 1;
857       flag_tree_vectorize = 1;
858
859       /* Allow even more virtual operators.  */
860       set_param_value ("max-aliased-vops", 1000);
861       set_param_value ("avg-aliased-vops", 3);
862     }
863
864   if (optimize < 2 || optimize_size)
865     {
866       align_loops = 1;
867       align_jumps = 1;
868       align_labels = 1;
869       align_functions = 1;
870
871       /* Don't reorder blocks when optimizing for size because extra
872          jump insns may be created; also barrier may create extra padding.
873
874          More correctly we should have a block reordering mode that tried
875          to minimize the combined size of all the jumps.  This would more
876          or less automatically remove extra jumps, but would also try to
877          use more short jumps instead of long jumps.  */
878       flag_reorder_blocks = 0;
879       flag_reorder_blocks_and_partition = 0;
880     }
881
882   if (optimize_size)
883     {
884       /* Inlining of functions reducing size is a good idea regardless
885          of them being declared inline.  */
886       flag_inline_functions = 1;
887
888       /* We want to crossjump as much as possible.  */
889       set_param_value ("min-crossjump-insns", 1);
890     }
891
892   /* Initialize whether `char' is signed.  */
893   flag_signed_char = DEFAULT_SIGNED_CHAR;
894   /* Set this to a special "uninitialized" value.  The actual default is set
895      after target options have been processed.  */
896   flag_short_enums = 2;
897
898   /* Initialize target_flags before OPTIMIZATION_OPTIONS so the latter can
899      modify it.  */
900   target_flags = targetm.default_target_flags;
901
902   /* Some tagets have ABI-specified unwind tables.  */
903   flag_unwind_tables = targetm.unwind_tables_default;
904
905 #ifdef OPTIMIZATION_OPTIONS
906   /* Allow default optimizations to be specified on a per-machine basis.  */
907   OPTIMIZATION_OPTIONS (optimize, optimize_size);
908 #endif
909
910   handle_options (argc, argv, lang_mask);
911
912   if (flag_pie)
913     flag_pic = flag_pie;
914   if (flag_pic && !flag_pie)
915     flag_shlib = 1;
916
917   if (flag_no_inline == 2)
918     flag_no_inline = 0;
919   else
920     flag_really_no_inline = flag_no_inline;
921
922   /* Set flag_no_inline before the post_options () hook.  The C front
923      ends use it to determine tree inlining defaults.  FIXME: such
924      code should be lang-independent when all front ends use tree
925      inlining, in which case it, and this condition, should be moved
926      to the top of process_options() instead.  */
927   if (optimize == 0)
928     {
929       /* Inlining does not work if not optimizing,
930          so force it not to be done.  */
931       flag_no_inline = 1;
932       warn_inline = 0;
933
934       /* The c_decode_option function and decode_option hook set
935          this to `2' if -Wall is used, so we can avoid giving out
936          lots of errors for people who don't realize what -Wall does.  */
937       if (warn_uninitialized == 1)
938         warning (OPT_Wuninitialized,
939                  "-Wuninitialized is not supported without -O");
940     }
941
942   if (flag_really_no_inline == 2)
943     flag_really_no_inline = flag_no_inline;
944
945   /* Inlining of functions called just once will only work if we can look
946      at the complete translation unit.  */
947   if (flag_inline_functions_called_once && !flag_unit_at_a_time)
948     {
949       flag_inline_functions_called_once = 0;
950       warning (OPT_Wdisabled_optimization,
951                "-funit-at-a-time is required for inlining of functions "
952                "that are only called once");
953     }
954
955   /* The optimization to partition hot and cold basic blocks into separate
956      sections of the .o and executable files does not work (currently)
957      with exception handling.  This is because there is no support for
958      generating unwind info.  If flag_exceptions is turned on we need to
959      turn off the partitioning optimization.  */
960
961   if (flag_exceptions && flag_reorder_blocks_and_partition)
962     {
963       inform
964             ("-freorder-blocks-and-partition does not work with exceptions");
965       flag_reorder_blocks_and_partition = 0;
966       flag_reorder_blocks = 1;
967     }
968
969   /* If user requested unwind info, then turn off the partitioning
970      optimization.  */
971
972   if (flag_unwind_tables && ! targetm.unwind_tables_default
973       && flag_reorder_blocks_and_partition)
974     {
975       inform ("-freorder-blocks-and-partition does not support unwind info");
976       flag_reorder_blocks_and_partition = 0;
977       flag_reorder_blocks = 1;
978     }
979
980   /* If the target requested unwind info, then turn off the partitioning
981      optimization with a different message.  Likewise, if the target does not
982      support named sections.  */
983
984   if (flag_reorder_blocks_and_partition
985       && (!targetm.have_named_sections
986           || (flag_unwind_tables && targetm.unwind_tables_default)))
987     {
988       inform
989        ("-freorder-blocks-and-partition does not work on this architecture");
990       flag_reorder_blocks_and_partition = 0;
991       flag_reorder_blocks = 1;
992     }
993 }
994
995 #define LEFT_COLUMN     27
996
997 /* Output ITEM, of length ITEM_WIDTH, in the left column,
998    followed by word-wrapped HELP in a second column.  */
999 static void
1000 wrap_help (const char *help,
1001            const char *item,
1002            unsigned int item_width,
1003            unsigned int columns)
1004 {
1005   unsigned int col_width = LEFT_COLUMN;
1006   unsigned int remaining, room, len;
1007
1008   remaining = strlen (help);
1009
1010   do
1011     {
1012       room = columns - 3 - MAX (col_width, item_width);
1013       if (room > columns)
1014         room = 0;
1015       len = remaining;
1016
1017       if (room < len)
1018         {
1019           unsigned int i;
1020
1021           for (i = 0; help[i]; i++)
1022             {
1023               if (i >= room && len != remaining)
1024                 break;
1025               if (help[i] == ' ')
1026                 len = i;
1027               else if ((help[i] == '-' || help[i] == '/')
1028                        && help[i + 1] != ' '
1029                        && i > 0 && ISALPHA (help[i - 1]))
1030                 len = i + 1;
1031             }
1032         }
1033
1034       printf( "  %-*.*s %.*s\n", col_width, item_width, item, len, help);
1035       item_width = 0;
1036       while (help[len] == ' ')
1037         len++;
1038       help += len;
1039       remaining -= len;
1040     }
1041   while (remaining);
1042 }
1043
1044 /* Print help for a specific front-end, etc.  */
1045 static void
1046 print_filtered_help (unsigned int include_flags,
1047                      unsigned int exclude_flags,
1048                      unsigned int any_flags,
1049                      unsigned int columns)
1050 {
1051   unsigned int i;
1052   const char *help;
1053   static char *printed = NULL;
1054   bool found = false;
1055   bool displayed = false;
1056
1057   if (include_flags == CL_PARAMS)
1058     {
1059       for (i = 0; i < LAST_PARAM; i++)
1060         {
1061           const char *param = compiler_params[i].option;
1062
1063           help = compiler_params[i].help;
1064           if (help == NULL || *help == '\0')
1065             {
1066               if (exclude_flags & CL_UNDOCUMENTED)
1067                 continue;
1068               help = undocumented_msg;
1069             }
1070
1071           /* Get the translation.  */
1072           help = _(help);
1073
1074           wrap_help (help, param, strlen (param), columns);
1075         }
1076       putchar ('\n');
1077       return;
1078     }
1079
1080   if (!printed)
1081     printed = xcalloc (1, cl_options_count);
1082
1083   for (i = 0; i < cl_options_count; i++)
1084     {
1085       static char new_help[128];
1086       const struct cl_option *option = cl_options + i;
1087       unsigned int len;
1088       const char *opt;
1089       const char *tab;
1090
1091       if (include_flags == 0
1092           || ((option->flags & include_flags) != include_flags))
1093         {
1094           if ((option->flags & any_flags) == 0)
1095             continue;
1096         }
1097
1098       /* Skip unwanted switches.  */
1099       if ((option->flags & exclude_flags) != 0)
1100         continue;
1101
1102       found = true;
1103       /* Skip switches that have already been printed.  */
1104       if (printed[i])
1105         continue;
1106
1107       printed[i] = true;
1108
1109       help = option->help;
1110       if (help == NULL)
1111         {
1112           if (exclude_flags & CL_UNDOCUMENTED)
1113             continue;
1114           help = undocumented_msg;
1115         }
1116
1117       /* Get the translation.  */
1118       help = _(help);
1119
1120       /* Find the gap between the name of the
1121          option and its descriptive text.  */
1122       tab = strchr (help, '\t');
1123       if (tab)
1124         {
1125           len = tab - help;
1126           opt = help;
1127           help = tab + 1;
1128         }
1129       else
1130         {
1131           opt = option->opt_text;
1132           len = strlen (opt);
1133         }
1134
1135       /* With the -Q option enabled we change the descriptive text associated
1136          with an option to be an indication of its current setting.  */
1137       if (!quiet_flag)
1138         {
1139           if (len < (LEFT_COLUMN + 2))
1140             strcpy (new_help, "\t\t");
1141           else
1142             strcpy (new_help, "\t");
1143
1144           if (option->flag_var != NULL)
1145             {
1146               if (option->flags & CL_JOINED)
1147                 {
1148                   if (option->var_type == CLVC_STRING)
1149                     {
1150                       if (* (const char **) option->flag_var != NULL)
1151                         snprintf (new_help + strlen (new_help),
1152                                   sizeof (new_help) - strlen (new_help),
1153                                   * (const char **) option->flag_var);
1154                     }
1155                   else
1156                     sprintf (new_help + strlen (new_help),
1157                              "%#x", * (int *) option->flag_var);
1158                 }
1159               else
1160                 strcat (new_help, option_enabled (i)
1161                         ? _("[enabled]") : _("[disabled]"));
1162             }
1163
1164           help = new_help;
1165         }
1166
1167       wrap_help (help, opt, len, columns);
1168       displayed = true;
1169     }
1170
1171   if (! found)
1172     printf (_(" No options with the desired characteristics were found\n"));
1173   else if (! displayed)
1174     printf (_(" All options with the desired characteristics have already been displayed\n"));
1175
1176   putchar ('\n');
1177 }
1178
1179 /* Display help for a specified type of option.
1180    The options must have ALL of the INCLUDE_FLAGS set
1181    ANY of the flags in the ANY_FLAGS set
1182    and NONE of the EXCLUDE_FLAGS set.  */
1183 static void
1184 print_specific_help (unsigned int include_flags,
1185                      unsigned int exclude_flags,
1186                      unsigned int any_flags)
1187 {
1188   unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1189   const char * description = NULL;
1190   const char * descrip_extra = "";
1191   size_t i;
1192   unsigned int flag;
1193   static unsigned int columns = 0;
1194
1195   /* Sanity check: Make sure that we do not have more
1196      languages than we have bits available to enumerate them.  */
1197   gcc_assert ((1U << cl_lang_count) < CL_MIN_OPTION_CLASS);
1198
1199   /* If we have not done so already, obtain
1200      the desired maximum width of the output.  */
1201   if (columns == 0)
1202     {
1203       const char *p;
1204
1205       GET_ENVIRONMENT (p, "COLUMNS");
1206       if (p != NULL)
1207         {
1208           int value = atoi (p);
1209
1210           if (value > 0)
1211             columns = value;
1212         }
1213
1214       if (columns == 0)
1215         /* Use a reasonable default.  */
1216         columns = 80;
1217     }
1218
1219   /* Decide upon the title for the options that we are going to display.  */
1220   for (i = 0, flag = 1; flag <= CL_MAX_OPTION_CLASS; flag <<= 1, i ++)
1221     {
1222       switch (flag & include_flags)
1223         {
1224         case 0:
1225           break;
1226
1227         case CL_TARGET:
1228           description = _("The following options are target specific");
1229           break;
1230         case CL_WARNING:
1231           description = _("The following options control compiler warning messages");
1232           break;
1233         case CL_OPTIMIZATION:
1234           description = _("The following options control optimizations");
1235           break;
1236         case CL_COMMON:
1237           description = _("The following options are language-independent");
1238           break;
1239         case CL_PARAMS:
1240           description = _("The --param option recognizes the following as parameters");
1241           break;
1242         default:
1243           if (i >= cl_lang_count)
1244             break;
1245           if ((exclude_flags & ((1U << cl_lang_count) - 1)) != 0)
1246             {
1247               description = _("The following options are specific to the language ");
1248               descrip_extra = lang_names [i];
1249             }
1250           else
1251             description = _("The following options are supported by the language ");
1252             descrip_extra = lang_names [i];
1253           break;
1254         }
1255     }
1256
1257   if (description == NULL)
1258     {
1259       if (any_flags == 0)
1260         {
1261           if (include_flags == CL_UNDOCUMENTED)
1262             description = _("The following options are not documented");
1263           else
1264             {
1265               internal_error ("unrecognized include_flags 0x%x passed to print_specific_help",
1266                               include_flags);
1267               return;
1268             }
1269         }
1270       else
1271         {
1272           if (any_flags & all_langs_mask)
1273             description = _("The following options are language-related");
1274           else
1275             description = _("The following options are language-independent");
1276         }
1277     }
1278
1279   printf ("%s%s:\n", description, descrip_extra);
1280   print_filtered_help (include_flags, exclude_flags, any_flags, columns);
1281 }
1282
1283 /* Handle target- and language-independent options.  Return zero to
1284    generate an "unknown option" message.  Only options that need
1285    extra handling need to be listed here; if you simply want
1286    VALUE assigned to a variable, it happens automatically.  */
1287
1288 static int
1289 common_handle_option (size_t scode, const char *arg, int value,
1290                       unsigned int lang_mask)
1291 {
1292   enum opt_code code = (enum opt_code) scode;
1293
1294   switch (code)
1295     {
1296     case OPT__param:
1297       handle_param (arg);
1298       break;
1299
1300     case OPT_fhelp:
1301     case OPT__help:
1302       {
1303         unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1304         unsigned int undoc_mask;
1305         unsigned int i;
1306
1307         undoc_mask = extra_warnings ? 0 : CL_UNDOCUMENTED;
1308         /* First display any single language specific options.  */
1309         for (i = 0; i < cl_lang_count; i++)
1310           print_specific_help
1311             (1U << i, (all_langs_mask & (~ (1U << i))) | undoc_mask, 0);
1312         /* Next display any multi language specific options.  */
1313         print_specific_help (0, undoc_mask, all_langs_mask);
1314         /* Then display any remaining, non-language options.  */
1315         for (i = CL_MIN_OPTION_CLASS; i <= CL_MAX_OPTION_CLASS; i <<= 1)
1316           print_specific_help (i, undoc_mask, 0);
1317         exit_after_options = true;
1318         break;
1319       }
1320
1321     case OPT_ftarget_help:
1322     case OPT__target_help:
1323       print_specific_help (CL_TARGET, CL_UNDOCUMENTED, 0);
1324       exit_after_options = true;
1325
1326       /* Allow the target a chance to give the user some additional information.  */
1327       if (targetm.target_help)
1328         targetm.target_help ();
1329       break;
1330
1331     case OPT_fhelp_:
1332     case OPT__help_:
1333       {
1334         const char * a = arg;
1335         unsigned int include_flags = 0;
1336         /* Note - by default we include undocumented options when listing
1337            specific classes.  If you only want to see documented options
1338            then add ",^undocumented" to the --help= option.  e.g.:
1339
1340            --help=target,^undocumented  */
1341         unsigned int exclude_flags = 0;
1342
1343         /* Walk along the argument string, parsing each word in turn.
1344            The format is:
1345            arg = [^]{word}[,{arg}]
1346            word = {optimizers|target|warnings|undocumented|
1347                    params|common|<language>}  */
1348         while (* a != 0)
1349           {
1350             static struct
1351             {
1352               const char * string;
1353               unsigned int flag;
1354             }
1355             specifics[] =
1356             {
1357               { "optimizers", CL_OPTIMIZATION },
1358               { "target", CL_TARGET },
1359               { "warnings", CL_WARNING },
1360               { "undocumented", CL_UNDOCUMENTED },
1361               { "params", CL_PARAMS },
1362               { "joined", CL_JOINED },
1363               { "separate", CL_SEPARATE },
1364               { "common", CL_COMMON },
1365               { NULL, 0 }
1366             };
1367             unsigned int * pflags;
1368             char * comma;
1369             unsigned int len;
1370             unsigned int i;
1371
1372             if (* a == '^')
1373               {
1374                 ++ a;
1375                 pflags = & exclude_flags;
1376               }
1377             else
1378               pflags = & include_flags;
1379
1380             comma = strchr (a, ',');
1381             if (comma == NULL)
1382               len = strlen (a);
1383             else
1384               len = comma - a;
1385
1386             for (i = 0; specifics[i].string != NULL; i++)
1387               if (strncasecmp (a, specifics[i].string, len) == 0)
1388                 {
1389                   * pflags |= specifics[i].flag;
1390                   break;
1391                 }
1392
1393             if (specifics[i].string == NULL)
1394               {
1395                 /* Check to see if the string matches a language name.  */
1396                 for (i = 0; i < cl_lang_count; i++)
1397                   if (strncasecmp (a, lang_names[i], len) == 0)
1398                     {
1399                       * pflags |= 1U << i;
1400                       break;
1401                     }
1402
1403                 if (i == cl_lang_count)
1404                   fnotice (stderr,
1405                            "warning: unrecognized argument to --help= switch: %.*s\n",
1406                            len, a);
1407               }
1408
1409             if (comma == NULL)
1410               break;
1411             a = comma + 1;
1412           }
1413
1414         if (include_flags)
1415           print_specific_help (include_flags, exclude_flags, 0);
1416         exit_after_options = true;
1417         break;
1418       }
1419
1420     case OPT__version:
1421       print_version (stderr, "");
1422       exit_after_options = true;
1423       break;
1424
1425     case OPT_G:
1426       g_switch_value = value;
1427       g_switch_set = true;
1428       break;
1429
1430     case OPT_O:
1431     case OPT_Os:
1432       /* Currently handled in a prescan.  */
1433       break;
1434
1435     case OPT_W:
1436       /* For backward compatibility, -W is the same as -Wextra.  */
1437       set_Wextra (value);
1438       break;
1439
1440     case OPT_Werror_:
1441       enable_warning_as_error (arg, value, lang_mask);
1442       break;
1443
1444     case OPT_Wextra:
1445       set_Wextra (value);
1446       break;
1447
1448     case OPT_Wlarger_than_:
1449       larger_than_size = value;
1450       warn_larger_than = value != -1;
1451       break;
1452
1453     case OPT_Wstrict_aliasing:
1454       set_Wstrict_aliasing (value);
1455       break;
1456
1457     case OPT_Wstrict_aliasing_:
1458       warn_strict_aliasing = value;
1459       break;
1460
1461     case OPT_Wstrict_overflow:
1462       warn_strict_overflow = (value
1463                               ? (int) WARN_STRICT_OVERFLOW_CONDITIONAL
1464                               : 0);
1465       break;
1466
1467     case OPT_Wstrict_overflow_:
1468       warn_strict_overflow = value;
1469       break;
1470
1471     case OPT_Wunused:
1472       set_Wunused (value);
1473       break;
1474
1475     case OPT_aux_info:
1476     case OPT_aux_info_:
1477       aux_info_file_name = arg;
1478       flag_gen_aux_info = 1;
1479       break;
1480
1481     case OPT_auxbase:
1482       aux_base_name = arg;
1483       break;
1484
1485     case OPT_auxbase_strip:
1486       {
1487         char *tmp = xstrdup (arg);
1488         strip_off_ending (tmp, strlen (tmp));
1489         if (tmp[0])
1490           aux_base_name = tmp;
1491       }
1492       break;
1493
1494     case OPT_d:
1495       decode_d_option (arg);
1496       break;
1497
1498     case OPT_dumpbase:
1499       dump_base_name = arg;
1500       break;
1501
1502     case OPT_falign_functions_:
1503       align_functions = value;
1504       break;
1505
1506     case OPT_falign_jumps_:
1507       align_jumps = value;
1508       break;
1509
1510     case OPT_falign_labels_:
1511       align_labels = value;
1512       break;
1513
1514     case OPT_falign_loops_:
1515       align_loops = value;
1516       break;
1517
1518     case OPT_fbranch_probabilities:
1519       flag_branch_probabilities_set = true;
1520       break;
1521
1522     case OPT_fcall_used_:
1523       fix_register (arg, 0, 1);
1524       break;
1525
1526     case OPT_fcall_saved_:
1527       fix_register (arg, 0, 0);
1528       break;
1529
1530     case OPT_fdbg_cnt_:
1531       dbg_cnt_process_opt (arg);
1532       break;
1533
1534     case OPT_fdbg_cnt_list:
1535       dbg_cnt_list_all_counters ();
1536       break;
1537
1538     case OPT_fdebug_prefix_map_:
1539       add_debug_prefix_map (arg);
1540       break;
1541
1542     case OPT_fdiagnostics_show_location_:
1543       if (!strcmp (arg, "once"))
1544         diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
1545       else if (!strcmp (arg, "every-line"))
1546         diagnostic_prefixing_rule (global_dc)
1547           = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE;
1548       else
1549         return 0;
1550       break;
1551
1552     case OPT_fdiagnostics_show_option:
1553       global_dc->show_option_requested = true;
1554       break;
1555
1556     case OPT_fdump_:
1557       if (!dump_switch_p (arg))
1558         return 0;
1559       break;
1560
1561     case OPT_ffast_math:
1562       set_fast_math_flags (value);
1563       break;
1564
1565     case OPT_funsafe_math_optimizations:
1566       set_unsafe_math_optimizations_flags (value);
1567       break;
1568
1569     case OPT_ffixed_:
1570       fix_register (arg, 1, 1);
1571       break;
1572
1573     case OPT_finline_limit_:
1574     case OPT_finline_limit_eq:
1575       set_param_value ("max-inline-insns-single", value / 2);
1576       set_param_value ("max-inline-insns-auto", value / 2);
1577       break;
1578
1579     case OPT_finstrument_functions_exclude_function_list_:
1580       add_instrument_functions_exclude_list
1581         (&flag_instrument_functions_exclude_functions, arg);
1582       break;
1583
1584     case OPT_finstrument_functions_exclude_file_list_:
1585       add_instrument_functions_exclude_list
1586         (&flag_instrument_functions_exclude_files, arg);
1587       break;
1588
1589     case OPT_fmessage_length_:
1590       pp_set_line_maximum_length (global_dc->printer, value);
1591       break;
1592
1593     case OPT_fpack_struct_:
1594       if (value <= 0 || (value & (value - 1)) || value > 16)
1595         error ("structure alignment must be a small power of two, not %d", value);
1596       else
1597         {
1598           initial_max_fld_align = value;
1599           maximum_field_alignment = value * BITS_PER_UNIT;
1600         }
1601       break;
1602
1603     case OPT_fpeel_loops:
1604       flag_peel_loops_set = true;
1605       break;
1606
1607     case OPT_fprofile_arcs:
1608       profile_arc_flag_set = true;
1609       break;
1610
1611     case OPT_finline_functions:
1612       flag_inline_functions_set = true;
1613       break;
1614
1615     case OPT_fprofile_use:
1616       if (!flag_branch_probabilities_set)
1617         flag_branch_probabilities = value;
1618       if (!flag_profile_values_set)
1619         flag_profile_values = value;
1620       if (!flag_unroll_loops_set)
1621         flag_unroll_loops = value;
1622       if (!flag_peel_loops_set)
1623         flag_peel_loops = value;
1624       if (!flag_tracer_set)
1625         flag_tracer = value;
1626       if (!flag_value_profile_transformations_set)
1627         flag_value_profile_transformations = value;
1628       if (!flag_inline_functions_set)
1629         flag_inline_functions = value;
1630       break;
1631
1632     case OPT_fprofile_generate:
1633       if (!profile_arc_flag_set)
1634         profile_arc_flag = value;
1635       if (!flag_profile_values_set)
1636         flag_profile_values = value;
1637       if (!flag_value_profile_transformations_set)
1638         flag_value_profile_transformations = value;
1639       if (!flag_inline_functions_set)
1640         flag_inline_functions = value;
1641       break;
1642
1643     case OPT_fprofile_values:
1644       flag_profile_values_set = true;
1645       break;
1646
1647     case OPT_fvisibility_:
1648       {
1649         if (!strcmp(arg, "default"))
1650           default_visibility = VISIBILITY_DEFAULT;
1651         else if (!strcmp(arg, "internal"))
1652           default_visibility = VISIBILITY_INTERNAL;
1653         else if (!strcmp(arg, "hidden"))
1654           default_visibility = VISIBILITY_HIDDEN;
1655         else if (!strcmp(arg, "protected"))
1656           default_visibility = VISIBILITY_PROTECTED;
1657         else
1658           error ("unrecognized visibility value \"%s\"", arg);
1659       }
1660       break;
1661
1662     case OPT_fvpt:
1663       flag_value_profile_transformations_set = true;
1664       break;
1665
1666     case OPT_frandom_seed:
1667       /* The real switch is -fno-random-seed.  */
1668       if (value)
1669         return 0;
1670       set_random_seed (NULL);
1671       break;
1672
1673     case OPT_frandom_seed_:
1674       set_random_seed (arg);
1675       break;
1676
1677     case OPT_fsched_verbose_:
1678 #ifdef INSN_SCHEDULING
1679       fix_sched_param ("verbose", arg);
1680       break;
1681 #else
1682       return 0;
1683 #endif
1684
1685     case OPT_fsched_stalled_insns_:
1686       flag_sched_stalled_insns = value;
1687       if (flag_sched_stalled_insns == 0)
1688         flag_sched_stalled_insns = -1;
1689       break;
1690
1691     case OPT_fsched_stalled_insns_dep_:
1692       flag_sched_stalled_insns_dep = value;
1693       break;
1694
1695     case OPT_fstack_limit:
1696       /* The real switch is -fno-stack-limit.  */
1697       if (value)
1698         return 0;
1699       stack_limit_rtx = NULL_RTX;
1700       break;
1701
1702     case OPT_fstack_limit_register_:
1703       {
1704         int reg = decode_reg_name (arg);
1705         if (reg < 0)
1706           error ("unrecognized register name \"%s\"", arg);
1707         else
1708           stack_limit_rtx = gen_rtx_REG (Pmode, reg);
1709       }
1710       break;
1711
1712     case OPT_fstack_limit_symbol_:
1713       stack_limit_rtx = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (arg));
1714       break;
1715
1716     case OPT_ftree_vectorizer_verbose_:
1717       vect_set_verbosity_level (arg);
1718       break;
1719
1720     case OPT_ftls_model_:
1721       if (!strcmp (arg, "global-dynamic"))
1722         flag_tls_default = TLS_MODEL_GLOBAL_DYNAMIC;
1723       else if (!strcmp (arg, "local-dynamic"))
1724         flag_tls_default = TLS_MODEL_LOCAL_DYNAMIC;
1725       else if (!strcmp (arg, "initial-exec"))
1726         flag_tls_default = TLS_MODEL_INITIAL_EXEC;
1727       else if (!strcmp (arg, "local-exec"))
1728         flag_tls_default = TLS_MODEL_LOCAL_EXEC;
1729       else
1730         warning (0, "unknown tls-model \"%s\"", arg);
1731       break;
1732
1733     case OPT_ftracer:
1734       flag_tracer_set = true;
1735       break;
1736
1737     case OPT_funroll_loops:
1738       flag_unroll_loops_set = true;
1739       break;
1740
1741     case OPT_g:
1742       set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, arg);
1743       break;
1744
1745     case OPT_gcoff:
1746       set_debug_level (SDB_DEBUG, false, arg);
1747       break;
1748
1749     case OPT_gdwarf_2:
1750       set_debug_level (DWARF2_DEBUG, false, arg);
1751       break;
1752
1753     case OPT_ggdb:
1754       set_debug_level (NO_DEBUG, 2, arg);
1755       break;
1756
1757     case OPT_gstabs:
1758     case OPT_gstabs_:
1759       set_debug_level (DBX_DEBUG, code == OPT_gstabs_, arg);
1760       break;
1761
1762     case OPT_gvms:
1763       set_debug_level (VMS_DEBUG, false, arg);
1764       break;
1765
1766     case OPT_gxcoff:
1767     case OPT_gxcoff_:
1768       set_debug_level (XCOFF_DEBUG, code == OPT_gxcoff_, arg);
1769       break;
1770
1771     case OPT_o:
1772       asm_file_name = arg;
1773       break;
1774
1775     case OPT_pedantic_errors:
1776       flag_pedantic_errors = pedantic = 1;
1777       break;
1778
1779     case OPT_floop_optimize:
1780     case OPT_frerun_loop_opt:
1781     case OPT_fstrength_reduce:
1782     case OPT_ftree_store_copy_prop:
1783     case OPT_fforce_addr:
1784       /* These are no-ops, preserved for backward compatibility.  */
1785       break;
1786
1787     default:
1788       /* If the flag was handled in a standard way, assume the lack of
1789          processing here is intentional.  */
1790       gcc_assert (cl_options[scode].flag_var);
1791       break;
1792     }
1793
1794   return 1;
1795 }
1796
1797 /* Handle --param NAME=VALUE.  */
1798 static void
1799 handle_param (const char *carg)
1800 {
1801   char *equal, *arg;
1802   int value;
1803
1804   arg = xstrdup (carg);
1805   equal = strchr (arg, '=');
1806   if (!equal)
1807     error ("%s: --param arguments should be of the form NAME=VALUE", arg);
1808   else
1809     {
1810       value = integral_argument (equal + 1);
1811       if (value == -1)
1812         error ("invalid --param value %qs", equal + 1);
1813       else
1814         {
1815           *equal = '\0';
1816           set_param_value (arg, value);
1817         }
1818     }
1819
1820   free (arg);
1821 }
1822
1823 /* Handle -W and -Wextra.  */
1824 static void
1825 set_Wextra (int setting)
1826 {
1827   extra_warnings = setting;
1828   warn_unused_parameter = (setting && maybe_warn_unused_parameter);
1829
1830   /* We save the value of warn_uninitialized, since if they put
1831      -Wuninitialized on the command line, we need to generate a
1832      warning about not using it without also specifying -O.  */
1833   if (setting == 0)
1834     warn_uninitialized = 0;
1835   else if (warn_uninitialized != 1)
1836     warn_uninitialized = 2;
1837 }
1838
1839 /* Initialize unused warning flags.  */
1840 void
1841 set_Wunused (int setting)
1842 {
1843   warn_unused_function = setting;
1844   warn_unused_label = setting;
1845   /* Unused function parameter warnings are reported when either
1846      ``-Wextra -Wunused'' or ``-Wunused-parameter'' is specified.
1847      Thus, if -Wextra has already been seen, set warn_unused_parameter;
1848      otherwise set maybe_warn_extra_parameter, which will be picked up
1849      by set_Wextra.  */
1850   maybe_warn_unused_parameter = setting;
1851   warn_unused_parameter = (setting && extra_warnings);
1852   warn_unused_variable = setting;
1853   warn_unused_value = setting;
1854 }
1855
1856 /* Used to set the level of strict aliasing warnings, 
1857    when no level is specified (i.e., when -Wstrict-aliasing, and not
1858    -Wstrict-aliasing=level was given).
1859    ONOFF is assumed to take value 1 when -Wstrict-aliasing is specified,
1860    and 0 otherwise.  After calling this function, wstrict_aliasing will be
1861    set to the default value of -Wstrict_aliasing=level, currently 3.  */
1862 void
1863 set_Wstrict_aliasing (int onoff)
1864 {
1865   gcc_assert (onoff == 0 || onoff == 1);
1866   if (onoff != 0)
1867     warn_strict_aliasing = 3;
1868 }
1869
1870 /* The following routines are useful in setting all the flags that
1871    -ffast-math and -fno-fast-math imply.  */
1872 void
1873 set_fast_math_flags (int set)
1874 {
1875   flag_unsafe_math_optimizations = set;
1876   set_unsafe_math_optimizations_flags (set);
1877   flag_finite_math_only = set;
1878   flag_errno_math = !set;
1879   if (set)
1880     {
1881       flag_signaling_nans = 0;
1882       flag_rounding_math = 0;
1883       flag_cx_limited_range = 1;
1884     }
1885 }
1886
1887 /* When -funsafe-math-optimizations is set the following 
1888    flags are set as well.  */ 
1889 void
1890 set_unsafe_math_optimizations_flags (int set)
1891 {
1892   flag_trapping_math = !set;
1893   flag_signed_zeros = !set;
1894   flag_associative_math = set;
1895   flag_reciprocal_math = set;
1896 }
1897
1898 /* Return true iff flags are set as if -ffast-math.  */
1899 bool
1900 fast_math_flags_set_p (void)
1901 {
1902   return (!flag_trapping_math
1903           && flag_unsafe_math_optimizations
1904           && flag_finite_math_only
1905           && !flag_signed_zeros
1906           && !flag_errno_math);
1907 }
1908
1909 /* Handle a debug output -g switch.  EXTENDED is true or false to support
1910    extended output (2 is special and means "-ggdb" was given).  */
1911 static void
1912 set_debug_level (enum debug_info_type type, int extended, const char *arg)
1913 {
1914   static bool type_explicit;
1915
1916   use_gnu_debug_info_extensions = extended;
1917
1918   if (type == NO_DEBUG)
1919     {
1920       if (write_symbols == NO_DEBUG)
1921         {
1922           write_symbols = PREFERRED_DEBUGGING_TYPE;
1923
1924           if (extended == 2)
1925             {
1926 #ifdef DWARF2_DEBUGGING_INFO
1927               write_symbols = DWARF2_DEBUG;
1928 #elif defined DBX_DEBUGGING_INFO
1929               write_symbols = DBX_DEBUG;
1930 #endif
1931             }
1932
1933           if (write_symbols == NO_DEBUG)
1934             warning (0, "target system does not support debug output");
1935         }
1936     }
1937   else
1938     {
1939       /* Does it conflict with an already selected type?  */
1940       if (type_explicit && write_symbols != NO_DEBUG && type != write_symbols)
1941         error ("debug format \"%s\" conflicts with prior selection",
1942                debug_type_names[type]);
1943       write_symbols = type;
1944       type_explicit = true;
1945     }
1946
1947   /* A debug flag without a level defaults to level 2.  */
1948   if (*arg == '\0')
1949     {
1950       if (!debug_info_level)
1951         debug_info_level = 2;
1952     }
1953   else
1954     {
1955       debug_info_level = integral_argument (arg);
1956       if (debug_info_level == (unsigned int) -1)
1957         error ("unrecognised debug output level \"%s\"", arg);
1958       else if (debug_info_level > 3)
1959         error ("debug output level %s is too high", arg);
1960     }
1961 }
1962
1963 /* Return 1 if OPTION is enabled, 0 if it is disabled, or -1 if it isn't
1964    a simple on-off switch.  */
1965
1966 int
1967 option_enabled (int opt_idx)
1968 {
1969   const struct cl_option *option = &(cl_options[opt_idx]);
1970
1971   if (option->flag_var)
1972     switch (option->var_type)
1973       {
1974       case CLVC_BOOLEAN:
1975         return *(int *) option->flag_var != 0;
1976
1977       case CLVC_EQUAL:
1978         return *(int *) option->flag_var == option->var_value;
1979
1980       case CLVC_BIT_CLEAR:
1981         return (*(int *) option->flag_var & option->var_value) == 0;
1982
1983       case CLVC_BIT_SET:
1984         return (*(int *) option->flag_var & option->var_value) != 0;
1985
1986       case CLVC_STRING:
1987         break;
1988       }
1989   return -1;
1990 }
1991
1992 /* Fill STATE with the current state of option OPTION.  Return true if
1993    there is some state to store.  */
1994
1995 bool
1996 get_option_state (int option, struct cl_option_state *state)
1997 {
1998   if (cl_options[option].flag_var == 0)
1999     return false;
2000
2001   switch (cl_options[option].var_type)
2002     {
2003     case CLVC_BOOLEAN:
2004     case CLVC_EQUAL:
2005       state->data = cl_options[option].flag_var;
2006       state->size = sizeof (int);
2007       break;
2008
2009     case CLVC_BIT_CLEAR:
2010     case CLVC_BIT_SET:
2011       state->ch = option_enabled (option);
2012       state->data = &state->ch;
2013       state->size = 1;
2014       break;
2015
2016     case CLVC_STRING:
2017       state->data = *(const char **) cl_options[option].flag_var;
2018       if (state->data == 0)
2019         state->data = "";
2020       state->size = strlen (state->data) + 1;
2021       break;
2022     }
2023   return true;
2024 }
2025
2026 /* Enable a warning option as an error.  This is used by -Werror= and
2027    also by legacy Werror-implicit-function-declaration.  */
2028
2029 void
2030 enable_warning_as_error (const char *arg, int value, unsigned int lang_mask)
2031 {
2032   char *new_option;
2033   int option_index;
2034
2035   new_option = XNEWVEC (char, strlen (arg) + 2);
2036   new_option[0] = 'W';
2037   strcpy (new_option + 1, arg);
2038   option_index = find_opt (new_option, lang_mask);
2039   if (option_index == N_OPTS)
2040     {
2041       error ("-Werror=%s: No option -%s", arg, new_option);
2042     }
2043   else
2044     {
2045       int kind = value ? DK_ERROR : DK_WARNING;
2046       diagnostic_classify_diagnostic (global_dc, option_index, kind);
2047       
2048       /* -Werror=foo implies -Wfoo.  */
2049       if (cl_options[option_index].var_type == CLVC_BOOLEAN
2050           && cl_options[option_index].flag_var
2051           && kind == DK_ERROR)
2052         *(int *) cl_options[option_index].flag_var = 1;
2053     }
2054   free (new_option);
2055 }