OSDN Git Service

PR testsuite/34168
[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       flag_tree_salias = 1;
852       if (!no_unit_at_a_time_default)
853         flag_unit_at_a_time = 1;
854
855       if (!optimize_size)
856         {
857           /* Loop header copying usually increases size of the code.  This used
858              not to be true, since quite often it is possible to verify that
859              the condition is satisfied in the first iteration and therefore
860              to eliminate it.  Jump threading handles these cases now.  */
861           flag_tree_ch = 1;
862         }
863     }
864
865   if (optimize >= 2)
866     {
867       flag_inline_small_functions = 1;
868       flag_thread_jumps = 1;
869       flag_crossjumping = 1;
870       flag_optimize_sibling_calls = 1;
871       flag_forward_propagate = 1;
872       flag_cse_follow_jumps = 1;
873       flag_gcse = 1;
874       flag_expensive_optimizations = 1;
875       flag_rerun_cse_after_loop = 1;
876       flag_caller_saves = 1;
877       flag_peephole2 = 1;
878 #ifdef INSN_SCHEDULING
879       flag_schedule_insns = 1;
880       flag_schedule_insns_after_reload = 1;
881 #endif
882       flag_regmove = 1;
883       flag_strict_aliasing = 1;
884       flag_strict_overflow = 1;
885       flag_delete_null_pointer_checks = 1;
886       flag_reorder_blocks = 1;
887       flag_reorder_functions = 1;
888       flag_tree_store_ccp = 1;
889       flag_tree_vrp = 1;
890
891       if (!optimize_size)
892         {
893           /* PRE tends to generate bigger code.  */
894           flag_tree_pre = 1;
895         }
896
897       /* Allow more virtual operators to increase alias precision.  */
898       set_param_value ("max-aliased-vops", 500);
899     }
900
901   if (optimize >= 3)
902     {
903       flag_predictive_commoning = 1;
904       flag_inline_functions = 1;
905       flag_unswitch_loops = 1;
906       flag_gcse_after_reload = 1;
907       flag_tree_vectorize = 1;
908
909       /* Allow even more virtual operators.  */
910       set_param_value ("max-aliased-vops", 1000);
911       set_param_value ("avg-aliased-vops", 3);
912     }
913
914   if (optimize < 2 || optimize_size)
915     {
916       align_loops = 1;
917       align_jumps = 1;
918       align_labels = 1;
919       align_functions = 1;
920
921       /* Don't reorder blocks when optimizing for size because extra
922          jump insns may be created; also barrier may create extra padding.
923
924          More correctly we should have a block reordering mode that tried
925          to minimize the combined size of all the jumps.  This would more
926          or less automatically remove extra jumps, but would also try to
927          use more short jumps instead of long jumps.  */
928       flag_reorder_blocks = 0;
929       flag_reorder_blocks_and_partition = 0;
930     }
931
932   if (optimize_size)
933     {
934       /* Inlining of functions reducing size is a good idea regardless
935          of them being declared inline.  */
936       flag_inline_functions = 1;
937
938       /* We want to crossjump as much as possible.  */
939       set_param_value ("min-crossjump-insns", 1);
940     }
941
942   /* Initialize whether `char' is signed.  */
943   flag_signed_char = DEFAULT_SIGNED_CHAR;
944   /* Set this to a special "uninitialized" value.  The actual default is set
945      after target options have been processed.  */
946   flag_short_enums = 2;
947
948   /* Initialize target_flags before OPTIMIZATION_OPTIONS so the latter can
949      modify it.  */
950   target_flags = targetm.default_target_flags;
951
952   /* Some tagets have ABI-specified unwind tables.  */
953   flag_unwind_tables = targetm.unwind_tables_default;
954
955 #ifdef OPTIMIZATION_OPTIONS
956   /* Allow default optimizations to be specified on a per-machine basis.  */
957   OPTIMIZATION_OPTIONS (optimize, optimize_size);
958 #endif
959
960   handle_options (argc, argv, lang_mask);
961
962   if (flag_pie)
963     flag_pic = flag_pie;
964   if (flag_pic && !flag_pie)
965     flag_shlib = 1;
966
967   if (flag_no_inline == 2)
968     flag_no_inline = 0;
969   else
970     flag_really_no_inline = flag_no_inline;
971
972   /* Set flag_no_inline before the post_options () hook.  The C front
973      ends use it to determine tree inlining defaults.  FIXME: such
974      code should be lang-independent when all front ends use tree
975      inlining, in which case it, and this condition, should be moved
976      to the top of process_options() instead.  */
977   if (optimize == 0)
978     {
979       /* Inlining does not work if not optimizing,
980          so force it not to be done.  */
981       flag_no_inline = 1;
982       warn_inline = 0;
983
984       /* The c_decode_option function and decode_option hook set
985          this to `2' if -Wall is used, so we can avoid giving out
986          lots of errors for people who don't realize what -Wall does.  */
987       if (warn_uninitialized == 1)
988         warning (OPT_Wuninitialized,
989                  "-Wuninitialized is not supported without -O");
990     }
991
992   if (flag_really_no_inline == 2)
993     flag_really_no_inline = flag_no_inline;
994
995   /* Inlining of functions called just once will only work if we can look
996      at the complete translation unit.  */
997   if (flag_inline_functions_called_once && !flag_unit_at_a_time)
998     {
999       flag_inline_functions_called_once = 0;
1000       warning (OPT_Wdisabled_optimization,
1001                "-funit-at-a-time is required for inlining of functions "
1002                "that are only called once");
1003     }
1004
1005   /* The optimization to partition hot and cold basic blocks into separate
1006      sections of the .o and executable files does not work (currently)
1007      with exception handling.  This is because there is no support for
1008      generating unwind info.  If flag_exceptions is turned on we need to
1009      turn off the partitioning optimization.  */
1010
1011   if (flag_exceptions && flag_reorder_blocks_and_partition)
1012     {
1013       inform
1014             ("-freorder-blocks-and-partition does not work with exceptions");
1015       flag_reorder_blocks_and_partition = 0;
1016       flag_reorder_blocks = 1;
1017     }
1018
1019   /* If user requested unwind info, then turn off the partitioning
1020      optimization.  */
1021
1022   if (flag_unwind_tables && ! targetm.unwind_tables_default
1023       && flag_reorder_blocks_and_partition)
1024     {
1025       inform ("-freorder-blocks-and-partition does not support unwind info");
1026       flag_reorder_blocks_and_partition = 0;
1027       flag_reorder_blocks = 1;
1028     }
1029
1030   /* If the target requested unwind info, then turn off the partitioning
1031      optimization with a different message.  Likewise, if the target does not
1032      support named sections.  */
1033
1034   if (flag_reorder_blocks_and_partition
1035       && (!targetm.have_named_sections
1036           || (flag_unwind_tables && targetm.unwind_tables_default)))
1037     {
1038       inform
1039        ("-freorder-blocks-and-partition does not work on this architecture");
1040       flag_reorder_blocks_and_partition = 0;
1041       flag_reorder_blocks = 1;
1042     }
1043 }
1044
1045 #define LEFT_COLUMN     27
1046
1047 /* Output ITEM, of length ITEM_WIDTH, in the left column,
1048    followed by word-wrapped HELP in a second column.  */
1049 static void
1050 wrap_help (const char *help,
1051            const char *item,
1052            unsigned int item_width,
1053            unsigned int columns)
1054 {
1055   unsigned int col_width = LEFT_COLUMN;
1056   unsigned int remaining, room, len;
1057
1058   remaining = strlen (help);
1059
1060   do
1061     {
1062       room = columns - 3 - MAX (col_width, item_width);
1063       if (room > columns)
1064         room = 0;
1065       len = remaining;
1066
1067       if (room < len)
1068         {
1069           unsigned int i;
1070
1071           for (i = 0; help[i]; i++)
1072             {
1073               if (i >= room && len != remaining)
1074                 break;
1075               if (help[i] == ' ')
1076                 len = i;
1077               else if ((help[i] == '-' || help[i] == '/')
1078                        && help[i + 1] != ' '
1079                        && i > 0 && ISALPHA (help[i - 1]))
1080                 len = i + 1;
1081             }
1082         }
1083
1084       printf( "  %-*.*s %.*s\n", col_width, item_width, item, len, help);
1085       item_width = 0;
1086       while (help[len] == ' ')
1087         len++;
1088       help += len;
1089       remaining -= len;
1090     }
1091   while (remaining);
1092 }
1093
1094 /* Print help for a specific front-end, etc.  */
1095 static void
1096 print_filtered_help (unsigned int include_flags,
1097                      unsigned int exclude_flags,
1098                      unsigned int any_flags,
1099                      unsigned int columns)
1100 {
1101   unsigned int i;
1102   const char *help;
1103   static char *printed = NULL;
1104   bool found = false;
1105   bool displayed = false;
1106
1107   if (include_flags == CL_PARAMS)
1108     {
1109       for (i = 0; i < LAST_PARAM; i++)
1110         {
1111           const char *param = compiler_params[i].option;
1112
1113           help = compiler_params[i].help;
1114           if (help == NULL || *help == '\0')
1115             {
1116               if (exclude_flags & CL_UNDOCUMENTED)
1117                 continue;
1118               help = undocumented_msg;
1119             }
1120
1121           /* Get the translation.  */
1122           help = _(help);
1123
1124           wrap_help (help, param, strlen (param), columns);
1125         }
1126       putchar ('\n');
1127       return;
1128     }
1129
1130   if (!printed)
1131     printed = xcalloc (1, cl_options_count);
1132
1133   for (i = 0; i < cl_options_count; i++)
1134     {
1135       static char new_help[128];
1136       const struct cl_option *option = cl_options + i;
1137       unsigned int len;
1138       const char *opt;
1139       const char *tab;
1140
1141       if (include_flags == 0
1142           || ((option->flags & include_flags) != include_flags))
1143         {
1144           if ((option->flags & any_flags) == 0)
1145             continue;
1146         }
1147
1148       /* Skip unwanted switches.  */
1149       if ((option->flags & exclude_flags) != 0)
1150         continue;
1151
1152       found = true;
1153       /* Skip switches that have already been printed.  */
1154       if (printed[i])
1155         continue;
1156
1157       printed[i] = true;
1158
1159       help = option->help;
1160       if (help == NULL)
1161         {
1162           if (exclude_flags & CL_UNDOCUMENTED)
1163             continue;
1164           help = undocumented_msg;
1165         }
1166
1167       /* Get the translation.  */
1168       help = _(help);
1169
1170       /* Find the gap between the name of the
1171          option and its descriptive text.  */
1172       tab = strchr (help, '\t');
1173       if (tab)
1174         {
1175           len = tab - help;
1176           opt = help;
1177           help = tab + 1;
1178         }
1179       else
1180         {
1181           opt = option->opt_text;
1182           len = strlen (opt);
1183         }
1184
1185       /* With the -Q option enabled we change the descriptive text associated
1186          with an option to be an indication of its current setting.  */
1187       if (!quiet_flag)
1188         {
1189           if (len < (LEFT_COLUMN + 2))
1190             strcpy (new_help, "\t\t");
1191           else
1192             strcpy (new_help, "\t");
1193
1194           if (option->flag_var != NULL)
1195             {
1196               if (option->flags & CL_JOINED)
1197                 {
1198                   if (option->var_type == CLVC_STRING)
1199                     {
1200                       if (* (const char **) option->flag_var != NULL)
1201                         snprintf (new_help + strlen (new_help),
1202                                   sizeof (new_help) - strlen (new_help),
1203                                   * (const char **) option->flag_var);
1204                     }
1205                   else
1206                     sprintf (new_help + strlen (new_help),
1207                              "%#x", * (int *) option->flag_var);
1208                 }
1209               else
1210                 strcat (new_help, option_enabled (i)
1211                         ? _("[enabled]") : _("[disabled]"));
1212             }
1213
1214           help = new_help;
1215         }
1216
1217       wrap_help (help, opt, len, columns);
1218       displayed = true;
1219     }
1220
1221   if (! found)
1222     {
1223       unsigned int langs = include_flags & CL_LANG_ALL;
1224
1225       if (langs == 0)
1226         printf (_(" No options with the desired characteristics were found\n"));
1227       else
1228         {
1229           unsigned int i;
1230
1231           /* PR 31349: Tell the user how to see all of the
1232              options supported by a specific front end.  */
1233           for (i = 0; (1U << i) < CL_LANG_ALL; i ++)
1234             if ((1U << i) & langs)
1235               printf (_(" None found.  Use --help=%s to show *all* the options supported by the %s front-end\n"),
1236                       lang_names[i], lang_names[i]);
1237         }
1238         
1239     }
1240   else if (! displayed)
1241     printf (_(" All options with the desired characteristics have already been displayed\n"));
1242
1243   putchar ('\n');
1244 }
1245
1246 /* Display help for a specified type of option.
1247    The options must have ALL of the INCLUDE_FLAGS set
1248    ANY of the flags in the ANY_FLAGS set
1249    and NONE of the EXCLUDE_FLAGS set.  */
1250 static void
1251 print_specific_help (unsigned int include_flags,
1252                      unsigned int exclude_flags,
1253                      unsigned int any_flags)
1254 {
1255   unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1256   const char * description = NULL;
1257   const char * descrip_extra = "";
1258   size_t i;
1259   unsigned int flag;
1260   static unsigned int columns = 0;
1261
1262   /* Sanity check: Make sure that we do not have more
1263      languages than we have bits available to enumerate them.  */
1264   gcc_assert ((1U << cl_lang_count) < CL_MIN_OPTION_CLASS);
1265
1266   /* If we have not done so already, obtain
1267      the desired maximum width of the output.  */
1268   if (columns == 0)
1269     {
1270       const char *p;
1271
1272       GET_ENVIRONMENT (p, "COLUMNS");
1273       if (p != NULL)
1274         {
1275           int value = atoi (p);
1276
1277           if (value > 0)
1278             columns = value;
1279         }
1280
1281       if (columns == 0)
1282         /* Use a reasonable default.  */
1283         columns = 80;
1284     }
1285
1286   /* Decide upon the title for the options that we are going to display.  */
1287   for (i = 0, flag = 1; flag <= CL_MAX_OPTION_CLASS; flag <<= 1, i ++)
1288     {
1289       switch (flag & include_flags)
1290         {
1291         case 0:
1292           break;
1293
1294         case CL_TARGET:
1295           description = _("The following options are target specific");
1296           break;
1297         case CL_WARNING:
1298           description = _("The following options control compiler warning messages");
1299           break;
1300         case CL_OPTIMIZATION:
1301           description = _("The following options control optimizations");
1302           break;
1303         case CL_COMMON:
1304           description = _("The following options are language-independent");
1305           break;
1306         case CL_PARAMS:
1307           description = _("The --param option recognizes the following as parameters");
1308           break;
1309         default:
1310           if (i >= cl_lang_count)
1311             break;
1312           if ((exclude_flags & ((1U << cl_lang_count) - 1)) != 0)
1313             description = _("The following options are specific to just the language ");
1314           else
1315             description = _("The following options are supported by the language ");
1316           descrip_extra = lang_names [i];
1317           break;
1318         }
1319     }
1320
1321   if (description == NULL)
1322     {
1323       if (any_flags == 0)
1324         {
1325           if (include_flags == CL_UNDOCUMENTED)
1326             description = _("The following options are not documented");
1327           else
1328             {
1329               internal_error ("unrecognized include_flags 0x%x passed to print_specific_help",
1330                               include_flags);
1331               return;
1332             }
1333         }
1334       else
1335         {
1336           if (any_flags & all_langs_mask)
1337             description = _("The following options are language-related");
1338           else
1339             description = _("The following options are language-independent");
1340         }
1341     }
1342
1343   printf ("%s%s:\n", description, descrip_extra);
1344   print_filtered_help (include_flags, exclude_flags, any_flags, columns);
1345 }
1346
1347 /* Handle target- and language-independent options.  Return zero to
1348    generate an "unknown option" message.  Only options that need
1349    extra handling need to be listed here; if you simply want
1350    VALUE assigned to a variable, it happens automatically.  */
1351
1352 static int
1353 common_handle_option (size_t scode, const char *arg, int value,
1354                       unsigned int lang_mask)
1355 {
1356   static bool verbose = false;
1357   enum opt_code code = (enum opt_code) scode;
1358
1359   switch (code)
1360     {
1361     case OPT__param:
1362       handle_param (arg);
1363       break;
1364
1365     case OPT_v:
1366       verbose = true;
1367       break;
1368
1369     case OPT_fhelp:
1370     case OPT__help:
1371       {
1372         unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1373         unsigned int undoc_mask;
1374         unsigned int i;
1375
1376         undoc_mask = (verbose | extra_warnings) ? 0 : CL_UNDOCUMENTED;
1377         /* First display any single language specific options.  */
1378         for (i = 0; i < cl_lang_count; i++)
1379           print_specific_help
1380             (1U << i, (all_langs_mask & (~ (1U << i))) | undoc_mask, 0);
1381         /* Next display any multi language specific options.  */
1382         print_specific_help (0, undoc_mask, all_langs_mask);
1383         /* Then display any remaining, non-language options.  */
1384         for (i = CL_MIN_OPTION_CLASS; i <= CL_MAX_OPTION_CLASS; i <<= 1)
1385           print_specific_help (i, undoc_mask, 0);
1386         exit_after_options = true;
1387         break;
1388       }
1389
1390     case OPT_ftarget_help:
1391     case OPT__target_help:
1392       print_specific_help (CL_TARGET, CL_UNDOCUMENTED, 0);
1393       exit_after_options = true;
1394
1395       /* Allow the target a chance to give the user some additional information.  */
1396       if (targetm.target_help)
1397         targetm.target_help ();
1398       break;
1399
1400     case OPT_fhelp_:
1401     case OPT__help_:
1402       {
1403         const char * a = arg;
1404         unsigned int include_flags = 0;
1405         /* Note - by default we include undocumented options when listing
1406            specific classes.  If you only want to see documented options
1407            then add ",^undocumented" to the --help= option.  e.g.:
1408
1409            --help=target,^undocumented  */
1410         unsigned int exclude_flags = 0;
1411
1412         /* Walk along the argument string, parsing each word in turn.
1413            The format is:
1414            arg = [^]{word}[,{arg}]
1415            word = {optimizers|target|warnings|undocumented|
1416                    params|common|<language>}  */
1417         while (* a != 0)
1418           {
1419             static struct
1420             {
1421               const char * string;
1422               unsigned int flag;
1423             }
1424             specifics[] =
1425             {
1426               { "optimizers", CL_OPTIMIZATION },
1427               { "target", CL_TARGET },
1428               { "warnings", CL_WARNING },
1429               { "undocumented", CL_UNDOCUMENTED },
1430               { "params", CL_PARAMS },
1431               { "joined", CL_JOINED },
1432               { "separate", CL_SEPARATE },
1433               { "common", CL_COMMON },
1434               { NULL, 0 }
1435             };
1436             unsigned int * pflags;
1437             char * comma;
1438             unsigned int lang_flag, specific_flag;
1439             unsigned int len;
1440             unsigned int i;
1441
1442             if (* a == '^')
1443               {
1444                 ++ a;
1445                 pflags = & exclude_flags;
1446               }
1447             else
1448               pflags = & include_flags;
1449
1450             comma = strchr (a, ',');
1451             if (comma == NULL)
1452               len = strlen (a);
1453             else
1454               len = comma - a;
1455
1456             /* Check to see if the string matches an option class name.  */
1457             for (i = 0, specific_flag = 0; specifics[i].string != NULL; i++)
1458               if (strncasecmp (a, specifics[i].string, len) == 0)
1459                 {
1460                   specific_flag = specifics[i].flag;
1461                   break;
1462                 }
1463             
1464             /* Check to see if the string matches a language name.
1465                Note - we rely upon the alpha-sorted nature of the entries in
1466                the lang_names array, specifically that shorter names appear
1467                before their longer variants.  (ie C before C++).  That way
1468                when we are attempting to match --help=c for example we will
1469                match with C first and not C++.  */
1470             for (i = 0, lang_flag = 0; i < cl_lang_count; i++)
1471               if (strncasecmp (a, lang_names[i], len) == 0)
1472                 {
1473                   lang_flag = 1U << i;
1474                   break;
1475                 }
1476
1477             if (specific_flag != 0)
1478               {
1479                 if (lang_flag == 0)
1480                   * pflags |= specific_flag;
1481                 else
1482                   {
1483                     /* The option's argument matches both the start of a
1484                        language name and the start of an option class name.
1485                        We have a special case for when the user has
1486                        specified "--help=c", but otherwise we have to issue
1487                        a warning.  */
1488                     if (strncasecmp (a, "c", len) == 0)
1489                       * pflags |= lang_flag;
1490                     else
1491                       fnotice (stderr,
1492                                "warning: --help argument %.*s is ambiguous, please be more specific\n",
1493                                len, a);
1494                   }
1495               }
1496             else if (lang_flag != 0)
1497               * pflags |= lang_flag;
1498             else
1499               fnotice (stderr,
1500                        "warning: unrecognized argument to --help= option: %.*s\n",
1501                        len, a);
1502
1503             if (comma == NULL)
1504               break;
1505             a = comma + 1;
1506           }
1507
1508         if (include_flags)
1509           print_specific_help (include_flags, exclude_flags, 0);
1510         exit_after_options = true;
1511         break;
1512       }
1513
1514     case OPT__version:
1515       print_version (stderr, "");
1516       exit_after_options = true;
1517       break;
1518
1519     case OPT_G:
1520       g_switch_value = value;
1521       g_switch_set = true;
1522       break;
1523
1524     case OPT_O:
1525     case OPT_Os:
1526       /* Currently handled in a prescan.  */
1527       break;
1528
1529     case OPT_W:
1530       /* For backward compatibility, -W is the same as -Wextra.  */
1531       set_Wextra (value);
1532       break;
1533
1534     case OPT_Werror_:
1535       enable_warning_as_error (arg, value, lang_mask);
1536       break;
1537
1538     case OPT_Wextra:
1539       set_Wextra (value);
1540       break;
1541
1542     case OPT_Wlarger_than_:
1543       /* This form corresponds to -Wlarger-than-.  
1544          Kept for backward compatibility. 
1545          Don't use it as the first argument of warning().  */
1546
1547     case OPT_Wlarger_than_eq:
1548       larger_than_size = value;
1549       warn_larger_than = value != -1;
1550       break;
1551
1552     case OPT_Wframe_larger_than_:
1553       frame_larger_than_size = value;
1554       warn_frame_larger_than = value != -1;
1555       break;
1556
1557     case OPT_Wstrict_aliasing:
1558       set_Wstrict_aliasing (value);
1559       break;
1560
1561     case OPT_Wstrict_aliasing_:
1562       warn_strict_aliasing = value;
1563       break;
1564
1565     case OPT_Wstrict_overflow:
1566       warn_strict_overflow = (value
1567                               ? (int) WARN_STRICT_OVERFLOW_CONDITIONAL
1568                               : 0);
1569       break;
1570
1571     case OPT_Wstrict_overflow_:
1572       warn_strict_overflow = value;
1573       break;
1574
1575     case OPT_Wunused:
1576       set_Wunused (value);
1577       break;
1578
1579     case OPT_aux_info:
1580     case OPT_aux_info_:
1581       aux_info_file_name = arg;
1582       flag_gen_aux_info = 1;
1583       break;
1584
1585     case OPT_auxbase:
1586       aux_base_name = arg;
1587       break;
1588
1589     case OPT_auxbase_strip:
1590       {
1591         char *tmp = xstrdup (arg);
1592         strip_off_ending (tmp, strlen (tmp));
1593         if (tmp[0])
1594           aux_base_name = tmp;
1595       }
1596       break;
1597
1598     case OPT_d:
1599       decode_d_option (arg);
1600       break;
1601
1602     case OPT_dumpbase:
1603       dump_base_name = arg;
1604       break;
1605
1606     case OPT_falign_functions_:
1607       align_functions = value;
1608       break;
1609
1610     case OPT_falign_jumps_:
1611       align_jumps = value;
1612       break;
1613
1614     case OPT_falign_labels_:
1615       align_labels = value;
1616       break;
1617
1618     case OPT_falign_loops_:
1619       align_loops = value;
1620       break;
1621
1622     case OPT_fbranch_probabilities:
1623       flag_branch_probabilities_set = true;
1624       break;
1625
1626     case OPT_fcall_used_:
1627       fix_register (arg, 0, 1);
1628       break;
1629
1630     case OPT_fcall_saved_:
1631       fix_register (arg, 0, 0);
1632       break;
1633
1634     case OPT_fdbg_cnt_:
1635       dbg_cnt_process_opt (arg);
1636       break;
1637
1638     case OPT_fdbg_cnt_list:
1639       dbg_cnt_list_all_counters ();
1640       break;
1641
1642     case OPT_fdebug_prefix_map_:
1643       add_debug_prefix_map (arg);
1644       break;
1645
1646     case OPT_fdiagnostics_show_location_:
1647       if (!strcmp (arg, "once"))
1648         diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
1649       else if (!strcmp (arg, "every-line"))
1650         diagnostic_prefixing_rule (global_dc)
1651           = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE;
1652       else
1653         return 0;
1654       break;
1655
1656     case OPT_fdiagnostics_show_option:
1657       global_dc->show_option_requested = true;
1658       break;
1659
1660     case OPT_fdump_:
1661       if (!dump_switch_p (arg))
1662         return 0;
1663       break;
1664
1665     case OPT_ffast_math:
1666       set_fast_math_flags (value);
1667       break;
1668
1669     case OPT_funsafe_math_optimizations:
1670       set_unsafe_math_optimizations_flags (value);
1671       break;
1672
1673     case OPT_ffixed_:
1674       fix_register (arg, 1, 1);
1675       break;
1676
1677     case OPT_finline_limit_:
1678     case OPT_finline_limit_eq:
1679       set_param_value ("max-inline-insns-single", value / 2);
1680       set_param_value ("max-inline-insns-auto", value / 2);
1681       break;
1682
1683     case OPT_finstrument_functions_exclude_function_list_:
1684       add_instrument_functions_exclude_list
1685         (&flag_instrument_functions_exclude_functions, arg);
1686       break;
1687
1688     case OPT_finstrument_functions_exclude_file_list_:
1689       add_instrument_functions_exclude_list
1690         (&flag_instrument_functions_exclude_files, arg);
1691       break;
1692
1693     case OPT_fmessage_length_:
1694       pp_set_line_maximum_length (global_dc->printer, value);
1695       break;
1696
1697     case OPT_fpack_struct_:
1698       if (value <= 0 || (value & (value - 1)) || value > 16)
1699         error ("structure alignment must be a small power of two, not %d", value);
1700       else
1701         {
1702           initial_max_fld_align = value;
1703           maximum_field_alignment = value * BITS_PER_UNIT;
1704         }
1705       break;
1706
1707     case OPT_fpeel_loops:
1708       flag_peel_loops_set = true;
1709       break;
1710
1711     case OPT_fprofile_arcs:
1712       profile_arc_flag_set = true;
1713       break;
1714
1715     case OPT_finline_functions:
1716       flag_inline_functions_set = true;
1717       break;
1718
1719     case OPT_fprofile_use:
1720       if (!flag_branch_probabilities_set)
1721         flag_branch_probabilities = value;
1722       if (!flag_profile_values_set)
1723         flag_profile_values = value;
1724       if (!flag_unroll_loops_set)
1725         flag_unroll_loops = value;
1726       if (!flag_peel_loops_set)
1727         flag_peel_loops = value;
1728       if (!flag_tracer_set)
1729         flag_tracer = value;
1730       if (!flag_value_profile_transformations_set)
1731         flag_value_profile_transformations = value;
1732       if (!flag_inline_functions_set)
1733         flag_inline_functions = value;
1734       break;
1735
1736     case OPT_fprofile_generate:
1737       if (!profile_arc_flag_set)
1738         profile_arc_flag = value;
1739       if (!flag_profile_values_set)
1740         flag_profile_values = value;
1741       if (!flag_value_profile_transformations_set)
1742         flag_value_profile_transformations = value;
1743       if (!flag_inline_functions_set)
1744         flag_inline_functions = value;
1745       break;
1746
1747     case OPT_fprofile_values:
1748       flag_profile_values_set = true;
1749       break;
1750
1751     case OPT_fvisibility_:
1752       {
1753         if (!strcmp(arg, "default"))
1754           default_visibility = VISIBILITY_DEFAULT;
1755         else if (!strcmp(arg, "internal"))
1756           default_visibility = VISIBILITY_INTERNAL;
1757         else if (!strcmp(arg, "hidden"))
1758           default_visibility = VISIBILITY_HIDDEN;
1759         else if (!strcmp(arg, "protected"))
1760           default_visibility = VISIBILITY_PROTECTED;
1761         else
1762           error ("unrecognized visibility value \"%s\"", arg);
1763       }
1764       break;
1765
1766     case OPT_fvpt:
1767       flag_value_profile_transformations_set = true;
1768       break;
1769
1770     case OPT_frandom_seed:
1771       /* The real switch is -fno-random-seed.  */
1772       if (value)
1773         return 0;
1774       set_random_seed (NULL);
1775       break;
1776
1777     case OPT_frandom_seed_:
1778       set_random_seed (arg);
1779       break;
1780
1781     case OPT_fsched_verbose_:
1782 #ifdef INSN_SCHEDULING
1783       fix_sched_param ("verbose", arg);
1784       break;
1785 #else
1786       return 0;
1787 #endif
1788
1789     case OPT_fsched_stalled_insns_:
1790       flag_sched_stalled_insns = value;
1791       if (flag_sched_stalled_insns == 0)
1792         flag_sched_stalled_insns = -1;
1793       break;
1794
1795     case OPT_fsched_stalled_insns_dep_:
1796       flag_sched_stalled_insns_dep = value;
1797       break;
1798
1799     case OPT_fstack_limit:
1800       /* The real switch is -fno-stack-limit.  */
1801       if (value)
1802         return 0;
1803       stack_limit_rtx = NULL_RTX;
1804       break;
1805
1806     case OPT_fstack_limit_register_:
1807       {
1808         int reg = decode_reg_name (arg);
1809         if (reg < 0)
1810           error ("unrecognized register name \"%s\"", arg);
1811         else
1812           stack_limit_rtx = gen_rtx_REG (Pmode, reg);
1813       }
1814       break;
1815
1816     case OPT_fstack_limit_symbol_:
1817       stack_limit_rtx = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (arg));
1818       break;
1819
1820     case OPT_ftree_vectorizer_verbose_:
1821       vect_set_verbosity_level (arg);
1822       break;
1823
1824     case OPT_ftls_model_:
1825       if (!strcmp (arg, "global-dynamic"))
1826         flag_tls_default = TLS_MODEL_GLOBAL_DYNAMIC;
1827       else if (!strcmp (arg, "local-dynamic"))
1828         flag_tls_default = TLS_MODEL_LOCAL_DYNAMIC;
1829       else if (!strcmp (arg, "initial-exec"))
1830         flag_tls_default = TLS_MODEL_INITIAL_EXEC;
1831       else if (!strcmp (arg, "local-exec"))
1832         flag_tls_default = TLS_MODEL_LOCAL_EXEC;
1833       else
1834         warning (0, "unknown tls-model \"%s\"", arg);
1835       break;
1836
1837     case OPT_ftracer:
1838       flag_tracer_set = true;
1839       break;
1840
1841     case OPT_funroll_loops:
1842       flag_unroll_loops_set = true;
1843       break;
1844
1845     case OPT_g:
1846       set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, arg);
1847       break;
1848
1849     case OPT_gcoff:
1850       set_debug_level (SDB_DEBUG, false, arg);
1851       break;
1852
1853     case OPT_gdwarf_2:
1854       set_debug_level (DWARF2_DEBUG, false, arg);
1855       break;
1856
1857     case OPT_ggdb:
1858       set_debug_level (NO_DEBUG, 2, arg);
1859       break;
1860
1861     case OPT_gstabs:
1862     case OPT_gstabs_:
1863       set_debug_level (DBX_DEBUG, code == OPT_gstabs_, arg);
1864       break;
1865
1866     case OPT_gvms:
1867       set_debug_level (VMS_DEBUG, false, arg);
1868       break;
1869
1870     case OPT_gxcoff:
1871     case OPT_gxcoff_:
1872       set_debug_level (XCOFF_DEBUG, code == OPT_gxcoff_, arg);
1873       break;
1874
1875     case OPT_o:
1876       asm_file_name = arg;
1877       break;
1878
1879     case OPT_pedantic_errors:
1880       flag_pedantic_errors = pedantic = 1;
1881       break;
1882
1883     case OPT_floop_optimize:
1884     case OPT_frerun_loop_opt:
1885     case OPT_fstrength_reduce:
1886     case OPT_ftree_store_copy_prop:
1887     case OPT_fforce_addr:
1888       /* These are no-ops, preserved for backward compatibility.  */
1889       break;
1890
1891     default:
1892       /* If the flag was handled in a standard way, assume the lack of
1893          processing here is intentional.  */
1894       gcc_assert (cl_options[scode].flag_var);
1895       break;
1896     }
1897
1898   return 1;
1899 }
1900
1901 /* Handle --param NAME=VALUE.  */
1902 static void
1903 handle_param (const char *carg)
1904 {
1905   char *equal, *arg;
1906   int value;
1907
1908   arg = xstrdup (carg);
1909   equal = strchr (arg, '=');
1910   if (!equal)
1911     error ("%s: --param arguments should be of the form NAME=VALUE", arg);
1912   else
1913     {
1914       value = integral_argument (equal + 1);
1915       if (value == -1)
1916         error ("invalid --param value %qs", equal + 1);
1917       else
1918         {
1919           *equal = '\0';
1920           set_param_value (arg, value);
1921         }
1922     }
1923
1924   free (arg);
1925 }
1926
1927 /* Handle -W and -Wextra.  */
1928 static void
1929 set_Wextra (int setting)
1930 {
1931   extra_warnings = setting;
1932   warn_unused_parameter = (setting && maybe_warn_unused_parameter);
1933
1934   /* We save the value of warn_uninitialized, since if they put
1935      -Wuninitialized on the command line, we need to generate a
1936      warning about not using it without also specifying -O.  */
1937   if (setting == 0)
1938     warn_uninitialized = 0;
1939   else if (warn_uninitialized != 1)
1940     warn_uninitialized = 2;
1941 }
1942
1943 /* Initialize unused warning flags.  */
1944 void
1945 set_Wunused (int setting)
1946 {
1947   warn_unused_function = setting;
1948   warn_unused_label = setting;
1949   /* Unused function parameter warnings are reported when either
1950      ``-Wextra -Wunused'' or ``-Wunused-parameter'' is specified.
1951      Thus, if -Wextra has already been seen, set warn_unused_parameter;
1952      otherwise set maybe_warn_extra_parameter, which will be picked up
1953      by set_Wextra.  */
1954   maybe_warn_unused_parameter = setting;
1955   warn_unused_parameter = (setting && extra_warnings);
1956   warn_unused_variable = setting;
1957   warn_unused_value = setting;
1958 }
1959
1960 /* Used to set the level of strict aliasing warnings, 
1961    when no level is specified (i.e., when -Wstrict-aliasing, and not
1962    -Wstrict-aliasing=level was given).
1963    ONOFF is assumed to take value 1 when -Wstrict-aliasing is specified,
1964    and 0 otherwise.  After calling this function, wstrict_aliasing will be
1965    set to the default value of -Wstrict_aliasing=level, currently 3.  */
1966 void
1967 set_Wstrict_aliasing (int onoff)
1968 {
1969   gcc_assert (onoff == 0 || onoff == 1);
1970   if (onoff != 0)
1971     warn_strict_aliasing = 3;
1972 }
1973
1974 /* The following routines are useful in setting all the flags that
1975    -ffast-math and -fno-fast-math imply.  */
1976 void
1977 set_fast_math_flags (int set)
1978 {
1979   flag_unsafe_math_optimizations = set;
1980   set_unsafe_math_optimizations_flags (set);
1981   flag_finite_math_only = set;
1982   flag_errno_math = !set;
1983   if (set)
1984     {
1985       flag_signaling_nans = 0;
1986       flag_rounding_math = 0;
1987       flag_cx_limited_range = 1;
1988     }
1989 }
1990
1991 /* When -funsafe-math-optimizations is set the following 
1992    flags are set as well.  */ 
1993 void
1994 set_unsafe_math_optimizations_flags (int set)
1995 {
1996   flag_trapping_math = !set;
1997   flag_signed_zeros = !set;
1998   flag_associative_math = set;
1999   flag_reciprocal_math = set;
2000 }
2001
2002 /* Return true iff flags are set as if -ffast-math.  */
2003 bool
2004 fast_math_flags_set_p (void)
2005 {
2006   return (!flag_trapping_math
2007           && flag_unsafe_math_optimizations
2008           && flag_finite_math_only
2009           && !flag_signed_zeros
2010           && !flag_errno_math);
2011 }
2012
2013 /* Handle a debug output -g switch.  EXTENDED is true or false to support
2014    extended output (2 is special and means "-ggdb" was given).  */
2015 static void
2016 set_debug_level (enum debug_info_type type, int extended, const char *arg)
2017 {
2018   static bool type_explicit;
2019
2020   use_gnu_debug_info_extensions = extended;
2021
2022   if (type == NO_DEBUG)
2023     {
2024       if (write_symbols == NO_DEBUG)
2025         {
2026           write_symbols = PREFERRED_DEBUGGING_TYPE;
2027
2028           if (extended == 2)
2029             {
2030 #ifdef DWARF2_DEBUGGING_INFO
2031               write_symbols = DWARF2_DEBUG;
2032 #elif defined DBX_DEBUGGING_INFO
2033               write_symbols = DBX_DEBUG;
2034 #endif
2035             }
2036
2037           if (write_symbols == NO_DEBUG)
2038             warning (0, "target system does not support debug output");
2039         }
2040     }
2041   else
2042     {
2043       /* Does it conflict with an already selected type?  */
2044       if (type_explicit && write_symbols != NO_DEBUG && type != write_symbols)
2045         error ("debug format \"%s\" conflicts with prior selection",
2046                debug_type_names[type]);
2047       write_symbols = type;
2048       type_explicit = true;
2049     }
2050
2051   /* A debug flag without a level defaults to level 2.  */
2052   if (*arg == '\0')
2053     {
2054       if (!debug_info_level)
2055         debug_info_level = 2;
2056     }
2057   else
2058     {
2059       debug_info_level = integral_argument (arg);
2060       if (debug_info_level == (unsigned int) -1)
2061         error ("unrecognised debug output level \"%s\"", arg);
2062       else if (debug_info_level > 3)
2063         error ("debug output level %s is too high", arg);
2064     }
2065 }
2066
2067 /* Return 1 if OPTION is enabled, 0 if it is disabled, or -1 if it isn't
2068    a simple on-off switch.  */
2069
2070 int
2071 option_enabled (int opt_idx)
2072 {
2073   const struct cl_option *option = &(cl_options[opt_idx]);
2074
2075   if (option->flag_var)
2076     switch (option->var_type)
2077       {
2078       case CLVC_BOOLEAN:
2079         return *(int *) option->flag_var != 0;
2080
2081       case CLVC_EQUAL:
2082         return *(int *) option->flag_var == option->var_value;
2083
2084       case CLVC_BIT_CLEAR:
2085         return (*(int *) option->flag_var & option->var_value) == 0;
2086
2087       case CLVC_BIT_SET:
2088         return (*(int *) option->flag_var & option->var_value) != 0;
2089
2090       case CLVC_STRING:
2091         break;
2092       }
2093   return -1;
2094 }
2095
2096 /* Fill STATE with the current state of option OPTION.  Return true if
2097    there is some state to store.  */
2098
2099 bool
2100 get_option_state (int option, struct cl_option_state *state)
2101 {
2102   if (cl_options[option].flag_var == 0)
2103     return false;
2104
2105   switch (cl_options[option].var_type)
2106     {
2107     case CLVC_BOOLEAN:
2108     case CLVC_EQUAL:
2109       state->data = cl_options[option].flag_var;
2110       state->size = sizeof (int);
2111       break;
2112
2113     case CLVC_BIT_CLEAR:
2114     case CLVC_BIT_SET:
2115       state->ch = option_enabled (option);
2116       state->data = &state->ch;
2117       state->size = 1;
2118       break;
2119
2120     case CLVC_STRING:
2121       state->data = *(const char **) cl_options[option].flag_var;
2122       if (state->data == 0)
2123         state->data = "";
2124       state->size = strlen (state->data) + 1;
2125       break;
2126     }
2127   return true;
2128 }
2129
2130 /* Enable a warning option as an error.  This is used by -Werror= and
2131    also by legacy Werror-implicit-function-declaration.  */
2132
2133 void
2134 enable_warning_as_error (const char *arg, int value, unsigned int lang_mask)
2135 {
2136   char *new_option;
2137   int option_index;
2138
2139   new_option = XNEWVEC (char, strlen (arg) + 2);
2140   new_option[0] = 'W';
2141   strcpy (new_option + 1, arg);
2142   option_index = find_opt (new_option, lang_mask);
2143   if (option_index == N_OPTS)
2144     {
2145       error ("-Werror=%s: No option -%s", arg, new_option);
2146     }
2147   else
2148     {
2149       int kind = value ? DK_ERROR : DK_WARNING;
2150       diagnostic_classify_diagnostic (global_dc, option_index, kind);
2151       
2152       /* -Werror=foo implies -Wfoo.  */
2153       if (cl_options[option_index].var_type == CLVC_BOOLEAN
2154           && cl_options[option_index].flag_var
2155           && kind == DK_ERROR)
2156         *(int *) cl_options[option_index].flag_var = 1;
2157     }
2158   free (new_option);
2159 }