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