1 /* C/ObjC/C++ command line option handling.
2 Copyright (C) 2002, 2003 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
24 #include "coretypes.h"
31 #include "langhooks.h"
32 #include "tree-inline.h"
33 #include "diagnostic.h"
35 #include "cppdefault.h"
36 #include "c-incpath.h"
37 #include "debug.h" /* For debug_hooks. */
41 #ifndef DOLLARS_IN_IDENTIFIERS
42 # define DOLLARS_IN_IDENTIFIERS true
45 #ifndef TARGET_SYSTEM_ROOT
46 # define TARGET_SYSTEM_ROOT NULL
50 # define TARGET_EBCDIC 0
53 static const int lang_flags[] = {CL_C, CL_ObjC, CL_CXX, CL_ObjCXX};
55 static int saved_lineno;
58 static cpp_options *cpp_opts;
61 static const char *in_fname;
63 /* Filename and stream for preprocessed output. */
64 static const char *out_fname;
65 static FILE *out_stream;
67 /* Append dependencies to deps_file. */
68 static bool deps_append;
70 /* If dependency switches (-MF etc.) have been given. */
71 static bool deps_seen;
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 system root, if any. Overridden by -isysroot. */
83 static const char *sysroot = TARGET_SYSTEM_ROOT;
85 /* Zero disables all standard directories for headers. */
86 static bool std_inc = true;
88 /* Zero disables the C++-specific standard directories for headers. */
89 static bool std_cxx_inc = true;
91 /* If the quote chain has been split by -I-. */
92 static bool quote_chain_split;
94 /* If -Wunused-macros. */
95 static bool warn_unused_macros;
97 /* Number of deferred options, deferred options array size. */
98 static size_t deferred_count, deferred_size;
100 /* Number of deferred options scanned for -include. */
101 static size_t include_cursor;
103 static void missing_arg (enum opt_code);
104 static void set_Wimplicit (int);
105 static void print_help (void);
106 static void handle_OPT_d (const char *);
107 static void set_std_cxx98 (int);
108 static void set_std_c89 (int, int);
109 static void set_std_c99 (int);
110 static void check_deps_environment_vars (void);
111 static void handle_deferred_opts (void);
112 static void sanitize_cpp_opts (void);
113 static void add_prefixed_path (const char *, size_t);
114 static void push_command_line_include (void);
115 static void cb_file_change (cpp_reader *, const struct line_map *);
116 static void finish_options (void);
118 #ifndef STDC_0_IN_SYSTEM_HEADERS
119 #define STDC_0_IN_SYSTEM_HEADERS 0
122 /* Holds switches parsed by c_common_handle_option (), but whose
123 handling is deferred to c_common_post_options (). */
124 static void defer_opt (enum opt_code, const char *);
125 static struct deferred_opt
131 /* Complain that switch OPT_INDEX expects an argument but none was
134 missing_arg (enum opt_code code)
136 const char *opt_text = cl_options[code].opt_text;
140 case OPT__output_pch_:
143 case OPT_fabi_version_:
146 case OPT_fname_mangling_version_:
148 case OPT_ftemplate_depth_:
150 case OPT_iwithprefix:
151 case OPT_iwithprefixbefore:
153 error ("missing argument to \"-%s\"", opt_text);
156 case OPT_fconstant_string_class_:
157 error ("no class name specified with \"-%s\"", opt_text);
161 error ("assertion missing after \"-%s\"", opt_text);
166 error ("macro name missing after \"-%s\"", opt_text);
173 error ("missing path after \"-%s\"", opt_text);
182 error ("missing filename after \"-%s\"", opt_text);
187 error ("missing target after \"-%s\"", opt_text);
192 /* Defer option CODE with argument ARG. */
194 defer_opt (enum opt_code code, const char *arg)
196 /* FIXME: this should be in c_common_init_options, which should take
200 extern int save_argc;
201 deferred_size = save_argc;
202 deferred_opts = (struct deferred_opt *)
203 xmalloc (deferred_size * sizeof (struct deferred_opt));
206 if (deferred_count == deferred_size)
209 deferred_opts[deferred_count].code = code;
210 deferred_opts[deferred_count].arg = arg;
214 /* Common initialization before parsing options. */
216 c_common_init_options (enum c_language_kind lang)
219 parse_in = cpp_create_reader (lang == clk_c ? CLK_GNUC89 : CLK_GNUCXX,
221 cpp_opts = cpp_get_options (parse_in);
222 cpp_opts->dollars_in_ident = DOLLARS_IN_IDENTIFIERS;
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;
231 flag_const_strings = (lang == clk_cplusplus);
232 warn_pointer_arith = (lang == clk_cplusplus);
234 return lang_flags[(c_language << 1) + flag_objc];
237 /* Handle switch SCODE with argument ARG. ON is true, unless no-
238 form of an -f or -W option was given. Returns 0 if the switch was
239 invalid, a negative number to prevent language-independent
240 processing in toplev.c (a hack necessary for the short-term). */
242 c_common_handle_option (size_t scode, const char *arg, int value)
244 const struct cl_option *option = &cl_options[scode];
245 enum opt_code code = (enum opt_code) scode;
255 error ("too many filenames given. Type %s --help for usage",
260 if (arg == NULL && (option->flags & (CL_JOINED | CL_SEPARATE)))
275 case OPT__output_pch_:
280 defer_opt (code, arg);
284 cpp_opts->discard_comments = 0;
288 cpp_opts->discard_comments = 0;
289 cpp_opts->discard_comments_in_macro_exp = 0;
293 defer_opt (code, arg);
297 flag_preprocess_only = 1;
301 cpp_opts->print_include_names = 1;
305 if (strcmp (arg, "-"))
306 add_path (xstrdup (arg), BRACKET, 0);
309 if (quote_chain_split)
310 error ("-I- specified twice");
311 quote_chain_split = true;
312 split_quote_chain ();
318 /* When doing dependencies with -M or -MM, suppress normal
319 preprocessed output, but still do -dM etc. as software
320 depends on this. Preprocessed output does occur if -MD, -MMD
321 or environment var dependency generation is used. */
322 cpp_opts->deps.style = (code == OPT_M ? DEPS_SYSTEM: DEPS_USER);
324 cpp_opts->inhibit_warnings = 1;
329 cpp_opts->deps.style = (code == OPT_MD ? DEPS_SYSTEM: DEPS_USER);
340 cpp_opts->deps.missing_files = true;
345 cpp_opts->deps.phony_targets = true;
351 defer_opt (code, arg);
355 flag_no_line_commands = 1;
359 defer_opt (code, arg);
369 set_Wimplicit (value);
370 warn_char_subscripts = value;
371 warn_missing_braces = value;
372 warn_parentheses = value;
373 warn_return_type = value;
374 warn_sequence_point = value; /* Was C only. */
375 if (c_language == clk_cplusplus)
376 warn_sign_compare = value;
378 warn_strict_aliasing = value;
380 /* Only warn about unknown pragmas that are not in system
382 warn_unknown_pragmas = value;
384 /* We save the value of warn_uninitialized, since if they put
385 -Wuninitialized on the command line, we need to generate a
386 warning about not using it without also specifying -O. */
387 if (warn_uninitialized != 1)
388 warn_uninitialized = (value ? 2 : 0);
390 if (c_language == clk_c)
391 /* We set this to 2 here, but 1 in -Wmain, so -ffreestanding
392 can turn it off only if it's not explicit. */
393 warn_main = value * 2;
396 /* C++-specific warnings. */
397 warn_nonvdtor = value;
398 warn_reorder = value;
399 warn_nontemplate_friend = value;
402 cpp_opts->warn_trigraphs = value;
403 cpp_opts->warn_comments = value;
404 cpp_opts->warn_num_sign_change = value;
405 cpp_opts->warn_multichar = value; /* Was C++ only. */
408 case OPT_Wbad_function_cast:
409 warn_bad_function_cast = value;
413 warn_cast_qual = value;
416 case OPT_Wchar_subscripts:
417 warn_char_subscripts = value;
422 cpp_opts->warn_comments = value;
425 case OPT_Wconversion:
426 warn_conversion = value;
429 case OPT_Wctor_dtor_privacy:
430 warn_ctor_dtor_privacy = value;
433 case OPT_Wdeprecated:
434 warn_deprecated = value;
435 cpp_opts->warn_deprecated = value;
438 case OPT_Wdiv_by_zero:
439 warn_div_by_zero = value;
446 case OPT_Wendif_labels:
447 cpp_opts->warn_endif_labels = value;
451 cpp_opts->warnings_are_errors = value;
454 case OPT_Werror_implicit_function_declaration:
455 mesg_implicit_function_declaration = 2;
458 case OPT_Wfloat_equal:
459 warn_float_equal = value;
467 set_Wformat (atoi (arg));
470 case OPT_Wformat_extra_args:
471 warn_format_extra_args = value;
474 case OPT_Wformat_nonliteral:
475 warn_format_nonliteral = value;
478 case OPT_Wformat_security:
479 warn_format_security = value;
482 case OPT_Wformat_y2k:
483 warn_format_y2k = value;
486 case OPT_Wformat_zero_length:
487 warn_format_zero_length = value;
491 set_Wimplicit (value);
494 case OPT_Wimplicit_function_declaration:
495 mesg_implicit_function_declaration = value;
498 case OPT_Wimplicit_int:
499 warn_implicit_int = value;
503 cpp_opts->warn_import = value;
506 case OPT_Winvalid_offsetof:
507 warn_invalid_offsetof = value;
510 case OPT_Winvalid_pch:
511 cpp_opts->warn_invalid_pch = value;
515 warn_long_long = value;
525 case OPT_Wmissing_braces:
526 warn_missing_braces = value;
529 case OPT_Wmissing_declarations:
530 warn_missing_declarations = value;
533 case OPT_Wmissing_format_attribute:
534 warn_missing_format_attribute = value;
537 case OPT_Wmissing_prototypes:
538 warn_missing_prototypes = value;
542 cpp_opts->warn_multichar = value;
545 case OPT_Wnested_externs:
546 warn_nested_externs = value;
549 case OPT_Wnon_template_friend:
550 warn_nontemplate_friend = value;
553 case OPT_Wnon_virtual_dtor:
554 warn_nonvdtor = value;
558 warn_nonnull = value;
561 case OPT_Wold_style_cast:
562 warn_old_style_cast = value;
565 case OPT_Woverloaded_virtual:
566 warn_overloaded_virtual = value;
569 case OPT_Wparentheses:
570 warn_parentheses = value;
573 case OPT_Wpmf_conversions:
574 warn_pmf2ptr = value;
577 case OPT_Wpointer_arith:
578 warn_pointer_arith = value;
582 warn_protocol = value;
586 warn_selector = value;
589 case OPT_Wredundant_decls:
590 warn_redundant_decls = value;
594 warn_reorder = value;
597 case OPT_Wreturn_type:
598 warn_return_type = value;
601 case OPT_Wsequence_point:
602 warn_sequence_point = value;
605 case OPT_Wsign_compare:
606 warn_sign_compare = value;
609 case OPT_Wsign_promo:
610 warn_sign_promo = value;
613 case OPT_Wstrict_prototypes:
614 warn_strict_prototypes = value;
621 case OPT_Wsystem_headers:
622 cpp_opts->warn_system_headers = value;
625 case OPT_Wtraditional:
626 warn_traditional = value;
627 cpp_opts->warn_traditional = value;
631 cpp_opts->warn_trigraphs = value;
634 case OPT_Wundeclared_selector:
635 warn_undeclared_selector = value;
639 cpp_opts->warn_undef = value;
642 case OPT_Wunknown_pragmas:
643 /* Set to greater than 1, so that even unknown pragmas in
644 system headers will be warned about. */
645 warn_unknown_pragmas = value * 2;
648 case OPT_Wunused_macros:
649 warn_unused_macros = value;
652 case OPT_Wwrite_strings:
653 if (c_language == clk_c)
654 flag_const_strings = value;
656 warn_write_strings = value;
660 if (c_language == clk_c)
661 set_std_c89 (false, true);
663 set_std_cxx98 (true);
670 case OPT_fcond_mismatch:
671 if (c_language == clk_c)
673 flag_cond_mismatch = value;
678 case OPT_fall_virtual:
679 case OPT_fenum_int_equiv:
680 case OPT_fguiding_decls:
682 case OPT_fhuge_objects:
684 case OPT_fname_mangling_version_:
686 case OPT_fnonnull_objects:
688 case OPT_fstrict_prototype:
689 case OPT_fthis_is_variable:
690 case OPT_fvtable_thunks:
692 warning ("switch \"%s\" is no longer supported", option->opt_text);
695 case OPT_fabi_version_:
696 flag_abi_version = value;
699 case OPT_faccess_control:
700 flag_access_control = value;
703 case OPT_falt_external_templates:
704 flag_alt_external_templates = value;
706 flag_external_templates = true;
708 warning ("switch \"%s\" is deprecated, please see documentation for details", option->opt_text);
712 flag_no_asm = !value;
716 flag_no_builtin = !value;
723 disable_builtin_function (arg);
726 case OPT_fdollars_in_identifiers:
727 cpp_opts->dollars_in_ident = value;
731 if (!dump_switch_p (arg))
735 case OPT_ffreestanding:
737 /* Fall through... */
740 flag_no_builtin = !value;
741 /* warn_main will be 2 if set by -Wall, 1 if set by -Wmain */
742 if (!value && warn_main == 2)
746 case OPT_fshort_double:
747 flag_short_double = value;
750 case OPT_fshort_enums:
751 flag_short_enums = value;
754 case OPT_fshort_wchar:
755 flag_short_wchar = value;
758 case OPT_fsigned_bitfields:
759 flag_signed_bitfields = value;
760 explicit_flag_signed_bitfields = 1;
763 case OPT_fsigned_char:
764 flag_signed_char = value;
767 case OPT_funsigned_bitfields:
768 flag_signed_bitfields = !value;
769 explicit_flag_signed_bitfields = 1;
772 case OPT_funsigned_char:
773 flag_signed_char = !value;
777 flag_check_new = value;
780 case OPT_fconserve_space:
781 flag_conserve_space = value;
784 case OPT_fconst_strings:
785 flag_const_strings = value;
788 case OPT_fconstant_string_class_:
789 constant_string_class_name = arg;
792 case OPT_fdefault_inline:
793 flag_default_inline = value;
796 case OPT_felide_constructors:
797 flag_elide_constructors = value;
800 case OPT_fenforce_eh_specs:
801 flag_enforce_eh_specs = value;
804 case OPT_fexternal_templates:
805 flag_external_templates = value;
808 case OPT_ffixed_form:
809 case OPT_ffixed_line_length_:
810 /* Fortran front end options ignored when preprocessing only. */
811 if (!flag_preprocess_only)
816 flag_new_for_scope = value;
819 case OPT_fgnu_keywords:
820 flag_no_gnu_keywords = !value;
823 case OPT_fgnu_runtime:
824 flag_next_runtime = !value;
827 case OPT_fhandle_exceptions:
828 warning ("-fhandle-exceptions has been renamed -fexceptions (and is now on by default)");
829 flag_exceptions = value;
832 case OPT_fimplement_inlines:
833 flag_implement_inlines = value;
836 case OPT_fimplicit_inline_templates:
837 flag_implicit_inline_templates = value;
840 case OPT_fimplicit_templates:
841 flag_implicit_templates = value;
844 case OPT_fms_extensions:
845 flag_ms_extensions = value;
848 case OPT_fnext_runtime:
849 flag_next_runtime = value;
852 case OPT_fnonansi_builtins:
853 flag_no_nonansi_builtin = !value;
856 case OPT_foperator_names:
857 cpp_opts->operator_names = value;
860 case OPT_foptional_diags:
861 flag_optional_diags = value;
865 cpp_opts->restore_pch_deps = value;
868 case OPT_fpermissive:
869 flag_permissive = value;
872 case OPT_fpreprocessed:
873 cpp_opts->preprocessed = value;
877 flag_use_repository = value;
879 flag_implicit_templates = 0;
886 case OPT_fshow_column:
887 cpp_opts->show_column = value;
891 flag_detailed_statistics = value;
895 /* It is documented that we silently ignore silly values. */
896 if (value >= 1 && value <= 100)
897 cpp_opts->tabstop = value;
900 case OPT_ftemplate_depth_:
901 max_tinst_depth = value;
905 flag_vtable_gc = value;
908 case OPT_fuse_cxa_atexit:
909 flag_use_cxa_atexit = value;
917 flag_gen_declaration = 1;
921 add_path (xstrdup (arg), AFTER, 0);
926 defer_opt (code, arg);
938 add_path (xstrdup (arg), SYSTEM, 0);
941 case OPT_iwithprefix:
942 add_prefixed_path (arg, SYSTEM);
945 case OPT_iwithprefixbefore:
946 add_prefixed_path (arg, BRACKET);
950 cpp_set_lang (parse_in, CLK_ASM);
951 cpp_opts->dollars_in_ident = false;
970 error ("output filename specified twice");
973 /* We need to handle the -pedantic switches here, rather than in
974 c_common_post_options, so that a subsequent -Wno-endif-labels
975 is not overridden. */
976 case OPT_pedantic_errors:
977 cpp_opts->pedantic_errors = 1;
980 cpp_opts->pedantic = 1;
981 cpp_opts->warn_endif_labels = 1;
984 case OPT_print_objc_runtime_info:
985 print_struct_values = 1;
993 case OPT_std_gnu__98:
994 set_std_cxx98 (code == OPT_std_c__98 /* ISO */);
998 case OPT_std_iso9899_1990:
999 case OPT_std_iso9899_199409:
1000 set_std_c89 (code == OPT_std_iso9899_199409 /* c94 */, true /* ISO */);
1004 set_std_c89 (false /* c94 */, false /* ISO */);
1009 case OPT_std_iso9899_1999:
1010 case OPT_std_iso9899_199x:
1011 set_std_c99 (true /* ISO */);
1016 set_std_c99 (false /* ISO */);
1020 cpp_opts->trigraphs = 1;
1023 case OPT_traditional_cpp:
1024 cpp_opts->traditional = 1;
1032 cpp_opts->inhibit_warnings = 1;
1043 /* Post-switch processing. */
1045 c_common_post_options (const char **pfilename)
1047 /* Canonicalize the input and output filenames. */
1048 if (in_fname == NULL || !strcmp (in_fname, "-"))
1051 if (out_fname == NULL || !strcmp (out_fname, "-"))
1054 if (cpp_opts->deps.style == DEPS_NONE)
1055 check_deps_environment_vars ();
1057 handle_deferred_opts ();
1059 sanitize_cpp_opts ();
1061 register_include_chains (parse_in, sysroot, iprefix,
1062 std_inc, std_cxx_inc && c_language == clk_cplusplus,
1065 flag_inline_trees = 1;
1067 /* Use tree inlining if possible. Function instrumentation is only
1068 done in the RTL level, so we disable tree inlining. */
1069 if (! flag_instrument_function_entry_exit)
1071 if (!flag_no_inline)
1073 if (flag_inline_functions)
1075 flag_inline_trees = 2;
1076 flag_inline_functions = 0;
1080 /* -Wextra implies -Wsign-compare, but not if explicitly
1082 if (warn_sign_compare == -1)
1083 warn_sign_compare = extra_warnings;
1085 /* Special format checking options don't work without -Wformat; warn if
1087 if (warn_format_y2k && !warn_format)
1088 warning ("-Wformat-y2k ignored without -Wformat");
1089 if (warn_format_extra_args && !warn_format)
1090 warning ("-Wformat-extra-args ignored without -Wformat");
1091 if (warn_format_zero_length && !warn_format)
1092 warning ("-Wformat-zero-length ignored without -Wformat");
1093 if (warn_format_nonliteral && !warn_format)
1094 warning ("-Wformat-nonliteral ignored without -Wformat");
1095 if (warn_format_security && !warn_format)
1096 warning ("-Wformat-security ignored without -Wformat");
1097 if (warn_missing_format_attribute && !warn_format)
1098 warning ("-Wmissing-format-attribute ignored without -Wformat");
1100 if (flag_preprocess_only)
1102 /* Open the output now. We must do so even if flag_no_output is
1103 on, because there may be other output than from the actual
1104 preprocessing (e.g. from -dM). */
1105 if (out_fname[0] == '\0')
1106 out_stream = stdout;
1108 out_stream = fopen (out_fname, "w");
1110 if (out_stream == NULL)
1112 fatal_error ("opening output file %s: %m", out_fname);
1116 init_pp_output (out_stream);
1122 /* Yuk. WTF is this? I do know ObjC relies on it somewhere. */
1126 cpp_get_callbacks (parse_in)->file_change = cb_file_change;
1128 /* NOTE: we use in_fname here, not the one supplied. */
1129 *pfilename = cpp_read_main_file (parse_in, in_fname);
1131 saved_lineno = input_line;
1134 /* If an error has occurred in cpplib, note it so we fail
1136 errorcount += cpp_errors (parse_in);
1138 return flag_preprocess_only;
1141 /* Front end initialization common to C, ObjC and C++. */
1143 c_common_init (void)
1145 input_line = saved_lineno;
1147 /* Set up preprocessor arithmetic. Must be done after call to
1148 c_common_nodes_and_builtins for type nodes to be good. */
1149 cpp_opts->precision = TYPE_PRECISION (intmax_type_node);
1150 cpp_opts->char_precision = TYPE_PRECISION (char_type_node);
1151 cpp_opts->int_precision = TYPE_PRECISION (integer_type_node);
1152 cpp_opts->wchar_precision = TYPE_PRECISION (wchar_type_node);
1153 cpp_opts->unsigned_wchar = TREE_UNSIGNED (wchar_type_node);
1154 cpp_opts->EBCDIC = TARGET_EBCDIC;
1156 if (flag_preprocess_only)
1159 preprocess_file (parse_in);
1163 /* Has to wait until now so that cpplib has its hash table. */
1169 /* A thin wrapper around the real parser that initializes the
1170 integrated preprocessor after debug output has been initialized.
1171 Also, make sure the start_source_file debug hook gets called for
1172 the primary source file. */
1174 c_common_parse_file (int set_yydebug ATTRIBUTE_UNUSED)
1177 yydebug = set_yydebug;
1179 warning ("YYDEBUG not defined");
1182 (*debug_hooks->start_source_file) (input_line, input_filename);
1186 free_parser_stacks ();
1189 /* Common finish hook for the C, ObjC and C++ front ends. */
1191 c_common_finish (void)
1193 FILE *deps_stream = NULL;
1195 if (cpp_opts->deps.style != DEPS_NONE)
1197 /* If -M or -MM was seen without -MF, default output to the
1200 deps_stream = out_stream;
1203 deps_stream = fopen (deps_file, deps_append ? "a": "w");
1205 fatal_error ("opening dependency file %s: %m", deps_file);
1209 /* For performance, avoid tearing down cpplib's internal structures
1210 with cpp_destroy (). */
1211 errorcount += cpp_finish (parse_in, deps_stream);
1213 if (deps_stream && deps_stream != out_stream
1214 && (ferror (deps_stream) || fclose (deps_stream)))
1215 fatal_error ("closing dependency file %s: %m", deps_file);
1217 if (out_stream && (ferror (out_stream) || fclose (out_stream)))
1218 fatal_error ("when writing output to %s: %m", out_fname);
1221 /* Either of two environment variables can specify output of
1222 dependencies. Their value is either "OUTPUT_FILE" or "OUTPUT_FILE
1223 DEPS_TARGET", where OUTPUT_FILE is the file to write deps info to
1224 and DEPS_TARGET is the target to mention in the deps. They also
1225 result in dependency information being appended to the output file
1226 rather than overwriting it, and like Sun's compiler
1227 SUNPRO_DEPENDENCIES suppresses the dependency on the main file. */
1229 check_deps_environment_vars (void)
1233 GET_ENVIRONMENT (spec, "DEPENDENCIES_OUTPUT");
1235 cpp_opts->deps.style = DEPS_USER;
1238 GET_ENVIRONMENT (spec, "SUNPRO_DEPENDENCIES");
1241 cpp_opts->deps.style = DEPS_SYSTEM;
1242 cpp_opts->deps.ignore_main_file = true;
1248 /* Find the space before the DEPS_TARGET, if there is one. */
1249 char *s = strchr (spec, ' ');
1252 /* Let the caller perform MAKE quoting. */
1253 defer_opt (OPT_MT, s + 1);
1257 /* Command line -MF overrides environment variables and default. */
1265 /* Handle deferred command line switches. */
1267 handle_deferred_opts (void)
1271 for (i = 0; i < deferred_count; i++)
1273 struct deferred_opt *opt = &deferred_opts[i];
1275 if (opt->code == OPT_MT || opt->code == OPT_MQ)
1276 cpp_add_dependency_target (parse_in, opt->arg, opt->code == OPT_MQ);
1280 /* These settings are appropriate for GCC, but not necessarily so for
1281 cpplib as a library. */
1283 sanitize_cpp_opts (void)
1285 /* If we don't know what style of dependencies to output, complain
1286 if any other dependency switches have been given. */
1287 if (deps_seen && cpp_opts->deps.style == DEPS_NONE)
1288 error ("to generate dependencies you must specify either -M or -MM");
1290 /* -dM and dependencies suppress normal output; do it here so that
1291 the last -d[MDN] switch overrides earlier ones. */
1292 if (flag_dump_macros == 'M')
1295 /* Disable -dD, -dN and -dI if normal output is suppressed. Allow
1296 -dM since at least glibc relies on -M -dM to work. */
1299 if (flag_dump_macros != 'M')
1300 flag_dump_macros = 0;
1301 flag_dump_includes = 0;
1304 cpp_opts->unsigned_char = !flag_signed_char;
1305 cpp_opts->stdc_0_in_system_headers = STDC_0_IN_SYSTEM_HEADERS;
1307 /* We want -Wno-long-long to override -pedantic -std=non-c99
1308 and/or -Wtraditional, whatever the ordering. */
1309 cpp_opts->warn_long_long
1310 = warn_long_long && ((!flag_isoc99 && pedantic) || warn_traditional);
1313 /* Add include path with a prefix at the front of its name. */
1315 add_prefixed_path (const char *suffix, size_t chain)
1319 size_t prefix_len, suffix_len;
1321 suffix_len = strlen (suffix);
1322 prefix = iprefix ? iprefix : cpp_GCC_INCLUDE_DIR;
1323 prefix_len = iprefix ? strlen (iprefix) : cpp_GCC_INCLUDE_DIR_len;
1325 path = xmalloc (prefix_len + suffix_len + 1);
1326 memcpy (path, prefix, prefix_len);
1327 memcpy (path + prefix_len, suffix, suffix_len);
1328 path[prefix_len + suffix_len] = '\0';
1330 add_path (path, chain, 0);
1333 /* Handle -D, -U, -A, -imacros, and the first -include. */
1335 finish_options (void)
1337 if (!cpp_opts->preprocessed)
1341 cpp_change_file (parse_in, LC_RENAME, _("<built-in>"));
1342 cpp_init_builtins (parse_in, flag_hosted);
1343 c_cpp_builtins (parse_in);
1345 /* We're about to send user input to cpplib, so make it warn for
1346 things that we previously (when we sent it internal definitions)
1347 told it to not warn.
1349 C99 permits implementation-defined characters in identifiers.
1350 The documented meaning of -std= is to turn off extensions that
1351 conflict with the specified standard, and since a strictly
1352 conforming program cannot contain a '$', we do not condition
1353 their acceptance on the -std= setting. */
1354 cpp_opts->warn_dollars = (cpp_opts->pedantic && !cpp_opts->c99);
1356 cpp_change_file (parse_in, LC_RENAME, _("<command line>"));
1357 for (i = 0; i < deferred_count; i++)
1359 struct deferred_opt *opt = &deferred_opts[i];
1361 if (opt->code == OPT_D)
1362 cpp_define (parse_in, opt->arg);
1363 else if (opt->code == OPT_U)
1364 cpp_undef (parse_in, opt->arg);
1365 else if (opt->code == OPT_A)
1367 if (opt->arg[0] == '-')
1368 cpp_unassert (parse_in, opt->arg + 1);
1370 cpp_assert (parse_in, opt->arg);
1374 /* Handle -imacros after -D and -U. */
1375 for (i = 0; i < deferred_count; i++)
1377 struct deferred_opt *opt = &deferred_opts[i];
1379 if (opt->code == OPT_imacros
1380 && cpp_push_include (parse_in, opt->arg))
1381 cpp_scan_nooutput (parse_in);
1385 push_command_line_include ();
1388 /* Give CPP the next file given by -include, if any. */
1390 push_command_line_include (void)
1392 if (cpp_opts->preprocessed)
1395 while (include_cursor < deferred_count)
1397 struct deferred_opt *opt = &deferred_opts[include_cursor++];
1399 if (opt->code == OPT_include && cpp_push_include (parse_in, opt->arg))
1403 if (include_cursor == deferred_count)
1405 /* Restore the line map from <command line>. */
1406 cpp_change_file (parse_in, LC_RENAME, main_input_filename);
1407 /* -Wunused-macros should only warn about macros defined hereafter. */
1408 cpp_opts->warn_unused_macros = warn_unused_macros;
1413 /* File change callback. Has to handle -include files. */
1415 cb_file_change (cpp_reader *pfile ATTRIBUTE_UNUSED,
1416 const struct line_map *new_map)
1418 if (flag_preprocess_only)
1419 pp_file_change (new_map);
1421 fe_file_change (new_map);
1423 if (new_map->reason == LC_LEAVE && MAIN_FILE_P (new_map))
1424 push_command_line_include ();
1427 /* Set the C 89 standard (with 1994 amendments if C94, without GNU
1428 extensions if ISO). There is no concept of gnu94. */
1430 set_std_c89 (int c94, int iso)
1432 cpp_set_lang (parse_in, c94 ? CLK_STDC94: iso ? CLK_STDC89: CLK_GNUC89);
1435 flag_no_gnu_keywords = iso;
1436 flag_no_nonansi_builtin = iso;
1437 flag_noniso_default_format_attributes = !iso;
1440 flag_writable_strings = 0;
1443 /* Set the C 99 standard (without GNU extensions if ISO). */
1445 set_std_c99 (int iso)
1447 cpp_set_lang (parse_in, iso ? CLK_STDC99: CLK_GNUC99);
1449 flag_no_nonansi_builtin = iso;
1450 flag_noniso_default_format_attributes = !iso;
1454 flag_writable_strings = 0;
1457 /* Set the C++ 98 standard (without GNU extensions if ISO). */
1459 set_std_cxx98 (int iso)
1461 cpp_set_lang (parse_in, iso ? CLK_CXX98: CLK_GNUCXX);
1462 flag_no_gnu_keywords = iso;
1463 flag_no_nonansi_builtin = iso;
1464 flag_noniso_default_format_attributes = !iso;
1468 /* Handle setting implicit to ON. */
1470 set_Wimplicit (int on)
1473 warn_implicit_int = on;
1476 if (mesg_implicit_function_declaration != 2)
1477 mesg_implicit_function_declaration = 1;
1480 mesg_implicit_function_declaration = 0;
1483 /* Args to -d specify what to dump. Silently ignore
1484 unrecognized options; they may be aimed at toplev.c. */
1486 handle_OPT_d (const char *arg)
1490 while ((c = *arg++) != '\0')
1493 case 'M': /* Dump macros only. */
1494 case 'N': /* Dump names. */
1495 case 'D': /* Dump definitions. */
1496 flag_dump_macros = c;
1500 flag_dump_includes = 1;
1505 /* Handle --help output. */
1509 /* To keep the lines from getting too long for some compilers, limit
1510 to about 500 characters (6 lines) per chunk. */
1513 -include <file> Include the contents of <file> before other files\n\
1514 -imacros <file> Accept definition of macros in <file>\n\
1515 -iprefix <path> Specify <path> as a prefix for next two options\n\
1516 -iwithprefix <dir> Add <dir> to the end of the system include path\n\
1517 -iwithprefixbefore <dir> Add <dir> to the end of the main include path\n\
1518 -isystem <dir> Add <dir> to the start of the system include path\n\
1521 -idirafter <dir> Add <dir> to the end of the system include path\n\
1522 -I <dir> Add <dir> to the end of the main include path\n\
1523 -I- Fine-grained include path control; see info docs\n\
1524 -nostdinc Do not search system include directories\n\
1525 (dirs specified with -isystem will still be used)\n\
1526 -nostdinc++ Do not search system include directories for C++\n\
1527 -o <file> Put output into <file>\n\
1530 -trigraphs Support ISO C trigraphs\n\
1531 -std=<std name> Specify the conformance standard; one of:\n\
1532 gnu89, gnu99, c89, c99, iso9899:1990,\n\
1533 iso9899:199409, iso9899:1999, c++98\n\
1534 -w Inhibit warning messages\n\
1535 -W[no-]trigraphs Warn if trigraphs are encountered\n\
1536 -W[no-]comment{s} Warn if one comment starts inside another\n\
1539 -W[no-]traditional Warn about features not present in traditional C\n\
1540 -W[no-]undef Warn if an undefined macro is used by #if\n\
1541 -W[no-]import Warn about the use of the #import directive\n\
1544 -W[no-]error Treat all warnings as errors\n\
1545 -W[no-]system-headers Do not suppress warnings from system headers\n\
1546 -W[no-]all Enable most preprocessor warnings\n\
1549 -M Generate make dependencies\n\
1550 -MM As -M, but ignore system header files\n\
1551 -MD Generate make dependencies and compile\n\
1552 -MMD As -MD, but ignore system header files\n\
1553 -MF <file> Write dependency output to the given file\n\
1554 -MG Treat missing header file as generated files\n\
1557 -MP Generate phony targets for all headers\n\
1558 -MQ <target> Add a MAKE-quoted target\n\
1559 -MT <target> Add an unquoted target\n\
1562 -D<macro> Define a <macro> with string '1' as its value\n\
1563 -D<macro>=<val> Define a <macro> with <val> as its value\n\
1564 -A<question>=<answer> Assert the <answer> to <question>\n\
1565 -A-<question>=<answer> Disable the <answer> to <question>\n\
1566 -U<macro> Undefine <macro> \n\
1567 -v Display the version number\n\
1570 -H Print the name of header files as they are used\n\
1571 -C Do not discard comments\n\
1572 -dM Display a list of macro definitions active at end\n\
1573 -dD Preserve macro definitions in output\n\
1574 -dN As -dD except that only the names are preserved\n\
1575 -dI Include #include directives in the output\n\
1578 -f[no-]preprocessed Treat the input file as already preprocessed\n\
1579 -ftabstop=<number> Distance between tab stops for column reporting\n\
1580 -isysroot <dir> Set <dir> to be the system root directory\n\
1581 -P Do not generate #line directives\n\
1582 -remap Remap file names when including files\n\
1583 --help Display this information\n\