OSDN Git Service

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