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