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
6This file is part of GCC.
7
8GCC is free software; you can redistribute it and/or modify it under
9the terms of the GNU General Public License as published by the Free
10Software Foundation; either version 2, or (at your option) any later
11version.
12
13GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14WARRANTY; without even the implied warranty of MERCHANTABILITY or
15FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16for more details.
17
18You should have received a copy of the GNU General Public License
19along with GCC; see the file COPYING.  If not, write to the Free
20Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
2102110-1301, USA.  */
22
23/* $FreeBSD$ */
24/* Merged C99 inline changes from gcc trunk 122565 2007-03-05 */
25
26#include "config.h"
27#include "system.h"
28#include "coretypes.h"
29#include "tm.h"
30#include "tree.h"
31#include "c-common.h"
32#include "c-pragma.h"
33#include "flags.h"
34#include "toplev.h"
35#include "langhooks.h"
36#include "tree-inline.h"
37#include "diagnostic.h"
38#include "intl.h"
39#include "cppdefault.h"
40#include "c-incpath.h"
41#include "debug.h"		/* For debug_hooks.  */
42#include "opts.h"
43#include "options.h"
44#include "mkdeps.h"
45
46#ifndef DOLLARS_IN_IDENTIFIERS
47# define DOLLARS_IN_IDENTIFIERS true
48#endif
49
50#ifndef TARGET_SYSTEM_ROOT
51# define TARGET_SYSTEM_ROOT NULL
52#endif
53
54#ifndef TARGET_OPTF
55#define TARGET_OPTF(ARG)
56#endif
57
58/* CPP's options.  */
59static cpp_options *cpp_opts;
60
61/* Input filename.  */
62static const char *this_input_filename;
63
64/* Filename and stream for preprocessed output.  */
65static const char *out_fname;
66static FILE *out_stream;
67
68/* Append dependencies to deps_file.  */
69static bool deps_append;
70
71/* If dependency switches (-MF etc.) have been given.  */
72static bool deps_seen;
73
74/* If -v seen.  */
75static bool verbose;
76
77/* If -lang-fortran seen.  */
78static bool lang_fortran = false;
79
80/* Dependency output file.  */
81static const char *deps_file;
82
83/* The prefix given by -iprefix, if any.  */
84static const char *iprefix;
85
86/* The multilib directory given by -imultilib, if any.  */
87static const char *imultilib;
88
89/* The system root, if any.  Overridden by -isysroot.  */
90static const char *sysroot = TARGET_SYSTEM_ROOT;
91
92/* Zero disables all standard directories for headers.  */
93static bool std_inc = true;
94
95/* Zero disables the C++-specific standard directories for headers.  */
96static bool std_cxx_inc = true;
97
98/* If the quote chain has been split by -I-.  */
99static bool quote_chain_split;
100
101/* If -Wunused-macros.  */
102static bool warn_unused_macros;
103
104/* If -Wvariadic-macros.  */
105static bool warn_variadic_macros = true;
106
107/* Number of deferred options.  */
108static size_t deferred_count;
109
110/* Number of deferred options scanned for -include.  */
111static size_t include_cursor;
112
113static void set_Wimplicit (int);
114static void handle_OPT_d (const char *);
115static void set_std_cxx98 (int);
116static void set_std_c89 (int, int);
117static void set_std_c99 (int);
118static void check_deps_environment_vars (void);
119static void handle_deferred_opts (void);
120static void sanitize_cpp_opts (void);
121static void add_prefixed_path (const char *, size_t);
122static void push_command_line_include (void);
123static void cb_file_change (cpp_reader *, const struct line_map *);
124static void cb_dir_change (cpp_reader *, const char *);
125static void finish_options (void);
126
127#ifndef STDC_0_IN_SYSTEM_HEADERS
128#define STDC_0_IN_SYSTEM_HEADERS 0
129#endif
130
131/* Holds switches parsed by c_common_handle_option (), but whose
132   handling is deferred to c_common_post_options ().  */
133static void defer_opt (enum opt_code, const char *);
134static struct deferred_opt
135{
136  enum opt_code code;
137  const char *arg;
138} *deferred_opts;
139
140/* Complain that switch CODE expects an argument but none was
141   provided.  OPT was the command-line option.  Return FALSE to get
142   the default message in opts.c, TRUE if we provide a specialized
143   one.  */
144bool
145c_common_missing_argument (const char *opt, size_t code)
146{
147  switch (code)
148    {
149    default:
150      /* Pick up the default message.  */
151      return false;
152
153    case OPT_fconstant_string_class_:
154      error ("no class name specified with %qs", opt);
155      break;
156
157    case OPT_A:
158      error ("assertion missing after %qs", opt);
159      break;
160
161    case OPT_D:
162    case OPT_U:
163      error ("macro name missing after %qs", opt);
164      break;
165
166    case OPT_F:
167    case OPT_I:
168    case OPT_idirafter:
169    case OPT_isysroot:
170    case OPT_isystem:
171    case OPT_iquote:
172      error ("missing path after %qs", opt);
173      break;
174
175    case OPT_MF:
176    case OPT_MD:
177    case OPT_MMD:
178    case OPT_include:
179    case OPT_imacros:
180    case OPT_o:
181      error ("missing filename after %qs", opt);
182      break;
183
184    case OPT_MQ:
185    case OPT_MT:
186      error ("missing makefile target after %qs", opt);
187      break;
188    }
189
190  return true;
191}
192
193/* Defer option CODE with argument ARG.  */
194static void
195defer_opt (enum opt_code code, const char *arg)
196{
197  deferred_opts[deferred_count].code = code;
198  deferred_opts[deferred_count].arg = arg;
199  deferred_count++;
200}
201
202/* Common initialization before parsing options.  */
203unsigned int
204c_common_init_options (unsigned int argc, const char **argv)
205{
206  static const unsigned int lang_flags[] = {CL_C, CL_ObjC, CL_CXX, CL_ObjCXX};
207  unsigned int i, result;
208
209  /* This is conditionalized only because that is the way the front
210     ends used to do it.  Maybe this should be unconditional?  */
211  if (c_dialect_cxx ())
212    {
213      /* By default wrap lines at 80 characters.  Is getenv
214	 ("COLUMNS") preferable?  */
215      diagnostic_line_cutoff (global_dc) = 80;
216      /* By default, emit location information once for every
217	 diagnostic message.  */
218      diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
219    }
220
221  parse_in = cpp_create_reader (c_dialect_cxx () ? CLK_GNUCXX: CLK_GNUC89,
222				ident_hash, &line_table);
223
224  cpp_opts = cpp_get_options (parse_in);
225  cpp_opts->dollars_in_ident = DOLLARS_IN_IDENTIFIERS;
226  cpp_opts->objc = c_dialect_objc ();
227
228  /* Reset to avoid warnings on internal definitions.  We set it just
229     before passing on command-line options to cpplib.  */
230  cpp_opts->warn_dollars = 0;
231
232  flag_exceptions = c_dialect_cxx ();
233  warn_pointer_arith = c_dialect_cxx ();
234  warn_write_strings = c_dialect_cxx();
235
236  deferred_opts = XNEWVEC (struct deferred_opt, argc);
237
238  result = lang_flags[c_language];
239
240  if (c_language == clk_c)
241    {
242      /* If preprocessing assembly language, accept any of the C-family
243	 front end options since the driver may pass them through.  */
244      for (i = 1; i < argc; i++)
245	if (! strcmp (argv[i], "-lang-asm"))
246	  {
247	    result |= CL_C | CL_ObjC | CL_CXX | CL_ObjCXX;
248	    break;
249	  }
250
251#ifdef CL_Fortran
252      for (i = 1; i < argc; i++)
253	if (! strcmp (argv[i], "-lang-fortran"))
254	{
255	    result |= CL_Fortran;
256	    break;
257	}
258#endif
259    }
260
261  return result;
262}
263
264/* Handle switch SCODE with argument ARG.  VALUE is true, unless no-
265   form of an -f or -W option was given.  Returns 0 if the switch was
266   invalid, a negative number to prevent language-independent
267   processing in toplev.c (a hack necessary for the short-term).  */
268int
269c_common_handle_option (size_t scode, const char *arg, int value)
270{
271  const struct cl_option *option = &cl_options[scode];
272  enum opt_code code = (enum opt_code) scode;
273  int result = 1;
274
275  /* Prevent resetting the language standard to a C dialect when the driver
276     has already determined that we're looking at assembler input.  */
277  bool preprocessing_asm_p = (cpp_get_options (parse_in)->lang == CLK_ASM);
278
279  switch (code)
280    {
281    default:
282      if (cl_options[code].flags & (CL_C | CL_CXX | CL_ObjC | CL_ObjCXX))
283	break;
284#ifdef CL_Fortran
285      if (lang_fortran && (cl_options[code].flags & (CL_Fortran)))
286	break;
287#endif
288      result = 0;
289      break;
290
291    case OPT__output_pch_:
292      pch_file = arg;
293      break;
294
295    case OPT_A:
296      defer_opt (code, arg);
297      break;
298
299    case OPT_C:
300      cpp_opts->discard_comments = 0;
301      break;
302
303    case OPT_CC:
304      cpp_opts->discard_comments = 0;
305      cpp_opts->discard_comments_in_macro_exp = 0;
306      break;
307
308    case OPT_D:
309      defer_opt (code, arg);
310      break;
311
312    case OPT_E:
313      flag_preprocess_only = 1;
314      break;
315
316    case OPT_H:
317      cpp_opts->print_include_names = 1;
318      break;
319
320    case OPT_F:
321      TARGET_OPTF (xstrdup (arg));
322      break;
323
324    case OPT_I:
325      if (strcmp (arg, "-"))
326	add_path (xstrdup (arg), BRACKET, 0, true);
327      else
328	{
329	  if (quote_chain_split)
330	    error ("-I- specified twice");
331	  quote_chain_split = true;
332	  split_quote_chain ();
333	  inform ("obsolete option -I- used, please use -iquote instead");
334	}
335      break;
336
337    case OPT_M:
338    case OPT_MM:
339      /* When doing dependencies with -M or -MM, suppress normal
340	 preprocessed output, but still do -dM etc. as software
341	 depends on this.  Preprocessed output does occur if -MD, -MMD
342	 or environment var dependency generation is used.  */
343      cpp_opts->deps.style = (code == OPT_M ? DEPS_SYSTEM: DEPS_USER);
344      flag_no_output = 1;
345      cpp_opts->inhibit_warnings = 1;
346      break;
347
348    case OPT_MD:
349    case OPT_MMD:
350      cpp_opts->deps.style = (code == OPT_MD ? DEPS_SYSTEM: DEPS_USER);
351      deps_file = arg;
352      break;
353
354    case OPT_MF:
355      deps_seen = true;
356      deps_file = arg;
357      break;
358
359    case OPT_MG:
360      deps_seen = true;
361      cpp_opts->deps.missing_files = true;
362      break;
363
364    case OPT_MP:
365      deps_seen = true;
366      cpp_opts->deps.phony_targets = true;
367      break;
368
369    case OPT_MQ:
370    case OPT_MT:
371      deps_seen = true;
372      defer_opt (code, arg);
373      break;
374
375    case OPT_P:
376      flag_no_line_commands = 1;
377      break;
378
379    case OPT_fworking_directory:
380      flag_working_directory = value;
381      break;
382
383    case OPT_U:
384      defer_opt (code, arg);
385      break;
386
387    case OPT_Wall:
388      set_Wunused (value);
389      set_Wformat (value);
390      set_Wimplicit (value);
391      warn_char_subscripts = value;
392      warn_missing_braces = value;
393      warn_parentheses = value;
394      warn_return_type = value;
395      warn_sequence_point = value;	/* Was C only.  */
396      if (c_dialect_cxx ())
397	warn_sign_compare = value;
398      warn_switch = value;
399      warn_strict_aliasing = value;
400      warn_strict_overflow = value;
401      warn_address = value;
402
403      /* Only warn about unknown pragmas that are not in system
404	 headers.  */
405      warn_unknown_pragmas = value;
406
407      /* We save the value of warn_uninitialized, since if they put
408	 -Wuninitialized on the command line, we need to generate a
409	 warning about not using it without also specifying -O.  */
410      if (warn_uninitialized != 1)
411	warn_uninitialized = (value ? 2 : 0);
412
413      if (!c_dialect_cxx ())
414	/* We set this to 2 here, but 1 in -Wmain, so -ffreestanding
415	   can turn it off only if it's not explicit.  */
416	warn_main = value * 2;
417      else
418	{
419	  /* C++-specific warnings.  */
420	  warn_reorder = value;
421	  warn_nontemplate_friend = value;
422	}
423
424      cpp_opts->warn_trigraphs = value;
425      cpp_opts->warn_comments = value;
426      cpp_opts->warn_num_sign_change = value;
427      cpp_opts->warn_multichar = value;	/* Was C++ only.  */
428
429      if (warn_pointer_sign == -1)
430	warn_pointer_sign = 1;
431      break;
432
433    case OPT_Wcomment:
434    case OPT_Wcomments:
435      cpp_opts->warn_comments = value;
436      break;
437
438    case OPT_Wdeprecated:
439      cpp_opts->warn_deprecated = value;
440      break;
441
442    case OPT_Wendif_labels:
443      cpp_opts->warn_endif_labels = value;
444      break;
445
446    case OPT_Werror:
447      cpp_opts->warnings_are_errors = value;
448      global_dc->warning_as_error_requested = value;
449      break;
450
451    case OPT_Werror_implicit_function_declaration:
452      mesg_implicit_function_declaration = 2;
453      break;
454
455    case OPT_Wformat:
456      set_Wformat (value);
457      break;
458
459    case OPT_Wformat_:
460      set_Wformat (atoi (arg));
461      break;
462
463    case OPT_Wimplicit:
464      set_Wimplicit (value);
465      break;
466
467    case OPT_Wimport:
468      /* Silently ignore for now.  */
469      break;
470
471    case OPT_Winvalid_pch:
472      cpp_opts->warn_invalid_pch = value;
473      break;
474
475    case OPT_Wmain:
476      if (value)
477	warn_main = 1;
478      else
479	warn_main = -1;
480      break;
481
482    case OPT_Wmissing_include_dirs:
483      cpp_opts->warn_missing_include_dirs = value;
484      break;
485
486    case OPT_Wmultichar:
487      cpp_opts->warn_multichar = value;
488      break;
489
490    case OPT_Wnormalized_:
491      if (!value || (arg && strcasecmp (arg, "none") == 0))
492	cpp_opts->warn_normalize = normalized_none;
493      else if (!arg || strcasecmp (arg, "nfkc") == 0)
494	cpp_opts->warn_normalize = normalized_KC;
495      else if (strcasecmp (arg, "id") == 0)
496	cpp_opts->warn_normalize = normalized_identifier_C;
497      else if (strcasecmp (arg, "nfc") == 0)
498	cpp_opts->warn_normalize = normalized_C;
499      else
500	error ("argument %qs to %<-Wnormalized%> not recognized", arg);
501      break;
502
503    case OPT_Wreturn_type:
504      warn_return_type = value;
505      break;
506
507    case OPT_Wstrict_null_sentinel:
508      warn_strict_null_sentinel = value;
509      break;
510
511    case OPT_Wsystem_headers:
512      cpp_opts->warn_system_headers = value;
513      break;
514
515    case OPT_Wtraditional:
516      cpp_opts->warn_traditional = value;
517      break;
518
519    case OPT_Wtrigraphs:
520      cpp_opts->warn_trigraphs = value;
521      break;
522
523    case OPT_Wundef:
524      cpp_opts->warn_undef = value;
525      break;
526
527    case OPT_Wunknown_pragmas:
528      /* Set to greater than 1, so that even unknown pragmas in
529	 system headers will be warned about.  */
530      warn_unknown_pragmas = value * 2;
531      break;
532
533    case OPT_Wunused_macros:
534      warn_unused_macros = value;
535      break;
536
537    case OPT_Wvariadic_macros:
538      warn_variadic_macros = value;
539      break;
540
541    case OPT_Wwrite_strings:
542      warn_write_strings = value;
543      break;
544
545    case OPT_Weffc__:
546      warn_ecpp = value;
547      if (value)
548        warn_nonvdtor = true;
549      break;
550
551    case OPT_ansi:
552      if (!c_dialect_cxx ())
553	set_std_c89 (false, true);
554      else
555	set_std_cxx98 (true);
556      break;
557
558    case OPT_d:
559      handle_OPT_d (arg);
560      break;
561
562    case OPT_fcond_mismatch:
563      if (!c_dialect_cxx ())
564	{
565	  flag_cond_mismatch = value;
566	  break;
567	}
568      /* Fall through.  */
569
570    case OPT_fall_virtual:
571    case OPT_falt_external_templates:
572    case OPT_fenum_int_equiv:
573    case OPT_fexternal_templates:
574    case OPT_fguiding_decls:
575    case OPT_fhonor_std:
576    case OPT_fhuge_objects:
577    case OPT_flabels_ok:
578    case OPT_fname_mangling_version_:
579    case OPT_fnew_abi:
580    case OPT_fnonnull_objects:
581    case OPT_fsquangle:
582    case OPT_fstrict_prototype:
583    case OPT_fthis_is_variable:
584    case OPT_fvtable_thunks:
585    case OPT_fxref:
586    case OPT_fvtable_gc:
587      warning (0, "switch %qs is no longer supported", option->opt_text);
588      break;
589
590    case OPT_faccess_control:
591      flag_access_control = value;
592      break;
593
594    case OPT_fasm:
595      flag_no_asm = !value;
596      break;
597
598    case OPT_fbuiltin:
599      flag_no_builtin = !value;
600      break;
601
602    case OPT_fbuiltin_:
603      if (value)
604	result = 0;
605      else
606	disable_builtin_function (arg);
607      break;
608
609    case OPT_fdollars_in_identifiers:
610      cpp_opts->dollars_in_ident = value;
611      break;
612
613    case OPT_ffreestanding:
614      value = !value;
615      /* Fall through....  */
616    case OPT_fhosted:
617      flag_hosted = value;
618      flag_no_builtin = !value;
619      /* warn_main will be 2 if set by -Wall, 1 if set by -Wmain */
620      if (!value && warn_main == 2)
621	warn_main = 0;
622      break;
623
624    case OPT_fshort_double:
625      flag_short_double = value;
626      break;
627
628    case OPT_fshort_enums:
629      flag_short_enums = value;
630      break;
631
632    case OPT_fshort_wchar:
633      flag_short_wchar = value;
634      break;
635
636    case OPT_fsigned_bitfields:
637      flag_signed_bitfields = value;
638      break;
639
640    case OPT_fsigned_char:
641      flag_signed_char = value;
642      break;
643
644    case OPT_funsigned_bitfields:
645      flag_signed_bitfields = !value;
646      break;
647
648    case OPT_funsigned_char:
649      flag_signed_char = !value;
650      break;
651
652    case OPT_fcheck_new:
653      flag_check_new = value;
654      break;
655
656    case OPT_fconserve_space:
657      flag_conserve_space = value;
658      break;
659
660    case OPT_fconstant_string_class_:
661      constant_string_class_name = arg;
662      break;
663
664    case OPT_fdefault_inline:
665      flag_default_inline = value;
666      break;
667
668    case OPT_felide_constructors:
669      flag_elide_constructors = value;
670      break;
671
672    case OPT_fenforce_eh_specs:
673      flag_enforce_eh_specs = value;
674      break;
675
676    case OPT_fextended_identifiers:
677      cpp_opts->extended_identifiers = value;
678      break;
679
680    case OPT_ffor_scope:
681      flag_new_for_scope = value;
682      break;
683
684    case OPT_fgnu_keywords:
685      flag_no_gnu_keywords = !value;
686      break;
687
688    case OPT_fgnu_runtime:
689      flag_next_runtime = !value;
690      break;
691
692    case OPT_fhandle_exceptions:
693      warning (0, "-fhandle-exceptions has been renamed -fexceptions (and is now on by default)");
694      flag_exceptions = value;
695      break;
696
697    case OPT_fimplement_inlines:
698      flag_implement_inlines = value;
699      break;
700
701    case OPT_fimplicit_inline_templates:
702      flag_implicit_inline_templates = value;
703      break;
704
705    case OPT_fimplicit_templates:
706      flag_implicit_templates = value;
707      break;
708
709    case OPT_fms_extensions:
710      flag_ms_extensions = value;
711      break;
712
713    case OPT_fnext_runtime:
714      flag_next_runtime = value;
715      break;
716
717    case OPT_fnil_receivers:
718      flag_nil_receivers = value;
719      break;
720
721    case OPT_fnonansi_builtins:
722      flag_no_nonansi_builtin = !value;
723      break;
724
725    case OPT_foperator_names:
726      cpp_opts->operator_names = value;
727      break;
728
729    case OPT_foptional_diags:
730      flag_optional_diags = value;
731      break;
732
733    case OPT_fpch_deps:
734      cpp_opts->restore_pch_deps = value;
735      break;
736
737    case OPT_fpch_preprocess:
738      flag_pch_preprocess = value;
739      break;
740
741    case OPT_fpermissive:
742      flag_permissive = value;
743      break;
744
745    case OPT_fpreprocessed:
746      cpp_opts->preprocessed = value;
747      break;
748
749    case OPT_freplace_objc_classes:
750      flag_replace_objc_classes = value;
751      break;
752
753    case OPT_frepo:
754      flag_use_repository = value;
755      if (value)
756	flag_implicit_templates = 0;
757      break;
758
759    case OPT_frtti:
760      flag_rtti = value;
761      break;
762
763    case OPT_fshow_column:
764      cpp_opts->show_column = value;
765      break;
766
767    case OPT_fstats:
768      flag_detailed_statistics = value;
769      break;
770
771    case OPT_ftabstop_:
772      /* It is documented that we silently ignore silly values.  */
773      if (value >= 1 && value <= 100)
774	cpp_opts->tabstop = value;
775      break;
776
777    case OPT_fexec_charset_:
778      cpp_opts->narrow_charset = arg;
779      break;
780
781    case OPT_fwide_exec_charset_:
782      cpp_opts->wide_charset = arg;
783      break;
784
785    case OPT_finput_charset_:
786      cpp_opts->input_charset = arg;
787      break;
788
789    case OPT_ftemplate_depth_:
790      max_tinst_depth = value;
791      break;
792
793    case OPT_fuse_cxa_atexit:
794      flag_use_cxa_atexit = value;
795      break;
796
797    case OPT_fuse_cxa_get_exception_ptr:
798      flag_use_cxa_get_exception_ptr = value;
799      break;
800
801    case OPT_fvisibility_inlines_hidden:
802      visibility_options.inlines_hidden = value;
803      break;
804
805    case OPT_fweak:
806      flag_weak = value;
807      break;
808
809    case OPT_fthreadsafe_statics:
810      flag_threadsafe_statics = value;
811      break;
812
813    case OPT_fzero_link:
814      flag_zero_link = value;
815      break;
816
817    case OPT_gen_decls:
818      flag_gen_declaration = 1;
819      break;
820
821    case OPT_idirafter:
822      add_path (xstrdup (arg), AFTER, 0, true);
823      break;
824
825    case OPT_imacros:
826    case OPT_include:
827      defer_opt (code, arg);
828      break;
829
830    case OPT_imultilib:
831      imultilib = arg;
832      break;
833
834    case OPT_iprefix:
835      iprefix = arg;
836      break;
837
838    case OPT_iquote:
839      add_path (xstrdup (arg), QUOTE, 0, true);
840      break;
841
842    case OPT_isysroot:
843      sysroot = arg;
844      break;
845
846    case OPT_isystem:
847      add_path (xstrdup (arg), SYSTEM, 0, true);
848      break;
849
850    case OPT_iwithprefix:
851      add_prefixed_path (arg, SYSTEM);
852      break;
853
854    case OPT_iwithprefixbefore:
855      add_prefixed_path (arg, BRACKET);
856      break;
857
858    case OPT_lang_asm:
859      cpp_set_lang (parse_in, CLK_ASM);
860      cpp_opts->dollars_in_ident = false;
861      break;
862
863    case OPT_lang_fortran:
864      lang_fortran = true;
865      break;
866
867    case OPT_lang_objc:
868      cpp_opts->objc = 1;
869      break;
870
871    case OPT_nostdinc:
872      std_inc = false;
873      break;
874
875    case OPT_nostdinc__:
876      std_cxx_inc = false;
877      break;
878
879    case OPT_o:
880      if (!out_fname)
881	out_fname = arg;
882      else
883	error ("output filename specified twice");
884      break;
885
886      /* We need to handle the -pedantic switches here, rather than in
887	 c_common_post_options, so that a subsequent -Wno-endif-labels
888	 is not overridden.  */
889    case OPT_pedantic_errors:
890      cpp_opts->pedantic_errors = 1;
891      /* Fall through.  */
892    case OPT_pedantic:
893      cpp_opts->pedantic = 1;
894      cpp_opts->warn_endif_labels = 1;
895      if (warn_pointer_sign == -1)
896	warn_pointer_sign = 1;
897      if (warn_overlength_strings == -1)
898	warn_overlength_strings = 1;
899      break;
900
901    case OPT_print_objc_runtime_info:
902      print_struct_values = 1;
903      break;
904
905    case OPT_print_pch_checksum:
906      c_common_print_pch_checksum (stdout);
907      exit_after_options = true;
908      break;
909
910    case OPT_remap:
911      cpp_opts->remap = 1;
912      break;
913
914    case OPT_std_c__98:
915    case OPT_std_gnu__98:
916      if (!preprocessing_asm_p)
917	set_std_cxx98 (code == OPT_std_c__98 /* ISO */);
918      break;
919
920    case OPT_std_c89:
921    case OPT_std_iso9899_1990:
922    case OPT_std_iso9899_199409:
923      if (!preprocessing_asm_p)
924	set_std_c89 (code == OPT_std_iso9899_199409 /* c94 */, true /* ISO */);
925      break;
926
927    case OPT_std_gnu89:
928      if (!preprocessing_asm_p)
929	set_std_c89 (false /* c94 */, false /* ISO */);
930      break;
931
932    case OPT_std_c99:
933    case OPT_std_c9x:
934    case OPT_std_iso9899_1999:
935    case OPT_std_iso9899_199x:
936      if (!preprocessing_asm_p)
937	set_std_c99 (true /* ISO */);
938      break;
939
940    case OPT_std_gnu99:
941    case OPT_std_gnu9x:
942      if (!preprocessing_asm_p)
943	set_std_c99 (false /* ISO */);
944      break;
945
946    case OPT_trigraphs:
947      cpp_opts->trigraphs = 1;
948      break;
949
950    case OPT_traditional_cpp:
951      cpp_opts->traditional = 1;
952      break;
953
954    case OPT_undef:
955      flag_undef = 1;
956      break;
957
958    case OPT_w:
959      cpp_opts->inhibit_warnings = 1;
960      break;
961
962    case OPT_v:
963      verbose = true;
964      break;
965    }
966
967  return result;
968}
969
970/* Post-switch processing.  */
971bool
972c_common_post_options (const char **pfilename)
973{
974  struct cpp_callbacks *cb;
975
976  /* Canonicalize the input and output filenames.  */
977  if (in_fnames == NULL)
978    {
979      in_fnames = XNEWVEC (const char *, 1);
980      in_fnames[0] = "";
981    }
982  else if (strcmp (in_fnames[0], "-") == 0)
983    in_fnames[0] = "";
984
985  if (out_fname == NULL || !strcmp (out_fname, "-"))
986    out_fname = "";
987
988  if (cpp_opts->deps.style == DEPS_NONE)
989    check_deps_environment_vars ();
990
991  handle_deferred_opts ();
992
993  sanitize_cpp_opts ();
994
995  register_include_chains (parse_in, sysroot, iprefix, imultilib,
996			   std_inc, std_cxx_inc && c_dialect_cxx (), verbose);
997
998#ifdef C_COMMON_OVERRIDE_OPTIONS
999  /* Some machines may reject certain combinations of C
1000     language-specific options.  */
1001  C_COMMON_OVERRIDE_OPTIONS;
1002#endif
1003
1004  flag_inline_trees = 1;
1005
1006  /* Use tree inlining.  */
1007  if (!flag_no_inline)
1008    flag_no_inline = 1;
1009  if (flag_inline_functions)
1010    flag_inline_trees = 2;
1011
1012  /* By default we use C99 inline semantics in GNU99 or C99 mode.  C99
1013     inline semantics are not supported in GNU89 or C89 mode.  */
1014  if (flag_gnu89_inline == -1)
1015    flag_gnu89_inline = !flag_isoc99;
1016  else if (!flag_gnu89_inline && !flag_isoc99)
1017    error ("-fno-gnu89-inline is only supported in GNU99 or C99 mode");
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++.  */
1129bool
1130c_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.  */
1163void
1164c_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.  */
1205void
1206c_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.  */
1243static void
1244check_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.  */
1282static void
1283handle_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.  */
1307static void
1308sanitize_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.  */
1353static void
1354add_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.  */
1373static void
1374finish_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.  */
1439static void
1440push_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.  */
1467static void
1468cb_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
1480void
1481cb_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.  */
1489static void
1490set_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).  */
1502static void
1503set_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).  */
1514static void
1515set_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.  */
1524static void
1525set_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.  */
1540static void
1541handle_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