1117395Skan/* C/ObjC/C++ command line option handling.
2169699Skan   Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007
3169699Skan   Free Software Foundation, Inc.
4117395Skan   Contributed by Neil Booth.
5117395Skan
6117395SkanThis file is part of GCC.
7117395Skan
8117395SkanGCC is free software; you can redistribute it and/or modify it under
9117395Skanthe terms of the GNU General Public License as published by the Free
10117395SkanSoftware Foundation; either version 2, or (at your option) any later
11117395Skanversion.
12117395Skan
13117395SkanGCC is distributed in the hope that it will be useful, but WITHOUT ANY
14117395SkanWARRANTY; without even the implied warranty of MERCHANTABILITY or
15117395SkanFITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16117395Skanfor more details.
17117395Skan
18117395SkanYou should have received a copy of the GNU General Public License
19117395Skanalong with GCC; see the file COPYING.  If not, write to the Free
20169699SkanSoftware Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
21169699Skan02110-1301, USA.  */
22117395Skan
23132811Skan/* $FreeBSD$ */
24189824Sdas/* Merged C99 inline changes from gcc trunk 122565 2007-03-05 */
25132811Skan
26117395Skan#include "config.h"
27117395Skan#include "system.h"
28132718Skan#include "coretypes.h"
29132718Skan#include "tm.h"
30117395Skan#include "tree.h"
31117395Skan#include "c-common.h"
32117395Skan#include "c-pragma.h"
33117395Skan#include "flags.h"
34117395Skan#include "toplev.h"
35117395Skan#include "langhooks.h"
36117395Skan#include "tree-inline.h"
37117395Skan#include "diagnostic.h"
38117395Skan#include "intl.h"
39132718Skan#include "cppdefault.h"
40132718Skan#include "c-incpath.h"
41132718Skan#include "debug.h"		/* For debug_hooks.  */
42132718Skan#include "opts.h"
43132718Skan#include "options.h"
44169699Skan#include "mkdeps.h"
45117395Skan
46132718Skan#ifndef DOLLARS_IN_IDENTIFIERS
47132718Skan# define DOLLARS_IN_IDENTIFIERS true
48132718Skan#endif
49132718Skan
50132718Skan#ifndef TARGET_SYSTEM_ROOT
51132718Skan# define TARGET_SYSTEM_ROOT NULL
52132718Skan#endif
53132718Skan
54169699Skan#ifndef TARGET_OPTF
55169699Skan#define TARGET_OPTF(ARG)
56169699Skan#endif
57132718Skan
58117395Skan/* CPP's options.  */
59117395Skanstatic cpp_options *cpp_opts;
60117395Skan
61117395Skan/* Input filename.  */
62132718Skanstatic const char *this_input_filename;
63117395Skan
64117395Skan/* Filename and stream for preprocessed output.  */
65117395Skanstatic const char *out_fname;
66117395Skanstatic FILE *out_stream;
67117395Skan
68117395Skan/* Append dependencies to deps_file.  */
69117395Skanstatic bool deps_append;
70117395Skan
71117395Skan/* If dependency switches (-MF etc.) have been given.  */
72117395Skanstatic bool deps_seen;
73117395Skan
74132718Skan/* If -v seen.  */
75132718Skanstatic bool verbose;
76132718Skan
77169699Skan/* If -lang-fortran seen.  */
78169699Skanstatic bool lang_fortran = false;
79169699Skan
80117395Skan/* Dependency output file.  */
81117395Skanstatic const char *deps_file;
82117395Skan
83132718Skan/* The prefix given by -iprefix, if any.  */
84132718Skanstatic const char *iprefix;
85117395Skan
86169699Skan/* The multilib directory given by -imultilib, if any.  */
87169699Skanstatic const char *imultilib;
88169699Skan
89132718Skan/* The system root, if any.  Overridden by -isysroot.  */
90132718Skanstatic const char *sysroot = TARGET_SYSTEM_ROOT;
91117395Skan
92132718Skan/* Zero disables all standard directories for headers.  */
93132718Skanstatic bool std_inc = true;
94117395Skan
95132718Skan/* Zero disables the C++-specific standard directories for headers.  */
96132718Skanstatic bool std_cxx_inc = true;
97117395Skan
98132718Skan/* If the quote chain has been split by -I-.  */
99132718Skanstatic bool quote_chain_split;
100117395Skan
101132718Skan/* If -Wunused-macros.  */
102132718Skanstatic bool warn_unused_macros;
103117395Skan
104169699Skan/* If -Wvariadic-macros.  */
105169699Skanstatic bool warn_variadic_macros = true;
106169699Skan
107132718Skan/* Number of deferred options.  */
108132718Skanstatic size_t deferred_count;
109117395Skan
110132718Skan/* Number of deferred options scanned for -include.  */
111132718Skanstatic size_t include_cursor;
112117395Skan
113132718Skanstatic void set_Wimplicit (int);
114132718Skanstatic void handle_OPT_d (const char *);
115132718Skanstatic void set_std_cxx98 (int);
116132718Skanstatic void set_std_c89 (int, int);
117132718Skanstatic void set_std_c99 (int);
118132718Skanstatic void check_deps_environment_vars (void);
119132718Skanstatic void handle_deferred_opts (void);
120132718Skanstatic void sanitize_cpp_opts (void);
121132718Skanstatic void add_prefixed_path (const char *, size_t);
122132718Skanstatic void push_command_line_include (void);
123132718Skanstatic void cb_file_change (cpp_reader *, const struct line_map *);
124132718Skanstatic void cb_dir_change (cpp_reader *, const char *);
125132718Skanstatic void finish_options (void);
126117395Skan
127132718Skan#ifndef STDC_0_IN_SYSTEM_HEADERS
128132718Skan#define STDC_0_IN_SYSTEM_HEADERS 0
129117395Skan#endif
130117395Skan
131132718Skan/* Holds switches parsed by c_common_handle_option (), but whose
132132718Skan   handling is deferred to c_common_post_options ().  */
133132718Skanstatic void defer_opt (enum opt_code, const char *);
134117395Skanstatic struct deferred_opt
135117395Skan{
136117395Skan  enum opt_code code;
137117395Skan  const char *arg;
138117395Skan} *deferred_opts;
139117395Skan
140132718Skan/* Complain that switch CODE expects an argument but none was
141132718Skan   provided.  OPT was the command-line option.  Return FALSE to get
142132718Skan   the default message in opts.c, TRUE if we provide a specialized
143132718Skan   one.  */
144132718Skanbool
145132718Skanc_common_missing_argument (const char *opt, size_t code)
146117395Skan{
147132718Skan  switch (code)
148117395Skan    {
149117395Skan    default:
150132718Skan      /* Pick up the default message.  */
151132718Skan      return false;
152132718Skan
153132718Skan    case OPT_fconstant_string_class_:
154169699Skan      error ("no class name specified with %qs", opt);
155117395Skan      break;
156117395Skan
157132718Skan    case OPT_A:
158169699Skan      error ("assertion missing after %qs", opt);
159117395Skan      break;
160117395Skan
161132718Skan    case OPT_D:
162132718Skan    case OPT_U:
163169699Skan      error ("macro name missing after %qs", opt);
164132718Skan      break;
165132718Skan
166169699Skan    case OPT_F:
167132718Skan    case OPT_I:
168132718Skan    case OPT_idirafter:
169132718Skan    case OPT_isysroot:
170132718Skan    case OPT_isystem:
171169699Skan    case OPT_iquote:
172169699Skan      error ("missing path after %qs", opt);
173132718Skan      break;
174132718Skan
175117395Skan    case OPT_MF:
176117395Skan    case OPT_MD:
177117395Skan    case OPT_MMD:
178132718Skan    case OPT_include:
179132718Skan    case OPT_imacros:
180117395Skan    case OPT_o:
181169699Skan      error ("missing filename after %qs", opt);
182117395Skan      break;
183117395Skan
184117395Skan    case OPT_MQ:
185117395Skan    case OPT_MT:
186169699Skan      error ("missing makefile target after %qs", opt);
187117395Skan      break;
188117395Skan    }
189117395Skan
190132718Skan  return true;
191117395Skan}
192117395Skan
193117395Skan/* Defer option CODE with argument ARG.  */
194117395Skanstatic void
195132718Skandefer_opt (enum opt_code code, const char *arg)
196117395Skan{
197117395Skan  deferred_opts[deferred_count].code = code;
198117395Skan  deferred_opts[deferred_count].arg = arg;
199117395Skan  deferred_count++;
200117395Skan}
201117395Skan
202117395Skan/* Common initialization before parsing options.  */
203132718Skanunsigned int
204146908Skanc_common_init_options (unsigned int argc, const char **argv)
205117395Skan{
206132718Skan  static const unsigned int lang_flags[] = {CL_C, CL_ObjC, CL_CXX, CL_ObjCXX};
207146908Skan  unsigned int i, result;
208117395Skan
209132718Skan  /* This is conditionalized only because that is the way the front
210132718Skan     ends used to do it.  Maybe this should be unconditional?  */
211132718Skan  if (c_dialect_cxx ())
212132718Skan    {
213132718Skan      /* By default wrap lines at 80 characters.  Is getenv
214132718Skan	 ("COLUMNS") preferable?  */
215132718Skan      diagnostic_line_cutoff (global_dc) = 80;
216132718Skan      /* By default, emit location information once for every
217132718Skan	 diagnostic message.  */
218132718Skan      diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
219132718Skan    }
220117395Skan
221132718Skan  parse_in = cpp_create_reader (c_dialect_cxx () ? CLK_GNUCXX: CLK_GNUC89,
222169699Skan				ident_hash, &line_table);
223132718Skan
224117395Skan  cpp_opts = cpp_get_options (parse_in);
225132718Skan  cpp_opts->dollars_in_ident = DOLLARS_IN_IDENTIFIERS;
226132718Skan  cpp_opts->objc = c_dialect_objc ();
227117395Skan
228132718Skan  /* Reset to avoid warnings on internal definitions.  We set it just
229132718Skan     before passing on command-line options to cpplib.  */
230132718Skan  cpp_opts->warn_dollars = 0;
231117395Skan
232132718Skan  flag_exceptions = c_dialect_cxx ();
233132718Skan  warn_pointer_arith = c_dialect_cxx ();
234169699Skan  warn_write_strings = c_dialect_cxx();
235117395Skan
236169699Skan  deferred_opts = XNEWVEC (struct deferred_opt, argc);
237117395Skan
238132718Skan  result = lang_flags[c_language];
239117395Skan
240146908Skan  if (c_language == clk_c)
241146908Skan    {
242169699Skan      /* If preprocessing assembly language, accept any of the C-family
243169699Skan	 front end options since the driver may pass them through.  */
244146908Skan      for (i = 1; i < argc; i++)
245169699Skan	if (! strcmp (argv[i], "-lang-asm"))
246169699Skan	  {
247169699Skan	    result |= CL_C | CL_ObjC | CL_CXX | CL_ObjCXX;
248169699Skan	    break;
249169699Skan	  }
250169699Skan
251169699Skan#ifdef CL_Fortran
252169699Skan      for (i = 1; i < argc; i++)
253169699Skan	if (! strcmp (argv[i], "-lang-fortran"))
254146908Skan	{
255169699Skan	    result |= CL_Fortran;
256169699Skan	    break;
257169699Skan	}
258146908Skan#endif
259117395Skan    }
260169699Skan
261132718Skan  return result;
262132718Skan}
263117395Skan
264132718Skan/* Handle switch SCODE with argument ARG.  VALUE is true, unless no-
265132718Skan   form of an -f or -W option was given.  Returns 0 if the switch was
266132718Skan   invalid, a negative number to prevent language-independent
267132718Skan   processing in toplev.c (a hack necessary for the short-term).  */
268132718Skanint
269132718Skanc_common_handle_option (size_t scode, const char *arg, int value)
270132718Skan{
271132718Skan  const struct cl_option *option = &cl_options[scode];
272132718Skan  enum opt_code code = (enum opt_code) scode;
273132718Skan  int result = 1;
274117395Skan
275169699Skan  /* Prevent resetting the language standard to a C dialect when the driver
276169699Skan     has already determined that we're looking at assembler input.  */
277169699Skan  bool preprocessing_asm_p = (cpp_get_options (parse_in)->lang == CLK_ASM);
278169699Skan
279132718Skan  switch (code)
280117395Skan    {
281132718Skan    default:
282169699Skan      if (cl_options[code].flags & (CL_C | CL_CXX | CL_ObjC | CL_ObjCXX))
283169699Skan	break;
284169699Skan#ifdef CL_Fortran
285169699Skan      if (lang_fortran && (cl_options[code].flags & (CL_Fortran)))
286169699Skan	break;
287169699Skan#endif
288169699Skan      result = 0;
289132718Skan      break;
290117395Skan
291132718Skan    case OPT__output_pch_:
292132718Skan      pch_file = arg;
293117395Skan      break;
294117395Skan
295132718Skan    case OPT_A:
296132718Skan      defer_opt (code, arg);
297117395Skan      break;
298117395Skan
299117395Skan    case OPT_C:
300117395Skan      cpp_opts->discard_comments = 0;
301117395Skan      break;
302117395Skan
303117395Skan    case OPT_CC:
304117395Skan      cpp_opts->discard_comments = 0;
305117395Skan      cpp_opts->discard_comments_in_macro_exp = 0;
306117395Skan      break;
307117395Skan
308132718Skan    case OPT_D:
309132718Skan      defer_opt (code, arg);
310132718Skan      break;
311132718Skan
312117395Skan    case OPT_E:
313117395Skan      flag_preprocess_only = 1;
314117395Skan      break;
315117395Skan
316117395Skan    case OPT_H:
317117395Skan      cpp_opts->print_include_names = 1;
318117395Skan      break;
319117395Skan
320169699Skan    case OPT_F:
321169699Skan      TARGET_OPTF (xstrdup (arg));
322169699Skan      break;
323169699Skan
324132718Skan    case OPT_I:
325132718Skan      if (strcmp (arg, "-"))
326169699Skan	add_path (xstrdup (arg), BRACKET, 0, true);
327132718Skan      else
328132718Skan	{
329132718Skan	  if (quote_chain_split)
330132718Skan	    error ("-I- specified twice");
331132718Skan	  quote_chain_split = true;
332132718Skan	  split_quote_chain ();
333169699Skan	  inform ("obsolete option -I- used, please use -iquote instead");
334132718Skan	}
335132718Skan      break;
336132718Skan
337117395Skan    case OPT_M:
338117395Skan    case OPT_MM:
339117395Skan      /* When doing dependencies with -M or -MM, suppress normal
340117395Skan	 preprocessed output, but still do -dM etc. as software
341117395Skan	 depends on this.  Preprocessed output does occur if -MD, -MMD
342117395Skan	 or environment var dependency generation is used.  */
343117395Skan      cpp_opts->deps.style = (code == OPT_M ? DEPS_SYSTEM: DEPS_USER);
344132718Skan      flag_no_output = 1;
345117395Skan      cpp_opts->inhibit_warnings = 1;
346117395Skan      break;
347117395Skan
348117395Skan    case OPT_MD:
349117395Skan    case OPT_MMD:
350117395Skan      cpp_opts->deps.style = (code == OPT_MD ? DEPS_SYSTEM: DEPS_USER);
351117395Skan      deps_file = arg;
352117395Skan      break;
353117395Skan
354117395Skan    case OPT_MF:
355117395Skan      deps_seen = true;
356117395Skan      deps_file = arg;
357117395Skan      break;
358117395Skan
359117395Skan    case OPT_MG:
360117395Skan      deps_seen = true;
361117395Skan      cpp_opts->deps.missing_files = true;
362117395Skan      break;
363117395Skan
364117395Skan    case OPT_MP:
365117395Skan      deps_seen = true;
366117395Skan      cpp_opts->deps.phony_targets = true;
367117395Skan      break;
368117395Skan
369117395Skan    case OPT_MQ:
370117395Skan    case OPT_MT:
371117395Skan      deps_seen = true;
372117395Skan      defer_opt (code, arg);
373117395Skan      break;
374117395Skan
375117395Skan    case OPT_P:
376132718Skan      flag_no_line_commands = 1;
377117395Skan      break;
378117395Skan
379132718Skan    case OPT_fworking_directory:
380132718Skan      flag_working_directory = value;
381132718Skan      break;
382132718Skan
383132718Skan    case OPT_U:
384132718Skan      defer_opt (code, arg);
385132718Skan      break;
386132718Skan
387117395Skan    case OPT_Wall:
388260568Spfg      /* APPLE LOCAL -Wmost */
389260568Spfg    case OPT_Wmost:
390132718Skan      set_Wunused (value);
391132718Skan      set_Wformat (value);
392132718Skan      set_Wimplicit (value);
393132718Skan      warn_char_subscripts = value;
394132718Skan      warn_missing_braces = value;
395260568Spfg      /* APPLE LOCAL begin -Wmost --dpatel */
396260568Spfg      if (code != OPT_Wmost)
397260568Spfg	warn_parentheses = value;
398260568Spfg      /* APPLE LOCAL end -Wmost --dpatel */
399132718Skan      warn_return_type = value;
400132718Skan      warn_sequence_point = value;	/* Was C only.  */
401132718Skan      if (c_dialect_cxx ())
402132718Skan	warn_sign_compare = value;
403132718Skan      warn_switch = value;
404259405Spfg      set_warn_strict_aliasing (value);
405169699Skan      warn_strict_overflow = value;
406169699Skan      warn_address = value;
407132718Skan
408117395Skan      /* Only warn about unknown pragmas that are not in system
409132718Skan	 headers.  */
410132718Skan      warn_unknown_pragmas = value;
411117395Skan
412117395Skan      /* We save the value of warn_uninitialized, since if they put
413117395Skan	 -Wuninitialized on the command line, we need to generate a
414117395Skan	 warning about not using it without also specifying -O.  */
415117395Skan      if (warn_uninitialized != 1)
416132718Skan	warn_uninitialized = (value ? 2 : 0);
417117395Skan
418132718Skan      if (!c_dialect_cxx ())
419117395Skan	/* We set this to 2 here, but 1 in -Wmain, so -ffreestanding
420117395Skan	   can turn it off only if it's not explicit.  */
421132718Skan	warn_main = value * 2;
422117395Skan      else
423117395Skan	{
424117395Skan	  /* C++-specific warnings.  */
425132718Skan	  warn_reorder = value;
426132718Skan	  warn_nontemplate_friend = value;
427117395Skan	}
428117395Skan
429132718Skan      cpp_opts->warn_trigraphs = value;
430132718Skan      cpp_opts->warn_comments = value;
431132718Skan      cpp_opts->warn_num_sign_change = value;
432132718Skan      cpp_opts->warn_multichar = value;	/* Was C++ only.  */
433117395Skan
434169699Skan      if (warn_pointer_sign == -1)
435169699Skan	warn_pointer_sign = 1;
436117395Skan      break;
437117395Skan
438117395Skan    case OPT_Wcomment:
439117395Skan    case OPT_Wcomments:
440132718Skan      cpp_opts->warn_comments = value;
441117395Skan      break;
442117395Skan
443117395Skan    case OPT_Wdeprecated:
444132718Skan      cpp_opts->warn_deprecated = value;
445117395Skan      break;
446117395Skan
447117395Skan    case OPT_Wendif_labels:
448132718Skan      cpp_opts->warn_endif_labels = value;
449117395Skan      break;
450117395Skan
451117395Skan    case OPT_Werror:
452132718Skan      cpp_opts->warnings_are_errors = value;
453169699Skan      global_dc->warning_as_error_requested = value;
454117395Skan      break;
455117395Skan
456132718Skan    case OPT_Werror_implicit_function_declaration:
457132718Skan      mesg_implicit_function_declaration = 2;
458117395Skan      break;
459117395Skan
460117395Skan    case OPT_Wformat:
461132718Skan      set_Wformat (value);
462117395Skan      break;
463117395Skan
464132718Skan    case OPT_Wformat_:
465117395Skan      set_Wformat (atoi (arg));
466117395Skan      break;
467117395Skan
468117395Skan    case OPT_Wimplicit:
469132718Skan      set_Wimplicit (value);
470117395Skan      break;
471117395Skan
472117395Skan    case OPT_Wimport:
473132718Skan      /* Silently ignore for now.  */
474117395Skan      break;
475117395Skan
476132718Skan    case OPT_Winvalid_pch:
477132718Skan      cpp_opts->warn_invalid_pch = value;
478132718Skan      break;
479132718Skan
480117395Skan    case OPT_Wmain:
481132718Skan      if (value)
482117395Skan	warn_main = 1;
483117395Skan      else
484117395Skan	warn_main = -1;
485117395Skan      break;
486117395Skan
487169699Skan    case OPT_Wmissing_include_dirs:
488169699Skan      cpp_opts->warn_missing_include_dirs = value;
489117395Skan      break;
490117395Skan
491117395Skan    case OPT_Wmultichar:
492132718Skan      cpp_opts->warn_multichar = value;
493117395Skan      break;
494117395Skan
495259890Spfg      /* APPLE LOCAL begin -Wnewline-eof */
496259890Spfg    case OPT_Wnewline_eof:
497259890Spfg      cpp_opts->warn_newline_at_eof = value;
498259890Spfg      break;
499259890Spfg      /* APPLE LOCAL end -Wnewline-eof */
500259890Spfg
501169699Skan    case OPT_Wnormalized_:
502169699Skan      if (!value || (arg && strcasecmp (arg, "none") == 0))
503169699Skan	cpp_opts->warn_normalize = normalized_none;
504169699Skan      else if (!arg || strcasecmp (arg, "nfkc") == 0)
505169699Skan	cpp_opts->warn_normalize = normalized_KC;
506169699Skan      else if (strcasecmp (arg, "id") == 0)
507169699Skan	cpp_opts->warn_normalize = normalized_identifier_C;
508169699Skan      else if (strcasecmp (arg, "nfc") == 0)
509169699Skan	cpp_opts->warn_normalize = normalized_C;
510169699Skan      else
511169699Skan	error ("argument %qs to %<-Wnormalized%> not recognized", arg);
512117395Skan      break;
513117395Skan
514117395Skan    case OPT_Wreturn_type:
515132718Skan      warn_return_type = value;
516117395Skan      break;
517117395Skan
518169699Skan    case OPT_Wstrict_null_sentinel:
519169699Skan      warn_strict_null_sentinel = value;
520117395Skan      break;
521117395Skan
522117395Skan    case OPT_Wsystem_headers:
523132718Skan      cpp_opts->warn_system_headers = value;
524117395Skan      break;
525117395Skan
526117395Skan    case OPT_Wtraditional:
527132718Skan      cpp_opts->warn_traditional = value;
528117395Skan      break;
529117395Skan
530117395Skan    case OPT_Wtrigraphs:
531132718Skan      cpp_opts->warn_trigraphs = value;
532117395Skan      break;
533117395Skan
534117395Skan    case OPT_Wundef:
535132718Skan      cpp_opts->warn_undef = value;
536117395Skan      break;
537117395Skan
538117395Skan    case OPT_Wunknown_pragmas:
539117395Skan      /* Set to greater than 1, so that even unknown pragmas in
540132718Skan	 system headers will be warned about.  */
541132718Skan      warn_unknown_pragmas = value * 2;
542117395Skan      break;
543117395Skan
544117395Skan    case OPT_Wunused_macros:
545132718Skan      warn_unused_macros = value;
546117395Skan      break;
547117395Skan
548169699Skan    case OPT_Wvariadic_macros:
549169699Skan      warn_variadic_macros = value;
550169699Skan      break;
551169699Skan
552117395Skan    case OPT_Wwrite_strings:
553169699Skan      warn_write_strings = value;
554117395Skan      break;
555132718Skan
556169699Skan    case OPT_Weffc__:
557169699Skan      warn_ecpp = value;
558169699Skan      if (value)
559169699Skan        warn_nonvdtor = true;
560169699Skan      break;
561169699Skan
562117395Skan    case OPT_ansi:
563132718Skan      if (!c_dialect_cxx ())
564117395Skan	set_std_c89 (false, true);
565117395Skan      else
566117395Skan	set_std_cxx98 (true);
567117395Skan      break;
568117395Skan
569117395Skan    case OPT_d:
570117395Skan      handle_OPT_d (arg);
571117395Skan      break;
572117395Skan
573117395Skan    case OPT_fcond_mismatch:
574132718Skan      if (!c_dialect_cxx ())
575117395Skan	{
576132718Skan	  flag_cond_mismatch = value;
577117395Skan	  break;
578117395Skan	}
579117395Skan      /* Fall through.  */
580117395Skan
581117395Skan    case OPT_fall_virtual:
582132718Skan    case OPT_falt_external_templates:
583117395Skan    case OPT_fenum_int_equiv:
584132718Skan    case OPT_fexternal_templates:
585117395Skan    case OPT_fguiding_decls:
586117395Skan    case OPT_fhonor_std:
587117395Skan    case OPT_fhuge_objects:
588117395Skan    case OPT_flabels_ok:
589132718Skan    case OPT_fname_mangling_version_:
590117395Skan    case OPT_fnew_abi:
591117395Skan    case OPT_fnonnull_objects:
592117395Skan    case OPT_fsquangle:
593117395Skan    case OPT_fstrict_prototype:
594117395Skan    case OPT_fthis_is_variable:
595117395Skan    case OPT_fvtable_thunks:
596117395Skan    case OPT_fxref:
597132718Skan    case OPT_fvtable_gc:
598169699Skan      warning (0, "switch %qs is no longer supported", option->opt_text);
599117395Skan      break;
600117395Skan
601117395Skan    case OPT_faccess_control:
602132718Skan      flag_access_control = value;
603117395Skan      break;
604117395Skan
605117395Skan    case OPT_fasm:
606132718Skan      flag_no_asm = !value;
607117395Skan      break;
608117395Skan
609117395Skan    case OPT_fbuiltin:
610132718Skan      flag_no_builtin = !value;
611117395Skan      break;
612117395Skan
613117395Skan    case OPT_fbuiltin_:
614132718Skan      if (value)
615117395Skan	result = 0;
616117395Skan      else
617117395Skan	disable_builtin_function (arg);
618117395Skan      break;
619117395Skan
620259405Spfg    case OPT_fdirectives_only:
621259405Spfg      cpp_opts->directives_only = 1;
622259405Spfg      break;
623259405Spfg
624117395Skan    case OPT_fdollars_in_identifiers:
625132718Skan      cpp_opts->dollars_in_ident = value;
626117395Skan      break;
627117395Skan
628117395Skan    case OPT_ffreestanding:
629132718Skan      value = !value;
630132718Skan      /* Fall through....  */
631117395Skan    case OPT_fhosted:
632132718Skan      flag_hosted = value;
633132718Skan      flag_no_builtin = !value;
634117395Skan      /* warn_main will be 2 if set by -Wall, 1 if set by -Wmain */
635132718Skan      if (!value && warn_main == 2)
636117395Skan	warn_main = 0;
637117395Skan      break;
638117395Skan
639117395Skan    case OPT_fshort_double:
640132718Skan      flag_short_double = value;
641117395Skan      break;
642117395Skan
643117395Skan    case OPT_fshort_enums:
644132718Skan      flag_short_enums = value;
645117395Skan      break;
646117395Skan
647117395Skan    case OPT_fshort_wchar:
648132718Skan      flag_short_wchar = value;
649117395Skan      break;
650117395Skan
651117395Skan    case OPT_fsigned_bitfields:
652132718Skan      flag_signed_bitfields = value;
653117395Skan      break;
654117395Skan
655117395Skan    case OPT_fsigned_char:
656132718Skan      flag_signed_char = value;
657117395Skan      break;
658117395Skan
659117395Skan    case OPT_funsigned_bitfields:
660132718Skan      flag_signed_bitfields = !value;
661117395Skan      break;
662117395Skan
663117395Skan    case OPT_funsigned_char:
664132718Skan      flag_signed_char = !value;
665117395Skan      break;
666117395Skan
667117395Skan    case OPT_fcheck_new:
668132718Skan      flag_check_new = value;
669117395Skan      break;
670117395Skan
671117395Skan    case OPT_fconserve_space:
672132718Skan      flag_conserve_space = value;
673117395Skan      break;
674117395Skan
675132718Skan    case OPT_fconstant_string_class_:
676117395Skan      constant_string_class_name = arg;
677117395Skan      break;
678117395Skan
679117395Skan    case OPT_fdefault_inline:
680132718Skan      flag_default_inline = value;
681117395Skan      break;
682117395Skan
683117395Skan    case OPT_felide_constructors:
684132718Skan      flag_elide_constructors = value;
685117395Skan      break;
686117395Skan
687117395Skan    case OPT_fenforce_eh_specs:
688132718Skan      flag_enforce_eh_specs = value;
689117395Skan      break;
690117395Skan
691169699Skan    case OPT_fextended_identifiers:
692169699Skan      cpp_opts->extended_identifiers = value;
693117395Skan      break;
694117395Skan
695117395Skan    case OPT_ffor_scope:
696132718Skan      flag_new_for_scope = value;
697117395Skan      break;
698117395Skan
699117395Skan    case OPT_fgnu_keywords:
700132718Skan      flag_no_gnu_keywords = !value;
701117395Skan      break;
702117395Skan
703117395Skan    case OPT_fgnu_runtime:
704132718Skan      flag_next_runtime = !value;
705117395Skan      break;
706117395Skan
707117395Skan    case OPT_fhandle_exceptions:
708169699Skan      warning (0, "-fhandle-exceptions has been renamed -fexceptions (and is now on by default)");
709132718Skan      flag_exceptions = value;
710117395Skan      break;
711117395Skan
712117395Skan    case OPT_fimplement_inlines:
713132718Skan      flag_implement_inlines = value;
714117395Skan      break;
715117395Skan
716117395Skan    case OPT_fimplicit_inline_templates:
717132718Skan      flag_implicit_inline_templates = value;
718117395Skan      break;
719117395Skan
720117395Skan    case OPT_fimplicit_templates:
721132718Skan      flag_implicit_templates = value;
722117395Skan      break;
723117395Skan
724260074Spfg    case OPT_flax_vector_conversions:
725260074Spfg      flag_lax_vector_conversions = value;
726260074Spfg      break;
727260074Spfg
728117395Skan    case OPT_fms_extensions:
729132718Skan      flag_ms_extensions = value;
730117395Skan      break;
731117395Skan
732117395Skan    case OPT_fnext_runtime:
733132718Skan      flag_next_runtime = value;
734117395Skan      break;
735117395Skan
736132718Skan    case OPT_fnil_receivers:
737132718Skan      flag_nil_receivers = value;
738132718Skan      break;
739132718Skan
740117395Skan    case OPT_fnonansi_builtins:
741132718Skan      flag_no_nonansi_builtin = !value;
742117395Skan      break;
743117395Skan
744117395Skan    case OPT_foperator_names:
745132718Skan      cpp_opts->operator_names = value;
746117395Skan      break;
747117395Skan
748117395Skan    case OPT_foptional_diags:
749132718Skan      flag_optional_diags = value;
750117395Skan      break;
751117395Skan
752132718Skan    case OPT_fpch_deps:
753132718Skan      cpp_opts->restore_pch_deps = value;
754132718Skan      break;
755132718Skan
756169699Skan    case OPT_fpch_preprocess:
757169699Skan      flag_pch_preprocess = value;
758169699Skan      break;
759169699Skan
760117395Skan    case OPT_fpermissive:
761132718Skan      flag_permissive = value;
762117395Skan      break;
763117395Skan
764117395Skan    case OPT_fpreprocessed:
765132718Skan      cpp_opts->preprocessed = value;
766117395Skan      break;
767117395Skan
768132718Skan    case OPT_freplace_objc_classes:
769132718Skan      flag_replace_objc_classes = value;
770132718Skan      break;
771169699Skan
772117395Skan    case OPT_frepo:
773132718Skan      flag_use_repository = value;
774132718Skan      if (value)
775117395Skan	flag_implicit_templates = 0;
776117395Skan      break;
777117395Skan
778117395Skan    case OPT_frtti:
779132718Skan      flag_rtti = value;
780117395Skan      break;
781117395Skan
782117395Skan    case OPT_fshow_column:
783132718Skan      cpp_opts->show_column = value;
784117395Skan      break;
785117395Skan
786117395Skan    case OPT_fstats:
787132718Skan      flag_detailed_statistics = value;
788117395Skan      break;
789117395Skan
790132718Skan    case OPT_ftabstop_:
791117395Skan      /* It is documented that we silently ignore silly values.  */
792132718Skan      if (value >= 1 && value <= 100)
793132718Skan	cpp_opts->tabstop = value;
794117395Skan      break;
795117395Skan
796132718Skan    case OPT_fexec_charset_:
797132718Skan      cpp_opts->narrow_charset = arg;
798117395Skan      break;
799117395Skan
800132718Skan    case OPT_fwide_exec_charset_:
801132718Skan      cpp_opts->wide_charset = arg;
802117395Skan      break;
803117395Skan
804132718Skan    case OPT_finput_charset_:
805132718Skan      cpp_opts->input_charset = arg;
806132718Skan      break;
807132718Skan
808132718Skan    case OPT_ftemplate_depth_:
809132718Skan      max_tinst_depth = value;
810132718Skan      break;
811132718Skan
812117395Skan    case OPT_fuse_cxa_atexit:
813132718Skan      flag_use_cxa_atexit = value;
814117395Skan      break;
815169699Skan
816169699Skan    case OPT_fuse_cxa_get_exception_ptr:
817169699Skan      flag_use_cxa_get_exception_ptr = value;
818169699Skan      break;
819117395Skan
820169699Skan    case OPT_fvisibility_inlines_hidden:
821169699Skan      visibility_options.inlines_hidden = value;
822169699Skan      break;
823169699Skan
824117395Skan    case OPT_fweak:
825132718Skan      flag_weak = value;
826117395Skan      break;
827117395Skan
828169699Skan    case OPT_fthreadsafe_statics:
829169699Skan      flag_threadsafe_statics = value;
830169699Skan      break;
831169699Skan
832132718Skan    case OPT_fzero_link:
833132718Skan      flag_zero_link = value;
834132718Skan      break;
835132718Skan
836117395Skan    case OPT_gen_decls:
837117395Skan      flag_gen_declaration = 1;
838117395Skan      break;
839117395Skan
840259268Spfg    case OPT_femit_struct_debug_baseonly:
841259268Spfg      set_struct_debug_option ("base");
842259268Spfg      break;
843259268Spfg
844259268Spfg    case OPT_femit_struct_debug_reduced:
845259268Spfg      set_struct_debug_option ("dir:ord:sys,dir:gen:any,ind:base");
846259268Spfg      break;
847259268Spfg
848259268Spfg    case OPT_femit_struct_debug_detailed_:
849259268Spfg      set_struct_debug_option (arg);
850259268Spfg      break;
851259268Spfg
852132718Skan    case OPT_idirafter:
853169699Skan      add_path (xstrdup (arg), AFTER, 0, true);
854132718Skan      break;
855132718Skan
856132718Skan    case OPT_imacros:
857132718Skan    case OPT_include:
858132718Skan      defer_opt (code, arg);
859132718Skan      break;
860132718Skan
861169699Skan    case OPT_imultilib:
862169699Skan      imultilib = arg;
863169699Skan      break;
864169699Skan
865132718Skan    case OPT_iprefix:
866132718Skan      iprefix = arg;
867132718Skan      break;
868132718Skan
869169699Skan    case OPT_iquote:
870169699Skan      add_path (xstrdup (arg), QUOTE, 0, true);
871169699Skan      break;
872169699Skan
873132718Skan    case OPT_isysroot:
874132718Skan      sysroot = arg;
875132718Skan      break;
876132718Skan
877132718Skan    case OPT_isystem:
878169699Skan      add_path (xstrdup (arg), SYSTEM, 0, true);
879132718Skan      break;
880132718Skan
881132718Skan    case OPT_iwithprefix:
882132718Skan      add_prefixed_path (arg, SYSTEM);
883132718Skan      break;
884132718Skan
885132718Skan    case OPT_iwithprefixbefore:
886132718Skan      add_prefixed_path (arg, BRACKET);
887132718Skan      break;
888132718Skan
889117395Skan    case OPT_lang_asm:
890117395Skan      cpp_set_lang (parse_in, CLK_ASM);
891132718Skan      cpp_opts->dollars_in_ident = false;
892117395Skan      break;
893117395Skan
894169699Skan    case OPT_lang_fortran:
895169699Skan      lang_fortran = true;
896169699Skan      break;
897169699Skan
898117395Skan    case OPT_lang_objc:
899117395Skan      cpp_opts->objc = 1;
900117395Skan      break;
901117395Skan
902117395Skan    case OPT_nostdinc:
903132718Skan      std_inc = false;
904117395Skan      break;
905117395Skan
906132718Skan    case OPT_nostdinc__:
907132718Skan      std_cxx_inc = false;
908117395Skan      break;
909117395Skan
910117395Skan    case OPT_o:
911117395Skan      if (!out_fname)
912117395Skan	out_fname = arg;
913117395Skan      else
914132718Skan	error ("output filename specified twice");
915117395Skan      break;
916117395Skan
917117395Skan      /* We need to handle the -pedantic switches here, rather than in
918117395Skan	 c_common_post_options, so that a subsequent -Wno-endif-labels
919117395Skan	 is not overridden.  */
920117395Skan    case OPT_pedantic_errors:
921117395Skan      cpp_opts->pedantic_errors = 1;
922132718Skan      /* Fall through.  */
923117395Skan    case OPT_pedantic:
924117395Skan      cpp_opts->pedantic = 1;
925117395Skan      cpp_opts->warn_endif_labels = 1;
926169699Skan      if (warn_pointer_sign == -1)
927169699Skan	warn_pointer_sign = 1;
928169699Skan      if (warn_overlength_strings == -1)
929169699Skan	warn_overlength_strings = 1;
930117395Skan      break;
931117395Skan
932117395Skan    case OPT_print_objc_runtime_info:
933117395Skan      print_struct_values = 1;
934117395Skan      break;
935117395Skan
936169699Skan    case OPT_print_pch_checksum:
937169699Skan      c_common_print_pch_checksum (stdout);
938169699Skan      exit_after_options = true;
939169699Skan      break;
940169699Skan
941117395Skan    case OPT_remap:
942117395Skan      cpp_opts->remap = 1;
943117395Skan      break;
944117395Skan
945132718Skan    case OPT_std_c__98:
946132718Skan    case OPT_std_gnu__98:
947169699Skan      if (!preprocessing_asm_p)
948169699Skan	set_std_cxx98 (code == OPT_std_c__98 /* ISO */);
949117395Skan      break;
950117395Skan
951117395Skan    case OPT_std_c89:
952117395Skan    case OPT_std_iso9899_1990:
953117395Skan    case OPT_std_iso9899_199409:
954169699Skan      if (!preprocessing_asm_p)
955169699Skan	set_std_c89 (code == OPT_std_iso9899_199409 /* c94 */, true /* ISO */);
956117395Skan      break;
957117395Skan
958117395Skan    case OPT_std_gnu89:
959169699Skan      if (!preprocessing_asm_p)
960169699Skan	set_std_c89 (false /* c94 */, false /* ISO */);
961117395Skan      break;
962117395Skan
963117395Skan    case OPT_std_c99:
964117395Skan    case OPT_std_c9x:
965117395Skan    case OPT_std_iso9899_1999:
966117395Skan    case OPT_std_iso9899_199x:
967169699Skan      if (!preprocessing_asm_p)
968169699Skan	set_std_c99 (true /* ISO */);
969117395Skan      break;
970117395Skan
971117395Skan    case OPT_std_gnu99:
972117395Skan    case OPT_std_gnu9x:
973169699Skan      if (!preprocessing_asm_p)
974169699Skan	set_std_c99 (false /* ISO */);
975117395Skan      break;
976117395Skan
977117395Skan    case OPT_trigraphs:
978117395Skan      cpp_opts->trigraphs = 1;
979117395Skan      break;
980117395Skan
981117395Skan    case OPT_traditional_cpp:
982117395Skan      cpp_opts->traditional = 1;
983117395Skan      break;
984117395Skan
985117395Skan    case OPT_undef:
986117395Skan      flag_undef = 1;
987117395Skan      break;
988117395Skan
989117395Skan    case OPT_w:
990117395Skan      cpp_opts->inhibit_warnings = 1;
991117395Skan      break;
992117395Skan
993117395Skan    case OPT_v:
994132718Skan      verbose = true;
995117395Skan      break;
996117395Skan    }
997117395Skan
998117395Skan  return result;
999117395Skan}
1000117395Skan
1001117395Skan/* Post-switch processing.  */
1002117395Skanbool
1003132718Skanc_common_post_options (const char **pfilename)
1004117395Skan{
1005132718Skan  struct cpp_callbacks *cb;
1006132718Skan
1007117395Skan  /* Canonicalize the input and output filenames.  */
1008132718Skan  if (in_fnames == NULL)
1009132718Skan    {
1010169699Skan      in_fnames = XNEWVEC (const char *, 1);
1011132718Skan      in_fnames[0] = "";
1012132718Skan    }
1013132718Skan  else if (strcmp (in_fnames[0], "-") == 0)
1014132718Skan    in_fnames[0] = "";
1015117395Skan
1016117395Skan  if (out_fname == NULL || !strcmp (out_fname, "-"))
1017117395Skan    out_fname = "";
1018117395Skan
1019117395Skan  if (cpp_opts->deps.style == DEPS_NONE)
1020117395Skan    check_deps_environment_vars ();
1021117395Skan
1022117395Skan  handle_deferred_opts ();
1023117395Skan
1024117395Skan  sanitize_cpp_opts ();
1025117395Skan
1026169699Skan  register_include_chains (parse_in, sysroot, iprefix, imultilib,
1027132718Skan			   std_inc, std_cxx_inc && c_dialect_cxx (), verbose);
1028132718Skan
1029169699Skan#ifdef C_COMMON_OVERRIDE_OPTIONS
1030169699Skan  /* Some machines may reject certain combinations of C
1031169699Skan     language-specific options.  */
1032169699Skan  C_COMMON_OVERRIDE_OPTIONS;
1033169699Skan#endif
1034169699Skan
1035117395Skan  flag_inline_trees = 1;
1036117395Skan
1037169699Skan  /* Use tree inlining.  */
1038169699Skan  if (!flag_no_inline)
1039169699Skan    flag_no_inline = 1;
1040169699Skan  if (flag_inline_functions)
1041169699Skan    flag_inline_trees = 2;
1042117395Skan
1043261188Spfg  /* APPLE LOCAL begin radar 5811887  - radar 6084601 */
1044261188Spfg  /* In all flavors of c99, except for ObjC/ObjC++, blocks are off by default
1045261188Spfg     unless requested via -fblocks. */
1046261188Spfg  if (flag_blocks == -1 && flag_iso && !c_dialect_objc())
1047261188Spfg    flag_blocks = 0;
1048261188Spfg  /* APPLE LOCAL end radar 5811887 - radar 6084601 */
1049261188Spfg
1050189824Sdas  /* By default we use C99 inline semantics in GNU99 or C99 mode.  C99
1051189824Sdas     inline semantics are not supported in GNU89 or C89 mode.  */
1052189824Sdas  if (flag_gnu89_inline == -1)
1053189824Sdas    flag_gnu89_inline = !flag_isoc99;
1054189824Sdas  else if (!flag_gnu89_inline && !flag_isoc99)
1055189824Sdas    error ("-fno-gnu89-inline is only supported in GNU99 or C99 mode");
1056169699Skan
1057169699Skan  /* If we are given more than one input file, we must use
1058169699Skan     unit-at-a-time mode.  */
1059169699Skan  if (num_in_fnames > 1)
1060169699Skan    flag_unit_at_a_time = 1;
1061169699Skan
1062169699Skan  /* Default to ObjC sjlj exception handling if NeXT runtime.  */
1063169699Skan  if (flag_objc_sjlj_exceptions < 0)
1064169699Skan    flag_objc_sjlj_exceptions = flag_next_runtime;
1065169699Skan  if (flag_objc_exceptions && !flag_objc_sjlj_exceptions)
1066169699Skan    flag_exceptions = 1;
1067169699Skan
1068169699Skan  /* -Wextra implies -Wsign-compare, -Wmissing-field-initializers and
1069169699Skan     -Woverride-init, but not if explicitly overridden.  */
1070132718Skan  if (warn_sign_compare == -1)
1071132718Skan    warn_sign_compare = extra_warnings;
1072169699Skan  if (warn_missing_field_initializers == -1)
1073169699Skan    warn_missing_field_initializers = extra_warnings;
1074169699Skan  if (warn_override_init == -1)
1075169699Skan    warn_override_init = extra_warnings;
1076132718Skan
1077169699Skan  /* -Wpointer_sign is disabled by default, but it is enabled if any
1078169699Skan     of -Wall or -pedantic are given.  */
1079169699Skan  if (warn_pointer_sign == -1)
1080169699Skan    warn_pointer_sign = 0;
1081169699Skan
1082169699Skan  /* -Woverlength-strings is off by default, but is enabled by -pedantic.
1083169699Skan     It is never enabled in C++, as the minimum limit is not normative
1084169699Skan     in that standard.  */
1085169699Skan  if (warn_overlength_strings == -1 || c_dialect_cxx ())
1086169699Skan    warn_overlength_strings = 0;
1087169699Skan
1088117395Skan  /* Special format checking options don't work without -Wformat; warn if
1089117395Skan     they are used.  */
1090169699Skan  if (!warn_format)
1091169699Skan    {
1092169699Skan      warning (OPT_Wformat_y2k,
1093169699Skan	       "-Wformat-y2k ignored without -Wformat");
1094169699Skan      warning (OPT_Wformat_extra_args,
1095169699Skan	       "-Wformat-extra-args ignored without -Wformat");
1096169699Skan      warning (OPT_Wformat_zero_length,
1097169699Skan	       "-Wformat-zero-length ignored without -Wformat");
1098169699Skan      warning (OPT_Wformat_nonliteral,
1099169699Skan	       "-Wformat-nonliteral ignored without -Wformat");
1100169699Skan      warning (OPT_Wformat_security,
1101169699Skan	       "-Wformat-security ignored without -Wformat");
1102169699Skan    }
1103117395Skan
1104169699Skan  /* C99 requires special handling of complex multiplication and division;
1105169699Skan     -ffast-math and -fcx-limited-range are handled in process_options.  */
1106169699Skan  if (flag_isoc99)
1107169699Skan    flag_complex_method = 2;
1108169699Skan
1109132718Skan  if (flag_preprocess_only)
1110132718Skan    {
1111132718Skan      /* Open the output now.  We must do so even if flag_no_output is
1112132718Skan	 on, because there may be other output than from the actual
1113132718Skan	 preprocessing (e.g. from -dM).  */
1114132718Skan      if (out_fname[0] == '\0')
1115132718Skan	out_stream = stdout;
1116132718Skan      else
1117132718Skan	out_stream = fopen (out_fname, "w");
1118132718Skan
1119132718Skan      if (out_stream == NULL)
1120132718Skan	{
1121132718Skan	  fatal_error ("opening output file %s: %m", out_fname);
1122132718Skan	  return false;
1123132718Skan	}
1124132718Skan
1125132718Skan      if (num_in_fnames > 1)
1126132718Skan	error ("too many filenames given.  Type %s --help for usage",
1127132718Skan	       progname);
1128132718Skan
1129132718Skan      init_pp_output (out_stream);
1130132718Skan    }
1131132718Skan  else
1132132718Skan    {
1133132718Skan      init_c_lex ();
1134132718Skan
1135132718Skan      /* Yuk.  WTF is this?  I do know ObjC relies on it somewhere.  */
1136169699Skan      input_location = UNKNOWN_LOCATION;
1137132718Skan    }
1138132718Skan
1139132718Skan  cb = cpp_get_callbacks (parse_in);
1140132718Skan  cb->file_change = cb_file_change;
1141132718Skan  cb->dir_change = cb_dir_change;
1142132718Skan  cpp_post_options (parse_in);
1143132718Skan
1144169699Skan  input_location = UNKNOWN_LOCATION;
1145132718Skan
1146117395Skan  /* If an error has occurred in cpplib, note it so we fail
1147117395Skan     immediately.  */
1148117395Skan  errorcount += cpp_errors (parse_in);
1149117395Skan
1150132718Skan  *pfilename = this_input_filename
1151132718Skan    = cpp_read_main_file (parse_in, in_fnames[0]);
1152146908Skan  /* Don't do any compilation or preprocessing if there is no input file.  */
1153132718Skan  if (this_input_filename == NULL)
1154146908Skan    {
1155146908Skan      errorcount++;
1156146908Skan      return false;
1157146908Skan    }
1158117395Skan
1159132718Skan  if (flag_working_directory
1160169699Skan      && flag_preprocess_only && !flag_no_line_commands)
1161132718Skan    pp_dir_change (parse_in, get_src_pwd ());
1162117395Skan
1163132718Skan  return flag_preprocess_only;
1164117395Skan}
1165117395Skan
1166117395Skan/* Front end initialization common to C, ObjC and C++.  */
1167132718Skanbool
1168132718Skanc_common_init (void)
1169117395Skan{
1170117395Skan  /* Set up preprocessor arithmetic.  Must be done after call to
1171117395Skan     c_common_nodes_and_builtins for type nodes to be good.  */
1172117395Skan  cpp_opts->precision = TYPE_PRECISION (intmax_type_node);
1173117395Skan  cpp_opts->char_precision = TYPE_PRECISION (char_type_node);
1174117395Skan  cpp_opts->int_precision = TYPE_PRECISION (integer_type_node);
1175117395Skan  cpp_opts->wchar_precision = TYPE_PRECISION (wchar_type_node);
1176169699Skan  cpp_opts->unsigned_wchar = TYPE_UNSIGNED (wchar_type_node);
1177132718Skan  cpp_opts->bytes_big_endian = BYTES_BIG_ENDIAN;
1178117395Skan
1179132718Skan  /* This can't happen until after wchar_precision and bytes_big_endian
1180132718Skan     are known.  */
1181132718Skan  cpp_init_iconv (parse_in);
1182117395Skan
1183169699Skan  if (version_flag)
1184169699Skan    c_common_print_pch_checksum (stderr);
1185169699Skan
1186117395Skan  if (flag_preprocess_only)
1187117395Skan    {
1188132718Skan      finish_options ();
1189132718Skan      preprocess_file (parse_in);
1190132718Skan      return false;
1191117395Skan    }
1192117395Skan
1193132718Skan  /* Has to wait until now so that cpplib has its hash table.  */
1194117395Skan  init_pragma ();
1195117395Skan
1196132718Skan  return true;
1197117395Skan}
1198117395Skan
1199132718Skan/* Initialize the integrated preprocessor after debug output has been
1200132718Skan   initialized; loop over each input file.  */
1201132718Skanvoid
1202169699Skanc_common_parse_file (int set_yydebug)
1203132718Skan{
1204169699Skan  unsigned int i;
1205169699Skan
1206169699Skan  /* Enable parser debugging, if requested and we can.  If requested
1207169699Skan     and we can't, notify the user.  */
1208132718Skan#if YYDEBUG != 0
1209132718Skan  yydebug = set_yydebug;
1210132718Skan#else
1211169699Skan  if (set_yydebug)
1212169699Skan    warning (0, "YYDEBUG was not defined at build time, -dy ignored");
1213132718Skan#endif
1214132718Skan
1215169699Skan  i = 0;
1216169699Skan  for (;;)
1217132718Skan    {
1218169699Skan      /* Start the main input file, if the debug writer wants it. */
1219169699Skan      if (debug_hooks->start_end_main_source_file)
1220169699Skan	(*debug_hooks->start_source_file) (0, this_input_filename);
1221132718Skan      finish_options ();
1222169699Skan      pch_init ();
1223169699Skan      push_file_scope ();
1224132718Skan      c_parse_file ();
1225169699Skan      finish_file ();
1226169699Skan      pop_file_scope ();
1227169699Skan      /* And end the main input file, if the debug writer wants it  */
1228169699Skan      if (debug_hooks->start_end_main_source_file)
1229169699Skan	(*debug_hooks->end_source_file) (0);
1230169699Skan      if (++i >= num_in_fnames)
1231169699Skan	break;
1232169699Skan      cpp_undef_all (parse_in);
1233169699Skan      this_input_filename
1234169699Skan	= cpp_read_main_file (parse_in, in_fnames[i]);
1235169699Skan      /* If an input file is missing, abandon further compilation.
1236169699Skan	 cpplib has issued a diagnostic.  */
1237169699Skan      if (!this_input_filename)
1238169699Skan	break;
1239169699Skan    }
1240132718Skan}
1241132718Skan
1242117395Skan/* Common finish hook for the C, ObjC and C++ front ends.  */
1243117395Skanvoid
1244132718Skanc_common_finish (void)
1245117395Skan{
1246117395Skan  FILE *deps_stream = NULL;
1247117395Skan
1248117395Skan  if (cpp_opts->deps.style != DEPS_NONE)
1249117395Skan    {
1250117395Skan      /* If -M or -MM was seen without -MF, default output to the
1251117395Skan	 output stream.  */
1252117395Skan      if (!deps_file)
1253117395Skan	deps_stream = out_stream;
1254117395Skan      else
1255117395Skan	{
1256117395Skan	  deps_stream = fopen (deps_file, deps_append ? "a": "w");
1257117395Skan	  if (!deps_stream)
1258132718Skan	    fatal_error ("opening dependency file %s: %m", deps_file);
1259117395Skan	}
1260117395Skan    }
1261117395Skan
1262117395Skan  /* For performance, avoid tearing down cpplib's internal structures
1263117395Skan     with cpp_destroy ().  */
1264117395Skan  errorcount += cpp_finish (parse_in, deps_stream);
1265117395Skan
1266117395Skan  if (deps_stream && deps_stream != out_stream
1267117395Skan      && (ferror (deps_stream) || fclose (deps_stream)))
1268132718Skan    fatal_error ("closing dependency file %s: %m", deps_file);
1269117395Skan
1270117395Skan  if (out_stream && (ferror (out_stream) || fclose (out_stream)))
1271132718Skan    fatal_error ("when writing output to %s: %m", out_fname);
1272117395Skan}
1273117395Skan
1274117395Skan/* Either of two environment variables can specify output of
1275117395Skan   dependencies.  Their value is either "OUTPUT_FILE" or "OUTPUT_FILE
1276117395Skan   DEPS_TARGET", where OUTPUT_FILE is the file to write deps info to
1277117395Skan   and DEPS_TARGET is the target to mention in the deps.  They also
1278117395Skan   result in dependency information being appended to the output file
1279117395Skan   rather than overwriting it, and like Sun's compiler
1280117395Skan   SUNPRO_DEPENDENCIES suppresses the dependency on the main file.  */
1281117395Skanstatic void
1282132718Skancheck_deps_environment_vars (void)
1283117395Skan{
1284117395Skan  char *spec;
1285117395Skan
1286117395Skan  GET_ENVIRONMENT (spec, "DEPENDENCIES_OUTPUT");
1287117395Skan  if (spec)
1288117395Skan    cpp_opts->deps.style = DEPS_USER;
1289117395Skan  else
1290117395Skan    {
1291117395Skan      GET_ENVIRONMENT (spec, "SUNPRO_DEPENDENCIES");
1292117395Skan      if (spec)
1293117395Skan	{
1294117395Skan	  cpp_opts->deps.style = DEPS_SYSTEM;
1295117395Skan	  cpp_opts->deps.ignore_main_file = true;
1296117395Skan	}
1297117395Skan    }
1298117395Skan
1299117395Skan  if (spec)
1300117395Skan    {
1301117395Skan      /* Find the space before the DEPS_TARGET, if there is one.  */
1302117395Skan      char *s = strchr (spec, ' ');
1303117395Skan      if (s)
1304117395Skan	{
1305117395Skan	  /* Let the caller perform MAKE quoting.  */
1306117395Skan	  defer_opt (OPT_MT, s + 1);
1307117395Skan	  *s = '\0';
1308117395Skan	}
1309117395Skan
1310117395Skan      /* Command line -MF overrides environment variables and default.  */
1311117395Skan      if (!deps_file)
1312117395Skan	deps_file = spec;
1313117395Skan
1314117395Skan      deps_append = 1;
1315169699Skan      deps_seen = true;
1316117395Skan    }
1317117395Skan}
1318117395Skan
1319117395Skan/* Handle deferred command line switches.  */
1320117395Skanstatic void
1321132718Skanhandle_deferred_opts (void)
1322117395Skan{
1323117395Skan  size_t i;
1324169699Skan  struct deps *deps;
1325117395Skan
1326169699Skan  /* Avoid allocating the deps buffer if we don't need it.
1327169699Skan     (This flag may be true without there having been -MT or -MQ
1328169699Skan     options, but we'll still need the deps buffer.)  */
1329169699Skan  if (!deps_seen)
1330169699Skan    return;
1331169699Skan
1332169699Skan  deps = cpp_get_deps (parse_in);
1333169699Skan
1334117395Skan  for (i = 0; i < deferred_count; i++)
1335117395Skan    {
1336117395Skan      struct deferred_opt *opt = &deferred_opts[i];
1337117395Skan
1338132718Skan      if (opt->code == OPT_MT || opt->code == OPT_MQ)
1339169699Skan	deps_add_target (deps, opt->arg, opt->code == OPT_MQ);
1340117395Skan    }
1341117395Skan}
1342117395Skan
1343117395Skan/* These settings are appropriate for GCC, but not necessarily so for
1344117395Skan   cpplib as a library.  */
1345117395Skanstatic void
1346132718Skansanitize_cpp_opts (void)
1347117395Skan{
1348117395Skan  /* If we don't know what style of dependencies to output, complain
1349117395Skan     if any other dependency switches have been given.  */
1350117395Skan  if (deps_seen && cpp_opts->deps.style == DEPS_NONE)
1351117395Skan    error ("to generate dependencies you must specify either -M or -MM");
1352117395Skan
1353117395Skan  /* -dM and dependencies suppress normal output; do it here so that
1354117395Skan     the last -d[MDN] switch overrides earlier ones.  */
1355132718Skan  if (flag_dump_macros == 'M')
1356132718Skan    flag_no_output = 1;
1357117395Skan
1358259405Spfg  /* By default, -fdirectives-only implies -dD.  This allows subsequent phases
1359259405Spfg     to perform proper macro expansion.  */
1360259405Spfg  if (cpp_opts->directives_only && !cpp_opts->preprocessed && !flag_dump_macros)
1361259405Spfg    flag_dump_macros = 'D';
1362259405Spfg
1363117395Skan  /* Disable -dD, -dN and -dI if normal output is suppressed.  Allow
1364117395Skan     -dM since at least glibc relies on -M -dM to work.  */
1365169699Skan  /* Also, flag_no_output implies flag_no_line_commands, always.  */
1366132718Skan  if (flag_no_output)
1367117395Skan    {
1368132718Skan      if (flag_dump_macros != 'M')
1369132718Skan	flag_dump_macros = 0;
1370132718Skan      flag_dump_includes = 0;
1371146908Skan      flag_no_line_commands = 1;
1372117395Skan    }
1373117395Skan
1374117395Skan  cpp_opts->unsigned_char = !flag_signed_char;
1375117395Skan  cpp_opts->stdc_0_in_system_headers = STDC_0_IN_SYSTEM_HEADERS;
1376117395Skan
1377117395Skan  /* We want -Wno-long-long to override -pedantic -std=non-c99
1378117395Skan     and/or -Wtraditional, whatever the ordering.  */
1379117395Skan  cpp_opts->warn_long_long
1380117395Skan    = warn_long_long && ((!flag_isoc99 && pedantic) || warn_traditional);
1381132718Skan
1382169699Skan  /* Similarly with -Wno-variadic-macros.  No check for c99 here, since
1383169699Skan     this also turns off warnings about GCCs extension.  */
1384169699Skan  cpp_opts->warn_variadic_macros
1385169699Skan    = warn_variadic_macros && (pedantic || warn_traditional);
1386169699Skan
1387132718Skan  /* If we're generating preprocessor output, emit current directory
1388132718Skan     if explicitly requested or if debugging information is enabled.
1389132718Skan     ??? Maybe we should only do it for debugging formats that
1390132718Skan     actually output the current directory?  */
1391132718Skan  if (flag_working_directory == -1)
1392132718Skan    flag_working_directory = (debug_info_level != DINFO_LEVEL_NONE);
1393259405Spfg
1394259405Spfg  if (cpp_opts->directives_only)
1395259405Spfg    {
1396259405Spfg      if (warn_unused_macros)
1397259405Spfg	error ("-fdirectives-only is incompatible with -Wunused_macros");
1398259405Spfg      if (cpp_opts->traditional)
1399259405Spfg	error ("-fdirectives-only is incompatible with -traditional");
1400259405Spfg    }
1401117395Skan}
1402117395Skan
1403132718Skan/* Add include path with a prefix at the front of its name.  */
1404132718Skanstatic void
1405132718Skanadd_prefixed_path (const char *suffix, size_t chain)
1406132718Skan{
1407132718Skan  char *path;
1408132718Skan  const char *prefix;
1409132718Skan  size_t prefix_len, suffix_len;
1410132718Skan
1411132718Skan  suffix_len = strlen (suffix);
1412132718Skan  prefix     = iprefix ? iprefix : cpp_GCC_INCLUDE_DIR;
1413132718Skan  prefix_len = iprefix ? strlen (iprefix) : cpp_GCC_INCLUDE_DIR_len;
1414132718Skan
1415169699Skan  path = (char *) xmalloc (prefix_len + suffix_len + 1);
1416132718Skan  memcpy (path, prefix, prefix_len);
1417132718Skan  memcpy (path + prefix_len, suffix, suffix_len);
1418132718Skan  path[prefix_len + suffix_len] = '\0';
1419132718Skan
1420169699Skan  add_path (path, chain, 0, false);
1421132718Skan}
1422132718Skan
1423132718Skan/* Handle -D, -U, -A, -imacros, and the first -include.  */
1424132718Skanstatic void
1425132718Skanfinish_options (void)
1426132718Skan{
1427132718Skan  if (!cpp_opts->preprocessed)
1428132718Skan    {
1429132718Skan      size_t i;
1430132718Skan
1431169699Skan      cb_file_change (parse_in,
1432169699Skan		      linemap_add (&line_table, LC_RENAME, 0,
1433169699Skan				   _("<built-in>"), 0));
1434169699Skan
1435132718Skan      cpp_init_builtins (parse_in, flag_hosted);
1436132718Skan      c_cpp_builtins (parse_in);
1437132718Skan
1438132718Skan      /* We're about to send user input to cpplib, so make it warn for
1439132718Skan	 things that we previously (when we sent it internal definitions)
1440132718Skan	 told it to not warn.
1441132718Skan
1442132718Skan	 C99 permits implementation-defined characters in identifiers.
1443132718Skan	 The documented meaning of -std= is to turn off extensions that
1444132718Skan	 conflict with the specified standard, and since a strictly
1445132718Skan	 conforming program cannot contain a '$', we do not condition
1446132718Skan	 their acceptance on the -std= setting.  */
1447132718Skan      cpp_opts->warn_dollars = (cpp_opts->pedantic && !cpp_opts->c99);
1448132718Skan
1449169699Skan      cb_file_change (parse_in,
1450169699Skan		      linemap_add (&line_table, LC_RENAME, 0,
1451169699Skan				   _("<command-line>"), 0));
1452169699Skan
1453132718Skan      for (i = 0; i < deferred_count; i++)
1454132718Skan	{
1455132718Skan	  struct deferred_opt *opt = &deferred_opts[i];
1456132718Skan
1457132718Skan	  if (opt->code == OPT_D)
1458132718Skan	    cpp_define (parse_in, opt->arg);
1459132718Skan	  else if (opt->code == OPT_U)
1460132718Skan	    cpp_undef (parse_in, opt->arg);
1461132718Skan	  else if (opt->code == OPT_A)
1462132718Skan	    {
1463132718Skan	      if (opt->arg[0] == '-')
1464132718Skan		cpp_unassert (parse_in, opt->arg + 1);
1465132718Skan	      else
1466132718Skan		cpp_assert (parse_in, opt->arg);
1467132718Skan	    }
1468132718Skan	}
1469132718Skan
1470132718Skan      /* Handle -imacros after -D and -U.  */
1471132718Skan      for (i = 0; i < deferred_count; i++)
1472132718Skan	{
1473132718Skan	  struct deferred_opt *opt = &deferred_opts[i];
1474132718Skan
1475132718Skan	  if (opt->code == OPT_imacros
1476132718Skan	      && cpp_push_include (parse_in, opt->arg))
1477132718Skan	    {
1478132718Skan	      /* Disable push_command_line_include callback for now.  */
1479132718Skan	      include_cursor = deferred_count + 1;
1480132718Skan	      cpp_scan_nooutput (parse_in);
1481132718Skan	    }
1482132718Skan	}
1483132718Skan    }
1484259405Spfg  else if (cpp_opts->directives_only)
1485259405Spfg    cpp_init_special_builtins (parse_in);
1486132718Skan
1487132718Skan  include_cursor = 0;
1488132718Skan  push_command_line_include ();
1489132718Skan}
1490132718Skan
1491132718Skan/* Give CPP the next file given by -include, if any.  */
1492132718Skanstatic void
1493132718Skanpush_command_line_include (void)
1494132718Skan{
1495132718Skan  while (include_cursor < deferred_count)
1496132718Skan    {
1497132718Skan      struct deferred_opt *opt = &deferred_opts[include_cursor++];
1498132718Skan
1499169699Skan      if (!cpp_opts->preprocessed && opt->code == OPT_include
1500132718Skan	  && cpp_push_include (parse_in, opt->arg))
1501132718Skan	return;
1502132718Skan    }
1503132718Skan
1504132718Skan  if (include_cursor == deferred_count)
1505132718Skan    {
1506132718Skan      include_cursor++;
1507132718Skan      /* -Wunused-macros should only warn about macros defined hereafter.  */
1508132718Skan      cpp_opts->warn_unused_macros = warn_unused_macros;
1509132718Skan      /* Restore the line map from <command line>.  */
1510169699Skan      if (!cpp_opts->preprocessed)
1511169699Skan	cpp_change_file (parse_in, LC_RENAME, this_input_filename);
1512132718Skan
1513132718Skan      /* Set this here so the client can change the option if it wishes,
1514132718Skan	 and after stacking the main file so we don't trace the main file.  */
1515169699Skan      line_table.trace_includes = cpp_opts->print_include_names;
1516132718Skan    }
1517132718Skan}
1518132718Skan
1519132718Skan/* File change callback.  Has to handle -include files.  */
1520132718Skanstatic void
1521169699Skancb_file_change (cpp_reader * ARG_UNUSED (pfile),
1522132718Skan		const struct line_map *new_map)
1523132718Skan{
1524132718Skan  if (flag_preprocess_only)
1525132718Skan    pp_file_change (new_map);
1526132718Skan  else
1527132718Skan    fe_file_change (new_map);
1528132718Skan
1529132718Skan  if (new_map == 0 || (new_map->reason == LC_LEAVE && MAIN_FILE_P (new_map)))
1530132718Skan    push_command_line_include ();
1531132718Skan}
1532132718Skan
1533132718Skanvoid
1534169699Skancb_dir_change (cpp_reader * ARG_UNUSED (pfile), const char *dir)
1535132718Skan{
1536169699Skan  if (!set_src_pwd (dir))
1537169699Skan    warning (0, "too late for # directive to set debug directory");
1538132718Skan}
1539132718Skan
1540117395Skan/* Set the C 89 standard (with 1994 amendments if C94, without GNU
1541117395Skan   extensions if ISO).  There is no concept of gnu94.  */
1542117395Skanstatic void
1543132718Skanset_std_c89 (int c94, int iso)
1544117395Skan{
1545117395Skan  cpp_set_lang (parse_in, c94 ? CLK_STDC94: iso ? CLK_STDC89: CLK_GNUC89);
1546117395Skan  flag_iso = iso;
1547117395Skan  flag_no_asm = iso;
1548117395Skan  flag_no_gnu_keywords = iso;
1549117395Skan  flag_no_nonansi_builtin = iso;
1550117395Skan  flag_isoc94 = c94;
1551117395Skan  flag_isoc99 = 0;
1552117395Skan}
1553117395Skan
1554117395Skan/* Set the C 99 standard (without GNU extensions if ISO).  */
1555117395Skanstatic void
1556132718Skanset_std_c99 (int iso)
1557117395Skan{
1558117395Skan  cpp_set_lang (parse_in, iso ? CLK_STDC99: CLK_GNUC99);
1559117395Skan  flag_no_asm = iso;
1560117395Skan  flag_no_nonansi_builtin = iso;
1561117395Skan  flag_iso = iso;
1562117395Skan  flag_isoc99 = 1;
1563117395Skan  flag_isoc94 = 1;
1564117395Skan}
1565117395Skan
1566117395Skan/* Set the C++ 98 standard (without GNU extensions if ISO).  */
1567117395Skanstatic void
1568132718Skanset_std_cxx98 (int iso)
1569117395Skan{
1570117395Skan  cpp_set_lang (parse_in, iso ? CLK_CXX98: CLK_GNUCXX);
1571117395Skan  flag_no_gnu_keywords = iso;
1572117395Skan  flag_no_nonansi_builtin = iso;
1573117395Skan  flag_iso = iso;
1574117395Skan}
1575117395Skan
1576117395Skan/* Handle setting implicit to ON.  */
1577117395Skanstatic void
1578132718Skanset_Wimplicit (int on)
1579117395Skan{
1580117395Skan  warn_implicit = on;
1581117395Skan  warn_implicit_int = on;
1582117395Skan  if (on)
1583117395Skan    {
1584117395Skan      if (mesg_implicit_function_declaration != 2)
1585117395Skan	mesg_implicit_function_declaration = 1;
1586117395Skan    }
1587117395Skan  else
1588117395Skan    mesg_implicit_function_declaration = 0;
1589117395Skan}
1590117395Skan
1591117395Skan/* Args to -d specify what to dump.  Silently ignore
1592117395Skan   unrecognized options; they may be aimed at toplev.c.  */
1593117395Skanstatic void
1594132718Skanhandle_OPT_d (const char *arg)
1595117395Skan{
1596117395Skan  char c;
1597117395Skan
1598117395Skan  while ((c = *arg++) != '\0')
1599117395Skan    switch (c)
1600117395Skan      {
1601132718Skan      case 'M':			/* Dump macros only.  */
1602132718Skan      case 'N':			/* Dump names.  */
1603132718Skan      case 'D':			/* Dump definitions.  */
1604132718Skan	flag_dump_macros = c;
1605117395Skan	break;
1606117395Skan
1607117395Skan      case 'I':
1608132718Skan	flag_dump_includes = 1;
1609117395Skan	break;
1610117395Skan      }
1611117395Skan}
1612