OSDN Git Service

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