OSDN Git Service

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