OSDN Git Service

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