]> gcc.gnu.org Git - gcc.git/blame - gcc/c-opts.c
c.opt: Add -flax-vector-conversions.
[gcc.git] / gcc / c-opts.c
CommitLineData
0b6f2917 1/* C/ObjC/C++ command line option handling.
2b6dd222 2 Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
0b6f2917
NB
3 Contributed by Neil Booth.
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 2, or (at your option) any later
10version.
11
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
16
17You should have received a copy of the GNU General Public License
18along with GCC; see the file COPYING. If not, write to the Free
366ccddb
KC
19Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
2002110-1301, USA. */
0b6f2917
NB
21
22#include "config.h"
23#include "system.h"
4977bab6
ZW
24#include "coretypes.h"
25#include "tm.h"
0b6f2917
NB
26#include "tree.h"
27#include "c-common.h"
28#include "c-pragma.h"
29#include "flags.h"
30#include "toplev.h"
31#include "langhooks.h"
32#include "tree-inline.h"
33#include "diagnostic.h"
4b7091eb 34#include "intl.h"
5793b276
NB
35#include "cppdefault.h"
36#include "c-incpath.h"
23345bbb 37#include "debug.h" /* For debug_hooks. */
2772ef3e 38#include "opts.h"
d7b42618 39#include "options.h"
c6e83800 40#include "mkdeps.h"
5793b276 41
b1822ccc
NB
42#ifndef DOLLARS_IN_IDENTIFIERS
43# define DOLLARS_IN_IDENTIFIERS true
44#endif
45
5793b276
NB
46#ifndef TARGET_SYSTEM_ROOT
47# define TARGET_SYSTEM_ROOT NULL
48#endif
0b6f2917 49
7cd60054
AM
50#ifndef TARGET_OPTF
51#define TARGET_OPTF(ARG)
52#endif
53
f4ff5a69 54/* CPP's options. */
18bdccaa
NB
55static cpp_options *cpp_opts;
56
460bd0e3 57/* Input filename. */
89e9faee 58static const char *this_input_filename;
460bd0e3 59
76c3e73e
NB
60/* Filename and stream for preprocessed output. */
61static const char *out_fname;
62static FILE *out_stream;
63
64/* Append dependencies to deps_file. */
65static bool deps_append;
66
f4ff5a69
NB
67/* If dependency switches (-MF etc.) have been given. */
68static bool deps_seen;
69
5793b276
NB
70/* If -v seen. */
71static bool verbose;
72
a67ec6ab
FXC
73/* If -lang-fortran seen. */
74static bool lang_fortran = false;
75
f4ff5a69
NB
76/* Dependency output file. */
77static const char *deps_file;
78
5793b276
NB
79/* The prefix given by -iprefix, if any. */
80static const char *iprefix;
81
2b6dd222
JM
82/* The multilib directory given by -imultilib, if any. */
83static const char *imultilib;
84
5793b276
NB
85/* The system root, if any. Overridden by -isysroot. */
86static const char *sysroot = TARGET_SYSTEM_ROOT;
87
88/* Zero disables all standard directories for headers. */
89static bool std_inc = true;
90
91/* Zero disables the C++-specific standard directories for headers. */
92static bool std_cxx_inc = true;
93
94/* If the quote chain has been split by -I-. */
95static bool quote_chain_split;
96
23345bbb
NB
97/* If -Wunused-macros. */
98static bool warn_unused_macros;
99
e5b79219
RH
100/* If -Wvariadic-macros. */
101static bool warn_variadic_macros = true;
102
b86f6cd9
NB
103/* Number of deferred options. */
104static size_t deferred_count;
f4ff5a69 105
23345bbb
NB
106/* Number of deferred options scanned for -include. */
107static size_t include_cursor;
108
2f6e4e97 109static void set_Wimplicit (int);
2f6e4e97
AJ
110static void handle_OPT_d (const char *);
111static void set_std_cxx98 (int);
966541e3 112static void set_std_cxx0x (int);
2f6e4e97
AJ
113static void set_std_c89 (int, int);
114static void set_std_c99 (int);
115static void check_deps_environment_vars (void);
116static void handle_deferred_opts (void);
117static void sanitize_cpp_opts (void);
118static void add_prefixed_path (const char *, size_t);
119static void push_command_line_include (void);
120static void cb_file_change (cpp_reader *, const struct line_map *);
8e9ea4d7
PB
121static void cb_dir_change (cpp_reader *, const char *);
122static void finish_options (void);
460bd0e3
NB
123
124#ifndef STDC_0_IN_SYSTEM_HEADERS
125#define STDC_0_IN_SYSTEM_HEADERS 0
126#endif
0b6f2917 127
2772ef3e 128/* Holds switches parsed by c_common_handle_option (), but whose
95bd1dd7 129 handling is deferred to c_common_post_options (). */
2f6e4e97 130static void defer_opt (enum opt_code, const char *);
f4ff5a69
NB
131static struct deferred_opt
132{
133 enum opt_code code;
134 const char *arg;
135} *deferred_opts;
136
cb66e385
NB
137/* Complain that switch CODE expects an argument but none was
138 provided. OPT was the command-line option. Return FALSE to get
139 the default message in opts.c, TRUE if we provide a specialized
140 one. */
141bool
142c_common_missing_argument (const char *opt, size_t code)
4b7091eb 143{
2772ef3e 144 switch (code)
4b7091eb 145 {
4b7091eb 146 default:
cb66e385
NB
147 /* Pick up the default message. */
148 return false;
4b7091eb 149
fef3106c 150 case OPT_fconstant_string_class_:
bda67431 151 error ("no class name specified with %qs", opt);
4b7091eb 152 break;
b4a93904 153
c1bad961 154 case OPT_A:
bda67431 155 error ("assertion missing after %qs", opt);
c1bad961
NB
156 break;
157
158 case OPT_D:
159 case OPT_U:
bda67431 160 error ("macro name missing after %qs", opt);
c1bad961
NB
161 break;
162
94d1613b 163 case OPT_F:
5793b276
NB
164 case OPT_I:
165 case OPT_idirafter:
166 case OPT_isysroot:
167 case OPT_isystem:
4bed3787 168 case OPT_iquote:
bda67431 169 error ("missing path after %qs", opt);
5793b276
NB
170 break;
171
f4ff5a69
NB
172 case OPT_MF:
173 case OPT_MD:
174 case OPT_MMD:
255c10b1
NB
175 case OPT_include:
176 case OPT_imacros:
b4a93904 177 case OPT_o:
bda67431 178 error ("missing filename after %qs", opt);
f4ff5a69
NB
179 break;
180
181 case OPT_MQ:
182 case OPT_MT:
bda67431 183 error ("missing makefile target after %qs", opt);
b4a93904 184 break;
4b7091eb 185 }
cb66e385
NB
186
187 return true;
4b7091eb
NB
188}
189
f4ff5a69
NB
190/* Defer option CODE with argument ARG. */
191static void
2f6e4e97 192defer_opt (enum opt_code code, const char *arg)
f4ff5a69 193{
f4ff5a69
NB
194 deferred_opts[deferred_count].code = code;
195 deferred_opts[deferred_count].arg = arg;
196 deferred_count++;
197}
198
0b6f2917 199/* Common initialization before parsing options. */
b86f6cd9 200unsigned int
afd85c1a 201c_common_init_options (unsigned int argc, const char **argv)
0b6f2917 202{
b86f6cd9 203 static const unsigned int lang_flags[] = {CL_C, CL_ObjC, CL_CXX, CL_ObjCXX};
afd85c1a 204 unsigned int i, result;
37fa72e9
NB
205
206 /* This is conditionalized only because that is the way the front
207 ends used to do it. Maybe this should be unconditional? */
208 if (c_dialect_cxx ())
209 {
210 /* By default wrap lines at 80 characters. Is getenv
211 ("COLUMNS") preferable? */
212 diagnostic_line_cutoff (global_dc) = 80;
213 /* By default, emit location information once for every
214 diagnostic message. */
215 diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
216 }
217
218 parse_in = cpp_create_reader (c_dialect_cxx () ? CLK_GNUCXX: CLK_GNUC89,
50f59cd7 219 ident_hash, &line_table);
37fa72e9 220
18bdccaa 221 cpp_opts = cpp_get_options (parse_in);
b1822ccc 222 cpp_opts->dollars_in_ident = DOLLARS_IN_IDENTIFIERS;
37fa72e9 223 cpp_opts->objc = c_dialect_objc ();
78b8811a
HPN
224
225 /* Reset to avoid warnings on internal definitions. We set it just
226 before passing on command-line options to cpplib. */
227 cpp_opts->warn_dollars = 0;
228
37fa72e9
NB
229 flag_exceptions = c_dialect_cxx ();
230 warn_pointer_arith = c_dialect_cxx ();
d539b114 231 warn_write_strings = c_dialect_cxx();
2772ef3e 232
5d038c4c 233 deferred_opts = XNEWVEC (struct deferred_opt, argc);
b86f6cd9 234
33de9573
NB
235 result = lang_flags[c_language];
236
afd85c1a 237 if (c_language == clk_c)
33de9573 238 {
afd85c1a
RS
239 /* If preprocessing assembly language, accept any of the C-family
240 front end options since the driver may pass them through. */
241 for (i = 1; i < argc; i++)
242 if (! strcmp (argv[i], "-lang-asm"))
243 {
244 result |= CL_C | CL_ObjC | CL_CXX | CL_ObjCXX;
245 break;
246 }
a67ec6ab
FXC
247
248#ifdef CL_Fortran
249 for (i = 1; i < argc; i++)
250 if (! strcmp (argv[i], "-lang-fortran"))
251 {
252 result |= CL_Fortran;
253 break;
254 }
255#endif
33de9573 256 }
33de9573
NB
257
258 return result;
0b6f2917
NB
259}
260
b20d9f0c 261/* Handle switch SCODE with argument ARG. VALUE is true, unless no-
2772ef3e
NB
262 form of an -f or -W option was given. Returns 0 if the switch was
263 invalid, a negative number to prevent language-independent
264 processing in toplev.c (a hack necessary for the short-term). */
0b6f2917 265int
7b086b11 266c_common_handle_option (size_t scode, const char *arg, int value)
0b6f2917 267{
2772ef3e
NB
268 const struct cl_option *option = &cl_options[scode];
269 enum opt_code code = (enum opt_code) scode;
f18754d6 270 int result = 1;
2772ef3e 271
69723be2
SB
272 /* Prevent resetting the language standard to a C dialect when the driver
273 has already determined that we're looking at assembler input. */
274 bool preprocessing_asm_p = (cpp_get_options (parse_in)->lang == CLK_ASM);
275
fef3106c 276 switch (code)
0b6f2917 277 {
2772ef3e 278 default:
7619c085
DD
279 if (cl_options[code].flags & (CL_C | CL_CXX | CL_ObjC | CL_ObjCXX))
280 break;
a67ec6ab
FXC
281#ifdef CL_Fortran
282 if (lang_fortran && (cl_options[code].flags & (CL_Fortran)))
283 break;
284#endif
afd85c1a 285 result = 0;
33de9573 286 break;
0b6f2917 287
fef3106c 288 case OPT__output_pch_:
17211ab5
GK
289 pch_file = arg;
290 break;
291
c1bad961
NB
292 case OPT_A:
293 defer_opt (code, arg);
294 break;
295
4b7091eb
NB
296 case OPT_C:
297 cpp_opts->discard_comments = 0;
298 break;
299
300 case OPT_CC:
301 cpp_opts->discard_comments = 0;
302 cpp_opts->discard_comments_in_macro_exp = 0;
303 break;
304
c1bad961
NB
305 case OPT_D:
306 defer_opt (code, arg);
307 break;
308
0b6f2917
NB
309 case OPT_E:
310 flag_preprocess_only = 1;
311 break;
312
4b7091eb
NB
313 case OPT_H:
314 cpp_opts->print_include_names = 1;
315 break;
316
94d1613b
MS
317 case OPT_F:
318 TARGET_OPTF (xstrdup (arg));
319 break;
320
5793b276
NB
321 case OPT_I:
322 if (strcmp (arg, "-"))
b02398bd 323 add_path (xstrdup (arg), BRACKET, 0, true);
5793b276
NB
324 else
325 {
326 if (quote_chain_split)
327 error ("-I- specified twice");
328 quote_chain_split = true;
329 split_quote_chain ();
4bed3787 330 inform ("obsolete option -I- used, please use -iquote instead");
5793b276
NB
331 }
332 break;
333
f4ff5a69
NB
334 case OPT_M:
335 case OPT_MM:
336 /* When doing dependencies with -M or -MM, suppress normal
337 preprocessed output, but still do -dM etc. as software
338 depends on this. Preprocessed output does occur if -MD, -MMD
339 or environment var dependency generation is used. */
340 cpp_opts->deps.style = (code == OPT_M ? DEPS_SYSTEM: DEPS_USER);
63973df3 341 flag_no_output = 1;
f4ff5a69
NB
342 cpp_opts->inhibit_warnings = 1;
343 break;
344
345 case OPT_MD:
346 case OPT_MMD:
347 cpp_opts->deps.style = (code == OPT_MD ? DEPS_SYSTEM: DEPS_USER);
348 deps_file = arg;
349 break;
350
351 case OPT_MF:
352 deps_seen = true;
353 deps_file = arg;
354 break;
355
356 case OPT_MG:
357 deps_seen = true;
358 cpp_opts->deps.missing_files = true;
359 break;
360
361 case OPT_MP:
362 deps_seen = true;
363 cpp_opts->deps.phony_targets = true;
364 break;
365
366 case OPT_MQ:
367 case OPT_MT:
368 deps_seen = true;
369 defer_opt (code, arg);
370 break;
371
4b7091eb 372 case OPT_P:
63973df3 373 flag_no_line_commands = 1;
4b7091eb
NB
374 break;
375
b20d9f0c
AO
376 case OPT_fworking_directory:
377 flag_working_directory = value;
378 break;
379
c1bad961
NB
380 case OPT_U:
381 defer_opt (code, arg);
382 break;
383
0b6f2917 384 case OPT_Wall:
7b086b11
NB
385 set_Wunused (value);
386 set_Wformat (value);
387 set_Wimplicit (value);
388 warn_char_subscripts = value;
389 warn_missing_braces = value;
390 warn_parentheses = value;
391 warn_return_type = value;
392 warn_sequence_point = value; /* Was C only. */
37fa72e9 393 if (c_dialect_cxx ())
7b086b11
NB
394 warn_sign_compare = value;
395 warn_switch = value;
396 warn_strict_aliasing = value;
e994a705 397 warn_string_literal_comparison = value;
690a704a 398 warn_always_true = value;
2f6e4e97 399
0b6f2917 400 /* Only warn about unknown pragmas that are not in system
2f6e4e97 401 headers. */
7b086b11 402 warn_unknown_pragmas = value;
0b6f2917
NB
403
404 /* We save the value of warn_uninitialized, since if they put
405 -Wuninitialized on the command line, we need to generate a
406 warning about not using it without also specifying -O. */
407 if (warn_uninitialized != 1)
7b086b11 408 warn_uninitialized = (value ? 2 : 0);
0b6f2917 409
37fa72e9 410 if (!c_dialect_cxx ())
0b6f2917
NB
411 /* We set this to 2 here, but 1 in -Wmain, so -ffreestanding
412 can turn it off only if it's not explicit. */
7b086b11 413 warn_main = value * 2;
0b6f2917
NB
414 else
415 {
416 /* C++-specific warnings. */
7b086b11
NB
417 warn_reorder = value;
418 warn_nontemplate_friend = value;
7f420d0d
GDR
419 if (value > 0)
420 warn_write_strings = true;
0b6f2917 421 }
18bdccaa 422
7b086b11
NB
423 cpp_opts->warn_trigraphs = value;
424 cpp_opts->warn_comments = value;
425 cpp_opts->warn_num_sign_change = value;
426 cpp_opts->warn_multichar = value; /* Was C++ only. */
f4e9414e
AO
427
428 if (warn_pointer_sign == -1)
429 warn_pointer_sign = 1;
0b6f2917
NB
430 break;
431
18bdccaa
NB
432 case OPT_Wcomment:
433 case OPT_Wcomments:
7b086b11 434 cpp_opts->warn_comments = value;
18bdccaa
NB
435 break;
436
0b6f2917 437 case OPT_Wdeprecated:
7b086b11 438 cpp_opts->warn_deprecated = value;
0b6f2917
NB
439 break;
440
18bdccaa 441 case OPT_Wendif_labels:
7b086b11 442 cpp_opts->warn_endif_labels = value;
18bdccaa
NB
443 break;
444
445 case OPT_Werror:
7b086b11 446 cpp_opts->warnings_are_errors = value;
7783b402 447 global_dc->warning_as_error_requested = value;
18bdccaa
NB
448 break;
449
fef3106c 450 case OPT_Werror_implicit_function_declaration:
c83857ff 451 mesg_implicit_function_declaration = 2;
0b6f2917
NB
452 break;
453
0b6f2917 454 case OPT_Wformat:
7b086b11 455 set_Wformat (value);
0b6f2917
NB
456 break;
457
fef3106c 458 case OPT_Wformat_:
0b6f2917
NB
459 set_Wformat (atoi (arg));
460 break;
461
0b6f2917 462 case OPT_Wimplicit:
7b086b11 463 set_Wimplicit (value);
0b6f2917
NB
464 break;
465
18bdccaa 466 case OPT_Wimport:
bf42e45b 467 /* Silently ignore for now. */
18bdccaa
NB
468 break;
469
17211ab5 470 case OPT_Winvalid_pch:
7b086b11 471 cpp_opts->warn_invalid_pch = value;
17211ab5
GK
472 break;
473
0b6f2917 474 case OPT_Wmain:
7b086b11 475 if (value)
0b6f2917
NB
476 warn_main = 1;
477 else
478 warn_main = -1;
479 break;
480
b02398bd
BE
481 case OPT_Wmissing_include_dirs:
482 cpp_opts->warn_missing_include_dirs = value;
483 break;
484
0b6f2917 485 case OPT_Wmultichar:
7b086b11 486 cpp_opts->warn_multichar = value;
0b6f2917
NB
487 break;
488
50668cf6
GK
489 case OPT_Wnormalized_:
490 if (!value || (arg && strcasecmp (arg, "none") == 0))
491 cpp_opts->warn_normalize = normalized_none;
492 else if (!arg || strcasecmp (arg, "nfkc") == 0)
493 cpp_opts->warn_normalize = normalized_KC;
494 else if (strcasecmp (arg, "id") == 0)
495 cpp_opts->warn_normalize = normalized_identifier_C;
496 else if (strcasecmp (arg, "nfc") == 0)
497 cpp_opts->warn_normalize = normalized_C;
498 else
499 error ("argument %qs to %<-Wnormalized%> not recognized", arg);
500 break;
501
0b6f2917 502 case OPT_Wreturn_type:
7b086b11 503 warn_return_type = value;
0b6f2917
NB
504 break;
505
b2f97e4a
MM
506 case OPT_Wstrict_null_sentinel:
507 warn_strict_null_sentinel = value;
508 break;
509
18bdccaa 510 case OPT_Wsystem_headers:
7b086b11 511 cpp_opts->warn_system_headers = value;
18bdccaa
NB
512 break;
513
0b6f2917 514 case OPT_Wtraditional:
7b086b11 515 cpp_opts->warn_traditional = value;
18bdccaa
NB
516 break;
517
518 case OPT_Wtrigraphs:
7b086b11 519 cpp_opts->warn_trigraphs = value;
18bdccaa
NB
520 break;
521
522 case OPT_Wundef:
7b086b11 523 cpp_opts->warn_undef = value;
0b6f2917
NB
524 break;
525
526 case OPT_Wunknown_pragmas:
527 /* Set to greater than 1, so that even unknown pragmas in
2f6e4e97 528 system headers will be warned about. */
7b086b11 529 warn_unknown_pragmas = value * 2;
0b6f2917
NB
530 break;
531
18bdccaa 532 case OPT_Wunused_macros:
7b086b11 533 warn_unused_macros = value;
18bdccaa
NB
534 break;
535
e5b79219
RH
536 case OPT_Wvariadic_macros:
537 warn_variadic_macros = value;
538 break;
539
0b6f2917 540 case OPT_Wwrite_strings:
cfb10bd3 541 warn_write_strings = value;
0b6f2917 542 break;
2f6e4e97 543
efee9ded
GDR
544 case OPT_Weffc__:
545 warn_ecpp = value;
546 if (value)
547 warn_nonvdtor = true;
548 break;
549
f749a36b 550 case OPT_ansi:
37fa72e9 551 if (!c_dialect_cxx ())
f749a36b
NB
552 set_std_c89 (false, true);
553 else
554 set_std_cxx98 (true);
555 break;
0b6f2917 556
4b7091eb
NB
557 case OPT_d:
558 handle_OPT_d (arg);
559 break;
560
0b6f2917 561 case OPT_fcond_mismatch:
37fa72e9 562 if (!c_dialect_cxx ())
0b6f2917 563 {
7b086b11 564 flag_cond_mismatch = value;
0b6f2917
NB
565 break;
566 }
567 /* Fall through. */
568
569 case OPT_fall_virtual:
7813d14c 570 case OPT_falt_external_templates:
0b6f2917 571 case OPT_fenum_int_equiv:
7813d14c 572 case OPT_fexternal_templates:
0b6f2917
NB
573 case OPT_fguiding_decls:
574 case OPT_fhonor_std:
575 case OPT_fhuge_objects:
576 case OPT_flabels_ok:
fef3106c 577 case OPT_fname_mangling_version_:
0b6f2917
NB
578 case OPT_fnew_abi:
579 case OPT_fnonnull_objects:
580 case OPT_fsquangle:
581 case OPT_fstrict_prototype:
582 case OPT_fthis_is_variable:
583 case OPT_fvtable_thunks:
584 case OPT_fxref:
a0c8285b 585 case OPT_fvtable_gc:
d4ee4d25 586 warning (0, "switch %qs is no longer supported", option->opt_text);
0b6f2917
NB
587 break;
588
589 case OPT_faccess_control:
7b086b11 590 flag_access_control = value;
0b6f2917
NB
591 break;
592
0b6f2917 593 case OPT_fasm:
7b086b11 594 flag_no_asm = !value;
0b6f2917
NB
595 break;
596
597 case OPT_fbuiltin:
7b086b11 598 flag_no_builtin = !value;
0b6f2917
NB
599 break;
600
601 case OPT_fbuiltin_:
7b086b11 602 if (value)
4b7091eb
NB
603 result = 0;
604 else
605 disable_builtin_function (arg);
0b6f2917
NB
606 break;
607
608 case OPT_fdollars_in_identifiers:
7b086b11 609 cpp_opts->dollars_in_ident = value;
0b6f2917
NB
610 break;
611
0b6f2917 612 case OPT_ffreestanding:
7b086b11 613 value = !value;
938d968e 614 /* Fall through.... */
0b6f2917 615 case OPT_fhosted:
7b086b11
NB
616 flag_hosted = value;
617 flag_no_builtin = !value;
0b6f2917 618 /* warn_main will be 2 if set by -Wall, 1 if set by -Wmain */
7b086b11 619 if (!value && warn_main == 2)
0b6f2917
NB
620 warn_main = 0;
621 break;
622
623 case OPT_fshort_double:
7b086b11 624 flag_short_double = value;
0b6f2917
NB
625 break;
626
627 case OPT_fshort_enums:
7b086b11 628 flag_short_enums = value;
0b6f2917
NB
629 break;
630
631 case OPT_fshort_wchar:
7b086b11 632 flag_short_wchar = value;
0b6f2917
NB
633 break;
634
635 case OPT_fsigned_bitfields:
7b086b11 636 flag_signed_bitfields = value;
0b6f2917
NB
637 break;
638
639 case OPT_fsigned_char:
7b086b11 640 flag_signed_char = value;
0b6f2917
NB
641 break;
642
643 case OPT_funsigned_bitfields:
7b086b11 644 flag_signed_bitfields = !value;
0b6f2917
NB
645 break;
646
647 case OPT_funsigned_char:
7b086b11 648 flag_signed_char = !value;
0b6f2917
NB
649 break;
650
651 case OPT_fcheck_new:
7b086b11 652 flag_check_new = value;
0b6f2917
NB
653 break;
654
655 case OPT_fconserve_space:
7b086b11 656 flag_conserve_space = value;
0b6f2917
NB
657 break;
658
fef3106c 659 case OPT_fconstant_string_class_:
4b7091eb 660 constant_string_class_name = arg;
0b6f2917
NB
661 break;
662
663 case OPT_fdefault_inline:
7b086b11 664 flag_default_inline = value;
0b6f2917
NB
665 break;
666
667 case OPT_felide_constructors:
7b086b11 668 flag_elide_constructors = value;
0b6f2917
NB
669 break;
670
671 case OPT_fenforce_eh_specs:
7b086b11 672 flag_enforce_eh_specs = value;
0b6f2917
NB
673 break;
674
af15a2fe
JM
675 case OPT_fextended_identifiers:
676 cpp_opts->extended_identifiers = value;
677 break;
678
0b6f2917 679 case OPT_ffor_scope:
7b086b11 680 flag_new_for_scope = value;
0b6f2917
NB
681 break;
682
683 case OPT_fgnu_keywords:
7b086b11 684 flag_no_gnu_keywords = !value;
0b6f2917
NB
685 break;
686
687 case OPT_fgnu_runtime:
7b086b11 688 flag_next_runtime = !value;
0b6f2917
NB
689 break;
690
691 case OPT_fhandle_exceptions:
d4ee4d25 692 warning (0, "-fhandle-exceptions has been renamed -fexceptions (and is now on by default)");
7b086b11 693 flag_exceptions = value;
0b6f2917
NB
694 break;
695
696 case OPT_fimplement_inlines:
7b086b11 697 flag_implement_inlines = value;
0b6f2917
NB
698 break;
699
700 case OPT_fimplicit_inline_templates:
7b086b11 701 flag_implicit_inline_templates = value;
0b6f2917
NB
702 break;
703
704 case OPT_fimplicit_templates:
7b086b11 705 flag_implicit_templates = value;
0b6f2917
NB
706 break;
707
00c8e9f6
MS
708 case OPT_flax_vector_conversions:
709 flag_lax_vector_conversions = value;
710 break;
711
0b6f2917 712 case OPT_fms_extensions:
7b086b11 713 flag_ms_extensions = value;
0b6f2917
NB
714 break;
715
716 case OPT_fnext_runtime:
7b086b11 717 flag_next_runtime = value;
0b6f2917
NB
718 break;
719
264fa2db
ZL
720 case OPT_fnil_receivers:
721 flag_nil_receivers = value;
722 break;
723
0b6f2917 724 case OPT_fnonansi_builtins:
7b086b11 725 flag_no_nonansi_builtin = !value;
0b6f2917
NB
726 break;
727
18bdccaa 728 case OPT_foperator_names:
7b086b11 729 cpp_opts->operator_names = value;
18bdccaa
NB
730 break;
731
0b6f2917 732 case OPT_foptional_diags:
7b086b11 733 flag_optional_diags = value;
0b6f2917
NB
734 break;
735
17211ab5 736 case OPT_fpch_deps:
7b086b11 737 cpp_opts->restore_pch_deps = value;
17211ab5
GK
738 break;
739
c0d578e6
GK
740 case OPT_fpch_preprocess:
741 flag_pch_preprocess = value;
742 break;
743
0b6f2917 744 case OPT_fpermissive:
7b086b11 745 flag_permissive = value;
0b6f2917
NB
746 break;
747
18bdccaa 748 case OPT_fpreprocessed:
7b086b11 749 cpp_opts->preprocessed = value;
18bdccaa
NB
750 break;
751
264fa2db
ZL
752 case OPT_freplace_objc_classes:
753 flag_replace_objc_classes = value;
754 break;
c22cacf3 755
0b6f2917 756 case OPT_frepo:
7b086b11
NB
757 flag_use_repository = value;
758 if (value)
0b6f2917
NB
759 flag_implicit_templates = 0;
760 break;
761
762 case OPT_frtti:
7b086b11 763 flag_rtti = value;
0b6f2917
NB
764 break;
765
18bdccaa 766 case OPT_fshow_column:
7b086b11 767 cpp_opts->show_column = value;
18bdccaa
NB
768 break;
769
0b6f2917 770 case OPT_fstats:
7b086b11 771 flag_detailed_statistics = value;
0b6f2917
NB
772 break;
773
fef3106c 774 case OPT_ftabstop_:
18bdccaa 775 /* It is documented that we silently ignore silly values. */
7b086b11
NB
776 if (value >= 1 && value <= 100)
777 cpp_opts->tabstop = value;
18bdccaa
NB
778 break;
779
e6cc3a24
ZW
780 case OPT_fexec_charset_:
781 cpp_opts->narrow_charset = arg;
782 break;
783
784 case OPT_fwide_exec_charset_:
785 cpp_opts->wide_charset = arg;
786 break;
787
16dd5cfe
EC
788 case OPT_finput_charset_:
789 cpp_opts->input_charset = arg;
790 break;
791
fef3106c 792 case OPT_ftemplate_depth_:
7b086b11 793 max_tinst_depth = value;
0b6f2917
NB
794 break;
795
0b6f2917 796 case OPT_fuse_cxa_atexit:
7b086b11 797 flag_use_cxa_atexit = value;
0b6f2917 798 break;
966541e3 799
c7b5e395
GK
800 case OPT_fuse_cxa_get_exception_ptr:
801 flag_use_cxa_get_exception_ptr = value;
802 break;
c22cacf3 803
d7afec4b
ND
804 case OPT_fvisibility_inlines_hidden:
805 visibility_options.inlines_hidden = value;
806 break;
0b6f2917
NB
807
808 case OPT_fweak:
7b086b11 809 flag_weak = value;
0b6f2917 810 break;
264fa2db 811
40aac948
JM
812 case OPT_fthreadsafe_statics:
813 flag_threadsafe_statics = value;
814 break;
815
264fa2db
ZL
816 case OPT_fzero_link:
817 flag_zero_link = value;
818 break;
0b6f2917
NB
819
820 case OPT_gen_decls:
821 flag_gen_declaration = 1;
822 break;
823
5793b276 824 case OPT_idirafter:
b02398bd 825 add_path (xstrdup (arg), AFTER, 0, true);
5793b276
NB
826 break;
827
255c10b1 828 case OPT_imacros:
23345bbb
NB
829 case OPT_include:
830 defer_opt (code, arg);
831 break;
832
2b6dd222
JM
833 case OPT_imultilib:
834 imultilib = arg;
835 break;
836
5793b276
NB
837 case OPT_iprefix:
838 iprefix = arg;
839 break;
840
4bed3787 841 case OPT_iquote:
b02398bd 842 add_path (xstrdup (arg), QUOTE, 0, true);
4bed3787
MS
843 break;
844
5793b276
NB
845 case OPT_isysroot:
846 sysroot = arg;
847 break;
848
849 case OPT_isystem:
b02398bd 850 add_path (xstrdup (arg), SYSTEM, 0, true);
5793b276
NB
851 break;
852
853 case OPT_iwithprefix:
854 add_prefixed_path (arg, SYSTEM);
855 break;
856
857 case OPT_iwithprefixbefore:
858 add_prefixed_path (arg, BRACKET);
859 break;
860
f749a36b
NB
861 case OPT_lang_asm:
862 cpp_set_lang (parse_in, CLK_ASM);
42ad6c9e 863 cpp_opts->dollars_in_ident = false;
f749a36b
NB
864 break;
865
a67ec6ab
FXC
866 case OPT_lang_fortran:
867 lang_fortran = true;
868 break;
869
f749a36b
NB
870 case OPT_lang_objc:
871 cpp_opts->objc = 1;
872 break;
873
4b7091eb 874 case OPT_nostdinc:
5793b276 875 std_inc = false;
4b7091eb
NB
876 break;
877
fef3106c 878 case OPT_nostdinc__:
5793b276 879 std_cxx_inc = false;
4b7091eb
NB
880 break;
881
b4a93904 882 case OPT_o:
76c3e73e
NB
883 if (!out_fname)
884 out_fname = arg;
b4a93904 885 else
f75d3e11 886 error ("output filename specified twice");
b4a93904
NB
887 break;
888
18bdccaa
NB
889 /* We need to handle the -pedantic switches here, rather than in
890 c_common_post_options, so that a subsequent -Wno-endif-labels
891 is not overridden. */
892 case OPT_pedantic_errors:
893 cpp_opts->pedantic_errors = 1;
938d968e 894 /* Fall through. */
18bdccaa
NB
895 case OPT_pedantic:
896 cpp_opts->pedantic = 1;
897 cpp_opts->warn_endif_labels = 1;
f4e9414e
AO
898 if (warn_pointer_sign == -1)
899 warn_pointer_sign = 1;
89a42ac8
ZW
900 if (warn_overlength_strings == -1)
901 warn_overlength_strings = 1;
18bdccaa
NB
902 break;
903
0b6f2917
NB
904 case OPT_print_objc_runtime_info:
905 print_struct_values = 1;
906 break;
907
3fd30b88
GK
908 case OPT_print_pch_checksum:
909 c_common_print_pch_checksum (stdout);
910 exit_after_options = true;
911 break;
912
b4a93904
NB
913 case OPT_remap:
914 cpp_opts->remap = 1;
0b6f2917
NB
915 break;
916
fef3106c
NB
917 case OPT_std_c__98:
918 case OPT_std_gnu__98:
69723be2
SB
919 if (!preprocessing_asm_p)
920 set_std_cxx98 (code == OPT_std_c__98 /* ISO */);
0b6f2917
NB
921 break;
922
966541e3
DG
923 case OPT_std_c__0x:
924 case OPT_std_gnu__0x:
925 if (!preprocessing_asm_p)
926 set_std_cxx0x (code == OPT_std_c__0x /* ISO */);
927 break;
928
0b6f2917
NB
929 case OPT_std_c89:
930 case OPT_std_iso9899_1990:
b4a93904 931 case OPT_std_iso9899_199409:
69723be2
SB
932 if (!preprocessing_asm_p)
933 set_std_c89 (code == OPT_std_iso9899_199409 /* c94 */, true /* ISO */);
f749a36b
NB
934 break;
935
936 case OPT_std_gnu89:
69723be2
SB
937 if (!preprocessing_asm_p)
938 set_std_c89 (false /* c94 */, false /* ISO */);
0b6f2917
NB
939 break;
940
941 case OPT_std_c99:
942 case OPT_std_c9x:
943 case OPT_std_iso9899_1999:
944 case OPT_std_iso9899_199x:
69723be2
SB
945 if (!preprocessing_asm_p)
946 set_std_c99 (true /* ISO */);
0b6f2917
NB
947 break;
948
0b6f2917
NB
949 case OPT_std_gnu99:
950 case OPT_std_gnu9x:
69723be2
SB
951 if (!preprocessing_asm_p)
952 set_std_c99 (false /* ISO */);
0b6f2917
NB
953 break;
954
4b7091eb
NB
955 case OPT_trigraphs:
956 cpp_opts->trigraphs = 1;
957 break;
958
959 case OPT_traditional_cpp:
960 cpp_opts->traditional = 1;
961 break;
962
0b6f2917
NB
963 case OPT_undef:
964 flag_undef = 1;
965 break;
0b6f2917 966
4b7091eb
NB
967 case OPT_w:
968 cpp_opts->inhibit_warnings = 1;
969 break;
970
971 case OPT_v:
5793b276 972 verbose = true;
4b7091eb
NB
973 break;
974 }
0b6f2917 975
0b6f2917
NB
976 return result;
977}
978
979/* Post-switch processing. */
980bool
8e9ea4d7 981c_common_post_options (const char **pfilename)
0b6f2917 982{
8e9ea4d7
PB
983 struct cpp_callbacks *cb;
984
460bd0e3 985 /* Canonicalize the input and output filenames. */
d1bd0ded
GK
986 if (in_fnames == NULL)
987 {
5d038c4c 988 in_fnames = XNEWVEC (const char *, 1);
d1bd0ded
GK
989 in_fnames[0] = "";
990 }
991 else if (strcmp (in_fnames[0], "-") == 0)
992 in_fnames[0] = "";
460bd0e3 993
76c3e73e
NB
994 if (out_fname == NULL || !strcmp (out_fname, "-"))
995 out_fname = "";
996
cd79e210 997 if (cpp_opts->deps.style == DEPS_NONE)
76c3e73e
NB
998 check_deps_environment_vars ();
999
f4ff5a69 1000 handle_deferred_opts ();
76c3e73e 1001
f4ff5a69 1002 sanitize_cpp_opts ();
460bd0e3 1003
2b6dd222 1004 register_include_chains (parse_in, sysroot, iprefix, imultilib,
37fa72e9 1005 std_inc, std_cxx_inc && c_dialect_cxx (), verbose);
5793b276 1006
c7b5e395
GK
1007#ifdef C_COMMON_OVERRIDE_OPTIONS
1008 /* Some machines may reject certain combinations of C
1009 language-specific options. */
1010 C_COMMON_OVERRIDE_OPTIONS;
1011#endif
1012
0b6f2917
NB
1013 flag_inline_trees = 1;
1014
6de9cd9a
DN
1015 /* Use tree inlining. */
1016 if (!flag_no_inline)
1017 flag_no_inline = 1;
1018 if (flag_inline_functions)
39afeb1a 1019 flag_inline_trees = 2;
0b6f2917 1020
9affb2c7
ZW
1021 /* If we are given more than one input file, we must use
1022 unit-at-a-time mode. */
1023 if (num_in_fnames > 1)
1024 flag_unit_at_a_time = 1;
1025
093c7153
RH
1026 /* Default to ObjC sjlj exception handling if NeXT runtime. */
1027 if (flag_objc_sjlj_exceptions < 0)
1028 flag_objc_sjlj_exceptions = flag_next_runtime;
1029 if (flag_objc_exceptions && !flag_objc_sjlj_exceptions)
1030 flag_exceptions = 1;
1031
2b001724 1032 /* -Wextra implies -Wclobbered, -Wempty-body, -Wsign-compare,
b1ed4cb4
MLI
1033 -Wmissing-field-initializers, -Wmissing-parameter-type
1034 -Wold-style-declaration, and -Woverride-init,
b3b433c5 1035 but not if explicitly overridden. */
2b001724
MLI
1036 if (warn_clobbered == -1)
1037 warn_clobbered = extra_warnings;
b3b433c5
MLI
1038 if (warn_empty_body == -1)
1039 warn_empty_body = extra_warnings;
87f85ea0
ZW
1040 if (warn_sign_compare == -1)
1041 warn_sign_compare = extra_warnings;
eaac4679
RS
1042 if (warn_missing_field_initializers == -1)
1043 warn_missing_field_initializers = extra_warnings;
cb4af25a
MLI
1044 if (warn_missing_parameter_type == -1)
1045 warn_missing_parameter_type = extra_warnings;
b1ed4cb4
MLI
1046 if (warn_old_style_declaration == -1)
1047 warn_old_style_declaration = extra_warnings;
7ed322d7
JM
1048 if (warn_override_init == -1)
1049 warn_override_init = extra_warnings;
87f85ea0 1050
f4e9414e
AO
1051 /* -Wpointer_sign is disabled by default, but it is enabled if any
1052 of -Wall or -pedantic are given. */
1053 if (warn_pointer_sign == -1)
1054 warn_pointer_sign = 0;
1055
89a42ac8
ZW
1056 /* -Woverlength-strings is off by default, but is enabled by -pedantic.
1057 It is never enabled in C++, as the minimum limit is not normative
1058 in that standard. */
1059 if (warn_overlength_strings == -1 || c_dialect_cxx ())
1060 warn_overlength_strings = 0;
1061
0b6f2917
NB
1062 /* Special format checking options don't work without -Wformat; warn if
1063 they are used. */
44c21c7f
DD
1064 if (!warn_format)
1065 {
1066 warning (OPT_Wformat_y2k,
1067 "-Wformat-y2k ignored without -Wformat");
1068 warning (OPT_Wformat_extra_args,
1069 "-Wformat-extra-args ignored without -Wformat");
1070 warning (OPT_Wformat_zero_length,
1071 "-Wformat-zero-length ignored without -Wformat");
1072 warning (OPT_Wformat_nonliteral,
1073 "-Wformat-nonliteral ignored without -Wformat");
1074 warning (OPT_Wformat_security,
1075 "-Wformat-security ignored without -Wformat");
44c21c7f 1076 }
0b6f2917 1077
c7463669
RH
1078 /* C99 requires special handling of complex multiplication and division;
1079 -ffast-math and -fcx-limited-range are handled in process_options. */
1080 if (flag_isoc99)
1081 flag_complex_method = 2;
1082
460bd0e3
NB
1083 if (flag_preprocess_only)
1084 {
63973df3
NB
1085 /* Open the output now. We must do so even if flag_no_output is
1086 on, because there may be other output than from the actual
1087 preprocessing (e.g. from -dM). */
1088 if (out_fname[0] == '\0')
1089 out_stream = stdout;
1090 else
1091 out_stream = fopen (out_fname, "w");
1092
1093 if (out_stream == NULL)
9d10c9a9 1094 {
fa6ef813 1095 fatal_error ("opening output file %s: %m", out_fname);
c366ade5 1096 return false;
9d10c9a9 1097 }
63973df3 1098
d1bd0ded
GK
1099 if (num_in_fnames > 1)
1100 error ("too many filenames given. Type %s --help for usage",
1101 progname);
1102
9d10c9a9 1103 init_pp_output (out_stream);
460bd0e3 1104 }
9d10c9a9
NB
1105 else
1106 {
1107 init_c_lex ();
460bd0e3 1108
9d10c9a9 1109 /* Yuk. WTF is this? I do know ObjC relies on it somewhere. */
3c20847b 1110 input_location = UNKNOWN_LOCATION;
9d10c9a9 1111 }
63973df3 1112
8e9ea4d7
PB
1113 cb = cpp_get_callbacks (parse_in);
1114 cb->file_change = cb_file_change;
1115 cb->dir_change = cb_dir_change;
4169c321 1116 cpp_post_options (parse_in);
23345bbb 1117
3c20847b 1118 input_location = UNKNOWN_LOCATION;
4bfec483
NB
1119
1120 /* If an error has occurred in cpplib, note it so we fail
1121 immediately. */
1122 errorcount += cpp_errors (parse_in);
1123
8e9ea4d7
PB
1124 *pfilename = this_input_filename
1125 = cpp_read_main_file (parse_in, in_fnames[0]);
540554f4 1126 /* Don't do any compilation or preprocessing if there is no input file. */
8e9ea4d7 1127 if (this_input_filename == NULL)
540554f4
JW
1128 {
1129 errorcount++;
1130 return false;
1131 }
8e9ea4d7 1132
8a4baa83 1133 if (flag_working_directory
3f75a254 1134 && flag_preprocess_only && !flag_no_line_commands)
8e9ea4d7
PB
1135 pp_dir_change (parse_in, get_src_pwd ());
1136
4bfec483
NB
1137 return flag_preprocess_only;
1138}
1139
1140/* Front end initialization common to C, ObjC and C++. */
1141bool
2f6e4e97 1142c_common_init (void)
4bfec483 1143{
4bfec483
NB
1144 /* Set up preprocessor arithmetic. Must be done after call to
1145 c_common_nodes_and_builtins for type nodes to be good. */
1146 cpp_opts->precision = TYPE_PRECISION (intmax_type_node);
1147 cpp_opts->char_precision = TYPE_PRECISION (char_type_node);
1148 cpp_opts->int_precision = TYPE_PRECISION (integer_type_node);
1149 cpp_opts->wchar_precision = TYPE_PRECISION (wchar_type_node);
8df83eae 1150 cpp_opts->unsigned_wchar = TYPE_UNSIGNED (wchar_type_node);
e6cc3a24
ZW
1151 cpp_opts->bytes_big_endian = BYTES_BIG_ENDIAN;
1152
1153 /* This can't happen until after wchar_precision and bytes_big_endian
1154 are known. */
1155 cpp_init_iconv (parse_in);
460bd0e3 1156
3fd30b88
GK
1157 if (version_flag)
1158 c_common_print_pch_checksum (stderr);
1159
9d10c9a9
NB
1160 if (flag_preprocess_only)
1161 {
8e9ea4d7
PB
1162 finish_options ();
1163 preprocess_file (parse_in);
4bfec483 1164 return false;
9d10c9a9
NB
1165 }
1166
63973df3 1167 /* Has to wait until now so that cpplib has its hash table. */
460bd0e3
NB
1168 init_pragma ();
1169
4bfec483 1170 return true;
76c3e73e
NB
1171}
1172
d1bd0ded
GK
1173/* Initialize the integrated preprocessor after debug output has been
1174 initialized; loop over each input file. */
23345bbb 1175void
f75fbaf7 1176c_common_parse_file (int set_yydebug)
23345bbb 1177{
9affb2c7
ZW
1178 unsigned int i;
1179
f75fbaf7 1180 if (set_yydebug)
566c6181
ZW
1181 switch (c_language)
1182 {
1183 case clk_c:
1184 warning(0, "The C parser does not support -dy, option ignored");
1185 break;
1186 case clk_objc:
1187 warning(0,
1188 "The Objective-C parser does not support -dy, option ignored");
1189 break;
1190 case clk_cxx:
1191 warning(0, "The C++ parser does not support -dy, option ignored");
1192 break;
1193 case clk_objcxx:
1194 warning(0,
1195 "The Objective-C++ parser does not support -dy, option ignored");
1196 break;
1197 default:
1198 gcc_unreachable ();
1199 }
23345bbb 1200
9affb2c7
ZW
1201 i = 0;
1202 for (;;)
1203 {
9e9945c5
DB
1204 /* Start the main input file, if the debug writer wants it. */
1205 if (debug_hooks->start_end_main_source_file)
1206 (*debug_hooks->start_source_file) (0, this_input_filename);
9affb2c7
ZW
1207 finish_options ();
1208 pch_init ();
1209 push_file_scope ();
1210 c_parse_file ();
1211 finish_file ();
1212 pop_file_scope ();
9e9945c5
DB
1213 /* And end the main input file, if the debug writer wants it */
1214 if (debug_hooks->start_end_main_source_file)
1215 (*debug_hooks->end_source_file) (0);
9affb2c7
ZW
1216 if (++i >= num_in_fnames)
1217 break;
1218 cpp_undef_all (parse_in);
1219 this_input_filename
1220 = cpp_read_main_file (parse_in, in_fnames[i]);
1221 /* If an input file is missing, abandon further compilation.
c22cacf3 1222 cpplib has issued a diagnostic. */
9affb2c7
ZW
1223 if (!this_input_filename)
1224 break;
1225 }
23345bbb
NB
1226}
1227
76c3e73e
NB
1228/* Common finish hook for the C, ObjC and C++ front ends. */
1229void
2f6e4e97 1230c_common_finish (void)
76c3e73e
NB
1231{
1232 FILE *deps_stream = NULL;
1233
f4ff5a69 1234 if (cpp_opts->deps.style != DEPS_NONE)
76c3e73e
NB
1235 {
1236 /* If -M or -MM was seen without -MF, default output to the
1237 output stream. */
f4ff5a69 1238 if (!deps_file)
76c3e73e
NB
1239 deps_stream = out_stream;
1240 else
1241 {
f4ff5a69 1242 deps_stream = fopen (deps_file, deps_append ? "a": "w");
76c3e73e 1243 if (!deps_stream)
fa6ef813 1244 fatal_error ("opening dependency file %s: %m", deps_file);
76c3e73e
NB
1245 }
1246 }
1247
1248 /* For performance, avoid tearing down cpplib's internal structures
1249 with cpp_destroy (). */
1250 errorcount += cpp_finish (parse_in, deps_stream);
1251
1252 if (deps_stream && deps_stream != out_stream
1253 && (ferror (deps_stream) || fclose (deps_stream)))
fa6ef813 1254 fatal_error ("closing dependency file %s: %m", deps_file);
76c3e73e
NB
1255
1256 if (out_stream && (ferror (out_stream) || fclose (out_stream)))
fa6ef813 1257 fatal_error ("when writing output to %s: %m", out_fname);
76c3e73e
NB
1258}
1259
76c3e73e
NB
1260/* Either of two environment variables can specify output of
1261 dependencies. Their value is either "OUTPUT_FILE" or "OUTPUT_FILE
1262 DEPS_TARGET", where OUTPUT_FILE is the file to write deps info to
1263 and DEPS_TARGET is the target to mention in the deps. They also
1264 result in dependency information being appended to the output file
182d89a3
NB
1265 rather than overwriting it, and like Sun's compiler
1266 SUNPRO_DEPENDENCIES suppresses the dependency on the main file. */
76c3e73e 1267static void
2f6e4e97 1268check_deps_environment_vars (void)
76c3e73e
NB
1269{
1270 char *spec;
1271
1272 GET_ENVIRONMENT (spec, "DEPENDENCIES_OUTPUT");
1273 if (spec)
f4ff5a69 1274 cpp_opts->deps.style = DEPS_USER;
76c3e73e
NB
1275 else
1276 {
1277 GET_ENVIRONMENT (spec, "SUNPRO_DEPENDENCIES");
1278 if (spec)
182d89a3
NB
1279 {
1280 cpp_opts->deps.style = DEPS_SYSTEM;
1281 cpp_opts->deps.ignore_main_file = true;
1282 }
76c3e73e
NB
1283 }
1284
1285 if (spec)
1286 {
1287 /* Find the space before the DEPS_TARGET, if there is one. */
1288 char *s = strchr (spec, ' ');
1289 if (s)
1290 {
1291 /* Let the caller perform MAKE quoting. */
f4ff5a69 1292 defer_opt (OPT_MT, s + 1);
76c3e73e
NB
1293 *s = '\0';
1294 }
1295
1296 /* Command line -MF overrides environment variables and default. */
f4ff5a69
NB
1297 if (!deps_file)
1298 deps_file = spec;
76c3e73e 1299
f4ff5a69 1300 deps_append = 1;
1b3c8f46 1301 deps_seen = true;
f4ff5a69
NB
1302 }
1303}
1304
1305/* Handle deferred command line switches. */
1306static void
2f6e4e97 1307handle_deferred_opts (void)
f4ff5a69
NB
1308{
1309 size_t i;
c6e83800
ZW
1310 struct deps *deps;
1311
1312 /* Avoid allocating the deps buffer if we don't need it.
1313 (This flag may be true without there having been -MT or -MQ
1314 options, but we'll still need the deps buffer.) */
1315 if (!deps_seen)
1316 return;
1317
1318 deps = cpp_get_deps (parse_in);
f4ff5a69
NB
1319
1320 for (i = 0; i < deferred_count; i++)
1321 {
1322 struct deferred_opt *opt = &deferred_opts[i];
1323
c1bad961 1324 if (opt->code == OPT_MT || opt->code == OPT_MQ)
c6e83800 1325 deps_add_target (deps, opt->arg, opt->code == OPT_MQ);
f4ff5a69 1326 }
f4ff5a69
NB
1327}
1328
1329/* These settings are appropriate for GCC, but not necessarily so for
1330 cpplib as a library. */
1331static void
2f6e4e97 1332sanitize_cpp_opts (void)
f4ff5a69
NB
1333{
1334 /* If we don't know what style of dependencies to output, complain
1335 if any other dependency switches have been given. */
1336 if (deps_seen && cpp_opts->deps.style == DEPS_NONE)
1337 error ("to generate dependencies you must specify either -M or -MM");
1338
1339 /* -dM and dependencies suppress normal output; do it here so that
1340 the last -d[MDN] switch overrides earlier ones. */
63973df3
NB
1341 if (flag_dump_macros == 'M')
1342 flag_no_output = 1;
f4ff5a69
NB
1343
1344 /* Disable -dD, -dN and -dI if normal output is suppressed. Allow
1345 -dM since at least glibc relies on -M -dM to work. */
6c6cfbfd 1346 /* Also, flag_no_output implies flag_no_line_commands, always. */
63973df3 1347 if (flag_no_output)
f4ff5a69 1348 {
63973df3
NB
1349 if (flag_dump_macros != 'M')
1350 flag_dump_macros = 0;
1351 flag_dump_includes = 0;
f9c65623 1352 flag_no_line_commands = 1;
76c3e73e 1353 }
f4ff5a69
NB
1354
1355 cpp_opts->unsigned_char = !flag_signed_char;
1356 cpp_opts->stdc_0_in_system_headers = STDC_0_IN_SYSTEM_HEADERS;
1357
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);
b20d9f0c 1362
e5b79219
RH
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);
1367
b20d9f0c
AO
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);
f4ff5a69
NB
1374}
1375
5793b276
NB
1376/* Add include path with a prefix at the front of its name. */
1377static void
2f6e4e97 1378add_prefixed_path (const char *suffix, size_t chain)
5793b276 1379{
52999738 1380 char *path;
5793b276 1381 const char *prefix;
52999738 1382 size_t prefix_len, suffix_len;
5793b276 1383
52999738
ZW
1384 suffix_len = strlen (suffix);
1385 prefix = iprefix ? iprefix : cpp_GCC_INCLUDE_DIR;
1386 prefix_len = iprefix ? strlen (iprefix) : cpp_GCC_INCLUDE_DIR_len;
1387
5d038c4c 1388 path = (char *) xmalloc (prefix_len + suffix_len + 1);
52999738
ZW
1389 memcpy (path, prefix, prefix_len);
1390 memcpy (path + prefix_len, suffix, suffix_len);
1391 path[prefix_len + suffix_len] = '\0';
1392
b02398bd 1393 add_path (path, chain, 0, false);
5793b276
NB
1394}
1395
8e9ea4d7
PB
1396/* Handle -D, -U, -A, -imacros, and the first -include. */
1397static void
1398finish_options (void)
255c10b1 1399{
255c10b1
NB
1400 if (!cpp_opts->preprocessed)
1401 {
c1bad961
NB
1402 size_t i;
1403
1fb2fbeb
PB
1404 cb_file_change (parse_in,
1405 linemap_add (&line_table, LC_RENAME, 0,
1406 _("<built-in>"), 0));
1407
6e270179 1408 cpp_init_builtins (parse_in, flag_hosted);
c1bad961 1409 c_cpp_builtins (parse_in);
78b8811a
HPN
1410
1411 /* We're about to send user input to cpplib, so make it warn for
1412 things that we previously (when we sent it internal definitions)
1413 told it to not warn.
1414
1415 C99 permits implementation-defined characters in identifiers.
1416 The documented meaning of -std= is to turn off extensions that
1417 conflict with the specified standard, and since a strictly
1418 conforming program cannot contain a '$', we do not condition
1419 their acceptance on the -std= setting. */
1420 cpp_opts->warn_dollars = (cpp_opts->pedantic && !cpp_opts->c99);
1421
112598f4
PB
1422 cb_file_change (parse_in,
1423 linemap_add (&line_table, LC_RENAME, 0,
1424 _("<command-line>"), 0));
1425
c1bad961
NB
1426 for (i = 0; i < deferred_count; i++)
1427 {
1428 struct deferred_opt *opt = &deferred_opts[i];
1429
1430 if (opt->code == OPT_D)
1431 cpp_define (parse_in, opt->arg);
1432 else if (opt->code == OPT_U)
1433 cpp_undef (parse_in, opt->arg);
1434 else if (opt->code == OPT_A)
1435 {
1436 if (opt->arg[0] == '-')
1437 cpp_unassert (parse_in, opt->arg + 1);
1438 else
1439 cpp_assert (parse_in, opt->arg);
1440 }
1441 }
255c10b1 1442
c1bad961 1443 /* Handle -imacros after -D and -U. */
255c10b1
NB
1444 for (i = 0; i < deferred_count; i++)
1445 {
1446 struct deferred_opt *opt = &deferred_opts[i];
1447
1448 if (opt->code == OPT_imacros
1449 && cpp_push_include (parse_in, opt->arg))
9b49a0aa 1450 {
6614fd40 1451 /* Disable push_command_line_include callback for now. */
9b49a0aa
PB
1452 include_cursor = deferred_count + 1;
1453 cpp_scan_nooutput (parse_in);
1454 }
255c10b1
NB
1455 }
1456 }
1457
e6ebd07b 1458 include_cursor = 0;
255c10b1
NB
1459 push_command_line_include ();
1460}
1461
23345bbb
NB
1462/* Give CPP the next file given by -include, if any. */
1463static void
2f6e4e97 1464push_command_line_include (void)
23345bbb 1465{
23345bbb
NB
1466 while (include_cursor < deferred_count)
1467 {
1468 struct deferred_opt *opt = &deferred_opts[include_cursor++];
2f6e4e97 1469
3f75a254 1470 if (!cpp_opts->preprocessed && opt->code == OPT_include
31703a61 1471 && cpp_push_include (parse_in, opt->arg))
23345bbb
NB
1472 return;
1473 }
1474
1475 if (include_cursor == deferred_count)
1476 {
31703a61 1477 include_cursor++;
23345bbb
NB
1478 /* -Wunused-macros should only warn about macros defined hereafter. */
1479 cpp_opts->warn_unused_macros = warn_unused_macros;
8e9ea4d7 1480 /* Restore the line map from <command line>. */
3f75a254 1481 if (!cpp_opts->preprocessed)
3e6da82b 1482 cpp_change_file (parse_in, LC_RENAME, this_input_filename);
8e9ea4d7
PB
1483
1484 /* Set this here so the client can change the option if it wishes,
1485 and after stacking the main file so we don't trace the main file. */
1486 line_table.trace_includes = cpp_opts->print_include_names;
23345bbb
NB
1487 }
1488}
1489
1490/* File change callback. Has to handle -include files. */
1491static void
e18476eb 1492cb_file_change (cpp_reader * ARG_UNUSED (pfile),
2f6e4e97 1493 const struct line_map *new_map)
23345bbb
NB
1494{
1495 if (flag_preprocess_only)
1496 pp_file_change (new_map);
1497 else
1498 fe_file_change (new_map);
1499
31703a61 1500 if (new_map == 0 || (new_map->reason == LC_LEAVE && MAIN_FILE_P (new_map)))
23345bbb
NB
1501 push_command_line_include ();
1502}
1503
8e9ea4d7 1504void
e18476eb 1505cb_dir_change (cpp_reader * ARG_UNUSED (pfile), const char *dir)
8e9ea4d7 1506{
3f75a254 1507 if (!set_src_pwd (dir))
d4ee4d25 1508 warning (0, "too late for # directive to set debug directory");
8e9ea4d7
PB
1509}
1510
f4ff5a69
NB
1511/* Set the C 89 standard (with 1994 amendments if C94, without GNU
1512 extensions if ISO). There is no concept of gnu94. */
1513static void
2f6e4e97 1514set_std_c89 (int c94, int iso)
f4ff5a69
NB
1515{
1516 cpp_set_lang (parse_in, c94 ? CLK_STDC94: iso ? CLK_STDC89: CLK_GNUC89);
1517 flag_iso = iso;
1518 flag_no_asm = iso;
1519 flag_no_gnu_keywords = iso;
1520 flag_no_nonansi_builtin = iso;
f4ff5a69
NB
1521 flag_isoc94 = c94;
1522 flag_isoc99 = 0;
76c3e73e
NB
1523}
1524
b4a93904
NB
1525/* Set the C 99 standard (without GNU extensions if ISO). */
1526static void
2f6e4e97 1527set_std_c99 (int iso)
b4a93904
NB
1528{
1529 cpp_set_lang (parse_in, iso ? CLK_STDC99: CLK_GNUC99);
1530 flag_no_asm = iso;
1531 flag_no_nonansi_builtin = iso;
b4a93904
NB
1532 flag_iso = iso;
1533 flag_isoc99 = 1;
1534 flag_isoc94 = 1;
b4a93904
NB
1535}
1536
f749a36b
NB
1537/* Set the C++ 98 standard (without GNU extensions if ISO). */
1538static void
2f6e4e97 1539set_std_cxx98 (int iso)
f749a36b
NB
1540{
1541 cpp_set_lang (parse_in, iso ? CLK_CXX98: CLK_GNUCXX);
1542 flag_no_gnu_keywords = iso;
1543 flag_no_nonansi_builtin = iso;
f749a36b
NB
1544 flag_iso = iso;
1545}
1546
966541e3
DG
1547/* Set the C++ 0x working draft "standard" (without GNU extensions if ISO). */
1548static void
1549set_std_cxx0x (int iso)
1550{
1551 cpp_set_lang (parse_in, iso ? CLK_CXX0X: CLK_GNUCXX0X);
1552 flag_no_gnu_keywords = iso;
1553 flag_no_nonansi_builtin = iso;
1554 flag_iso = iso;
1555 flag_cpp0x = 1;
1556}
1557
0b6f2917
NB
1558/* Handle setting implicit to ON. */
1559static void
2f6e4e97 1560set_Wimplicit (int on)
0b6f2917
NB
1561{
1562 warn_implicit = on;
1563 warn_implicit_int = on;
1564 if (on)
1565 {
1566 if (mesg_implicit_function_declaration != 2)
1567 mesg_implicit_function_declaration = 1;
1568 }
1569 else
1570 mesg_implicit_function_declaration = 0;
1571}
1572
4b7091eb 1573/* Args to -d specify what to dump. Silently ignore
05713b80 1574 unrecognized options; they may be aimed at toplev.c. */
0b6f2917 1575static void
2f6e4e97 1576handle_OPT_d (const char *arg)
0b6f2917 1577{
4b7091eb
NB
1578 char c;
1579
1580 while ((c = *arg++) != '\0')
1581 switch (c)
1582 {
63973df3
NB
1583 case 'M': /* Dump macros only. */
1584 case 'N': /* Dump names. */
1585 case 'D': /* Dump definitions. */
1586 flag_dump_macros = c;
4b7091eb
NB
1587 break;
1588
1589 case 'I':
63973df3 1590 flag_dump_includes = 1;
4b7091eb
NB
1591 break;
1592 }
0b6f2917 1593}
This page took 1.105106 seconds and 5 git commands to generate.