xref: /dragonfly/contrib/gcc-4.7/libcpp/init.c (revision e4b17023)
1*e4b17023SJohn Marino /* CPP Library.
2*e4b17023SJohn Marino    Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3*e4b17023SJohn Marino    1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008,
4*e4b17023SJohn Marino    2009, 2010, 2011 Free Software Foundation, Inc.
5*e4b17023SJohn Marino    Contributed by Per Bothner, 1994-95.
6*e4b17023SJohn Marino    Based on CCCP program by Paul Rubin, June 1986
7*e4b17023SJohn Marino    Adapted to ANSI C, Richard Stallman, Jan 1987
8*e4b17023SJohn Marino 
9*e4b17023SJohn Marino This program is free software; you can redistribute it and/or modify it
10*e4b17023SJohn Marino under the terms of the GNU General Public License as published by the
11*e4b17023SJohn Marino Free Software Foundation; either version 3, or (at your option) any
12*e4b17023SJohn Marino later version.
13*e4b17023SJohn Marino 
14*e4b17023SJohn Marino This program is distributed in the hope that it will be useful,
15*e4b17023SJohn Marino but WITHOUT ANY WARRANTY; without even the implied warranty of
16*e4b17023SJohn Marino MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17*e4b17023SJohn Marino GNU General Public License for more details.
18*e4b17023SJohn Marino 
19*e4b17023SJohn Marino You should have received a copy of the GNU General Public License
20*e4b17023SJohn Marino along with this program; see the file COPYING3.  If not see
21*e4b17023SJohn Marino <http://www.gnu.org/licenses/>.  */
22*e4b17023SJohn Marino 
23*e4b17023SJohn Marino #include "config.h"
24*e4b17023SJohn Marino #include "system.h"
25*e4b17023SJohn Marino #include "cpplib.h"
26*e4b17023SJohn Marino #include "internal.h"
27*e4b17023SJohn Marino #include "mkdeps.h"
28*e4b17023SJohn Marino #include "localedir.h"
29*e4b17023SJohn Marino #include "filenames.h"
30*e4b17023SJohn Marino 
31*e4b17023SJohn Marino static void init_library (void);
32*e4b17023SJohn Marino static void mark_named_operators (cpp_reader *, int);
33*e4b17023SJohn Marino static void read_original_filename (cpp_reader *);
34*e4b17023SJohn Marino static void read_original_directory (cpp_reader *);
35*e4b17023SJohn Marino static void post_options (cpp_reader *);
36*e4b17023SJohn Marino 
37*e4b17023SJohn Marino /* If we have designated initializers (GCC >2.7) these tables can be
38*e4b17023SJohn Marino    initialized, constant data.  Otherwise, they have to be filled in at
39*e4b17023SJohn Marino    runtime.  */
40*e4b17023SJohn Marino #if HAVE_DESIGNATED_INITIALIZERS
41*e4b17023SJohn Marino 
42*e4b17023SJohn Marino #define init_trigraph_map()  /* Nothing.  */
43*e4b17023SJohn Marino #define TRIGRAPH_MAP \
44*e4b17023SJohn Marino __extension__ const uchar _cpp_trigraph_map[UCHAR_MAX + 1] = {
45*e4b17023SJohn Marino 
46*e4b17023SJohn Marino #define END };
47*e4b17023SJohn Marino #define s(p, v) [p] = v,
48*e4b17023SJohn Marino 
49*e4b17023SJohn Marino #else
50*e4b17023SJohn Marino 
51*e4b17023SJohn Marino #define TRIGRAPH_MAP uchar _cpp_trigraph_map[UCHAR_MAX + 1] = { 0 }; \
52*e4b17023SJohn Marino  static void init_trigraph_map (void) { \
53*e4b17023SJohn Marino  unsigned char *x = _cpp_trigraph_map;
54*e4b17023SJohn Marino 
55*e4b17023SJohn Marino #define END }
56*e4b17023SJohn Marino #define s(p, v) x[p] = v;
57*e4b17023SJohn Marino 
58*e4b17023SJohn Marino #endif
59*e4b17023SJohn Marino 
60*e4b17023SJohn Marino TRIGRAPH_MAP
61*e4b17023SJohn Marino   s('=', '#')	s(')', ']')	s('!', '|')
62*e4b17023SJohn Marino   s('(', '[')	s('\'', '^')	s('>', '}')
63*e4b17023SJohn Marino   s('/', '\\')	s('<', '{')	s('-', '~')
64*e4b17023SJohn Marino END
65*e4b17023SJohn Marino 
66*e4b17023SJohn Marino #undef s
67*e4b17023SJohn Marino #undef END
68*e4b17023SJohn Marino #undef TRIGRAPH_MAP
69*e4b17023SJohn Marino 
70*e4b17023SJohn Marino /* A set of booleans indicating what CPP features each source language
71*e4b17023SJohn Marino    requires.  */
72*e4b17023SJohn Marino struct lang_flags
73*e4b17023SJohn Marino {
74*e4b17023SJohn Marino   char c99;
75*e4b17023SJohn Marino   char cplusplus;
76*e4b17023SJohn Marino   char extended_numbers;
77*e4b17023SJohn Marino   char extended_identifiers;
78*e4b17023SJohn Marino   char std;
79*e4b17023SJohn Marino   char cplusplus_comments;
80*e4b17023SJohn Marino   char digraphs;
81*e4b17023SJohn Marino   char uliterals;
82*e4b17023SJohn Marino   char rliterals;
83*e4b17023SJohn Marino   char user_literals;
84*e4b17023SJohn Marino };
85*e4b17023SJohn Marino 
86*e4b17023SJohn Marino static const struct lang_flags lang_defaults[] =
87*e4b17023SJohn Marino { /*              c99 c++ xnum xid std  //   digr ulit rlit user_literals */
88*e4b17023SJohn Marino   /* GNUC89   */  { 0,  0,  1,   0,  0,   1,   1,   0,   0,    0 },
89*e4b17023SJohn Marino   /* GNUC99   */  { 1,  0,  1,   0,  0,   1,   1,   1,   1,    0 },
90*e4b17023SJohn Marino   /* GNUC11   */  { 1,  0,  1,   0,  0,   1,   1,   1,   1,    0 },
91*e4b17023SJohn Marino   /* STDC89   */  { 0,  0,  0,   0,  1,   0,   0,   0,   0,    0 },
92*e4b17023SJohn Marino   /* STDC94   */  { 0,  0,  0,   0,  1,   0,   1,   0,   0,    0 },
93*e4b17023SJohn Marino   /* STDC99   */  { 1,  0,  1,   0,  1,   1,   1,   0,   0,    0 },
94*e4b17023SJohn Marino   /* STDC11   */  { 1,  0,  1,   0,  1,   1,   1,   1,   0,    0 },
95*e4b17023SJohn Marino   /* GNUCXX   */  { 0,  1,  1,   0,  0,   1,   1,   0,   0,    0 },
96*e4b17023SJohn Marino   /* CXX98    */  { 0,  1,  1,   0,  1,   1,   1,   0,   0,    0 },
97*e4b17023SJohn Marino   /* GNUCXX11 */  { 1,  1,  1,   0,  0,   1,   1,   1,   1,    1 },
98*e4b17023SJohn Marino   /* CXX11    */  { 1,  1,  1,   0,  1,   1,   1,   1,   1,    1 },
99*e4b17023SJohn Marino   /* ASM      */  { 0,  0,  1,   0,  0,   1,   0,   0,   0,    0 }
100*e4b17023SJohn Marino   /* xid should be 1 for GNUC99, STDC99, GNUCXX, CXX98, GNUCXX11, and
101*e4b17023SJohn Marino      CXX11 when no longer experimental (when all uses of identifiers
102*e4b17023SJohn Marino      in the compiler have been audited for correct handling of
103*e4b17023SJohn Marino      extended identifiers).  */
104*e4b17023SJohn Marino };
105*e4b17023SJohn Marino 
106*e4b17023SJohn Marino /* Sets internal flags correctly for a given language.  */
107*e4b17023SJohn Marino void
cpp_set_lang(cpp_reader * pfile,enum c_lang lang)108*e4b17023SJohn Marino cpp_set_lang (cpp_reader *pfile, enum c_lang lang)
109*e4b17023SJohn Marino {
110*e4b17023SJohn Marino   const struct lang_flags *l = &lang_defaults[(int) lang];
111*e4b17023SJohn Marino 
112*e4b17023SJohn Marino   CPP_OPTION (pfile, lang) = lang;
113*e4b17023SJohn Marino 
114*e4b17023SJohn Marino   CPP_OPTION (pfile, c99)			 = l->c99;
115*e4b17023SJohn Marino   CPP_OPTION (pfile, cplusplus)			 = l->cplusplus;
116*e4b17023SJohn Marino   CPP_OPTION (pfile, extended_numbers)		 = l->extended_numbers;
117*e4b17023SJohn Marino   CPP_OPTION (pfile, extended_identifiers)	 = l->extended_identifiers;
118*e4b17023SJohn Marino   CPP_OPTION (pfile, std)			 = l->std;
119*e4b17023SJohn Marino   CPP_OPTION (pfile, trigraphs)			 = l->std;
120*e4b17023SJohn Marino   CPP_OPTION (pfile, cplusplus_comments)	 = l->cplusplus_comments;
121*e4b17023SJohn Marino   CPP_OPTION (pfile, digraphs)			 = l->digraphs;
122*e4b17023SJohn Marino   CPP_OPTION (pfile, uliterals)			 = l->uliterals;
123*e4b17023SJohn Marino   CPP_OPTION (pfile, rliterals)			 = l->rliterals;
124*e4b17023SJohn Marino   CPP_OPTION (pfile, user_literals)		 = l->user_literals;
125*e4b17023SJohn Marino }
126*e4b17023SJohn Marino 
127*e4b17023SJohn Marino /* Initialize library global state.  */
128*e4b17023SJohn Marino static void
init_library(void)129*e4b17023SJohn Marino init_library (void)
130*e4b17023SJohn Marino {
131*e4b17023SJohn Marino   static int initialized = 0;
132*e4b17023SJohn Marino 
133*e4b17023SJohn Marino   if (! initialized)
134*e4b17023SJohn Marino     {
135*e4b17023SJohn Marino       initialized = 1;
136*e4b17023SJohn Marino 
137*e4b17023SJohn Marino       _cpp_init_lexer ();
138*e4b17023SJohn Marino 
139*e4b17023SJohn Marino       /* Set up the trigraph map.  This doesn't need to do anything if
140*e4b17023SJohn Marino 	 we were compiled with a compiler that supports C99 designated
141*e4b17023SJohn Marino 	 initializers.  */
142*e4b17023SJohn Marino       init_trigraph_map ();
143*e4b17023SJohn Marino 
144*e4b17023SJohn Marino #ifdef ENABLE_NLS
145*e4b17023SJohn Marino        (void) bindtextdomain (PACKAGE, LOCALEDIR);
146*e4b17023SJohn Marino #endif
147*e4b17023SJohn Marino     }
148*e4b17023SJohn Marino }
149*e4b17023SJohn Marino 
150*e4b17023SJohn Marino /* Initialize a cpp_reader structure.  */
151*e4b17023SJohn Marino cpp_reader *
cpp_create_reader(enum c_lang lang,hash_table * table,struct line_maps * line_table)152*e4b17023SJohn Marino cpp_create_reader (enum c_lang lang, hash_table *table,
153*e4b17023SJohn Marino 		   struct line_maps *line_table)
154*e4b17023SJohn Marino {
155*e4b17023SJohn Marino   cpp_reader *pfile;
156*e4b17023SJohn Marino 
157*e4b17023SJohn Marino   /* Initialize this instance of the library if it hasn't been already.  */
158*e4b17023SJohn Marino   init_library ();
159*e4b17023SJohn Marino 
160*e4b17023SJohn Marino   pfile = XCNEW (cpp_reader);
161*e4b17023SJohn Marino   memset (&pfile->base_context, 0, sizeof (pfile->base_context));
162*e4b17023SJohn Marino 
163*e4b17023SJohn Marino   cpp_set_lang (pfile, lang);
164*e4b17023SJohn Marino   CPP_OPTION (pfile, warn_multichar) = 1;
165*e4b17023SJohn Marino   CPP_OPTION (pfile, discard_comments) = 1;
166*e4b17023SJohn Marino   CPP_OPTION (pfile, discard_comments_in_macro_exp) = 1;
167*e4b17023SJohn Marino   CPP_OPTION (pfile, tabstop) = 8;
168*e4b17023SJohn Marino   CPP_OPTION (pfile, operator_names) = 1;
169*e4b17023SJohn Marino   CPP_OPTION (pfile, warn_trigraphs) = 2;
170*e4b17023SJohn Marino   CPP_OPTION (pfile, warn_endif_labels) = 1;
171*e4b17023SJohn Marino   CPP_OPTION (pfile, cpp_warn_deprecated) = 1;
172*e4b17023SJohn Marino   CPP_OPTION (pfile, cpp_warn_long_long) = 0;
173*e4b17023SJohn Marino   CPP_OPTION (pfile, dollars_in_ident) = 1;
174*e4b17023SJohn Marino   CPP_OPTION (pfile, warn_dollars) = 1;
175*e4b17023SJohn Marino   CPP_OPTION (pfile, warn_variadic_macros) = 1;
176*e4b17023SJohn Marino   CPP_OPTION (pfile, warn_builtin_macro_redefined) = 1;
177*e4b17023SJohn Marino   CPP_OPTION (pfile, warn_normalize) = normalized_C;
178*e4b17023SJohn Marino 
179*e4b17023SJohn Marino   /* Default CPP arithmetic to something sensible for the host for the
180*e4b17023SJohn Marino      benefit of dumb users like fix-header.  */
181*e4b17023SJohn Marino   CPP_OPTION (pfile, precision) = CHAR_BIT * sizeof (long);
182*e4b17023SJohn Marino   CPP_OPTION (pfile, char_precision) = CHAR_BIT;
183*e4b17023SJohn Marino   CPP_OPTION (pfile, wchar_precision) = CHAR_BIT * sizeof (int);
184*e4b17023SJohn Marino   CPP_OPTION (pfile, int_precision) = CHAR_BIT * sizeof (int);
185*e4b17023SJohn Marino   CPP_OPTION (pfile, unsigned_char) = 0;
186*e4b17023SJohn Marino   CPP_OPTION (pfile, unsigned_wchar) = 1;
187*e4b17023SJohn Marino   CPP_OPTION (pfile, bytes_big_endian) = 1;  /* does not matter */
188*e4b17023SJohn Marino 
189*e4b17023SJohn Marino   /* Default to no charset conversion.  */
190*e4b17023SJohn Marino   CPP_OPTION (pfile, narrow_charset) = _cpp_default_encoding ();
191*e4b17023SJohn Marino   CPP_OPTION (pfile, wide_charset) = 0;
192*e4b17023SJohn Marino 
193*e4b17023SJohn Marino   /* Default the input character set to UTF-8.  */
194*e4b17023SJohn Marino   CPP_OPTION (pfile, input_charset) = _cpp_default_encoding ();
195*e4b17023SJohn Marino 
196*e4b17023SJohn Marino   /* A fake empty "directory" used as the starting point for files
197*e4b17023SJohn Marino      looked up without a search path.  Name cannot be '/' because we
198*e4b17023SJohn Marino      don't want to prepend anything at all to filenames using it.  All
199*e4b17023SJohn Marino      other entries are correct zero-initialized.  */
200*e4b17023SJohn Marino   pfile->no_search_path.name = (char *) "";
201*e4b17023SJohn Marino 
202*e4b17023SJohn Marino   /* Initialize the line map.  */
203*e4b17023SJohn Marino   pfile->line_table = line_table;
204*e4b17023SJohn Marino 
205*e4b17023SJohn Marino   /* Initialize lexer state.  */
206*e4b17023SJohn Marino   pfile->state.save_comments = ! CPP_OPTION (pfile, discard_comments);
207*e4b17023SJohn Marino 
208*e4b17023SJohn Marino   /* Set up static tokens.  */
209*e4b17023SJohn Marino   pfile->avoid_paste.type = CPP_PADDING;
210*e4b17023SJohn Marino   pfile->avoid_paste.val.source = NULL;
211*e4b17023SJohn Marino   pfile->eof.type = CPP_EOF;
212*e4b17023SJohn Marino   pfile->eof.flags = 0;
213*e4b17023SJohn Marino 
214*e4b17023SJohn Marino   /* Create a token buffer for the lexer.  */
215*e4b17023SJohn Marino   _cpp_init_tokenrun (&pfile->base_run, 250);
216*e4b17023SJohn Marino   pfile->cur_run = &pfile->base_run;
217*e4b17023SJohn Marino   pfile->cur_token = pfile->base_run.base;
218*e4b17023SJohn Marino 
219*e4b17023SJohn Marino   /* Initialize the base context.  */
220*e4b17023SJohn Marino   pfile->context = &pfile->base_context;
221*e4b17023SJohn Marino   pfile->base_context.c.macro = 0;
222*e4b17023SJohn Marino   pfile->base_context.prev = pfile->base_context.next = 0;
223*e4b17023SJohn Marino 
224*e4b17023SJohn Marino   /* Aligned and unaligned storage.  */
225*e4b17023SJohn Marino   pfile->a_buff = _cpp_get_buff (pfile, 0);
226*e4b17023SJohn Marino   pfile->u_buff = _cpp_get_buff (pfile, 0);
227*e4b17023SJohn Marino 
228*e4b17023SJohn Marino   /* Initialize table for push_macro/pop_macro.  */
229*e4b17023SJohn Marino   pfile->pushed_macros = 0;
230*e4b17023SJohn Marino 
231*e4b17023SJohn Marino   /* Do not force token locations by default.  */
232*e4b17023SJohn Marino   pfile->forced_token_location_p = NULL;
233*e4b17023SJohn Marino 
234*e4b17023SJohn Marino   /* The expression parser stack.  */
235*e4b17023SJohn Marino   _cpp_expand_op_stack (pfile);
236*e4b17023SJohn Marino 
237*e4b17023SJohn Marino   /* Initialize the buffer obstack.  */
238*e4b17023SJohn Marino   _obstack_begin (&pfile->buffer_ob, 0, 0,
239*e4b17023SJohn Marino 		  (void *(*) (long)) xmalloc,
240*e4b17023SJohn Marino 		  (void (*) (void *)) free);
241*e4b17023SJohn Marino 
242*e4b17023SJohn Marino   _cpp_init_files (pfile);
243*e4b17023SJohn Marino 
244*e4b17023SJohn Marino   _cpp_init_hashtable (pfile, table);
245*e4b17023SJohn Marino 
246*e4b17023SJohn Marino   return pfile;
247*e4b17023SJohn Marino }
248*e4b17023SJohn Marino 
249*e4b17023SJohn Marino /* Set the line_table entry in PFILE.  This is called after reading a
250*e4b17023SJohn Marino    PCH file, as the old line_table will be incorrect.  */
251*e4b17023SJohn Marino void
cpp_set_line_map(cpp_reader * pfile,struct line_maps * line_table)252*e4b17023SJohn Marino cpp_set_line_map (cpp_reader *pfile, struct line_maps *line_table)
253*e4b17023SJohn Marino {
254*e4b17023SJohn Marino   pfile->line_table = line_table;
255*e4b17023SJohn Marino }
256*e4b17023SJohn Marino 
257*e4b17023SJohn Marino /* Free resources used by PFILE.  Accessing PFILE after this function
258*e4b17023SJohn Marino    returns leads to undefined behavior.  Returns the error count.  */
259*e4b17023SJohn Marino void
cpp_destroy(cpp_reader * pfile)260*e4b17023SJohn Marino cpp_destroy (cpp_reader *pfile)
261*e4b17023SJohn Marino {
262*e4b17023SJohn Marino   cpp_context *context, *contextn;
263*e4b17023SJohn Marino   struct def_pragma_macro *pmacro;
264*e4b17023SJohn Marino   tokenrun *run, *runn;
265*e4b17023SJohn Marino   int i;
266*e4b17023SJohn Marino 
267*e4b17023SJohn Marino   free (pfile->op_stack);
268*e4b17023SJohn Marino 
269*e4b17023SJohn Marino   while (CPP_BUFFER (pfile) != NULL)
270*e4b17023SJohn Marino     _cpp_pop_buffer (pfile);
271*e4b17023SJohn Marino 
272*e4b17023SJohn Marino   free (pfile->out.base);
273*e4b17023SJohn Marino 
274*e4b17023SJohn Marino   if (pfile->macro_buffer)
275*e4b17023SJohn Marino     {
276*e4b17023SJohn Marino       free (pfile->macro_buffer);
277*e4b17023SJohn Marino       pfile->macro_buffer = NULL;
278*e4b17023SJohn Marino       pfile->macro_buffer_len = 0;
279*e4b17023SJohn Marino     }
280*e4b17023SJohn Marino 
281*e4b17023SJohn Marino   if (pfile->deps)
282*e4b17023SJohn Marino     deps_free (pfile->deps);
283*e4b17023SJohn Marino   obstack_free (&pfile->buffer_ob, 0);
284*e4b17023SJohn Marino 
285*e4b17023SJohn Marino   _cpp_destroy_hashtable (pfile);
286*e4b17023SJohn Marino   _cpp_cleanup_files (pfile);
287*e4b17023SJohn Marino   _cpp_destroy_iconv (pfile);
288*e4b17023SJohn Marino 
289*e4b17023SJohn Marino   _cpp_free_buff (pfile->a_buff);
290*e4b17023SJohn Marino   _cpp_free_buff (pfile->u_buff);
291*e4b17023SJohn Marino   _cpp_free_buff (pfile->free_buffs);
292*e4b17023SJohn Marino 
293*e4b17023SJohn Marino   for (run = &pfile->base_run; run; run = runn)
294*e4b17023SJohn Marino     {
295*e4b17023SJohn Marino       runn = run->next;
296*e4b17023SJohn Marino       free (run->base);
297*e4b17023SJohn Marino       if (run != &pfile->base_run)
298*e4b17023SJohn Marino 	free (run);
299*e4b17023SJohn Marino     }
300*e4b17023SJohn Marino 
301*e4b17023SJohn Marino   for (context = pfile->base_context.next; context; context = contextn)
302*e4b17023SJohn Marino     {
303*e4b17023SJohn Marino       contextn = context->next;
304*e4b17023SJohn Marino       free (context);
305*e4b17023SJohn Marino     }
306*e4b17023SJohn Marino 
307*e4b17023SJohn Marino   if (pfile->comments.entries)
308*e4b17023SJohn Marino     {
309*e4b17023SJohn Marino       for (i = 0; i < pfile->comments.count; i++)
310*e4b17023SJohn Marino 	free (pfile->comments.entries[i].comment);
311*e4b17023SJohn Marino 
312*e4b17023SJohn Marino       free (pfile->comments.entries);
313*e4b17023SJohn Marino     }
314*e4b17023SJohn Marino   if (pfile->pushed_macros)
315*e4b17023SJohn Marino     {
316*e4b17023SJohn Marino       do
317*e4b17023SJohn Marino 	{
318*e4b17023SJohn Marino 	  pmacro = pfile->pushed_macros;
319*e4b17023SJohn Marino 	  pfile->pushed_macros = pmacro->next;
320*e4b17023SJohn Marino 	  free (pmacro->name);
321*e4b17023SJohn Marino 	  free (pmacro);
322*e4b17023SJohn Marino 	}
323*e4b17023SJohn Marino       while (pfile->pushed_macros);
324*e4b17023SJohn Marino     }
325*e4b17023SJohn Marino 
326*e4b17023SJohn Marino   free (pfile);
327*e4b17023SJohn Marino }
328*e4b17023SJohn Marino 
329*e4b17023SJohn Marino /* This structure defines one built-in identifier.  A node will be
330*e4b17023SJohn Marino    entered in the hash table under the name NAME, with value VALUE.
331*e4b17023SJohn Marino 
332*e4b17023SJohn Marino    There are two tables of these.  builtin_array holds all the
333*e4b17023SJohn Marino    "builtin" macros: these are handled by builtin_macro() in
334*e4b17023SJohn Marino    macro.c.  Builtin is somewhat of a misnomer -- the property of
335*e4b17023SJohn Marino    interest is that these macros require special code to compute their
336*e4b17023SJohn Marino    expansions.  The value is a "cpp_builtin_type" enumerator.
337*e4b17023SJohn Marino 
338*e4b17023SJohn Marino    operator_array holds the C++ named operators.  These are keywords
339*e4b17023SJohn Marino    which act as aliases for punctuators.  In C++, they cannot be
340*e4b17023SJohn Marino    altered through #define, and #if recognizes them as operators.  In
341*e4b17023SJohn Marino    C, these are not entered into the hash table at all (but see
342*e4b17023SJohn Marino    <iso646.h>).  The value is a token-type enumerator.  */
343*e4b17023SJohn Marino struct builtin_macro
344*e4b17023SJohn Marino {
345*e4b17023SJohn Marino   const uchar *const name;
346*e4b17023SJohn Marino   const unsigned short len;
347*e4b17023SJohn Marino   const unsigned short value;
348*e4b17023SJohn Marino   const bool always_warn_if_redefined;
349*e4b17023SJohn Marino };
350*e4b17023SJohn Marino 
351*e4b17023SJohn Marino #define B(n, t, f)    { DSC(n), t, f }
352*e4b17023SJohn Marino static const struct builtin_macro builtin_array[] =
353*e4b17023SJohn Marino {
354*e4b17023SJohn Marino   B("__TIMESTAMP__",	 BT_TIMESTAMP,     false),
355*e4b17023SJohn Marino   B("__TIME__",		 BT_TIME,          false),
356*e4b17023SJohn Marino   B("__DATE__",		 BT_DATE,          false),
357*e4b17023SJohn Marino   B("__FILE__",		 BT_FILE,          false),
358*e4b17023SJohn Marino   B("__BASE_FILE__",	 BT_BASE_FILE,     false),
359*e4b17023SJohn Marino   B("__LINE__",		 BT_SPECLINE,      true),
360*e4b17023SJohn Marino   B("__INCLUDE_LEVEL__", BT_INCLUDE_LEVEL, true),
361*e4b17023SJohn Marino   B("__COUNTER__",	 BT_COUNTER,       true),
362*e4b17023SJohn Marino   /* Keep builtins not used for -traditional-cpp at the end, and
363*e4b17023SJohn Marino      update init_builtins() if any more are added.  */
364*e4b17023SJohn Marino   B("_Pragma",		 BT_PRAGMA,        true),
365*e4b17023SJohn Marino   B("__STDC__",		 BT_STDC,          true),
366*e4b17023SJohn Marino };
367*e4b17023SJohn Marino #undef B
368*e4b17023SJohn Marino 
369*e4b17023SJohn Marino struct builtin_operator
370*e4b17023SJohn Marino {
371*e4b17023SJohn Marino   const uchar *const name;
372*e4b17023SJohn Marino   const unsigned short len;
373*e4b17023SJohn Marino   const unsigned short value;
374*e4b17023SJohn Marino };
375*e4b17023SJohn Marino 
376*e4b17023SJohn Marino #define B(n, t)    { DSC(n), t }
377*e4b17023SJohn Marino static const struct builtin_operator operator_array[] =
378*e4b17023SJohn Marino {
379*e4b17023SJohn Marino   B("and",	CPP_AND_AND),
380*e4b17023SJohn Marino   B("and_eq",	CPP_AND_EQ),
381*e4b17023SJohn Marino   B("bitand",	CPP_AND),
382*e4b17023SJohn Marino   B("bitor",	CPP_OR),
383*e4b17023SJohn Marino   B("compl",	CPP_COMPL),
384*e4b17023SJohn Marino   B("not",	CPP_NOT),
385*e4b17023SJohn Marino   B("not_eq",	CPP_NOT_EQ),
386*e4b17023SJohn Marino   B("or",	CPP_OR_OR),
387*e4b17023SJohn Marino   B("or_eq",	CPP_OR_EQ),
388*e4b17023SJohn Marino   B("xor",	CPP_XOR),
389*e4b17023SJohn Marino   B("xor_eq",	CPP_XOR_EQ)
390*e4b17023SJohn Marino };
391*e4b17023SJohn Marino #undef B
392*e4b17023SJohn Marino 
393*e4b17023SJohn Marino /* Mark the C++ named operators in the hash table.  */
394*e4b17023SJohn Marino static void
mark_named_operators(cpp_reader * pfile,int flags)395*e4b17023SJohn Marino mark_named_operators (cpp_reader *pfile, int flags)
396*e4b17023SJohn Marino {
397*e4b17023SJohn Marino   const struct builtin_operator *b;
398*e4b17023SJohn Marino 
399*e4b17023SJohn Marino   for (b = operator_array;
400*e4b17023SJohn Marino        b < (operator_array + ARRAY_SIZE (operator_array));
401*e4b17023SJohn Marino        b++)
402*e4b17023SJohn Marino     {
403*e4b17023SJohn Marino       cpp_hashnode *hp = cpp_lookup (pfile, b->name, b->len);
404*e4b17023SJohn Marino       hp->flags |= flags;
405*e4b17023SJohn Marino       hp->is_directive = 0;
406*e4b17023SJohn Marino       hp->directive_index = b->value;
407*e4b17023SJohn Marino     }
408*e4b17023SJohn Marino }
409*e4b17023SJohn Marino 
410*e4b17023SJohn Marino /* Helper function of cpp_type2name. Return the string associated with
411*e4b17023SJohn Marino    named operator TYPE.  */
412*e4b17023SJohn Marino const char *
cpp_named_operator2name(enum cpp_ttype type)413*e4b17023SJohn Marino cpp_named_operator2name (enum cpp_ttype type)
414*e4b17023SJohn Marino {
415*e4b17023SJohn Marino   const struct builtin_operator *b;
416*e4b17023SJohn Marino 
417*e4b17023SJohn Marino   for (b = operator_array;
418*e4b17023SJohn Marino        b < (operator_array + ARRAY_SIZE (operator_array));
419*e4b17023SJohn Marino        b++)
420*e4b17023SJohn Marino     {
421*e4b17023SJohn Marino       if (type == b->value)
422*e4b17023SJohn Marino 	return (const char *) b->name;
423*e4b17023SJohn Marino     }
424*e4b17023SJohn Marino 
425*e4b17023SJohn Marino   return NULL;
426*e4b17023SJohn Marino }
427*e4b17023SJohn Marino 
428*e4b17023SJohn Marino void
cpp_init_special_builtins(cpp_reader * pfile)429*e4b17023SJohn Marino cpp_init_special_builtins (cpp_reader *pfile)
430*e4b17023SJohn Marino {
431*e4b17023SJohn Marino   const struct builtin_macro *b;
432*e4b17023SJohn Marino   size_t n = ARRAY_SIZE (builtin_array);
433*e4b17023SJohn Marino 
434*e4b17023SJohn Marino   if (CPP_OPTION (pfile, traditional))
435*e4b17023SJohn Marino     n -= 2;
436*e4b17023SJohn Marino   else if (! CPP_OPTION (pfile, stdc_0_in_system_headers)
437*e4b17023SJohn Marino 	   || CPP_OPTION (pfile, std))
438*e4b17023SJohn Marino     n--;
439*e4b17023SJohn Marino 
440*e4b17023SJohn Marino   for (b = builtin_array; b < builtin_array + n; b++)
441*e4b17023SJohn Marino     {
442*e4b17023SJohn Marino       cpp_hashnode *hp = cpp_lookup (pfile, b->name, b->len);
443*e4b17023SJohn Marino       hp->type = NT_MACRO;
444*e4b17023SJohn Marino       hp->flags |= NODE_BUILTIN;
445*e4b17023SJohn Marino       if (b->always_warn_if_redefined
446*e4b17023SJohn Marino           || CPP_OPTION (pfile, warn_builtin_macro_redefined))
447*e4b17023SJohn Marino 	hp->flags |= NODE_WARN;
448*e4b17023SJohn Marino       hp->value.builtin = (enum cpp_builtin_type) b->value;
449*e4b17023SJohn Marino     }
450*e4b17023SJohn Marino }
451*e4b17023SJohn Marino 
452*e4b17023SJohn Marino /* Read the builtins table above and enter them, and language-specific
453*e4b17023SJohn Marino    macros, into the hash table.  HOSTED is true if this is a hosted
454*e4b17023SJohn Marino    environment.  */
455*e4b17023SJohn Marino void
cpp_init_builtins(cpp_reader * pfile,int hosted)456*e4b17023SJohn Marino cpp_init_builtins (cpp_reader *pfile, int hosted)
457*e4b17023SJohn Marino {
458*e4b17023SJohn Marino   cpp_init_special_builtins (pfile);
459*e4b17023SJohn Marino 
460*e4b17023SJohn Marino   if (!CPP_OPTION (pfile, traditional)
461*e4b17023SJohn Marino       && (! CPP_OPTION (pfile, stdc_0_in_system_headers)
462*e4b17023SJohn Marino 	  || CPP_OPTION (pfile, std)))
463*e4b17023SJohn Marino     _cpp_define_builtin (pfile, "__STDC__ 1");
464*e4b17023SJohn Marino 
465*e4b17023SJohn Marino   if (CPP_OPTION (pfile, cplusplus))
466*e4b17023SJohn Marino     {
467*e4b17023SJohn Marino       if (CPP_OPTION (pfile, lang) == CLK_CXX11
468*e4b17023SJohn Marino 	   || CPP_OPTION (pfile, lang) == CLK_GNUCXX11)
469*e4b17023SJohn Marino 	_cpp_define_builtin (pfile, "__cplusplus 201103L");
470*e4b17023SJohn Marino       else
471*e4b17023SJohn Marino 	_cpp_define_builtin (pfile, "__cplusplus 199711L");
472*e4b17023SJohn Marino     }
473*e4b17023SJohn Marino   else if (CPP_OPTION (pfile, lang) == CLK_ASM)
474*e4b17023SJohn Marino     _cpp_define_builtin (pfile, "__ASSEMBLER__ 1");
475*e4b17023SJohn Marino   else if (CPP_OPTION (pfile, lang) == CLK_STDC94)
476*e4b17023SJohn Marino     _cpp_define_builtin (pfile, "__STDC_VERSION__ 199409L");
477*e4b17023SJohn Marino   else if (CPP_OPTION (pfile, lang) == CLK_STDC11
478*e4b17023SJohn Marino 	   || CPP_OPTION (pfile, lang) == CLK_GNUC11)
479*e4b17023SJohn Marino     _cpp_define_builtin (pfile, "__STDC_VERSION__ 201112L");
480*e4b17023SJohn Marino   else if (CPP_OPTION (pfile, c99))
481*e4b17023SJohn Marino     _cpp_define_builtin (pfile, "__STDC_VERSION__ 199901L");
482*e4b17023SJohn Marino 
483*e4b17023SJohn Marino   if (CPP_OPTION (pfile, uliterals)
484*e4b17023SJohn Marino       && !CPP_OPTION (pfile, cplusplus))
485*e4b17023SJohn Marino     {
486*e4b17023SJohn Marino       _cpp_define_builtin (pfile, "__STDC_UTF_16__ 1");
487*e4b17023SJohn Marino       _cpp_define_builtin (pfile, "__STDC_UTF_32__ 1");
488*e4b17023SJohn Marino     }
489*e4b17023SJohn Marino 
490*e4b17023SJohn Marino   if (hosted)
491*e4b17023SJohn Marino     _cpp_define_builtin (pfile, "__STDC_HOSTED__ 1");
492*e4b17023SJohn Marino   else
493*e4b17023SJohn Marino     _cpp_define_builtin (pfile, "__STDC_HOSTED__ 0");
494*e4b17023SJohn Marino 
495*e4b17023SJohn Marino   if (CPP_OPTION (pfile, objc))
496*e4b17023SJohn Marino     _cpp_define_builtin (pfile, "__OBJC__ 1");
497*e4b17023SJohn Marino }
498*e4b17023SJohn Marino 
499*e4b17023SJohn Marino /* Sanity-checks are dependent on command-line options, so it is
500*e4b17023SJohn Marino    called as a subroutine of cpp_read_main_file ().  */
501*e4b17023SJohn Marino #if ENABLE_CHECKING
502*e4b17023SJohn Marino static void sanity_checks (cpp_reader *);
sanity_checks(cpp_reader * pfile)503*e4b17023SJohn Marino static void sanity_checks (cpp_reader *pfile)
504*e4b17023SJohn Marino {
505*e4b17023SJohn Marino   cppchar_t test = 0;
506*e4b17023SJohn Marino   size_t max_precision = 2 * CHAR_BIT * sizeof (cpp_num_part);
507*e4b17023SJohn Marino 
508*e4b17023SJohn Marino   /* Sanity checks for assumptions about CPP arithmetic and target
509*e4b17023SJohn Marino      type precisions made by cpplib.  */
510*e4b17023SJohn Marino   test--;
511*e4b17023SJohn Marino   if (test < 1)
512*e4b17023SJohn Marino     cpp_error (pfile, CPP_DL_ICE, "cppchar_t must be an unsigned type");
513*e4b17023SJohn Marino 
514*e4b17023SJohn Marino   if (CPP_OPTION (pfile, precision) > max_precision)
515*e4b17023SJohn Marino     cpp_error (pfile, CPP_DL_ICE,
516*e4b17023SJohn Marino 	       "preprocessor arithmetic has maximum precision of %lu bits;"
517*e4b17023SJohn Marino 	       " target requires %lu bits",
518*e4b17023SJohn Marino 	       (unsigned long) max_precision,
519*e4b17023SJohn Marino 	       (unsigned long) CPP_OPTION (pfile, precision));
520*e4b17023SJohn Marino 
521*e4b17023SJohn Marino   if (CPP_OPTION (pfile, precision) < CPP_OPTION (pfile, int_precision))
522*e4b17023SJohn Marino     cpp_error (pfile, CPP_DL_ICE,
523*e4b17023SJohn Marino 	       "CPP arithmetic must be at least as precise as a target int");
524*e4b17023SJohn Marino 
525*e4b17023SJohn Marino   if (CPP_OPTION (pfile, char_precision) < 8)
526*e4b17023SJohn Marino     cpp_error (pfile, CPP_DL_ICE, "target char is less than 8 bits wide");
527*e4b17023SJohn Marino 
528*e4b17023SJohn Marino   if (CPP_OPTION (pfile, wchar_precision) < CPP_OPTION (pfile, char_precision))
529*e4b17023SJohn Marino     cpp_error (pfile, CPP_DL_ICE,
530*e4b17023SJohn Marino 	       "target wchar_t is narrower than target char");
531*e4b17023SJohn Marino 
532*e4b17023SJohn Marino   if (CPP_OPTION (pfile, int_precision) < CPP_OPTION (pfile, char_precision))
533*e4b17023SJohn Marino     cpp_error (pfile, CPP_DL_ICE,
534*e4b17023SJohn Marino 	       "target int is narrower than target char");
535*e4b17023SJohn Marino 
536*e4b17023SJohn Marino   /* This is assumed in eval_token() and could be fixed if necessary.  */
537*e4b17023SJohn Marino   if (sizeof (cppchar_t) > sizeof (cpp_num_part))
538*e4b17023SJohn Marino     cpp_error (pfile, CPP_DL_ICE,
539*e4b17023SJohn Marino 	       "CPP half-integer narrower than CPP character");
540*e4b17023SJohn Marino 
541*e4b17023SJohn Marino   if (CPP_OPTION (pfile, wchar_precision) > BITS_PER_CPPCHAR_T)
542*e4b17023SJohn Marino     cpp_error (pfile, CPP_DL_ICE,
543*e4b17023SJohn Marino 	       "CPP on this host cannot handle wide character constants over"
544*e4b17023SJohn Marino 	       " %lu bits, but the target requires %lu bits",
545*e4b17023SJohn Marino 	       (unsigned long) BITS_PER_CPPCHAR_T,
546*e4b17023SJohn Marino 	       (unsigned long) CPP_OPTION (pfile, wchar_precision));
547*e4b17023SJohn Marino }
548*e4b17023SJohn Marino #else
549*e4b17023SJohn Marino # define sanity_checks(PFILE)
550*e4b17023SJohn Marino #endif
551*e4b17023SJohn Marino 
552*e4b17023SJohn Marino /* This is called after options have been parsed, and partially
553*e4b17023SJohn Marino    processed.  */
554*e4b17023SJohn Marino void
cpp_post_options(cpp_reader * pfile)555*e4b17023SJohn Marino cpp_post_options (cpp_reader *pfile)
556*e4b17023SJohn Marino {
557*e4b17023SJohn Marino   int flags;
558*e4b17023SJohn Marino 
559*e4b17023SJohn Marino   sanity_checks (pfile);
560*e4b17023SJohn Marino 
561*e4b17023SJohn Marino   post_options (pfile);
562*e4b17023SJohn Marino 
563*e4b17023SJohn Marino   /* Mark named operators before handling command line macros.  */
564*e4b17023SJohn Marino   flags = 0;
565*e4b17023SJohn Marino   if (CPP_OPTION (pfile, cplusplus) && CPP_OPTION (pfile, operator_names))
566*e4b17023SJohn Marino     flags |= NODE_OPERATOR;
567*e4b17023SJohn Marino   if (CPP_OPTION (pfile, warn_cxx_operator_names))
568*e4b17023SJohn Marino     flags |= NODE_DIAGNOSTIC | NODE_WARN_OPERATOR;
569*e4b17023SJohn Marino   if (flags != 0)
570*e4b17023SJohn Marino     mark_named_operators (pfile, flags);
571*e4b17023SJohn Marino }
572*e4b17023SJohn Marino 
573*e4b17023SJohn Marino /* Setup for processing input from the file named FNAME, or stdin if
574*e4b17023SJohn Marino    it is the empty string.  Return the original filename
575*e4b17023SJohn Marino    on success (e.g. foo.i->foo.c), or NULL on failure.  */
576*e4b17023SJohn Marino const char *
cpp_read_main_file(cpp_reader * pfile,const char * fname)577*e4b17023SJohn Marino cpp_read_main_file (cpp_reader *pfile, const char *fname)
578*e4b17023SJohn Marino {
579*e4b17023SJohn Marino   if (CPP_OPTION (pfile, deps.style) != DEPS_NONE)
580*e4b17023SJohn Marino     {
581*e4b17023SJohn Marino       if (!pfile->deps)
582*e4b17023SJohn Marino 	pfile->deps = deps_init ();
583*e4b17023SJohn Marino 
584*e4b17023SJohn Marino       /* Set the default target (if there is none already).  */
585*e4b17023SJohn Marino       deps_add_default_target (pfile->deps, fname);
586*e4b17023SJohn Marino     }
587*e4b17023SJohn Marino 
588*e4b17023SJohn Marino   pfile->main_file
589*e4b17023SJohn Marino     = _cpp_find_file (pfile, fname, &pfile->no_search_path, false, 0);
590*e4b17023SJohn Marino   if (_cpp_find_failed (pfile->main_file))
591*e4b17023SJohn Marino     return NULL;
592*e4b17023SJohn Marino 
593*e4b17023SJohn Marino   _cpp_stack_file (pfile, pfile->main_file, false);
594*e4b17023SJohn Marino 
595*e4b17023SJohn Marino   /* For foo.i, read the original filename foo.c now, for the benefit
596*e4b17023SJohn Marino      of the front ends.  */
597*e4b17023SJohn Marino   if (CPP_OPTION (pfile, preprocessed))
598*e4b17023SJohn Marino     {
599*e4b17023SJohn Marino       read_original_filename (pfile);
600*e4b17023SJohn Marino       fname =
601*e4b17023SJohn Marino 	ORDINARY_MAP_FILE_NAME
602*e4b17023SJohn Marino 	((LINEMAPS_LAST_ORDINARY_MAP (pfile->line_table)));
603*e4b17023SJohn Marino     }
604*e4b17023SJohn Marino   return fname;
605*e4b17023SJohn Marino }
606*e4b17023SJohn Marino 
607*e4b17023SJohn Marino /* For preprocessed files, if the first tokens are of the form # NUM.
608*e4b17023SJohn Marino    handle the directive so we know the original file name.  This will
609*e4b17023SJohn Marino    generate file_change callbacks, which the front ends must handle
610*e4b17023SJohn Marino    appropriately given their state of initialization.  */
611*e4b17023SJohn Marino static void
read_original_filename(cpp_reader * pfile)612*e4b17023SJohn Marino read_original_filename (cpp_reader *pfile)
613*e4b17023SJohn Marino {
614*e4b17023SJohn Marino   const cpp_token *token, *token1;
615*e4b17023SJohn Marino 
616*e4b17023SJohn Marino   /* Lex ahead; if the first tokens are of the form # NUM, then
617*e4b17023SJohn Marino      process the directive, otherwise back up.  */
618*e4b17023SJohn Marino   token = _cpp_lex_direct (pfile);
619*e4b17023SJohn Marino   if (token->type == CPP_HASH)
620*e4b17023SJohn Marino     {
621*e4b17023SJohn Marino       pfile->state.in_directive = 1;
622*e4b17023SJohn Marino       token1 = _cpp_lex_direct (pfile);
623*e4b17023SJohn Marino       _cpp_backup_tokens (pfile, 1);
624*e4b17023SJohn Marino       pfile->state.in_directive = 0;
625*e4b17023SJohn Marino 
626*e4b17023SJohn Marino       /* If it's a #line directive, handle it.  */
627*e4b17023SJohn Marino       if (token1->type == CPP_NUMBER
628*e4b17023SJohn Marino 	  && _cpp_handle_directive (pfile, token->flags & PREV_WHITE))
629*e4b17023SJohn Marino 	{
630*e4b17023SJohn Marino 	  read_original_directory (pfile);
631*e4b17023SJohn Marino 	  return;
632*e4b17023SJohn Marino 	}
633*e4b17023SJohn Marino     }
634*e4b17023SJohn Marino 
635*e4b17023SJohn Marino   /* Backup as if nothing happened.  */
636*e4b17023SJohn Marino   _cpp_backup_tokens (pfile, 1);
637*e4b17023SJohn Marino }
638*e4b17023SJohn Marino 
639*e4b17023SJohn Marino /* For preprocessed files, if the tokens following the first filename
640*e4b17023SJohn Marino    line is of the form # <line> "/path/name//", handle the
641*e4b17023SJohn Marino    directive so we know the original current directory.  */
642*e4b17023SJohn Marino static void
read_original_directory(cpp_reader * pfile)643*e4b17023SJohn Marino read_original_directory (cpp_reader *pfile)
644*e4b17023SJohn Marino {
645*e4b17023SJohn Marino   const cpp_token *hash, *token;
646*e4b17023SJohn Marino 
647*e4b17023SJohn Marino   /* Lex ahead; if the first tokens are of the form # NUM, then
648*e4b17023SJohn Marino      process the directive, otherwise back up.  */
649*e4b17023SJohn Marino   hash = _cpp_lex_direct (pfile);
650*e4b17023SJohn Marino   if (hash->type != CPP_HASH)
651*e4b17023SJohn Marino     {
652*e4b17023SJohn Marino       _cpp_backup_tokens (pfile, 1);
653*e4b17023SJohn Marino       return;
654*e4b17023SJohn Marino     }
655*e4b17023SJohn Marino 
656*e4b17023SJohn Marino   token = _cpp_lex_direct (pfile);
657*e4b17023SJohn Marino 
658*e4b17023SJohn Marino   if (token->type != CPP_NUMBER)
659*e4b17023SJohn Marino     {
660*e4b17023SJohn Marino       _cpp_backup_tokens (pfile, 2);
661*e4b17023SJohn Marino       return;
662*e4b17023SJohn Marino     }
663*e4b17023SJohn Marino 
664*e4b17023SJohn Marino   token = _cpp_lex_direct (pfile);
665*e4b17023SJohn Marino 
666*e4b17023SJohn Marino   if (token->type != CPP_STRING
667*e4b17023SJohn Marino       || ! (token->val.str.len >= 5
668*e4b17023SJohn Marino 	    && IS_DIR_SEPARATOR (token->val.str.text[token->val.str.len-2])
669*e4b17023SJohn Marino 	    && IS_DIR_SEPARATOR (token->val.str.text[token->val.str.len-3])))
670*e4b17023SJohn Marino     {
671*e4b17023SJohn Marino       _cpp_backup_tokens (pfile, 3);
672*e4b17023SJohn Marino       return;
673*e4b17023SJohn Marino     }
674*e4b17023SJohn Marino 
675*e4b17023SJohn Marino   if (pfile->cb.dir_change)
676*e4b17023SJohn Marino     {
677*e4b17023SJohn Marino       char *debugdir = (char *) alloca (token->val.str.len - 3);
678*e4b17023SJohn Marino 
679*e4b17023SJohn Marino       memcpy (debugdir, (const char *) token->val.str.text + 1,
680*e4b17023SJohn Marino 	      token->val.str.len - 4);
681*e4b17023SJohn Marino       debugdir[token->val.str.len - 4] = '\0';
682*e4b17023SJohn Marino 
683*e4b17023SJohn Marino       pfile->cb.dir_change (pfile, debugdir);
684*e4b17023SJohn Marino     }
685*e4b17023SJohn Marino }
686*e4b17023SJohn Marino 
687*e4b17023SJohn Marino /* This is called at the end of preprocessing.  It pops the last
688*e4b17023SJohn Marino    buffer and writes dependency output.
689*e4b17023SJohn Marino 
690*e4b17023SJohn Marino    Maybe it should also reset state, such that you could call
691*e4b17023SJohn Marino    cpp_start_read with a new filename to restart processing.  */
692*e4b17023SJohn Marino void
cpp_finish(cpp_reader * pfile,FILE * deps_stream)693*e4b17023SJohn Marino cpp_finish (cpp_reader *pfile, FILE *deps_stream)
694*e4b17023SJohn Marino {
695*e4b17023SJohn Marino   /* Warn about unused macros before popping the final buffer.  */
696*e4b17023SJohn Marino   if (CPP_OPTION (pfile, warn_unused_macros))
697*e4b17023SJohn Marino     cpp_forall_identifiers (pfile, _cpp_warn_if_unused_macro, NULL);
698*e4b17023SJohn Marino 
699*e4b17023SJohn Marino   /* lex.c leaves the final buffer on the stack.  This it so that
700*e4b17023SJohn Marino      it returns an unending stream of CPP_EOFs to the client.  If we
701*e4b17023SJohn Marino      popped the buffer, we'd dereference a NULL buffer pointer and
702*e4b17023SJohn Marino      segfault.  It's nice to allow the client to do worry-free excess
703*e4b17023SJohn Marino      cpp_get_token calls.  */
704*e4b17023SJohn Marino   while (pfile->buffer)
705*e4b17023SJohn Marino     _cpp_pop_buffer (pfile);
706*e4b17023SJohn Marino 
707*e4b17023SJohn Marino   if (CPP_OPTION (pfile, deps.style) != DEPS_NONE
708*e4b17023SJohn Marino       && deps_stream)
709*e4b17023SJohn Marino     {
710*e4b17023SJohn Marino       deps_write (pfile->deps, deps_stream, 72);
711*e4b17023SJohn Marino 
712*e4b17023SJohn Marino       if (CPP_OPTION (pfile, deps.phony_targets))
713*e4b17023SJohn Marino 	deps_phony_targets (pfile->deps, deps_stream);
714*e4b17023SJohn Marino     }
715*e4b17023SJohn Marino 
716*e4b17023SJohn Marino   /* Report on headers that could use multiple include guards.  */
717*e4b17023SJohn Marino   if (CPP_OPTION (pfile, print_include_names))
718*e4b17023SJohn Marino     _cpp_report_missing_guards (pfile);
719*e4b17023SJohn Marino }
720*e4b17023SJohn Marino 
721*e4b17023SJohn Marino static void
post_options(cpp_reader * pfile)722*e4b17023SJohn Marino post_options (cpp_reader *pfile)
723*e4b17023SJohn Marino {
724*e4b17023SJohn Marino   /* -Wtraditional is not useful in C++ mode.  */
725*e4b17023SJohn Marino   if (CPP_OPTION (pfile, cplusplus))
726*e4b17023SJohn Marino     CPP_OPTION (pfile, cpp_warn_traditional) = 0;
727*e4b17023SJohn Marino 
728*e4b17023SJohn Marino   /* Permanently disable macro expansion if we are rescanning
729*e4b17023SJohn Marino      preprocessed text.  Read preprocesed source in ISO mode.  */
730*e4b17023SJohn Marino   if (CPP_OPTION (pfile, preprocessed))
731*e4b17023SJohn Marino     {
732*e4b17023SJohn Marino       if (!CPP_OPTION (pfile, directives_only))
733*e4b17023SJohn Marino 	pfile->state.prevent_expansion = 1;
734*e4b17023SJohn Marino       CPP_OPTION (pfile, traditional) = 0;
735*e4b17023SJohn Marino     }
736*e4b17023SJohn Marino 
737*e4b17023SJohn Marino   if (CPP_OPTION (pfile, warn_trigraphs) == 2)
738*e4b17023SJohn Marino     CPP_OPTION (pfile, warn_trigraphs) = !CPP_OPTION (pfile, trigraphs);
739*e4b17023SJohn Marino 
740*e4b17023SJohn Marino   if (CPP_OPTION (pfile, traditional))
741*e4b17023SJohn Marino     {
742*e4b17023SJohn Marino       CPP_OPTION (pfile, cplusplus_comments) = 0;
743*e4b17023SJohn Marino 
744*e4b17023SJohn Marino       CPP_OPTION (pfile, trigraphs) = 0;
745*e4b17023SJohn Marino       CPP_OPTION (pfile, warn_trigraphs) = 0;
746*e4b17023SJohn Marino     }
747*e4b17023SJohn Marino }
748