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