1 /* C/ObjC/C++ command line option handling.
2 Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
3 Free Software Foundation, Inc.
4 Contributed by Neil Booth.
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
24 #include "coretypes.h"
30 #include "langhooks.h"
31 #include "diagnostic.h"
33 #include "cppdefault.h"
35 #include "debug.h" /* For debug_hooks. */
39 #include "target.h" /* For gcc_targetcm. */
40 #include "tm_p.h" /* For C_COMMON_OVERRIDE_OPTIONS. */
42 #ifndef DOLLARS_IN_IDENTIFIERS
43 # define DOLLARS_IN_IDENTIFIERS true
46 #ifndef TARGET_SYSTEM_ROOT
47 # define TARGET_SYSTEM_ROOT NULL
51 #define TARGET_OPTF(ARG)
55 cpp_options *cpp_opts;
58 static const char *this_input_filename;
60 /* Filename and stream for preprocessed output. */
61 static const char *out_fname;
62 static FILE *out_stream;
64 /* Append dependencies to deps_file. */
65 static bool deps_append;
67 /* If dependency switches (-MF etc.) have been given. */
68 static bool deps_seen;
73 /* Dependency output file. */
74 static const char *deps_file;
76 /* The prefix given by -iprefix, if any. */
77 static const char *iprefix;
79 /* The multilib directory given by -imultilib, if any. */
80 static const char *imultilib;
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 /* If -Wvariadic-macros. */
98 static bool warn_variadic_macros = true;
100 /* Number of deferred options. */
101 static size_t deferred_count;
103 /* Number of deferred options scanned for -include. */
104 static size_t include_cursor;
106 static void handle_OPT_d (const char *);
107 static void set_std_cxx98 (int);
108 static void set_std_cxx0x (int);
109 static void set_std_c89 (int, int);
110 static void set_std_c99 (int);
111 static void set_std_c1x (int);
112 static void check_deps_environment_vars (void);
113 static void handle_deferred_opts (void);
114 static void sanitize_cpp_opts (void);
115 static void add_prefixed_path (const char *, size_t);
116 static void push_command_line_include (void);
117 static void cb_file_change (cpp_reader *, const struct line_map *);
118 static void cb_dir_change (cpp_reader *, const char *);
119 static void finish_options (void);
121 #ifndef STDC_0_IN_SYSTEM_HEADERS
122 #define STDC_0_IN_SYSTEM_HEADERS 0
125 /* Holds switches parsed by c_common_handle_option (), but whose
126 handling is deferred to c_common_post_options (). */
127 static void defer_opt (enum opt_code, const char *);
128 static struct deferred_opt
135 static const unsigned int
136 c_family_lang_mask = (CL_C | CL_CXX | CL_ObjC | CL_ObjCXX);
138 /* Defer option CODE with argument ARG. */
140 defer_opt (enum opt_code code, const char *arg)
142 deferred_opts[deferred_count].code = code;
143 deferred_opts[deferred_count].arg = arg;
147 /* -Werror= may set a warning option to enable a warning that is emitted
148 by the preprocessor. Set any corresponding flag in cpp_opts. */
151 warning_as_error_callback (int option_index)
153 switch (option_index)
156 /* Ignore options not associated with the preprocessor. */
159 case OPT_Wdeprecated:
160 cpp_opts->cpp_warn_deprecated = 1;
164 cpp_opts->warn_comments = 1;
168 cpp_opts->warn_trigraphs = 1;
172 cpp_opts->warn_multichar = 1;
175 case OPT_Wtraditional:
176 cpp_opts->cpp_warn_traditional = 1;
180 cpp_opts->cpp_warn_long_long = 1;
183 case OPT_Wendif_labels:
184 cpp_opts->warn_endif_labels = 1;
187 case OPT_Wvariadic_macros:
188 /* Set the local flag that is used later to update cpp_opts. */
189 warn_variadic_macros = 1;
192 case OPT_Wbuiltin_macro_redefined:
193 cpp_opts->warn_builtin_macro_redefined = 1;
197 cpp_opts->warn_undef = 1;
200 case OPT_Wunused_macros:
201 /* Set the local flag that is used later to update cpp_opts. */
202 warn_unused_macros = 1;
205 case OPT_Wc___compat:
206 /* Add warnings in the same way as c_common_handle_option below. */
207 if (warn_enum_compare == -1)
208 warn_enum_compare = 1;
209 if (warn_jump_misses_init == -1)
210 warn_jump_misses_init = 1;
211 cpp_opts->warn_cxx_operator_names = 1;
214 case OPT_Wnormalized_:
215 inform (input_location, "-Werror=normalized=: Set -Wnormalized=nfc");
216 cpp_opts->warn_normalize = normalized_C;
219 case OPT_Winvalid_pch:
220 cpp_opts->warn_invalid_pch = 1;
224 /* Handled by standard diagnostics using the option's associated
230 /* Return language mask for option parsing. */
232 c_common_option_lang_mask (void)
234 static const unsigned int lang_flags[] = {CL_C, CL_ObjC, CL_CXX, CL_ObjCXX};
236 return lang_flags[c_language];
239 /* Common diagnostics initialization. */
241 c_common_initialize_diagnostics (diagnostic_context *context)
243 /* Register callback for warnings enabled by -Werror=. */
244 register_warning_as_error_callback (warning_as_error_callback);
246 /* This is conditionalized only because that is the way the front
247 ends used to do it. Maybe this should be unconditional? */
248 if (c_dialect_cxx ())
250 /* By default wrap lines at 80 characters. Is getenv
251 ("COLUMNS") preferable? */
252 diagnostic_line_cutoff (context) = 80;
253 /* By default, emit location information once for every
254 diagnostic message. */
255 diagnostic_prefixing_rule (context) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
258 context->opt_permissive = OPT_fpermissive;
261 /* Whether options from all C-family languages should be accepted
263 static bool accept_all_c_family_options = false;
265 /* Return whether to complain about a wrong-language option. */
267 c_common_complain_wrong_lang_p (const struct cl_option *option)
269 if (accept_all_c_family_options
270 && (option->flags & c_family_lang_mask))
276 /* Common initialization before calling option handlers. */
278 c_common_init_options (unsigned int decoded_options_count,
279 struct cl_decoded_option *decoded_options)
282 struct cpp_callbacks *cb;
284 parse_in = cpp_create_reader (c_dialect_cxx () ? CLK_GNUCXX: CLK_GNUC89,
285 ident_hash, line_table);
286 cb = cpp_get_callbacks (parse_in);
287 cb->error = c_cpp_error;
289 cpp_opts = cpp_get_options (parse_in);
290 cpp_opts->dollars_in_ident = DOLLARS_IN_IDENTIFIERS;
291 cpp_opts->objc = c_dialect_objc ();
293 /* Reset to avoid warnings on internal definitions. We set it just
294 before passing on command-line options to cpplib. */
295 cpp_opts->warn_dollars = 0;
297 flag_exceptions = c_dialect_cxx ();
298 warn_pointer_arith = c_dialect_cxx ();
299 warn_write_strings = c_dialect_cxx();
300 flag_warn_unused_result = true;
302 /* By default, C99-like requirements for complex multiply and divide. */
303 flag_complex_method = 2;
305 deferred_opts = XNEWVEC (struct deferred_opt, decoded_options_count);
307 if (c_language == clk_c)
309 /* If preprocessing assembly language, accept any of the C-family
310 front end options since the driver may pass them through. */
311 for (i = 1; i < decoded_options_count; i++)
312 if (decoded_options[i].opt_index == OPT_lang_asm)
314 accept_all_c_family_options = true;
320 /* Handle switch SCODE with argument ARG. VALUE is true, unless no-
321 form of an -f or -W option was given. Returns false if the switch was
322 invalid, true if valid. Use HANDLERS in recursive handle_option calls. */
324 c_common_handle_option (size_t scode, const char *arg, int value,
325 int kind, const struct cl_option_handlers *handlers)
327 const struct cl_option *option = &cl_options[scode];
328 enum opt_code code = (enum opt_code) scode;
331 /* Prevent resetting the language standard to a C dialect when the driver
332 has already determined that we're looking at assembler input. */
333 bool preprocessing_asm_p = (cpp_get_options (parse_in)->lang == CLK_ASM);
338 if (cl_options[code].flags & c_family_lang_mask)
340 if ((option->flags & CL_TARGET)
341 && ! targetcm.handle_c_option (scode, arg, value))
348 case OPT__output_pch_:
353 defer_opt (code, arg);
357 cpp_opts->discard_comments = 0;
361 cpp_opts->discard_comments = 0;
362 cpp_opts->discard_comments_in_macro_exp = 0;
366 defer_opt (code, arg);
370 cpp_opts->print_include_names = 1;
374 TARGET_OPTF (xstrdup (arg));
378 if (strcmp (arg, "-"))
379 add_path (xstrdup (arg), BRACKET, 0, true);
382 if (quote_chain_split)
383 error ("-I- specified twice");
384 quote_chain_split = true;
385 split_quote_chain ();
386 inform (input_location, "obsolete option -I- used, please use -iquote instead");
392 /* When doing dependencies with -M or -MM, suppress normal
393 preprocessed output, but still do -dM etc. as software
394 depends on this. Preprocessed output does occur if -MD, -MMD
395 or environment var dependency generation is used. */
396 cpp_opts->deps.style = (code == OPT_M ? DEPS_SYSTEM: DEPS_USER);
402 cpp_opts->deps.style = (code == OPT_MD ? DEPS_SYSTEM: DEPS_USER);
403 cpp_opts->deps.need_preprocessor_output = true;
414 cpp_opts->deps.missing_files = true;
419 cpp_opts->deps.phony_targets = true;
425 defer_opt (code, arg);
429 flag_no_line_commands = 1;
433 defer_opt (code, arg);
439 handle_generated_option (&global_options, OPT_Wimplicit, NULL, value,
440 c_family_lang_mask, kind, handlers);
441 warn_char_subscripts = value;
442 warn_missing_braces = value;
443 warn_parentheses = value;
444 warn_return_type = value;
445 warn_sequence_point = value; /* Was C only. */
447 if (warn_strict_aliasing == -1)
448 set_Wstrict_aliasing (value);
449 warn_address = value;
450 if (warn_strict_overflow == -1)
451 warn_strict_overflow = value;
452 warn_array_bounds = value;
453 warn_volatile_register_var = value;
455 /* Only warn about unknown pragmas that are not in system
457 warn_unknown_pragmas = value;
459 warn_uninitialized = value;
461 if (!c_dialect_cxx ())
463 /* We set this to 2 here, but 1 in -Wmain, so -ffreestanding
464 can turn it off only if it's not explicit. */
466 warn_main = (value ? 2 : 0);
468 /* In C, -Wall turns on -Wenum-compare, which we do here.
469 In C++ it is on by default, which is done in
470 c_common_post_options. */
471 if (warn_enum_compare == -1)
472 warn_enum_compare = value;
476 /* C++-specific warnings. */
477 warn_sign_compare = value;
478 warn_reorder = value;
479 warn_cxx0x_compat = value;
482 cpp_opts->warn_trigraphs = value;
483 cpp_opts->warn_comments = value;
484 cpp_opts->warn_num_sign_change = value;
486 if (warn_pointer_sign == -1)
487 warn_pointer_sign = value;
490 case OPT_Wbuiltin_macro_redefined:
491 cpp_opts->warn_builtin_macro_redefined = value;
495 cpp_opts->warn_comments = value;
498 case OPT_Wc___compat:
499 /* Because -Wenum-compare is the default in C++, -Wc++-compat
500 implies -Wenum-compare. */
501 if (warn_enum_compare == -1 && value)
502 warn_enum_compare = value;
503 /* Because C++ always warns about a goto which misses an
504 initialization, -Wc++-compat turns on -Wjump-misses-init. */
505 if (warn_jump_misses_init == -1 && value)
506 warn_jump_misses_init = value;
507 cpp_opts->warn_cxx_operator_names = value;
510 case OPT_Wdeprecated:
511 cpp_opts->cpp_warn_deprecated = value;
514 case OPT_Wendif_labels:
515 cpp_opts->warn_endif_labels = value;
519 global_dc->warning_as_error_requested = value;
527 set_Wformat (atoi (arg));
531 gcc_assert (value == 0 || value == 1);
532 if (warn_implicit_int == -1)
533 handle_generated_option (&global_options, OPT_Wimplicit_int,
535 c_family_lang_mask, kind, handlers);
536 if (warn_implicit_function_declaration == -1)
537 handle_generated_option (&global_options,
538 OPT_Wimplicit_function_declaration, NULL,
539 value, c_family_lang_mask, kind, handlers);
542 case OPT_Winvalid_pch:
543 cpp_opts->warn_invalid_pch = value;
546 case OPT_Wmissing_include_dirs:
547 cpp_opts->warn_missing_include_dirs = value;
551 cpp_opts->warn_multichar = value;
554 case OPT_Wnormalized_:
555 if (!value || (arg && strcasecmp (arg, "none") == 0))
556 cpp_opts->warn_normalize = normalized_none;
557 else if (!arg || strcasecmp (arg, "nfkc") == 0)
558 cpp_opts->warn_normalize = normalized_KC;
559 else if (strcasecmp (arg, "id") == 0)
560 cpp_opts->warn_normalize = normalized_identifier_C;
561 else if (strcasecmp (arg, "nfc") == 0)
562 cpp_opts->warn_normalize = normalized_C;
564 error ("argument %qs to %<-Wnormalized%> not recognized", arg);
567 case OPT_Wreturn_type:
568 warn_return_type = value;
571 case OPT_Wtraditional:
572 cpp_opts->cpp_warn_traditional = value;
576 cpp_opts->warn_trigraphs = value;
580 cpp_opts->warn_undef = value;
583 case OPT_Wunknown_pragmas:
584 /* Set to greater than 1, so that even unknown pragmas in
585 system headers will be warned about. */
586 warn_unknown_pragmas = value * 2;
589 case OPT_Wunused_macros:
590 warn_unused_macros = value;
593 case OPT_Wvariadic_macros:
594 warn_variadic_macros = value;
597 case OPT_Wwrite_strings:
598 warn_write_strings = value;
604 warn_nonvdtor = true;
608 if (!c_dialect_cxx ())
609 set_std_c89 (false, true);
611 set_std_cxx98 (true);
618 case OPT_fcond_mismatch:
619 if (!c_dialect_cxx ())
621 flag_cond_mismatch = value;
624 warning (0, "switch %qs is no longer supported", option->opt_text);
631 disable_builtin_function (arg);
634 case OPT_fdirectives_only:
635 cpp_opts->directives_only = value;
638 case OPT_fdollars_in_identifiers:
639 cpp_opts->dollars_in_ident = value;
642 case OPT_ffreestanding:
644 /* Fall through.... */
647 flag_no_builtin = !value;
650 case OPT_fconstant_string_class_:
651 constant_string_class_name = arg;
654 case OPT_fextended_identifiers:
655 cpp_opts->extended_identifiers = value;
658 case OPT_fgnu_runtime:
659 flag_next_runtime = !value;
662 case OPT_fnext_runtime:
663 flag_next_runtime = value;
666 case OPT_foperator_names:
667 cpp_opts->operator_names = value;
671 cpp_opts->restore_pch_deps = value;
674 case OPT_fpch_preprocess:
675 flag_pch_preprocess = value;
678 case OPT_fpermissive:
679 flag_permissive = value;
680 global_dc->permissive = value;
683 case OPT_fpreprocessed:
684 cpp_opts->preprocessed = value;
688 flag_use_repository = value;
690 flag_implicit_templates = 0;
694 /* It is documented that we silently ignore silly values. */
695 if (value >= 1 && value <= 100)
696 cpp_opts->tabstop = value;
699 case OPT_fexec_charset_:
700 cpp_opts->narrow_charset = arg;
703 case OPT_fwide_exec_charset_:
704 cpp_opts->wide_charset = arg;
707 case OPT_finput_charset_:
708 cpp_opts->input_charset = arg;
711 case OPT_ftemplate_depth_:
712 max_tinst_depth = value;
715 case OPT_fvisibility_inlines_hidden:
716 visibility_options.inlines_hidden = value;
719 case OPT_femit_struct_debug_baseonly:
720 set_struct_debug_option ("base");
723 case OPT_femit_struct_debug_reduced:
724 set_struct_debug_option ("dir:ord:sys,dir:gen:any,ind:base");
727 case OPT_femit_struct_debug_detailed_:
728 set_struct_debug_option (arg);
732 add_path (xstrdup (arg), AFTER, 0, true);
737 defer_opt (code, arg);
749 add_path (xstrdup (arg), QUOTE, 0, true);
757 add_path (xstrdup (arg), SYSTEM, 0, true);
760 case OPT_iwithprefix:
761 add_prefixed_path (arg, SYSTEM);
764 case OPT_iwithprefixbefore:
765 add_prefixed_path (arg, BRACKET);
769 cpp_set_lang (parse_in, CLK_ASM);
770 cpp_opts->dollars_in_ident = false;
785 error ("output filename specified twice");
788 /* We need to handle the -pedantic switches here, rather than in
789 c_common_post_options, so that a subsequent -Wno-endif-labels
790 is not overridden. */
791 case OPT_pedantic_errors:
793 cpp_opts->cpp_pedantic = 1;
794 cpp_opts->warn_endif_labels = 1;
795 if (warn_pointer_sign == -1)
796 warn_pointer_sign = 1;
797 if (warn_overlength_strings == -1)
798 warn_overlength_strings = 1;
803 case OPT_print_objc_runtime_info:
804 print_struct_values = 1;
812 case OPT_std_gnu__98:
813 if (!preprocessing_asm_p)
814 set_std_cxx98 (code == OPT_std_c__98 /* ISO */);
818 case OPT_std_gnu__0x:
819 if (!preprocessing_asm_p)
820 set_std_cxx0x (code == OPT_std_c__0x /* ISO */);
824 case OPT_std_iso9899_199409:
825 if (!preprocessing_asm_p)
826 set_std_c89 (code == OPT_std_iso9899_199409 /* c94 */, true /* ISO */);
830 if (!preprocessing_asm_p)
831 set_std_c89 (false /* c94 */, false /* ISO */);
835 if (!preprocessing_asm_p)
836 set_std_c99 (true /* ISO */);
840 if (!preprocessing_asm_p)
841 set_std_c99 (false /* ISO */);
845 if (!preprocessing_asm_p)
846 set_std_c1x (true /* ISO */);
850 if (!preprocessing_asm_p)
851 set_std_c1x (false /* ISO */);
855 cpp_opts->trigraphs = 1;
858 case OPT_traditional_cpp:
859 cpp_opts->traditional = 1;
874 /* Post-switch processing. */
876 c_common_post_options (const char **pfilename)
878 struct cpp_callbacks *cb;
880 /* Canonicalize the input and output filenames. */
881 if (in_fnames == NULL)
883 in_fnames = XNEWVEC (const char *, 1);
886 else if (strcmp (in_fnames[0], "-") == 0)
889 if (out_fname == NULL || !strcmp (out_fname, "-"))
892 if (cpp_opts->deps.style == DEPS_NONE)
893 check_deps_environment_vars ();
895 handle_deferred_opts ();
897 sanitize_cpp_opts ();
899 register_include_chains (parse_in, sysroot, iprefix, imultilib,
900 std_inc, std_cxx_inc && c_dialect_cxx (), verbose);
902 #ifdef C_COMMON_OVERRIDE_OPTIONS
903 /* Some machines may reject certain combinations of C
904 language-specific options. */
905 C_COMMON_OVERRIDE_OPTIONS;
908 /* Excess precision other than "fast" requires front-end
910 if (c_dialect_cxx ())
912 if (flag_excess_precision_cmdline == EXCESS_PRECISION_STANDARD
913 && TARGET_FLT_EVAL_METHOD_NON_DEFAULT)
914 sorry ("-fexcess-precision=standard for C++");
915 flag_excess_precision_cmdline = EXCESS_PRECISION_FAST;
917 else if (flag_excess_precision_cmdline == EXCESS_PRECISION_DEFAULT)
918 flag_excess_precision_cmdline = (flag_iso
919 ? EXCESS_PRECISION_STANDARD
920 : EXCESS_PRECISION_FAST);
922 /* By default we use C99 inline semantics in GNU99 or C99 mode. C99
923 inline semantics are not supported in GNU89 or C89 mode. */
924 if (flag_gnu89_inline == -1)
925 flag_gnu89_inline = !flag_isoc99;
926 else if (!flag_gnu89_inline && !flag_isoc99)
927 error ("-fno-gnu89-inline is only supported in GNU99 or C99 mode");
929 /* Default to ObjC sjlj exception handling if NeXT runtime. */
930 if (flag_objc_sjlj_exceptions < 0)
931 flag_objc_sjlj_exceptions = flag_next_runtime;
932 if (flag_objc_exceptions && !flag_objc_sjlj_exceptions)
935 /* -Wextra implies the following flags
936 unless explicitly overridden. */
937 if (warn_type_limits == -1)
938 warn_type_limits = extra_warnings;
939 if (warn_clobbered == -1)
940 warn_clobbered = extra_warnings;
941 if (warn_empty_body == -1)
942 warn_empty_body = extra_warnings;
943 if (warn_sign_compare == -1)
944 warn_sign_compare = extra_warnings;
945 if (warn_missing_field_initializers == -1)
946 warn_missing_field_initializers = extra_warnings;
947 if (warn_missing_parameter_type == -1)
948 warn_missing_parameter_type = extra_warnings;
949 if (warn_old_style_declaration == -1)
950 warn_old_style_declaration = extra_warnings;
951 if (warn_override_init == -1)
952 warn_override_init = extra_warnings;
953 if (warn_ignored_qualifiers == -1)
954 warn_ignored_qualifiers = extra_warnings;
956 /* -Wpointer-sign is disabled by default, but it is enabled if any
957 of -Wall or -pedantic are given. */
958 if (warn_pointer_sign == -1)
959 warn_pointer_sign = 0;
961 if (warn_strict_aliasing == -1)
962 warn_strict_aliasing = 0;
963 if (warn_strict_overflow == -1)
964 warn_strict_overflow = 0;
965 if (warn_jump_misses_init == -1)
966 warn_jump_misses_init = 0;
968 /* -Woverlength-strings is off by default, but is enabled by -pedantic.
969 It is never enabled in C++, as the minimum limit is not normative
971 if (warn_overlength_strings == -1 || c_dialect_cxx ())
972 warn_overlength_strings = 0;
974 /* Wmain is enabled by default in C++ but not in C. */
975 /* Wmain is disabled by default for -ffreestanding (!flag_hosted),
976 even if -Wall was given (warn_main will be 2 if set by -Wall, 1
977 if set by -Wmain). */
979 warn_main = (c_dialect_cxx () && flag_hosted) ? 1 : 0;
980 else if (warn_main == 2)
981 warn_main = flag_hosted ? 1 : 0;
983 /* In C, -Wconversion enables -Wsign-conversion (unless disabled
984 through -Wno-sign-conversion). While in C++,
985 -Wsign-conversion needs to be requested explicitly. */
986 if (warn_sign_conversion == -1)
987 warn_sign_conversion = (c_dialect_cxx ()) ? 0 : warn_conversion;
989 /* In C, -Wall and -Wc++-compat enable -Wenum-compare, which we do
990 in c_common_handle_option; if it has not yet been set, it is
991 disabled by default. In C++, it is enabled by default. */
992 if (warn_enum_compare == -1)
993 warn_enum_compare = c_dialect_cxx () ? 1 : 0;
995 /* -Wpacked-bitfield-compat is on by default for the C languages. The
996 warning is issued in stor-layout.c which is not part of the front-end so
997 we need to selectively turn it on here. */
998 if (warn_packed_bitfield_compat == -1)
999 warn_packed_bitfield_compat = 1;
1001 /* Special format checking options don't work without -Wformat; warn if
1005 warning (OPT_Wformat_y2k,
1006 "-Wformat-y2k ignored without -Wformat");
1007 warning (OPT_Wformat_extra_args,
1008 "-Wformat-extra-args ignored without -Wformat");
1009 warning (OPT_Wformat_zero_length,
1010 "-Wformat-zero-length ignored without -Wformat");
1011 warning (OPT_Wformat_nonliteral,
1012 "-Wformat-nonliteral ignored without -Wformat");
1013 warning (OPT_Wformat_contains_nul,
1014 "-Wformat-contains-nul ignored without -Wformat");
1015 warning (OPT_Wformat_security,
1016 "-Wformat-security ignored without -Wformat");
1019 if (warn_implicit == -1)
1022 if (warn_implicit_int == -1)
1023 warn_implicit_int = 0;
1025 /* -Wimplicit-function-declaration is enabled by default for C99. */
1026 if (warn_implicit_function_declaration == -1)
1027 warn_implicit_function_declaration = flag_isoc99;
1029 /* If we're allowing C++0x constructs, don't warn about C++0x
1030 compatibility problems. */
1031 if (cxx_dialect == cxx0x)
1032 warn_cxx0x_compat = 0;
1034 if (flag_preprocess_only)
1036 /* Open the output now. We must do so even if flag_no_output is
1037 on, because there may be other output than from the actual
1038 preprocessing (e.g. from -dM). */
1039 if (out_fname[0] == '\0')
1040 out_stream = stdout;
1042 out_stream = fopen (out_fname, "w");
1044 if (out_stream == NULL)
1046 fatal_error ("opening output file %s: %m", out_fname);
1050 if (num_in_fnames > 1)
1051 error ("too many filenames given. Type %s --help for usage",
1054 init_pp_output (out_stream);
1060 /* Yuk. WTF is this? I do know ObjC relies on it somewhere. */
1061 input_location = UNKNOWN_LOCATION;
1064 cb = cpp_get_callbacks (parse_in);
1065 cb->file_change = cb_file_change;
1066 cb->dir_change = cb_dir_change;
1067 cpp_post_options (parse_in);
1069 input_location = UNKNOWN_LOCATION;
1071 *pfilename = this_input_filename
1072 = cpp_read_main_file (parse_in, in_fnames[0]);
1073 /* Don't do any compilation or preprocessing if there is no input file. */
1074 if (this_input_filename == NULL)
1080 if (flag_working_directory
1081 && flag_preprocess_only && !flag_no_line_commands)
1082 pp_dir_change (parse_in, get_src_pwd ());
1084 return flag_preprocess_only;
1087 /* Front end initialization common to C, ObjC and C++. */
1089 c_common_init (void)
1091 /* Set up preprocessor arithmetic. Must be done after call to
1092 c_common_nodes_and_builtins for type nodes to be good. */
1093 cpp_opts->precision = TYPE_PRECISION (intmax_type_node);
1094 cpp_opts->char_precision = TYPE_PRECISION (char_type_node);
1095 cpp_opts->int_precision = TYPE_PRECISION (integer_type_node);
1096 cpp_opts->wchar_precision = TYPE_PRECISION (wchar_type_node);
1097 cpp_opts->unsigned_wchar = TYPE_UNSIGNED (wchar_type_node);
1098 cpp_opts->bytes_big_endian = BYTES_BIG_ENDIAN;
1100 /* This can't happen until after wchar_precision and bytes_big_endian
1102 cpp_init_iconv (parse_in);
1105 c_common_print_pch_checksum (stderr);
1107 /* Has to wait until now so that cpplib has its hash table. */
1110 if (flag_preprocess_only)
1113 preprocess_file (parse_in);
1120 /* Initialize the integrated preprocessor after debug output has been
1121 initialized; loop over each input file. */
1123 c_common_parse_file (int set_yydebug)
1131 warning(0, "The C parser does not support -dy, option ignored");
1135 "The Objective-C parser does not support -dy, option ignored");
1138 warning(0, "The C++ parser does not support -dy, option ignored");
1142 "The Objective-C++ parser does not support -dy, option ignored");
1157 /* And end the main input file, if the debug writer wants it */
1158 if (debug_hooks->start_end_main_source_file)
1159 (*debug_hooks->end_source_file) (0);
1160 if (++i >= num_in_fnames)
1162 cpp_undef_all (parse_in);
1163 cpp_clear_file_cache (parse_in);
1165 = cpp_read_main_file (parse_in, in_fnames[i]);
1166 /* If an input file is missing, abandon further compilation.
1167 cpplib has issued a diagnostic. */
1168 if (!this_input_filename)
1173 /* Common finish hook for the C, ObjC and C++ front ends. */
1175 c_common_finish (void)
1177 FILE *deps_stream = NULL;
1179 /* Don't write the deps file if there are errors. */
1180 if (cpp_opts->deps.style != DEPS_NONE && !seen_error ())
1182 /* If -M or -MM was seen without -MF, default output to the
1185 deps_stream = out_stream;
1188 deps_stream = fopen (deps_file, deps_append ? "a": "w");
1190 fatal_error ("opening dependency file %s: %m", deps_file);
1194 /* For performance, avoid tearing down cpplib's internal structures
1195 with cpp_destroy (). */
1196 cpp_finish (parse_in, deps_stream);
1198 if (deps_stream && deps_stream != out_stream
1199 && (ferror (deps_stream) || fclose (deps_stream)))
1200 fatal_error ("closing dependency file %s: %m", deps_file);
1202 if (out_stream && (ferror (out_stream) || fclose (out_stream)))
1203 fatal_error ("when writing output to %s: %m", out_fname);
1206 /* Either of two environment variables can specify output of
1207 dependencies. Their value is either "OUTPUT_FILE" or "OUTPUT_FILE
1208 DEPS_TARGET", where OUTPUT_FILE is the file to write deps info to
1209 and DEPS_TARGET is the target to mention in the deps. They also
1210 result in dependency information being appended to the output file
1211 rather than overwriting it, and like Sun's compiler
1212 SUNPRO_DEPENDENCIES suppresses the dependency on the main file. */
1214 check_deps_environment_vars (void)
1218 GET_ENVIRONMENT (spec, "DEPENDENCIES_OUTPUT");
1220 cpp_opts->deps.style = DEPS_USER;
1223 GET_ENVIRONMENT (spec, "SUNPRO_DEPENDENCIES");
1226 cpp_opts->deps.style = DEPS_SYSTEM;
1227 cpp_opts->deps.ignore_main_file = true;
1233 /* Find the space before the DEPS_TARGET, if there is one. */
1234 char *s = strchr (spec, ' ');
1237 /* Let the caller perform MAKE quoting. */
1238 defer_opt (OPT_MT, s + 1);
1242 /* Command line -MF overrides environment variables and default. */
1251 /* Handle deferred command line switches. */
1253 handle_deferred_opts (void)
1258 /* Avoid allocating the deps buffer if we don't need it.
1259 (This flag may be true without there having been -MT or -MQ
1260 options, but we'll still need the deps buffer.) */
1264 deps = cpp_get_deps (parse_in);
1266 for (i = 0; i < deferred_count; i++)
1268 struct deferred_opt *opt = &deferred_opts[i];
1270 if (opt->code == OPT_MT || opt->code == OPT_MQ)
1271 deps_add_target (deps, opt->arg, opt->code == OPT_MQ);
1275 /* These settings are appropriate for GCC, but not necessarily so for
1276 cpplib as a library. */
1278 sanitize_cpp_opts (void)
1280 /* If we don't know what style of dependencies to output, complain
1281 if any other dependency switches have been given. */
1282 if (deps_seen && cpp_opts->deps.style == DEPS_NONE)
1283 error ("to generate dependencies you must specify either -M or -MM");
1285 /* -dM and dependencies suppress normal output; do it here so that
1286 the last -d[MDN] switch overrides earlier ones. */
1287 if (flag_dump_macros == 'M')
1290 /* By default, -fdirectives-only implies -dD. This allows subsequent phases
1291 to perform proper macro expansion. */
1292 if (cpp_opts->directives_only && !cpp_opts->preprocessed && !flag_dump_macros)
1293 flag_dump_macros = 'D';
1295 /* Disable -dD, -dN and -dI if normal output is suppressed. Allow
1296 -dM since at least glibc relies on -M -dM to work. */
1297 /* Also, flag_no_output implies flag_no_line_commands, always. */
1300 if (flag_dump_macros != 'M')
1301 flag_dump_macros = 0;
1302 flag_dump_includes = 0;
1303 flag_no_line_commands = 1;
1305 else if (cpp_opts->deps.missing_files)
1306 error ("-MG may only be used with -M or -MM");
1308 cpp_opts->unsigned_char = !flag_signed_char;
1309 cpp_opts->stdc_0_in_system_headers = STDC_0_IN_SYSTEM_HEADERS;
1311 /* Wlong-long is disabled by default. It is enabled by:
1312 [-pedantic | -Wtraditional] -std=[gnu|c]++98 ; or
1313 [-pedantic | -Wtraditional] -std=non-c99 .
1315 Either -Wlong-long or -Wno-long-long override any other settings. */
1316 if (warn_long_long == -1)
1317 warn_long_long = ((pedantic || warn_traditional)
1318 && (c_dialect_cxx () ? cxx_dialect == cxx98 : !flag_isoc99));
1319 cpp_opts->cpp_warn_long_long = warn_long_long;
1321 /* Similarly with -Wno-variadic-macros. No check for c99 here, since
1322 this also turns off warnings about GCCs extension. */
1323 cpp_opts->warn_variadic_macros
1324 = warn_variadic_macros && (pedantic || warn_traditional);
1326 /* If we're generating preprocessor output, emit current directory
1327 if explicitly requested or if debugging information is enabled.
1328 ??? Maybe we should only do it for debugging formats that
1329 actually output the current directory? */
1330 if (flag_working_directory == -1)
1331 flag_working_directory = (debug_info_level != DINFO_LEVEL_NONE);
1333 if (cpp_opts->directives_only)
1335 if (warn_unused_macros)
1336 error ("-fdirectives-only is incompatible with -Wunused_macros");
1337 if (cpp_opts->traditional)
1338 error ("-fdirectives-only is incompatible with -traditional");
1342 /* Add include path with a prefix at the front of its name. */
1344 add_prefixed_path (const char *suffix, size_t chain)
1348 size_t prefix_len, suffix_len;
1350 suffix_len = strlen (suffix);
1351 prefix = iprefix ? iprefix : cpp_GCC_INCLUDE_DIR;
1352 prefix_len = iprefix ? strlen (iprefix) : cpp_GCC_INCLUDE_DIR_len;
1354 path = (char *) xmalloc (prefix_len + suffix_len + 1);
1355 memcpy (path, prefix, prefix_len);
1356 memcpy (path + prefix_len, suffix, suffix_len);
1357 path[prefix_len + suffix_len] = '\0';
1359 add_path (path, chain, 0, false);
1362 /* Handle -D, -U, -A, -imacros, and the first -include. */
1364 finish_options (void)
1366 if (!cpp_opts->preprocessed)
1370 cb_file_change (parse_in,
1371 linemap_add (line_table, LC_RENAME, 0,
1372 _("<built-in>"), 0));
1374 cpp_init_builtins (parse_in, flag_hosted);
1375 c_cpp_builtins (parse_in);
1377 /* We're about to send user input to cpplib, so make it warn for
1378 things that we previously (when we sent it internal definitions)
1379 told it to not warn.
1381 C99 permits implementation-defined characters in identifiers.
1382 The documented meaning of -std= is to turn off extensions that
1383 conflict with the specified standard, and since a strictly
1384 conforming program cannot contain a '$', we do not condition
1385 their acceptance on the -std= setting. */
1386 cpp_opts->warn_dollars = (cpp_opts->cpp_pedantic && !cpp_opts->c99);
1388 cb_file_change (parse_in,
1389 linemap_add (line_table, LC_RENAME, 0,
1390 _("<command-line>"), 0));
1392 for (i = 0; i < deferred_count; i++)
1394 struct deferred_opt *opt = &deferred_opts[i];
1396 if (opt->code == OPT_D)
1397 cpp_define (parse_in, opt->arg);
1398 else if (opt->code == OPT_U)
1399 cpp_undef (parse_in, opt->arg);
1400 else if (opt->code == OPT_A)
1402 if (opt->arg[0] == '-')
1403 cpp_unassert (parse_in, opt->arg + 1);
1405 cpp_assert (parse_in, opt->arg);
1409 /* Start the main input file, if the debug writer wants it. */
1410 if (debug_hooks->start_end_main_source_file
1411 && !flag_preprocess_only)
1412 (*debug_hooks->start_source_file) (0, this_input_filename);
1414 /* Handle -imacros after -D and -U. */
1415 for (i = 0; i < deferred_count; i++)
1417 struct deferred_opt *opt = &deferred_opts[i];
1419 if (opt->code == OPT_imacros
1420 && cpp_push_include (parse_in, opt->arg))
1422 /* Disable push_command_line_include callback for now. */
1423 include_cursor = deferred_count + 1;
1424 cpp_scan_nooutput (parse_in);
1430 if (cpp_opts->directives_only)
1431 cpp_init_special_builtins (parse_in);
1433 /* Start the main input file, if the debug writer wants it. */
1434 if (debug_hooks->start_end_main_source_file
1435 && !flag_preprocess_only)
1436 (*debug_hooks->start_source_file) (0, this_input_filename);
1440 push_command_line_include ();
1443 /* Give CPP the next file given by -include, if any. */
1445 push_command_line_include (void)
1447 while (include_cursor < deferred_count)
1449 struct deferred_opt *opt = &deferred_opts[include_cursor++];
1451 if (!cpp_opts->preprocessed && opt->code == OPT_include
1452 && cpp_push_include (parse_in, opt->arg))
1456 if (include_cursor == deferred_count)
1459 /* -Wunused-macros should only warn about macros defined hereafter. */
1460 cpp_opts->warn_unused_macros = warn_unused_macros;
1461 /* Restore the line map from <command line>. */
1462 if (!cpp_opts->preprocessed)
1463 cpp_change_file (parse_in, LC_RENAME, this_input_filename);
1465 /* Set this here so the client can change the option if it wishes,
1466 and after stacking the main file so we don't trace the main file. */
1467 line_table->trace_includes = cpp_opts->print_include_names;
1471 /* File change callback. Has to handle -include files. */
1473 cb_file_change (cpp_reader * ARG_UNUSED (pfile),
1474 const struct line_map *new_map)
1476 if (flag_preprocess_only)
1477 pp_file_change (new_map);
1479 fe_file_change (new_map);
1481 if (new_map == 0 || (new_map->reason == LC_LEAVE && MAIN_FILE_P (new_map)))
1482 push_command_line_include ();
1486 cb_dir_change (cpp_reader * ARG_UNUSED (pfile), const char *dir)
1488 if (!set_src_pwd (dir))
1489 warning (0, "too late for # directive to set debug directory");
1492 /* Set the C 89 standard (with 1994 amendments if C94, without GNU
1493 extensions if ISO). There is no concept of gnu94. */
1495 set_std_c89 (int c94, int iso)
1497 cpp_set_lang (parse_in, c94 ? CLK_STDC94: iso ? CLK_STDC89: CLK_GNUC89);
1500 flag_no_gnu_keywords = iso;
1501 flag_no_nonansi_builtin = iso;
1507 /* Set the C 99 standard (without GNU extensions if ISO). */
1509 set_std_c99 (int iso)
1511 cpp_set_lang (parse_in, iso ? CLK_STDC99: CLK_GNUC99);
1513 flag_no_nonansi_builtin = iso;
1520 /* Set the C 1X standard draft (without GNU extensions if ISO). */
1522 set_std_c1x (int iso)
1524 cpp_set_lang (parse_in, iso ? CLK_STDC1X: CLK_GNUC1X);
1526 flag_no_nonansi_builtin = iso;
1533 /* Set the C++ 98 standard (without GNU extensions if ISO). */
1535 set_std_cxx98 (int iso)
1537 cpp_set_lang (parse_in, iso ? CLK_CXX98: CLK_GNUCXX);
1538 flag_no_gnu_keywords = iso;
1539 flag_no_nonansi_builtin = iso;
1541 cxx_dialect = cxx98;
1544 /* Set the C++ 0x working draft "standard" (without GNU extensions if ISO). */
1546 set_std_cxx0x (int iso)
1548 cpp_set_lang (parse_in, iso ? CLK_CXX0X: CLK_GNUCXX0X);
1549 flag_no_gnu_keywords = iso;
1550 flag_no_nonansi_builtin = iso;
1552 cxx_dialect = cxx0x;
1555 /* Args to -d specify what to dump. Silently ignore
1556 unrecognized options; they may be aimed at toplev.c. */
1558 handle_OPT_d (const char *arg)
1562 while ((c = *arg++) != '\0')
1565 case 'M': /* Dump macros only. */
1566 case 'N': /* Dump names. */
1567 case 'D': /* Dump definitions. */
1568 case 'U': /* Dump used macros. */
1569 flag_dump_macros = c;
1573 flag_dump_includes = 1;