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