OSDN Git Service

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