1 /* C/ObjC/C++ command line option handling.
2 Copyright (C) 2002, 2003, 2004 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
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
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, 59 Temple Place - Suite 330, Boston, MA
26 #include "coretypes.h"
33 #include "langhooks.h"
34 #include "tree-inline.h"
35 #include "diagnostic.h"
37 #include "cppdefault.h"
38 #include "c-incpath.h"
39 #include "debug.h" /* For debug_hooks. */
43 #ifndef DOLLARS_IN_IDENTIFIERS
44 # define DOLLARS_IN_IDENTIFIERS true
47 #ifndef TARGET_SYSTEM_ROOT
48 # define TARGET_SYSTEM_ROOT NULL
51 static int saved_lineno;
54 static cpp_options *cpp_opts;
57 static const char *this_input_filename;
59 /* Filename and stream for preprocessed output. */
60 static const char *out_fname;
61 static FILE *out_stream;
63 /* Append dependencies to deps_file. */
64 static bool deps_append;
66 /* If dependency switches (-MF etc.) have been given. */
67 static bool deps_seen;
72 /* Dependency output file. */
73 static const char *deps_file;
75 /* The prefix given by -iprefix, if any. */
76 static const char *iprefix;
78 /* The system root, if any. Overridden by -isysroot. */
79 static const char *sysroot = TARGET_SYSTEM_ROOT;
81 /* Zero disables all standard directories for headers. */
82 static bool std_inc = true;
84 /* Zero disables the C++-specific standard directories for headers. */
85 static bool std_cxx_inc = true;
87 /* If the quote chain has been split by -I-. */
88 static bool quote_chain_split;
90 /* If -Wunused-macros. */
91 static bool warn_unused_macros;
93 /* Number of deferred options. */
94 static size_t deferred_count;
96 /* Number of deferred options scanned for -include. */
97 static size_t include_cursor;
99 /* Permit Fotran front-end options. */
100 static bool permit_fortran_options;
102 static void set_Wimplicit (int);
103 static void handle_OPT_d (const char *);
104 static void set_std_cxx98 (int);
105 static void set_std_c89 (int, int);
106 static void set_std_c99 (int);
107 static void check_deps_environment_vars (void);
108 static void handle_deferred_opts (void);
109 static void sanitize_cpp_opts (void);
110 static void add_prefixed_path (const char *, size_t);
111 static void push_command_line_include (void);
112 static void cb_file_change (cpp_reader *, const struct line_map *);
113 static void cb_dir_change (cpp_reader *, const char *);
114 static void finish_options (void);
116 #ifndef STDC_0_IN_SYSTEM_HEADERS
117 #define STDC_0_IN_SYSTEM_HEADERS 0
120 /* Holds switches parsed by c_common_handle_option (), but whose
121 handling is deferred to c_common_post_options (). */
122 static void defer_opt (enum opt_code, const char *);
123 static struct deferred_opt
129 /* Complain that switch CODE expects an argument but none was
130 provided. OPT was the command-line option. Return FALSE to get
131 the default message in opts.c, TRUE if we provide a specialized
134 c_common_missing_argument (const char *opt, size_t code)
139 /* Pick up the default message. */
142 case OPT_fconstant_string_class_:
143 error ("no class name specified with \"%s\"", opt);
147 error ("assertion missing after \"%s\"", opt);
152 error ("macro name missing after \"%s\"", opt);
159 error ("missing path after \"%s\"", opt);
168 error ("missing filename after \"%s\"", opt);
173 error ("missing makefile target after \"%s\"", opt);
180 /* Defer option CODE with argument ARG. */
182 defer_opt (enum opt_code code, const char *arg)
184 deferred_opts[deferred_count].code = code;
185 deferred_opts[deferred_count].arg = arg;
189 /* Common initialization before parsing options. */
191 c_common_init_options (unsigned int argc, const char **argv ATTRIBUTE_UNUSED)
193 static const unsigned int lang_flags[] = {CL_C, CL_ObjC, CL_CXX, CL_ObjCXX};
196 /* This is conditionalized only because that is the way the front
197 ends used to do it. Maybe this should be unconditional? */
198 if (c_dialect_cxx ())
200 /* By default wrap lines at 80 characters. Is getenv
201 ("COLUMNS") preferable? */
202 diagnostic_line_cutoff (global_dc) = 80;
203 /* By default, emit location information once for every
204 diagnostic message. */
205 diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
208 parse_in = cpp_create_reader (c_dialect_cxx () ? CLK_GNUCXX: CLK_GNUC89,
211 cpp_opts = cpp_get_options (parse_in);
212 cpp_opts->dollars_in_ident = DOLLARS_IN_IDENTIFIERS;
213 cpp_opts->objc = c_dialect_objc ();
215 /* Reset to avoid warnings on internal definitions. We set it just
216 before passing on command-line options to cpplib. */
217 cpp_opts->warn_dollars = 0;
219 flag_const_strings = c_dialect_cxx ();
220 flag_exceptions = c_dialect_cxx ();
221 warn_pointer_arith = c_dialect_cxx ();
223 deferred_opts = xmalloc (argc * sizeof (struct deferred_opt));
225 result = lang_flags[c_language];
227 /* If potentially preprocessing Fortran we have to accept its front
228 end options since the driver passes most of them through. */
230 if (c_language == clk_c && argc > 2
231 && !strcmp (argv[2], "-traditional-cpp" ))
233 permit_fortran_options = true;
241 /* Handle switch SCODE with argument ARG. VALUE is true, unless no-
242 form of an -f or -W option was given. Returns 0 if the switch was
243 invalid, a negative number to prevent language-independent
244 processing in toplev.c (a hack necessary for the short-term). */
246 c_common_handle_option (size_t scode, const char *arg, int value)
248 const struct cl_option *option = &cl_options[scode];
249 enum opt_code code = (enum opt_code) scode;
255 result = permit_fortran_options;
258 case OPT__output_pch_:
263 defer_opt (code, arg);
267 cpp_opts->discard_comments = 0;
271 cpp_opts->discard_comments = 0;
272 cpp_opts->discard_comments_in_macro_exp = 0;
276 defer_opt (code, arg);
280 flag_preprocess_only = 1;
284 cpp_opts->print_include_names = 1;
288 if (strcmp (arg, "-"))
289 add_path (xstrdup (arg), BRACKET, 0);
292 if (quote_chain_split)
293 error ("-I- specified twice");
294 quote_chain_split = true;
295 split_quote_chain ();
301 /* When doing dependencies with -M or -MM, suppress normal
302 preprocessed output, but still do -dM etc. as software
303 depends on this. Preprocessed output does occur if -MD, -MMD
304 or environment var dependency generation is used. */
305 cpp_opts->deps.style = (code == OPT_M ? DEPS_SYSTEM: DEPS_USER);
307 cpp_opts->inhibit_warnings = 1;
312 cpp_opts->deps.style = (code == OPT_MD ? DEPS_SYSTEM: DEPS_USER);
323 cpp_opts->deps.missing_files = true;
328 cpp_opts->deps.phony_targets = true;
334 defer_opt (code, arg);
338 flag_no_line_commands = 1;
341 case OPT_fworking_directory:
342 flag_working_directory = value;
346 defer_opt (code, arg);
356 set_Wimplicit (value);
357 warn_char_subscripts = value;
358 warn_missing_braces = value;
359 warn_parentheses = value;
360 warn_return_type = value;
361 warn_sequence_point = value; /* Was C only. */
362 if (c_dialect_cxx ())
363 warn_sign_compare = value;
365 warn_strict_aliasing = value;
367 /* Only warn about unknown pragmas that are not in system
369 warn_unknown_pragmas = value;
371 /* We save the value of warn_uninitialized, since if they put
372 -Wuninitialized on the command line, we need to generate a
373 warning about not using it without also specifying -O. */
374 if (warn_uninitialized != 1)
375 warn_uninitialized = (value ? 2 : 0);
377 if (!c_dialect_cxx ())
378 /* We set this to 2 here, but 1 in -Wmain, so -ffreestanding
379 can turn it off only if it's not explicit. */
380 warn_main = value * 2;
383 /* C++-specific warnings. */
384 warn_nonvdtor = value;
385 warn_reorder = value;
386 warn_nontemplate_friend = value;
389 cpp_opts->warn_trigraphs = value;
390 cpp_opts->warn_comments = value;
391 cpp_opts->warn_num_sign_change = value;
392 cpp_opts->warn_multichar = value; /* Was C++ only. */
395 case OPT_Wbad_function_cast:
396 warn_bad_function_cast = value;
400 warn_cast_qual = value;
403 case OPT_Wchar_subscripts:
404 warn_char_subscripts = value;
409 cpp_opts->warn_comments = value;
412 case OPT_Wconversion:
413 warn_conversion = value;
416 case OPT_Wctor_dtor_privacy:
417 warn_ctor_dtor_privacy = value;
420 case OPT_Wdeclaration_after_statement:
421 warn_declaration_after_statement = value;
424 case OPT_Wdeprecated:
425 warn_deprecated = value;
426 cpp_opts->warn_deprecated = value;
429 case OPT_Wdiv_by_zero:
430 warn_div_by_zero = value;
437 case OPT_Wendif_labels:
438 cpp_opts->warn_endif_labels = value;
442 cpp_opts->warnings_are_errors = value;
445 case OPT_Werror_implicit_function_declaration:
446 mesg_implicit_function_declaration = 2;
449 case OPT_Wfloat_equal:
450 warn_float_equal = value;
458 set_Wformat (atoi (arg));
461 case OPT_Wformat_extra_args:
462 warn_format_extra_args = value;
465 case OPT_Wformat_nonliteral:
466 warn_format_nonliteral = value;
469 case OPT_Wformat_security:
470 warn_format_security = value;
473 case OPT_Wformat_y2k:
474 warn_format_y2k = value;
477 case OPT_Wformat_zero_length:
478 warn_format_zero_length = value;
482 warn_init_self = value;
486 set_Wimplicit (value);
489 case OPT_Wimplicit_function_declaration:
490 mesg_implicit_function_declaration = value;
493 case OPT_Wimplicit_int:
494 warn_implicit_int = value;
498 /* Silently ignore for now. */
501 case OPT_Winvalid_offsetof:
502 warn_invalid_offsetof = value;
505 case OPT_Winvalid_pch:
506 cpp_opts->warn_invalid_pch = value;
510 warn_long_long = value;
520 case OPT_Wmissing_braces:
521 warn_missing_braces = value;
524 case OPT_Wmissing_declarations:
525 warn_missing_declarations = value;
528 case OPT_Wmissing_format_attribute:
529 warn_missing_format_attribute = value;
532 case OPT_Wmissing_prototypes:
533 warn_missing_prototypes = value;
537 cpp_opts->warn_multichar = value;
540 case OPT_Wnested_externs:
541 warn_nested_externs = value;
544 case OPT_Wnon_template_friend:
545 warn_nontemplate_friend = value;
548 case OPT_Wnon_virtual_dtor:
549 warn_nonvdtor = value;
553 warn_nonnull = value;
556 case OPT_Wold_style_definition:
557 warn_old_style_definition = value;
560 case OPT_Wold_style_cast:
561 warn_old_style_cast = value;
564 case OPT_Woverloaded_virtual:
565 warn_overloaded_virtual = value;
568 case OPT_Wparentheses:
569 warn_parentheses = value;
572 case OPT_Wpmf_conversions:
573 warn_pmf2ptr = value;
576 case OPT_Wpointer_arith:
577 warn_pointer_arith = value;
581 warn_protocol = value;
585 warn_selector = value;
588 case OPT_Wredundant_decls:
589 warn_redundant_decls = value;
593 warn_reorder = value;
596 case OPT_Wreturn_type:
597 warn_return_type = value;
600 case OPT_Wsequence_point:
601 warn_sequence_point = value;
604 case OPT_Wsign_compare:
605 warn_sign_compare = value;
608 case OPT_Wsign_promo:
609 warn_sign_promo = value;
612 case OPT_Wstrict_prototypes:
613 warn_strict_prototypes = value;
620 case OPT_Wsystem_headers:
621 cpp_opts->warn_system_headers = value;
624 case OPT_Wtraditional:
625 warn_traditional = value;
626 cpp_opts->warn_traditional = value;
630 cpp_opts->warn_trigraphs = value;
633 case OPT_Wundeclared_selector:
634 warn_undeclared_selector = value;
638 cpp_opts->warn_undef = value;
641 case OPT_Wunknown_pragmas:
642 /* Set to greater than 1, so that even unknown pragmas in
643 system headers will be warned about. */
644 warn_unknown_pragmas = value * 2;
647 case OPT_Wunused_macros:
648 warn_unused_macros = value;
651 case OPT_Wwrite_strings:
652 if (!c_dialect_cxx ())
653 flag_const_strings = value;
655 warn_write_strings = value;
659 if (!c_dialect_cxx ())
660 set_std_c89 (false, true);
662 set_std_cxx98 (true);
669 case OPT_fcond_mismatch:
670 if (!c_dialect_cxx ())
672 flag_cond_mismatch = value;
677 case OPT_fall_virtual:
678 case OPT_falt_external_templates:
679 case OPT_fenum_int_equiv:
680 case OPT_fexternal_templates:
681 case OPT_fguiding_decls:
683 case OPT_fhuge_objects:
685 case OPT_fname_mangling_version_:
687 case OPT_fnonnull_objects:
689 case OPT_fstrict_prototype:
690 case OPT_fthis_is_variable:
691 case OPT_fvtable_thunks:
694 warning ("switch \"%s\" is no longer supported", option->opt_text);
697 case OPT_faccess_control:
698 flag_access_control = value;
702 flag_no_asm = !value;
706 flag_no_builtin = !value;
713 disable_builtin_function (arg);
716 case OPT_fdollars_in_identifiers:
717 cpp_opts->dollars_in_ident = value;
721 if (!dump_switch_p (arg))
725 case OPT_ffreestanding:
727 /* Fall through.... */
730 flag_no_builtin = !value;
731 /* warn_main will be 2 if set by -Wall, 1 if set by -Wmain */
732 if (!value && warn_main == 2)
736 case OPT_fshort_double:
737 flag_short_double = value;
740 case OPT_fshort_enums:
741 flag_short_enums = value;
744 case OPT_fshort_wchar:
745 flag_short_wchar = value;
748 case OPT_fsigned_bitfields:
749 flag_signed_bitfields = value;
750 explicit_flag_signed_bitfields = 1;
753 case OPT_fsigned_char:
754 flag_signed_char = value;
757 case OPT_funsigned_bitfields:
758 flag_signed_bitfields = !value;
759 explicit_flag_signed_bitfields = 1;
762 case OPT_funsigned_char:
763 flag_signed_char = !value;
767 flag_check_new = value;
770 case OPT_fconserve_space:
771 flag_conserve_space = value;
774 case OPT_fconst_strings:
775 flag_const_strings = value;
778 case OPT_fconstant_string_class_:
779 constant_string_class_name = arg;
782 case OPT_fdefault_inline:
783 flag_default_inline = value;
786 case OPT_felide_constructors:
787 flag_elide_constructors = value;
790 case OPT_fenforce_eh_specs:
791 flag_enforce_eh_specs = value;
794 case OPT_ffixed_form:
795 case OPT_ffixed_line_length_:
796 /* Fortran front end options ignored when preprocessing only. */
797 if (!flag_preprocess_only)
802 flag_new_for_scope = value;
805 case OPT_fgnu_keywords:
806 flag_no_gnu_keywords = !value;
809 case OPT_fgnu_runtime:
810 flag_next_runtime = !value;
813 case OPT_fhandle_exceptions:
814 warning ("-fhandle-exceptions has been renamed -fexceptions (and is now on by default)");
815 flag_exceptions = value;
818 case OPT_fimplement_inlines:
819 flag_implement_inlines = value;
822 case OPT_fimplicit_inline_templates:
823 flag_implicit_inline_templates = value;
826 case OPT_fimplicit_templates:
827 flag_implicit_templates = value;
830 case OPT_fms_extensions:
831 flag_ms_extensions = value;
834 case OPT_fnext_runtime:
835 flag_next_runtime = value;
838 case OPT_fnil_receivers:
839 flag_nil_receivers = value;
842 case OPT_fnonansi_builtins:
843 flag_no_nonansi_builtin = !value;
846 case OPT_fobjc_exceptions:
847 flag_objc_exceptions = value;
850 case OPT_foperator_names:
851 cpp_opts->operator_names = value;
854 case OPT_foptional_diags:
855 flag_optional_diags = value;
859 cpp_opts->restore_pch_deps = value;
862 case OPT_fpermissive:
863 flag_permissive = value;
866 case OPT_fpreprocessed:
867 cpp_opts->preprocessed = value;
870 case OPT_freplace_objc_classes:
871 flag_replace_objc_classes = value;
875 flag_use_repository = value;
877 flag_implicit_templates = 0;
884 case OPT_fshow_column:
885 cpp_opts->show_column = value;
889 flag_detailed_statistics = value;
893 /* It is documented that we silently ignore silly values. */
894 if (value >= 1 && value <= 100)
895 cpp_opts->tabstop = value;
898 case OPT_fexec_charset_:
899 cpp_opts->narrow_charset = arg;
902 case OPT_fwide_exec_charset_:
903 cpp_opts->wide_charset = arg;
906 case OPT_finput_charset_:
907 cpp_opts->input_charset = arg;
910 case OPT_ftemplate_depth_:
911 max_tinst_depth = value;
914 case OPT_fuse_cxa_atexit:
915 flag_use_cxa_atexit = value;
923 flag_zero_link = value;
927 flag_gen_declaration = 1;
931 add_path (xstrdup (arg), AFTER, 0);
936 defer_opt (code, arg);
948 add_path (xstrdup (arg), SYSTEM, 0);
951 case OPT_iwithprefix:
952 add_prefixed_path (arg, SYSTEM);
955 case OPT_iwithprefixbefore:
956 add_prefixed_path (arg, BRACKET);
960 cpp_set_lang (parse_in, CLK_ASM);
961 cpp_opts->dollars_in_ident = false;
980 error ("output filename specified twice");
983 /* We need to handle the -pedantic switches here, rather than in
984 c_common_post_options, so that a subsequent -Wno-endif-labels
985 is not overridden. */
986 case OPT_pedantic_errors:
987 cpp_opts->pedantic_errors = 1;
990 cpp_opts->pedantic = 1;
991 cpp_opts->warn_endif_labels = 1;
994 case OPT_print_objc_runtime_info:
995 print_struct_values = 1;
1003 case OPT_std_gnu__98:
1004 set_std_cxx98 (code == OPT_std_c__98 /* ISO */);
1008 case OPT_std_iso9899_1990:
1009 case OPT_std_iso9899_199409:
1010 set_std_c89 (code == OPT_std_iso9899_199409 /* c94 */, true /* ISO */);
1014 set_std_c89 (false /* c94 */, false /* ISO */);
1019 case OPT_std_iso9899_1999:
1020 case OPT_std_iso9899_199x:
1021 set_std_c99 (true /* ISO */);
1026 set_std_c99 (false /* ISO */);
1030 cpp_opts->trigraphs = 1;
1033 case OPT_traditional_cpp:
1034 cpp_opts->traditional = 1;
1042 cpp_opts->inhibit_warnings = 1;
1049 case OPT_fformat_extensions:
1056 /* Post-switch processing. */
1058 c_common_post_options (const char **pfilename)
1060 struct cpp_callbacks *cb;
1062 /* Canonicalize the input and output filenames. */
1063 if (in_fnames == NULL)
1065 in_fnames = xmalloc (sizeof (in_fnames[0]));
1068 else if (strcmp (in_fnames[0], "-") == 0)
1071 if (out_fname == NULL || !strcmp (out_fname, "-"))
1074 if (cpp_opts->deps.style == DEPS_NONE)
1075 check_deps_environment_vars ();
1077 handle_deferred_opts ();
1079 sanitize_cpp_opts ();
1081 register_include_chains (parse_in, sysroot, iprefix,
1082 std_inc, std_cxx_inc && c_dialect_cxx (), verbose);
1084 flag_inline_trees = 1;
1086 /* Use tree inlining if possible. Function instrumentation is only
1087 done in the RTL level, so we disable tree inlining. */
1088 if (flag_instrument_function_entry_exit)
1091 flag_really_no_inline = 1;
1095 if (!flag_no_inline)
1097 if (flag_inline_functions)
1099 flag_inline_trees = 2;
1100 flag_inline_functions = 0;
1104 /* -Wextra implies -Wsign-compare, but not if explicitly
1106 if (warn_sign_compare == -1)
1107 warn_sign_compare = extra_warnings;
1109 /* Special format checking options don't work without -Wformat; warn if
1111 if (warn_format_y2k && !warn_format)
1112 warning ("-Wformat-y2k ignored without -Wformat");
1113 if (warn_format_extra_args && !warn_format)
1114 warning ("-Wformat-extra-args ignored without -Wformat");
1115 if (warn_format_zero_length && !warn_format)
1116 warning ("-Wformat-zero-length ignored without -Wformat");
1117 if (warn_format_nonliteral && !warn_format)
1118 warning ("-Wformat-nonliteral ignored without -Wformat");
1119 if (warn_format_security && !warn_format)
1120 warning ("-Wformat-security ignored without -Wformat");
1121 if (warn_missing_format_attribute && !warn_format)
1122 warning ("-Wmissing-format-attribute ignored without -Wformat");
1124 if (flag_preprocess_only)
1126 /* Open the output now. We must do so even if flag_no_output is
1127 on, because there may be other output than from the actual
1128 preprocessing (e.g. from -dM). */
1129 if (out_fname[0] == '\0')
1130 out_stream = stdout;
1132 out_stream = fopen (out_fname, "w");
1134 if (out_stream == NULL)
1136 fatal_error ("opening output file %s: %m", out_fname);
1140 if (num_in_fnames > 1)
1141 error ("too many filenames given. Type %s --help for usage",
1144 init_pp_output (out_stream);
1150 /* Yuk. WTF is this? I do know ObjC relies on it somewhere. */
1154 cb = cpp_get_callbacks (parse_in);
1155 cb->file_change = cb_file_change;
1156 cb->dir_change = cb_dir_change;
1157 cpp_post_options (parse_in);
1159 saved_lineno = input_line;
1162 /* If an error has occurred in cpplib, note it so we fail
1164 errorcount += cpp_errors (parse_in);
1166 *pfilename = this_input_filename
1167 = cpp_read_main_file (parse_in, in_fnames[0]);
1168 if (this_input_filename == NULL)
1171 if (flag_working_directory
1172 && flag_preprocess_only && ! flag_no_line_commands)
1173 pp_dir_change (parse_in, get_src_pwd ());
1175 return flag_preprocess_only;
1178 /* Front end initialization common to C, ObjC and C++. */
1180 c_common_init (void)
1182 input_line = saved_lineno;
1184 /* Set up preprocessor arithmetic. Must be done after call to
1185 c_common_nodes_and_builtins for type nodes to be good. */
1186 cpp_opts->precision = TYPE_PRECISION (intmax_type_node);
1187 cpp_opts->char_precision = TYPE_PRECISION (char_type_node);
1188 cpp_opts->int_precision = TYPE_PRECISION (integer_type_node);
1189 cpp_opts->wchar_precision = TYPE_PRECISION (wchar_type_node);
1190 cpp_opts->unsigned_wchar = TREE_UNSIGNED (wchar_type_node);
1191 cpp_opts->bytes_big_endian = BYTES_BIG_ENDIAN;
1193 /* This can't happen until after wchar_precision and bytes_big_endian
1195 cpp_init_iconv (parse_in);
1197 if (flag_preprocess_only)
1200 preprocess_file (parse_in);
1204 /* Has to wait until now so that cpplib has its hash table. */
1210 /* Initialize the integrated preprocessor after debug output has been
1211 initialized; loop over each input file. */
1213 c_common_parse_file (int set_yydebug ATTRIBUTE_UNUSED)
1215 unsigned file_index;
1218 yydebug = set_yydebug;
1220 warning ("YYDEBUG not defined");
1229 /* Reset the state of the parser. */
1232 /* Reset cpplib's macros and start a new file. */
1233 cpp_undef_all (parse_in);
1234 main_input_filename = this_input_filename
1235 = cpp_read_main_file (parse_in, in_fnames[file_index]);
1236 if (this_input_filename == NULL)
1240 if (file_index == 0)
1245 } while (file_index < num_in_fnames);
1250 /* Common finish hook for the C, ObjC and C++ front ends. */
1252 c_common_finish (void)
1254 FILE *deps_stream = NULL;
1256 if (cpp_opts->deps.style != DEPS_NONE)
1258 /* If -M or -MM was seen without -MF, default output to the
1261 deps_stream = out_stream;
1264 deps_stream = fopen (deps_file, deps_append ? "a": "w");
1266 fatal_error ("opening dependency file %s: %m", deps_file);
1270 /* For performance, avoid tearing down cpplib's internal structures
1271 with cpp_destroy (). */
1272 errorcount += cpp_finish (parse_in, deps_stream);
1274 if (deps_stream && deps_stream != out_stream
1275 && (ferror (deps_stream) || fclose (deps_stream)))
1276 fatal_error ("closing dependency file %s: %m", deps_file);
1278 if (out_stream && (ferror (out_stream) || fclose (out_stream)))
1279 fatal_error ("when writing output to %s: %m", out_fname);
1282 /* Either of two environment variables can specify output of
1283 dependencies. Their value is either "OUTPUT_FILE" or "OUTPUT_FILE
1284 DEPS_TARGET", where OUTPUT_FILE is the file to write deps info to
1285 and DEPS_TARGET is the target to mention in the deps. They also
1286 result in dependency information being appended to the output file
1287 rather than overwriting it, and like Sun's compiler
1288 SUNPRO_DEPENDENCIES suppresses the dependency on the main file. */
1290 check_deps_environment_vars (void)
1294 GET_ENVIRONMENT (spec, "DEPENDENCIES_OUTPUT");
1296 cpp_opts->deps.style = DEPS_USER;
1299 GET_ENVIRONMENT (spec, "SUNPRO_DEPENDENCIES");
1302 cpp_opts->deps.style = DEPS_SYSTEM;
1303 cpp_opts->deps.ignore_main_file = true;
1309 /* Find the space before the DEPS_TARGET, if there is one. */
1310 char *s = strchr (spec, ' ');
1313 /* Let the caller perform MAKE quoting. */
1314 defer_opt (OPT_MT, s + 1);
1318 /* Command line -MF overrides environment variables and default. */
1326 /* Handle deferred command line switches. */
1328 handle_deferred_opts (void)
1332 for (i = 0; i < deferred_count; i++)
1334 struct deferred_opt *opt = &deferred_opts[i];
1336 if (opt->code == OPT_MT || opt->code == OPT_MQ)
1337 cpp_add_dependency_target (parse_in, opt->arg, opt->code == OPT_MQ);
1341 /* These settings are appropriate for GCC, but not necessarily so for
1342 cpplib as a library. */
1344 sanitize_cpp_opts (void)
1346 /* If we don't know what style of dependencies to output, complain
1347 if any other dependency switches have been given. */
1348 if (deps_seen && cpp_opts->deps.style == DEPS_NONE)
1349 error ("to generate dependencies you must specify either -M or -MM");
1351 /* -dM and dependencies suppress normal output; do it here so that
1352 the last -d[MDN] switch overrides earlier ones. */
1353 if (flag_dump_macros == 'M')
1356 /* Disable -dD, -dN and -dI if normal output is suppressed. Allow
1357 -dM since at least glibc relies on -M -dM to work. */
1360 if (flag_dump_macros != 'M')
1361 flag_dump_macros = 0;
1362 flag_dump_includes = 0;
1365 cpp_opts->unsigned_char = !flag_signed_char;
1366 cpp_opts->stdc_0_in_system_headers = STDC_0_IN_SYSTEM_HEADERS;
1368 /* We want -Wno-long-long to override -pedantic -std=non-c99
1369 and/or -Wtraditional, whatever the ordering. */
1370 cpp_opts->warn_long_long
1371 = warn_long_long && ((!flag_isoc99 && pedantic) || warn_traditional);
1373 /* If we're generating preprocessor output, emit current directory
1374 if explicitly requested or if debugging information is enabled.
1375 ??? Maybe we should only do it for debugging formats that
1376 actually output the current directory? */
1377 if (flag_working_directory == -1)
1378 flag_working_directory = (debug_info_level != DINFO_LEVEL_NONE);
1381 /* Add include path with a prefix at the front of its name. */
1383 add_prefixed_path (const char *suffix, size_t chain)
1387 size_t prefix_len, suffix_len;
1389 suffix_len = strlen (suffix);
1390 prefix = iprefix ? iprefix : cpp_GCC_INCLUDE_DIR;
1391 prefix_len = iprefix ? strlen (iprefix) : cpp_GCC_INCLUDE_DIR_len;
1393 path = xmalloc (prefix_len + suffix_len + 1);
1394 memcpy (path, prefix, prefix_len);
1395 memcpy (path + prefix_len, suffix, suffix_len);
1396 path[prefix_len + suffix_len] = '\0';
1398 add_path (path, chain, 0);
1401 /* Handle -D, -U, -A, -imacros, and the first -include. */
1403 finish_options (void)
1405 if (!cpp_opts->preprocessed)
1409 cpp_change_file (parse_in, LC_RENAME, _("<built-in>"));
1410 cpp_init_builtins (parse_in, flag_hosted);
1411 c_cpp_builtins (parse_in);
1413 /* We're about to send user input to cpplib, so make it warn for
1414 things that we previously (when we sent it internal definitions)
1415 told it to not warn.
1417 C99 permits implementation-defined characters in identifiers.
1418 The documented meaning of -std= is to turn off extensions that
1419 conflict with the specified standard, and since a strictly
1420 conforming program cannot contain a '$', we do not condition
1421 their acceptance on the -std= setting. */
1422 cpp_opts->warn_dollars = (cpp_opts->pedantic && !cpp_opts->c99);
1424 cpp_change_file (parse_in, LC_RENAME, _("<command line>"));
1425 for (i = 0; i < deferred_count; i++)
1427 struct deferred_opt *opt = &deferred_opts[i];
1429 if (opt->code == OPT_D)
1430 cpp_define (parse_in, opt->arg);
1431 else if (opt->code == OPT_U)
1432 cpp_undef (parse_in, opt->arg);
1433 else if (opt->code == OPT_A)
1435 if (opt->arg[0] == '-')
1436 cpp_unassert (parse_in, opt->arg + 1);
1438 cpp_assert (parse_in, opt->arg);
1442 /* Handle -imacros after -D and -U. */
1443 for (i = 0; i < deferred_count; i++)
1445 struct deferred_opt *opt = &deferred_opts[i];
1447 if (opt->code == OPT_imacros
1448 && cpp_push_include (parse_in, opt->arg))
1450 /* Disable push_command_line_include callback for now. */
1451 include_cursor = deferred_count + 1;
1452 cpp_scan_nooutput (parse_in);
1458 push_command_line_include ();
1461 /* Give CPP the next file given by -include, if any. */
1463 push_command_line_include (void)
1465 while (include_cursor < deferred_count)
1467 struct deferred_opt *opt = &deferred_opts[include_cursor++];
1469 if (! cpp_opts->preprocessed && opt->code == OPT_include
1470 && cpp_push_include (parse_in, opt->arg))
1474 if (include_cursor == deferred_count)
1477 /* -Wunused-macros should only warn about macros defined hereafter. */
1478 cpp_opts->warn_unused_macros = warn_unused_macros;
1479 /* Restore the line map from <command line>. */
1480 if (! cpp_opts->preprocessed)
1481 cpp_change_file (parse_in, LC_RENAME, main_input_filename);
1483 /* Set this here so the client can change the option if it wishes,
1484 and after stacking the main file so we don't trace the main file. */
1485 cpp_get_line_maps (parse_in)->trace_includes
1486 = cpp_opts->print_include_names;
1490 /* File change callback. Has to handle -include files. */
1492 cb_file_change (cpp_reader *pfile ATTRIBUTE_UNUSED,
1493 const struct line_map *new_map)
1495 if (flag_preprocess_only)
1496 pp_file_change (new_map);
1498 fe_file_change (new_map);
1500 if (new_map == 0 || (new_map->reason == LC_LEAVE && MAIN_FILE_P (new_map)))
1501 push_command_line_include ();
1505 cb_dir_change (cpp_reader *pfile ATTRIBUTE_UNUSED, const char *dir)
1507 if (! set_src_pwd (dir))
1508 warning ("too late for # directive to set debug directory");
1511 /* Set the C 89 standard (with 1994 amendments if C94, without GNU
1512 extensions if ISO). There is no concept of gnu94. */
1514 set_std_c89 (int c94, int iso)
1516 cpp_set_lang (parse_in, c94 ? CLK_STDC94: iso ? CLK_STDC89: CLK_GNUC89);
1519 flag_no_gnu_keywords = iso;
1520 flag_no_nonansi_builtin = iso;
1523 flag_writable_strings = 0;
1526 /* Set the C 99 standard (without GNU extensions if ISO). */
1528 set_std_c99 (int iso)
1530 cpp_set_lang (parse_in, iso ? CLK_STDC99: CLK_GNUC99);
1532 flag_no_nonansi_builtin = iso;
1536 flag_writable_strings = 0;
1539 /* Set the C++ 98 standard (without GNU extensions if ISO). */
1541 set_std_cxx98 (int iso)
1543 cpp_set_lang (parse_in, iso ? CLK_CXX98: CLK_GNUCXX);
1544 flag_no_gnu_keywords = iso;
1545 flag_no_nonansi_builtin = iso;
1549 /* Handle setting implicit to ON. */
1551 set_Wimplicit (int on)
1554 warn_implicit_int = on;
1557 if (mesg_implicit_function_declaration != 2)
1558 mesg_implicit_function_declaration = 1;
1561 mesg_implicit_function_declaration = 0;
1564 /* Args to -d specify what to dump. Silently ignore
1565 unrecognized options; they may be aimed at toplev.c. */
1567 handle_OPT_d (const char *arg)
1571 while ((c = *arg++) != '\0')
1574 case 'M': /* Dump macros only. */
1575 case 'N': /* Dump names. */
1576 case 'D': /* Dump definitions. */
1577 flag_dump_macros = c;
1581 flag_dump_includes = 1;