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. */
39 #include "c-options.h"
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 PARAMS ((enum opt_code));
104 static void set_Wimplicit PARAMS ((int));
105 static void complain_wrong_lang PARAMS ((size_t));
106 static void write_langs PARAMS ((char *, int));
107 static void print_help PARAMS ((void));
108 static void handle_OPT_d PARAMS ((const char *));
109 static void set_std_cxx98 PARAMS ((int));
110 static void set_std_c89 PARAMS ((int, int));
111 static void set_std_c99 PARAMS ((int));
112 static void check_deps_environment_vars PARAMS ((void));
113 static void handle_deferred_opts PARAMS ((void));
114 static void sanitize_cpp_opts PARAMS ((void));
115 static void add_prefixed_path PARAMS ((const char *, size_t));
116 static void push_command_line_include PARAMS ((void));
117 static void cb_file_change PARAMS ((cpp_reader *, const struct line_map *));
118 static void finish_options PARAMS ((void));
120 #ifndef STDC_0_IN_SYSTEM_HEADERS
121 #define STDC_0_IN_SYSTEM_HEADERS 0
124 /* Holds switches parsed by c_common_handle_option (), but whose
125 handling is deferred to c_common_post_options (). */
126 static void defer_opt PARAMS ((enum opt_code, const char *));
127 static struct deferred_opt
133 /* Complain that switch OPT_INDEX expects an argument but none was
136 missing_arg (enum opt_code code)
138 const char *opt_text = cl_options[code].opt_text;
142 case OPT__output_pch_:
145 case OPT_fabi_version_:
148 case OPT_fname_mangling_version_:
150 case OPT_ftemplate_depth_:
152 case OPT_iwithprefix:
153 case OPT_iwithprefixbefore:
155 error ("missing argument to \"-%s\"", opt_text);
158 case OPT_fconstant_string_class_:
159 error ("no class name specified with \"-%s\"", opt_text);
163 error ("assertion missing after \"-%s\"", opt_text);
168 error ("macro name missing after \"-%s\"", opt_text);
175 error ("missing path after \"-%s\"", opt_text);
184 error ("missing filename after \"-%s\"", opt_text);
189 error ("missing target after \"-%s\"", opt_text);
194 /* Defer option CODE with argument ARG. */
196 defer_opt (code, arg)
200 /* FIXME: this should be in c_common_init_options, which should take
204 extern int save_argc;
205 deferred_size = save_argc;
206 deferred_opts = (struct deferred_opt *)
207 xmalloc (deferred_size * sizeof (struct deferred_opt));
210 if (deferred_count == deferred_size)
213 deferred_opts[deferred_count].code = code;
214 deferred_opts[deferred_count].arg = arg;
218 /* Common initialization before parsing options. */
220 c_common_init_options (lang)
221 enum c_language_kind lang;
224 parse_in = cpp_create_reader (lang == clk_c ? CLK_GNUC89 : CLK_GNUCXX,
226 cpp_opts = cpp_get_options (parse_in);
227 cpp_opts->dollars_in_ident = DOLLARS_IN_IDENTIFIERS;
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 on)
244 const struct cl_option *option = &cl_options[scode];
245 enum opt_code code = (enum opt_code) scode;
246 int result = 1, lang_mask;
255 error ("too many filenames given. Type %s --help for usage",
260 lang_mask = lang_flags[(c_language << 1) + flag_objc];
261 if (!(option->flags & lang_mask))
263 complain_wrong_lang (code);
267 if (arg == NULL && (option->flags & (CL_JOINED | CL_SEPARATE)))
282 case OPT__output_pch_:
287 defer_opt (code, arg);
291 cpp_opts->discard_comments = 0;
295 cpp_opts->discard_comments = 0;
296 cpp_opts->discard_comments_in_macro_exp = 0;
300 defer_opt (code, arg);
304 flag_preprocess_only = 1;
308 cpp_opts->print_include_names = 1;
312 if (strcmp (arg, "-"))
313 add_path (xstrdup (arg), BRACKET, 0);
316 if (quote_chain_split)
317 error ("-I- specified twice");
318 quote_chain_split = true;
319 split_quote_chain ();
325 /* When doing dependencies with -M or -MM, suppress normal
326 preprocessed output, but still do -dM etc. as software
327 depends on this. Preprocessed output does occur if -MD, -MMD
328 or environment var dependency generation is used. */
329 cpp_opts->deps.style = (code == OPT_M ? DEPS_SYSTEM: DEPS_USER);
331 cpp_opts->inhibit_warnings = 1;
336 cpp_opts->deps.style = (code == OPT_MD ? DEPS_SYSTEM: DEPS_USER);
347 cpp_opts->deps.missing_files = true;
352 cpp_opts->deps.phony_targets = true;
358 defer_opt (code, arg);
362 flag_no_line_commands = 1;
366 defer_opt (code, arg);
377 warn_char_subscripts = on;
378 warn_missing_braces = on;
379 warn_parentheses = on;
380 warn_return_type = on;
381 warn_sequence_point = on; /* Was C only. */
382 if (c_language == clk_cplusplus)
383 warn_sign_compare = on;
385 warn_strict_aliasing = on;
387 /* Only warn about unknown pragmas that are not in system
389 warn_unknown_pragmas = on;
391 /* We save the value of warn_uninitialized, since if they put
392 -Wuninitialized on the command line, we need to generate a
393 warning about not using it without also specifying -O. */
394 if (warn_uninitialized != 1)
395 warn_uninitialized = (on ? 2 : 0);
397 if (c_language == clk_c)
398 /* We set this to 2 here, but 1 in -Wmain, so -ffreestanding
399 can turn it off only if it's not explicit. */
403 /* C++-specific warnings. */
406 warn_nontemplate_friend = on;
409 cpp_opts->warn_trigraphs = on;
410 cpp_opts->warn_comments = on;
411 cpp_opts->warn_num_sign_change = on;
412 cpp_opts->warn_multichar = on; /* Was C++ only. */
415 case OPT_Wbad_function_cast:
416 warn_bad_function_cast = on;
423 case OPT_Wchar_subscripts:
424 warn_char_subscripts = on;
429 cpp_opts->warn_comments = on;
432 case OPT_Wconversion:
433 warn_conversion = on;
436 case OPT_Wctor_dtor_privacy:
437 warn_ctor_dtor_privacy = on;
440 case OPT_Wdeprecated:
441 warn_deprecated = on;
442 cpp_opts->warn_deprecated = on;
445 case OPT_Wdiv_by_zero:
446 warn_div_by_zero = on;
453 case OPT_Wendif_labels:
454 cpp_opts->warn_endif_labels = on;
458 cpp_opts->warnings_are_errors = on;
461 case OPT_Werror_implicit_function_declaration:
462 mesg_implicit_function_declaration = 2;
465 case OPT_Wfloat_equal:
466 warn_float_equal = on;
474 set_Wformat (atoi (arg));
477 case OPT_Wformat_extra_args:
478 warn_format_extra_args = on;
481 case OPT_Wformat_nonliteral:
482 warn_format_nonliteral = on;
485 case OPT_Wformat_security:
486 warn_format_security = on;
489 case OPT_Wformat_y2k:
490 warn_format_y2k = on;
493 case OPT_Wformat_zero_length:
494 warn_format_zero_length = on;
501 case OPT_Wimplicit_function_declaration:
502 mesg_implicit_function_declaration = on;
505 case OPT_Wimplicit_int:
506 warn_implicit_int = on;
510 cpp_opts->warn_import = on;
513 case OPT_Winvalid_offsetof:
514 warn_invalid_offsetof = on;
517 case OPT_Winvalid_pch:
518 cpp_opts->warn_invalid_pch = on;
532 case OPT_Wmissing_braces:
533 warn_missing_braces = on;
536 case OPT_Wmissing_declarations:
537 warn_missing_declarations = on;
540 case OPT_Wmissing_format_attribute:
541 warn_missing_format_attribute = on;
544 case OPT_Wmissing_prototypes:
545 warn_missing_prototypes = on;
549 cpp_opts->warn_multichar = on;
552 case OPT_Wnested_externs:
553 warn_nested_externs = on;
556 case OPT_Wnon_template_friend:
557 warn_nontemplate_friend = on;
560 case OPT_Wnon_virtual_dtor:
568 case OPT_Wold_style_cast:
569 warn_old_style_cast = on;
572 case OPT_Woverloaded_virtual:
573 warn_overloaded_virtual = on;
576 case OPT_Wparentheses:
577 warn_parentheses = on;
580 case OPT_Wpmf_conversions:
584 case OPT_Wpointer_arith:
585 warn_pointer_arith = on;
596 case OPT_Wredundant_decls:
597 warn_redundant_decls = on;
604 case OPT_Wreturn_type:
605 warn_return_type = on;
608 case OPT_Wsequence_point:
609 warn_sequence_point = on;
612 case OPT_Wsign_compare:
613 warn_sign_compare = on;
616 case OPT_Wsign_promo:
617 warn_sign_promo = on;
620 case OPT_Wstrict_prototypes:
621 warn_strict_prototypes = on;
628 case OPT_Wsystem_headers:
629 cpp_opts->warn_system_headers = on;
632 case OPT_Wtraditional:
633 warn_traditional = on;
634 cpp_opts->warn_traditional = on;
638 cpp_opts->warn_trigraphs = on;
641 case OPT_Wundeclared_selector:
642 warn_undeclared_selector = on;
646 cpp_opts->warn_undef = on;
649 case OPT_Wunknown_pragmas:
650 /* Set to greater than 1, so that even unknown pragmas in
651 system headers will be warned about. */
652 warn_unknown_pragmas = on * 2;
655 case OPT_Wunused_macros:
656 warn_unused_macros = on;
659 case OPT_Wwrite_strings:
660 if (c_language == clk_c)
661 flag_const_strings = on;
663 warn_write_strings = on;
667 if (c_language == clk_c)
668 set_std_c89 (false, true);
670 set_std_cxx98 (true);
677 case OPT_fcond_mismatch:
678 if (c_language == clk_c)
680 flag_cond_mismatch = on;
685 case OPT_fall_virtual:
686 case OPT_fenum_int_equiv:
687 case OPT_fguiding_decls:
689 case OPT_fhuge_objects:
691 case OPT_fname_mangling_version_:
693 case OPT_fnonnull_objects:
695 case OPT_fstrict_prototype:
696 case OPT_fthis_is_variable:
697 case OPT_fvtable_thunks:
699 warning ("switch \"%s\" is no longer supported", option->opt_text);
702 case OPT_fabi_version_:
703 flag_abi_version = read_integral_parameter (arg, option->opt_text, 1);
706 case OPT_faccess_control:
707 flag_access_control = on;
710 case OPT_falt_external_templates:
711 flag_alt_external_templates = on;
713 flag_external_templates = true;
715 warning ("switch \"%s\" is deprecated, please see documentation for details", option->opt_text);
723 flag_no_builtin = !on;
730 disable_builtin_function (arg);
733 case OPT_fdollars_in_identifiers:
734 cpp_opts->dollars_in_ident = on;
738 if (!dump_switch_p (option->opt_text + strlen ("f")))
742 case OPT_ffreestanding:
744 /* Fall through... */
747 flag_no_builtin = !on;
748 /* warn_main will be 2 if set by -Wall, 1 if set by -Wmain */
749 if (!on && warn_main == 2)
753 case OPT_fshort_double:
754 flag_short_double = on;
757 case OPT_fshort_enums:
758 flag_short_enums = on;
761 case OPT_fshort_wchar:
762 flag_short_wchar = on;
765 case OPT_fsigned_bitfields:
766 flag_signed_bitfields = on;
767 explicit_flag_signed_bitfields = 1;
770 case OPT_fsigned_char:
771 flag_signed_char = on;
774 case OPT_funsigned_bitfields:
775 flag_signed_bitfields = !on;
776 explicit_flag_signed_bitfields = 1;
779 case OPT_funsigned_char:
780 flag_signed_char = !on;
787 case OPT_fconserve_space:
788 flag_conserve_space = on;
791 case OPT_fconst_strings:
792 flag_const_strings = on;
795 case OPT_fconstant_string_class_:
796 constant_string_class_name = arg;
799 case OPT_fdefault_inline:
800 flag_default_inline = on;
803 case OPT_felide_constructors:
804 flag_elide_constructors = on;
807 case OPT_fenforce_eh_specs:
808 flag_enforce_eh_specs = on;
811 case OPT_fexternal_templates:
812 flag_external_templates = on;
815 case OPT_ffixed_form:
816 case OPT_ffixed_line_length_:
817 /* Fortran front end options ignored when preprocessing only. */
818 if (flag_preprocess_only)
823 flag_new_for_scope = on;
826 case OPT_fgnu_keywords:
827 flag_no_gnu_keywords = !on;
830 case OPT_fgnu_runtime:
831 flag_next_runtime = !on;
834 case OPT_fhandle_exceptions:
835 warning ("-fhandle-exceptions has been renamed -fexceptions (and is now on by default)");
836 flag_exceptions = on;
839 case OPT_fimplement_inlines:
840 flag_implement_inlines = on;
843 case OPT_fimplicit_inline_templates:
844 flag_implicit_inline_templates = on;
847 case OPT_fimplicit_templates:
848 flag_implicit_templates = on;
851 case OPT_fms_extensions:
852 flag_ms_extensions = on;
855 case OPT_fnext_runtime:
856 flag_next_runtime = on;
859 case OPT_fnonansi_builtins:
860 flag_no_nonansi_builtin = !on;
863 case OPT_foperator_names:
864 cpp_opts->operator_names = on;
867 case OPT_foptional_diags:
868 flag_optional_diags = on;
872 cpp_opts->restore_pch_deps = on;
875 case OPT_fpermissive:
876 flag_permissive = on;
879 case OPT_fpreprocessed:
880 cpp_opts->preprocessed = on;
884 flag_use_repository = on;
886 flag_implicit_templates = 0;
893 case OPT_fshow_column:
894 cpp_opts->show_column = on;
898 flag_detailed_statistics = on;
902 /* It is documented that we silently ignore silly values. */
905 long tabstop = strtol (arg, &endptr, 10);
906 if (*endptr == '\0' && tabstop >= 1 && tabstop <= 100)
907 cpp_opts->tabstop = tabstop;
911 case OPT_ftemplate_depth_:
912 max_tinst_depth = read_integral_parameter (arg, option->opt_text, 0);
919 case OPT_fuse_cxa_atexit:
920 flag_use_cxa_atexit = on;
928 flag_gen_declaration = 1;
932 add_path (xstrdup (arg), AFTER, 0);
937 defer_opt (code, arg);
949 add_path (xstrdup (arg), SYSTEM, 0);
952 case OPT_iwithprefix:
953 add_prefixed_path (arg, SYSTEM);
956 case OPT_iwithprefixbefore:
957 add_prefixed_path (arg, BRACKET);
961 cpp_set_lang (parse_in, CLK_ASM);
962 cpp_opts->dollars_in_ident = false;
981 error ("output filename specified twice");
984 /* We need to handle the -pedantic switches here, rather than in
985 c_common_post_options, so that a subsequent -Wno-endif-labels
986 is not overridden. */
987 case OPT_pedantic_errors:
988 cpp_opts->pedantic_errors = 1;
991 cpp_opts->pedantic = 1;
992 cpp_opts->warn_endif_labels = 1;
995 case OPT_print_objc_runtime_info:
996 print_struct_values = 1;
1000 cpp_opts->remap = 1;
1004 case OPT_std_gnu__98:
1005 set_std_cxx98 (code == OPT_std_c__98 /* ISO */);
1009 case OPT_std_iso9899_1990:
1010 case OPT_std_iso9899_199409:
1011 set_std_c89 (code == OPT_std_iso9899_199409 /* c94 */, true /* ISO */);
1015 set_std_c89 (false /* c94 */, false /* ISO */);
1020 case OPT_std_iso9899_1999:
1021 case OPT_std_iso9899_199x:
1022 set_std_c99 (true /* ISO */);
1027 set_std_c99 (false /* ISO */);
1031 cpp_opts->trigraphs = 1;
1034 case OPT_traditional_cpp:
1035 cpp_opts->traditional = 1;
1043 cpp_opts->inhibit_warnings = 1;
1054 /* Post-switch processing. */
1056 c_common_post_options (pfilename)
1057 const char **pfilename;
1059 /* Canonicalize the input and output filenames. */
1060 if (in_fname == NULL || !strcmp (in_fname, "-"))
1063 if (out_fname == NULL || !strcmp (out_fname, "-"))
1066 if (cpp_opts->deps.style == DEPS_NONE)
1067 check_deps_environment_vars ();
1069 handle_deferred_opts ();
1071 sanitize_cpp_opts ();
1073 register_include_chains (parse_in, sysroot, iprefix,
1074 std_inc, std_cxx_inc && c_language == clk_cplusplus,
1077 flag_inline_trees = 1;
1079 /* Use tree inlining if possible. Function instrumentation is only
1080 done in the RTL level, so we disable tree inlining. */
1081 if (! flag_instrument_function_entry_exit)
1083 if (!flag_no_inline)
1085 if (flag_inline_functions)
1087 flag_inline_trees = 2;
1088 flag_inline_functions = 0;
1092 /* -Wextra implies -Wsign-compare, but not if explicitly
1094 if (warn_sign_compare == -1)
1095 warn_sign_compare = extra_warnings;
1097 /* Special format checking options don't work without -Wformat; warn if
1099 if (warn_format_y2k && !warn_format)
1100 warning ("-Wformat-y2k ignored without -Wformat");
1101 if (warn_format_extra_args && !warn_format)
1102 warning ("-Wformat-extra-args ignored without -Wformat");
1103 if (warn_format_zero_length && !warn_format)
1104 warning ("-Wformat-zero-length ignored without -Wformat");
1105 if (warn_format_nonliteral && !warn_format)
1106 warning ("-Wformat-nonliteral ignored without -Wformat");
1107 if (warn_format_security && !warn_format)
1108 warning ("-Wformat-security ignored without -Wformat");
1109 if (warn_missing_format_attribute && !warn_format)
1110 warning ("-Wmissing-format-attribute ignored without -Wformat");
1112 if (flag_preprocess_only)
1114 /* Open the output now. We must do so even if flag_no_output is
1115 on, because there may be other output than from the actual
1116 preprocessing (e.g. from -dM). */
1117 if (out_fname[0] == '\0')
1118 out_stream = stdout;
1120 out_stream = fopen (out_fname, "w");
1122 if (out_stream == NULL)
1124 fatal_error ("opening output file %s: %m", out_fname);
1128 init_pp_output (out_stream);
1134 /* Yuk. WTF is this? I do know ObjC relies on it somewhere. */
1138 cpp_get_callbacks (parse_in)->file_change = cb_file_change;
1140 /* NOTE: we use in_fname here, not the one supplied. */
1141 *pfilename = cpp_read_main_file (parse_in, in_fname);
1143 saved_lineno = input_line;
1146 /* If an error has occurred in cpplib, note it so we fail
1148 errorcount += cpp_errors (parse_in);
1150 return flag_preprocess_only;
1153 /* Front end initialization common to C, ObjC and C++. */
1157 input_line = saved_lineno;
1159 /* Set up preprocessor arithmetic. Must be done after call to
1160 c_common_nodes_and_builtins for type nodes to be good. */
1161 cpp_opts->precision = TYPE_PRECISION (intmax_type_node);
1162 cpp_opts->char_precision = TYPE_PRECISION (char_type_node);
1163 cpp_opts->int_precision = TYPE_PRECISION (integer_type_node);
1164 cpp_opts->wchar_precision = TYPE_PRECISION (wchar_type_node);
1165 cpp_opts->unsigned_wchar = TREE_UNSIGNED (wchar_type_node);
1166 cpp_opts->EBCDIC = TARGET_EBCDIC;
1168 if (flag_preprocess_only)
1171 preprocess_file (parse_in);
1175 /* Has to wait until now so that cpplib has its hash table. */
1181 /* A thin wrapper around the real parser that initializes the
1182 integrated preprocessor after debug output has been initialized.
1183 Also, make sure the start_source_file debug hook gets called for
1184 the primary source file. */
1186 c_common_parse_file (set_yydebug)
1187 int set_yydebug ATTRIBUTE_UNUSED;
1190 yydebug = set_yydebug;
1192 warning ("YYDEBUG not defined");
1195 (*debug_hooks->start_source_file) (input_line, input_filename);
1199 free_parser_stacks ();
1202 /* Common finish hook for the C, ObjC and C++ front ends. */
1206 FILE *deps_stream = NULL;
1208 if (cpp_opts->deps.style != DEPS_NONE)
1210 /* If -M or -MM was seen without -MF, default output to the
1213 deps_stream = out_stream;
1216 deps_stream = fopen (deps_file, deps_append ? "a": "w");
1218 fatal_error ("opening dependency file %s: %m", deps_file);
1222 /* For performance, avoid tearing down cpplib's internal structures
1223 with cpp_destroy (). */
1224 errorcount += cpp_finish (parse_in, deps_stream);
1226 if (deps_stream && deps_stream != out_stream
1227 && (ferror (deps_stream) || fclose (deps_stream)))
1228 fatal_error ("closing dependency file %s: %m", deps_file);
1230 if (out_stream && (ferror (out_stream) || fclose (out_stream)))
1231 fatal_error ("when writing output to %s: %m", out_fname);
1234 /* Either of two environment variables can specify output of
1235 dependencies. Their value is either "OUTPUT_FILE" or "OUTPUT_FILE
1236 DEPS_TARGET", where OUTPUT_FILE is the file to write deps info to
1237 and DEPS_TARGET is the target to mention in the deps. They also
1238 result in dependency information being appended to the output file
1239 rather than overwriting it, and like Sun's compiler
1240 SUNPRO_DEPENDENCIES suppresses the dependency on the main file. */
1242 check_deps_environment_vars ()
1246 GET_ENVIRONMENT (spec, "DEPENDENCIES_OUTPUT");
1248 cpp_opts->deps.style = DEPS_USER;
1251 GET_ENVIRONMENT (spec, "SUNPRO_DEPENDENCIES");
1254 cpp_opts->deps.style = DEPS_SYSTEM;
1255 cpp_opts->deps.ignore_main_file = true;
1261 /* Find the space before the DEPS_TARGET, if there is one. */
1262 char *s = strchr (spec, ' ');
1265 /* Let the caller perform MAKE quoting. */
1266 defer_opt (OPT_MT, s + 1);
1270 /* Command line -MF overrides environment variables and default. */
1278 /* Handle deferred command line switches. */
1280 handle_deferred_opts ()
1284 for (i = 0; i < deferred_count; i++)
1286 struct deferred_opt *opt = &deferred_opts[i];
1288 if (opt->code == OPT_MT || opt->code == OPT_MQ)
1289 cpp_add_dependency_target (parse_in, opt->arg, opt->code == OPT_MQ);
1293 /* These settings are appropriate for GCC, but not necessarily so for
1294 cpplib as a library. */
1296 sanitize_cpp_opts ()
1298 /* If we don't know what style of dependencies to output, complain
1299 if any other dependency switches have been given. */
1300 if (deps_seen && cpp_opts->deps.style == DEPS_NONE)
1301 error ("to generate dependencies you must specify either -M or -MM");
1303 /* -dM and dependencies suppress normal output; do it here so that
1304 the last -d[MDN] switch overrides earlier ones. */
1305 if (flag_dump_macros == 'M')
1308 /* Disable -dD, -dN and -dI if normal output is suppressed. Allow
1309 -dM since at least glibc relies on -M -dM to work. */
1312 if (flag_dump_macros != 'M')
1313 flag_dump_macros = 0;
1314 flag_dump_includes = 0;
1317 cpp_opts->unsigned_char = !flag_signed_char;
1318 cpp_opts->stdc_0_in_system_headers = STDC_0_IN_SYSTEM_HEADERS;
1320 /* We want -Wno-long-long to override -pedantic -std=non-c99
1321 and/or -Wtraditional, whatever the ordering. */
1322 cpp_opts->warn_long_long
1323 = warn_long_long && ((!flag_isoc99 && pedantic) || warn_traditional);
1326 /* Add include path with a prefix at the front of its name. */
1328 add_prefixed_path (suffix, chain)
1334 size_t prefix_len, suffix_len;
1336 suffix_len = strlen (suffix);
1337 prefix = iprefix ? iprefix : cpp_GCC_INCLUDE_DIR;
1338 prefix_len = iprefix ? strlen (iprefix) : cpp_GCC_INCLUDE_DIR_len;
1340 path = xmalloc (prefix_len + suffix_len + 1);
1341 memcpy (path, prefix, prefix_len);
1342 memcpy (path + prefix_len, suffix, suffix_len);
1343 path[prefix_len + suffix_len] = '\0';
1345 add_path (path, chain, 0);
1348 /* Handle -D, -U, -A, -imacros, and the first -include. */
1352 if (!cpp_opts->preprocessed)
1356 cpp_change_file (parse_in, LC_RENAME, _("<built-in>"));
1357 cpp_init_builtins (parse_in, flag_hosted);
1358 c_cpp_builtins (parse_in);
1359 cpp_change_file (parse_in, LC_RENAME, _("<command line>"));
1360 for (i = 0; i < deferred_count; i++)
1362 struct deferred_opt *opt = &deferred_opts[i];
1364 if (opt->code == OPT_D)
1365 cpp_define (parse_in, opt->arg);
1366 else if (opt->code == OPT_U)
1367 cpp_undef (parse_in, opt->arg);
1368 else if (opt->code == OPT_A)
1370 if (opt->arg[0] == '-')
1371 cpp_unassert (parse_in, opt->arg + 1);
1373 cpp_assert (parse_in, opt->arg);
1377 /* Handle -imacros after -D and -U. */
1378 for (i = 0; i < deferred_count; i++)
1380 struct deferred_opt *opt = &deferred_opts[i];
1382 if (opt->code == OPT_imacros
1383 && cpp_push_include (parse_in, opt->arg))
1384 cpp_scan_nooutput (parse_in);
1388 push_command_line_include ();
1391 /* Give CPP the next file given by -include, if any. */
1393 push_command_line_include ()
1395 if (cpp_opts->preprocessed)
1398 while (include_cursor < deferred_count)
1400 struct deferred_opt *opt = &deferred_opts[include_cursor++];
1402 if (opt->code == OPT_include && cpp_push_include (parse_in, opt->arg))
1406 if (include_cursor == deferred_count)
1408 /* Restore the line map from <command line>. */
1409 cpp_change_file (parse_in, LC_RENAME, main_input_filename);
1410 /* -Wunused-macros should only warn about macros defined hereafter. */
1411 cpp_opts->warn_unused_macros = warn_unused_macros;
1416 /* File change callback. Has to handle -include files. */
1418 cb_file_change (pfile, new_map)
1419 cpp_reader *pfile ATTRIBUTE_UNUSED;
1420 const struct line_map *new_map;
1422 if (flag_preprocess_only)
1423 pp_file_change (new_map);
1425 fe_file_change (new_map);
1427 if (new_map->reason == LC_LEAVE && MAIN_FILE_P (new_map))
1428 push_command_line_include ();
1431 /* Set the C 89 standard (with 1994 amendments if C94, without GNU
1432 extensions if ISO). There is no concept of gnu94. */
1434 set_std_c89 (c94, iso)
1437 cpp_set_lang (parse_in, c94 ? CLK_STDC94: iso ? CLK_STDC89: CLK_GNUC89);
1440 flag_no_gnu_keywords = iso;
1441 flag_no_nonansi_builtin = iso;
1442 flag_noniso_default_format_attributes = !iso;
1445 flag_writable_strings = 0;
1448 /* Set the C 99 standard (without GNU extensions if ISO). */
1453 cpp_set_lang (parse_in, iso ? CLK_STDC99: CLK_GNUC99);
1455 flag_no_nonansi_builtin = iso;
1456 flag_noniso_default_format_attributes = !iso;
1460 flag_writable_strings = 0;
1463 /* Set the C++ 98 standard (without GNU extensions if ISO). */
1468 cpp_set_lang (parse_in, iso ? CLK_CXX98: CLK_GNUCXX);
1469 flag_no_gnu_keywords = iso;
1470 flag_no_nonansi_builtin = iso;
1471 flag_noniso_default_format_attributes = !iso;
1475 /* Handle setting implicit to ON. */
1481 warn_implicit_int = on;
1484 if (mesg_implicit_function_declaration != 2)
1485 mesg_implicit_function_declaration = 1;
1488 mesg_implicit_function_declaration = 0;
1491 /* Args to -d specify what to dump. Silently ignore
1492 unrecognized options; they may be aimed at toplev.c. */
1499 while ((c = *arg++) != '\0')
1502 case 'M': /* Dump macros only. */
1503 case 'N': /* Dump names. */
1504 case 'D': /* Dump definitions. */
1505 flag_dump_macros = c;
1509 flag_dump_includes = 1;
1514 /* Write a slash-separated list of languages in FLAGS to BUF. */
1516 write_langs (buf, flags)
1523 if (flags & CL_OBJC)
1527 strcat (buf, "ObjC");
1533 strcat (buf, "C++");
1537 /* Complain that switch OPT_INDEX does not apply to this front end. */
1539 complain_wrong_lang (opt_index)
1542 char ok_langs[60], bad_langs[60];
1543 int ok_flags = cl_options[opt_index].flags;
1545 write_langs (ok_langs, ok_flags);
1546 write_langs (bad_langs, ~ok_flags);
1547 /* Eventually this should become a hard error. */
1548 warning ("\"-%s\" is valid for %s but not for %s",
1549 cl_options[opt_index].opt_text, ok_langs, bad_langs);
1552 /* Handle --help output. */
1556 /* To keep the lines from getting too long for some compilers, limit
1557 to about 500 characters (6 lines) per chunk. */
1560 -include <file> Include the contents of <file> before other files\n\
1561 -imacros <file> Accept definition of macros in <file>\n\
1562 -iprefix <path> Specify <path> as a prefix for next two options\n\
1563 -iwithprefix <dir> Add <dir> to the end of the system include path\n\
1564 -iwithprefixbefore <dir> Add <dir> to the end of the main include path\n\
1565 -isystem <dir> Add <dir> to the start of the system include path\n\
1568 -idirafter <dir> Add <dir> to the end of the system include path\n\
1569 -I <dir> Add <dir> to the end of the main include path\n\
1570 -I- Fine-grained include path control; see info docs\n\
1571 -nostdinc Do not search system include directories\n\
1572 (dirs specified with -isystem will still be used)\n\
1573 -nostdinc++ Do not search system include directories for C++\n\
1574 -o <file> Put output into <file>\n\
1577 -trigraphs Support ISO C trigraphs\n\
1578 -std=<std name> Specify the conformance standard; one of:\n\
1579 gnu89, gnu99, c89, c99, iso9899:1990,\n\
1580 iso9899:199409, iso9899:1999, c++98\n\
1581 -w Inhibit warning messages\n\
1582 -W[no-]trigraphs Warn if trigraphs are encountered\n\
1583 -W[no-]comment{s} Warn if one comment starts inside another\n\
1586 -W[no-]traditional Warn about features not present in traditional C\n\
1587 -W[no-]undef Warn if an undefined macro is used by #if\n\
1588 -W[no-]import Warn about the use of the #import directive\n\
1591 -W[no-]error Treat all warnings as errors\n\
1592 -W[no-]system-headers Do not suppress warnings from system headers\n\
1593 -W[no-]all Enable most preprocessor warnings\n\
1596 -M Generate make dependencies\n\
1597 -MM As -M, but ignore system header files\n\
1598 -MD Generate make dependencies and compile\n\
1599 -MMD As -MD, but ignore system header files\n\
1600 -MF <file> Write dependency output to the given file\n\
1601 -MG Treat missing header file as generated files\n\
1604 -MP Generate phony targets for all headers\n\
1605 -MQ <target> Add a MAKE-quoted target\n\
1606 -MT <target> Add an unquoted target\n\
1609 -D<macro> Define a <macro> with string '1' as its value\n\
1610 -D<macro>=<val> Define a <macro> with <val> as its value\n\
1611 -A<question>=<answer> Assert the <answer> to <question>\n\
1612 -A-<question>=<answer> Disable the <answer> to <question>\n\
1613 -U<macro> Undefine <macro> \n\
1614 -v Display the version number\n\
1617 -H Print the name of header files as they are used\n\
1618 -C Do not discard comments\n\
1619 -dM Display a list of macro definitions active at end\n\
1620 -dD Preserve macro definitions in output\n\
1621 -dN As -dD except that only the names are preserved\n\
1622 -dI Include #include directives in the output\n\
1625 -f[no-]preprocessed Treat the input file as already preprocessed\n\
1626 -ftabstop=<number> Distance between tab stops for column reporting\n\
1627 -isysroot <dir> Set <dir> to be the system root directory\n\
1628 -P Do not generate #line directives\n\
1629 -remap Remap file names when including files\n\
1630 --help Display this information\n\