comparison gcc/opts.c @ 0:a06113de4d67

first commit
author kent <kent@cr.ie.u-ryukyu.ac.jp>
date Fri, 17 Jul 2009 14:47:48 +0900
parents
children 3bfb6c00c1e0
comparison
equal deleted inserted replaced
-1:000000000000 0:a06113de4d67
1 /* Command line option handling.
2 Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
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 "expr.h"
30 #include "ggc.h"
31 #include "output.h"
32 #include "langhooks.h"
33 #include "opts.h"
34 #include "options.h"
35 #include "flags.h"
36 #include "toplev.h"
37 #include "params.h"
38 #include "diagnostic.h"
39 #include "tm_p.h" /* For OPTIMIZATION_OPTIONS. */
40 #include "insn-attr.h" /* For INSN_SCHEDULING. */
41 #include "target.h"
42 #include "tree-pass.h"
43 #include "dbgcnt.h"
44 #include "debug.h"
45
46 /* Value of the -G xx switch, and whether it was passed or not. */
47 unsigned HOST_WIDE_INT g_switch_value;
48 bool g_switch_set;
49
50 /* Same for selective scheduling. */
51 bool sel_sched_switch_set;
52
53 /* True if we should exit after parsing options. */
54 bool exit_after_options;
55
56 /* Print various extra warnings. -W/-Wextra. */
57 bool extra_warnings;
58
59 /* True to warn about any objects definitions whose size is larger
60 than N bytes. Also want about function definitions whose returned
61 values are larger than N bytes, where N is `larger_than_size'. */
62 bool warn_larger_than;
63 HOST_WIDE_INT larger_than_size;
64
65 /* True to warn about any function whose frame size is larger
66 * than N bytes. */
67 bool warn_frame_larger_than;
68 HOST_WIDE_INT frame_larger_than_size;
69
70 /* Type(s) of debugging information we are producing (if any). See
71 flags.h for the definitions of the different possible types of
72 debugging information. */
73 enum debug_info_type write_symbols = NO_DEBUG;
74
75 /* Level of debugging information we are producing. See flags.h for
76 the definitions of the different possible levels. */
77 enum debug_info_level debug_info_level = DINFO_LEVEL_NONE;
78
79 /* A major contribution to object and executable size is debug
80 information size. A major contribution to debug information size
81 is struct descriptions replicated in several object files. The
82 following flags attempt to reduce this information. The basic
83 idea is to not emit struct debugging information in the current
84 compilation unit when that information will be generated by
85 another compilation unit.
86
87 Debug information for a struct defined in the current source
88 file should be generated in the object file. Likewise the
89 debug information for a struct defined in a header should be
90 generated in the object file of the corresponding source file.
91 Both of these case are handled when the base name of the file of
92 the struct definition matches the base name of the source file
93 of the current compilation unit. This matching emits minimal
94 struct debugging information.
95
96 The base file name matching rule above will fail to emit debug
97 information for structs defined in system headers. So a second
98 category of files includes system headers in addition to files
99 with matching bases.
100
101 The remaining types of files are library headers and application
102 headers. We cannot currently distinguish these two types. */
103
104 enum debug_struct_file
105 {
106 DINFO_STRUCT_FILE_NONE, /* Debug no structs. */
107 DINFO_STRUCT_FILE_BASE, /* Debug structs defined in files with the
108 same base name as the compilation unit. */
109 DINFO_STRUCT_FILE_SYS, /* Also debug structs defined in system
110 header files. */
111 DINFO_STRUCT_FILE_ANY /* Debug structs defined in all files. */
112 };
113
114 /* Generic structs (e.g. templates not explicitly specialized)
115 may not have a compilation unit associated with them, and so
116 may need to be treated differently from ordinary structs.
117
118 Structs only handled by reference (indirectly), will also usually
119 not need as much debugging information. */
120
121 static enum debug_struct_file debug_struct_ordinary[DINFO_USAGE_NUM_ENUMS]
122 = { DINFO_STRUCT_FILE_ANY, DINFO_STRUCT_FILE_ANY, DINFO_STRUCT_FILE_ANY };
123 static enum debug_struct_file debug_struct_generic[DINFO_USAGE_NUM_ENUMS]
124 = { DINFO_STRUCT_FILE_ANY, DINFO_STRUCT_FILE_ANY, DINFO_STRUCT_FILE_ANY };
125
126 /* Parse the -femit-struct-debug-detailed option value
127 and set the flag variables. */
128
129 #define MATCH( prefix, string ) \
130 ((strncmp (prefix, string, sizeof prefix - 1) == 0) \
131 ? ((string += sizeof prefix - 1), 1) : 0)
132
133 void
134 set_struct_debug_option (const char *spec)
135 {
136 /* various labels for comparison */
137 static char dfn_lbl[] = "dfn:", dir_lbl[] = "dir:", ind_lbl[] = "ind:";
138 static char ord_lbl[] = "ord:", gen_lbl[] = "gen:";
139 static char none_lbl[] = "none", any_lbl[] = "any";
140 static char base_lbl[] = "base", sys_lbl[] = "sys";
141
142 enum debug_struct_file files = DINFO_STRUCT_FILE_ANY;
143 /* Default is to apply to as much as possible. */
144 enum debug_info_usage usage = DINFO_USAGE_NUM_ENUMS;
145 int ord = 1, gen = 1;
146
147 /* What usage? */
148 if (MATCH (dfn_lbl, spec))
149 usage = DINFO_USAGE_DFN;
150 else if (MATCH (dir_lbl, spec))
151 usage = DINFO_USAGE_DIR_USE;
152 else if (MATCH (ind_lbl, spec))
153 usage = DINFO_USAGE_IND_USE;
154
155 /* Generics or not? */
156 if (MATCH (ord_lbl, spec))
157 gen = 0;
158 else if (MATCH (gen_lbl, spec))
159 ord = 0;
160
161 /* What allowable environment? */
162 if (MATCH (none_lbl, spec))
163 files = DINFO_STRUCT_FILE_NONE;
164 else if (MATCH (any_lbl, spec))
165 files = DINFO_STRUCT_FILE_ANY;
166 else if (MATCH (sys_lbl, spec))
167 files = DINFO_STRUCT_FILE_SYS;
168 else if (MATCH (base_lbl, spec))
169 files = DINFO_STRUCT_FILE_BASE;
170 else
171 error ("argument %qs to %<-femit-struct-debug-detailed%> not recognized",
172 spec);
173
174 /* Effect the specification. */
175 if (usage == DINFO_USAGE_NUM_ENUMS)
176 {
177 if (ord)
178 {
179 debug_struct_ordinary[DINFO_USAGE_DFN] = files;
180 debug_struct_ordinary[DINFO_USAGE_DIR_USE] = files;
181 debug_struct_ordinary[DINFO_USAGE_IND_USE] = files;
182 }
183 if (gen)
184 {
185 debug_struct_generic[DINFO_USAGE_DFN] = files;
186 debug_struct_generic[DINFO_USAGE_DIR_USE] = files;
187 debug_struct_generic[DINFO_USAGE_IND_USE] = files;
188 }
189 }
190 else
191 {
192 if (ord)
193 debug_struct_ordinary[usage] = files;
194 if (gen)
195 debug_struct_generic[usage] = files;
196 }
197
198 if (*spec == ',')
199 set_struct_debug_option (spec+1);
200 else
201 {
202 /* No more -femit-struct-debug-detailed specifications.
203 Do final checks. */
204 if (*spec != '\0')
205 error ("argument %qs to %<-femit-struct-debug-detailed%> unknown",
206 spec);
207 if (debug_struct_ordinary[DINFO_USAGE_DIR_USE]
208 < debug_struct_ordinary[DINFO_USAGE_IND_USE]
209 || debug_struct_generic[DINFO_USAGE_DIR_USE]
210 < debug_struct_generic[DINFO_USAGE_IND_USE])
211 error ("%<-femit-struct-debug-detailed=dir:...%> must allow at least"
212 " as much as %<-femit-struct-debug-detailed=ind:...%>");
213 }
214 }
215
216 /* Find the base name of a path, stripping off both directories and
217 a single final extension. */
218 static int
219 base_of_path (const char *path, const char **base_out)
220 {
221 const char *base = path;
222 const char *dot = 0;
223 const char *p = path;
224 char c = *p;
225 while (c)
226 {
227 if (IS_DIR_SEPARATOR(c))
228 {
229 base = p + 1;
230 dot = 0;
231 }
232 else if (c == '.')
233 dot = p;
234 c = *++p;
235 }
236 if (!dot)
237 dot = p;
238 *base_out = base;
239 return dot - base;
240 }
241
242 /* Match the base name of a file to the base name of a compilation unit. */
243
244 static const char *main_input_basename;
245 static int main_input_baselength;
246
247 static int
248 matches_main_base (const char *path)
249 {
250 /* Cache the last query. */
251 static const char *last_path = NULL;
252 static int last_match = 0;
253 if (path != last_path)
254 {
255 const char *base;
256 int length = base_of_path (path, &base);
257 last_path = path;
258 last_match = (length == main_input_baselength
259 && memcmp (base, main_input_basename, length) == 0);
260 }
261 return last_match;
262 }
263
264 #ifdef DEBUG_DEBUG_STRUCT
265
266 static int
267 dump_struct_debug (tree type, enum debug_info_usage usage,
268 enum debug_struct_file criterion, int generic,
269 int matches, int result)
270 {
271 /* Find the type name. */
272 tree type_decl = TYPE_STUB_DECL (type);
273 tree t = type_decl;
274 const char *name = 0;
275 if (TREE_CODE (t) == TYPE_DECL)
276 t = DECL_NAME (t);
277 if (t)
278 name = IDENTIFIER_POINTER (t);
279
280 fprintf (stderr, " struct %d %s %s %s %s %d %p %s\n",
281 criterion,
282 DECL_IN_SYSTEM_HEADER (type_decl) ? "sys" : "usr",
283 matches ? "bas" : "hdr",
284 generic ? "gen" : "ord",
285 usage == DINFO_USAGE_DFN ? ";" :
286 usage == DINFO_USAGE_DIR_USE ? "." : "*",
287 result,
288 (void*) type_decl, name);
289 return result;
290 }
291 #define DUMP_GSTRUCT(type, usage, criterion, generic, matches, result) \
292 dump_struct_debug (type, usage, criterion, generic, matches, result)
293
294 #else
295
296 #define DUMP_GSTRUCT(type, usage, criterion, generic, matches, result) \
297 (result)
298
299 #endif
300
301
302 bool
303 should_emit_struct_debug (tree type, enum debug_info_usage usage)
304 {
305 enum debug_struct_file criterion;
306 tree type_decl;
307 bool generic = lang_hooks.types.generic_p (type);
308
309 if (generic)
310 criterion = debug_struct_generic[usage];
311 else
312 criterion = debug_struct_ordinary[usage];
313
314 if (criterion == DINFO_STRUCT_FILE_NONE)
315 return DUMP_GSTRUCT (type, usage, criterion, generic, false, false);
316 if (criterion == DINFO_STRUCT_FILE_ANY)
317 return DUMP_GSTRUCT (type, usage, criterion, generic, false, true);
318
319 type_decl = TYPE_STUB_DECL (type);
320
321 if (criterion == DINFO_STRUCT_FILE_SYS && DECL_IN_SYSTEM_HEADER (type_decl))
322 return DUMP_GSTRUCT (type, usage, criterion, generic, false, true);
323
324 if (matches_main_base (DECL_SOURCE_FILE (type_decl)))
325 return DUMP_GSTRUCT (type, usage, criterion, generic, true, true);
326 return DUMP_GSTRUCT (type, usage, criterion, generic, false, false);
327 }
328
329 /* Nonzero means use GNU-only extensions in the generated symbolic
330 debugging information. Currently, this only has an effect when
331 write_symbols is set to DBX_DEBUG, XCOFF_DEBUG, or DWARF_DEBUG. */
332 bool use_gnu_debug_info_extensions;
333
334 /* The default visibility for all symbols (unless overridden) */
335 enum symbol_visibility default_visibility = VISIBILITY_DEFAULT;
336
337 /* Global visibility options. */
338 struct visibility_flags visibility_options;
339
340 /* What to print when a switch has no documentation. */
341 #ifdef ENABLE_CHECKING
342 static const char undocumented_msg[] = N_("This switch lacks documentation");
343 #else
344 static const char undocumented_msg[] = "";
345 #endif
346
347 /* Used for bookkeeping on whether user set these flags so
348 -fprofile-use/-fprofile-generate does not use them. */
349 static bool profile_arc_flag_set, flag_profile_values_set;
350 static bool flag_unroll_loops_set, flag_tracer_set;
351 static bool flag_value_profile_transformations_set;
352 static bool flag_peel_loops_set, flag_branch_probabilities_set;
353 static bool flag_inline_functions_set, flag_ipa_cp_set, flag_ipa_cp_clone_set;
354 static bool flag_predictive_commoning_set, flag_unswitch_loops_set, flag_gcse_after_reload_set;
355
356 /* Functions excluded from profiling. */
357
358 typedef char *char_p; /* For DEF_VEC_P. */
359 DEF_VEC_P(char_p);
360 DEF_VEC_ALLOC_P(char_p,heap);
361
362 static VEC(char_p,heap) *flag_instrument_functions_exclude_functions;
363 static VEC(char_p,heap) *flag_instrument_functions_exclude_files;
364
365 typedef const char *const_char_p; /* For DEF_VEC_P. */
366 DEF_VEC_P(const_char_p);
367 DEF_VEC_ALLOC_P(const_char_p,heap);
368
369 static VEC(const_char_p,heap) *ignored_options;
370
371 /* Input file names. */
372 const char **in_fnames;
373 unsigned num_in_fnames;
374
375 static int common_handle_option (size_t scode, const char *arg, int value,
376 unsigned int lang_mask);
377 static void handle_param (const char *);
378 static void set_Wextra (int);
379 static unsigned int handle_option (const char **argv, unsigned int lang_mask);
380 static char *write_langs (unsigned int lang_mask);
381 static void complain_wrong_lang (const char *, const struct cl_option *,
382 unsigned int lang_mask);
383 static void handle_options (unsigned int, const char **, unsigned int);
384 static void set_debug_level (enum debug_info_type type, int extended,
385 const char *arg);
386
387 /* If ARG is a non-negative integer made up solely of digits, return its
388 value, otherwise return -1. */
389 static int
390 integral_argument (const char *arg)
391 {
392 const char *p = arg;
393
394 while (*p && ISDIGIT (*p))
395 p++;
396
397 if (*p == '\0')
398 return atoi (arg);
399
400 return -1;
401 }
402
403 /* Return a malloced slash-separated list of languages in MASK. */
404 static char *
405 write_langs (unsigned int mask)
406 {
407 unsigned int n = 0, len = 0;
408 const char *lang_name;
409 char *result;
410
411 for (n = 0; (lang_name = lang_names[n]) != 0; n++)
412 if (mask & (1U << n))
413 len += strlen (lang_name) + 1;
414
415 result = XNEWVEC (char, len);
416 len = 0;
417 for (n = 0; (lang_name = lang_names[n]) != 0; n++)
418 if (mask & (1U << n))
419 {
420 if (len)
421 result[len++] = '/';
422 strcpy (result + len, lang_name);
423 len += strlen (lang_name);
424 }
425
426 result[len] = 0;
427
428 return result;
429 }
430
431 /* Complain that switch OPT_INDEX does not apply to this front end. */
432 static void
433 complain_wrong_lang (const char *text, const struct cl_option *option,
434 unsigned int lang_mask)
435 {
436 char *ok_langs, *bad_lang;
437
438 ok_langs = write_langs (option->flags);
439 bad_lang = write_langs (lang_mask);
440
441 /* Eventually this should become a hard error IMO. */
442 warning (0, "command line option \"%s\" is valid for %s but not for %s",
443 text, ok_langs, bad_lang);
444
445 free (ok_langs);
446 free (bad_lang);
447 }
448
449 /* Buffer the unknown option described by the string OPT. Currently,
450 we only complain about unknown -Wno-* options if they may have
451 prevented a diagnostic. Otherwise, we just ignore them.
452 Note that if we do complain, it is only as a warning, not an error;
453 passing the compiler an unrecognised -Wno-* option should never
454 change whether the compilation succeeds or fails. */
455
456 static void postpone_unknown_option_warning(const char *opt)
457 {
458 VEC_safe_push (const_char_p, heap, ignored_options, opt);
459 }
460
461 /* Produce a warning 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 warning (0, "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 warnings for unknown -Wno-* options
511 unless we issue diagnostics. */
512 postpone_unknown_option_warning (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 comma-separated strings to a char_p vector. */
659
660 static void
661 add_comma_separated_to_vector (VEC(char_p,heap) **pvec, const char* arg)
662 {
663 char *tmp;
664 char *r;
665 char *w;
666 char *token_start;
667
668 /* We never free this string. */
669 tmp = xstrdup (arg);
670
671 r = tmp;
672 w = tmp;
673 token_start = tmp;
674
675 while (*r != '\0')
676 {
677 if (*r == ',')
678 {
679 *w++ = '\0';
680 ++r;
681 VEC_safe_push (char_p, heap, *pvec, token_start);
682 token_start = w;
683 }
684 if (*r == '\\' && r[1] == ',')
685 {
686 *w++ = ',';
687 r += 2;
688 }
689 else
690 *w++ = *r++;
691 }
692 if (*token_start != '\0')
693 VEC_safe_push (char_p, heap, *pvec, token_start);
694 }
695
696 /* Return whether we should exclude FNDECL from instrumentation. */
697
698 bool
699 flag_instrument_functions_exclude_p (tree fndecl)
700 {
701 if (VEC_length (char_p, flag_instrument_functions_exclude_functions) > 0)
702 {
703 const char *name;
704 int i;
705 char *s;
706
707 name = lang_hooks.decl_printable_name (fndecl, 0);
708 for (i = 0;
709 VEC_iterate (char_p, flag_instrument_functions_exclude_functions,
710 i, s);
711 ++i)
712 {
713 if (strstr (name, s) != NULL)
714 return true;
715 }
716 }
717
718 if (VEC_length (char_p, flag_instrument_functions_exclude_files) > 0)
719 {
720 const char *name;
721 int i;
722 char *s;
723
724 name = DECL_SOURCE_FILE (fndecl);
725 for (i = 0;
726 VEC_iterate (char_p, flag_instrument_functions_exclude_files, i, s);
727 ++i)
728 {
729 if (strstr (name, s) != NULL)
730 return true;
731 }
732 }
733
734 return false;
735 }
736
737
738 /* Decode and handle the vector of command line options. LANG_MASK
739 contains has a single bit set representing the current
740 language. */
741 static void
742 handle_options (unsigned int argc, const char **argv, unsigned int lang_mask)
743 {
744 unsigned int n, i;
745
746 for (i = 1; i < argc; i += n)
747 {
748 const char *opt = argv[i];
749
750 /* Interpret "-" or a non-switch as a file name. */
751 if (opt[0] != '-' || opt[1] == '\0')
752 {
753 if (main_input_filename == NULL)
754 {
755 main_input_filename = opt;
756 main_input_baselength
757 = base_of_path (main_input_filename, &main_input_basename);
758 }
759 add_input_filename (opt);
760 n = 1;
761 continue;
762 }
763
764 n = handle_option (argv + i, lang_mask);
765
766 if (!n)
767 {
768 n = 1;
769 error ("unrecognized command line option \"%s\"", opt);
770 }
771 }
772 }
773
774 /* Parse command line options and set default flag values. Do minimal
775 options processing. */
776 void
777 decode_options (unsigned int argc, const char **argv)
778 {
779 static bool first_time_p = true;
780 static int initial_max_aliased_vops;
781 static int initial_avg_aliased_vops;
782 static int initial_min_crossjump_insns;
783 static int initial_max_fields_for_field_sensitive;
784 static int initial_loop_invariant_max_bbs_in_loop;
785 static unsigned int initial_lang_mask;
786
787 unsigned int i, lang_mask;
788 int opt1;
789 int opt2;
790 int opt3;
791 int opt1_max;
792
793 if (first_time_p)
794 {
795 /* Perform language-specific options initialization. */
796 initial_lang_mask = lang_mask = lang_hooks.init_options (argc, argv);
797
798 lang_hooks.initialize_diagnostics (global_dc);
799
800 /* Save initial values of parameters we reset. */
801 initial_max_aliased_vops = MAX_ALIASED_VOPS;
802 initial_avg_aliased_vops = AVG_ALIASED_VOPS;
803 initial_min_crossjump_insns
804 = compiler_params[PARAM_MIN_CROSSJUMP_INSNS].value;
805 initial_max_fields_for_field_sensitive
806 = compiler_params[PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE].value;
807 initial_loop_invariant_max_bbs_in_loop
808 = compiler_params[PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP].value;
809 }
810 else
811 lang_mask = initial_lang_mask;
812
813 /* Scan to see what optimization level has been specified. That will
814 determine the default value of many flags. */
815 for (i = 1; i < argc; i++)
816 {
817 if (!strcmp (argv[i], "-O"))
818 {
819 optimize = 1;
820 optimize_size = 0;
821 }
822 else if (argv[i][0] == '-' && argv[i][1] == 'O')
823 {
824 /* Handle -Os, -O2, -O3, -O69, ... */
825 const char *p = &argv[i][2];
826
827 if ((p[0] == 's') && (p[1] == 0))
828 {
829 optimize_size = 1;
830
831 /* Optimizing for size forces optimize to be 2. */
832 optimize = 2;
833 }
834 else
835 {
836 const int optimize_val = read_integral_parameter (p, p - 2, -1);
837 if (optimize_val != -1)
838 {
839 optimize = optimize_val;
840 optimize_size = 0;
841 }
842 }
843 }
844 }
845
846 /* Use priority coloring if cover classes is not defined for the
847 target. */
848 if (targetm.ira_cover_classes == NULL)
849 flag_ira_algorithm = IRA_ALGORITHM_PRIORITY;
850
851 /* -O1 optimizations. */
852 opt1 = (optimize >= 1);
853 flag_defer_pop = opt1;
854 #ifdef DELAY_SLOTS
855 flag_delayed_branch = opt1;
856 #endif
857 #ifdef CAN_DEBUG_WITHOUT_FP
858 flag_omit_frame_pointer = opt1;
859 #endif
860 flag_guess_branch_prob = opt1;
861 flag_cprop_registers = opt1;
862 flag_if_conversion = opt1;
863 flag_if_conversion2 = opt1;
864 flag_ipa_pure_const = opt1;
865 flag_ipa_reference = opt1;
866 flag_merge_constants = opt1;
867 flag_split_wide_types = opt1;
868 flag_tree_ccp = opt1;
869 flag_tree_dce = opt1;
870 flag_tree_dom = opt1;
871 flag_tree_dse = opt1;
872 flag_tree_ter = opt1;
873 flag_tree_sra = opt1;
874 flag_tree_copyrename = opt1;
875 flag_tree_fre = opt1;
876 flag_tree_copy_prop = opt1;
877 flag_tree_sink = opt1;
878 flag_tree_ch = opt1;
879
880 /* -O2 optimizations. */
881 opt2 = (optimize >= 2);
882 flag_inline_small_functions = opt2;
883 flag_indirect_inlining = opt2;
884 flag_thread_jumps = opt2;
885 flag_crossjumping = opt2;
886 flag_optimize_sibling_calls = opt2;
887 flag_forward_propagate = opt2;
888 flag_cse_follow_jumps = opt2;
889 flag_gcse = opt2;
890 flag_expensive_optimizations = opt2;
891 flag_rerun_cse_after_loop = opt2;
892 flag_caller_saves = opt2;
893 flag_peephole2 = opt2;
894 #ifdef INSN_SCHEDULING
895 flag_schedule_insns = opt2;
896 flag_schedule_insns_after_reload = opt2;
897 #endif
898 flag_regmove = opt2;
899 flag_strict_aliasing = opt2;
900 flag_strict_overflow = opt2;
901 flag_delete_null_pointer_checks = opt2;
902 flag_reorder_blocks = opt2;
903 flag_reorder_functions = opt2;
904 flag_tree_vrp = opt2;
905 flag_tree_builtin_call_dce = opt2;
906 flag_tree_pre = opt2;
907 flag_tree_switch_conversion = 1;
908 flag_ipa_cp = opt2;
909
910 /* Allow more virtual operators to increase alias precision. */
911
912 set_param_value ("max-aliased-vops",
913 (opt2) ? 500 : initial_max_aliased_vops);
914
915 /* Track fields in field-sensitive alias analysis. */
916 set_param_value ("max-fields-for-field-sensitive",
917 (opt2) ? 100 : initial_max_fields_for_field_sensitive);
918
919 /* For -O1 only do loop invariant motion for very small loops. */
920 set_param_value ("loop-invariant-max-bbs-in-loop",
921 (opt2) ? initial_loop_invariant_max_bbs_in_loop : 1000);
922
923 /* -O3 optimizations. */
924 opt3 = (optimize >= 3);
925 flag_predictive_commoning = opt3;
926 flag_inline_functions = opt3;
927 flag_unswitch_loops = opt3;
928 flag_gcse_after_reload = opt3;
929 flag_tree_vectorize = opt3;
930 flag_ipa_cp_clone = opt3;
931 if (flag_ipa_cp_clone)
932 flag_ipa_cp = 1;
933
934 /* Allow even more virtual operators. Max-aliased-vops was set above for
935 -O2, so don't reset it unless we are at -O3. */
936 if (opt3)
937 set_param_value ("max-aliased-vops", 1000);
938
939 set_param_value ("avg-aliased-vops", (opt3) ? 3 : initial_avg_aliased_vops);
940
941 /* Just -O1/-O0 optimizations. */
942 opt1_max = (optimize <= 1);
943 align_loops = opt1_max;
944 align_jumps = opt1_max;
945 align_labels = opt1_max;
946 align_functions = opt1_max;
947
948 if (optimize_size)
949 {
950 /* Inlining of functions reducing size is a good idea regardless of them
951 being declared inline. */
952 flag_inline_functions = 1;
953
954 /* Basic optimization options. */
955 optimize_size = 1;
956 if (optimize > 2)
957 optimize = 2;
958
959 /* We want to crossjump as much as possible. */
960 set_param_value ("min-crossjump-insns", 1);
961 }
962 else
963 set_param_value ("min-crossjump-insns", initial_min_crossjump_insns);
964
965 if (first_time_p)
966 {
967 /* Initialize whether `char' is signed. */
968 flag_signed_char = DEFAULT_SIGNED_CHAR;
969 /* Set this to a special "uninitialized" value. The actual default is
970 set after target options have been processed. */
971 flag_short_enums = 2;
972
973 /* Initialize target_flags before OPTIMIZATION_OPTIONS so the latter can
974 modify it. */
975 target_flags = targetm.default_target_flags;
976
977 /* Some targets have ABI-specified unwind tables. */
978 flag_unwind_tables = targetm.unwind_tables_default;
979 }
980
981 #ifdef OPTIMIZATION_OPTIONS
982 /* Allow default optimizations to be specified on a per-machine basis. */
983 OPTIMIZATION_OPTIONS (optimize, optimize_size);
984 #endif
985
986 handle_options (argc, argv, lang_mask);
987
988 /* Handle related options for unit-at-a-time, toplevel-reorder, and
989 section-anchors. */
990 if (!flag_unit_at_a_time)
991 {
992 if (flag_section_anchors == 1)
993 error ("Section anchors must be disabled when unit-at-a-time "
994 "is disabled.");
995 flag_section_anchors = 0;
996 if (flag_toplevel_reorder == 1)
997 error ("Toplevel reorder must be disabled when unit-at-a-time "
998 "is disabled.");
999 flag_toplevel_reorder = 0;
1000 }
1001 /* Unless the user has asked for section anchors, we disable toplevel
1002 reordering at -O0 to disable transformations that might be surprising
1003 to end users and to get -fno-toplevel-reorder tested. */
1004 if (!optimize && flag_toplevel_reorder == 2 && flag_section_anchors != 1)
1005 {
1006 flag_toplevel_reorder = 0;
1007 flag_section_anchors = 0;
1008 }
1009 if (!flag_toplevel_reorder)
1010 {
1011 if (flag_section_anchors == 1)
1012 error ("section anchors must be disabled when toplevel reorder"
1013 " is disabled");
1014 flag_section_anchors = 0;
1015 }
1016
1017 if (first_time_p)
1018 {
1019 if (flag_pie)
1020 flag_pic = flag_pie;
1021 if (flag_pic && !flag_pie)
1022 flag_shlib = 1;
1023 }
1024
1025 if (optimize == 0)
1026 {
1027 /* Inlining does not work if not optimizing,
1028 so force it not to be done. */
1029 warn_inline = 0;
1030 flag_no_inline = 1;
1031 }
1032
1033 /* The optimization to partition hot and cold basic blocks into separate
1034 sections of the .o and executable files does not work (currently)
1035 with exception handling. This is because there is no support for
1036 generating unwind info. If flag_exceptions is turned on we need to
1037 turn off the partitioning optimization. */
1038
1039 if (flag_exceptions && flag_reorder_blocks_and_partition)
1040 {
1041 inform (input_location,
1042 "-freorder-blocks-and-partition does not work with exceptions");
1043 flag_reorder_blocks_and_partition = 0;
1044 flag_reorder_blocks = 1;
1045 }
1046
1047 /* If user requested unwind info, then turn off the partitioning
1048 optimization. */
1049
1050 if (flag_unwind_tables && ! targetm.unwind_tables_default
1051 && flag_reorder_blocks_and_partition)
1052 {
1053 inform (input_location, "-freorder-blocks-and-partition does not support unwind info");
1054 flag_reorder_blocks_and_partition = 0;
1055 flag_reorder_blocks = 1;
1056 }
1057
1058 /* If the target requested unwind info, then turn off the partitioning
1059 optimization with a different message. Likewise, if the target does not
1060 support named sections. */
1061
1062 if (flag_reorder_blocks_and_partition
1063 && (!targetm.have_named_sections
1064 || (flag_unwind_tables && targetm.unwind_tables_default)))
1065 {
1066 inform (input_location,
1067 "-freorder-blocks-and-partition does not work on this architecture");
1068 flag_reorder_blocks_and_partition = 0;
1069 flag_reorder_blocks = 1;
1070 }
1071
1072 /* Pipelining of outer loops is only possible when general pipelining
1073 capabilities are requested. */
1074 if (!flag_sel_sched_pipelining)
1075 flag_sel_sched_pipelining_outer_loops = 0;
1076
1077 if (!targetm.ira_cover_classes
1078 && flag_ira_algorithm == IRA_ALGORITHM_CB)
1079 {
1080 inform (input_location,
1081 "-fira-algorithm=CB does not work on this architecture");
1082 flag_ira_algorithm = IRA_ALGORITHM_PRIORITY;
1083 }
1084
1085 /* Save the current optimization options if this is the first call. */
1086 if (first_time_p)
1087 {
1088 optimization_default_node = build_optimization_node ();
1089 optimization_current_node = optimization_default_node;
1090 first_time_p = false;
1091 }
1092 if (flag_conserve_stack)
1093 {
1094 if (!PARAM_SET_P (PARAM_LARGE_STACK_FRAME))
1095 PARAM_VALUE (PARAM_LARGE_STACK_FRAME) = 100;
1096 if (!PARAM_SET_P (PARAM_STACK_FRAME_GROWTH))
1097 PARAM_VALUE (PARAM_STACK_FRAME_GROWTH) = 40;
1098 }
1099
1100 }
1101
1102 #define LEFT_COLUMN 27
1103
1104 /* Output ITEM, of length ITEM_WIDTH, in the left column,
1105 followed by word-wrapped HELP in a second column. */
1106 static void
1107 wrap_help (const char *help,
1108 const char *item,
1109 unsigned int item_width,
1110 unsigned int columns)
1111 {
1112 unsigned int col_width = LEFT_COLUMN;
1113 unsigned int remaining, room, len;
1114
1115 remaining = strlen (help);
1116
1117 do
1118 {
1119 room = columns - 3 - MAX (col_width, item_width);
1120 if (room > columns)
1121 room = 0;
1122 len = remaining;
1123
1124 if (room < len)
1125 {
1126 unsigned int i;
1127
1128 for (i = 0; help[i]; i++)
1129 {
1130 if (i >= room && len != remaining)
1131 break;
1132 if (help[i] == ' ')
1133 len = i;
1134 else if ((help[i] == '-' || help[i] == '/')
1135 && help[i + 1] != ' '
1136 && i > 0 && ISALPHA (help[i - 1]))
1137 len = i + 1;
1138 }
1139 }
1140
1141 printf( " %-*.*s %.*s\n", col_width, item_width, item, len, help);
1142 item_width = 0;
1143 while (help[len] == ' ')
1144 len++;
1145 help += len;
1146 remaining -= len;
1147 }
1148 while (remaining);
1149 }
1150
1151 /* Print help for a specific front-end, etc. */
1152 static void
1153 print_filtered_help (unsigned int include_flags,
1154 unsigned int exclude_flags,
1155 unsigned int any_flags,
1156 unsigned int columns)
1157 {
1158 unsigned int i;
1159 const char *help;
1160 static char *printed = NULL;
1161 bool found = false;
1162 bool displayed = false;
1163
1164 if (include_flags == CL_PARAMS)
1165 {
1166 for (i = 0; i < LAST_PARAM; i++)
1167 {
1168 const char *param = compiler_params[i].option;
1169
1170 help = compiler_params[i].help;
1171 if (help == NULL || *help == '\0')
1172 {
1173 if (exclude_flags & CL_UNDOCUMENTED)
1174 continue;
1175 help = undocumented_msg;
1176 }
1177
1178 /* Get the translation. */
1179 help = _(help);
1180
1181 wrap_help (help, param, strlen (param), columns);
1182 }
1183 putchar ('\n');
1184 return;
1185 }
1186
1187 if (!printed)
1188 printed = XCNEWVAR (char, cl_options_count);
1189
1190 for (i = 0; i < cl_options_count; i++)
1191 {
1192 static char new_help[128];
1193 const struct cl_option *option = cl_options + i;
1194 unsigned int len;
1195 const char *opt;
1196 const char *tab;
1197
1198 if (include_flags == 0
1199 || ((option->flags & include_flags) != include_flags))
1200 {
1201 if ((option->flags & any_flags) == 0)
1202 continue;
1203 }
1204
1205 /* Skip unwanted switches. */
1206 if ((option->flags & exclude_flags) != 0)
1207 continue;
1208
1209 found = true;
1210 /* Skip switches that have already been printed. */
1211 if (printed[i])
1212 continue;
1213
1214 printed[i] = true;
1215
1216 help = option->help;
1217 if (help == NULL)
1218 {
1219 if (exclude_flags & CL_UNDOCUMENTED)
1220 continue;
1221 help = undocumented_msg;
1222 }
1223
1224 /* Get the translation. */
1225 help = _(help);
1226
1227 /* Find the gap between the name of the
1228 option and its descriptive text. */
1229 tab = strchr (help, '\t');
1230 if (tab)
1231 {
1232 len = tab - help;
1233 opt = help;
1234 help = tab + 1;
1235 }
1236 else
1237 {
1238 opt = option->opt_text;
1239 len = strlen (opt);
1240 }
1241
1242 /* With the -Q option enabled we change the descriptive text associated
1243 with an option to be an indication of its current setting. */
1244 if (!quiet_flag)
1245 {
1246 if (len < (LEFT_COLUMN + 2))
1247 strcpy (new_help, "\t\t");
1248 else
1249 strcpy (new_help, "\t");
1250
1251 if (option->flag_var != NULL)
1252 {
1253 if (option->flags & CL_JOINED)
1254 {
1255 if (option->var_type == CLVC_STRING)
1256 {
1257 if (* (const char **) option->flag_var != NULL)
1258 snprintf (new_help + strlen (new_help),
1259 sizeof (new_help) - strlen (new_help),
1260 * (const char **) option->flag_var);
1261 }
1262 else
1263 sprintf (new_help + strlen (new_help),
1264 "%#x", * (int *) option->flag_var);
1265 }
1266 else
1267 strcat (new_help, option_enabled (i)
1268 ? _("[enabled]") : _("[disabled]"));
1269 }
1270
1271 help = new_help;
1272 }
1273
1274 wrap_help (help, opt, len, columns);
1275 displayed = true;
1276 }
1277
1278 if (! found)
1279 {
1280 unsigned int langs = include_flags & CL_LANG_ALL;
1281
1282 if (langs == 0)
1283 printf (_(" No options with the desired characteristics were found\n"));
1284 else
1285 {
1286 unsigned int i;
1287
1288 /* PR 31349: Tell the user how to see all of the
1289 options supported by a specific front end. */
1290 for (i = 0; (1U << i) < CL_LANG_ALL; i ++)
1291 if ((1U << i) & langs)
1292 printf (_(" None found. Use --help=%s to show *all* the options supported by the %s front-end\n"),
1293 lang_names[i], lang_names[i]);
1294 }
1295
1296 }
1297 else if (! displayed)
1298 printf (_(" All options with the desired characteristics have already been displayed\n"));
1299
1300 putchar ('\n');
1301 }
1302
1303 /* Display help for a specified type of option.
1304 The options must have ALL of the INCLUDE_FLAGS set
1305 ANY of the flags in the ANY_FLAGS set
1306 and NONE of the EXCLUDE_FLAGS set. */
1307 static void
1308 print_specific_help (unsigned int include_flags,
1309 unsigned int exclude_flags,
1310 unsigned int any_flags)
1311 {
1312 unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1313 const char * description = NULL;
1314 const char * descrip_extra = "";
1315 size_t i;
1316 unsigned int flag;
1317 static unsigned int columns = 0;
1318
1319 /* Sanity check: Make sure that we do not have more
1320 languages than we have bits available to enumerate them. */
1321 gcc_assert ((1U << cl_lang_count) < CL_MIN_OPTION_CLASS);
1322
1323 /* If we have not done so already, obtain
1324 the desired maximum width of the output. */
1325 if (columns == 0)
1326 {
1327 const char *p;
1328
1329 GET_ENVIRONMENT (p, "COLUMNS");
1330 if (p != NULL)
1331 {
1332 int value = atoi (p);
1333
1334 if (value > 0)
1335 columns = value;
1336 }
1337
1338 if (columns == 0)
1339 /* Use a reasonable default. */
1340 columns = 80;
1341 }
1342
1343 /* Decide upon the title for the options that we are going to display. */
1344 for (i = 0, flag = 1; flag <= CL_MAX_OPTION_CLASS; flag <<= 1, i ++)
1345 {
1346 switch (flag & include_flags)
1347 {
1348 case 0:
1349 break;
1350
1351 case CL_TARGET:
1352 description = _("The following options are target specific");
1353 break;
1354 case CL_WARNING:
1355 description = _("The following options control compiler warning messages");
1356 break;
1357 case CL_OPTIMIZATION:
1358 description = _("The following options control optimizations");
1359 break;
1360 case CL_COMMON:
1361 description = _("The following options are language-independent");
1362 break;
1363 case CL_PARAMS:
1364 description = _("The --param option recognizes the following as parameters");
1365 break;
1366 default:
1367 if (i >= cl_lang_count)
1368 break;
1369 if (exclude_flags & all_langs_mask)
1370 description = _("The following options are specific to just the language ");
1371 else
1372 description = _("The following options are supported by the language ");
1373 descrip_extra = lang_names [i];
1374 break;
1375 }
1376 }
1377
1378 if (description == NULL)
1379 {
1380 if (any_flags == 0)
1381 {
1382 if (include_flags & CL_UNDOCUMENTED)
1383 description = _("The following options are not documented");
1384 else if (include_flags & CL_SEPARATE)
1385 description = _("The following options take separate arguments");
1386 else if (include_flags & CL_JOINED)
1387 description = _("The following options take joined arguments");
1388 else
1389 {
1390 internal_error ("unrecognized include_flags 0x%x passed to print_specific_help",
1391 include_flags);
1392 return;
1393 }
1394 }
1395 else
1396 {
1397 if (any_flags & all_langs_mask)
1398 description = _("The following options are language-related");
1399 else
1400 description = _("The following options are language-independent");
1401 }
1402 }
1403
1404 printf ("%s%s:\n", description, descrip_extra);
1405 print_filtered_help (include_flags, exclude_flags, any_flags, columns);
1406 }
1407
1408 /* Handle target- and language-independent options. Return zero to
1409 generate an "unknown option" message. Only options that need
1410 extra handling need to be listed here; if you simply want
1411 VALUE assigned to a variable, it happens automatically. */
1412
1413 static int
1414 common_handle_option (size_t scode, const char *arg, int value,
1415 unsigned int lang_mask)
1416 {
1417 static bool verbose = false;
1418 enum opt_code code = (enum opt_code) scode;
1419
1420 switch (code)
1421 {
1422 case OPT__param:
1423 handle_param (arg);
1424 break;
1425
1426 case OPT_v:
1427 verbose = true;
1428 break;
1429
1430 case OPT_fhelp:
1431 case OPT__help:
1432 {
1433 unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
1434 unsigned int undoc_mask;
1435 unsigned int i;
1436
1437 undoc_mask = (verbose | extra_warnings) ? 0 : CL_UNDOCUMENTED;
1438 /* First display any single language specific options. */
1439 for (i = 0; i < cl_lang_count; i++)
1440 print_specific_help
1441 (1U << i, (all_langs_mask & (~ (1U << i))) | undoc_mask, 0);
1442 /* Next display any multi language specific options. */
1443 print_specific_help (0, undoc_mask, all_langs_mask);
1444 /* Then display any remaining, non-language options. */
1445 for (i = CL_MIN_OPTION_CLASS; i <= CL_MAX_OPTION_CLASS; i <<= 1)
1446 print_specific_help (i, undoc_mask, 0);
1447 exit_after_options = true;
1448 break;
1449 }
1450
1451 case OPT_ftarget_help:
1452 case OPT__target_help:
1453 print_specific_help (CL_TARGET, CL_UNDOCUMENTED, 0);
1454 exit_after_options = true;
1455
1456 /* Allow the target a chance to give the user some additional information. */
1457 if (targetm.target_help)
1458 targetm.target_help ();
1459 break;
1460
1461 case OPT_fhelp_:
1462 case OPT__help_:
1463 {
1464 const char * a = arg;
1465 unsigned int include_flags = 0;
1466 /* Note - by default we include undocumented options when listing
1467 specific classes. If you only want to see documented options
1468 then add ",^undocumented" to the --help= option. E.g.:
1469
1470 --help=target,^undocumented */
1471 unsigned int exclude_flags = 0;
1472
1473 /* Walk along the argument string, parsing each word in turn.
1474 The format is:
1475 arg = [^]{word}[,{arg}]
1476 word = {optimizers|target|warnings|undocumented|
1477 params|common|<language>} */
1478 while (* a != 0)
1479 {
1480 static struct
1481 {
1482 const char * string;
1483 unsigned int flag;
1484 }
1485 specifics[] =
1486 {
1487 { "optimizers", CL_OPTIMIZATION },
1488 { "target", CL_TARGET },
1489 { "warnings", CL_WARNING },
1490 { "undocumented", CL_UNDOCUMENTED },
1491 { "params", CL_PARAMS },
1492 { "joined", CL_JOINED },
1493 { "separate", CL_SEPARATE },
1494 { "common", CL_COMMON },
1495 { NULL, 0 }
1496 };
1497 unsigned int * pflags;
1498 char * comma;
1499 unsigned int lang_flag, specific_flag;
1500 unsigned int len;
1501 unsigned int i;
1502
1503 if (* a == '^')
1504 {
1505 ++ a;
1506 pflags = & exclude_flags;
1507 }
1508 else
1509 pflags = & include_flags;
1510
1511 comma = strchr (a, ',');
1512 if (comma == NULL)
1513 len = strlen (a);
1514 else
1515 len = comma - a;
1516 if (len == 0)
1517 {
1518 a = comma + 1;
1519 continue;
1520 }
1521
1522 /* Check to see if the string matches an option class name. */
1523 for (i = 0, specific_flag = 0; specifics[i].string != NULL; i++)
1524 if (strncasecmp (a, specifics[i].string, len) == 0)
1525 {
1526 specific_flag = specifics[i].flag;
1527 break;
1528 }
1529
1530 /* Check to see if the string matches a language name.
1531 Note - we rely upon the alpha-sorted nature of the entries in
1532 the lang_names array, specifically that shorter names appear
1533 before their longer variants. (i.e. C before C++). That way
1534 when we are attempting to match --help=c for example we will
1535 match with C first and not C++. */
1536 for (i = 0, lang_flag = 0; i < cl_lang_count; i++)
1537 if (strncasecmp (a, lang_names[i], len) == 0)
1538 {
1539 lang_flag = 1U << i;
1540 break;
1541 }
1542
1543 if (specific_flag != 0)
1544 {
1545 if (lang_flag == 0)
1546 * pflags |= specific_flag;
1547 else
1548 {
1549 /* The option's argument matches both the start of a
1550 language name and the start of an option class name.
1551 We have a special case for when the user has
1552 specified "--help=c", but otherwise we have to issue
1553 a warning. */
1554 if (strncasecmp (a, "c", len) == 0)
1555 * pflags |= lang_flag;
1556 else
1557 fnotice (stderr,
1558 "warning: --help argument %.*s is ambiguous, please be more specific\n",
1559 len, a);
1560 }
1561 }
1562 else if (lang_flag != 0)
1563 * pflags |= lang_flag;
1564 else
1565 fnotice (stderr,
1566 "warning: unrecognized argument to --help= option: %.*s\n",
1567 len, a);
1568
1569 if (comma == NULL)
1570 break;
1571 a = comma + 1;
1572 }
1573
1574 if (include_flags)
1575 print_specific_help (include_flags, exclude_flags, 0);
1576 exit_after_options = true;
1577 break;
1578 }
1579
1580 case OPT__version:
1581 print_version (stderr, "");
1582 exit_after_options = true;
1583 break;
1584
1585 case OPT_G:
1586 g_switch_value = value;
1587 g_switch_set = true;
1588 break;
1589
1590 case OPT_O:
1591 case OPT_Os:
1592 /* Currently handled in a prescan. */
1593 break;
1594
1595 case OPT_W:
1596 /* For backward compatibility, -W is the same as -Wextra. */
1597 set_Wextra (value);
1598 break;
1599
1600 case OPT_Werror_:
1601 enable_warning_as_error (arg, value, lang_mask);
1602 break;
1603
1604 case OPT_Wextra:
1605 set_Wextra (value);
1606 break;
1607
1608 case OPT_Wlarger_than_:
1609 /* This form corresponds to -Wlarger-than-.
1610 Kept for backward compatibility.
1611 Don't use it as the first argument of warning(). */
1612
1613 case OPT_Wlarger_than_eq:
1614 larger_than_size = value;
1615 warn_larger_than = value != -1;
1616 break;
1617
1618 case OPT_Wframe_larger_than_:
1619 frame_larger_than_size = value;
1620 warn_frame_larger_than = value != -1;
1621 break;
1622
1623 case OPT_Wstrict_aliasing:
1624 set_Wstrict_aliasing (value);
1625 break;
1626
1627 case OPT_Wstrict_aliasing_:
1628 warn_strict_aliasing = value;
1629 break;
1630
1631 case OPT_Wstrict_overflow:
1632 warn_strict_overflow = (value
1633 ? (int) WARN_STRICT_OVERFLOW_CONDITIONAL
1634 : 0);
1635 break;
1636
1637 case OPT_Wstrict_overflow_:
1638 warn_strict_overflow = value;
1639 break;
1640
1641 case OPT_Wunused:
1642 warn_unused = value;
1643 break;
1644
1645 case OPT_aux_info:
1646 case OPT_aux_info_:
1647 aux_info_file_name = arg;
1648 flag_gen_aux_info = 1;
1649 break;
1650
1651 case OPT_auxbase:
1652 aux_base_name = arg;
1653 break;
1654
1655 case OPT_auxbase_strip:
1656 {
1657 char *tmp = xstrdup (arg);
1658 strip_off_ending (tmp, strlen (tmp));
1659 if (tmp[0])
1660 aux_base_name = tmp;
1661 }
1662 break;
1663
1664 case OPT_d:
1665 decode_d_option (arg);
1666 break;
1667
1668 case OPT_dumpbase:
1669 dump_base_name = arg;
1670 break;
1671
1672 case OPT_falign_functions_:
1673 align_functions = value;
1674 break;
1675
1676 case OPT_falign_jumps_:
1677 align_jumps = value;
1678 break;
1679
1680 case OPT_falign_labels_:
1681 align_labels = value;
1682 break;
1683
1684 case OPT_falign_loops_:
1685 align_loops = value;
1686 break;
1687
1688 case OPT_fbranch_probabilities:
1689 flag_branch_probabilities_set = true;
1690 break;
1691
1692 case OPT_fcall_used_:
1693 fix_register (arg, 0, 1);
1694 break;
1695
1696 case OPT_fcall_saved_:
1697 fix_register (arg, 0, 0);
1698 break;
1699
1700 case OPT_fdbg_cnt_:
1701 dbg_cnt_process_opt (arg);
1702 break;
1703
1704 case OPT_fdbg_cnt_list:
1705 dbg_cnt_list_all_counters ();
1706 break;
1707
1708 case OPT_fdebug_prefix_map_:
1709 add_debug_prefix_map (arg);
1710 break;
1711
1712 case OPT_fdiagnostics_show_location_:
1713 if (!strcmp (arg, "once"))
1714 diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
1715 else if (!strcmp (arg, "every-line"))
1716 diagnostic_prefixing_rule (global_dc)
1717 = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE;
1718 else
1719 return 0;
1720 break;
1721
1722 case OPT_fdiagnostics_show_option:
1723 global_dc->show_option_requested = true;
1724 break;
1725
1726 case OPT_fdump_:
1727 if (!dump_switch_p (arg))
1728 return 0;
1729 break;
1730
1731 case OPT_ffast_math:
1732 set_fast_math_flags (value);
1733 break;
1734
1735 case OPT_funsafe_math_optimizations:
1736 set_unsafe_math_optimizations_flags (value);
1737 break;
1738
1739 case OPT_ffixed_:
1740 fix_register (arg, 1, 1);
1741 break;
1742
1743 case OPT_finline_limit_:
1744 case OPT_finline_limit_eq:
1745 set_param_value ("max-inline-insns-single", value / 2);
1746 set_param_value ("max-inline-insns-auto", value / 2);
1747 break;
1748
1749 case OPT_finstrument_functions_exclude_function_list_:
1750 add_comma_separated_to_vector
1751 (&flag_instrument_functions_exclude_functions, arg);
1752 break;
1753
1754 case OPT_finstrument_functions_exclude_file_list_:
1755 add_comma_separated_to_vector
1756 (&flag_instrument_functions_exclude_files, arg);
1757 break;
1758
1759 case OPT_fmessage_length_:
1760 pp_set_line_maximum_length (global_dc->printer, value);
1761 break;
1762
1763 case OPT_fpack_struct_:
1764 if (value <= 0 || (value & (value - 1)) || value > 16)
1765 error ("structure alignment must be a small power of two, not %d", value);
1766 else
1767 {
1768 initial_max_fld_align = value;
1769 maximum_field_alignment = value * BITS_PER_UNIT;
1770 }
1771 break;
1772
1773 case OPT_fpeel_loops:
1774 flag_peel_loops_set = true;
1775 break;
1776
1777 case OPT_fprofile_arcs:
1778 profile_arc_flag_set = true;
1779 break;
1780
1781 case OPT_finline_functions:
1782 flag_inline_functions_set = true;
1783 break;
1784
1785 case OPT_fprofile_dir_:
1786 profile_data_prefix = xstrdup (arg);
1787 break;
1788
1789 case OPT_fprofile_use_:
1790 profile_data_prefix = xstrdup (arg);
1791 flag_profile_use = true;
1792 value = true;
1793 /* No break here - do -fprofile-use processing. */
1794 case OPT_fprofile_use:
1795 if (!flag_branch_probabilities_set)
1796 flag_branch_probabilities = value;
1797 if (!flag_profile_values_set)
1798 flag_profile_values = value;
1799 if (!flag_unroll_loops_set)
1800 flag_unroll_loops = value;
1801 if (!flag_peel_loops_set)
1802 flag_peel_loops = value;
1803 if (!flag_tracer_set)
1804 flag_tracer = value;
1805 if (!flag_value_profile_transformations_set)
1806 flag_value_profile_transformations = value;
1807 if (!flag_inline_functions_set)
1808 flag_inline_functions = value;
1809 if (!flag_ipa_cp_set)
1810 flag_ipa_cp = value;
1811 if (!flag_ipa_cp_clone_set
1812 && value && flag_ipa_cp)
1813 flag_ipa_cp_clone = value;
1814 if (!flag_predictive_commoning_set)
1815 flag_predictive_commoning = value;
1816 if (!flag_unswitch_loops_set)
1817 flag_unswitch_loops = value;
1818 if (!flag_gcse_after_reload_set)
1819 flag_gcse_after_reload = value;
1820 break;
1821
1822 case OPT_fprofile_generate_:
1823 profile_data_prefix = xstrdup (arg);
1824 value = true;
1825 /* No break here - do -fprofile-generate processing. */
1826 case OPT_fprofile_generate:
1827 if (!profile_arc_flag_set)
1828 profile_arc_flag = value;
1829 if (!flag_profile_values_set)
1830 flag_profile_values = value;
1831 if (!flag_value_profile_transformations_set)
1832 flag_value_profile_transformations = value;
1833 if (!flag_inline_functions_set)
1834 flag_inline_functions = value;
1835 break;
1836
1837 case OPT_fprofile_values:
1838 flag_profile_values_set = true;
1839 break;
1840
1841 case OPT_fvisibility_:
1842 {
1843 if (!strcmp(arg, "default"))
1844 default_visibility = VISIBILITY_DEFAULT;
1845 else if (!strcmp(arg, "internal"))
1846 default_visibility = VISIBILITY_INTERNAL;
1847 else if (!strcmp(arg, "hidden"))
1848 default_visibility = VISIBILITY_HIDDEN;
1849 else if (!strcmp(arg, "protected"))
1850 default_visibility = VISIBILITY_PROTECTED;
1851 else
1852 error ("unrecognized visibility value \"%s\"", arg);
1853 }
1854 break;
1855
1856 case OPT_fvpt:
1857 flag_value_profile_transformations_set = true;
1858 break;
1859
1860 case OPT_frandom_seed:
1861 /* The real switch is -fno-random-seed. */
1862 if (value)
1863 return 0;
1864 set_random_seed (NULL);
1865 break;
1866
1867 case OPT_frandom_seed_:
1868 set_random_seed (arg);
1869 break;
1870
1871 case OPT_fselective_scheduling:
1872 case OPT_fselective_scheduling2:
1873 sel_sched_switch_set = true;
1874 break;
1875
1876 case OPT_fsched_verbose_:
1877 #ifdef INSN_SCHEDULING
1878 fix_sched_param ("verbose", arg);
1879 break;
1880 #else
1881 return 0;
1882 #endif
1883
1884 case OPT_fsched_stalled_insns_:
1885 flag_sched_stalled_insns = value;
1886 if (flag_sched_stalled_insns == 0)
1887 flag_sched_stalled_insns = -1;
1888 break;
1889
1890 case OPT_fsched_stalled_insns_dep_:
1891 flag_sched_stalled_insns_dep = value;
1892 break;
1893
1894 case OPT_fstack_check_:
1895 if (!strcmp (arg, "no"))
1896 flag_stack_check = NO_STACK_CHECK;
1897 else if (!strcmp (arg, "generic"))
1898 /* This is the old stack checking method. */
1899 flag_stack_check = STACK_CHECK_BUILTIN
1900 ? FULL_BUILTIN_STACK_CHECK
1901 : GENERIC_STACK_CHECK;
1902 else if (!strcmp (arg, "specific"))
1903 /* This is the new stack checking method. */
1904 flag_stack_check = STACK_CHECK_BUILTIN
1905 ? FULL_BUILTIN_STACK_CHECK
1906 : STACK_CHECK_STATIC_BUILTIN
1907 ? STATIC_BUILTIN_STACK_CHECK
1908 : GENERIC_STACK_CHECK;
1909 else
1910 warning (0, "unknown stack check parameter \"%s\"", arg);
1911 break;
1912
1913 case OPT_fstack_check:
1914 /* This is the same as the "specific" mode above. */
1915 if (value)
1916 flag_stack_check = STACK_CHECK_BUILTIN
1917 ? FULL_BUILTIN_STACK_CHECK
1918 : STACK_CHECK_STATIC_BUILTIN
1919 ? STATIC_BUILTIN_STACK_CHECK
1920 : GENERIC_STACK_CHECK;
1921 else
1922 flag_stack_check = NO_STACK_CHECK;
1923 break;
1924
1925 case OPT_fstack_limit:
1926 /* The real switch is -fno-stack-limit. */
1927 if (value)
1928 return 0;
1929 stack_limit_rtx = NULL_RTX;
1930 break;
1931
1932 case OPT_fstack_limit_register_:
1933 {
1934 int reg = decode_reg_name (arg);
1935 if (reg < 0)
1936 error ("unrecognized register name \"%s\"", arg);
1937 else
1938 stack_limit_rtx = gen_rtx_REG (Pmode, reg);
1939 }
1940 break;
1941
1942 case OPT_fstack_limit_symbol_:
1943 stack_limit_rtx = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (arg));
1944 break;
1945
1946 case OPT_ftree_vectorizer_verbose_:
1947 vect_set_verbosity_level (arg);
1948 break;
1949
1950 case OPT_ftls_model_:
1951 if (!strcmp (arg, "global-dynamic"))
1952 flag_tls_default = TLS_MODEL_GLOBAL_DYNAMIC;
1953 else if (!strcmp (arg, "local-dynamic"))
1954 flag_tls_default = TLS_MODEL_LOCAL_DYNAMIC;
1955 else if (!strcmp (arg, "initial-exec"))
1956 flag_tls_default = TLS_MODEL_INITIAL_EXEC;
1957 else if (!strcmp (arg, "local-exec"))
1958 flag_tls_default = TLS_MODEL_LOCAL_EXEC;
1959 else
1960 warning (0, "unknown tls-model \"%s\"", arg);
1961 break;
1962
1963 case OPT_fira_algorithm_:
1964 if (!strcmp (arg, "CB"))
1965 flag_ira_algorithm = IRA_ALGORITHM_CB;
1966 else if (!strcmp (arg, "priority"))
1967 flag_ira_algorithm = IRA_ALGORITHM_PRIORITY;
1968 else
1969 warning (0, "unknown ira algorithm \"%s\"", arg);
1970 break;
1971
1972 case OPT_fira_region_:
1973 if (!strcmp (arg, "one"))
1974 flag_ira_region = IRA_REGION_ONE;
1975 else if (!strcmp (arg, "all"))
1976 flag_ira_region = IRA_REGION_ALL;
1977 else if (!strcmp (arg, "mixed"))
1978 flag_ira_region = IRA_REGION_MIXED;
1979 else
1980 warning (0, "unknown ira region \"%s\"", arg);
1981 break;
1982
1983 case OPT_fira_verbose_:
1984 flag_ira_verbose = value;
1985 break;
1986
1987 case OPT_ftracer:
1988 flag_tracer_set = true;
1989 break;
1990
1991 case OPT_fipa_cp:
1992 flag_ipa_cp_set = true;
1993 break;
1994
1995 case OPT_fipa_cp_clone:
1996 flag_ipa_cp_clone_set = true;
1997 break;
1998
1999 case OPT_fpredictive_commoning:
2000 flag_predictive_commoning_set = true;
2001 break;
2002
2003 case OPT_funswitch_loops:
2004 flag_unswitch_loops_set = true;
2005 break;
2006
2007 case OPT_fgcse_after_reload:
2008 flag_gcse_after_reload_set = true;
2009 break;
2010
2011 case OPT_funroll_loops:
2012 flag_unroll_loops_set = true;
2013 break;
2014
2015 case OPT_g:
2016 set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, arg);
2017 break;
2018
2019 case OPT_gcoff:
2020 set_debug_level (SDB_DEBUG, false, arg);
2021 break;
2022
2023 case OPT_gdwarf_2:
2024 set_debug_level (DWARF2_DEBUG, false, arg);
2025 break;
2026
2027 case OPT_ggdb:
2028 set_debug_level (NO_DEBUG, 2, arg);
2029 break;
2030
2031 case OPT_gstabs:
2032 case OPT_gstabs_:
2033 set_debug_level (DBX_DEBUG, code == OPT_gstabs_, arg);
2034 break;
2035
2036 case OPT_gvms:
2037 set_debug_level (VMS_DEBUG, false, arg);
2038 break;
2039
2040 case OPT_gxcoff:
2041 case OPT_gxcoff_:
2042 set_debug_level (XCOFF_DEBUG, code == OPT_gxcoff_, arg);
2043 break;
2044
2045 case OPT_o:
2046 asm_file_name = arg;
2047 break;
2048
2049 case OPT_pedantic_errors:
2050 flag_pedantic_errors = pedantic = 1;
2051 break;
2052
2053 case OPT_floop_optimize:
2054 case OPT_frerun_loop_opt:
2055 case OPT_fstrength_reduce:
2056 case OPT_ftree_store_copy_prop:
2057 case OPT_fforce_addr:
2058 case OPT_ftree_salias:
2059 case OPT_ftree_store_ccp:
2060 /* These are no-ops, preserved for backward compatibility. */
2061 break;
2062
2063 default:
2064 /* If the flag was handled in a standard way, assume the lack of
2065 processing here is intentional. */
2066 gcc_assert (cl_options[scode].flag_var);
2067 break;
2068 }
2069
2070 return 1;
2071 }
2072
2073 /* Handle --param NAME=VALUE. */
2074 static void
2075 handle_param (const char *carg)
2076 {
2077 char *equal, *arg;
2078 int value;
2079
2080 arg = xstrdup (carg);
2081 equal = strchr (arg, '=');
2082 if (!equal)
2083 error ("%s: --param arguments should be of the form NAME=VALUE", arg);
2084 else
2085 {
2086 value = integral_argument (equal + 1);
2087 if (value == -1)
2088 error ("invalid --param value %qs", equal + 1);
2089 else
2090 {
2091 *equal = '\0';
2092 set_param_value (arg, value);
2093 }
2094 }
2095
2096 free (arg);
2097 }
2098
2099 /* Handle -W and -Wextra. */
2100 static void
2101 set_Wextra (int setting)
2102 {
2103 extra_warnings = setting;
2104
2105 /* We save the value of warn_uninitialized, since if they put
2106 -Wuninitialized on the command line, we need to generate a
2107 warning about not using it without also specifying -O. */
2108 if (setting == 0)
2109 warn_uninitialized = 0;
2110 else if (warn_uninitialized != 1)
2111 warn_uninitialized = 2;
2112 }
2113
2114 /* Used to set the level of strict aliasing warnings,
2115 when no level is specified (i.e., when -Wstrict-aliasing, and not
2116 -Wstrict-aliasing=level was given).
2117 ONOFF is assumed to take value 1 when -Wstrict-aliasing is specified,
2118 and 0 otherwise. After calling this function, wstrict_aliasing will be
2119 set to the default value of -Wstrict_aliasing=level, currently 3. */
2120 void
2121 set_Wstrict_aliasing (int onoff)
2122 {
2123 gcc_assert (onoff == 0 || onoff == 1);
2124 if (onoff != 0)
2125 warn_strict_aliasing = 3;
2126 else
2127 warn_strict_aliasing = 0;
2128 }
2129
2130 /* The following routines are useful in setting all the flags that
2131 -ffast-math and -fno-fast-math imply. */
2132 void
2133 set_fast_math_flags (int set)
2134 {
2135 flag_unsafe_math_optimizations = set;
2136 set_unsafe_math_optimizations_flags (set);
2137 flag_finite_math_only = set;
2138 flag_errno_math = !set;
2139 if (set)
2140 {
2141 flag_signaling_nans = 0;
2142 flag_rounding_math = 0;
2143 flag_cx_limited_range = 1;
2144 }
2145 }
2146
2147 /* When -funsafe-math-optimizations is set the following
2148 flags are set as well. */
2149 void
2150 set_unsafe_math_optimizations_flags (int set)
2151 {
2152 flag_trapping_math = !set;
2153 flag_signed_zeros = !set;
2154 flag_associative_math = set;
2155 flag_reciprocal_math = set;
2156 }
2157
2158 /* Return true iff flags are set as if -ffast-math. */
2159 bool
2160 fast_math_flags_set_p (void)
2161 {
2162 return (!flag_trapping_math
2163 && flag_unsafe_math_optimizations
2164 && flag_finite_math_only
2165 && !flag_signed_zeros
2166 && !flag_errno_math);
2167 }
2168
2169 /* Return true iff flags are set as if -ffast-math but using the flags stored
2170 in the struct cl_optimization structure. */
2171 bool
2172 fast_math_flags_struct_set_p (struct cl_optimization *opt)
2173 {
2174 return (!opt->flag_trapping_math
2175 && opt->flag_unsafe_math_optimizations
2176 && opt->flag_finite_math_only
2177 && !opt->flag_signed_zeros
2178 && !opt->flag_errno_math);
2179 }
2180
2181 /* Handle a debug output -g switch. EXTENDED is true or false to support
2182 extended output (2 is special and means "-ggdb" was given). */
2183 static void
2184 set_debug_level (enum debug_info_type type, int extended, const char *arg)
2185 {
2186 static bool type_explicit;
2187
2188 use_gnu_debug_info_extensions = extended;
2189
2190 if (type == NO_DEBUG)
2191 {
2192 if (write_symbols == NO_DEBUG)
2193 {
2194 write_symbols = PREFERRED_DEBUGGING_TYPE;
2195
2196 if (extended == 2)
2197 {
2198 #ifdef DWARF2_DEBUGGING_INFO
2199 write_symbols = DWARF2_DEBUG;
2200 #elif defined DBX_DEBUGGING_INFO
2201 write_symbols = DBX_DEBUG;
2202 #endif
2203 }
2204
2205 if (write_symbols == NO_DEBUG)
2206 warning (0, "target system does not support debug output");
2207 }
2208 }
2209 else
2210 {
2211 /* Does it conflict with an already selected type? */
2212 if (type_explicit && write_symbols != NO_DEBUG && type != write_symbols)
2213 error ("debug format \"%s\" conflicts with prior selection",
2214 debug_type_names[type]);
2215 write_symbols = type;
2216 type_explicit = true;
2217 }
2218
2219 /* A debug flag without a level defaults to level 2. */
2220 if (*arg == '\0')
2221 {
2222 if (!debug_info_level)
2223 debug_info_level = 2;
2224 }
2225 else
2226 {
2227 debug_info_level = integral_argument (arg);
2228 if (debug_info_level == (unsigned int) -1)
2229 error ("unrecognised debug output level \"%s\"", arg);
2230 else if (debug_info_level > 3)
2231 error ("debug output level %s is too high", arg);
2232 }
2233 }
2234
2235 /* Return 1 if OPTION is enabled, 0 if it is disabled, or -1 if it isn't
2236 a simple on-off switch. */
2237
2238 int
2239 option_enabled (int opt_idx)
2240 {
2241 const struct cl_option *option = &(cl_options[opt_idx]);
2242
2243 if (option->flag_var)
2244 switch (option->var_type)
2245 {
2246 case CLVC_BOOLEAN:
2247 return *(int *) option->flag_var != 0;
2248
2249 case CLVC_EQUAL:
2250 return *(int *) option->flag_var == option->var_value;
2251
2252 case CLVC_BIT_CLEAR:
2253 return (*(int *) option->flag_var & option->var_value) == 0;
2254
2255 case CLVC_BIT_SET:
2256 return (*(int *) option->flag_var & option->var_value) != 0;
2257
2258 case CLVC_STRING:
2259 break;
2260 }
2261 return -1;
2262 }
2263
2264 /* Fill STATE with the current state of option OPTION. Return true if
2265 there is some state to store. */
2266
2267 bool
2268 get_option_state (int option, struct cl_option_state *state)
2269 {
2270 if (cl_options[option].flag_var == 0)
2271 return false;
2272
2273 switch (cl_options[option].var_type)
2274 {
2275 case CLVC_BOOLEAN:
2276 case CLVC_EQUAL:
2277 state->data = cl_options[option].flag_var;
2278 state->size = sizeof (int);
2279 break;
2280
2281 case CLVC_BIT_CLEAR:
2282 case CLVC_BIT_SET:
2283 state->ch = option_enabled (option);
2284 state->data = &state->ch;
2285 state->size = 1;
2286 break;
2287
2288 case CLVC_STRING:
2289 state->data = *(const char **) cl_options[option].flag_var;
2290 if (state->data == 0)
2291 state->data = "";
2292 state->size = strlen ((const char *) state->data) + 1;
2293 break;
2294 }
2295 return true;
2296 }
2297
2298 /* Enable a warning option as an error. This is used by -Werror= and
2299 also by legacy Werror-implicit-function-declaration. */
2300
2301 void
2302 enable_warning_as_error (const char *arg, int value, unsigned int lang_mask)
2303 {
2304 char *new_option;
2305 int option_index;
2306
2307 new_option = XNEWVEC (char, strlen (arg) + 2);
2308 new_option[0] = 'W';
2309 strcpy (new_option + 1, arg);
2310 option_index = find_opt (new_option, lang_mask);
2311 if (option_index == N_OPTS)
2312 {
2313 error ("-Werror=%s: No option -%s", arg, new_option);
2314 }
2315 else
2316 {
2317 int kind = value ? DK_ERROR : DK_WARNING;
2318 diagnostic_classify_diagnostic (global_dc, option_index, kind);
2319
2320 /* -Werror=foo implies -Wfoo. */
2321 if (cl_options[option_index].var_type == CLVC_BOOLEAN
2322 && cl_options[option_index].flag_var
2323 && kind == DK_ERROR)
2324 *(int *) cl_options[option_index].flag_var = 1;
2325 }
2326 free (new_option);
2327 }