1 /* C/ObjC/C++ command line option handling.
2 Copyright (C) 2002, 2003 Free Software Foundation, Inc.
3 Contributed by Neil Booth.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
24 #include "coretypes.h"
31 #include "langhooks.h"
32 #include "tree-inline.h"
33 #include "diagnostic.h"
35 #include "cppdefault.h"
36 #include "c-incpath.h"
37 #include "debug.h" /* For debug_hooks. */
41 #ifndef DOLLARS_IN_IDENTIFIERS
42 # define DOLLARS_IN_IDENTIFIERS true
45 #ifndef TARGET_SYSTEM_ROOT
46 # define TARGET_SYSTEM_ROOT NULL
49 static int saved_lineno
;
52 static cpp_options
*cpp_opts
;
55 static const char **in_fnames
;
56 static unsigned num_in_fnames
;
58 /* Filename and stream for preprocessed output. */
59 static const char *out_fname
;
60 static FILE *out_stream
;
62 /* Append dependencies to deps_file. */
63 static bool deps_append
;
65 /* If dependency switches (-MF etc.) have been given. */
66 static bool deps_seen
;
71 /* Dependency output file. */
72 static const char *deps_file
;
74 /* The prefix given by -iprefix, if any. */
75 static const char *iprefix
;
77 /* The system root, if any. Overridden by -isysroot. */
78 static const char *sysroot
= TARGET_SYSTEM_ROOT
;
80 /* Zero disables all standard directories for headers. */
81 static bool std_inc
= true;
83 /* Zero disables the C++-specific standard directories for headers. */
84 static bool std_cxx_inc
= true;
86 /* If the quote chain has been split by -I-. */
87 static bool quote_chain_split
;
89 /* If -Wunused-macros. */
90 static bool warn_unused_macros
;
92 /* Number of deferred options. */
93 static size_t deferred_count
;
95 /* Number of deferred options scanned for -include. */
96 static size_t include_cursor
;
98 /* Permit Fotran front-end options. */
99 static bool permit_fortran_options
;
101 static void set_Wimplicit (int);
102 static void print_help (void);
103 static void handle_OPT_d (const char *);
104 static void set_std_cxx98 (int);
105 static void set_std_c89 (int, int);
106 static void set_std_c99 (int);
107 static void check_deps_environment_vars (void);
108 static void handle_deferred_opts (void);
109 static void sanitize_cpp_opts (void);
110 static void add_prefixed_path (const char *, size_t);
111 static void push_command_line_include (void);
112 static void cb_file_change (cpp_reader
*, const struct line_map
*);
113 static void finish_options (void);
115 #ifndef STDC_0_IN_SYSTEM_HEADERS
116 #define STDC_0_IN_SYSTEM_HEADERS 0
119 /* Holds switches parsed by c_common_handle_option (), but whose
120 handling is deferred to c_common_post_options (). */
121 static void defer_opt (enum opt_code
, const char *);
122 static struct deferred_opt
128 /* Complain that switch CODE expects an argument but none was
129 provided. OPT was the command-line option. Return FALSE to get
130 the default message in opts.c, TRUE if we provide a specialized
133 c_common_missing_argument (const char *opt
, size_t code
)
138 /* Pick up the default message. */
141 case OPT_fconstant_string_class_
:
142 error ("no class name specified with \"%s\"", opt
);
146 error ("assertion missing after \"%s\"", opt
);
151 error ("macro name missing after \"%s\"", opt
);
158 error ("missing path after \"%s\"", opt
);
167 error ("missing filename after \"%s\"", opt
);
172 error ("missing makefile target after \"%s\"", opt
);
179 /* Defer option CODE with argument ARG. */
181 defer_opt (enum opt_code code
, const char *arg
)
183 deferred_opts
[deferred_count
].code
= code
;
184 deferred_opts
[deferred_count
].arg
= arg
;
188 /* Common initialization before parsing options. */
190 c_common_init_options (unsigned int argc
, const char **argv ATTRIBUTE_UNUSED
)
192 static const unsigned int lang_flags
[] = {CL_C
, CL_ObjC
, CL_CXX
, CL_ObjCXX
};
195 /* This is conditionalized only because that is the way the front
196 ends used to do it. Maybe this should be unconditional? */
197 if (c_dialect_cxx ())
199 /* By default wrap lines at 80 characters. Is getenv
200 ("COLUMNS") preferable? */
201 diagnostic_line_cutoff (global_dc
) = 80;
202 /* By default, emit location information once for every
203 diagnostic message. */
204 diagnostic_prefixing_rule (global_dc
) = DIAGNOSTICS_SHOW_PREFIX_ONCE
;
207 parse_in
= cpp_create_reader (c_dialect_cxx () ? CLK_GNUCXX
: CLK_GNUC89
,
210 cpp_opts
= cpp_get_options (parse_in
);
211 cpp_opts
->dollars_in_ident
= DOLLARS_IN_IDENTIFIERS
;
212 cpp_opts
->objc
= c_dialect_objc ();
214 /* Reset to avoid warnings on internal definitions. We set it just
215 before passing on command-line options to cpplib. */
216 cpp_opts
->warn_dollars
= 0;
218 flag_const_strings
= c_dialect_cxx ();
219 flag_exceptions
= c_dialect_cxx ();
220 warn_pointer_arith
= c_dialect_cxx ();
222 deferred_opts
= (struct deferred_opt
*)
223 xmalloc (argc
* sizeof (struct deferred_opt
));
225 result
= lang_flags
[c_language
];
227 /* If potentially preprocessing Fortran we have to accept its front
228 end options since the driver passes most of them through. */
230 if (c_language
== clk_c
&& argc
> 2
231 && !strcmp (argv
[2], "-traditional-cpp" ))
233 permit_fortran_options
= true;
241 /* Handle switch SCODE with argument ARG. ON is true, unless no-
242 form of an -f or -W option was given. Returns 0 if the switch was
243 invalid, a negative number to prevent language-independent
244 processing in toplev.c (a hack necessary for the short-term). */
246 c_common_handle_option (size_t scode
, const char *arg
, int value
)
248 const struct cl_option
*option
= &cl_options
[scode
];
249 enum opt_code code
= (enum opt_code
) scode
;
255 result
= permit_fortran_options
;
262 case OPT__output_pch_
:
267 defer_opt (code
, arg
);
271 cpp_opts
->discard_comments
= 0;
275 cpp_opts
->discard_comments
= 0;
276 cpp_opts
->discard_comments_in_macro_exp
= 0;
280 defer_opt (code
, arg
);
284 flag_preprocess_only
= 1;
288 cpp_opts
->print_include_names
= 1;
292 if (strcmp (arg
, "-"))
293 add_path (xstrdup (arg
), BRACKET
, 0);
296 if (quote_chain_split
)
297 error ("-I- specified twice");
298 quote_chain_split
= true;
299 split_quote_chain ();
305 /* When doing dependencies with -M or -MM, suppress normal
306 preprocessed output, but still do -dM etc. as software
307 depends on this. Preprocessed output does occur if -MD, -MMD
308 or environment var dependency generation is used. */
309 cpp_opts
->deps
.style
= (code
== OPT_M
? DEPS_SYSTEM
: DEPS_USER
);
311 cpp_opts
->inhibit_warnings
= 1;
316 cpp_opts
->deps
.style
= (code
== OPT_MD
? DEPS_SYSTEM
: DEPS_USER
);
327 cpp_opts
->deps
.missing_files
= true;
332 cpp_opts
->deps
.phony_targets
= true;
338 defer_opt (code
, arg
);
342 flag_no_line_commands
= 1;
346 defer_opt (code
, arg
);
356 set_Wimplicit (value
);
357 warn_char_subscripts
= value
;
358 warn_missing_braces
= value
;
359 warn_parentheses
= value
;
360 warn_return_type
= value
;
361 warn_sequence_point
= value
; /* Was C only. */
362 if (c_dialect_cxx ())
363 warn_sign_compare
= value
;
365 warn_strict_aliasing
= value
;
367 /* Only warn about unknown pragmas that are not in system
369 warn_unknown_pragmas
= value
;
371 /* We save the value of warn_uninitialized, since if they put
372 -Wuninitialized on the command line, we need to generate a
373 warning about not using it without also specifying -O. */
374 if (warn_uninitialized
!= 1)
375 warn_uninitialized
= (value
? 2 : 0);
377 if (!c_dialect_cxx ())
378 /* We set this to 2 here, but 1 in -Wmain, so -ffreestanding
379 can turn it off only if it's not explicit. */
380 warn_main
= value
* 2;
383 /* C++-specific warnings. */
384 warn_nonvdtor
= value
;
385 warn_reorder
= value
;
386 warn_nontemplate_friend
= value
;
389 cpp_opts
->warn_trigraphs
= value
;
390 cpp_opts
->warn_comments
= value
;
391 cpp_opts
->warn_num_sign_change
= value
;
392 cpp_opts
->warn_multichar
= value
; /* Was C++ only. */
395 case OPT_Wbad_function_cast
:
396 warn_bad_function_cast
= value
;
400 warn_cast_qual
= value
;
403 case OPT_Wchar_subscripts
:
404 warn_char_subscripts
= value
;
409 cpp_opts
->warn_comments
= value
;
412 case OPT_Wconversion
:
413 warn_conversion
= value
;
416 case OPT_Wctor_dtor_privacy
:
417 warn_ctor_dtor_privacy
= value
;
420 case OPT_Wdeprecated
:
421 warn_deprecated
= value
;
422 cpp_opts
->warn_deprecated
= value
;
425 case OPT_Wdiv_by_zero
:
426 warn_div_by_zero
= value
;
433 case OPT_Wendif_labels
:
434 cpp_opts
->warn_endif_labels
= value
;
438 cpp_opts
->warnings_are_errors
= value
;
441 case OPT_Werror_implicit_function_declaration
:
442 mesg_implicit_function_declaration
= 2;
445 case OPT_Wfloat_equal
:
446 warn_float_equal
= value
;
454 set_Wformat (atoi (arg
));
457 case OPT_Wformat_extra_args
:
458 warn_format_extra_args
= value
;
461 case OPT_Wformat_nonliteral
:
462 warn_format_nonliteral
= value
;
465 case OPT_Wformat_security
:
466 warn_format_security
= value
;
469 case OPT_Wformat_y2k
:
470 warn_format_y2k
= value
;
473 case OPT_Wformat_zero_length
:
474 warn_format_zero_length
= value
;
478 set_Wimplicit (value
);
481 case OPT_Wimplicit_function_declaration
:
482 mesg_implicit_function_declaration
= value
;
485 case OPT_Wimplicit_int
:
486 warn_implicit_int
= value
;
490 cpp_opts
->warn_import
= value
;
493 case OPT_Winvalid_offsetof
:
494 warn_invalid_offsetof
= value
;
497 case OPT_Winvalid_pch
:
498 cpp_opts
->warn_invalid_pch
= value
;
502 warn_long_long
= value
;
512 case OPT_Wmissing_braces
:
513 warn_missing_braces
= value
;
516 case OPT_Wmissing_declarations
:
517 warn_missing_declarations
= value
;
520 case OPT_Wmissing_format_attribute
:
521 warn_missing_format_attribute
= value
;
524 case OPT_Wmissing_prototypes
:
525 warn_missing_prototypes
= value
;
529 cpp_opts
->warn_multichar
= value
;
532 case OPT_Wnested_externs
:
533 warn_nested_externs
= value
;
536 case OPT_Wnon_template_friend
:
537 warn_nontemplate_friend
= value
;
540 case OPT_Wnon_virtual_dtor
:
541 warn_nonvdtor
= value
;
545 warn_nonnull
= value
;
548 case OPT_Wold_style_cast
:
549 warn_old_style_cast
= value
;
552 case OPT_Woverloaded_virtual
:
553 warn_overloaded_virtual
= value
;
556 case OPT_Wparentheses
:
557 warn_parentheses
= value
;
560 case OPT_Wpmf_conversions
:
561 warn_pmf2ptr
= value
;
564 case OPT_Wpointer_arith
:
565 warn_pointer_arith
= value
;
569 warn_protocol
= value
;
573 warn_selector
= value
;
576 case OPT_Wredundant_decls
:
577 warn_redundant_decls
= value
;
581 warn_reorder
= value
;
584 case OPT_Wreturn_type
:
585 warn_return_type
= value
;
588 case OPT_Wsequence_point
:
589 warn_sequence_point
= value
;
592 case OPT_Wsign_compare
:
593 warn_sign_compare
= value
;
596 case OPT_Wsign_promo
:
597 warn_sign_promo
= value
;
600 case OPT_Wstrict_prototypes
:
601 warn_strict_prototypes
= value
;
608 case OPT_Wsystem_headers
:
609 cpp_opts
->warn_system_headers
= value
;
612 case OPT_Wtraditional
:
613 warn_traditional
= value
;
614 cpp_opts
->warn_traditional
= value
;
618 cpp_opts
->warn_trigraphs
= value
;
621 case OPT_Wundeclared_selector
:
622 warn_undeclared_selector
= value
;
626 cpp_opts
->warn_undef
= value
;
629 case OPT_Wunknown_pragmas
:
630 /* Set to greater than 1, so that even unknown pragmas in
631 system headers will be warned about. */
632 warn_unknown_pragmas
= value
* 2;
635 case OPT_Wunused_macros
:
636 warn_unused_macros
= value
;
639 case OPT_Wwrite_strings
:
640 if (!c_dialect_cxx ())
641 flag_const_strings
= value
;
643 warn_write_strings
= value
;
647 if (!c_dialect_cxx ())
648 set_std_c89 (false, true);
650 set_std_cxx98 (true);
657 case OPT_fcond_mismatch
:
658 if (!c_dialect_cxx ())
660 flag_cond_mismatch
= value
;
665 case OPT_fall_virtual
:
666 case OPT_fenum_int_equiv
:
667 case OPT_fguiding_decls
:
669 case OPT_fhuge_objects
:
671 case OPT_fname_mangling_version_
:
673 case OPT_fnonnull_objects
:
675 case OPT_fstrict_prototype
:
676 case OPT_fthis_is_variable
:
677 case OPT_fvtable_thunks
:
679 warning ("switch \"%s\" is no longer supported", option
->opt_text
);
682 case OPT_fabi_version_
:
683 flag_abi_version
= value
;
686 case OPT_faccess_control
:
687 flag_access_control
= value
;
690 case OPT_falt_external_templates
:
691 flag_alt_external_templates
= value
;
693 flag_external_templates
= true;
695 warning ("switch \"%s\" is deprecated, please see documentation "
696 "for details", option
->opt_text
);
700 flag_no_asm
= !value
;
704 flag_no_builtin
= !value
;
711 disable_builtin_function (arg
);
714 case OPT_fdollars_in_identifiers
:
715 cpp_opts
->dollars_in_ident
= value
;
719 if (!dump_switch_p (arg
))
723 case OPT_ffreestanding
:
725 /* Fall through... */
728 flag_no_builtin
= !value
;
729 /* warn_main will be 2 if set by -Wall, 1 if set by -Wmain */
730 if (!value
&& warn_main
== 2)
734 case OPT_fshort_double
:
735 flag_short_double
= value
;
738 case OPT_fshort_enums
:
739 flag_short_enums
= value
;
742 case OPT_fshort_wchar
:
743 flag_short_wchar
= value
;
746 case OPT_fsigned_bitfields
:
747 flag_signed_bitfields
= value
;
748 explicit_flag_signed_bitfields
= 1;
751 case OPT_fsigned_char
:
752 flag_signed_char
= value
;
755 case OPT_funsigned_bitfields
:
756 flag_signed_bitfields
= !value
;
757 explicit_flag_signed_bitfields
= 1;
760 case OPT_funsigned_char
:
761 flag_signed_char
= !value
;
765 flag_check_new
= value
;
768 case OPT_fconserve_space
:
769 flag_conserve_space
= value
;
772 case OPT_fconst_strings
:
773 flag_const_strings
= value
;
776 case OPT_fconstant_string_class_
:
777 constant_string_class_name
= arg
;
780 case OPT_fdefault_inline
:
781 flag_default_inline
= value
;
784 case OPT_felide_constructors
:
785 flag_elide_constructors
= value
;
788 case OPT_fenforce_eh_specs
:
789 flag_enforce_eh_specs
= value
;
792 case OPT_fexternal_templates
:
793 flag_external_templates
= value
;
796 case OPT_ffixed_form
:
797 case OPT_ffixed_line_length_
:
798 /* Fortran front end options ignored when preprocessing only. */
799 if (!flag_preprocess_only
)
804 flag_new_for_scope
= value
;
807 case OPT_fgnu_keywords
:
808 flag_no_gnu_keywords
= !value
;
811 case OPT_fgnu_runtime
:
812 flag_next_runtime
= !value
;
815 case OPT_fhandle_exceptions
:
816 warning ("-fhandle-exceptions has been renamed -fexceptions (and is now on by default)");
817 flag_exceptions
= value
;
820 case OPT_fimplement_inlines
:
821 flag_implement_inlines
= value
;
824 case OPT_fimplicit_inline_templates
:
825 flag_implicit_inline_templates
= value
;
828 case OPT_fimplicit_templates
:
829 flag_implicit_templates
= value
;
832 case OPT_fms_extensions
:
833 flag_ms_extensions
= value
;
836 case OPT_fnext_runtime
:
837 flag_next_runtime
= value
;
840 case OPT_fnonansi_builtins
:
841 flag_no_nonansi_builtin
= !value
;
844 case OPT_foperator_names
:
845 cpp_opts
->operator_names
= value
;
848 case OPT_foptional_diags
:
849 flag_optional_diags
= value
;
853 cpp_opts
->restore_pch_deps
= value
;
856 case OPT_fpermissive
:
857 flag_permissive
= value
;
860 case OPT_fpreprocessed
:
861 cpp_opts
->preprocessed
= value
;
865 flag_use_repository
= value
;
867 flag_implicit_templates
= 0;
874 case OPT_fshow_column
:
875 cpp_opts
->show_column
= value
;
879 flag_detailed_statistics
= value
;
883 /* It is documented that we silently ignore silly values. */
884 if (value
>= 1 && value
<= 100)
885 cpp_opts
->tabstop
= value
;
888 case OPT_fexec_charset_
:
889 cpp_opts
->narrow_charset
= arg
;
892 case OPT_fwide_exec_charset_
:
893 cpp_opts
->wide_charset
= arg
;
896 case OPT_ftemplate_depth_
:
897 max_tinst_depth
= value
;
901 flag_vtable_gc
= value
;
904 case OPT_fuse_cxa_atexit
:
905 flag_use_cxa_atexit
= value
;
913 flag_gen_declaration
= 1;
917 add_path (xstrdup (arg
), AFTER
, 0);
922 defer_opt (code
, arg
);
934 add_path (xstrdup (arg
), SYSTEM
, 0);
937 case OPT_iwithprefix
:
938 add_prefixed_path (arg
, SYSTEM
);
941 case OPT_iwithprefixbefore
:
942 add_prefixed_path (arg
, BRACKET
);
946 cpp_set_lang (parse_in
, CLK_ASM
);
947 cpp_opts
->dollars_in_ident
= false;
966 error ("output filename specified twice");
969 /* We need to handle the -pedantic switches here, rather than in
970 c_common_post_options, so that a subsequent -Wno-endif-labels
971 is not overridden. */
972 case OPT_pedantic_errors
:
973 cpp_opts
->pedantic_errors
= 1;
976 cpp_opts
->pedantic
= 1;
977 cpp_opts
->warn_endif_labels
= 1;
980 case OPT_print_objc_runtime_info
:
981 print_struct_values
= 1;
989 case OPT_std_gnu__98
:
990 set_std_cxx98 (code
== OPT_std_c__98
/* ISO */);
994 case OPT_std_iso9899_1990
:
995 case OPT_std_iso9899_199409
:
996 set_std_c89 (code
== OPT_std_iso9899_199409
/* c94 */, true /* ISO */);
1000 set_std_c89 (false /* c94 */, false /* ISO */);
1005 case OPT_std_iso9899_1999
:
1006 case OPT_std_iso9899_199x
:
1007 set_std_c99 (true /* ISO */);
1012 set_std_c99 (false /* ISO */);
1016 cpp_opts
->trigraphs
= 1;
1019 case OPT_traditional_cpp
:
1020 cpp_opts
->traditional
= 1;
1028 cpp_opts
->inhibit_warnings
= 1;
1039 /* Handle FILENAME from the command line. */
1041 c_common_handle_filename (const char *filename
)
1044 in_fnames
= xrealloc (in_fnames
, num_in_fnames
* sizeof (in_fnames
[0]));
1045 in_fnames
[num_in_fnames
- 1] = filename
;
1048 /* Post-switch processing. */
1050 c_common_post_options (const char **pfilename
)
1052 /* Canonicalize the input and output filenames. */
1053 if (in_fnames
== NULL
)
1055 in_fnames
= xmalloc (sizeof (in_fnames
[0]));
1058 else if (strcmp (in_fnames
[0], "-") == 0)
1061 if (out_fname
== NULL
|| !strcmp (out_fname
, "-"))
1064 if (cpp_opts
->deps
.style
== DEPS_NONE
)
1065 check_deps_environment_vars ();
1067 handle_deferred_opts ();
1069 sanitize_cpp_opts ();
1071 register_include_chains (parse_in
, sysroot
, iprefix
,
1072 std_inc
, std_cxx_inc
&& c_dialect_cxx (), verbose
);
1074 flag_inline_trees
= 1;
1076 /* Use tree inlining if possible. Function instrumentation is only
1077 done in the RTL level, so we disable tree inlining. */
1078 if (! flag_instrument_function_entry_exit
)
1080 if (!flag_no_inline
)
1082 if (flag_inline_functions
)
1084 flag_inline_trees
= 2;
1085 flag_inline_functions
= 0;
1089 /* -Wextra implies -Wsign-compare, but not if explicitly
1091 if (warn_sign_compare
== -1)
1092 warn_sign_compare
= extra_warnings
;
1094 /* Special format checking options don't work without -Wformat; warn if
1096 if (warn_format_y2k
&& !warn_format
)
1097 warning ("-Wformat-y2k ignored without -Wformat");
1098 if (warn_format_extra_args
&& !warn_format
)
1099 warning ("-Wformat-extra-args ignored without -Wformat");
1100 if (warn_format_zero_length
&& !warn_format
)
1101 warning ("-Wformat-zero-length ignored without -Wformat");
1102 if (warn_format_nonliteral
&& !warn_format
)
1103 warning ("-Wformat-nonliteral ignored without -Wformat");
1104 if (warn_format_security
&& !warn_format
)
1105 warning ("-Wformat-security ignored without -Wformat");
1106 if (warn_missing_format_attribute
&& !warn_format
)
1107 warning ("-Wmissing-format-attribute ignored without -Wformat");
1109 if (flag_preprocess_only
)
1111 /* Open the output now. We must do so even if flag_no_output is
1112 on, because there may be other output than from the actual
1113 preprocessing (e.g. from -dM). */
1114 if (out_fname
[0] == '\0')
1115 out_stream
= stdout
;
1117 out_stream
= fopen (out_fname
, "w");
1119 if (out_stream
== NULL
)
1121 fatal_error ("opening output file %s: %m", out_fname
);
1125 if (num_in_fnames
> 1)
1126 error ("too many filenames given. Type %s --help for usage",
1129 init_pp_output (out_stream
);
1135 /* Yuk. WTF is this? I do know ObjC relies on it somewhere. */
1139 cpp_get_callbacks (parse_in
)->file_change
= cb_file_change
;
1141 /* NOTE: we use in_fname here, not the one supplied. */
1142 *pfilename
= cpp_read_main_file (parse_in
, in_fnames
[0]);
1144 saved_lineno
= input_line
;
1147 /* If an error has occurred in cpplib, note it so we fail
1149 errorcount
+= cpp_errors (parse_in
);
1151 return flag_preprocess_only
;
1154 /* Front end initialization common to C, ObjC and C++. */
1156 c_common_init (void)
1158 input_line
= saved_lineno
;
1160 /* Set up preprocessor arithmetic. Must be done after call to
1161 c_common_nodes_and_builtins for type nodes to be good. */
1162 cpp_opts
->precision
= TYPE_PRECISION (intmax_type_node
);
1163 cpp_opts
->char_precision
= TYPE_PRECISION (char_type_node
);
1164 cpp_opts
->int_precision
= TYPE_PRECISION (integer_type_node
);
1165 cpp_opts
->wchar_precision
= TYPE_PRECISION (wchar_type_node
);
1166 cpp_opts
->unsigned_wchar
= TREE_UNSIGNED (wchar_type_node
);
1167 cpp_opts
->bytes_big_endian
= BYTES_BIG_ENDIAN
;
1169 /* This can't happen until after wchar_precision and bytes_big_endian
1171 cpp_init_iconv (parse_in
);
1173 if (flag_preprocess_only
)
1176 preprocess_file (parse_in
);
1180 /* Has to wait until now so that cpplib has its hash table. */
1186 /* Initialize the integrated preprocessor after debug output has been
1187 initialized; loop over each input file. */
1189 c_common_parse_file (int set_yydebug ATTRIBUTE_UNUSED
)
1191 unsigned file_index
;
1194 yydebug
= set_yydebug
;
1196 warning ("YYDEBUG not defined");
1205 /* Reset the state of the parser. */
1208 /* Reset cpplib's macros and start a new file. */
1209 cpp_undef_all (parse_in
);
1210 cpp_read_next_file (parse_in
, in_fnames
[file_index
]);
1214 if (file_index
== 0)
1219 } while (file_index
< num_in_fnames
);
1221 free_parser_stacks ();
1225 /* Common finish hook for the C, ObjC and C++ front ends. */
1227 c_common_finish (void)
1229 FILE *deps_stream
= NULL
;
1231 if (cpp_opts
->deps
.style
!= DEPS_NONE
)
1233 /* If -M or -MM was seen without -MF, default output to the
1236 deps_stream
= out_stream
;
1239 deps_stream
= fopen (deps_file
, deps_append
? "a": "w");
1241 fatal_error ("opening dependency file %s: %m", deps_file
);
1245 /* For performance, avoid tearing down cpplib's internal structures
1246 with cpp_destroy (). */
1247 errorcount
+= cpp_finish (parse_in
, deps_stream
);
1249 if (deps_stream
&& deps_stream
!= out_stream
1250 && (ferror (deps_stream
) || fclose (deps_stream
)))
1251 fatal_error ("closing dependency file %s: %m", deps_file
);
1253 if (out_stream
&& (ferror (out_stream
) || fclose (out_stream
)))
1254 fatal_error ("when writing output to %s: %m", out_fname
);
1257 /* Either of two environment variables can specify output of
1258 dependencies. Their value is either "OUTPUT_FILE" or "OUTPUT_FILE
1259 DEPS_TARGET", where OUTPUT_FILE is the file to write deps info to
1260 and DEPS_TARGET is the target to mention in the deps. They also
1261 result in dependency information being appended to the output file
1262 rather than overwriting it, and like Sun's compiler
1263 SUNPRO_DEPENDENCIES suppresses the dependency on the main file. */
1265 check_deps_environment_vars (void)
1269 GET_ENVIRONMENT (spec
, "DEPENDENCIES_OUTPUT");
1271 cpp_opts
->deps
.style
= DEPS_USER
;
1274 GET_ENVIRONMENT (spec
, "SUNPRO_DEPENDENCIES");
1277 cpp_opts
->deps
.style
= DEPS_SYSTEM
;
1278 cpp_opts
->deps
.ignore_main_file
= true;
1284 /* Find the space before the DEPS_TARGET, if there is one. */
1285 char *s
= strchr (spec
, ' ');
1288 /* Let the caller perform MAKE quoting. */
1289 defer_opt (OPT_MT
, s
+ 1);
1293 /* Command line -MF overrides environment variables and default. */
1301 /* Handle deferred command line switches. */
1303 handle_deferred_opts (void)
1307 for (i
= 0; i
< deferred_count
; i
++)
1309 struct deferred_opt
*opt
= &deferred_opts
[i
];
1311 if (opt
->code
== OPT_MT
|| opt
->code
== OPT_MQ
)
1312 cpp_add_dependency_target (parse_in
, opt
->arg
, opt
->code
== OPT_MQ
);
1316 /* These settings are appropriate for GCC, but not necessarily so for
1317 cpplib as a library. */
1319 sanitize_cpp_opts (void)
1321 /* If we don't know what style of dependencies to output, complain
1322 if any other dependency switches have been given. */
1323 if (deps_seen
&& cpp_opts
->deps
.style
== DEPS_NONE
)
1324 error ("to generate dependencies you must specify either -M or -MM");
1326 /* -dM and dependencies suppress normal output; do it here so that
1327 the last -d[MDN] switch overrides earlier ones. */
1328 if (flag_dump_macros
== 'M')
1331 /* Disable -dD, -dN and -dI if normal output is suppressed. Allow
1332 -dM since at least glibc relies on -M -dM to work. */
1335 if (flag_dump_macros
!= 'M')
1336 flag_dump_macros
= 0;
1337 flag_dump_includes
= 0;
1340 cpp_opts
->unsigned_char
= !flag_signed_char
;
1341 cpp_opts
->stdc_0_in_system_headers
= STDC_0_IN_SYSTEM_HEADERS
;
1343 /* We want -Wno-long-long to override -pedantic -std=non-c99
1344 and/or -Wtraditional, whatever the ordering. */
1345 cpp_opts
->warn_long_long
1346 = warn_long_long
&& ((!flag_isoc99
&& pedantic
) || warn_traditional
);
1349 /* Add include path with a prefix at the front of its name. */
1351 add_prefixed_path (const char *suffix
, size_t chain
)
1355 size_t prefix_len
, suffix_len
;
1357 suffix_len
= strlen (suffix
);
1358 prefix
= iprefix
? iprefix
: cpp_GCC_INCLUDE_DIR
;
1359 prefix_len
= iprefix
? strlen (iprefix
) : cpp_GCC_INCLUDE_DIR_len
;
1361 path
= xmalloc (prefix_len
+ suffix_len
+ 1);
1362 memcpy (path
, prefix
, prefix_len
);
1363 memcpy (path
+ prefix_len
, suffix
, suffix_len
);
1364 path
[prefix_len
+ suffix_len
] = '\0';
1366 add_path (path
, chain
, 0);
1369 /* Handle -D, -U, -A, -imacros, and the first -include. */
1371 finish_options (void)
1373 if (!cpp_opts
->preprocessed
)
1377 cpp_change_file (parse_in
, LC_RENAME
, _("<built-in>"));
1378 cpp_init_builtins (parse_in
, flag_hosted
);
1379 c_cpp_builtins (parse_in
);
1381 /* We're about to send user input to cpplib, so make it warn for
1382 things that we previously (when we sent it internal definitions)
1383 told it to not warn.
1385 C99 permits implementation-defined characters in identifiers.
1386 The documented meaning of -std= is to turn off extensions that
1387 conflict with the specified standard, and since a strictly
1388 conforming program cannot contain a '$', we do not condition
1389 their acceptance on the -std= setting. */
1390 cpp_opts
->warn_dollars
= (cpp_opts
->pedantic
&& !cpp_opts
->c99
);
1392 cpp_change_file (parse_in
, LC_RENAME
, _("<command line>"));
1393 for (i
= 0; i
< deferred_count
; i
++)
1395 struct deferred_opt
*opt
= &deferred_opts
[i
];
1397 if (opt
->code
== OPT_D
)
1398 cpp_define (parse_in
, opt
->arg
);
1399 else if (opt
->code
== OPT_U
)
1400 cpp_undef (parse_in
, opt
->arg
);
1401 else if (opt
->code
== OPT_A
)
1403 if (opt
->arg
[0] == '-')
1404 cpp_unassert (parse_in
, opt
->arg
+ 1);
1406 cpp_assert (parse_in
, opt
->arg
);
1410 /* Handle -imacros after -D and -U. */
1411 for (i
= 0; i
< deferred_count
; i
++)
1413 struct deferred_opt
*opt
= &deferred_opts
[i
];
1415 if (opt
->code
== OPT_imacros
1416 && cpp_push_include (parse_in
, opt
->arg
))
1417 cpp_scan_nooutput (parse_in
);
1421 push_command_line_include ();
1424 /* Give CPP the next file given by -include, if any. */
1426 push_command_line_include (void)
1428 if (cpp_opts
->preprocessed
)
1431 while (include_cursor
< deferred_count
)
1433 struct deferred_opt
*opt
= &deferred_opts
[include_cursor
++];
1435 if (opt
->code
== OPT_include
&& cpp_push_include (parse_in
, opt
->arg
))
1439 if (include_cursor
== deferred_count
)
1441 free (deferred_opts
);
1442 /* Restore the line map from <command line>. */
1443 cpp_change_file (parse_in
, LC_RENAME
, main_input_filename
);
1444 /* -Wunused-macros should only warn about macros defined hereafter. */
1445 cpp_opts
->warn_unused_macros
= warn_unused_macros
;
1450 /* File change callback. Has to handle -include files. */
1452 cb_file_change (cpp_reader
*pfile ATTRIBUTE_UNUSED
,
1453 const struct line_map
*new_map
)
1455 if (flag_preprocess_only
)
1456 pp_file_change (new_map
);
1458 fe_file_change (new_map
);
1460 if (new_map
->reason
== LC_LEAVE
&& MAIN_FILE_P (new_map
))
1461 push_command_line_include ();
1464 /* Set the C 89 standard (with 1994 amendments if C94, without GNU
1465 extensions if ISO). There is no concept of gnu94. */
1467 set_std_c89 (int c94
, int iso
)
1469 cpp_set_lang (parse_in
, c94
? CLK_STDC94
: iso
? CLK_STDC89
: CLK_GNUC89
);
1472 flag_no_gnu_keywords
= iso
;
1473 flag_no_nonansi_builtin
= iso
;
1474 flag_noniso_default_format_attributes
= !iso
;
1477 flag_writable_strings
= 0;
1480 /* Set the C 99 standard (without GNU extensions if ISO). */
1482 set_std_c99 (int iso
)
1484 cpp_set_lang (parse_in
, iso
? CLK_STDC99
: CLK_GNUC99
);
1486 flag_no_nonansi_builtin
= iso
;
1487 flag_noniso_default_format_attributes
= !iso
;
1491 flag_writable_strings
= 0;
1494 /* Set the C++ 98 standard (without GNU extensions if ISO). */
1496 set_std_cxx98 (int iso
)
1498 cpp_set_lang (parse_in
, iso
? CLK_CXX98
: CLK_GNUCXX
);
1499 flag_no_gnu_keywords
= iso
;
1500 flag_no_nonansi_builtin
= iso
;
1501 flag_noniso_default_format_attributes
= !iso
;
1505 /* Handle setting implicit to ON. */
1507 set_Wimplicit (int on
)
1510 warn_implicit_int
= on
;
1513 if (mesg_implicit_function_declaration
!= 2)
1514 mesg_implicit_function_declaration
= 1;
1517 mesg_implicit_function_declaration
= 0;
1520 /* Args to -d specify what to dump. Silently ignore
1521 unrecognized options; they may be aimed at toplev.c. */
1523 handle_OPT_d (const char *arg
)
1527 while ((c
= *arg
++) != '\0')
1530 case 'M': /* Dump macros only. */
1531 case 'N': /* Dump names. */
1532 case 'D': /* Dump definitions. */
1533 flag_dump_macros
= c
;
1537 flag_dump_includes
= 1;
1542 /* Handle --help output. */
1546 /* To keep the lines from getting too long for some compilers, limit
1547 to about 500 characters (6 lines) per chunk. */
1550 -include <file> Include the contents of <file> before other files\n\
1551 -imacros <file> Accept definition of macros in <file>\n\
1552 -iprefix <path> Specify <path> as a prefix for next two options\n\
1553 -iwithprefix <dir> Add <dir> to the end of the system include path\n\
1554 -iwithprefixbefore <dir> Add <dir> to the end of the main include path\n\
1555 -isystem <dir> Add <dir> to the start of the system include path\n\
1558 -idirafter <dir> Add <dir> to the end of the system include path\n\
1559 -I <dir> Add <dir> to the end of the main include path\n\
1560 -I- Fine-grained include path control; see info docs\n\
1561 -nostdinc Do not search system include directories\n\
1562 (dirs specified with -isystem will still be used)\n\
1563 -nostdinc++ Do not search system include directories for C++\n\
1564 -o <file> Put output into <file>\n\
1567 -trigraphs Support ISO C trigraphs\n\
1568 -std=<std name> Specify the conformance standard; one of:\n\
1569 gnu89, gnu99, c89, c99, iso9899:1990,\n\
1570 iso9899:199409, iso9899:1999, c++98\n\
1571 -w Inhibit warning messages\n\
1572 -W[no-]trigraphs Warn if trigraphs are encountered\n\
1573 -W[no-]comment{s} Warn if one comment starts inside another\n\
1576 -W[no-]traditional Warn about features not present in traditional C\n\
1577 -W[no-]undef Warn if an undefined macro is used by #if\n\
1578 -W[no-]import Warn about the use of the #import directive\n\
1581 -W[no-]error Treat all warnings as errors\n\
1582 -W[no-]system-headers Do not suppress warnings from system headers\n\
1583 -W[no-]all Enable most preprocessor warnings\n\
1586 -M Generate make dependencies\n\
1587 -MM As -M, but ignore system header files\n\
1588 -MD Generate make dependencies and compile\n\
1589 -MMD As -MD, but ignore system header files\n\
1590 -MF <file> Write dependency output to the given file\n\
1591 -MG Treat missing header file as generated files\n\
1594 -MP Generate phony targets for all headers\n\
1595 -MQ <target> Add a MAKE-quoted target\n\
1596 -MT <target> Add an unquoted target\n\
1599 -D<macro> Define a <macro> with string '1' as its value\n\
1600 -D<macro>=<val> Define a <macro> with <val> as its value\n\
1601 -A<question>=<answer> Assert the <answer> to <question>\n\
1602 -A-<question>=<answer> Disable the <answer> to <question>\n\
1603 -U<macro> Undefine <macro> \n\
1604 -v Display the version number\n\
1607 -H Print the name of header files as they are used\n\
1608 -C Do not discard comments\n\
1609 -dM Display a list of macro definitions active at end\n\
1610 -dD Preserve macro definitions in output\n\
1611 -dN As -dD except that only the names are preserved\n\
1612 -dI Include #include directives in the output\n\
1615 -f[no-]preprocessed Treat the input file as already preprocessed\n\
1616 -ftabstop=<number> Distance between tab stops for column reporting\n\
1617 -ftarget-charset=<c> Convert all strings and character constants\n\
1618 to character set <c>\n\
1619 -ftarget-wide-charset=<c> Convert all wide strings and character constants\n\
1620 to character set <c>\n\
1623 -isysroot <dir> Set <dir> to be the system root directory\n\
1624 -P Do not generate #line directives\n\
1625 -remap Remap file names when including files\n\
1626 --help Display this information\n\