1 /* C/ObjC/C++ command line option handling.
2 Copyright (C) 2002, 2003, 2004, 2005 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, 51 Franklin Street, Fifth Floor, 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. */
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 static 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 /* If -lang-fortran seen. */
74 static bool lang_fortran
= false;
76 /* Dependency output file. */
77 static const char *deps_file
;
79 /* The prefix given by -iprefix, if any. */
80 static const char *iprefix
;
82 /* The 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 set_Wimplicit (int);
107 static void handle_OPT_d (const char *);
108 static void set_std_cxx98 (int);
109 static void set_std_c89 (int, int);
110 static void set_std_c99 (int);
111 static void check_deps_environment_vars (void);
112 static void handle_deferred_opts (void);
113 static void sanitize_cpp_opts (void);
114 static void add_prefixed_path (const char *, size_t);
115 static void push_command_line_include (void);
116 static void cb_file_change (cpp_reader
*, const struct line_map
*);
117 static void cb_dir_change (cpp_reader
*, const char *);
118 static void finish_options (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 (enum opt_code
, const char *);
127 static struct deferred_opt
133 /* Complain that switch CODE expects an argument but none was
134 provided. OPT was the command-line option. Return FALSE to get
135 the default message in opts.c, TRUE if we provide a specialized
138 c_common_missing_argument (const char *opt
, size_t code
)
143 /* Pick up the default message. */
146 case OPT_fconstant_string_class_
:
147 error ("no class name specified with %qs", opt
);
151 error ("assertion missing after %qs", opt
);
156 error ("macro name missing after %qs", opt
);
165 error ("missing path after %qs", opt
);
174 error ("missing filename after %qs", opt
);
179 error ("missing makefile target after %qs", opt
);
186 /* Defer option CODE with argument ARG. */
188 defer_opt (enum opt_code code
, const char *arg
)
190 deferred_opts
[deferred_count
].code
= code
;
191 deferred_opts
[deferred_count
].arg
= arg
;
195 /* Common initialization before parsing options. */
197 c_common_init_options (unsigned int argc
, const char **argv
)
199 static const unsigned int lang_flags
[] = {CL_C
, CL_ObjC
, CL_CXX
, CL_ObjCXX
};
200 unsigned int i
, result
;
202 /* This is conditionalized only because that is the way the front
203 ends used to do it. Maybe this should be unconditional? */
204 if (c_dialect_cxx ())
206 /* By default wrap lines at 80 characters. Is getenv
207 ("COLUMNS") preferable? */
208 diagnostic_line_cutoff (global_dc
) = 80;
209 /* By default, emit location information once for every
210 diagnostic message. */
211 diagnostic_prefixing_rule (global_dc
) = DIAGNOSTICS_SHOW_PREFIX_ONCE
;
214 parse_in
= cpp_create_reader (c_dialect_cxx () ? CLK_GNUCXX
: CLK_GNUC89
,
215 ident_hash
, &line_table
);
217 cpp_opts
= cpp_get_options (parse_in
);
218 cpp_opts
->dollars_in_ident
= DOLLARS_IN_IDENTIFIERS
;
219 cpp_opts
->objc
= c_dialect_objc ();
221 /* Reset to avoid warnings on internal definitions. We set it just
222 before passing on command-line options to cpplib. */
223 cpp_opts
->warn_dollars
= 0;
225 flag_const_strings
= c_dialect_cxx ();
226 flag_exceptions
= c_dialect_cxx ();
227 warn_pointer_arith
= c_dialect_cxx ();
229 deferred_opts
= XNEWVEC (struct deferred_opt
, argc
);
231 result
= lang_flags
[c_language
];
233 if (c_language
== clk_c
)
235 /* If preprocessing assembly language, accept any of the C-family
236 front end options since the driver may pass them through. */
237 for (i
= 1; i
< argc
; i
++)
238 if (! strcmp (argv
[i
], "-lang-asm"))
240 result
|= CL_C
| CL_ObjC
| CL_CXX
| CL_ObjCXX
;
245 for (i
= 1; i
< argc
; i
++)
246 if (! strcmp (argv
[i
], "-lang-fortran"))
248 result
|= CL_Fortran
;
257 /* Handle switch SCODE with argument ARG. VALUE is true, unless no-
258 form of an -f or -W option was given. Returns 0 if the switch was
259 invalid, a negative number to prevent language-independent
260 processing in toplev.c (a hack necessary for the short-term). */
262 c_common_handle_option (size_t scode
, const char *arg
, int value
)
264 const struct cl_option
*option
= &cl_options
[scode
];
265 enum opt_code code
= (enum opt_code
) scode
;
271 if (cl_options
[code
].flags
& (CL_C
| CL_CXX
| CL_ObjC
| CL_ObjCXX
))
274 if (lang_fortran
&& (cl_options
[code
].flags
& (CL_Fortran
)))
280 case OPT__output_pch_
:
285 defer_opt (code
, arg
);
289 cpp_opts
->discard_comments
= 0;
293 cpp_opts
->discard_comments
= 0;
294 cpp_opts
->discard_comments_in_macro_exp
= 0;
298 defer_opt (code
, arg
);
302 flag_preprocess_only
= 1;
306 cpp_opts
->print_include_names
= 1;
310 TARGET_OPTF (xstrdup (arg
));
314 if (strcmp (arg
, "-"))
315 add_path (xstrdup (arg
), BRACKET
, 0, true);
318 if (quote_chain_split
)
319 error ("-I- specified twice");
320 quote_chain_split
= true;
321 split_quote_chain ();
322 inform ("obsolete option -I- used, please use -iquote instead");
328 /* When doing dependencies with -M or -MM, suppress normal
329 preprocessed output, but still do -dM etc. as software
330 depends on this. Preprocessed output does occur if -MD, -MMD
331 or environment var dependency generation is used. */
332 cpp_opts
->deps
.style
= (code
== OPT_M
? DEPS_SYSTEM
: DEPS_USER
);
334 cpp_opts
->inhibit_warnings
= 1;
339 cpp_opts
->deps
.style
= (code
== OPT_MD
? DEPS_SYSTEM
: DEPS_USER
);
350 cpp_opts
->deps
.missing_files
= true;
355 cpp_opts
->deps
.phony_targets
= true;
361 defer_opt (code
, arg
);
365 flag_no_line_commands
= 1;
368 case OPT_fworking_directory
:
369 flag_working_directory
= value
;
373 defer_opt (code
, arg
);
379 set_Wimplicit (value
);
380 warn_char_subscripts
= value
;
381 warn_missing_braces
= value
;
382 warn_parentheses
= value
;
383 warn_return_type
= value
;
384 warn_sequence_point
= value
; /* Was C only. */
385 if (c_dialect_cxx ())
386 warn_sign_compare
= value
;
388 warn_strict_aliasing
= value
;
389 warn_string_literal_comparison
= value
;
390 warn_always_true
= value
;
392 /* Only warn about unknown pragmas that are not in system
394 warn_unknown_pragmas
= value
;
396 /* We save the value of warn_uninitialized, since if they put
397 -Wuninitialized on the command line, we need to generate a
398 warning about not using it without also specifying -O. */
399 if (warn_uninitialized
!= 1)
400 warn_uninitialized
= (value
? 2 : 0);
402 if (!c_dialect_cxx ())
403 /* We set this to 2 here, but 1 in -Wmain, so -ffreestanding
404 can turn it off only if it's not explicit. */
405 warn_main
= value
* 2;
408 /* C++-specific warnings. */
409 warn_nonvdtor
= value
;
410 warn_reorder
= value
;
411 warn_nontemplate_friend
= value
;
414 cpp_opts
->warn_trigraphs
= value
;
415 cpp_opts
->warn_comments
= value
;
416 cpp_opts
->warn_num_sign_change
= value
;
417 cpp_opts
->warn_multichar
= value
; /* Was C++ only. */
422 cpp_opts
->warn_comments
= value
;
425 case OPT_Wdeprecated
:
426 cpp_opts
->warn_deprecated
= value
;
429 case OPT_Wdiv_by_zero
:
430 warn_div_by_zero
= value
;
433 case OPT_Wendif_labels
:
434 cpp_opts
->warn_endif_labels
= value
;
438 cpp_opts
->warnings_are_errors
= value
;
439 global_dc
->warning_as_error_requested
= value
;
442 case OPT_Werror_implicit_function_declaration
:
443 mesg_implicit_function_declaration
= 2;
451 set_Wformat (atoi (arg
));
455 set_Wimplicit (value
);
459 /* Silently ignore for now. */
462 case OPT_Winvalid_pch
:
463 cpp_opts
->warn_invalid_pch
= value
;
473 case OPT_Wmissing_include_dirs
:
474 cpp_opts
->warn_missing_include_dirs
= value
;
478 cpp_opts
->warn_multichar
= value
;
481 case OPT_Wnormalized_
:
482 if (!value
|| (arg
&& strcasecmp (arg
, "none") == 0))
483 cpp_opts
->warn_normalize
= normalized_none
;
484 else if (!arg
|| strcasecmp (arg
, "nfkc") == 0)
485 cpp_opts
->warn_normalize
= normalized_KC
;
486 else if (strcasecmp (arg
, "id") == 0)
487 cpp_opts
->warn_normalize
= normalized_identifier_C
;
488 else if (strcasecmp (arg
, "nfc") == 0)
489 cpp_opts
->warn_normalize
= normalized_C
;
491 error ("argument %qs to %<-Wnormalized%> not recognized", arg
);
494 case OPT_Wreturn_type
:
495 warn_return_type
= value
;
498 case OPT_Wstrict_null_sentinel
:
499 warn_strict_null_sentinel
= value
;
502 case OPT_Wsystem_headers
:
503 cpp_opts
->warn_system_headers
= value
;
506 case OPT_Wtraditional
:
507 cpp_opts
->warn_traditional
= value
;
511 cpp_opts
->warn_trigraphs
= value
;
515 cpp_opts
->warn_undef
= value
;
518 case OPT_Wunknown_pragmas
:
519 /* Set to greater than 1, so that even unknown pragmas in
520 system headers will be warned about. */
521 warn_unknown_pragmas
= value
* 2;
524 case OPT_Wunused_macros
:
525 warn_unused_macros
= value
;
528 case OPT_Wvariadic_macros
:
529 warn_variadic_macros
= value
;
532 case OPT_Wwrite_strings
:
533 if (!c_dialect_cxx ())
534 flag_const_strings
= value
;
536 warn_write_strings
= value
;
540 if (!c_dialect_cxx ())
541 set_std_c89 (false, true);
543 set_std_cxx98 (true);
550 case OPT_fcond_mismatch
:
551 if (!c_dialect_cxx ())
553 flag_cond_mismatch
= value
;
558 case OPT_fall_virtual
:
559 case OPT_falt_external_templates
:
560 case OPT_fenum_int_equiv
:
561 case OPT_fexternal_templates
:
562 case OPT_fguiding_decls
:
564 case OPT_fhuge_objects
:
566 case OPT_fname_mangling_version_
:
568 case OPT_fnonnull_objects
:
570 case OPT_fstrict_prototype
:
571 case OPT_fthis_is_variable
:
572 case OPT_fvtable_thunks
:
575 warning (0, "switch %qs is no longer supported", option
->opt_text
);
578 case OPT_faccess_control
:
579 flag_access_control
= value
;
583 flag_no_asm
= !value
;
587 flag_no_builtin
= !value
;
594 disable_builtin_function (arg
);
597 case OPT_fdollars_in_identifiers
:
598 cpp_opts
->dollars_in_ident
= value
;
601 case OPT_ffreestanding
:
603 /* Fall through.... */
606 flag_no_builtin
= !value
;
607 /* warn_main will be 2 if set by -Wall, 1 if set by -Wmain */
608 if (!value
&& warn_main
== 2)
612 case OPT_fshort_double
:
613 flag_short_double
= value
;
616 case OPT_fshort_enums
:
617 flag_short_enums
= value
;
620 case OPT_fshort_wchar
:
621 flag_short_wchar
= value
;
624 case OPT_fsigned_bitfields
:
625 flag_signed_bitfields
= value
;
628 case OPT_fsigned_char
:
629 flag_signed_char
= value
;
632 case OPT_funsigned_bitfields
:
633 flag_signed_bitfields
= !value
;
636 case OPT_funsigned_char
:
637 flag_signed_char
= !value
;
641 flag_check_new
= value
;
644 case OPT_fconserve_space
:
645 flag_conserve_space
= value
;
648 case OPT_fconst_strings
:
649 flag_const_strings
= value
;
652 case OPT_fconstant_string_class_
:
653 constant_string_class_name
= arg
;
656 case OPT_fdefault_inline
:
657 flag_default_inline
= value
;
660 case OPT_felide_constructors
:
661 flag_elide_constructors
= value
;
664 case OPT_fenforce_eh_specs
:
665 flag_enforce_eh_specs
= value
;
668 case OPT_fextended_identifiers
:
669 cpp_opts
->extended_identifiers
= value
;
673 flag_new_for_scope
= value
;
676 case OPT_fgnu_keywords
:
677 flag_no_gnu_keywords
= !value
;
680 case OPT_fgnu_runtime
:
681 flag_next_runtime
= !value
;
684 case OPT_fhandle_exceptions
:
685 warning (0, "-fhandle-exceptions has been renamed -fexceptions (and is now on by default)");
686 flag_exceptions
= value
;
689 case OPT_fimplement_inlines
:
690 flag_implement_inlines
= value
;
693 case OPT_fimplicit_inline_templates
:
694 flag_implicit_inline_templates
= value
;
697 case OPT_fimplicit_templates
:
698 flag_implicit_templates
= value
;
701 case OPT_fms_extensions
:
702 flag_ms_extensions
= value
;
705 case OPT_fnext_runtime
:
706 flag_next_runtime
= value
;
709 case OPT_fnil_receivers
:
710 flag_nil_receivers
= value
;
713 case OPT_fnonansi_builtins
:
714 flag_no_nonansi_builtin
= !value
;
717 case OPT_foperator_names
:
718 cpp_opts
->operator_names
= value
;
721 case OPT_foptional_diags
:
722 flag_optional_diags
= value
;
726 cpp_opts
->restore_pch_deps
= value
;
729 case OPT_fpch_preprocess
:
730 flag_pch_preprocess
= value
;
733 case OPT_fpermissive
:
734 flag_permissive
= value
;
737 case OPT_fpreprocessed
:
738 cpp_opts
->preprocessed
= value
;
741 case OPT_freplace_objc_classes
:
742 flag_replace_objc_classes
= value
;
746 flag_use_repository
= value
;
748 flag_implicit_templates
= 0;
755 case OPT_fshow_column
:
756 cpp_opts
->show_column
= value
;
760 flag_detailed_statistics
= value
;
764 /* It is documented that we silently ignore silly values. */
765 if (value
>= 1 && value
<= 100)
766 cpp_opts
->tabstop
= value
;
769 case OPT_fexec_charset_
:
770 cpp_opts
->narrow_charset
= arg
;
773 case OPT_fwide_exec_charset_
:
774 cpp_opts
->wide_charset
= arg
;
777 case OPT_finput_charset_
:
778 cpp_opts
->input_charset
= arg
;
781 case OPT_ftemplate_depth_
:
782 max_tinst_depth
= value
;
785 case OPT_fuse_cxa_atexit
:
786 flag_use_cxa_atexit
= value
;
789 case OPT_fvisibility_inlines_hidden
:
790 visibility_options
.inlines_hidden
= value
;
797 case OPT_fthreadsafe_statics
:
798 flag_threadsafe_statics
= value
;
802 flag_zero_link
= value
;
806 flag_gen_declaration
= 1;
810 add_path (xstrdup (arg
), AFTER
, 0, true);
815 defer_opt (code
, arg
);
823 add_path (xstrdup (arg
), QUOTE
, 0, true);
831 add_path (xstrdup (arg
), SYSTEM
, 0, true);
834 case OPT_iwithprefix
:
835 add_prefixed_path (arg
, SYSTEM
);
838 case OPT_iwithprefixbefore
:
839 add_prefixed_path (arg
, BRACKET
);
843 cpp_set_lang (parse_in
, CLK_ASM
);
844 cpp_opts
->dollars_in_ident
= false;
847 case OPT_lang_fortran
:
867 error ("output filename specified twice");
870 /* We need to handle the -pedantic switches here, rather than in
871 c_common_post_options, so that a subsequent -Wno-endif-labels
872 is not overridden. */
873 case OPT_pedantic_errors
:
874 cpp_opts
->pedantic_errors
= 1;
877 cpp_opts
->pedantic
= 1;
878 cpp_opts
->warn_endif_labels
= 1;
881 case OPT_print_objc_runtime_info
:
882 print_struct_values
= 1;
885 case OPT_print_pch_checksum
:
886 c_common_print_pch_checksum (stdout
);
887 exit_after_options
= true;
895 case OPT_std_gnu__98
:
896 set_std_cxx98 (code
== OPT_std_c__98
/* ISO */);
900 case OPT_std_iso9899_1990
:
901 case OPT_std_iso9899_199409
:
902 set_std_c89 (code
== OPT_std_iso9899_199409
/* c94 */, true /* ISO */);
906 set_std_c89 (false /* c94 */, false /* ISO */);
911 case OPT_std_iso9899_1999
:
912 case OPT_std_iso9899_199x
:
913 set_std_c99 (true /* ISO */);
918 set_std_c99 (false /* ISO */);
922 cpp_opts
->trigraphs
= 1;
925 case OPT_traditional_cpp
:
926 cpp_opts
->traditional
= 1;
934 cpp_opts
->inhibit_warnings
= 1;
945 /* Post-switch processing. */
947 c_common_post_options (const char **pfilename
)
949 struct cpp_callbacks
*cb
;
951 /* Canonicalize the input and output filenames. */
952 if (in_fnames
== NULL
)
954 in_fnames
= XNEWVEC (const char *, 1);
957 else if (strcmp (in_fnames
[0], "-") == 0)
960 if (out_fname
== NULL
|| !strcmp (out_fname
, "-"))
963 if (cpp_opts
->deps
.style
== DEPS_NONE
)
964 check_deps_environment_vars ();
966 handle_deferred_opts ();
968 sanitize_cpp_opts ();
970 register_include_chains (parse_in
, sysroot
, iprefix
,
971 std_inc
, std_cxx_inc
&& c_dialect_cxx (), verbose
);
973 flag_inline_trees
= 1;
975 /* Use tree inlining. */
978 if (flag_inline_functions
)
979 flag_inline_trees
= 2;
981 /* If we are given more than one input file, we must use
982 unit-at-a-time mode. */
983 if (num_in_fnames
> 1)
984 flag_unit_at_a_time
= 1;
986 /* Default to ObjC sjlj exception handling if NeXT runtime. */
987 if (flag_objc_sjlj_exceptions
< 0)
988 flag_objc_sjlj_exceptions
= flag_next_runtime
;
989 if (flag_objc_exceptions
&& !flag_objc_sjlj_exceptions
)
992 /* -Wextra implies -Wsign-compare and -Wmissing-field-initializers,
993 but not if explicitly overridden. */
994 if (warn_sign_compare
== -1)
995 warn_sign_compare
= extra_warnings
;
996 if (warn_missing_field_initializers
== -1)
997 warn_missing_field_initializers
= extra_warnings
;
999 /* Special format checking options don't work without -Wformat; warn if
1003 warning (OPT_Wformat_y2k
,
1004 "-Wformat-y2k ignored without -Wformat");
1005 warning (OPT_Wformat_extra_args
,
1006 "-Wformat-extra-args ignored without -Wformat");
1007 warning (OPT_Wformat_zero_length
,
1008 "-Wformat-zero-length ignored without -Wformat");
1009 warning (OPT_Wformat_nonliteral
,
1010 "-Wformat-nonliteral ignored without -Wformat");
1011 warning (OPT_Wformat_security
,
1012 "-Wformat-security ignored without -Wformat");
1015 /* C99 requires special handling of complex multiplication and division;
1016 -ffast-math and -fcx-limited-range are handled in process_options. */
1018 flag_complex_method
= 2;
1020 if (flag_preprocess_only
)
1022 /* Open the output now. We must do so even if flag_no_output is
1023 on, because there may be other output than from the actual
1024 preprocessing (e.g. from -dM). */
1025 if (out_fname
[0] == '\0')
1026 out_stream
= stdout
;
1028 out_stream
= fopen (out_fname
, "w");
1030 if (out_stream
== NULL
)
1032 fatal_error ("opening output file %s: %m", out_fname
);
1036 if (num_in_fnames
> 1)
1037 error ("too many filenames given. Type %s --help for usage",
1040 init_pp_output (out_stream
);
1046 /* Yuk. WTF is this? I do know ObjC relies on it somewhere. */
1047 input_location
= UNKNOWN_LOCATION
;
1050 cb
= cpp_get_callbacks (parse_in
);
1051 cb
->file_change
= cb_file_change
;
1052 cb
->dir_change
= cb_dir_change
;
1053 cpp_post_options (parse_in
);
1055 input_location
= UNKNOWN_LOCATION
;
1057 /* If an error has occurred in cpplib, note it so we fail
1059 errorcount
+= cpp_errors (parse_in
);
1061 *pfilename
= this_input_filename
1062 = cpp_read_main_file (parse_in
, in_fnames
[0]);
1063 /* Don't do any compilation or preprocessing if there is no input file. */
1064 if (this_input_filename
== NULL
)
1070 if (flag_working_directory
1071 && flag_preprocess_only
&& !flag_no_line_commands
)
1072 pp_dir_change (parse_in
, get_src_pwd ());
1074 return flag_preprocess_only
;
1077 /* Front end initialization common to C, ObjC and C++. */
1079 c_common_init (void)
1081 /* Set up preprocessor arithmetic. Must be done after call to
1082 c_common_nodes_and_builtins for type nodes to be good. */
1083 cpp_opts
->precision
= TYPE_PRECISION (intmax_type_node
);
1084 cpp_opts
->char_precision
= TYPE_PRECISION (char_type_node
);
1085 cpp_opts
->int_precision
= TYPE_PRECISION (integer_type_node
);
1086 cpp_opts
->wchar_precision
= TYPE_PRECISION (wchar_type_node
);
1087 cpp_opts
->unsigned_wchar
= TYPE_UNSIGNED (wchar_type_node
);
1088 cpp_opts
->bytes_big_endian
= BYTES_BIG_ENDIAN
;
1090 /* This can't happen until after wchar_precision and bytes_big_endian
1092 cpp_init_iconv (parse_in
);
1095 c_common_print_pch_checksum (stderr
);
1097 if (flag_preprocess_only
)
1100 preprocess_file (parse_in
);
1104 /* Has to wait until now so that cpplib has its hash table. */
1110 /* Initialize the integrated preprocessor after debug output has been
1111 initialized; loop over each input file. */
1113 c_common_parse_file (int set_yydebug
)
1117 /* Enable parser debugging, if requested and we can. If requested
1118 and we can't, notify the user. */
1120 yydebug
= set_yydebug
;
1123 warning (0, "YYDEBUG was not defined at build time, -dy ignored");
1129 /* Start the main input file, if the debug writer wants it. */
1130 if (debug_hooks
->start_end_main_source_file
)
1131 (*debug_hooks
->start_source_file
) (0, this_input_filename
);
1138 /* And end the main input file, if the debug writer wants it */
1139 if (debug_hooks
->start_end_main_source_file
)
1140 (*debug_hooks
->end_source_file
) (0);
1141 if (++i
>= num_in_fnames
)
1143 cpp_undef_all (parse_in
);
1145 = cpp_read_main_file (parse_in
, in_fnames
[i
]);
1146 /* If an input file is missing, abandon further compilation.
1147 cpplib has issued a diagnostic. */
1148 if (!this_input_filename
)
1153 /* Common finish hook for the C, ObjC and C++ front ends. */
1155 c_common_finish (void)
1157 FILE *deps_stream
= NULL
;
1159 if (cpp_opts
->deps
.style
!= DEPS_NONE
)
1161 /* If -M or -MM was seen without -MF, default output to the
1164 deps_stream
= out_stream
;
1167 deps_stream
= fopen (deps_file
, deps_append
? "a": "w");
1169 fatal_error ("opening dependency file %s: %m", deps_file
);
1173 /* For performance, avoid tearing down cpplib's internal structures
1174 with cpp_destroy (). */
1175 errorcount
+= cpp_finish (parse_in
, deps_stream
);
1177 if (deps_stream
&& deps_stream
!= out_stream
1178 && (ferror (deps_stream
) || fclose (deps_stream
)))
1179 fatal_error ("closing dependency file %s: %m", deps_file
);
1181 if (out_stream
&& (ferror (out_stream
) || fclose (out_stream
)))
1182 fatal_error ("when writing output to %s: %m", out_fname
);
1185 /* Either of two environment variables can specify output of
1186 dependencies. Their value is either "OUTPUT_FILE" or "OUTPUT_FILE
1187 DEPS_TARGET", where OUTPUT_FILE is the file to write deps info to
1188 and DEPS_TARGET is the target to mention in the deps. They also
1189 result in dependency information being appended to the output file
1190 rather than overwriting it, and like Sun's compiler
1191 SUNPRO_DEPENDENCIES suppresses the dependency on the main file. */
1193 check_deps_environment_vars (void)
1197 GET_ENVIRONMENT (spec
, "DEPENDENCIES_OUTPUT");
1199 cpp_opts
->deps
.style
= DEPS_USER
;
1202 GET_ENVIRONMENT (spec
, "SUNPRO_DEPENDENCIES");
1205 cpp_opts
->deps
.style
= DEPS_SYSTEM
;
1206 cpp_opts
->deps
.ignore_main_file
= true;
1212 /* Find the space before the DEPS_TARGET, if there is one. */
1213 char *s
= strchr (spec
, ' ');
1216 /* Let the caller perform MAKE quoting. */
1217 defer_opt (OPT_MT
, s
+ 1);
1221 /* Command line -MF overrides environment variables and default. */
1230 /* Handle deferred command line switches. */
1232 handle_deferred_opts (void)
1237 /* Avoid allocating the deps buffer if we don't need it.
1238 (This flag may be true without there having been -MT or -MQ
1239 options, but we'll still need the deps buffer.) */
1243 deps
= cpp_get_deps (parse_in
);
1245 for (i
= 0; i
< deferred_count
; i
++)
1247 struct deferred_opt
*opt
= &deferred_opts
[i
];
1249 if (opt
->code
== OPT_MT
|| opt
->code
== OPT_MQ
)
1250 deps_add_target (deps
, opt
->arg
, opt
->code
== OPT_MQ
);
1254 /* These settings are appropriate for GCC, but not necessarily so for
1255 cpplib as a library. */
1257 sanitize_cpp_opts (void)
1259 /* If we don't know what style of dependencies to output, complain
1260 if any other dependency switches have been given. */
1261 if (deps_seen
&& cpp_opts
->deps
.style
== DEPS_NONE
)
1262 error ("to generate dependencies you must specify either -M or -MM");
1264 /* -dM and dependencies suppress normal output; do it here so that
1265 the last -d[MDN] switch overrides earlier ones. */
1266 if (flag_dump_macros
== 'M')
1269 /* Disable -dD, -dN and -dI if normal output is suppressed. Allow
1270 -dM since at least glibc relies on -M -dM to work. */
1271 /* Also, flag_no_output implies flag_no_line_commands, always. */
1274 if (flag_dump_macros
!= 'M')
1275 flag_dump_macros
= 0;
1276 flag_dump_includes
= 0;
1277 flag_no_line_commands
= 1;
1280 cpp_opts
->unsigned_char
= !flag_signed_char
;
1281 cpp_opts
->stdc_0_in_system_headers
= STDC_0_IN_SYSTEM_HEADERS
;
1283 /* We want -Wno-long-long to override -pedantic -std=non-c99
1284 and/or -Wtraditional, whatever the ordering. */
1285 cpp_opts
->warn_long_long
1286 = warn_long_long
&& ((!flag_isoc99
&& pedantic
) || warn_traditional
);
1288 /* Similarly with -Wno-variadic-macros. No check for c99 here, since
1289 this also turns off warnings about GCCs extension. */
1290 cpp_opts
->warn_variadic_macros
1291 = warn_variadic_macros
&& (pedantic
|| warn_traditional
);
1293 /* If we're generating preprocessor output, emit current directory
1294 if explicitly requested or if debugging information is enabled.
1295 ??? Maybe we should only do it for debugging formats that
1296 actually output the current directory? */
1297 if (flag_working_directory
== -1)
1298 flag_working_directory
= (debug_info_level
!= DINFO_LEVEL_NONE
);
1301 /* Add include path with a prefix at the front of its name. */
1303 add_prefixed_path (const char *suffix
, size_t chain
)
1307 size_t prefix_len
, suffix_len
;
1309 suffix_len
= strlen (suffix
);
1310 prefix
= iprefix
? iprefix
: cpp_GCC_INCLUDE_DIR
;
1311 prefix_len
= iprefix
? strlen (iprefix
) : cpp_GCC_INCLUDE_DIR_len
;
1313 path
= (char *) xmalloc (prefix_len
+ suffix_len
+ 1);
1314 memcpy (path
, prefix
, prefix_len
);
1315 memcpy (path
+ prefix_len
, suffix
, suffix_len
);
1316 path
[prefix_len
+ suffix_len
] = '\0';
1318 add_path (path
, chain
, 0, false);
1321 /* Handle -D, -U, -A, -imacros, and the first -include. */
1323 finish_options (void)
1325 if (!cpp_opts
->preprocessed
)
1329 cb_file_change (parse_in
,
1330 linemap_add (&line_table
, LC_RENAME
, 0,
1331 _("<built-in>"), 0));
1333 cpp_init_builtins (parse_in
, flag_hosted
);
1334 c_cpp_builtins (parse_in
);
1336 /* We're about to send user input to cpplib, so make it warn for
1337 things that we previously (when we sent it internal definitions)
1338 told it to not warn.
1340 C99 permits implementation-defined characters in identifiers.
1341 The documented meaning of -std= is to turn off extensions that
1342 conflict with the specified standard, and since a strictly
1343 conforming program cannot contain a '$', we do not condition
1344 their acceptance on the -std= setting. */
1345 cpp_opts
->warn_dollars
= (cpp_opts
->pedantic
&& !cpp_opts
->c99
);
1347 cpp_change_file (parse_in
, LC_RENAME
, _("<command line>"));
1348 for (i
= 0; i
< deferred_count
; i
++)
1350 struct deferred_opt
*opt
= &deferred_opts
[i
];
1352 if (opt
->code
== OPT_D
)
1353 cpp_define (parse_in
, opt
->arg
);
1354 else if (opt
->code
== OPT_U
)
1355 cpp_undef (parse_in
, opt
->arg
);
1356 else if (opt
->code
== OPT_A
)
1358 if (opt
->arg
[0] == '-')
1359 cpp_unassert (parse_in
, opt
->arg
+ 1);
1361 cpp_assert (parse_in
, opt
->arg
);
1365 /* Handle -imacros after -D and -U. */
1366 for (i
= 0; i
< deferred_count
; i
++)
1368 struct deferred_opt
*opt
= &deferred_opts
[i
];
1370 if (opt
->code
== OPT_imacros
1371 && cpp_push_include (parse_in
, opt
->arg
))
1373 /* Disable push_command_line_include callback for now. */
1374 include_cursor
= deferred_count
+ 1;
1375 cpp_scan_nooutput (parse_in
);
1381 push_command_line_include ();
1384 /* Give CPP the next file given by -include, if any. */
1386 push_command_line_include (void)
1388 while (include_cursor
< deferred_count
)
1390 struct deferred_opt
*opt
= &deferred_opts
[include_cursor
++];
1392 if (!cpp_opts
->preprocessed
&& opt
->code
== OPT_include
1393 && cpp_push_include (parse_in
, opt
->arg
))
1397 if (include_cursor
== deferred_count
)
1400 /* -Wunused-macros should only warn about macros defined hereafter. */
1401 cpp_opts
->warn_unused_macros
= warn_unused_macros
;
1402 /* Restore the line map from <command line>. */
1403 if (!cpp_opts
->preprocessed
)
1404 cpp_change_file (parse_in
, LC_RENAME
, this_input_filename
);
1406 /* Set this here so the client can change the option if it wishes,
1407 and after stacking the main file so we don't trace the main file. */
1408 line_table
.trace_includes
= cpp_opts
->print_include_names
;
1412 /* File change callback. Has to handle -include files. */
1414 cb_file_change (cpp_reader
* ARG_UNUSED (pfile
),
1415 const struct line_map
*new_map
)
1417 if (flag_preprocess_only
)
1418 pp_file_change (new_map
);
1420 fe_file_change (new_map
);
1422 if (new_map
== 0 || (new_map
->reason
== LC_LEAVE
&& MAIN_FILE_P (new_map
)))
1423 push_command_line_include ();
1427 cb_dir_change (cpp_reader
* ARG_UNUSED (pfile
), const char *dir
)
1429 if (!set_src_pwd (dir
))
1430 warning (0, "too late for # directive to set debug directory");
1433 /* Set the C 89 standard (with 1994 amendments if C94, without GNU
1434 extensions if ISO). There is no concept of gnu94. */
1436 set_std_c89 (int c94
, int iso
)
1438 cpp_set_lang (parse_in
, c94
? CLK_STDC94
: iso
? CLK_STDC89
: CLK_GNUC89
);
1441 flag_no_gnu_keywords
= iso
;
1442 flag_no_nonansi_builtin
= iso
;
1447 /* Set the C 99 standard (without GNU extensions if ISO). */
1449 set_std_c99 (int iso
)
1451 cpp_set_lang (parse_in
, iso
? CLK_STDC99
: CLK_GNUC99
);
1453 flag_no_nonansi_builtin
= iso
;
1459 /* Set the C++ 98 standard (without GNU extensions if ISO). */
1461 set_std_cxx98 (int iso
)
1463 cpp_set_lang (parse_in
, iso
? CLK_CXX98
: CLK_GNUCXX
);
1464 flag_no_gnu_keywords
= iso
;
1465 flag_no_nonansi_builtin
= iso
;
1469 /* Handle setting implicit to ON. */
1471 set_Wimplicit (int on
)
1474 warn_implicit_int
= on
;
1477 if (mesg_implicit_function_declaration
!= 2)
1478 mesg_implicit_function_declaration
= 1;
1481 mesg_implicit_function_declaration
= 0;
1484 /* Args to -d specify what to dump. Silently ignore
1485 unrecognized options; they may be aimed at toplev.c. */
1487 handle_OPT_d (const char *arg
)
1491 while ((c
= *arg
++) != '\0')
1494 case 'M': /* Dump macros only. */
1495 case 'N': /* Dump names. */
1496 case 'D': /* Dump definitions. */
1497 flag_dump_macros
= c
;
1501 flag_dump_includes
= 1;