1 /* C/ObjC/C++ command line option handling.
2 Copyright (C) 2002 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
29 #include "langhooks.h"
30 #include "tree-inline.h"
31 #include "diagnostic.h"
35 static cpp_options *cpp_opts;
38 static const char *in_fname;
40 /* Filename and stream for preprocessed output. */
41 static const char *out_fname;
42 static FILE *out_stream;
44 /* Append dependencies to deps_file. */
45 static bool deps_append;
47 /* If dependency switches (-MF etc.) have been given. */
48 static bool deps_seen;
50 /* Dependency output file. */
51 static const char *deps_file;
53 /* Number of deferred options, deferred options array size. */
54 static size_t deferred_count, deferred_size;
56 static void missing_arg PARAMS ((size_t));
57 static size_t find_opt PARAMS ((const char *, int));
58 static void set_Wimplicit PARAMS ((int));
59 static void complain_wrong_lang PARAMS ((size_t));
60 static void write_langs PARAMS ((char *, int));
61 static void print_help PARAMS ((void));
62 static void handle_OPT_d PARAMS ((const char *));
63 static void set_std_cxx98 PARAMS ((int));
64 static void set_std_c89 PARAMS ((int, int));
65 static void set_std_c99 PARAMS ((int));
66 static void check_deps_environment_vars PARAMS ((void));
67 static void preprocess_file PARAMS ((void));
68 static void handle_deferred_opts PARAMS ((void));
69 static void sanitize_cpp_opts PARAMS ((void));
71 #ifndef STDC_0_IN_SYSTEM_HEADERS
72 #define STDC_0_IN_SYSTEM_HEADERS 0
75 #define CL_C_ONLY (1 << 0) /* Only C. */
76 #define CL_OBJC_ONLY (1 << 1) /* Only ObjC. */
77 #define CL_CXX_ONLY (1 << 2) /* Only C++. */
78 #define CL_OBJCXX_ONLY (1 << 3) /* Only ObjC++. */
79 #define CL_JOINED (1 << 4) /* If takes joined argument. */
80 #define CL_SEPARATE (1 << 5) /* If takes a separate argument. */
82 #define CL_ARG (CL_JOINED | CL_SEPARATE)
83 #define CL_C (CL_C_ONLY | CL_OBJC_ONLY)
84 #define CL_OBJC (CL_OBJC_ONLY | CL_OBJCXX_ONLY)
85 #define CL_CXX (CL_CXX_ONLY | CL_OBJCXX_ONLY)
86 #define CL_ALL (CL_C | CL_CXX)
88 /* This is the list of all command line options, with the leading "-"
89 removed. It must be sorted in ASCII collating order. All options
90 beginning with "f" or "W" are implicitly assumed to take a "no-"
91 form; this form should not be listed. The variable "on" is true if
92 the positive form is given, otherwise it is false. If you don't
93 want to allow a "no-" form, your handler should reject "on" being
94 false by returning zero. See, for example, the handling of
97 If the user gives an option to a front end that doesn't support it,
98 an error is output, mentioning which front ends the option is valid
99 for. If you don't want this, you must accept it for all front
100 ends, and test for the front end in the option handler. See, for
101 example, the handling of -Wno-strict-prototypes for C++.
103 If you request an argument with CL_JOINED, CL_SEPARATE or their
104 combination CL_ARG, it is stored in the variable "arg", which is
105 guaranteed to be non-NULL and to not be an empty string. It points
106 to the argument either within the argv[] vector or within one of
107 that vector's strings, and so the text is permanent and copies need
108 not be made. Be sure to add an error message in missing_arg() if
109 the default is not appropriate. */
111 #define COMMAND_LINE_OPTIONS \
112 OPT("-help", CL_ALL, OPT__help) \
113 OPT("C", CL_ALL, OPT_C) \
114 OPT("CC", CL_ALL, OPT_CC) \
115 OPT("E", CL_ALL, OPT_E) \
116 OPT("H", CL_ALL, OPT_H) \
117 OPT("M", CL_ALL, OPT_M) \
118 OPT("MD", CL_ALL | CL_SEPARATE, OPT_MD) \
119 OPT("MF", CL_ALL | CL_ARG, OPT_MF) \
120 OPT("MG", CL_ALL, OPT_MG) \
121 OPT("MM", CL_ALL, OPT_MM) \
122 OPT("MMD", CL_ALL | CL_SEPARATE, OPT_MMD) \
123 OPT("MP", CL_ALL, OPT_MP) \
124 OPT("MQ", CL_ALL | CL_ARG, OPT_MQ) \
125 OPT("MT", CL_ALL | CL_ARG, OPT_MT) \
126 OPT("P", CL_ALL, OPT_P) \
127 OPT("Wall", CL_ALL, OPT_Wall) \
128 OPT("Wbad-function-cast", CL_C, OPT_Wbad_function_cast) \
129 OPT("Wcast-qual", CL_ALL, OPT_Wcast_qual) \
130 OPT("Wchar-subscripts", CL_ALL, OPT_Wchar_subscripts) \
131 OPT("Wcomment", CL_ALL, OPT_Wcomment) \
132 OPT("Wcomments", CL_ALL, OPT_Wcomments) \
133 OPT("Wconversion", CL_ALL, OPT_Wconversion) \
134 OPT("Wctor-dtor-privacy", CL_CXX, OPT_Wctor_dtor_privacy) \
135 OPT("Wdeprecated", CL_CXX, OPT_Wdeprecated) \
136 OPT("Wdiv-by-zero", CL_C, OPT_Wdiv_by_zero) \
137 OPT("Weffc++", CL_CXX, OPT_Weffcxx) \
138 OPT("Wendif-labels", CL_ALL, OPT_Wendif_labels) \
139 OPT("Werror", CL_ALL, OPT_Werror) \
140 OPT("Werror-implicit-function-declaration", \
141 CL_C, OPT_Werror_implicit_function_decl) \
142 OPT("Wfloat-equal", CL_ALL, OPT_Wfloat_equal) \
143 OPT("Wformat", CL_ALL, OPT_Wformat) \
144 OPT("Wformat-extra-args", CL_ALL, OPT_Wformat_extra_args) \
145 OPT("Wformat-nonliteral", CL_ALL, OPT_Wformat_nonliteral) \
146 OPT("Wformat-security", CL_ALL, OPT_Wformat_security) \
147 OPT("Wformat-y2k", CL_ALL, OPT_Wformat_y2k) \
148 OPT("Wformat-zero-length", CL_C, OPT_Wformat_zero_length) \
149 OPT("Wformat=", CL_ALL | CL_JOINED, OPT_Wformat_eq) \
150 OPT("Wimplicit", CL_CXX, OPT_Wimplicit) \
151 OPT("Wimplicit-function-declaration", CL_C, OPT_Wimplicit_function_decl) \
152 OPT("Wimplicit-int", CL_C, OPT_Wimplicit_int) \
153 OPT("Wimport", CL_ALL, OPT_Wimport) \
154 OPT("Wlong-long", CL_ALL, OPT_Wlong_long) \
155 OPT("Wmain", CL_C, OPT_Wmain) \
156 OPT("Wmissing-braces", CL_ALL, OPT_Wmissing_braces) \
157 OPT("Wmissing-declarations", CL_C, OPT_Wmissing_declarations) \
158 OPT("Wmissing-format-attribute",CL_ALL, OPT_Wmissing_format_attribute) \
159 OPT("Wmissing-prototypes", CL_ALL, OPT_Wmissing_prototypes) \
160 OPT("Wmultichar", CL_ALL, OPT_Wmultichar) \
161 OPT("Wnested-externs", CL_C, OPT_Wnested_externs) \
162 OPT("Wnon-template-friend", CL_CXX, OPT_Wnon_template_friend) \
163 OPT("Wnon-virtual-dtor", CL_CXX, OPT_Wnon_virtual_dtor) \
164 OPT("Wnonnull", CL_C, OPT_Wnonnull) \
165 OPT("Wold-style-cast", CL_CXX, OPT_Wold_style_cast) \
166 OPT("Woverloaded-virtual", CL_CXX, OPT_Woverloaded_virtual) \
167 OPT("Wparentheses", CL_ALL, OPT_Wparentheses) \
168 OPT("Wpmf-conversions", CL_CXX, OPT_Wpmf_conversions) \
169 OPT("Wpointer-arith", CL_ALL, OPT_Wpointer_arith) \
170 OPT("Wprotocol", CL_OBJC, OPT_Wprotocol) \
171 OPT("Wredundant-decls", CL_ALL, OPT_Wredundant_decls) \
172 OPT("Wreorder", CL_CXX, OPT_Wreorder) \
173 OPT("Wreturn-type", CL_ALL, OPT_Wreturn_type) \
174 OPT("Wselector", CL_OBJC, OPT_Wselector) \
175 OPT("Wsequence-point", CL_C, OPT_Wsequence_point) \
176 OPT("Wsign-compare", CL_ALL, OPT_Wsign_compare) \
177 OPT("Wsign-promo", CL_CXX, OPT_Wsign_promo) \
178 OPT("Wstrict-prototypes", CL_ALL, OPT_Wstrict_prototypes) \
179 OPT("Wsynth", CL_CXX, OPT_Wsynth) \
180 OPT("Wsystem-headers", CL_ALL, OPT_Wsystem_headers) \
181 OPT("Wtraditional", CL_C, OPT_Wtraditional) \
182 OPT("Wtrigraphs", CL_ALL, OPT_Wtrigraphs) \
183 OPT("Wundef", CL_ALL, OPT_Wundef) \
184 OPT("Wunknown-pragmas", CL_ALL, OPT_Wunknown_pragmas) \
185 OPT("Wunused-macros", CL_ALL, OPT_Wunused_macros) \
186 OPT("Wwrite-strings", CL_ALL, OPT_Wwrite_strings) \
187 OPT("ansi", CL_ALL, OPT_ansi) \
188 OPT("d", CL_ALL | CL_JOINED, OPT_d) \
189 OPT("faccess-control", CL_CXX, OPT_faccess_control) \
190 OPT("fall-virtual", CL_CXX, OPT_fall_virtual) \
191 OPT("falt-external-templates",CL_CXX, OPT_falt_external_templates) \
192 OPT("fasm", CL_ALL, OPT_fasm) \
193 OPT("fbuiltin", CL_ALL, OPT_fbuiltin) \
194 OPT("fbuiltin-", CL_ALL | CL_JOINED, OPT_fbuiltin_) \
195 OPT("fcheck-new", CL_CXX, OPT_fcheck_new) \
196 OPT("fcond-mismatch", CL_ALL, OPT_fcond_mismatch) \
197 OPT("fconserve-space", CL_CXX, OPT_fconserve_space) \
198 OPT("fconst-strings", CL_CXX, OPT_fconst_strings) \
199 OPT("fconstant-string-class=", CL_OBJC | CL_JOINED, \
200 OPT_fconstant_string_class) \
201 OPT("fdefault-inline", CL_CXX, OPT_fdefault_inline) \
202 OPT("fdollars-in-identifiers",CL_ALL, OPT_fdollars_in_identifiers) \
203 OPT("fdump-", CL_ALL | CL_JOINED, OPT_fdump) \
204 OPT("felide-constructors", CL_CXX, OPT_felide_constructors) \
205 OPT("fenforce-eh-specs", CL_CXX, OPT_fenforce_eh_specs) \
206 OPT("fenum-int-equiv", CL_CXX, OPT_fenum_int_equiv) \
207 OPT("fexternal-templates", CL_CXX, OPT_fexternal_templates) \
208 OPT("ffor-scope", CL_CXX, OPT_ffor_scope) \
209 OPT("ffreestanding", CL_C, OPT_ffreestanding) \
210 OPT("fgnu-keywords", CL_CXX, OPT_fgnu_keywords) \
211 OPT("fgnu-runtime", CL_OBJC, OPT_fgnu_runtime) \
212 OPT("fguiding-decls", CL_CXX, OPT_fguiding_decls) \
213 OPT("fhandle-exceptions", CL_CXX, OPT_fhandle_exceptions) \
214 OPT("fhonor-std", CL_CXX, OPT_fhonor_std) \
215 OPT("fhosted", CL_C, OPT_fhosted) \
216 OPT("fhuge-objects", CL_CXX, OPT_fhuge_objects) \
217 OPT("fimplement-inlines", CL_CXX, OPT_fimplement_inlines) \
218 OPT("fimplicit-inline-templates", CL_CXX, OPT_fimplicit_inline_templates) \
219 OPT("fimplicit-templates", CL_CXX, OPT_fimplicit_templates) \
220 OPT("flabels-ok", CL_CXX, OPT_flabels_ok) \
221 OPT("fms-extensions", CL_ALL, OPT_fms_extensions) \
222 OPT("fname-mangling-version-",CL_CXX | CL_JOINED, OPT_fname_mangling) \
223 OPT("fnew-abi", CL_CXX, OPT_fnew_abi) \
224 OPT("fnext-runtime", CL_OBJC, OPT_fnext_runtime) \
225 OPT("fnonansi-builtins", CL_CXX, OPT_fnonansi_builtins) \
226 OPT("fnonnull-objects", CL_CXX, OPT_fnonnull_objects) \
227 OPT("foperator-names", CL_CXX, OPT_foperator_names) \
228 OPT("foptional-diags", CL_CXX, OPT_foptional_diags) \
229 OPT("fpermissive", CL_CXX, OPT_fpermissive) \
230 OPT("fpreprocessed", CL_ALL, OPT_fpreprocessed) \
231 OPT("frepo", CL_CXX, OPT_frepo) \
232 OPT("frtti", CL_CXX, OPT_frtti) \
233 OPT("fshort-double", CL_ALL, OPT_fshort_double) \
234 OPT("fshort-enums", CL_ALL, OPT_fshort_enums) \
235 OPT("fshort-wchar", CL_ALL, OPT_fshort_wchar) \
236 OPT("fshow-column", CL_ALL, OPT_fshow_column) \
237 OPT("fsigned-bitfields", CL_ALL, OPT_fsigned_bitfields) \
238 OPT("fsigned-char", CL_ALL, OPT_fsigned_char) \
239 OPT("fsquangle", CL_CXX, OPT_fsquangle) \
240 OPT("fstats", CL_CXX, OPT_fstats) \
241 OPT("fstrict-prototype", CL_CXX, OPT_fstrict_prototype) \
242 OPT("ftabstop=", CL_ALL | CL_JOINED, OPT_ftabstop) \
243 OPT("ftemplate-depth-", CL_CXX | CL_JOINED, OPT_ftemplate_depth) \
244 OPT("fthis-is-variable", CL_CXX, OPT_fthis_is_variable) \
245 OPT("funsigned-bitfields", CL_ALL, OPT_funsigned_bitfields) \
246 OPT("funsigned-char", CL_ALL, OPT_funsigned_char) \
247 OPT("fuse-cxa-atexit", CL_CXX, OPT_fuse_cxa_atexit) \
248 OPT("fvtable-gc", CL_CXX, OPT_fvtable_gc) \
249 OPT("fvtable-thunks", CL_CXX, OPT_fvtable_thunks) \
250 OPT("fweak", CL_CXX, OPT_fweak) \
251 OPT("fxref", CL_CXX, OPT_fxref) \
252 OPT("gen-decls", CL_OBJC, OPT_gen_decls) \
253 OPT("lang-asm", CL_C_ONLY, OPT_lang_asm) \
254 OPT("lang-objc", CL_ALL, OPT_lang_objc) \
255 OPT("nostdinc", CL_ALL, OPT_nostdinc) \
256 OPT("nostdinc++", CL_ALL, OPT_nostdincplusplus) \
257 OPT("o", CL_ALL | CL_ARG, OPT_o) \
258 OPT("pedantic", CL_ALL, OPT_pedantic) \
259 OPT("pedantic-errors", CL_ALL, OPT_pedantic_errors) \
260 OPT("print-objc-runtime-info", CL_OBJC, OPT_print_objc_runtime_info) \
261 OPT("remap", CL_ALL, OPT_remap) \
262 OPT("std=c++98", CL_CXX, OPT_std_cplusplus98) \
263 OPT("std=c89", CL_C, OPT_std_c89) \
264 OPT("std=c99", CL_C, OPT_std_c99) \
265 OPT("std=c9x", CL_C, OPT_std_c9x) \
266 OPT("std=gnu++98", CL_CXX, OPT_std_gnuplusplus98) \
267 OPT("std=gnu89", CL_C, OPT_std_gnu89) \
268 OPT("std=gnu99", CL_C, OPT_std_gnu99) \
269 OPT("std=gnu9x", CL_C, OPT_std_gnu9x) \
270 OPT("std=iso9899:1990", CL_C, OPT_std_iso9899_1990) \
271 OPT("std=iso9899:199409", CL_C, OPT_std_iso9899_199409) \
272 OPT("std=iso9899:1999", CL_C, OPT_std_iso9899_1999) \
273 OPT("std=iso9899:199x", CL_C, OPT_std_iso9899_199x) \
274 OPT("traditional-cpp", CL_ALL, OPT_traditional_cpp) \
275 OPT("trigraphs", CL_ALL, OPT_trigraphs) \
276 OPT("undef", CL_ALL, OPT_undef) \
277 OPT("v", CL_ALL, OPT_v) \
278 OPT("w", CL_ALL, OPT_w)
280 #define OPT(text, flags, code) code,
290 const char *opt_text;
291 unsigned char opt_len;
293 ENUM_BITFIELD (opt_code) opt_code : 2 * CHAR_BIT;
296 #define OPT(text, flags, code) { text, sizeof(text) - 1, flags, code },
298 static struct cl_option cl_options[] =
300 static const struct cl_option cl_options[] =
306 #undef COMMAND_LINE_OPTIONS
308 /* Holds switches parsed by c_common_decode_option (), but whose
309 handling is deffered to c_common_post_options (). */
310 static void defer_opt PARAMS ((enum opt_code, const char *));
311 static struct deferred_opt
319 static int opt_comp PARAMS ((const void *, const void *));
321 /* Run-time sorting of options array. */
326 return strcmp (((struct cl_option *) p1)->opt_text,
327 ((struct cl_option *) p2)->opt_text);
331 /* Complain that switch OPT_INDEX expects an argument but none was
334 missing_arg (opt_index)
337 const char *opt_text = cl_options[opt_index].opt_text;
345 case OPT_fname_mangling:
347 case OPT_ftemplate_depth:
349 error ("missing argument to \"-%s\"", opt_text);
352 case OPT_fconstant_string_class:
353 error ("no class name specified with \"-%s\"", opt_text);
360 error ("missing filename after \"-%s\"", opt_text);
365 error ("missing target after \"-%s\"", opt_text);
370 /* Perform a binary search to find which option the command-line INPUT
371 matches. Returns its index in the option array, and N_OPTS on
374 Complications arise since some options can be suffixed with an
375 argument, and multiple complete matches can occur, e.g. -pedantic
376 and -pedantic-errors. Also, some options are only accepted by some
379 find_opt (input, lang_flag)
385 size_t wrong_lang = N_OPTS;
395 opt_len = cl_options[md].opt_len;
396 comp = memcmp (input, cl_options[md].opt_text, opt_len);
404 /* The switch matches. It it an exact match? */
405 if (input[opt_len] == '\0')
408 if (cl_options[md].flags & lang_flag)
417 /* If the switch takes no arguments this is not a proper
418 match, so we continue the search (e.g. input="stdc++"
419 match was "stdc"). */
420 if (!(cl_options[md].flags & CL_JOINED))
423 /* Is this switch valid for this front end? */
424 if (!(cl_options[md].flags & lang_flag))
426 /* If subsequently we don't find a good match,
427 report this as a bad match. */
432 /* Two scenarios remain: we have the switch's argument,
433 or we match a longer option. This can happen with
434 -iwithprefix and -withprefixbefore. The longest
435 possible option match succeeds.
437 Scan forwards, and return an exact match. Otherwise
438 return the longest valid option-accepting match (mx).
439 This loops at most twice with current options. */
441 for (md = md + 1; md < (size_t) N_OPTS; md++)
443 opt_len = cl_options[md].opt_len;
444 if (memcmp (input, cl_options[md].opt_text, opt_len))
446 if (input[opt_len] == '\0')
448 if (cl_options[md].flags & lang_flag
449 && cl_options[md].flags & CL_JOINED)
458 if (wrong_lang != N_OPTS)
459 complain_wrong_lang (wrong_lang);
464 /* Defer option CODE with argument ARG. */
466 defer_opt (code, arg)
470 /* FIXME: this should be in c_common_init_options, which should take
474 extern int save_argc;
475 deferred_size = save_argc;
476 deferred_opts = (struct deferred_opt *)
477 xmalloc (deferred_size * sizeof (struct deferred_opt));
480 if (deferred_count == deferred_size)
483 deferred_opts[deferred_count].code = code;
484 deferred_opts[deferred_count].arg = arg;
488 /* Common initialization before parsing options. */
490 c_common_init_options (lang)
491 enum c_language_kind lang;
494 /* For non-ASCII hosts, the cl_options array needs to be sorted at
496 qsort (cl_options, N_OPTS, sizeof (struct cl_option), opt_comp);
500 parse_in = cpp_create_reader (lang == clk_c ? CLK_GNUC89 : CLK_GNUCXX);
501 cpp_opts = cpp_get_options (parse_in);
505 flag_const_strings = (lang == clk_cplusplus);
506 warn_pointer_arith = (lang == clk_cplusplus);
508 warn_sign_compare = -1;
510 /* Mark as "unspecified" (see c_common_post_options). */
511 flag_bounds_check = -1;
514 /* Handle one command-line option in (argc, argv).
515 Can be called multiple times, to handle multiple sets of options.
516 Returns number of strings consumed. */
518 c_common_decode_option (argc, argv)
522 static int lang_flags[] = {CL_C_ONLY, CL_C, CL_CXX_ONLY, CL_CXX};
524 const char *opt, *arg = 0;
528 const struct cl_option *option;
533 /* Interpret "-" or a non-switch as a file name. */
534 if (opt[0] != '-' || opt[1] == '\0')
542 error ("too many filenames given. Type %s --help for usage",
550 /* Drop the "no-" from negative switches. */
551 if ((opt[1] == 'W' || opt[1] == 'f')
552 && opt[2] == 'n' && opt[3] == 'o' && opt[4] == '-')
554 size_t len = strlen (opt) - 3;
556 dup = xmalloc (len + 1);
559 memcpy (dup + 2, opt + 5, len - 2 + 1);
564 result = cpp_handle_option (parse_in, argc, argv);
567 opt_index = find_opt (opt + 1, lang_flags[(c_language << 1) + flag_objc]);
568 if (opt_index == N_OPTS)
572 option = &cl_options[opt_index];
574 /* Sort out any argument the switch takes. */
575 if (option->flags & CL_ARG)
577 if (option->flags & CL_JOINED)
579 /* Have arg point to the original switch. This is because
580 some code, such as disable_builtin_function, expects its
581 argument to be persistent until the program exits. */
582 arg = argv[0] + cl_options[opt_index].opt_len + 1;
584 arg += strlen ("no-");
587 /* If we don't have an argument, and CL_SEPARATE, try the next
588 argument in the vector. */
589 if (!arg || (*arg == '\0' && option->flags & CL_SEPARATE))
595 if (!arg || *arg == '\0')
597 missing_arg (opt_index);
603 switch (code = option->opt_code)
605 case N_OPTS: /* Shut GCC up. */
613 cpp_opts->discard_comments = 0;
617 cpp_opts->discard_comments = 0;
618 cpp_opts->discard_comments_in_macro_exp = 0;
622 flag_preprocess_only = 1;
626 cpp_opts->print_include_names = 1;
631 /* When doing dependencies with -M or -MM, suppress normal
632 preprocessed output, but still do -dM etc. as software
633 depends on this. Preprocessed output does occur if -MD, -MMD
634 or environment var dependency generation is used. */
635 cpp_opts->deps.style = (code == OPT_M ? DEPS_SYSTEM: DEPS_USER);
636 cpp_opts->no_output = 1;
637 cpp_opts->inhibit_warnings = 1;
642 cpp_opts->deps.style = (code == OPT_MD ? DEPS_SYSTEM: DEPS_USER);
653 cpp_opts->deps.missing_files = true;
658 cpp_opts->deps.phony_targets = true;
664 defer_opt (code, arg);
668 cpp_opts->no_line_commands = 1;
675 warn_char_subscripts = on;
676 warn_missing_braces = on;
677 warn_parentheses = on;
678 warn_return_type = on;
679 warn_sequence_point = on; /* Was C only. */
680 warn_sign_compare = on; /* Was C++ only. */
683 /* Only warn about unknown pragmas that are not in system
685 warn_unknown_pragmas = on;
687 /* We save the value of warn_uninitialized, since if they put
688 -Wuninitialized on the command line, we need to generate a
689 warning about not using it without also specifying -O. */
690 if (warn_uninitialized != 1)
691 warn_uninitialized = (on ? 2 : 0);
693 if (c_language == clk_c)
694 /* We set this to 2 here, but 1 in -Wmain, so -ffreestanding
695 can turn it off only if it's not explicit. */
699 /* C++-specific warnings. */
700 warn_ctor_dtor_privacy = on;
703 warn_nontemplate_friend = on;
706 cpp_opts->warn_trigraphs = on;
707 cpp_opts->warn_comments = on;
708 cpp_opts->warn_num_sign_change = on;
709 cpp_opts->warn_multichar = on; /* Was C++ only. */
712 case OPT_Wbad_function_cast:
713 warn_bad_function_cast = on;
720 case OPT_Wchar_subscripts:
721 warn_char_subscripts = on;
726 cpp_opts->warn_comments = on;
729 case OPT_Wconversion:
730 warn_conversion = on;
733 case OPT_Wctor_dtor_privacy:
734 warn_ctor_dtor_privacy = on;
737 case OPT_Wdeprecated:
738 warn_deprecated = on;
741 case OPT_Wdiv_by_zero:
742 warn_div_by_zero = on;
749 case OPT_Wendif_labels:
750 cpp_opts->warn_endif_labels = on;
754 cpp_opts->warnings_are_errors = on;
757 case OPT_Werror_implicit_function_decl:
761 mesg_implicit_function_declaration = 2;
764 case OPT_Wfloat_equal:
765 warn_float_equal = on;
773 set_Wformat (atoi (arg));
776 case OPT_Wformat_extra_args:
777 warn_format_extra_args = on;
780 case OPT_Wformat_nonliteral:
781 warn_format_nonliteral = on;
784 case OPT_Wformat_security:
785 warn_format_security = on;
788 case OPT_Wformat_y2k:
789 warn_format_y2k = on;
792 case OPT_Wformat_zero_length:
793 warn_format_zero_length = on;
800 case OPT_Wimplicit_function_decl:
801 mesg_implicit_function_declaration = on;
804 case OPT_Wimplicit_int:
805 warn_implicit_int = on;
809 cpp_opts->warn_import = on;
823 case OPT_Wmissing_braces:
824 warn_missing_braces = on;
827 case OPT_Wmissing_declarations:
828 warn_missing_declarations = on;
831 case OPT_Wmissing_format_attribute:
832 warn_missing_format_attribute = on;
835 case OPT_Wmissing_prototypes:
836 warn_missing_prototypes = on;
840 cpp_opts->warn_multichar = on;
843 case OPT_Wnested_externs:
844 warn_nested_externs = on;
847 case OPT_Wnon_template_friend:
848 warn_nontemplate_friend = on;
851 case OPT_Wnon_virtual_dtor:
859 case OPT_Wold_style_cast:
860 warn_old_style_cast = on;
863 case OPT_Woverloaded_virtual:
864 warn_overloaded_virtual = on;
867 case OPT_Wparentheses:
868 warn_parentheses = on;
871 case OPT_Wpmf_conversions:
875 case OPT_Wpointer_arith:
876 warn_pointer_arith = on;
887 case OPT_Wredundant_decls:
888 warn_redundant_decls = on;
895 case OPT_Wreturn_type:
896 warn_return_type = on;
899 case OPT_Wsequence_point:
900 warn_sequence_point = on;
903 case OPT_Wsign_compare:
904 warn_sign_compare = on;
907 case OPT_Wsign_promo:
908 warn_sign_promo = on;
911 case OPT_Wstrict_prototypes:
912 if (!on && c_language == clk_cplusplus)
913 warning ("-Wno-strict-prototypes is not supported in C++");
915 warn_strict_prototypes = on;
922 case OPT_Wsystem_headers:
923 cpp_opts->warn_system_headers = on;
926 case OPT_Wtraditional:
927 warn_traditional = on;
928 cpp_opts->warn_traditional = on;
932 cpp_opts->warn_trigraphs = on;
936 cpp_opts->warn_undef = on;
939 case OPT_Wunknown_pragmas:
940 /* Set to greater than 1, so that even unknown pragmas in
941 system headers will be warned about. */
942 warn_unknown_pragmas = on * 2;
945 case OPT_Wunused_macros:
946 cpp_opts->warn_unused_macros = on;
949 case OPT_Wwrite_strings:
950 if (c_language == clk_c)
951 flag_const_strings = on;
953 warn_write_strings = on;
957 if (c_language == clk_c)
958 set_std_c89 (false, true);
960 set_std_cxx98 (true);
967 case OPT_fcond_mismatch:
968 if (c_language == clk_c)
970 flag_cond_mismatch = on;
975 case OPT_fall_virtual:
976 case OPT_fenum_int_equiv:
977 case OPT_fguiding_decls:
979 case OPT_fhuge_objects:
981 case OPT_fname_mangling:
983 case OPT_fnonnull_objects:
985 case OPT_fstrict_prototype:
986 case OPT_fthis_is_variable:
987 case OPT_fvtable_thunks:
989 warning ("switch \"%s\" is no longer supported", argv[0]);
992 case OPT_faccess_control:
993 flag_access_control = on;
996 case OPT_falt_external_templates:
997 flag_alt_external_templates = on;
999 flag_external_templates = true;
1001 warning ("switch \"%s\" is deprecated, please see documentation for details", argv[0]);
1009 flag_no_builtin = !on;
1016 disable_builtin_function (arg);
1019 case OPT_fdollars_in_identifiers:
1020 dollars_in_ident = on;
1024 if (!on || !dump_switch_p (argv[0] + strlen ("-f")))
1028 case OPT_ffreestanding:
1030 /* Fall through... */
1033 flag_no_builtin = !on;
1034 /* warn_main will be 2 if set by -Wall, 1 if set by -Wmain */
1035 if (!on && warn_main == 2)
1039 case OPT_fshort_double:
1040 flag_short_double = on;
1043 case OPT_fshort_enums:
1044 flag_short_enums = on;
1047 case OPT_fshort_wchar:
1048 flag_short_wchar = on;
1051 case OPT_fsigned_bitfields:
1052 flag_signed_bitfields = on;
1053 explicit_flag_signed_bitfields = 1;
1056 case OPT_fsigned_char:
1057 flag_signed_char = on;
1060 case OPT_funsigned_bitfields:
1061 flag_signed_bitfields = !on;
1062 explicit_flag_signed_bitfields = 1;
1065 case OPT_funsigned_char:
1066 flag_signed_char = !on;
1069 case OPT_fcheck_new:
1070 flag_check_new = on;
1073 case OPT_fconserve_space:
1074 flag_conserve_space = on;
1077 case OPT_fconst_strings:
1078 flag_const_strings = on;
1081 case OPT_fconstant_string_class:
1082 constant_string_class_name = arg;
1085 case OPT_fdefault_inline:
1086 flag_default_inline = on;
1089 case OPT_felide_constructors:
1090 flag_elide_constructors = on;
1093 case OPT_fenforce_eh_specs:
1094 flag_enforce_eh_specs = on;
1097 case OPT_fexternal_templates:
1098 flag_external_templates = on;
1101 case OPT_ffor_scope:
1102 flag_new_for_scope = on;
1105 case OPT_fgnu_keywords:
1106 flag_no_gnu_keywords = !on;
1109 case OPT_fgnu_runtime:
1110 flag_next_runtime = !on;
1113 case OPT_fhandle_exceptions:
1114 warning ("-fhandle-exceptions has been renamed to -fexceptions (and is now on by default)");
1115 flag_exceptions = on;
1118 case OPT_fimplement_inlines:
1119 flag_implement_inlines = on;
1122 case OPT_fimplicit_inline_templates:
1123 flag_implicit_inline_templates = on;
1126 case OPT_fimplicit_templates:
1127 flag_implicit_templates = on;
1130 case OPT_fms_extensions:
1131 flag_ms_extensions = on;
1134 case OPT_fnext_runtime:
1135 flag_next_runtime = on;
1138 case OPT_fnonansi_builtins:
1139 flag_no_nonansi_builtin = !on;
1142 case OPT_foperator_names:
1143 cpp_opts->operator_names = on;
1146 case OPT_foptional_diags:
1147 flag_optional_diags = on;
1150 case OPT_fpermissive:
1151 flag_permissive = on;
1154 case OPT_fpreprocessed:
1155 cpp_opts->preprocessed = on;
1159 flag_use_repository = on;
1161 flag_implicit_templates = 0;
1168 case OPT_fshow_column:
1169 cpp_opts->show_column = on;
1173 flag_detailed_statistics = on;
1177 /* Don't recognise -fno-tabstop=. */
1181 /* It is documented that we silently ignore silly values. */
1184 long tabstop = strtol (arg, &endptr, 10);
1185 if (*endptr == '\0' && tabstop >= 1 && tabstop <= 100)
1186 cpp_opts->tabstop = tabstop;
1190 case OPT_ftemplate_depth:
1191 max_tinst_depth = read_integral_parameter (arg, argv[0], 0);
1194 case OPT_fvtable_gc:
1195 flag_vtable_gc = on;
1198 case OPT_fuse_cxa_atexit:
1199 flag_use_cxa_atexit = on;
1207 flag_gen_declaration = 1;
1211 cpp_set_lang (parse_in, CLK_ASM);
1219 /* No default include directories. You must specify all
1220 include-file directories with -I. */
1221 cpp_opts->no_standard_includes = 1;
1224 case OPT_nostdincplusplus:
1225 /* No default C++-specific include directories. */
1226 cpp_opts->no_standard_cplusplus_includes = 1;
1234 error ("output filename specified twice");
1239 /* We need to handle the -pedantic switches here, rather than in
1240 c_common_post_options, so that a subsequent -Wno-endif-labels
1241 is not overridden. */
1242 case OPT_pedantic_errors:
1243 cpp_opts->pedantic_errors = 1;
1246 cpp_opts->pedantic = 1;
1247 cpp_opts->warn_endif_labels = 1;
1250 case OPT_print_objc_runtime_info:
1251 print_struct_values = 1;
1255 cpp_opts->remap = 1;
1258 case OPT_std_cplusplus98:
1259 case OPT_std_gnuplusplus98:
1260 set_std_cxx98 (code == OPT_std_cplusplus98 /* ISO */);
1264 case OPT_std_iso9899_1990:
1265 case OPT_std_iso9899_199409:
1266 set_std_c89 (code == OPT_std_iso9899_199409 /* c94 */, true /* ISO */);
1270 set_std_c89 (false /* c94 */, false /* ISO */);
1275 case OPT_std_iso9899_1999:
1276 case OPT_std_iso9899_199x:
1277 set_std_c99 (true /* ISO */);
1282 set_std_c99 (false /* ISO */);
1286 cpp_opts->trigraphs = 1;
1289 case OPT_traditional_cpp:
1290 cpp_opts->traditional = 1;
1298 cpp_opts->inhibit_warnings = 1;
1302 cpp_opts->verbose = 1;
1312 /* Post-switch processing. */
1314 c_common_post_options ()
1316 /* Canonicalize the input and output filenames. */
1317 if (in_fname == NULL || !strcmp (in_fname, "-"))
1320 if (out_fname == NULL || !strcmp (out_fname, "-"))
1323 if (cpp_opts->deps.style != DEPS_NONE)
1324 check_deps_environment_vars ();
1326 handle_deferred_opts ();
1328 sanitize_cpp_opts ();
1330 flag_inline_trees = 1;
1332 /* Use tree inlining if possible. Function instrumentation is only
1333 done in the RTL level, so we disable tree inlining. */
1334 if (! flag_instrument_function_entry_exit)
1336 if (!flag_no_inline)
1338 if (flag_inline_functions)
1340 flag_inline_trees = 2;
1341 flag_inline_functions = 0;
1345 /* If still "unspecified", make it match -fbounded-pointers. */
1346 if (flag_bounds_check == -1)
1347 flag_bounds_check = flag_bounded_pointers;
1349 /* Special format checking options don't work without -Wformat; warn if
1351 if (warn_format_y2k && !warn_format)
1352 warning ("-Wformat-y2k ignored without -Wformat");
1353 if (warn_format_extra_args && !warn_format)
1354 warning ("-Wformat-extra-args ignored without -Wformat");
1355 if (warn_format_zero_length && !warn_format)
1356 warning ("-Wformat-zero-length ignored without -Wformat");
1357 if (warn_format_nonliteral && !warn_format)
1358 warning ("-Wformat-nonliteral ignored without -Wformat");
1359 if (warn_format_security && !warn_format)
1360 warning ("-Wformat-security ignored without -Wformat");
1361 if (warn_missing_format_attribute && !warn_format)
1362 warning ("-Wmissing-format-attribute ignored without -Wformat");
1364 /* If an error has occurred in cpplib, note it so we fail
1366 errorcount += cpp_errors (parse_in);
1368 return flag_preprocess_only;
1371 /* Preprocess the input file to out_stream. */
1375 /* Open the output now. We must do so even if no_output is on,
1376 because there may be other output than from the actual
1377 preprocessing (e.g. from -dM). */
1378 if (out_fname[0] == '\0')
1379 out_stream = stdout;
1381 out_stream = fopen (out_fname, "w");
1383 if (out_stream == NULL)
1384 fatal_io_error ("opening output file %s", out_fname);
1386 cpp_preprocess_file (parse_in, in_fname, out_stream);
1389 /* Front end initialization common to C, ObjC and C++. */
1391 c_common_init (filename)
1392 const char *filename;
1394 /* Set up preprocessor arithmetic. Must be done after call to
1395 c_common_nodes_and_builtins for type nodes to be good. */
1396 cpp_opts->precision = TYPE_PRECISION (intmax_type_node);
1397 cpp_opts->char_precision = TYPE_PRECISION (char_type_node);
1398 cpp_opts->int_precision = TYPE_PRECISION (integer_type_node);
1399 cpp_opts->wchar_precision = TYPE_PRECISION (wchar_type_node);
1400 cpp_opts->unsigned_wchar = TREE_UNSIGNED (wchar_type_node);
1402 /* Register preprocessor built-ins before calls to
1404 cpp_get_callbacks (parse_in)->register_builtins = cb_register_builtins;
1406 /* NULL is passed up to toplev.c and we exit quickly. */
1407 if (flag_preprocess_only)
1413 /* Do this before initializing pragmas, as then cpplib's hash table
1414 has been set up. NOTE: we are using our own file name here, not
1415 the one supplied. */
1416 filename = init_c_lex (in_fname);
1423 /* Common finish hook for the C, ObjC and C++ front ends. */
1427 FILE *deps_stream = NULL;
1429 if (cpp_opts->deps.style != DEPS_NONE)
1431 /* If -M or -MM was seen without -MF, default output to the
1434 deps_stream = out_stream;
1437 deps_stream = fopen (deps_file, deps_append ? "a": "w");
1439 fatal_io_error ("opening dependency file %s", deps_file);
1443 /* For performance, avoid tearing down cpplib's internal structures
1444 with cpp_destroy (). */
1445 errorcount += cpp_finish (parse_in, deps_stream);
1447 if (deps_stream && deps_stream != out_stream
1448 && (ferror (deps_stream) || fclose (deps_stream)))
1449 fatal_io_error ("closing dependency file %s", deps_file);
1451 if (out_stream && (ferror (out_stream) || fclose (out_stream)))
1452 fatal_io_error ("when writing output to %s", out_fname);
1455 /* Either of two environment variables can specify output of
1456 dependencies. Their value is either "OUTPUT_FILE" or "OUTPUT_FILE
1457 DEPS_TARGET", where OUTPUT_FILE is the file to write deps info to
1458 and DEPS_TARGET is the target to mention in the deps. They also
1459 result in dependency information being appended to the output file
1460 rather than overwriting it. */
1462 check_deps_environment_vars ()
1466 GET_ENVIRONMENT (spec, "DEPENDENCIES_OUTPUT");
1468 cpp_opts->deps.style = DEPS_USER;
1471 GET_ENVIRONMENT (spec, "SUNPRO_DEPENDENCIES");
1473 cpp_opts->deps.style = DEPS_SYSTEM;
1478 /* Find the space before the DEPS_TARGET, if there is one. */
1479 char *s = strchr (spec, ' ');
1482 /* Let the caller perform MAKE quoting. */
1483 defer_opt (OPT_MT, s + 1);
1487 /* Command line -MF overrides environment variables and default. */
1495 /* Handle deferred command line switches. */
1497 handle_deferred_opts ()
1501 for (i = 0; i < deferred_count; i++)
1503 struct deferred_opt *opt = &deferred_opts[i];
1509 cpp_add_dependency_target (parse_in, opt->arg, opt->code == OPT_MQ);
1517 free (deferred_opts);
1520 /* These settings are appropriate for GCC, but not necessarily so for
1521 cpplib as a library. */
1523 sanitize_cpp_opts ()
1525 /* If we don't know what style of dependencies to output, complain
1526 if any other dependency switches have been given. */
1527 if (deps_seen && cpp_opts->deps.style == DEPS_NONE)
1528 error ("to generate dependencies you must specify either -M or -MM");
1530 /* -dM and dependencies suppress normal output; do it here so that
1531 the last -d[MDN] switch overrides earlier ones. */
1532 if (cpp_opts->dump_macros == dump_only)
1533 cpp_opts->no_output = 1;
1535 /* Disable -dD, -dN and -dI if normal output is suppressed. Allow
1536 -dM since at least glibc relies on -M -dM to work. */
1537 if (cpp_opts->no_output)
1539 if (cpp_opts->dump_macros != dump_only)
1540 cpp_opts->dump_macros = dump_none;
1541 cpp_opts->dump_includes = 0;
1544 cpp_opts->unsigned_char = !flag_signed_char;
1545 cpp_opts->stdc_0_in_system_headers = STDC_0_IN_SYSTEM_HEADERS;
1547 /* We want -Wno-long-long to override -pedantic -std=non-c99
1548 and/or -Wtraditional, whatever the ordering. */
1549 cpp_opts->warn_long_long
1550 = warn_long_long && ((!flag_isoc99 && pedantic) || warn_traditional);
1553 /* Set the C 89 standard (with 1994 amendments if C94, without GNU
1554 extensions if ISO). There is no concept of gnu94. */
1556 set_std_c89 (c94, iso)
1559 cpp_set_lang (parse_in, c94 ? CLK_STDC94: iso ? CLK_STDC89: CLK_GNUC89);
1562 flag_no_gnu_keywords = iso;
1563 flag_no_nonansi_builtin = iso;
1564 flag_noniso_default_format_attributes = !iso;
1567 flag_writable_strings = 0;
1570 /* Set the C 99 standard (without GNU extensions if ISO). */
1575 cpp_set_lang (parse_in, iso ? CLK_STDC99: CLK_GNUC99);
1577 flag_no_nonansi_builtin = iso;
1578 flag_noniso_default_format_attributes = !iso;
1582 flag_writable_strings = 0;
1585 /* Set the C++ 98 standard (without GNU extensions if ISO). */
1590 cpp_set_lang (parse_in, iso ? CLK_CXX98: CLK_GNUCXX);
1591 flag_no_gnu_keywords = iso;
1592 flag_no_nonansi_builtin = iso;
1593 flag_noniso_default_format_attributes = !iso;
1597 /* Handle setting implicit to ON. */
1603 warn_implicit_int = on;
1606 if (mesg_implicit_function_declaration != 2)
1607 mesg_implicit_function_declaration = 1;
1610 mesg_implicit_function_declaration = 0;
1613 /* Args to -d specify what to dump. Silently ignore
1614 unrecognised options; they may be aimed at toplev.c. */
1621 while ((c = *arg++) != '\0')
1625 cpp_opts->dump_macros = dump_only;
1629 cpp_opts->dump_macros = dump_names;
1633 cpp_opts->dump_macros = dump_definitions;
1637 cpp_opts->dump_includes = 1;
1642 /* Write a slash-separated list of languages in FLAGS to BUF. */
1644 write_langs (buf, flags)
1649 if (flags & CL_C_ONLY)
1651 if (flags & CL_OBJC_ONLY)
1655 strcat (buf, "ObjC");
1657 if (flags & CL_CXX_ONLY)
1661 strcat (buf, "C++");
1665 /* Complain that switch OPT_INDEX does not apply to this front end. */
1667 complain_wrong_lang (opt_index)
1670 char ok_langs[60], bad_langs[60];
1671 int ok_flags = cl_options[opt_index].flags;
1673 write_langs (ok_langs, ok_flags);
1674 write_langs (bad_langs, ~ok_flags);
1675 warning ("\"-%s\" is valid for %s but not for %s",
1676 cl_options[opt_index].opt_text, ok_langs, bad_langs);
1679 /* Handle --help output. */
1683 /* To keep the lines from getting too long for some compilers, limit
1684 to about 500 characters (6 lines) per chunk. */
1687 -include <file> Include the contents of <file> before other files\n\
1688 -imacros <file> Accept definition of macros in <file>\n\
1689 -iprefix <path> Specify <path> as a prefix for next two options\n\
1690 -iwithprefix <dir> Add <dir> to the end of the system include path\n\
1691 -iwithprefixbefore <dir> Add <dir> to the end of the main include path\n\
1692 -isystem <dir> Add <dir> to the start of the system include path\n\
1695 -idirafter <dir> Add <dir> to the end of the system include path\n\
1696 -I <dir> Add <dir> to the end of the main include path\n\
1697 -I- Fine-grained include path control; see info docs\n\
1698 -nostdinc Do not search system include directories\n\
1699 (dirs specified with -isystem will still be used)\n\
1700 -nostdinc++ Do not search system include directories for C++\n\
1701 -o <file> Put output into <file>\n\
1704 -trigraphs Support ISO C trigraphs\n\
1705 -std=<std name> Specify the conformance standard; one of:\n\
1706 gnu89, gnu99, c89, c99, iso9899:1990,\n\
1707 iso9899:199409, iso9899:1999, c++98\n\
1708 -w Inhibit warning messages\n\
1709 -W[no-]trigraphs Warn if trigraphs are encountered\n\
1710 -W[no-]comment{s} Warn if one comment starts inside another\n\
1713 -W[no-]traditional Warn about features not present in traditional C\n\
1714 -W[no-]undef Warn if an undefined macro is used by #if\n\
1715 -W[no-]import Warn about the use of the #import directive\n\
1718 -W[no-]error Treat all warnings as errors\n\
1719 -W[no-]system-headers Do not suppress warnings from system headers\n\
1720 -W[no-]all Enable most preprocessor warnings\n\
1723 -M Generate make dependencies\n\
1724 -MM As -M, but ignore system header files\n\
1725 -MD Generate make dependencies and compile\n\
1726 -MMD As -MD, but ignore system header files\n\
1727 -MF <file> Write dependency output to the given file\n\
1728 -MG Treat missing header file as generated files\n\
1731 -MP Generate phony targets for all headers\n\
1732 -MQ <target> Add a MAKE-quoted target\n\
1733 -MT <target> Add an unquoted target\n\
1736 -D<macro> Define a <macro> with string '1' as its value\n\
1737 -D<macro>=<val> Define a <macro> with <val> as its value\n\
1738 -A<question>=<answer> Assert the <answer> to <question>\n\
1739 -A-<question>=<answer> Disable the <answer> to <question>\n\
1740 -U<macro> Undefine <macro> \n\
1741 -v Display the version number\n\
1744 -H Print the name of header files as they are used\n\
1745 -C Do not discard comments\n\
1746 -dM Display a list of macro definitions active at end\n\
1747 -dD Preserve macro definitions in output\n\
1748 -dN As -dD except that only the names are preserved\n\
1749 -dI Include #include directives in the output\n\
1752 -f[no-]preprocessed Treat the input file as already preprocessed\n\
1753 -ftabstop=<number> Distance between tab stops for column reporting\n\
1754 -P Do not generate #line directives\n\
1755 -remap Remap file names when including files\n\
1756 --help Display this information\n\