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