c-opts.c revision 260074
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: stable/10/contrib/gcc/c-opts.c 260074 2013-12-30 03:39:46Z pfg $ */
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:
388132718Skan      set_Wunused (value);
389132718Skan      set_Wformat (value);
390132718Skan      set_Wimplicit (value);
391132718Skan      warn_char_subscripts = value;
392132718Skan      warn_missing_braces = value;
393132718Skan      warn_parentheses = value;
394132718Skan      warn_return_type = value;
395132718Skan      warn_sequence_point = value;	/* Was C only.  */
396132718Skan      if (c_dialect_cxx ())
397132718Skan	warn_sign_compare = value;
398132718Skan      warn_switch = value;
399259405Spfg      set_warn_strict_aliasing (value);
400169699Skan      warn_strict_overflow = value;
401169699Skan      warn_address = value;
402132718Skan
403117395Skan      /* Only warn about unknown pragmas that are not in system
404132718Skan	 headers.  */
405132718Skan      warn_unknown_pragmas = value;
406117395Skan
407117395Skan      /* We save the value of warn_uninitialized, since if they put
408117395Skan	 -Wuninitialized on the command line, we need to generate a
409117395Skan	 warning about not using it without also specifying -O.  */
410117395Skan      if (warn_uninitialized != 1)
411132718Skan	warn_uninitialized = (value ? 2 : 0);
412117395Skan
413132718Skan      if (!c_dialect_cxx ())
414117395Skan	/* We set this to 2 here, but 1 in -Wmain, so -ffreestanding
415117395Skan	   can turn it off only if it's not explicit.  */
416132718Skan	warn_main = value * 2;
417117395Skan      else
418117395Skan	{
419117395Skan	  /* C++-specific warnings.  */
420132718Skan	  warn_reorder = value;
421132718Skan	  warn_nontemplate_friend = value;
422117395Skan	}
423117395Skan
424132718Skan      cpp_opts->warn_trigraphs = value;
425132718Skan      cpp_opts->warn_comments = value;
426132718Skan      cpp_opts->warn_num_sign_change = value;
427132718Skan      cpp_opts->warn_multichar = value;	/* Was C++ only.  */
428117395Skan
429169699Skan      if (warn_pointer_sign == -1)
430169699Skan	warn_pointer_sign = 1;
431117395Skan      break;
432117395Skan
433117395Skan    case OPT_Wcomment:
434117395Skan    case OPT_Wcomments:
435132718Skan      cpp_opts->warn_comments = value;
436117395Skan      break;
437117395Skan
438117395Skan    case OPT_Wdeprecated:
439132718Skan      cpp_opts->warn_deprecated = value;
440117395Skan      break;
441117395Skan
442117395Skan    case OPT_Wendif_labels:
443132718Skan      cpp_opts->warn_endif_labels = value;
444117395Skan      break;
445117395Skan
446117395Skan    case OPT_Werror:
447132718Skan      cpp_opts->warnings_are_errors = value;
448169699Skan      global_dc->warning_as_error_requested = value;
449117395Skan      break;
450117395Skan
451132718Skan    case OPT_Werror_implicit_function_declaration:
452132718Skan      mesg_implicit_function_declaration = 2;
453117395Skan      break;
454117395Skan
455117395Skan    case OPT_Wformat:
456132718Skan      set_Wformat (value);
457117395Skan      break;
458117395Skan
459132718Skan    case OPT_Wformat_:
460117395Skan      set_Wformat (atoi (arg));
461117395Skan      break;
462117395Skan
463117395Skan    case OPT_Wimplicit:
464132718Skan      set_Wimplicit (value);
465117395Skan      break;
466117395Skan
467117395Skan    case OPT_Wimport:
468132718Skan      /* Silently ignore for now.  */
469117395Skan      break;
470117395Skan
471132718Skan    case OPT_Winvalid_pch:
472132718Skan      cpp_opts->warn_invalid_pch = value;
473132718Skan      break;
474132718Skan
475117395Skan    case OPT_Wmain:
476132718Skan      if (value)
477117395Skan	warn_main = 1;
478117395Skan      else
479117395Skan	warn_main = -1;
480117395Skan      break;
481117395Skan
482169699Skan    case OPT_Wmissing_include_dirs:
483169699Skan      cpp_opts->warn_missing_include_dirs = value;
484117395Skan      break;
485117395Skan
486117395Skan    case OPT_Wmultichar:
487132718Skan      cpp_opts->warn_multichar = value;
488117395Skan      break;
489117395Skan
490259890Spfg      /* APPLE LOCAL begin -Wnewline-eof */
491259890Spfg    case OPT_Wnewline_eof:
492259890Spfg      cpp_opts->warn_newline_at_eof = value;
493259890Spfg      break;
494259890Spfg      /* APPLE LOCAL end -Wnewline-eof */
495259890Spfg
496169699Skan    case OPT_Wnormalized_:
497169699Skan      if (!value || (arg && strcasecmp (arg, "none") == 0))
498169699Skan	cpp_opts->warn_normalize = normalized_none;
499169699Skan      else if (!arg || strcasecmp (arg, "nfkc") == 0)
500169699Skan	cpp_opts->warn_normalize = normalized_KC;
501169699Skan      else if (strcasecmp (arg, "id") == 0)
502169699Skan	cpp_opts->warn_normalize = normalized_identifier_C;
503169699Skan      else if (strcasecmp (arg, "nfc") == 0)
504169699Skan	cpp_opts->warn_normalize = normalized_C;
505169699Skan      else
506169699Skan	error ("argument %qs to %<-Wnormalized%> not recognized", arg);
507117395Skan      break;
508117395Skan
509117395Skan    case OPT_Wreturn_type:
510132718Skan      warn_return_type = value;
511117395Skan      break;
512117395Skan
513169699Skan    case OPT_Wstrict_null_sentinel:
514169699Skan      warn_strict_null_sentinel = value;
515117395Skan      break;
516117395Skan
517117395Skan    case OPT_Wsystem_headers:
518132718Skan      cpp_opts->warn_system_headers = value;
519117395Skan      break;
520117395Skan
521117395Skan    case OPT_Wtraditional:
522132718Skan      cpp_opts->warn_traditional = value;
523117395Skan      break;
524117395Skan
525117395Skan    case OPT_Wtrigraphs:
526132718Skan      cpp_opts->warn_trigraphs = value;
527117395Skan      break;
528117395Skan
529117395Skan    case OPT_Wundef:
530132718Skan      cpp_opts->warn_undef = value;
531117395Skan      break;
532117395Skan
533117395Skan    case OPT_Wunknown_pragmas:
534117395Skan      /* Set to greater than 1, so that even unknown pragmas in
535132718Skan	 system headers will be warned about.  */
536132718Skan      warn_unknown_pragmas = value * 2;
537117395Skan      break;
538117395Skan
539117395Skan    case OPT_Wunused_macros:
540132718Skan      warn_unused_macros = value;
541117395Skan      break;
542117395Skan
543169699Skan    case OPT_Wvariadic_macros:
544169699Skan      warn_variadic_macros = value;
545169699Skan      break;
546169699Skan
547117395Skan    case OPT_Wwrite_strings:
548169699Skan      warn_write_strings = value;
549117395Skan      break;
550132718Skan
551169699Skan    case OPT_Weffc__:
552169699Skan      warn_ecpp = value;
553169699Skan      if (value)
554169699Skan        warn_nonvdtor = true;
555169699Skan      break;
556169699Skan
557117395Skan    case OPT_ansi:
558132718Skan      if (!c_dialect_cxx ())
559117395Skan	set_std_c89 (false, true);
560117395Skan      else
561117395Skan	set_std_cxx98 (true);
562117395Skan      break;
563117395Skan
564117395Skan    case OPT_d:
565117395Skan      handle_OPT_d (arg);
566117395Skan      break;
567117395Skan
568117395Skan    case OPT_fcond_mismatch:
569132718Skan      if (!c_dialect_cxx ())
570117395Skan	{
571132718Skan	  flag_cond_mismatch = value;
572117395Skan	  break;
573117395Skan	}
574117395Skan      /* Fall through.  */
575117395Skan
576117395Skan    case OPT_fall_virtual:
577132718Skan    case OPT_falt_external_templates:
578117395Skan    case OPT_fenum_int_equiv:
579132718Skan    case OPT_fexternal_templates:
580117395Skan    case OPT_fguiding_decls:
581117395Skan    case OPT_fhonor_std:
582117395Skan    case OPT_fhuge_objects:
583117395Skan    case OPT_flabels_ok:
584132718Skan    case OPT_fname_mangling_version_:
585117395Skan    case OPT_fnew_abi:
586117395Skan    case OPT_fnonnull_objects:
587117395Skan    case OPT_fsquangle:
588117395Skan    case OPT_fstrict_prototype:
589117395Skan    case OPT_fthis_is_variable:
590117395Skan    case OPT_fvtable_thunks:
591117395Skan    case OPT_fxref:
592132718Skan    case OPT_fvtable_gc:
593169699Skan      warning (0, "switch %qs is no longer supported", option->opt_text);
594117395Skan      break;
595117395Skan
596117395Skan    case OPT_faccess_control:
597132718Skan      flag_access_control = value;
598117395Skan      break;
599117395Skan
600117395Skan    case OPT_fasm:
601132718Skan      flag_no_asm = !value;
602117395Skan      break;
603117395Skan
604117395Skan    case OPT_fbuiltin:
605132718Skan      flag_no_builtin = !value;
606117395Skan      break;
607117395Skan
608117395Skan    case OPT_fbuiltin_:
609132718Skan      if (value)
610117395Skan	result = 0;
611117395Skan      else
612117395Skan	disable_builtin_function (arg);
613117395Skan      break;
614117395Skan
615259405Spfg    case OPT_fdirectives_only:
616259405Spfg      cpp_opts->directives_only = 1;
617259405Spfg      break;
618259405Spfg
619117395Skan    case OPT_fdollars_in_identifiers:
620132718Skan      cpp_opts->dollars_in_ident = value;
621117395Skan      break;
622117395Skan
623117395Skan    case OPT_ffreestanding:
624132718Skan      value = !value;
625132718Skan      /* Fall through....  */
626117395Skan    case OPT_fhosted:
627132718Skan      flag_hosted = value;
628132718Skan      flag_no_builtin = !value;
629117395Skan      /* warn_main will be 2 if set by -Wall, 1 if set by -Wmain */
630132718Skan      if (!value && warn_main == 2)
631117395Skan	warn_main = 0;
632117395Skan      break;
633117395Skan
634117395Skan    case OPT_fshort_double:
635132718Skan      flag_short_double = value;
636117395Skan      break;
637117395Skan
638117395Skan    case OPT_fshort_enums:
639132718Skan      flag_short_enums = value;
640117395Skan      break;
641117395Skan
642117395Skan    case OPT_fshort_wchar:
643132718Skan      flag_short_wchar = value;
644117395Skan      break;
645117395Skan
646117395Skan    case OPT_fsigned_bitfields:
647132718Skan      flag_signed_bitfields = value;
648117395Skan      break;
649117395Skan
650117395Skan    case OPT_fsigned_char:
651132718Skan      flag_signed_char = value;
652117395Skan      break;
653117395Skan
654117395Skan    case OPT_funsigned_bitfields:
655132718Skan      flag_signed_bitfields = !value;
656117395Skan      break;
657117395Skan
658117395Skan    case OPT_funsigned_char:
659132718Skan      flag_signed_char = !value;
660117395Skan      break;
661117395Skan
662117395Skan    case OPT_fcheck_new:
663132718Skan      flag_check_new = value;
664117395Skan      break;
665117395Skan
666117395Skan    case OPT_fconserve_space:
667132718Skan      flag_conserve_space = value;
668117395Skan      break;
669117395Skan
670132718Skan    case OPT_fconstant_string_class_:
671117395Skan      constant_string_class_name = arg;
672117395Skan      break;
673117395Skan
674117395Skan    case OPT_fdefault_inline:
675132718Skan      flag_default_inline = value;
676117395Skan      break;
677117395Skan
678117395Skan    case OPT_felide_constructors:
679132718Skan      flag_elide_constructors = value;
680117395Skan      break;
681117395Skan
682117395Skan    case OPT_fenforce_eh_specs:
683132718Skan      flag_enforce_eh_specs = value;
684117395Skan      break;
685117395Skan
686169699Skan    case OPT_fextended_identifiers:
687169699Skan      cpp_opts->extended_identifiers = value;
688117395Skan      break;
689117395Skan
690117395Skan    case OPT_ffor_scope:
691132718Skan      flag_new_for_scope = value;
692117395Skan      break;
693117395Skan
694117395Skan    case OPT_fgnu_keywords:
695132718Skan      flag_no_gnu_keywords = !value;
696117395Skan      break;
697117395Skan
698117395Skan    case OPT_fgnu_runtime:
699132718Skan      flag_next_runtime = !value;
700117395Skan      break;
701117395Skan
702117395Skan    case OPT_fhandle_exceptions:
703169699Skan      warning (0, "-fhandle-exceptions has been renamed -fexceptions (and is now on by default)");
704132718Skan      flag_exceptions = value;
705117395Skan      break;
706117395Skan
707117395Skan    case OPT_fimplement_inlines:
708132718Skan      flag_implement_inlines = value;
709117395Skan      break;
710117395Skan
711117395Skan    case OPT_fimplicit_inline_templates:
712132718Skan      flag_implicit_inline_templates = value;
713117395Skan      break;
714117395Skan
715117395Skan    case OPT_fimplicit_templates:
716132718Skan      flag_implicit_templates = value;
717117395Skan      break;
718117395Skan
719260074Spfg    case OPT_flax_vector_conversions:
720260074Spfg      flag_lax_vector_conversions = value;
721260074Spfg      break;
722260074Spfg
723117395Skan    case OPT_fms_extensions:
724132718Skan      flag_ms_extensions = value;
725117395Skan      break;
726117395Skan
727117395Skan    case OPT_fnext_runtime:
728132718Skan      flag_next_runtime = value;
729117395Skan      break;
730117395Skan
731132718Skan    case OPT_fnil_receivers:
732132718Skan      flag_nil_receivers = value;
733132718Skan      break;
734132718Skan
735117395Skan    case OPT_fnonansi_builtins:
736132718Skan      flag_no_nonansi_builtin = !value;
737117395Skan      break;
738117395Skan
739117395Skan    case OPT_foperator_names:
740132718Skan      cpp_opts->operator_names = value;
741117395Skan      break;
742117395Skan
743117395Skan    case OPT_foptional_diags:
744132718Skan      flag_optional_diags = value;
745117395Skan      break;
746117395Skan
747132718Skan    case OPT_fpch_deps:
748132718Skan      cpp_opts->restore_pch_deps = value;
749132718Skan      break;
750132718Skan
751169699Skan    case OPT_fpch_preprocess:
752169699Skan      flag_pch_preprocess = value;
753169699Skan      break;
754169699Skan
755117395Skan    case OPT_fpermissive:
756132718Skan      flag_permissive = value;
757117395Skan      break;
758117395Skan
759117395Skan    case OPT_fpreprocessed:
760132718Skan      cpp_opts->preprocessed = value;
761117395Skan      break;
762117395Skan
763132718Skan    case OPT_freplace_objc_classes:
764132718Skan      flag_replace_objc_classes = value;
765132718Skan      break;
766169699Skan
767117395Skan    case OPT_frepo:
768132718Skan      flag_use_repository = value;
769132718Skan      if (value)
770117395Skan	flag_implicit_templates = 0;
771117395Skan      break;
772117395Skan
773117395Skan    case OPT_frtti:
774132718Skan      flag_rtti = value;
775117395Skan      break;
776117395Skan
777117395Skan    case OPT_fshow_column:
778132718Skan      cpp_opts->show_column = value;
779117395Skan      break;
780117395Skan
781117395Skan    case OPT_fstats:
782132718Skan      flag_detailed_statistics = value;
783117395Skan      break;
784117395Skan
785132718Skan    case OPT_ftabstop_:
786117395Skan      /* It is documented that we silently ignore silly values.  */
787132718Skan      if (value >= 1 && value <= 100)
788132718Skan	cpp_opts->tabstop = value;
789117395Skan      break;
790117395Skan
791132718Skan    case OPT_fexec_charset_:
792132718Skan      cpp_opts->narrow_charset = arg;
793117395Skan      break;
794117395Skan
795132718Skan    case OPT_fwide_exec_charset_:
796132718Skan      cpp_opts->wide_charset = arg;
797117395Skan      break;
798117395Skan
799132718Skan    case OPT_finput_charset_:
800132718Skan      cpp_opts->input_charset = arg;
801132718Skan      break;
802132718Skan
803132718Skan    case OPT_ftemplate_depth_:
804132718Skan      max_tinst_depth = value;
805132718Skan      break;
806132718Skan
807117395Skan    case OPT_fuse_cxa_atexit:
808132718Skan      flag_use_cxa_atexit = value;
809117395Skan      break;
810169699Skan
811169699Skan    case OPT_fuse_cxa_get_exception_ptr:
812169699Skan      flag_use_cxa_get_exception_ptr = value;
813169699Skan      break;
814117395Skan
815169699Skan    case OPT_fvisibility_inlines_hidden:
816169699Skan      visibility_options.inlines_hidden = value;
817169699Skan      break;
818169699Skan
819117395Skan    case OPT_fweak:
820132718Skan      flag_weak = value;
821117395Skan      break;
822117395Skan
823169699Skan    case OPT_fthreadsafe_statics:
824169699Skan      flag_threadsafe_statics = value;
825169699Skan      break;
826169699Skan
827132718Skan    case OPT_fzero_link:
828132718Skan      flag_zero_link = value;
829132718Skan      break;
830132718Skan
831117395Skan    case OPT_gen_decls:
832117395Skan      flag_gen_declaration = 1;
833117395Skan      break;
834117395Skan
835259268Spfg    case OPT_femit_struct_debug_baseonly:
836259268Spfg      set_struct_debug_option ("base");
837259268Spfg      break;
838259268Spfg
839259268Spfg    case OPT_femit_struct_debug_reduced:
840259268Spfg      set_struct_debug_option ("dir:ord:sys,dir:gen:any,ind:base");
841259268Spfg      break;
842259268Spfg
843259268Spfg    case OPT_femit_struct_debug_detailed_:
844259268Spfg      set_struct_debug_option (arg);
845259268Spfg      break;
846259268Spfg
847132718Skan    case OPT_idirafter:
848169699Skan      add_path (xstrdup (arg), AFTER, 0, true);
849132718Skan      break;
850132718Skan
851132718Skan    case OPT_imacros:
852132718Skan    case OPT_include:
853132718Skan      defer_opt (code, arg);
854132718Skan      break;
855132718Skan
856169699Skan    case OPT_imultilib:
857169699Skan      imultilib = arg;
858169699Skan      break;
859169699Skan
860132718Skan    case OPT_iprefix:
861132718Skan      iprefix = arg;
862132718Skan      break;
863132718Skan
864169699Skan    case OPT_iquote:
865169699Skan      add_path (xstrdup (arg), QUOTE, 0, true);
866169699Skan      break;
867169699Skan
868132718Skan    case OPT_isysroot:
869132718Skan      sysroot = arg;
870132718Skan      break;
871132718Skan
872132718Skan    case OPT_isystem:
873169699Skan      add_path (xstrdup (arg), SYSTEM, 0, true);
874132718Skan      break;
875132718Skan
876132718Skan    case OPT_iwithprefix:
877132718Skan      add_prefixed_path (arg, SYSTEM);
878132718Skan      break;
879132718Skan
880132718Skan    case OPT_iwithprefixbefore:
881132718Skan      add_prefixed_path (arg, BRACKET);
882132718Skan      break;
883132718Skan
884117395Skan    case OPT_lang_asm:
885117395Skan      cpp_set_lang (parse_in, CLK_ASM);
886132718Skan      cpp_opts->dollars_in_ident = false;
887117395Skan      break;
888117395Skan
889169699Skan    case OPT_lang_fortran:
890169699Skan      lang_fortran = true;
891169699Skan      break;
892169699Skan
893117395Skan    case OPT_lang_objc:
894117395Skan      cpp_opts->objc = 1;
895117395Skan      break;
896117395Skan
897117395Skan    case OPT_nostdinc:
898132718Skan      std_inc = false;
899117395Skan      break;
900117395Skan
901132718Skan    case OPT_nostdinc__:
902132718Skan      std_cxx_inc = false;
903117395Skan      break;
904117395Skan
905117395Skan    case OPT_o:
906117395Skan      if (!out_fname)
907117395Skan	out_fname = arg;
908117395Skan      else
909132718Skan	error ("output filename specified twice");
910117395Skan      break;
911117395Skan
912117395Skan      /* We need to handle the -pedantic switches here, rather than in
913117395Skan	 c_common_post_options, so that a subsequent -Wno-endif-labels
914117395Skan	 is not overridden.  */
915117395Skan    case OPT_pedantic_errors:
916117395Skan      cpp_opts->pedantic_errors = 1;
917132718Skan      /* Fall through.  */
918117395Skan    case OPT_pedantic:
919117395Skan      cpp_opts->pedantic = 1;
920117395Skan      cpp_opts->warn_endif_labels = 1;
921169699Skan      if (warn_pointer_sign == -1)
922169699Skan	warn_pointer_sign = 1;
923169699Skan      if (warn_overlength_strings == -1)
924169699Skan	warn_overlength_strings = 1;
925117395Skan      break;
926117395Skan
927117395Skan    case OPT_print_objc_runtime_info:
928117395Skan      print_struct_values = 1;
929117395Skan      break;
930117395Skan
931169699Skan    case OPT_print_pch_checksum:
932169699Skan      c_common_print_pch_checksum (stdout);
933169699Skan      exit_after_options = true;
934169699Skan      break;
935169699Skan
936117395Skan    case OPT_remap:
937117395Skan      cpp_opts->remap = 1;
938117395Skan      break;
939117395Skan
940132718Skan    case OPT_std_c__98:
941132718Skan    case OPT_std_gnu__98:
942169699Skan      if (!preprocessing_asm_p)
943169699Skan	set_std_cxx98 (code == OPT_std_c__98 /* ISO */);
944117395Skan      break;
945117395Skan
946117395Skan    case OPT_std_c89:
947117395Skan    case OPT_std_iso9899_1990:
948117395Skan    case OPT_std_iso9899_199409:
949169699Skan      if (!preprocessing_asm_p)
950169699Skan	set_std_c89 (code == OPT_std_iso9899_199409 /* c94 */, true /* ISO */);
951117395Skan      break;
952117395Skan
953117395Skan    case OPT_std_gnu89:
954169699Skan      if (!preprocessing_asm_p)
955169699Skan	set_std_c89 (false /* c94 */, false /* ISO */);
956117395Skan      break;
957117395Skan
958117395Skan    case OPT_std_c99:
959117395Skan    case OPT_std_c9x:
960117395Skan    case OPT_std_iso9899_1999:
961117395Skan    case OPT_std_iso9899_199x:
962169699Skan      if (!preprocessing_asm_p)
963169699Skan	set_std_c99 (true /* ISO */);
964117395Skan      break;
965117395Skan
966117395Skan    case OPT_std_gnu99:
967117395Skan    case OPT_std_gnu9x:
968169699Skan      if (!preprocessing_asm_p)
969169699Skan	set_std_c99 (false /* ISO */);
970117395Skan      break;
971117395Skan
972117395Skan    case OPT_trigraphs:
973117395Skan      cpp_opts->trigraphs = 1;
974117395Skan      break;
975117395Skan
976117395Skan    case OPT_traditional_cpp:
977117395Skan      cpp_opts->traditional = 1;
978117395Skan      break;
979117395Skan
980117395Skan    case OPT_undef:
981117395Skan      flag_undef = 1;
982117395Skan      break;
983117395Skan
984117395Skan    case OPT_w:
985117395Skan      cpp_opts->inhibit_warnings = 1;
986117395Skan      break;
987117395Skan
988117395Skan    case OPT_v:
989132718Skan      verbose = true;
990117395Skan      break;
991117395Skan    }
992117395Skan
993117395Skan  return result;
994117395Skan}
995117395Skan
996117395Skan/* Post-switch processing.  */
997117395Skanbool
998132718Skanc_common_post_options (const char **pfilename)
999117395Skan{
1000132718Skan  struct cpp_callbacks *cb;
1001132718Skan
1002117395Skan  /* Canonicalize the input and output filenames.  */
1003132718Skan  if (in_fnames == NULL)
1004132718Skan    {
1005169699Skan      in_fnames = XNEWVEC (const char *, 1);
1006132718Skan      in_fnames[0] = "";
1007132718Skan    }
1008132718Skan  else if (strcmp (in_fnames[0], "-") == 0)
1009132718Skan    in_fnames[0] = "";
1010117395Skan
1011117395Skan  if (out_fname == NULL || !strcmp (out_fname, "-"))
1012117395Skan    out_fname = "";
1013117395Skan
1014117395Skan  if (cpp_opts->deps.style == DEPS_NONE)
1015117395Skan    check_deps_environment_vars ();
1016117395Skan
1017117395Skan  handle_deferred_opts ();
1018117395Skan
1019117395Skan  sanitize_cpp_opts ();
1020117395Skan
1021169699Skan  register_include_chains (parse_in, sysroot, iprefix, imultilib,
1022132718Skan			   std_inc, std_cxx_inc && c_dialect_cxx (), verbose);
1023132718Skan
1024169699Skan#ifdef C_COMMON_OVERRIDE_OPTIONS
1025169699Skan  /* Some machines may reject certain combinations of C
1026169699Skan     language-specific options.  */
1027169699Skan  C_COMMON_OVERRIDE_OPTIONS;
1028169699Skan#endif
1029169699Skan
1030117395Skan  flag_inline_trees = 1;
1031117395Skan
1032169699Skan  /* Use tree inlining.  */
1033169699Skan  if (!flag_no_inline)
1034169699Skan    flag_no_inline = 1;
1035169699Skan  if (flag_inline_functions)
1036169699Skan    flag_inline_trees = 2;
1037117395Skan
1038189824Sdas  /* By default we use C99 inline semantics in GNU99 or C99 mode.  C99
1039189824Sdas     inline semantics are not supported in GNU89 or C89 mode.  */
1040189824Sdas  if (flag_gnu89_inline == -1)
1041189824Sdas    flag_gnu89_inline = !flag_isoc99;
1042189824Sdas  else if (!flag_gnu89_inline && !flag_isoc99)
1043189824Sdas    error ("-fno-gnu89-inline is only supported in GNU99 or C99 mode");
1044169699Skan
1045169699Skan  /* If we are given more than one input file, we must use
1046169699Skan     unit-at-a-time mode.  */
1047169699Skan  if (num_in_fnames > 1)
1048169699Skan    flag_unit_at_a_time = 1;
1049169699Skan
1050169699Skan  /* Default to ObjC sjlj exception handling if NeXT runtime.  */
1051169699Skan  if (flag_objc_sjlj_exceptions < 0)
1052169699Skan    flag_objc_sjlj_exceptions = flag_next_runtime;
1053169699Skan  if (flag_objc_exceptions && !flag_objc_sjlj_exceptions)
1054169699Skan    flag_exceptions = 1;
1055169699Skan
1056169699Skan  /* -Wextra implies -Wsign-compare, -Wmissing-field-initializers and
1057169699Skan     -Woverride-init, but not if explicitly overridden.  */
1058132718Skan  if (warn_sign_compare == -1)
1059132718Skan    warn_sign_compare = extra_warnings;
1060169699Skan  if (warn_missing_field_initializers == -1)
1061169699Skan    warn_missing_field_initializers = extra_warnings;
1062169699Skan  if (warn_override_init == -1)
1063169699Skan    warn_override_init = extra_warnings;
1064132718Skan
1065169699Skan  /* -Wpointer_sign is disabled by default, but it is enabled if any
1066169699Skan     of -Wall or -pedantic are given.  */
1067169699Skan  if (warn_pointer_sign == -1)
1068169699Skan    warn_pointer_sign = 0;
1069169699Skan
1070169699Skan  /* -Woverlength-strings is off by default, but is enabled by -pedantic.
1071169699Skan     It is never enabled in C++, as the minimum limit is not normative
1072169699Skan     in that standard.  */
1073169699Skan  if (warn_overlength_strings == -1 || c_dialect_cxx ())
1074169699Skan    warn_overlength_strings = 0;
1075169699Skan
1076117395Skan  /* Special format checking options don't work without -Wformat; warn if
1077117395Skan     they are used.  */
1078169699Skan  if (!warn_format)
1079169699Skan    {
1080169699Skan      warning (OPT_Wformat_y2k,
1081169699Skan	       "-Wformat-y2k ignored without -Wformat");
1082169699Skan      warning (OPT_Wformat_extra_args,
1083169699Skan	       "-Wformat-extra-args ignored without -Wformat");
1084169699Skan      warning (OPT_Wformat_zero_length,
1085169699Skan	       "-Wformat-zero-length ignored without -Wformat");
1086169699Skan      warning (OPT_Wformat_nonliteral,
1087169699Skan	       "-Wformat-nonliteral ignored without -Wformat");
1088169699Skan      warning (OPT_Wformat_security,
1089169699Skan	       "-Wformat-security ignored without -Wformat");
1090169699Skan    }
1091117395Skan
1092169699Skan  /* C99 requires special handling of complex multiplication and division;
1093169699Skan     -ffast-math and -fcx-limited-range are handled in process_options.  */
1094169699Skan  if (flag_isoc99)
1095169699Skan    flag_complex_method = 2;
1096169699Skan
1097132718Skan  if (flag_preprocess_only)
1098132718Skan    {
1099132718Skan      /* Open the output now.  We must do so even if flag_no_output is
1100132718Skan	 on, because there may be other output than from the actual
1101132718Skan	 preprocessing (e.g. from -dM).  */
1102132718Skan      if (out_fname[0] == '\0')
1103132718Skan	out_stream = stdout;
1104132718Skan      else
1105132718Skan	out_stream = fopen (out_fname, "w");
1106132718Skan
1107132718Skan      if (out_stream == NULL)
1108132718Skan	{
1109132718Skan	  fatal_error ("opening output file %s: %m", out_fname);
1110132718Skan	  return false;
1111132718Skan	}
1112132718Skan
1113132718Skan      if (num_in_fnames > 1)
1114132718Skan	error ("too many filenames given.  Type %s --help for usage",
1115132718Skan	       progname);
1116132718Skan
1117132718Skan      init_pp_output (out_stream);
1118132718Skan    }
1119132718Skan  else
1120132718Skan    {
1121132718Skan      init_c_lex ();
1122132718Skan
1123132718Skan      /* Yuk.  WTF is this?  I do know ObjC relies on it somewhere.  */
1124169699Skan      input_location = UNKNOWN_LOCATION;
1125132718Skan    }
1126132718Skan
1127132718Skan  cb = cpp_get_callbacks (parse_in);
1128132718Skan  cb->file_change = cb_file_change;
1129132718Skan  cb->dir_change = cb_dir_change;
1130132718Skan  cpp_post_options (parse_in);
1131132718Skan
1132169699Skan  input_location = UNKNOWN_LOCATION;
1133132718Skan
1134117395Skan  /* If an error has occurred in cpplib, note it so we fail
1135117395Skan     immediately.  */
1136117395Skan  errorcount += cpp_errors (parse_in);
1137117395Skan
1138132718Skan  *pfilename = this_input_filename
1139132718Skan    = cpp_read_main_file (parse_in, in_fnames[0]);
1140146908Skan  /* Don't do any compilation or preprocessing if there is no input file.  */
1141132718Skan  if (this_input_filename == NULL)
1142146908Skan    {
1143146908Skan      errorcount++;
1144146908Skan      return false;
1145146908Skan    }
1146117395Skan
1147132718Skan  if (flag_working_directory
1148169699Skan      && flag_preprocess_only && !flag_no_line_commands)
1149132718Skan    pp_dir_change (parse_in, get_src_pwd ());
1150117395Skan
1151132718Skan  return flag_preprocess_only;
1152117395Skan}
1153117395Skan
1154117395Skan/* Front end initialization common to C, ObjC and C++.  */
1155132718Skanbool
1156132718Skanc_common_init (void)
1157117395Skan{
1158117395Skan  /* Set up preprocessor arithmetic.  Must be done after call to
1159117395Skan     c_common_nodes_and_builtins for type nodes to be good.  */
1160117395Skan  cpp_opts->precision = TYPE_PRECISION (intmax_type_node);
1161117395Skan  cpp_opts->char_precision = TYPE_PRECISION (char_type_node);
1162117395Skan  cpp_opts->int_precision = TYPE_PRECISION (integer_type_node);
1163117395Skan  cpp_opts->wchar_precision = TYPE_PRECISION (wchar_type_node);
1164169699Skan  cpp_opts->unsigned_wchar = TYPE_UNSIGNED (wchar_type_node);
1165132718Skan  cpp_opts->bytes_big_endian = BYTES_BIG_ENDIAN;
1166117395Skan
1167132718Skan  /* This can't happen until after wchar_precision and bytes_big_endian
1168132718Skan     are known.  */
1169132718Skan  cpp_init_iconv (parse_in);
1170117395Skan
1171169699Skan  if (version_flag)
1172169699Skan    c_common_print_pch_checksum (stderr);
1173169699Skan
1174117395Skan  if (flag_preprocess_only)
1175117395Skan    {
1176132718Skan      finish_options ();
1177132718Skan      preprocess_file (parse_in);
1178132718Skan      return false;
1179117395Skan    }
1180117395Skan
1181132718Skan  /* Has to wait until now so that cpplib has its hash table.  */
1182117395Skan  init_pragma ();
1183117395Skan
1184132718Skan  return true;
1185117395Skan}
1186117395Skan
1187132718Skan/* Initialize the integrated preprocessor after debug output has been
1188132718Skan   initialized; loop over each input file.  */
1189132718Skanvoid
1190169699Skanc_common_parse_file (int set_yydebug)
1191132718Skan{
1192169699Skan  unsigned int i;
1193169699Skan
1194169699Skan  /* Enable parser debugging, if requested and we can.  If requested
1195169699Skan     and we can't, notify the user.  */
1196132718Skan#if YYDEBUG != 0
1197132718Skan  yydebug = set_yydebug;
1198132718Skan#else
1199169699Skan  if (set_yydebug)
1200169699Skan    warning (0, "YYDEBUG was not defined at build time, -dy ignored");
1201132718Skan#endif
1202132718Skan
1203169699Skan  i = 0;
1204169699Skan  for (;;)
1205132718Skan    {
1206169699Skan      /* Start the main input file, if the debug writer wants it. */
1207169699Skan      if (debug_hooks->start_end_main_source_file)
1208169699Skan	(*debug_hooks->start_source_file) (0, this_input_filename);
1209132718Skan      finish_options ();
1210169699Skan      pch_init ();
1211169699Skan      push_file_scope ();
1212132718Skan      c_parse_file ();
1213169699Skan      finish_file ();
1214169699Skan      pop_file_scope ();
1215169699Skan      /* And end the main input file, if the debug writer wants it  */
1216169699Skan      if (debug_hooks->start_end_main_source_file)
1217169699Skan	(*debug_hooks->end_source_file) (0);
1218169699Skan      if (++i >= num_in_fnames)
1219169699Skan	break;
1220169699Skan      cpp_undef_all (parse_in);
1221169699Skan      this_input_filename
1222169699Skan	= cpp_read_main_file (parse_in, in_fnames[i]);
1223169699Skan      /* If an input file is missing, abandon further compilation.
1224169699Skan	 cpplib has issued a diagnostic.  */
1225169699Skan      if (!this_input_filename)
1226169699Skan	break;
1227169699Skan    }
1228132718Skan}
1229132718Skan
1230117395Skan/* Common finish hook for the C, ObjC and C++ front ends.  */
1231117395Skanvoid
1232132718Skanc_common_finish (void)
1233117395Skan{
1234117395Skan  FILE *deps_stream = NULL;
1235117395Skan
1236117395Skan  if (cpp_opts->deps.style != DEPS_NONE)
1237117395Skan    {
1238117395Skan      /* If -M or -MM was seen without -MF, default output to the
1239117395Skan	 output stream.  */
1240117395Skan      if (!deps_file)
1241117395Skan	deps_stream = out_stream;
1242117395Skan      else
1243117395Skan	{
1244117395Skan	  deps_stream = fopen (deps_file, deps_append ? "a": "w");
1245117395Skan	  if (!deps_stream)
1246132718Skan	    fatal_error ("opening dependency file %s: %m", deps_file);
1247117395Skan	}
1248117395Skan    }
1249117395Skan
1250117395Skan  /* For performance, avoid tearing down cpplib's internal structures
1251117395Skan     with cpp_destroy ().  */
1252117395Skan  errorcount += cpp_finish (parse_in, deps_stream);
1253117395Skan
1254117395Skan  if (deps_stream && deps_stream != out_stream
1255117395Skan      && (ferror (deps_stream) || fclose (deps_stream)))
1256132718Skan    fatal_error ("closing dependency file %s: %m", deps_file);
1257117395Skan
1258117395Skan  if (out_stream && (ferror (out_stream) || fclose (out_stream)))
1259132718Skan    fatal_error ("when writing output to %s: %m", out_fname);
1260117395Skan}
1261117395Skan
1262117395Skan/* Either of two environment variables can specify output of
1263117395Skan   dependencies.  Their value is either "OUTPUT_FILE" or "OUTPUT_FILE
1264117395Skan   DEPS_TARGET", where OUTPUT_FILE is the file to write deps info to
1265117395Skan   and DEPS_TARGET is the target to mention in the deps.  They also
1266117395Skan   result in dependency information being appended to the output file
1267117395Skan   rather than overwriting it, and like Sun's compiler
1268117395Skan   SUNPRO_DEPENDENCIES suppresses the dependency on the main file.  */
1269117395Skanstatic void
1270132718Skancheck_deps_environment_vars (void)
1271117395Skan{
1272117395Skan  char *spec;
1273117395Skan
1274117395Skan  GET_ENVIRONMENT (spec, "DEPENDENCIES_OUTPUT");
1275117395Skan  if (spec)
1276117395Skan    cpp_opts->deps.style = DEPS_USER;
1277117395Skan  else
1278117395Skan    {
1279117395Skan      GET_ENVIRONMENT (spec, "SUNPRO_DEPENDENCIES");
1280117395Skan      if (spec)
1281117395Skan	{
1282117395Skan	  cpp_opts->deps.style = DEPS_SYSTEM;
1283117395Skan	  cpp_opts->deps.ignore_main_file = true;
1284117395Skan	}
1285117395Skan    }
1286117395Skan
1287117395Skan  if (spec)
1288117395Skan    {
1289117395Skan      /* Find the space before the DEPS_TARGET, if there is one.  */
1290117395Skan      char *s = strchr (spec, ' ');
1291117395Skan      if (s)
1292117395Skan	{
1293117395Skan	  /* Let the caller perform MAKE quoting.  */
1294117395Skan	  defer_opt (OPT_MT, s + 1);
1295117395Skan	  *s = '\0';
1296117395Skan	}
1297117395Skan
1298117395Skan      /* Command line -MF overrides environment variables and default.  */
1299117395Skan      if (!deps_file)
1300117395Skan	deps_file = spec;
1301117395Skan
1302117395Skan      deps_append = 1;
1303169699Skan      deps_seen = true;
1304117395Skan    }
1305117395Skan}
1306117395Skan
1307117395Skan/* Handle deferred command line switches.  */
1308117395Skanstatic void
1309132718Skanhandle_deferred_opts (void)
1310117395Skan{
1311117395Skan  size_t i;
1312169699Skan  struct deps *deps;
1313117395Skan
1314169699Skan  /* Avoid allocating the deps buffer if we don't need it.
1315169699Skan     (This flag may be true without there having been -MT or -MQ
1316169699Skan     options, but we'll still need the deps buffer.)  */
1317169699Skan  if (!deps_seen)
1318169699Skan    return;
1319169699Skan
1320169699Skan  deps = cpp_get_deps (parse_in);
1321169699Skan
1322117395Skan  for (i = 0; i < deferred_count; i++)
1323117395Skan    {
1324117395Skan      struct deferred_opt *opt = &deferred_opts[i];
1325117395Skan
1326132718Skan      if (opt->code == OPT_MT || opt->code == OPT_MQ)
1327169699Skan	deps_add_target (deps, opt->arg, opt->code == OPT_MQ);
1328117395Skan    }
1329117395Skan}
1330117395Skan
1331117395Skan/* These settings are appropriate for GCC, but not necessarily so for
1332117395Skan   cpplib as a library.  */
1333117395Skanstatic void
1334132718Skansanitize_cpp_opts (void)
1335117395Skan{
1336117395Skan  /* If we don't know what style of dependencies to output, complain
1337117395Skan     if any other dependency switches have been given.  */
1338117395Skan  if (deps_seen && cpp_opts->deps.style == DEPS_NONE)
1339117395Skan    error ("to generate dependencies you must specify either -M or -MM");
1340117395Skan
1341117395Skan  /* -dM and dependencies suppress normal output; do it here so that
1342117395Skan     the last -d[MDN] switch overrides earlier ones.  */
1343132718Skan  if (flag_dump_macros == 'M')
1344132718Skan    flag_no_output = 1;
1345117395Skan
1346259405Spfg  /* By default, -fdirectives-only implies -dD.  This allows subsequent phases
1347259405Spfg     to perform proper macro expansion.  */
1348259405Spfg  if (cpp_opts->directives_only && !cpp_opts->preprocessed && !flag_dump_macros)
1349259405Spfg    flag_dump_macros = 'D';
1350259405Spfg
1351117395Skan  /* Disable -dD, -dN and -dI if normal output is suppressed.  Allow
1352117395Skan     -dM since at least glibc relies on -M -dM to work.  */
1353169699Skan  /* Also, flag_no_output implies flag_no_line_commands, always.  */
1354132718Skan  if (flag_no_output)
1355117395Skan    {
1356132718Skan      if (flag_dump_macros != 'M')
1357132718Skan	flag_dump_macros = 0;
1358132718Skan      flag_dump_includes = 0;
1359146908Skan      flag_no_line_commands = 1;
1360117395Skan    }
1361117395Skan
1362117395Skan  cpp_opts->unsigned_char = !flag_signed_char;
1363117395Skan  cpp_opts->stdc_0_in_system_headers = STDC_0_IN_SYSTEM_HEADERS;
1364117395Skan
1365117395Skan  /* We want -Wno-long-long to override -pedantic -std=non-c99
1366117395Skan     and/or -Wtraditional, whatever the ordering.  */
1367117395Skan  cpp_opts->warn_long_long
1368117395Skan    = warn_long_long && ((!flag_isoc99 && pedantic) || warn_traditional);
1369132718Skan
1370169699Skan  /* Similarly with -Wno-variadic-macros.  No check for c99 here, since
1371169699Skan     this also turns off warnings about GCCs extension.  */
1372169699Skan  cpp_opts->warn_variadic_macros
1373169699Skan    = warn_variadic_macros && (pedantic || warn_traditional);
1374169699Skan
1375132718Skan  /* If we're generating preprocessor output, emit current directory
1376132718Skan     if explicitly requested or if debugging information is enabled.
1377132718Skan     ??? Maybe we should only do it for debugging formats that
1378132718Skan     actually output the current directory?  */
1379132718Skan  if (flag_working_directory == -1)
1380132718Skan    flag_working_directory = (debug_info_level != DINFO_LEVEL_NONE);
1381259405Spfg
1382259405Spfg  if (cpp_opts->directives_only)
1383259405Spfg    {
1384259405Spfg      if (warn_unused_macros)
1385259405Spfg	error ("-fdirectives-only is incompatible with -Wunused_macros");
1386259405Spfg      if (cpp_opts->traditional)
1387259405Spfg	error ("-fdirectives-only is incompatible with -traditional");
1388259405Spfg    }
1389117395Skan}
1390117395Skan
1391132718Skan/* Add include path with a prefix at the front of its name.  */
1392132718Skanstatic void
1393132718Skanadd_prefixed_path (const char *suffix, size_t chain)
1394132718Skan{
1395132718Skan  char *path;
1396132718Skan  const char *prefix;
1397132718Skan  size_t prefix_len, suffix_len;
1398132718Skan
1399132718Skan  suffix_len = strlen (suffix);
1400132718Skan  prefix     = iprefix ? iprefix : cpp_GCC_INCLUDE_DIR;
1401132718Skan  prefix_len = iprefix ? strlen (iprefix) : cpp_GCC_INCLUDE_DIR_len;
1402132718Skan
1403169699Skan  path = (char *) xmalloc (prefix_len + suffix_len + 1);
1404132718Skan  memcpy (path, prefix, prefix_len);
1405132718Skan  memcpy (path + prefix_len, suffix, suffix_len);
1406132718Skan  path[prefix_len + suffix_len] = '\0';
1407132718Skan
1408169699Skan  add_path (path, chain, 0, false);
1409132718Skan}
1410132718Skan
1411132718Skan/* Handle -D, -U, -A, -imacros, and the first -include.  */
1412132718Skanstatic void
1413132718Skanfinish_options (void)
1414132718Skan{
1415132718Skan  if (!cpp_opts->preprocessed)
1416132718Skan    {
1417132718Skan      size_t i;
1418132718Skan
1419169699Skan      cb_file_change (parse_in,
1420169699Skan		      linemap_add (&line_table, LC_RENAME, 0,
1421169699Skan				   _("<built-in>"), 0));
1422169699Skan
1423132718Skan      cpp_init_builtins (parse_in, flag_hosted);
1424132718Skan      c_cpp_builtins (parse_in);
1425132718Skan
1426132718Skan      /* We're about to send user input to cpplib, so make it warn for
1427132718Skan	 things that we previously (when we sent it internal definitions)
1428132718Skan	 told it to not warn.
1429132718Skan
1430132718Skan	 C99 permits implementation-defined characters in identifiers.
1431132718Skan	 The documented meaning of -std= is to turn off extensions that
1432132718Skan	 conflict with the specified standard, and since a strictly
1433132718Skan	 conforming program cannot contain a '$', we do not condition
1434132718Skan	 their acceptance on the -std= setting.  */
1435132718Skan      cpp_opts->warn_dollars = (cpp_opts->pedantic && !cpp_opts->c99);
1436132718Skan
1437169699Skan      cb_file_change (parse_in,
1438169699Skan		      linemap_add (&line_table, LC_RENAME, 0,
1439169699Skan				   _("<command-line>"), 0));
1440169699Skan
1441132718Skan      for (i = 0; i < deferred_count; i++)
1442132718Skan	{
1443132718Skan	  struct deferred_opt *opt = &deferred_opts[i];
1444132718Skan
1445132718Skan	  if (opt->code == OPT_D)
1446132718Skan	    cpp_define (parse_in, opt->arg);
1447132718Skan	  else if (opt->code == OPT_U)
1448132718Skan	    cpp_undef (parse_in, opt->arg);
1449132718Skan	  else if (opt->code == OPT_A)
1450132718Skan	    {
1451132718Skan	      if (opt->arg[0] == '-')
1452132718Skan		cpp_unassert (parse_in, opt->arg + 1);
1453132718Skan	      else
1454132718Skan		cpp_assert (parse_in, opt->arg);
1455132718Skan	    }
1456132718Skan	}
1457132718Skan
1458132718Skan      /* Handle -imacros after -D and -U.  */
1459132718Skan      for (i = 0; i < deferred_count; i++)
1460132718Skan	{
1461132718Skan	  struct deferred_opt *opt = &deferred_opts[i];
1462132718Skan
1463132718Skan	  if (opt->code == OPT_imacros
1464132718Skan	      && cpp_push_include (parse_in, opt->arg))
1465132718Skan	    {
1466132718Skan	      /* Disable push_command_line_include callback for now.  */
1467132718Skan	      include_cursor = deferred_count + 1;
1468132718Skan	      cpp_scan_nooutput (parse_in);
1469132718Skan	    }
1470132718Skan	}
1471132718Skan    }
1472259405Spfg  else if (cpp_opts->directives_only)
1473259405Spfg    cpp_init_special_builtins (parse_in);
1474132718Skan
1475132718Skan  include_cursor = 0;
1476132718Skan  push_command_line_include ();
1477132718Skan}
1478132718Skan
1479132718Skan/* Give CPP the next file given by -include, if any.  */
1480132718Skanstatic void
1481132718Skanpush_command_line_include (void)
1482132718Skan{
1483132718Skan  while (include_cursor < deferred_count)
1484132718Skan    {
1485132718Skan      struct deferred_opt *opt = &deferred_opts[include_cursor++];
1486132718Skan
1487169699Skan      if (!cpp_opts->preprocessed && opt->code == OPT_include
1488132718Skan	  && cpp_push_include (parse_in, opt->arg))
1489132718Skan	return;
1490132718Skan    }
1491132718Skan
1492132718Skan  if (include_cursor == deferred_count)
1493132718Skan    {
1494132718Skan      include_cursor++;
1495132718Skan      /* -Wunused-macros should only warn about macros defined hereafter.  */
1496132718Skan      cpp_opts->warn_unused_macros = warn_unused_macros;
1497132718Skan      /* Restore the line map from <command line>.  */
1498169699Skan      if (!cpp_opts->preprocessed)
1499169699Skan	cpp_change_file (parse_in, LC_RENAME, this_input_filename);
1500132718Skan
1501132718Skan      /* Set this here so the client can change the option if it wishes,
1502132718Skan	 and after stacking the main file so we don't trace the main file.  */
1503169699Skan      line_table.trace_includes = cpp_opts->print_include_names;
1504132718Skan    }
1505132718Skan}
1506132718Skan
1507132718Skan/* File change callback.  Has to handle -include files.  */
1508132718Skanstatic void
1509169699Skancb_file_change (cpp_reader * ARG_UNUSED (pfile),
1510132718Skan		const struct line_map *new_map)
1511132718Skan{
1512132718Skan  if (flag_preprocess_only)
1513132718Skan    pp_file_change (new_map);
1514132718Skan  else
1515132718Skan    fe_file_change (new_map);
1516132718Skan
1517132718Skan  if (new_map == 0 || (new_map->reason == LC_LEAVE && MAIN_FILE_P (new_map)))
1518132718Skan    push_command_line_include ();
1519132718Skan}
1520132718Skan
1521132718Skanvoid
1522169699Skancb_dir_change (cpp_reader * ARG_UNUSED (pfile), const char *dir)
1523132718Skan{
1524169699Skan  if (!set_src_pwd (dir))
1525169699Skan    warning (0, "too late for # directive to set debug directory");
1526132718Skan}
1527132718Skan
1528117395Skan/* Set the C 89 standard (with 1994 amendments if C94, without GNU
1529117395Skan   extensions if ISO).  There is no concept of gnu94.  */
1530117395Skanstatic void
1531132718Skanset_std_c89 (int c94, int iso)
1532117395Skan{
1533117395Skan  cpp_set_lang (parse_in, c94 ? CLK_STDC94: iso ? CLK_STDC89: CLK_GNUC89);
1534117395Skan  flag_iso = iso;
1535117395Skan  flag_no_asm = iso;
1536117395Skan  flag_no_gnu_keywords = iso;
1537117395Skan  flag_no_nonansi_builtin = iso;
1538117395Skan  flag_isoc94 = c94;
1539117395Skan  flag_isoc99 = 0;
1540117395Skan}
1541117395Skan
1542117395Skan/* Set the C 99 standard (without GNU extensions if ISO).  */
1543117395Skanstatic void
1544132718Skanset_std_c99 (int iso)
1545117395Skan{
1546117395Skan  cpp_set_lang (parse_in, iso ? CLK_STDC99: CLK_GNUC99);
1547117395Skan  flag_no_asm = iso;
1548117395Skan  flag_no_nonansi_builtin = iso;
1549117395Skan  flag_iso = iso;
1550117395Skan  flag_isoc99 = 1;
1551117395Skan  flag_isoc94 = 1;
1552117395Skan}
1553117395Skan
1554117395Skan/* Set the C++ 98 standard (without GNU extensions if ISO).  */
1555117395Skanstatic void
1556132718Skanset_std_cxx98 (int iso)
1557117395Skan{
1558117395Skan  cpp_set_lang (parse_in, iso ? CLK_CXX98: CLK_GNUCXX);
1559117395Skan  flag_no_gnu_keywords = iso;
1560117395Skan  flag_no_nonansi_builtin = iso;
1561117395Skan  flag_iso = iso;
1562117395Skan}
1563117395Skan
1564117395Skan/* Handle setting implicit to ON.  */
1565117395Skanstatic void
1566132718Skanset_Wimplicit (int on)
1567117395Skan{
1568117395Skan  warn_implicit = on;
1569117395Skan  warn_implicit_int = on;
1570117395Skan  if (on)
1571117395Skan    {
1572117395Skan      if (mesg_implicit_function_declaration != 2)
1573117395Skan	mesg_implicit_function_declaration = 1;
1574117395Skan    }
1575117395Skan  else
1576117395Skan    mesg_implicit_function_declaration = 0;
1577117395Skan}
1578117395Skan
1579117395Skan/* Args to -d specify what to dump.  Silently ignore
1580117395Skan   unrecognized options; they may be aimed at toplev.c.  */
1581117395Skanstatic void
1582132718Skanhandle_OPT_d (const char *arg)
1583117395Skan{
1584117395Skan  char c;
1585117395Skan
1586117395Skan  while ((c = *arg++) != '\0')
1587117395Skan    switch (c)
1588117395Skan      {
1589132718Skan      case 'M':			/* Dump macros only.  */
1590132718Skan      case 'N':			/* Dump names.  */
1591132718Skan      case 'D':			/* Dump definitions.  */
1592132718Skan	flag_dump_macros = c;
1593117395Skan	break;
1594117395Skan
1595117395Skan      case 'I':
1596132718Skan	flag_dump_includes = 1;
1597117395Skan	break;
1598117395Skan      }
1599117395Skan}
1600