1 /* C/ObjC/C++ command line option handling.
2 Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
3 Contributed by Neil Booth.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
24 #include "coretypes.h"
31 #include "langhooks.h"
32 #include "tree-inline.h"
33 #include "diagnostic.h"
35 #include "cppdefault.h"
36 #include "c-incpath.h"
37 #include "debug.h" /* For debug_hooks. */
41 #ifndef DOLLARS_IN_IDENTIFIERS
42 # define DOLLARS_IN_IDENTIFIERS true
45 #ifndef TARGET_SYSTEM_ROOT
46 # define TARGET_SYSTEM_ROOT NULL
50 #define TARGET_OPTF(ARG)
53 static int saved_lineno
;
56 static cpp_options
*cpp_opts
;
59 static const char *this_input_filename
;
61 /* Filename and stream for preprocessed output. */
62 static const char *out_fname
;
63 static FILE *out_stream
;
65 /* Append dependencies to deps_file. */
66 static bool deps_append
;
68 /* If dependency switches (-MF etc.) have been given. */
69 static bool deps_seen
;
74 /* Dependency output file. */
75 static const char *deps_file
;
77 /* The prefix given by -iprefix, if any. */
78 static const char *iprefix
;
80 /* The system root, if any. Overridden by -isysroot. */
81 static const char *sysroot
= TARGET_SYSTEM_ROOT
;
83 /* Zero disables all standard directories for headers. */
84 static bool std_inc
= true;
86 /* Zero disables the C++-specific standard directories for headers. */
87 static bool std_cxx_inc
= true;
89 /* If the quote chain has been split by -I-. */
90 static bool quote_chain_split
;
92 /* If -Wunused-macros. */
93 static bool warn_unused_macros
;
95 /* If -Wvariadic-macros. */
96 static bool warn_variadic_macros
= true;
98 /* Number of deferred options. */
99 static size_t deferred_count
;
101 /* Number of deferred options scanned for -include. */
102 static size_t include_cursor
;
104 /* Permit Fortran front-end options. */
105 static bool permit_fortran_options
;
107 static void set_Wimplicit (int);
108 static void handle_OPT_d (const char *);
109 static void set_std_cxx98 (int);
110 static void set_std_c89 (int, int);
111 static void set_std_c99 (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
134 /* Complain that switch CODE expects an argument but none was
135 provided. OPT was the command-line option. Return FALSE to get
136 the default message in opts.c, TRUE if we provide a specialized
139 c_common_missing_argument (const char *opt
, size_t code
)
144 /* Pick up the default message. */
147 case OPT_fconstant_string_class_
:
148 error ("no class name specified with \"%s\"", opt
);
152 error ("assertion missing after \"%s\"", opt
);
157 error ("macro name missing after \"%s\"", opt
);
166 error ("missing path after \"%s\"", opt
);
175 error ("missing filename after \"%s\"", opt
);
180 error ("missing makefile target after \"%s\"", opt
);
187 /* Defer option CODE with argument ARG. */
189 defer_opt (enum opt_code code
, const char *arg
)
191 deferred_opts
[deferred_count
].code
= code
;
192 deferred_opts
[deferred_count
].arg
= arg
;
196 /* Common initialization before parsing options. */
198 c_common_init_options (unsigned int argc
, const char **argv ATTRIBUTE_UNUSED
)
200 static const unsigned int lang_flags
[] = {CL_C
, CL_ObjC
, CL_CXX
, CL_ObjCXX
};
203 /* This is conditionalized only because that is the way the front
204 ends used to do it. Maybe this should be unconditional? */
205 if (c_dialect_cxx ())
207 /* By default wrap lines at 80 characters. Is getenv
208 ("COLUMNS") preferable? */
209 diagnostic_line_cutoff (global_dc
) = 80;
210 /* By default, emit location information once for every
211 diagnostic message. */
212 diagnostic_prefixing_rule (global_dc
) = DIAGNOSTICS_SHOW_PREFIX_ONCE
;
215 parse_in
= cpp_create_reader (c_dialect_cxx () ? CLK_GNUCXX
: CLK_GNUC89
,
216 ident_hash
, &line_table
);
218 cpp_opts
= cpp_get_options (parse_in
);
219 cpp_opts
->dollars_in_ident
= DOLLARS_IN_IDENTIFIERS
;
220 cpp_opts
->objc
= c_dialect_objc ();
222 /* Reset to avoid warnings on internal definitions. We set it just
223 before passing on command-line options to cpplib. */
224 cpp_opts
->warn_dollars
= 0;
226 flag_const_strings
= c_dialect_cxx ();
227 flag_exceptions
= c_dialect_cxx ();
228 warn_pointer_arith
= c_dialect_cxx ();
230 deferred_opts
= xmalloc (argc
* sizeof (struct deferred_opt
));
232 result
= lang_flags
[c_language
];
234 /* If potentially preprocessing Fortran we have to accept its front
235 end options since the driver passes most of them through. */
237 if (c_language
== clk_c
&& argc
> 2
238 && !strcmp (argv
[2], "-traditional-cpp" ))
240 permit_fortran_options
= true;
248 /* Handle switch SCODE with argument ARG. VALUE is true, unless no-
249 form of an -f or -W option was given. Returns 0 if the switch was
250 invalid, a negative number to prevent language-independent
251 processing in toplev.c (a hack necessary for the short-term). */
253 c_common_handle_option (size_t scode
, const char *arg
, int value
)
255 const struct cl_option
*option
= &cl_options
[scode
];
256 enum opt_code code
= (enum opt_code
) scode
;
262 result
= permit_fortran_options
;
265 case OPT__output_pch_
:
270 defer_opt (code
, arg
);
274 cpp_opts
->discard_comments
= 0;
278 cpp_opts
->discard_comments
= 0;
279 cpp_opts
->discard_comments_in_macro_exp
= 0;
283 defer_opt (code
, arg
);
287 flag_preprocess_only
= 1;
291 cpp_opts
->print_include_names
= 1;
295 TARGET_OPTF (xstrdup (arg
));
299 if (strcmp (arg
, "-"))
300 add_path (xstrdup (arg
), BRACKET
, 0);
303 if (quote_chain_split
)
304 error ("-I- specified twice");
305 quote_chain_split
= true;
306 split_quote_chain ();
307 inform ("obsolete option -I- used, please use -iquote instead");
313 /* When doing dependencies with -M or -MM, suppress normal
314 preprocessed output, but still do -dM etc. as software
315 depends on this. Preprocessed output does occur if -MD, -MMD
316 or environment var dependency generation is used. */
317 cpp_opts
->deps
.style
= (code
== OPT_M
? DEPS_SYSTEM
: DEPS_USER
);
319 cpp_opts
->inhibit_warnings
= 1;
324 cpp_opts
->deps
.style
= (code
== OPT_MD
? DEPS_SYSTEM
: DEPS_USER
);
335 cpp_opts
->deps
.missing_files
= true;
340 cpp_opts
->deps
.phony_targets
= true;
346 defer_opt (code
, arg
);
350 flag_no_line_commands
= 1;
353 case OPT_fworking_directory
:
354 flag_working_directory
= value
;
358 defer_opt (code
, arg
);
368 set_Wimplicit (value
);
369 warn_char_subscripts
= value
;
370 warn_missing_braces
= value
;
371 warn_parentheses
= value
;
372 warn_return_type
= value
;
373 warn_sequence_point
= value
; /* Was C only. */
374 if (c_dialect_cxx ())
375 warn_sign_compare
= value
;
377 warn_strict_aliasing
= value
;
379 /* Only warn about unknown pragmas that are not in system
381 warn_unknown_pragmas
= value
;
383 /* We save the value of warn_uninitialized, since if they put
384 -Wuninitialized on the command line, we need to generate a
385 warning about not using it without also specifying -O. */
386 if (warn_uninitialized
!= 1)
387 warn_uninitialized
= (value
? 2 : 0);
389 if (!c_dialect_cxx ())
390 /* We set this to 2 here, but 1 in -Wmain, so -ffreestanding
391 can turn it off only if it's not explicit. */
392 warn_main
= value
* 2;
395 /* C++-specific warnings. */
396 warn_nonvdtor
= value
;
397 warn_reorder
= value
;
398 warn_nontemplate_friend
= value
;
401 cpp_opts
->warn_trigraphs
= value
;
402 cpp_opts
->warn_comments
= value
;
403 cpp_opts
->warn_num_sign_change
= value
;
404 cpp_opts
->warn_multichar
= value
; /* Was C++ only. */
407 case OPT_Wbad_function_cast
:
408 warn_bad_function_cast
= value
;
412 warn_cast_qual
= value
;
415 case OPT_Wchar_subscripts
:
416 warn_char_subscripts
= value
;
421 cpp_opts
->warn_comments
= value
;
424 case OPT_Wconversion
:
425 warn_conversion
= value
;
428 case OPT_Wctor_dtor_privacy
:
429 warn_ctor_dtor_privacy
= value
;
432 case OPT_Wdeclaration_after_statement
:
433 warn_declaration_after_statement
= value
;
436 case OPT_Wdeprecated
:
437 warn_deprecated
= value
;
438 cpp_opts
->warn_deprecated
= value
;
441 case OPT_Wdiv_by_zero
:
442 warn_div_by_zero
= value
;
449 case OPT_Wendif_labels
:
450 cpp_opts
->warn_endif_labels
= value
;
454 cpp_opts
->warnings_are_errors
= value
;
457 case OPT_Werror_implicit_function_declaration
:
458 mesg_implicit_function_declaration
= 2;
461 case OPT_Wfloat_equal
:
462 warn_float_equal
= value
;
470 set_Wformat (atoi (arg
));
473 case OPT_Wformat_extra_args
:
474 warn_format_extra_args
= value
;
477 case OPT_Wformat_nonliteral
:
478 warn_format_nonliteral
= value
;
481 case OPT_Wformat_security
:
482 warn_format_security
= value
;
485 case OPT_Wformat_y2k
:
486 warn_format_y2k
= value
;
489 case OPT_Wformat_zero_length
:
490 warn_format_zero_length
= value
;
494 warn_init_self
= value
;
498 set_Wimplicit (value
);
501 case OPT_Wimplicit_function_declaration
:
502 mesg_implicit_function_declaration
= value
;
505 case OPT_Wimplicit_int
:
506 warn_implicit_int
= value
;
510 /* Silently ignore for now. */
513 case OPT_Winvalid_offsetof
:
514 warn_invalid_offsetof
= value
;
517 case OPT_Winvalid_pch
:
518 cpp_opts
->warn_invalid_pch
= value
;
522 warn_long_long
= value
;
532 case OPT_Wmissing_braces
:
533 warn_missing_braces
= value
;
536 case OPT_Wmissing_declarations
:
537 warn_missing_declarations
= value
;
540 case OPT_Wmissing_format_attribute
:
541 warn_missing_format_attribute
= value
;
544 case OPT_Wmissing_prototypes
:
545 warn_missing_prototypes
= value
;
549 cpp_opts
->warn_multichar
= value
;
552 case OPT_Wnested_externs
:
553 warn_nested_externs
= value
;
556 case OPT_Wnon_template_friend
:
557 warn_nontemplate_friend
= value
;
560 case OPT_Wnon_virtual_dtor
:
561 warn_nonvdtor
= value
;
565 warn_nonnull
= value
;
568 case OPT_Wold_style_definition
:
569 warn_old_style_definition
= value
;
572 case OPT_Wold_style_cast
:
573 warn_old_style_cast
= value
;
576 case OPT_Woverloaded_virtual
:
577 warn_overloaded_virtual
= value
;
580 case OPT_Wparentheses
:
581 warn_parentheses
= value
;
584 case OPT_Wpmf_conversions
:
585 warn_pmf2ptr
= value
;
588 case OPT_Wpointer_arith
:
589 warn_pointer_arith
= value
;
593 warn_protocol
= value
;
597 warn_selector
= value
;
600 case OPT_Wredundant_decls
:
601 warn_redundant_decls
= value
;
605 warn_reorder
= value
;
608 case OPT_Wreturn_type
:
609 warn_return_type
= value
;
612 case OPT_Wsequence_point
:
613 warn_sequence_point
= value
;
616 case OPT_Wsign_compare
:
617 warn_sign_compare
= value
;
620 case OPT_Wsign_promo
:
621 warn_sign_promo
= value
;
624 case OPT_Wstrict_prototypes
:
625 warn_strict_prototypes
= value
;
632 case OPT_Wsystem_headers
:
633 cpp_opts
->warn_system_headers
= value
;
636 case OPT_Wtraditional
:
637 warn_traditional
= value
;
638 cpp_opts
->warn_traditional
= value
;
642 cpp_opts
->warn_trigraphs
= value
;
645 case OPT_Wundeclared_selector
:
646 warn_undeclared_selector
= value
;
650 cpp_opts
->warn_undef
= value
;
653 case OPT_Wunknown_pragmas
:
654 /* Set to greater than 1, so that even unknown pragmas in
655 system headers will be warned about. */
656 warn_unknown_pragmas
= value
* 2;
659 case OPT_Wunused_macros
:
660 warn_unused_macros
= value
;
663 case OPT_Wvariadic_macros
:
664 warn_variadic_macros
= value
;
667 case OPT_Wwrite_strings
:
668 if (!c_dialect_cxx ())
669 flag_const_strings
= value
;
671 warn_write_strings
= value
;
675 if (!c_dialect_cxx ())
676 set_std_c89 (false, true);
678 set_std_cxx98 (true);
685 case OPT_fcond_mismatch
:
686 if (!c_dialect_cxx ())
688 flag_cond_mismatch
= value
;
693 case OPT_fall_virtual
:
694 case OPT_falt_external_templates
:
695 case OPT_fenum_int_equiv
:
696 case OPT_fexternal_templates
:
697 case OPT_fguiding_decls
:
699 case OPT_fhuge_objects
:
701 case OPT_fname_mangling_version_
:
703 case OPT_fnonnull_objects
:
705 case OPT_fstrict_prototype
:
706 case OPT_fthis_is_variable
:
707 case OPT_fvtable_thunks
:
710 warning ("switch \"%s\" is no longer supported", option
->opt_text
);
713 case OPT_faccess_control
:
714 flag_access_control
= value
;
718 flag_no_asm
= !value
;
722 flag_no_builtin
= !value
;
729 disable_builtin_function (arg
);
732 case OPT_fdollars_in_identifiers
:
733 cpp_opts
->dollars_in_ident
= value
;
736 case OPT_ffreestanding
:
738 /* Fall through.... */
741 flag_no_builtin
= !value
;
742 /* warn_main will be 2 if set by -Wall, 1 if set by -Wmain */
743 if (!value
&& warn_main
== 2)
747 case OPT_fshort_double
:
748 flag_short_double
= value
;
751 case OPT_fshort_enums
:
752 flag_short_enums
= value
;
755 case OPT_fshort_wchar
:
756 flag_short_wchar
= value
;
759 case OPT_fsigned_bitfields
:
760 flag_signed_bitfields
= value
;
761 explicit_flag_signed_bitfields
= 1;
764 case OPT_fsigned_char
:
765 flag_signed_char
= value
;
768 case OPT_funsigned_bitfields
:
769 flag_signed_bitfields
= !value
;
770 explicit_flag_signed_bitfields
= 1;
773 case OPT_funsigned_char
:
774 flag_signed_char
= !value
;
778 flag_check_new
= value
;
781 case OPT_fconserve_space
:
782 flag_conserve_space
= value
;
785 case OPT_fconst_strings
:
786 flag_const_strings
= value
;
789 case OPT_fconstant_string_class_
:
790 constant_string_class_name
= arg
;
793 case OPT_fdefault_inline
:
794 flag_default_inline
= value
;
797 case OPT_felide_constructors
:
798 flag_elide_constructors
= value
;
801 case OPT_fenforce_eh_specs
:
802 flag_enforce_eh_specs
= value
;
805 case OPT_ffixed_form
:
806 case OPT_ffixed_line_length_
:
807 /* Fortran front end options ignored when preprocessing only. */
808 if (!flag_preprocess_only
)
813 flag_new_for_scope
= value
;
816 case OPT_fgnu_keywords
:
817 flag_no_gnu_keywords
= !value
;
820 case OPT_fgnu_runtime
:
821 flag_next_runtime
= !value
;
824 case OPT_fhandle_exceptions
:
825 warning ("-fhandle-exceptions has been renamed -fexceptions (and is now on by default)");
826 flag_exceptions
= value
;
829 case OPT_fimplement_inlines
:
830 flag_implement_inlines
= value
;
833 case OPT_fimplicit_inline_templates
:
834 flag_implicit_inline_templates
= value
;
837 case OPT_fimplicit_templates
:
838 flag_implicit_templates
= value
;
841 case OPT_fms_extensions
:
842 flag_ms_extensions
= value
;
845 case OPT_fnext_runtime
:
846 flag_next_runtime
= value
;
849 case OPT_fnil_receivers
:
850 flag_nil_receivers
= value
;
853 case OPT_fnonansi_builtins
:
854 flag_no_nonansi_builtin
= !value
;
857 case OPT_fobjc_exceptions
:
858 flag_objc_exceptions
= value
;
861 case OPT_foperator_names
:
862 cpp_opts
->operator_names
= value
;
865 case OPT_foptional_diags
:
866 flag_optional_diags
= value
;
870 cpp_opts
->restore_pch_deps
= value
;
873 case OPT_fpermissive
:
874 flag_permissive
= value
;
877 case OPT_fpreprocessed
:
878 cpp_opts
->preprocessed
= value
;
881 case OPT_freplace_objc_classes
:
882 flag_replace_objc_classes
= value
;
886 flag_use_repository
= value
;
888 flag_implicit_templates
= 0;
895 case OPT_fshow_column
:
896 cpp_opts
->show_column
= value
;
900 flag_detailed_statistics
= value
;
904 /* It is documented that we silently ignore silly values. */
905 if (value
>= 1 && value
<= 100)
906 cpp_opts
->tabstop
= value
;
909 case OPT_fexec_charset_
:
910 cpp_opts
->narrow_charset
= arg
;
913 case OPT_fwide_exec_charset_
:
914 cpp_opts
->wide_charset
= arg
;
917 case OPT_finput_charset_
:
918 cpp_opts
->input_charset
= arg
;
921 case OPT_ftemplate_depth_
:
922 max_tinst_depth
= value
;
925 case OPT_fuse_cxa_atexit
:
926 flag_use_cxa_atexit
= value
;
934 flag_zero_link
= value
;
938 flag_gen_declaration
= 1;
942 add_path (xstrdup (arg
), AFTER
, 0);
947 defer_opt (code
, arg
);
955 add_path (xstrdup (arg
), QUOTE
, 0);
963 add_path (xstrdup (arg
), SYSTEM
, 0);
966 case OPT_iwithprefix
:
967 add_prefixed_path (arg
, SYSTEM
);
970 case OPT_iwithprefixbefore
:
971 add_prefixed_path (arg
, BRACKET
);
975 cpp_set_lang (parse_in
, CLK_ASM
);
976 cpp_opts
->dollars_in_ident
= false;
995 error ("output filename specified twice");
998 /* We need to handle the -pedantic switches here, rather than in
999 c_common_post_options, so that a subsequent -Wno-endif-labels
1000 is not overridden. */
1001 case OPT_pedantic_errors
:
1002 cpp_opts
->pedantic_errors
= 1;
1005 cpp_opts
->pedantic
= 1;
1006 cpp_opts
->warn_endif_labels
= 1;
1009 case OPT_print_objc_runtime_info
:
1010 print_struct_values
= 1;
1014 cpp_opts
->remap
= 1;
1018 case OPT_std_gnu__98
:
1019 set_std_cxx98 (code
== OPT_std_c__98
/* ISO */);
1023 case OPT_std_iso9899_1990
:
1024 case OPT_std_iso9899_199409
:
1025 set_std_c89 (code
== OPT_std_iso9899_199409
/* c94 */, true /* ISO */);
1029 set_std_c89 (false /* c94 */, false /* ISO */);
1034 case OPT_std_iso9899_1999
:
1035 case OPT_std_iso9899_199x
:
1036 set_std_c99 (true /* ISO */);
1041 set_std_c99 (false /* ISO */);
1045 cpp_opts
->trigraphs
= 1;
1048 case OPT_traditional_cpp
:
1049 cpp_opts
->traditional
= 1;
1057 cpp_opts
->inhibit_warnings
= 1;
1068 /* Post-switch processing. */
1070 c_common_post_options (const char **pfilename
)
1072 struct cpp_callbacks
*cb
;
1074 /* Canonicalize the input and output filenames. */
1075 if (in_fnames
== NULL
)
1077 in_fnames
= xmalloc (sizeof (in_fnames
[0]));
1080 else if (strcmp (in_fnames
[0], "-") == 0)
1083 if (out_fname
== NULL
|| !strcmp (out_fname
, "-"))
1086 if (cpp_opts
->deps
.style
== DEPS_NONE
)
1087 check_deps_environment_vars ();
1089 handle_deferred_opts ();
1091 sanitize_cpp_opts ();
1093 register_include_chains (parse_in
, sysroot
, iprefix
,
1094 std_inc
, std_cxx_inc
&& c_dialect_cxx (), verbose
);
1096 flag_inline_trees
= 1;
1098 /* Use tree inlining. */
1099 if (!flag_no_inline
)
1101 if (flag_inline_functions
)
1103 flag_inline_trees
= 2;
1104 flag_inline_functions
= 0;
1107 /* -Wextra implies -Wsign-compare, but not if explicitly
1109 if (warn_sign_compare
== -1)
1110 warn_sign_compare
= extra_warnings
;
1112 /* Special format checking options don't work without -Wformat; warn if
1114 if (warn_format_y2k
&& !warn_format
)
1115 warning ("-Wformat-y2k ignored without -Wformat");
1116 if (warn_format_extra_args
&& !warn_format
)
1117 warning ("-Wformat-extra-args ignored without -Wformat");
1118 if (warn_format_zero_length
&& !warn_format
)
1119 warning ("-Wformat-zero-length ignored without -Wformat");
1120 if (warn_format_nonliteral
&& !warn_format
)
1121 warning ("-Wformat-nonliteral ignored without -Wformat");
1122 if (warn_format_security
&& !warn_format
)
1123 warning ("-Wformat-security ignored without -Wformat");
1124 if (warn_missing_format_attribute
&& !warn_format
)
1125 warning ("-Wmissing-format-attribute ignored without -Wformat");
1127 if (flag_preprocess_only
)
1129 /* Open the output now. We must do so even if flag_no_output is
1130 on, because there may be other output than from the actual
1131 preprocessing (e.g. from -dM). */
1132 if (out_fname
[0] == '\0')
1133 out_stream
= stdout
;
1135 out_stream
= fopen (out_fname
, "w");
1137 if (out_stream
== NULL
)
1139 fatal_error ("opening output file %s: %m", out_fname
);
1143 if (num_in_fnames
> 1)
1144 error ("too many filenames given. Type %s --help for usage",
1147 init_pp_output (out_stream
);
1153 /* Yuk. WTF is this? I do know ObjC relies on it somewhere. */
1157 cb
= cpp_get_callbacks (parse_in
);
1158 cb
->file_change
= cb_file_change
;
1159 cb
->dir_change
= cb_dir_change
;
1160 cpp_post_options (parse_in
);
1162 saved_lineno
= input_line
;
1165 /* If an error has occurred in cpplib, note it so we fail
1167 errorcount
+= cpp_errors (parse_in
);
1169 *pfilename
= this_input_filename
1170 = cpp_read_main_file (parse_in
, in_fnames
[0]);
1171 /* Don't do any compilation or preprocessing if there is no input file. */
1172 if (this_input_filename
== NULL
)
1178 if (flag_working_directory
1179 && flag_preprocess_only
&& ! flag_no_line_commands
)
1180 pp_dir_change (parse_in
, get_src_pwd ());
1182 return flag_preprocess_only
;
1185 /* Front end initialization common to C, ObjC and C++. */
1187 c_common_init (void)
1189 input_line
= saved_lineno
;
1191 /* Set up preprocessor arithmetic. Must be done after call to
1192 c_common_nodes_and_builtins for type nodes to be good. */
1193 cpp_opts
->precision
= TYPE_PRECISION (intmax_type_node
);
1194 cpp_opts
->char_precision
= TYPE_PRECISION (char_type_node
);
1195 cpp_opts
->int_precision
= TYPE_PRECISION (integer_type_node
);
1196 cpp_opts
->wchar_precision
= TYPE_PRECISION (wchar_type_node
);
1197 cpp_opts
->unsigned_wchar
= TYPE_UNSIGNED (wchar_type_node
);
1198 cpp_opts
->bytes_big_endian
= BYTES_BIG_ENDIAN
;
1200 /* This can't happen until after wchar_precision and bytes_big_endian
1202 cpp_init_iconv (parse_in
);
1204 if (flag_preprocess_only
)
1207 preprocess_file (parse_in
);
1211 /* Has to wait until now so that cpplib has its hash table. */
1217 /* Initialize the integrated preprocessor after debug output has been
1218 initialized; loop over each input file. */
1220 c_common_parse_file (int set_yydebug
)
1223 yydebug
= set_yydebug
;
1226 warning ("YYDEBUG not defined");
1229 if (num_in_fnames
> 1)
1230 fatal_error ("sorry, inter-module analysis temporarily out of commission");
1240 /* Common finish hook for the C, ObjC and C++ front ends. */
1242 c_common_finish (void)
1244 FILE *deps_stream
= NULL
;
1246 if (cpp_opts
->deps
.style
!= DEPS_NONE
)
1248 /* If -M or -MM was seen without -MF, default output to the
1251 deps_stream
= out_stream
;
1254 deps_stream
= fopen (deps_file
, deps_append
? "a": "w");
1256 fatal_error ("opening dependency file %s: %m", deps_file
);
1260 /* For performance, avoid tearing down cpplib's internal structures
1261 with cpp_destroy (). */
1262 errorcount
+= cpp_finish (parse_in
, deps_stream
);
1264 if (deps_stream
&& deps_stream
!= out_stream
1265 && (ferror (deps_stream
) || fclose (deps_stream
)))
1266 fatal_error ("closing dependency file %s: %m", deps_file
);
1268 if (out_stream
&& (ferror (out_stream
) || fclose (out_stream
)))
1269 fatal_error ("when writing output to %s: %m", out_fname
);
1272 /* Either of two environment variables can specify output of
1273 dependencies. Their value is either "OUTPUT_FILE" or "OUTPUT_FILE
1274 DEPS_TARGET", where OUTPUT_FILE is the file to write deps info to
1275 and DEPS_TARGET is the target to mention in the deps. They also
1276 result in dependency information being appended to the output file
1277 rather than overwriting it, and like Sun's compiler
1278 SUNPRO_DEPENDENCIES suppresses the dependency on the main file. */
1280 check_deps_environment_vars (void)
1284 GET_ENVIRONMENT (spec
, "DEPENDENCIES_OUTPUT");
1286 cpp_opts
->deps
.style
= DEPS_USER
;
1289 GET_ENVIRONMENT (spec
, "SUNPRO_DEPENDENCIES");
1292 cpp_opts
->deps
.style
= DEPS_SYSTEM
;
1293 cpp_opts
->deps
.ignore_main_file
= true;
1299 /* Find the space before the DEPS_TARGET, if there is one. */
1300 char *s
= strchr (spec
, ' ');
1303 /* Let the caller perform MAKE quoting. */
1304 defer_opt (OPT_MT
, s
+ 1);
1308 /* Command line -MF overrides environment variables and default. */
1316 /* Handle deferred command line switches. */
1318 handle_deferred_opts (void)
1322 for (i
= 0; i
< deferred_count
; i
++)
1324 struct deferred_opt
*opt
= &deferred_opts
[i
];
1326 if (opt
->code
== OPT_MT
|| opt
->code
== OPT_MQ
)
1327 cpp_add_dependency_target (parse_in
, opt
->arg
, opt
->code
== OPT_MQ
);
1331 /* These settings are appropriate for GCC, but not necessarily so for
1332 cpplib as a library. */
1334 sanitize_cpp_opts (void)
1336 /* If we don't know what style of dependencies to output, complain
1337 if any other dependency switches have been given. */
1338 if (deps_seen
&& cpp_opts
->deps
.style
== DEPS_NONE
)
1339 error ("to generate dependencies you must specify either -M or -MM");
1341 /* -dM and dependencies suppress normal output; do it here so that
1342 the last -d[MDN] switch overrides earlier ones. */
1343 if (flag_dump_macros
== 'M')
1346 /* Disable -dD, -dN and -dI if normal output is suppressed. Allow
1347 -dM since at least glibc relies on -M -dM to work. */
1350 if (flag_dump_macros
!= 'M')
1351 flag_dump_macros
= 0;
1352 flag_dump_includes
= 0;
1355 cpp_opts
->unsigned_char
= !flag_signed_char
;
1356 cpp_opts
->stdc_0_in_system_headers
= STDC_0_IN_SYSTEM_HEADERS
;
1358 /* We want -Wno-long-long to override -pedantic -std=non-c99
1359 and/or -Wtraditional, whatever the ordering. */
1360 cpp_opts
->warn_long_long
1361 = warn_long_long
&& ((!flag_isoc99
&& pedantic
) || warn_traditional
);
1363 /* Similarly with -Wno-variadic-macros. No check for c99 here, since
1364 this also turns off warnings about GCCs extension. */
1365 cpp_opts
->warn_variadic_macros
1366 = warn_variadic_macros
&& (pedantic
|| warn_traditional
);
1368 /* If we're generating preprocessor output, emit current directory
1369 if explicitly requested or if debugging information is enabled.
1370 ??? Maybe we should only do it for debugging formats that
1371 actually output the current directory? */
1372 if (flag_working_directory
== -1)
1373 flag_working_directory
= (debug_info_level
!= DINFO_LEVEL_NONE
);
1376 /* Add include path with a prefix at the front of its name. */
1378 add_prefixed_path (const char *suffix
, size_t chain
)
1382 size_t prefix_len
, suffix_len
;
1384 suffix_len
= strlen (suffix
);
1385 prefix
= iprefix
? iprefix
: cpp_GCC_INCLUDE_DIR
;
1386 prefix_len
= iprefix
? strlen (iprefix
) : cpp_GCC_INCLUDE_DIR_len
;
1388 path
= xmalloc (prefix_len
+ suffix_len
+ 1);
1389 memcpy (path
, prefix
, prefix_len
);
1390 memcpy (path
+ prefix_len
, suffix
, suffix_len
);
1391 path
[prefix_len
+ suffix_len
] = '\0';
1393 add_path (path
, chain
, 0);
1396 /* Handle -D, -U, -A, -imacros, and the first -include. */
1398 finish_options (void)
1400 if (!cpp_opts
->preprocessed
)
1404 cpp_change_file (parse_in
, LC_RENAME
, _("<built-in>"));
1405 cpp_init_builtins (parse_in
, flag_hosted
);
1406 c_cpp_builtins (parse_in
);
1408 /* We're about to send user input to cpplib, so make it warn for
1409 things that we previously (when we sent it internal definitions)
1410 told it to not warn.
1412 C99 permits implementation-defined characters in identifiers.
1413 The documented meaning of -std= is to turn off extensions that
1414 conflict with the specified standard, and since a strictly
1415 conforming program cannot contain a '$', we do not condition
1416 their acceptance on the -std= setting. */
1417 cpp_opts
->warn_dollars
= (cpp_opts
->pedantic
&& !cpp_opts
->c99
);
1419 cpp_change_file (parse_in
, LC_RENAME
, _("<command line>"));
1420 for (i
= 0; i
< deferred_count
; i
++)
1422 struct deferred_opt
*opt
= &deferred_opts
[i
];
1424 if (opt
->code
== OPT_D
)
1425 cpp_define (parse_in
, opt
->arg
);
1426 else if (opt
->code
== OPT_U
)
1427 cpp_undef (parse_in
, opt
->arg
);
1428 else if (opt
->code
== OPT_A
)
1430 if (opt
->arg
[0] == '-')
1431 cpp_unassert (parse_in
, opt
->arg
+ 1);
1433 cpp_assert (parse_in
, opt
->arg
);
1437 /* Handle -imacros after -D and -U. */
1438 for (i
= 0; i
< deferred_count
; i
++)
1440 struct deferred_opt
*opt
= &deferred_opts
[i
];
1442 if (opt
->code
== OPT_imacros
1443 && cpp_push_include (parse_in
, opt
->arg
))
1445 /* Disable push_command_line_include callback for now. */
1446 include_cursor
= deferred_count
+ 1;
1447 cpp_scan_nooutput (parse_in
);
1453 push_command_line_include ();
1456 /* Give CPP the next file given by -include, if any. */
1458 push_command_line_include (void)
1460 while (include_cursor
< deferred_count
)
1462 struct deferred_opt
*opt
= &deferred_opts
[include_cursor
++];
1464 if (! cpp_opts
->preprocessed
&& opt
->code
== OPT_include
1465 && cpp_push_include (parse_in
, opt
->arg
))
1469 if (include_cursor
== deferred_count
)
1472 /* -Wunused-macros should only warn about macros defined hereafter. */
1473 cpp_opts
->warn_unused_macros
= warn_unused_macros
;
1474 /* Restore the line map from <command line>. */
1475 if (! cpp_opts
->preprocessed
)
1476 cpp_change_file (parse_in
, LC_RENAME
, main_input_filename
);
1478 /* Set this here so the client can change the option if it wishes,
1479 and after stacking the main file so we don't trace the main file. */
1480 line_table
.trace_includes
= cpp_opts
->print_include_names
;
1484 /* File change callback. Has to handle -include files. */
1486 cb_file_change (cpp_reader
*pfile ATTRIBUTE_UNUSED
,
1487 const struct line_map
*new_map
)
1489 if (flag_preprocess_only
)
1490 pp_file_change (new_map
);
1492 fe_file_change (new_map
);
1494 if (new_map
== 0 || (new_map
->reason
== LC_LEAVE
&& MAIN_FILE_P (new_map
)))
1495 push_command_line_include ();
1499 cb_dir_change (cpp_reader
*pfile ATTRIBUTE_UNUSED
, const char *dir
)
1501 if (! set_src_pwd (dir
))
1502 warning ("too late for # directive to set debug directory");
1505 /* Set the C 89 standard (with 1994 amendments if C94, without GNU
1506 extensions if ISO). There is no concept of gnu94. */
1508 set_std_c89 (int c94
, int iso
)
1510 cpp_set_lang (parse_in
, c94
? CLK_STDC94
: iso
? CLK_STDC89
: CLK_GNUC89
);
1513 flag_no_gnu_keywords
= iso
;
1514 flag_no_nonansi_builtin
= iso
;
1519 /* Set the C 99 standard (without GNU extensions if ISO). */
1521 set_std_c99 (int iso
)
1523 cpp_set_lang (parse_in
, iso
? CLK_STDC99
: CLK_GNUC99
);
1525 flag_no_nonansi_builtin
= iso
;
1531 /* Set the C++ 98 standard (without GNU extensions if ISO). */
1533 set_std_cxx98 (int iso
)
1535 cpp_set_lang (parse_in
, iso
? CLK_CXX98
: CLK_GNUCXX
);
1536 flag_no_gnu_keywords
= iso
;
1537 flag_no_nonansi_builtin
= iso
;
1541 /* Handle setting implicit to ON. */
1543 set_Wimplicit (int on
)
1546 warn_implicit_int
= on
;
1549 if (mesg_implicit_function_declaration
!= 2)
1550 mesg_implicit_function_declaration
= 1;
1553 mesg_implicit_function_declaration
= 0;
1556 /* Args to -d specify what to dump. Silently ignore
1557 unrecognized options; they may be aimed at toplev.c. */
1559 handle_OPT_d (const char *arg
)
1563 while ((c
= *arg
++) != '\0')
1566 case 'M': /* Dump macros only. */
1567 case 'N': /* Dump names. */
1568 case 'D': /* Dump definitions. */
1569 flag_dump_macros
= c
;
1573 flag_dump_includes
= 1;