class.c (check_bases): Likewise.
[official-gcc.git] / gcc / c-opts.c
blobd2df8605ae2422ae76d823579aecaa7135a98142
1 /* C/ObjC/C++ command line option handling.
2 Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
3 Contributed by Neil Booth.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to the Free
19 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
20 02110-1301, USA. */
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "tree.h"
27 #include "c-common.h"
28 #include "c-pragma.h"
29 #include "flags.h"
30 #include "toplev.h"
31 #include "langhooks.h"
32 #include "tree-inline.h"
33 #include "diagnostic.h"
34 #include "intl.h"
35 #include "cppdefault.h"
36 #include "c-incpath.h"
37 #include "debug.h" /* For debug_hooks. */
38 #include "opts.h"
39 #include "options.h"
40 #include "mkdeps.h"
42 #ifndef DOLLARS_IN_IDENTIFIERS
43 # define DOLLARS_IN_IDENTIFIERS true
44 #endif
46 #ifndef TARGET_SYSTEM_ROOT
47 # define TARGET_SYSTEM_ROOT NULL
48 #endif
50 #ifndef TARGET_OPTF
51 #define TARGET_OPTF(ARG)
52 #endif
54 /* CPP's options. */
55 static cpp_options *cpp_opts;
57 /* Input filename. */
58 static const char *this_input_filename;
60 /* Filename and stream for preprocessed output. */
61 static const char *out_fname;
62 static FILE *out_stream;
64 /* Append dependencies to deps_file. */
65 static bool deps_append;
67 /* If dependency switches (-MF etc.) have been given. */
68 static bool deps_seen;
70 /* If -v seen. */
71 static bool verbose;
73 /* If -lang-fortran seen. */
74 static bool lang_fortran = false;
76 /* Dependency output file. */
77 static const char *deps_file;
79 /* The prefix given by -iprefix, if any. */
80 static const char *iprefix;
82 /* The multilib directory given by -imultilib, if any. */
83 static const char *imultilib;
85 /* The system root, if any. Overridden by -isysroot. */
86 static const char *sysroot = TARGET_SYSTEM_ROOT;
88 /* Zero disables all standard directories for headers. */
89 static bool std_inc = true;
91 /* Zero disables the C++-specific standard directories for headers. */
92 static bool std_cxx_inc = true;
94 /* If the quote chain has been split by -I-. */
95 static bool quote_chain_split;
97 /* If -Wunused-macros. */
98 static bool warn_unused_macros;
100 /* If -Wvariadic-macros. */
101 static bool warn_variadic_macros = true;
103 /* Number of deferred options. */
104 static size_t deferred_count;
106 /* Number of deferred options scanned for -include. */
107 static size_t include_cursor;
109 static void set_Wimplicit (int);
110 static void handle_OPT_d (const char *);
111 static void set_std_cxx98 (int);
112 static void set_std_c89 (int, int);
113 static void set_std_c99 (int);
114 static void check_deps_environment_vars (void);
115 static void handle_deferred_opts (void);
116 static void sanitize_cpp_opts (void);
117 static void add_prefixed_path (const char *, size_t);
118 static void push_command_line_include (void);
119 static void cb_file_change (cpp_reader *, const struct line_map *);
120 static void cb_dir_change (cpp_reader *, const char *);
121 static void finish_options (void);
123 #ifndef STDC_0_IN_SYSTEM_HEADERS
124 #define STDC_0_IN_SYSTEM_HEADERS 0
125 #endif
127 /* Holds switches parsed by c_common_handle_option (), but whose
128 handling is deferred to c_common_post_options (). */
129 static void defer_opt (enum opt_code, const char *);
130 static struct deferred_opt
132 enum opt_code code;
133 const char *arg;
134 } *deferred_opts;
136 /* Complain that switch CODE expects an argument but none was
137 provided. OPT was the command-line option. Return FALSE to get
138 the default message in opts.c, TRUE if we provide a specialized
139 one. */
140 bool
141 c_common_missing_argument (const char *opt, size_t code)
143 switch (code)
145 default:
146 /* Pick up the default message. */
147 return false;
149 case OPT_fconstant_string_class_:
150 error ("no class name specified with %qs", opt);
151 break;
153 case OPT_A:
154 error ("assertion missing after %qs", opt);
155 break;
157 case OPT_D:
158 case OPT_U:
159 error ("macro name missing after %qs", opt);
160 break;
162 case OPT_F:
163 case OPT_I:
164 case OPT_idirafter:
165 case OPT_isysroot:
166 case OPT_isystem:
167 case OPT_iquote:
168 error ("missing path after %qs", opt);
169 break;
171 case OPT_MF:
172 case OPT_MD:
173 case OPT_MMD:
174 case OPT_include:
175 case OPT_imacros:
176 case OPT_o:
177 error ("missing filename after %qs", opt);
178 break;
180 case OPT_MQ:
181 case OPT_MT:
182 error ("missing makefile target after %qs", opt);
183 break;
186 return true;
189 /* Defer option CODE with argument ARG. */
190 static void
191 defer_opt (enum opt_code code, const char *arg)
193 deferred_opts[deferred_count].code = code;
194 deferred_opts[deferred_count].arg = arg;
195 deferred_count++;
198 /* Common initialization before parsing options. */
199 unsigned int
200 c_common_init_options (unsigned int argc, const char **argv)
202 static const unsigned int lang_flags[] = {CL_C, CL_ObjC, CL_CXX, CL_ObjCXX};
203 unsigned int i, result;
205 /* This is conditionalized only because that is the way the front
206 ends used to do it. Maybe this should be unconditional? */
207 if (c_dialect_cxx ())
209 /* By default wrap lines at 80 characters. Is getenv
210 ("COLUMNS") preferable? */
211 diagnostic_line_cutoff (global_dc) = 80;
212 /* By default, emit location information once for every
213 diagnostic message. */
214 diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
217 parse_in = cpp_create_reader (c_dialect_cxx () ? CLK_GNUCXX: CLK_GNUC89,
218 ident_hash, &line_table);
220 cpp_opts = cpp_get_options (parse_in);
221 cpp_opts->dollars_in_ident = DOLLARS_IN_IDENTIFIERS;
222 cpp_opts->objc = c_dialect_objc ();
224 /* Reset to avoid warnings on internal definitions. We set it just
225 before passing on command-line options to cpplib. */
226 cpp_opts->warn_dollars = 0;
228 flag_const_strings = c_dialect_cxx ();
229 flag_exceptions = c_dialect_cxx ();
230 warn_pointer_arith = c_dialect_cxx ();
232 deferred_opts = XNEWVEC (struct deferred_opt, argc);
234 result = lang_flags[c_language];
236 if (c_language == clk_c)
238 /* If preprocessing assembly language, accept any of the C-family
239 front end options since the driver may pass them through. */
240 for (i = 1; i < argc; i++)
241 if (! strcmp (argv[i], "-lang-asm"))
243 result |= CL_C | CL_ObjC | CL_CXX | CL_ObjCXX;
244 break;
247 #ifdef CL_Fortran
248 for (i = 1; i < argc; i++)
249 if (! strcmp (argv[i], "-lang-fortran"))
251 result |= CL_Fortran;
252 break;
254 #endif
257 return result;
260 /* Handle switch SCODE with argument ARG. VALUE is true, unless no-
261 form of an -f or -W option was given. Returns 0 if the switch was
262 invalid, a negative number to prevent language-independent
263 processing in toplev.c (a hack necessary for the short-term). */
265 c_common_handle_option (size_t scode, const char *arg, int value)
267 const struct cl_option *option = &cl_options[scode];
268 enum opt_code code = (enum opt_code) scode;
269 int result = 1;
271 switch (code)
273 default:
274 if (cl_options[code].flags & (CL_C | CL_CXX | CL_ObjC | CL_ObjCXX))
275 break;
276 #ifdef CL_Fortran
277 if (lang_fortran && (cl_options[code].flags & (CL_Fortran)))
278 break;
279 #endif
280 result = 0;
281 break;
283 case OPT__output_pch_:
284 pch_file = arg;
285 break;
287 case OPT_A:
288 defer_opt (code, arg);
289 break;
291 case OPT_C:
292 cpp_opts->discard_comments = 0;
293 break;
295 case OPT_CC:
296 cpp_opts->discard_comments = 0;
297 cpp_opts->discard_comments_in_macro_exp = 0;
298 break;
300 case OPT_D:
301 defer_opt (code, arg);
302 break;
304 case OPT_E:
305 flag_preprocess_only = 1;
306 break;
308 case OPT_H:
309 cpp_opts->print_include_names = 1;
310 break;
312 case OPT_F:
313 TARGET_OPTF (xstrdup (arg));
314 break;
316 case OPT_I:
317 if (strcmp (arg, "-"))
318 add_path (xstrdup (arg), BRACKET, 0, true);
319 else
321 if (quote_chain_split)
322 error ("-I- specified twice");
323 quote_chain_split = true;
324 split_quote_chain ();
325 inform ("obsolete option -I- used, please use -iquote instead");
327 break;
329 case OPT_M:
330 case OPT_MM:
331 /* When doing dependencies with -M or -MM, suppress normal
332 preprocessed output, but still do -dM etc. as software
333 depends on this. Preprocessed output does occur if -MD, -MMD
334 or environment var dependency generation is used. */
335 cpp_opts->deps.style = (code == OPT_M ? DEPS_SYSTEM: DEPS_USER);
336 flag_no_output = 1;
337 cpp_opts->inhibit_warnings = 1;
338 break;
340 case OPT_MD:
341 case OPT_MMD:
342 cpp_opts->deps.style = (code == OPT_MD ? DEPS_SYSTEM: DEPS_USER);
343 deps_file = arg;
344 break;
346 case OPT_MF:
347 deps_seen = true;
348 deps_file = arg;
349 break;
351 case OPT_MG:
352 deps_seen = true;
353 cpp_opts->deps.missing_files = true;
354 break;
356 case OPT_MP:
357 deps_seen = true;
358 cpp_opts->deps.phony_targets = true;
359 break;
361 case OPT_MQ:
362 case OPT_MT:
363 deps_seen = true;
364 defer_opt (code, arg);
365 break;
367 case OPT_P:
368 flag_no_line_commands = 1;
369 break;
371 case OPT_fworking_directory:
372 flag_working_directory = value;
373 break;
375 case OPT_U:
376 defer_opt (code, arg);
377 break;
379 case OPT_Wall:
380 set_Wunused (value);
381 set_Wformat (value);
382 set_Wimplicit (value);
383 warn_char_subscripts = value;
384 warn_missing_braces = value;
385 warn_parentheses = value;
386 warn_return_type = value;
387 warn_sequence_point = value; /* Was C only. */
388 if (c_dialect_cxx ())
389 warn_sign_compare = value;
390 warn_switch = value;
391 warn_strict_aliasing = value;
392 warn_string_literal_comparison = value;
393 warn_always_true = value;
395 /* Only warn about unknown pragmas that are not in system
396 headers. */
397 warn_unknown_pragmas = value;
399 /* We save the value of warn_uninitialized, since if they put
400 -Wuninitialized on the command line, we need to generate a
401 warning about not using it without also specifying -O. */
402 if (warn_uninitialized != 1)
403 warn_uninitialized = (value ? 2 : 0);
405 if (!c_dialect_cxx ())
406 /* We set this to 2 here, but 1 in -Wmain, so -ffreestanding
407 can turn it off only if it's not explicit. */
408 warn_main = value * 2;
409 else
411 /* C++-specific warnings. */
412 warn_reorder = value;
413 warn_nontemplate_friend = value;
416 cpp_opts->warn_trigraphs = value;
417 cpp_opts->warn_comments = value;
418 cpp_opts->warn_num_sign_change = value;
419 cpp_opts->warn_multichar = value; /* Was C++ only. */
421 if (warn_pointer_sign == -1)
422 warn_pointer_sign = 1;
423 break;
425 case OPT_Wcomment:
426 case OPT_Wcomments:
427 cpp_opts->warn_comments = value;
428 break;
430 case OPT_Wdeprecated:
431 cpp_opts->warn_deprecated = value;
432 break;
434 case OPT_Wdiv_by_zero:
435 warn_div_by_zero = value;
436 break;
438 case OPT_Wendif_labels:
439 cpp_opts->warn_endif_labels = value;
440 break;
442 case OPT_Werror:
443 cpp_opts->warnings_are_errors = value;
444 global_dc->warning_as_error_requested = value;
445 break;
447 case OPT_Werror_implicit_function_declaration:
448 mesg_implicit_function_declaration = 2;
449 break;
451 case OPT_Wformat:
452 set_Wformat (value);
453 break;
455 case OPT_Wformat_:
456 set_Wformat (atoi (arg));
457 break;
459 case OPT_Wimplicit:
460 set_Wimplicit (value);
461 break;
463 case OPT_Wimport:
464 /* Silently ignore for now. */
465 break;
467 case OPT_Winvalid_pch:
468 cpp_opts->warn_invalid_pch = value;
469 break;
471 case OPT_Wmain:
472 if (value)
473 warn_main = 1;
474 else
475 warn_main = -1;
476 break;
478 case OPT_Wmissing_include_dirs:
479 cpp_opts->warn_missing_include_dirs = value;
480 break;
482 case OPT_Wmultichar:
483 cpp_opts->warn_multichar = value;
484 break;
486 case OPT_Wnormalized_:
487 if (!value || (arg && strcasecmp (arg, "none") == 0))
488 cpp_opts->warn_normalize = normalized_none;
489 else if (!arg || strcasecmp (arg, "nfkc") == 0)
490 cpp_opts->warn_normalize = normalized_KC;
491 else if (strcasecmp (arg, "id") == 0)
492 cpp_opts->warn_normalize = normalized_identifier_C;
493 else if (strcasecmp (arg, "nfc") == 0)
494 cpp_opts->warn_normalize = normalized_C;
495 else
496 error ("argument %qs to %<-Wnormalized%> not recognized", arg);
497 break;
499 case OPT_Wreturn_type:
500 warn_return_type = value;
501 break;
503 case OPT_Wstrict_null_sentinel:
504 warn_strict_null_sentinel = value;
505 break;
507 case OPT_Wsystem_headers:
508 cpp_opts->warn_system_headers = value;
509 break;
511 case OPT_Wtraditional:
512 cpp_opts->warn_traditional = value;
513 break;
515 case OPT_Wtrigraphs:
516 cpp_opts->warn_trigraphs = value;
517 break;
519 case OPT_Wundef:
520 cpp_opts->warn_undef = value;
521 break;
523 case OPT_Wunknown_pragmas:
524 /* Set to greater than 1, so that even unknown pragmas in
525 system headers will be warned about. */
526 warn_unknown_pragmas = value * 2;
527 break;
529 case OPT_Wunused_macros:
530 warn_unused_macros = value;
531 break;
533 case OPT_Wvariadic_macros:
534 warn_variadic_macros = value;
535 break;
537 case OPT_Wwrite_strings:
538 if (!c_dialect_cxx ())
539 flag_const_strings = value;
540 else
541 warn_write_strings = value;
542 break;
544 case OPT_Weffc__:
545 warn_ecpp = value;
546 if (value)
547 warn_nonvdtor = true;
548 break;
550 case OPT_ansi:
551 if (!c_dialect_cxx ())
552 set_std_c89 (false, true);
553 else
554 set_std_cxx98 (true);
555 break;
557 case OPT_d:
558 handle_OPT_d (arg);
559 break;
561 case OPT_fcond_mismatch:
562 if (!c_dialect_cxx ())
564 flag_cond_mismatch = value;
565 break;
567 /* Fall through. */
569 case OPT_fall_virtual:
570 case OPT_falt_external_templates:
571 case OPT_fenum_int_equiv:
572 case OPT_fexternal_templates:
573 case OPT_fguiding_decls:
574 case OPT_fhonor_std:
575 case OPT_fhuge_objects:
576 case OPT_flabels_ok:
577 case OPT_fname_mangling_version_:
578 case OPT_fnew_abi:
579 case OPT_fnonnull_objects:
580 case OPT_fsquangle:
581 case OPT_fstrict_prototype:
582 case OPT_fthis_is_variable:
583 case OPT_fvtable_thunks:
584 case OPT_fxref:
585 case OPT_fvtable_gc:
586 warning (0, "switch %qs is no longer supported", option->opt_text);
587 break;
589 case OPT_faccess_control:
590 flag_access_control = value;
591 break;
593 case OPT_fasm:
594 flag_no_asm = !value;
595 break;
597 case OPT_fbuiltin:
598 flag_no_builtin = !value;
599 break;
601 case OPT_fbuiltin_:
602 if (value)
603 result = 0;
604 else
605 disable_builtin_function (arg);
606 break;
608 case OPT_fdollars_in_identifiers:
609 cpp_opts->dollars_in_ident = value;
610 break;
612 case OPT_ffreestanding:
613 value = !value;
614 /* Fall through.... */
615 case OPT_fhosted:
616 flag_hosted = value;
617 flag_no_builtin = !value;
618 /* warn_main will be 2 if set by -Wall, 1 if set by -Wmain */
619 if (!value && warn_main == 2)
620 warn_main = 0;
621 break;
623 case OPT_fshort_double:
624 flag_short_double = value;
625 break;
627 case OPT_fshort_enums:
628 flag_short_enums = value;
629 break;
631 case OPT_fshort_wchar:
632 flag_short_wchar = value;
633 break;
635 case OPT_fsigned_bitfields:
636 flag_signed_bitfields = value;
637 break;
639 case OPT_fsigned_char:
640 flag_signed_char = value;
641 break;
643 case OPT_funsigned_bitfields:
644 flag_signed_bitfields = !value;
645 break;
647 case OPT_funsigned_char:
648 flag_signed_char = !value;
649 break;
651 case OPT_fcheck_new:
652 flag_check_new = value;
653 break;
655 case OPT_fconserve_space:
656 flag_conserve_space = value;
657 break;
659 case OPT_fconst_strings:
660 flag_const_strings = value;
661 break;
663 case OPT_fconstant_string_class_:
664 constant_string_class_name = arg;
665 break;
667 case OPT_fdefault_inline:
668 flag_default_inline = value;
669 break;
671 case OPT_felide_constructors:
672 flag_elide_constructors = value;
673 break;
675 case OPT_fenforce_eh_specs:
676 flag_enforce_eh_specs = value;
677 break;
679 case OPT_fextended_identifiers:
680 cpp_opts->extended_identifiers = value;
681 break;
683 case OPT_ffor_scope:
684 flag_new_for_scope = value;
685 break;
687 case OPT_fgnu_keywords:
688 flag_no_gnu_keywords = !value;
689 break;
691 case OPT_fgnu_runtime:
692 flag_next_runtime = !value;
693 break;
695 case OPT_fhandle_exceptions:
696 warning (0, "-fhandle-exceptions has been renamed -fexceptions (and is now on by default)");
697 flag_exceptions = value;
698 break;
700 case OPT_fimplement_inlines:
701 flag_implement_inlines = value;
702 break;
704 case OPT_fimplicit_inline_templates:
705 flag_implicit_inline_templates = value;
706 break;
708 case OPT_fimplicit_templates:
709 flag_implicit_templates = value;
710 break;
712 case OPT_fms_extensions:
713 flag_ms_extensions = value;
714 break;
716 case OPT_fnext_runtime:
717 flag_next_runtime = value;
718 break;
720 case OPT_fnil_receivers:
721 flag_nil_receivers = value;
722 break;
724 case OPT_fnonansi_builtins:
725 flag_no_nonansi_builtin = !value;
726 break;
728 case OPT_foperator_names:
729 cpp_opts->operator_names = value;
730 break;
732 case OPT_foptional_diags:
733 flag_optional_diags = value;
734 break;
736 case OPT_fpch_deps:
737 cpp_opts->restore_pch_deps = value;
738 break;
740 case OPT_fpch_preprocess:
741 flag_pch_preprocess = value;
742 break;
744 case OPT_fpermissive:
745 flag_permissive = value;
746 break;
748 case OPT_fpreprocessed:
749 cpp_opts->preprocessed = value;
750 break;
752 case OPT_freplace_objc_classes:
753 flag_replace_objc_classes = value;
754 break;
756 case OPT_frepo:
757 flag_use_repository = value;
758 if (value)
759 flag_implicit_templates = 0;
760 break;
762 case OPT_frtti:
763 flag_rtti = value;
764 break;
766 case OPT_fshow_column:
767 cpp_opts->show_column = value;
768 break;
770 case OPT_fstats:
771 flag_detailed_statistics = value;
772 break;
774 case OPT_ftabstop_:
775 /* It is documented that we silently ignore silly values. */
776 if (value >= 1 && value <= 100)
777 cpp_opts->tabstop = value;
778 break;
780 case OPT_fexec_charset_:
781 cpp_opts->narrow_charset = arg;
782 break;
784 case OPT_fwide_exec_charset_:
785 cpp_opts->wide_charset = arg;
786 break;
788 case OPT_finput_charset_:
789 cpp_opts->input_charset = arg;
790 break;
792 case OPT_ftemplate_depth_:
793 max_tinst_depth = value;
794 break;
796 case OPT_fuse_cxa_atexit:
797 flag_use_cxa_atexit = value;
798 break;
800 case OPT_fvisibility_inlines_hidden:
801 visibility_options.inlines_hidden = value;
802 break;
804 case OPT_fweak:
805 flag_weak = value;
806 break;
808 case OPT_fthreadsafe_statics:
809 flag_threadsafe_statics = value;
810 break;
812 case OPT_fzero_link:
813 flag_zero_link = value;
814 break;
816 case OPT_gen_decls:
817 flag_gen_declaration = 1;
818 break;
820 case OPT_idirafter:
821 add_path (xstrdup (arg), AFTER, 0, true);
822 break;
824 case OPT_imacros:
825 case OPT_include:
826 defer_opt (code, arg);
827 break;
829 case OPT_imultilib:
830 imultilib = arg;
831 break;
833 case OPT_iprefix:
834 iprefix = arg;
835 break;
837 case OPT_iquote:
838 add_path (xstrdup (arg), QUOTE, 0, true);
839 break;
841 case OPT_isysroot:
842 sysroot = arg;
843 break;
845 case OPT_isystem:
846 add_path (xstrdup (arg), SYSTEM, 0, true);
847 break;
849 case OPT_iwithprefix:
850 add_prefixed_path (arg, SYSTEM);
851 break;
853 case OPT_iwithprefixbefore:
854 add_prefixed_path (arg, BRACKET);
855 break;
857 case OPT_lang_asm:
858 cpp_set_lang (parse_in, CLK_ASM);
859 cpp_opts->dollars_in_ident = false;
860 break;
862 case OPT_lang_fortran:
863 lang_fortran = true;
864 break;
866 case OPT_lang_objc:
867 cpp_opts->objc = 1;
868 break;
870 case OPT_nostdinc:
871 std_inc = false;
872 break;
874 case OPT_nostdinc__:
875 std_cxx_inc = false;
876 break;
878 case OPT_o:
879 if (!out_fname)
880 out_fname = arg;
881 else
882 error ("output filename specified twice");
883 break;
885 /* We need to handle the -pedantic switches here, rather than in
886 c_common_post_options, so that a subsequent -Wno-endif-labels
887 is not overridden. */
888 case OPT_pedantic_errors:
889 cpp_opts->pedantic_errors = 1;
890 /* Fall through. */
891 case OPT_pedantic:
892 cpp_opts->pedantic = 1;
893 cpp_opts->warn_endif_labels = 1;
894 if (warn_pointer_sign == -1)
895 warn_pointer_sign = 1;
896 break;
898 case OPT_print_objc_runtime_info:
899 print_struct_values = 1;
900 break;
902 case OPT_print_pch_checksum:
903 c_common_print_pch_checksum (stdout);
904 exit_after_options = true;
905 break;
907 case OPT_remap:
908 cpp_opts->remap = 1;
909 break;
911 case OPT_std_c__98:
912 case OPT_std_gnu__98:
913 set_std_cxx98 (code == OPT_std_c__98 /* ISO */);
914 break;
916 case OPT_std_c89:
917 case OPT_std_iso9899_1990:
918 case OPT_std_iso9899_199409:
919 set_std_c89 (code == OPT_std_iso9899_199409 /* c94 */, true /* ISO */);
920 break;
922 case OPT_std_gnu89:
923 set_std_c89 (false /* c94 */, false /* ISO */);
924 break;
926 case OPT_std_c99:
927 case OPT_std_c9x:
928 case OPT_std_iso9899_1999:
929 case OPT_std_iso9899_199x:
930 set_std_c99 (true /* ISO */);
931 break;
933 case OPT_std_gnu99:
934 case OPT_std_gnu9x:
935 set_std_c99 (false /* ISO */);
936 break;
938 case OPT_trigraphs:
939 cpp_opts->trigraphs = 1;
940 break;
942 case OPT_traditional_cpp:
943 cpp_opts->traditional = 1;
944 break;
946 case OPT_undef:
947 flag_undef = 1;
948 break;
950 case OPT_w:
951 cpp_opts->inhibit_warnings = 1;
952 break;
954 case OPT_v:
955 verbose = true;
956 break;
959 return result;
962 /* Post-switch processing. */
963 bool
964 c_common_post_options (const char **pfilename)
966 struct cpp_callbacks *cb;
968 /* Canonicalize the input and output filenames. */
969 if (in_fnames == NULL)
971 in_fnames = XNEWVEC (const char *, 1);
972 in_fnames[0] = "";
974 else if (strcmp (in_fnames[0], "-") == 0)
975 in_fnames[0] = "";
977 if (out_fname == NULL || !strcmp (out_fname, "-"))
978 out_fname = "";
980 if (cpp_opts->deps.style == DEPS_NONE)
981 check_deps_environment_vars ();
983 handle_deferred_opts ();
985 sanitize_cpp_opts ();
987 register_include_chains (parse_in, sysroot, iprefix, imultilib,
988 std_inc, std_cxx_inc && c_dialect_cxx (), verbose);
990 flag_inline_trees = 1;
992 /* Use tree inlining. */
993 if (!flag_no_inline)
994 flag_no_inline = 1;
995 if (flag_inline_functions)
996 flag_inline_trees = 2;
998 /* If we are given more than one input file, we must use
999 unit-at-a-time mode. */
1000 if (num_in_fnames > 1)
1001 flag_unit_at_a_time = 1;
1003 /* Default to ObjC sjlj exception handling if NeXT runtime. */
1004 if (flag_objc_sjlj_exceptions < 0)
1005 flag_objc_sjlj_exceptions = flag_next_runtime;
1006 if (flag_objc_exceptions && !flag_objc_sjlj_exceptions)
1007 flag_exceptions = 1;
1009 /* -Wextra implies -Wsign-compare and -Wmissing-field-initializers,
1010 but not if explicitly overridden. */
1011 if (warn_sign_compare == -1)
1012 warn_sign_compare = extra_warnings;
1013 if (warn_missing_field_initializers == -1)
1014 warn_missing_field_initializers = extra_warnings;
1016 /* -Wpointer_sign is disabled by default, but it is enabled if any
1017 of -Wall or -pedantic are given. */
1018 if (warn_pointer_sign == -1)
1019 warn_pointer_sign = 0;
1021 /* Special format checking options don't work without -Wformat; warn if
1022 they are used. */
1023 if (!warn_format)
1025 warning (OPT_Wformat_y2k,
1026 "-Wformat-y2k ignored without -Wformat");
1027 warning (OPT_Wformat_extra_args,
1028 "-Wformat-extra-args ignored without -Wformat");
1029 warning (OPT_Wformat_zero_length,
1030 "-Wformat-zero-length ignored without -Wformat");
1031 warning (OPT_Wformat_nonliteral,
1032 "-Wformat-nonliteral ignored without -Wformat");
1033 warning (OPT_Wformat_security,
1034 "-Wformat-security ignored without -Wformat");
1037 /* C99 requires special handling of complex multiplication and division;
1038 -ffast-math and -fcx-limited-range are handled in process_options. */
1039 if (flag_isoc99)
1040 flag_complex_method = 2;
1042 if (flag_preprocess_only)
1044 /* Open the output now. We must do so even if flag_no_output is
1045 on, because there may be other output than from the actual
1046 preprocessing (e.g. from -dM). */
1047 if (out_fname[0] == '\0')
1048 out_stream = stdout;
1049 else
1050 out_stream = fopen (out_fname, "w");
1052 if (out_stream == NULL)
1054 fatal_error ("opening output file %s: %m", out_fname);
1055 return false;
1058 if (num_in_fnames > 1)
1059 error ("too many filenames given. Type %s --help for usage",
1060 progname);
1062 init_pp_output (out_stream);
1064 else
1066 init_c_lex ();
1068 /* Yuk. WTF is this? I do know ObjC relies on it somewhere. */
1069 input_location = UNKNOWN_LOCATION;
1072 cb = cpp_get_callbacks (parse_in);
1073 cb->file_change = cb_file_change;
1074 cb->dir_change = cb_dir_change;
1075 cpp_post_options (parse_in);
1077 input_location = UNKNOWN_LOCATION;
1079 /* If an error has occurred in cpplib, note it so we fail
1080 immediately. */
1081 errorcount += cpp_errors (parse_in);
1083 *pfilename = this_input_filename
1084 = cpp_read_main_file (parse_in, in_fnames[0]);
1085 /* Don't do any compilation or preprocessing if there is no input file. */
1086 if (this_input_filename == NULL)
1088 errorcount++;
1089 return false;
1092 if (flag_working_directory
1093 && flag_preprocess_only && !flag_no_line_commands)
1094 pp_dir_change (parse_in, get_src_pwd ());
1096 return flag_preprocess_only;
1099 /* Front end initialization common to C, ObjC and C++. */
1100 bool
1101 c_common_init (void)
1103 /* Set up preprocessor arithmetic. Must be done after call to
1104 c_common_nodes_and_builtins for type nodes to be good. */
1105 cpp_opts->precision = TYPE_PRECISION (intmax_type_node);
1106 cpp_opts->char_precision = TYPE_PRECISION (char_type_node);
1107 cpp_opts->int_precision = TYPE_PRECISION (integer_type_node);
1108 cpp_opts->wchar_precision = TYPE_PRECISION (wchar_type_node);
1109 cpp_opts->unsigned_wchar = TYPE_UNSIGNED (wchar_type_node);
1110 cpp_opts->bytes_big_endian = BYTES_BIG_ENDIAN;
1112 /* This can't happen until after wchar_precision and bytes_big_endian
1113 are known. */
1114 cpp_init_iconv (parse_in);
1116 if (version_flag)
1117 c_common_print_pch_checksum (stderr);
1119 if (flag_preprocess_only)
1121 finish_options ();
1122 preprocess_file (parse_in);
1123 return false;
1126 /* Has to wait until now so that cpplib has its hash table. */
1127 init_pragma ();
1129 return true;
1132 /* Initialize the integrated preprocessor after debug output has been
1133 initialized; loop over each input file. */
1134 void
1135 c_common_parse_file (int set_yydebug)
1137 unsigned int i;
1139 /* Enable parser debugging, if requested and we can. If requested
1140 and we can't, notify the user. */
1141 #if YYDEBUG != 0
1142 yydebug = set_yydebug;
1143 #else
1144 if (set_yydebug)
1145 warning (0, "YYDEBUG was not defined at build time, -dy ignored");
1146 #endif
1148 i = 0;
1149 for (;;)
1151 /* Start the main input file, if the debug writer wants it. */
1152 if (debug_hooks->start_end_main_source_file)
1153 (*debug_hooks->start_source_file) (0, this_input_filename);
1154 finish_options ();
1155 pch_init ();
1156 push_file_scope ();
1157 c_parse_file ();
1158 finish_file ();
1159 pop_file_scope ();
1160 /* And end the main input file, if the debug writer wants it */
1161 if (debug_hooks->start_end_main_source_file)
1162 (*debug_hooks->end_source_file) (0);
1163 if (++i >= num_in_fnames)
1164 break;
1165 cpp_undef_all (parse_in);
1166 this_input_filename
1167 = cpp_read_main_file (parse_in, in_fnames[i]);
1168 /* If an input file is missing, abandon further compilation.
1169 cpplib has issued a diagnostic. */
1170 if (!this_input_filename)
1171 break;
1175 /* Common finish hook for the C, ObjC and C++ front ends. */
1176 void
1177 c_common_finish (void)
1179 FILE *deps_stream = NULL;
1181 if (cpp_opts->deps.style != DEPS_NONE)
1183 /* If -M or -MM was seen without -MF, default output to the
1184 output stream. */
1185 if (!deps_file)
1186 deps_stream = out_stream;
1187 else
1189 deps_stream = fopen (deps_file, deps_append ? "a": "w");
1190 if (!deps_stream)
1191 fatal_error ("opening dependency file %s: %m", deps_file);
1195 /* For performance, avoid tearing down cpplib's internal structures
1196 with cpp_destroy (). */
1197 errorcount += cpp_finish (parse_in, deps_stream);
1199 if (deps_stream && deps_stream != out_stream
1200 && (ferror (deps_stream) || fclose (deps_stream)))
1201 fatal_error ("closing dependency file %s: %m", deps_file);
1203 if (out_stream && (ferror (out_stream) || fclose (out_stream)))
1204 fatal_error ("when writing output to %s: %m", out_fname);
1207 /* Either of two environment variables can specify output of
1208 dependencies. Their value is either "OUTPUT_FILE" or "OUTPUT_FILE
1209 DEPS_TARGET", where OUTPUT_FILE is the file to write deps info to
1210 and DEPS_TARGET is the target to mention in the deps. They also
1211 result in dependency information being appended to the output file
1212 rather than overwriting it, and like Sun's compiler
1213 SUNPRO_DEPENDENCIES suppresses the dependency on the main file. */
1214 static void
1215 check_deps_environment_vars (void)
1217 char *spec;
1219 GET_ENVIRONMENT (spec, "DEPENDENCIES_OUTPUT");
1220 if (spec)
1221 cpp_opts->deps.style = DEPS_USER;
1222 else
1224 GET_ENVIRONMENT (spec, "SUNPRO_DEPENDENCIES");
1225 if (spec)
1227 cpp_opts->deps.style = DEPS_SYSTEM;
1228 cpp_opts->deps.ignore_main_file = true;
1232 if (spec)
1234 /* Find the space before the DEPS_TARGET, if there is one. */
1235 char *s = strchr (spec, ' ');
1236 if (s)
1238 /* Let the caller perform MAKE quoting. */
1239 defer_opt (OPT_MT, s + 1);
1240 *s = '\0';
1243 /* Command line -MF overrides environment variables and default. */
1244 if (!deps_file)
1245 deps_file = spec;
1247 deps_append = 1;
1248 deps_seen = true;
1252 /* Handle deferred command line switches. */
1253 static void
1254 handle_deferred_opts (void)
1256 size_t i;
1257 struct deps *deps;
1259 /* Avoid allocating the deps buffer if we don't need it.
1260 (This flag may be true without there having been -MT or -MQ
1261 options, but we'll still need the deps buffer.) */
1262 if (!deps_seen)
1263 return;
1265 deps = cpp_get_deps (parse_in);
1267 for (i = 0; i < deferred_count; i++)
1269 struct deferred_opt *opt = &deferred_opts[i];
1271 if (opt->code == OPT_MT || opt->code == OPT_MQ)
1272 deps_add_target (deps, opt->arg, opt->code == OPT_MQ);
1276 /* These settings are appropriate for GCC, but not necessarily so for
1277 cpplib as a library. */
1278 static void
1279 sanitize_cpp_opts (void)
1281 /* If we don't know what style of dependencies to output, complain
1282 if any other dependency switches have been given. */
1283 if (deps_seen && cpp_opts->deps.style == DEPS_NONE)
1284 error ("to generate dependencies you must specify either -M or -MM");
1286 /* -dM and dependencies suppress normal output; do it here so that
1287 the last -d[MDN] switch overrides earlier ones. */
1288 if (flag_dump_macros == 'M')
1289 flag_no_output = 1;
1291 /* Disable -dD, -dN and -dI if normal output is suppressed. Allow
1292 -dM since at least glibc relies on -M -dM to work. */
1293 /* Also, flag_no_output implies flag_no_line_commands, always. */
1294 if (flag_no_output)
1296 if (flag_dump_macros != 'M')
1297 flag_dump_macros = 0;
1298 flag_dump_includes = 0;
1299 flag_no_line_commands = 1;
1302 cpp_opts->unsigned_char = !flag_signed_char;
1303 cpp_opts->stdc_0_in_system_headers = STDC_0_IN_SYSTEM_HEADERS;
1305 /* We want -Wno-long-long to override -pedantic -std=non-c99
1306 and/or -Wtraditional, whatever the ordering. */
1307 cpp_opts->warn_long_long
1308 = warn_long_long && ((!flag_isoc99 && pedantic) || warn_traditional);
1310 /* Similarly with -Wno-variadic-macros. No check for c99 here, since
1311 this also turns off warnings about GCCs extension. */
1312 cpp_opts->warn_variadic_macros
1313 = warn_variadic_macros && (pedantic || warn_traditional);
1315 /* If we're generating preprocessor output, emit current directory
1316 if explicitly requested or if debugging information is enabled.
1317 ??? Maybe we should only do it for debugging formats that
1318 actually output the current directory? */
1319 if (flag_working_directory == -1)
1320 flag_working_directory = (debug_info_level != DINFO_LEVEL_NONE);
1323 /* Add include path with a prefix at the front of its name. */
1324 static void
1325 add_prefixed_path (const char *suffix, size_t chain)
1327 char *path;
1328 const char *prefix;
1329 size_t prefix_len, suffix_len;
1331 suffix_len = strlen (suffix);
1332 prefix = iprefix ? iprefix : cpp_GCC_INCLUDE_DIR;
1333 prefix_len = iprefix ? strlen (iprefix) : cpp_GCC_INCLUDE_DIR_len;
1335 path = (char *) xmalloc (prefix_len + suffix_len + 1);
1336 memcpy (path, prefix, prefix_len);
1337 memcpy (path + prefix_len, suffix, suffix_len);
1338 path[prefix_len + suffix_len] = '\0';
1340 add_path (path, chain, 0, false);
1343 /* Handle -D, -U, -A, -imacros, and the first -include. */
1344 static void
1345 finish_options (void)
1347 if (!cpp_opts->preprocessed)
1349 size_t i;
1351 cb_file_change (parse_in,
1352 linemap_add (&line_table, LC_RENAME, 0,
1353 _("<built-in>"), 0));
1355 cpp_init_builtins (parse_in, flag_hosted);
1356 c_cpp_builtins (parse_in);
1358 /* We're about to send user input to cpplib, so make it warn for
1359 things that we previously (when we sent it internal definitions)
1360 told it to not warn.
1362 C99 permits implementation-defined characters in identifiers.
1363 The documented meaning of -std= is to turn off extensions that
1364 conflict with the specified standard, and since a strictly
1365 conforming program cannot contain a '$', we do not condition
1366 their acceptance on the -std= setting. */
1367 cpp_opts->warn_dollars = (cpp_opts->pedantic && !cpp_opts->c99);
1369 cpp_change_file (parse_in, LC_RENAME, _("<command line>"));
1370 for (i = 0; i < deferred_count; i++)
1372 struct deferred_opt *opt = &deferred_opts[i];
1374 if (opt->code == OPT_D)
1375 cpp_define (parse_in, opt->arg);
1376 else if (opt->code == OPT_U)
1377 cpp_undef (parse_in, opt->arg);
1378 else if (opt->code == OPT_A)
1380 if (opt->arg[0] == '-')
1381 cpp_unassert (parse_in, opt->arg + 1);
1382 else
1383 cpp_assert (parse_in, opt->arg);
1387 /* Handle -imacros after -D and -U. */
1388 for (i = 0; i < deferred_count; i++)
1390 struct deferred_opt *opt = &deferred_opts[i];
1392 if (opt->code == OPT_imacros
1393 && cpp_push_include (parse_in, opt->arg))
1395 /* Disable push_command_line_include callback for now. */
1396 include_cursor = deferred_count + 1;
1397 cpp_scan_nooutput (parse_in);
1402 include_cursor = 0;
1403 push_command_line_include ();
1406 /* Give CPP the next file given by -include, if any. */
1407 static void
1408 push_command_line_include (void)
1410 while (include_cursor < deferred_count)
1412 struct deferred_opt *opt = &deferred_opts[include_cursor++];
1414 if (!cpp_opts->preprocessed && opt->code == OPT_include
1415 && cpp_push_include (parse_in, opt->arg))
1416 return;
1419 if (include_cursor == deferred_count)
1421 include_cursor++;
1422 /* -Wunused-macros should only warn about macros defined hereafter. */
1423 cpp_opts->warn_unused_macros = warn_unused_macros;
1424 /* Restore the line map from <command line>. */
1425 if (!cpp_opts->preprocessed)
1426 cpp_change_file (parse_in, LC_RENAME, this_input_filename);
1428 /* Set this here so the client can change the option if it wishes,
1429 and after stacking the main file so we don't trace the main file. */
1430 line_table.trace_includes = cpp_opts->print_include_names;
1434 /* File change callback. Has to handle -include files. */
1435 static void
1436 cb_file_change (cpp_reader * ARG_UNUSED (pfile),
1437 const struct line_map *new_map)
1439 if (flag_preprocess_only)
1440 pp_file_change (new_map);
1441 else
1442 fe_file_change (new_map);
1444 if (new_map == 0 || (new_map->reason == LC_LEAVE && MAIN_FILE_P (new_map)))
1445 push_command_line_include ();
1448 void
1449 cb_dir_change (cpp_reader * ARG_UNUSED (pfile), const char *dir)
1451 if (!set_src_pwd (dir))
1452 warning (0, "too late for # directive to set debug directory");
1455 /* Set the C 89 standard (with 1994 amendments if C94, without GNU
1456 extensions if ISO). There is no concept of gnu94. */
1457 static void
1458 set_std_c89 (int c94, int iso)
1460 cpp_set_lang (parse_in, c94 ? CLK_STDC94: iso ? CLK_STDC89: CLK_GNUC89);
1461 flag_iso = iso;
1462 flag_no_asm = iso;
1463 flag_no_gnu_keywords = iso;
1464 flag_no_nonansi_builtin = iso;
1465 flag_isoc94 = c94;
1466 flag_isoc99 = 0;
1469 /* Set the C 99 standard (without GNU extensions if ISO). */
1470 static void
1471 set_std_c99 (int iso)
1473 cpp_set_lang (parse_in, iso ? CLK_STDC99: CLK_GNUC99);
1474 flag_no_asm = iso;
1475 flag_no_nonansi_builtin = iso;
1476 flag_iso = iso;
1477 flag_isoc99 = 1;
1478 flag_isoc94 = 1;
1481 /* Set the C++ 98 standard (without GNU extensions if ISO). */
1482 static void
1483 set_std_cxx98 (int iso)
1485 cpp_set_lang (parse_in, iso ? CLK_CXX98: CLK_GNUCXX);
1486 flag_no_gnu_keywords = iso;
1487 flag_no_nonansi_builtin = iso;
1488 flag_iso = iso;
1491 /* Handle setting implicit to ON. */
1492 static void
1493 set_Wimplicit (int on)
1495 warn_implicit = on;
1496 warn_implicit_int = on;
1497 if (on)
1499 if (mesg_implicit_function_declaration != 2)
1500 mesg_implicit_function_declaration = 1;
1502 else
1503 mesg_implicit_function_declaration = 0;
1506 /* Args to -d specify what to dump. Silently ignore
1507 unrecognized options; they may be aimed at toplev.c. */
1508 static void
1509 handle_OPT_d (const char *arg)
1511 char c;
1513 while ((c = *arg++) != '\0')
1514 switch (c)
1516 case 'M': /* Dump macros only. */
1517 case 'N': /* Dump names. */
1518 case 'D': /* Dump definitions. */
1519 flag_dump_macros = c;
1520 break;
1522 case 'I':
1523 flag_dump_includes = 1;
1524 break;