OSDN Git Service

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