OSDN Git Service

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