136ac495dSmrg /* CPP Library.
2*8feb0f0bSmrg Copyright (C) 1986-2020 Free Software Foundation, Inc.
336ac495dSmrg Contributed by Per Bothner, 1994-95.
436ac495dSmrg Based on CCCP program by Paul Rubin, June 1986
536ac495dSmrg Adapted to ANSI C, Richard Stallman, Jan 1987
636ac495dSmrg
736ac495dSmrg This program is free software; you can redistribute it and/or modify it
836ac495dSmrg under the terms of the GNU General Public License as published by the
936ac495dSmrg Free Software Foundation; either version 3, or (at your option) any
1036ac495dSmrg later version.
1136ac495dSmrg
1236ac495dSmrg This program is distributed in the hope that it will be useful,
1336ac495dSmrg but WITHOUT ANY WARRANTY; without even the implied warranty of
1436ac495dSmrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1536ac495dSmrg GNU General Public License for more details.
1636ac495dSmrg
1736ac495dSmrg You should have received a copy of the GNU General Public License
1836ac495dSmrg along with this program; see the file COPYING3. If not see
1936ac495dSmrg <http://www.gnu.org/licenses/>. */
2036ac495dSmrg
2136ac495dSmrg #include "config.h"
2236ac495dSmrg #include "system.h"
2336ac495dSmrg #include "cpplib.h"
2436ac495dSmrg #include "internal.h"
2536ac495dSmrg #include "mkdeps.h"
2636ac495dSmrg #include "localedir.h"
2736ac495dSmrg #include "filenames.h"
2836ac495dSmrg
2936ac495dSmrg #ifndef ENABLE_CANONICAL_SYSTEM_HEADERS
3036ac495dSmrg #ifdef HAVE_DOS_BASED_FILE_SYSTEM
3136ac495dSmrg #define ENABLE_CANONICAL_SYSTEM_HEADERS 1
3236ac495dSmrg #else
3336ac495dSmrg #define ENABLE_CANONICAL_SYSTEM_HEADERS 0
3436ac495dSmrg #endif
3536ac495dSmrg #endif
3636ac495dSmrg
3736ac495dSmrg static void init_library (void);
3836ac495dSmrg static void mark_named_operators (cpp_reader *, int);
3936ac495dSmrg static void read_original_filename (cpp_reader *);
4036ac495dSmrg static void read_original_directory (cpp_reader *);
4136ac495dSmrg static void post_options (cpp_reader *);
4236ac495dSmrg
4336ac495dSmrg /* If we have designated initializers (GCC >2.7) these tables can be
4436ac495dSmrg initialized, constant data. Otherwise, they have to be filled in at
4536ac495dSmrg runtime. */
4636ac495dSmrg #if HAVE_DESIGNATED_INITIALIZERS
4736ac495dSmrg
4836ac495dSmrg #define init_trigraph_map() /* Nothing. */
4936ac495dSmrg #define TRIGRAPH_MAP \
5036ac495dSmrg __extension__ const uchar _cpp_trigraph_map[UCHAR_MAX + 1] = {
5136ac495dSmrg
5236ac495dSmrg #define END };
5336ac495dSmrg #define s(p, v) [p] = v,
5436ac495dSmrg
5536ac495dSmrg #else
5636ac495dSmrg
5736ac495dSmrg #define TRIGRAPH_MAP uchar _cpp_trigraph_map[UCHAR_MAX + 1] = { 0 }; \
5836ac495dSmrg static void init_trigraph_map (void) { \
5936ac495dSmrg unsigned char *x = _cpp_trigraph_map;
6036ac495dSmrg
6136ac495dSmrg #define END }
6236ac495dSmrg #define s(p, v) x[p] = v;
6336ac495dSmrg
6436ac495dSmrg #endif
6536ac495dSmrg
6636ac495dSmrg TRIGRAPH_MAP
6736ac495dSmrg s('=', '#') s(')', ']') s('!', '|')
6836ac495dSmrg s('(', '[') s('\'', '^') s('>', '}')
6936ac495dSmrg s('/', '\\') s('<', '{') s('-', '~')
7036ac495dSmrg END
7136ac495dSmrg
7236ac495dSmrg #undef s
7336ac495dSmrg #undef END
7436ac495dSmrg #undef TRIGRAPH_MAP
7536ac495dSmrg
7636ac495dSmrg /* A set of booleans indicating what CPP features each source language
7736ac495dSmrg requires. */
7836ac495dSmrg struct lang_flags
7936ac495dSmrg {
8036ac495dSmrg char c99;
8136ac495dSmrg char cplusplus;
8236ac495dSmrg char extended_numbers;
8336ac495dSmrg char extended_identifiers;
8436ac495dSmrg char c11_identifiers;
8536ac495dSmrg char std;
8636ac495dSmrg char digraphs;
8736ac495dSmrg char uliterals;
8836ac495dSmrg char rliterals;
8936ac495dSmrg char user_literals;
9036ac495dSmrg char binary_constants;
9136ac495dSmrg char digit_separators;
9236ac495dSmrg char trigraphs;
9336ac495dSmrg char utf8_char_literals;
94a2dc1f3fSmrg char va_opt;
95*8feb0f0bSmrg char scope;
96*8feb0f0bSmrg char dfp_constants;
9736ac495dSmrg };
9836ac495dSmrg
9936ac495dSmrg static const struct lang_flags lang_defaults[] =
100*8feb0f0bSmrg { /* c99 c++ xnum xid c11 std digr ulit rlit udlit bincst digsep trig u8chlit vaopt scope dfp */
101*8feb0f0bSmrg /* GNUC89 */ { 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0 },
102*8feb0f0bSmrg /* GNUC99 */ { 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0 },
103*8feb0f0bSmrg /* GNUC11 */ { 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0 },
104*8feb0f0bSmrg /* GNUC17 */ { 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0 },
105*8feb0f0bSmrg /* GNUC2X */ { 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1 },
106*8feb0f0bSmrg /* STDC89 */ { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
107*8feb0f0bSmrg /* STDC94 */ { 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
108*8feb0f0bSmrg /* STDC99 */ { 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
109*8feb0f0bSmrg /* STDC11 */ { 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
110*8feb0f0bSmrg /* STDC17 */ { 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
111*8feb0f0bSmrg /* STDC2X */ { 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1 },
112*8feb0f0bSmrg /* GNUCXX */ { 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0 },
113*8feb0f0bSmrg /* CXX98 */ { 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0 },
114*8feb0f0bSmrg /* GNUCXX11 */ { 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0 },
115*8feb0f0bSmrg /* CXX11 */ { 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0 },
116*8feb0f0bSmrg /* GNUCXX14 */ { 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0 },
117*8feb0f0bSmrg /* CXX14 */ { 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0 },
118*8feb0f0bSmrg /* GNUCXX17 */ { 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0 },
119*8feb0f0bSmrg /* CXX17 */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0 },
120*8feb0f0bSmrg /* GNUCXX2A */ { 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0 },
121*8feb0f0bSmrg /* CXX2A */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0 },
122*8feb0f0bSmrg /* ASM */ { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
12336ac495dSmrg };
12436ac495dSmrg
12536ac495dSmrg /* Sets internal flags correctly for a given language. */
12636ac495dSmrg void
cpp_set_lang(cpp_reader * pfile,enum c_lang lang)12736ac495dSmrg cpp_set_lang (cpp_reader *pfile, enum c_lang lang)
12836ac495dSmrg {
12936ac495dSmrg const struct lang_flags *l = &lang_defaults[(int) lang];
13036ac495dSmrg
13136ac495dSmrg CPP_OPTION (pfile, lang) = lang;
13236ac495dSmrg
13336ac495dSmrg CPP_OPTION (pfile, c99) = l->c99;
13436ac495dSmrg CPP_OPTION (pfile, cplusplus) = l->cplusplus;
13536ac495dSmrg CPP_OPTION (pfile, extended_numbers) = l->extended_numbers;
13636ac495dSmrg CPP_OPTION (pfile, extended_identifiers) = l->extended_identifiers;
13736ac495dSmrg CPP_OPTION (pfile, c11_identifiers) = l->c11_identifiers;
13836ac495dSmrg CPP_OPTION (pfile, std) = l->std;
13936ac495dSmrg CPP_OPTION (pfile, digraphs) = l->digraphs;
14036ac495dSmrg CPP_OPTION (pfile, uliterals) = l->uliterals;
14136ac495dSmrg CPP_OPTION (pfile, rliterals) = l->rliterals;
14236ac495dSmrg CPP_OPTION (pfile, user_literals) = l->user_literals;
14336ac495dSmrg CPP_OPTION (pfile, binary_constants) = l->binary_constants;
14436ac495dSmrg CPP_OPTION (pfile, digit_separators) = l->digit_separators;
14536ac495dSmrg CPP_OPTION (pfile, trigraphs) = l->trigraphs;
14636ac495dSmrg CPP_OPTION (pfile, utf8_char_literals) = l->utf8_char_literals;
147a2dc1f3fSmrg CPP_OPTION (pfile, va_opt) = l->va_opt;
148*8feb0f0bSmrg CPP_OPTION (pfile, scope) = l->scope;
149*8feb0f0bSmrg CPP_OPTION (pfile, dfp_constants) = l->dfp_constants;
15036ac495dSmrg }
15136ac495dSmrg
15236ac495dSmrg /* Initialize library global state. */
15336ac495dSmrg static void
init_library(void)15436ac495dSmrg init_library (void)
15536ac495dSmrg {
15636ac495dSmrg static int initialized = 0;
15736ac495dSmrg
15836ac495dSmrg if (! initialized)
15936ac495dSmrg {
16036ac495dSmrg initialized = 1;
16136ac495dSmrg
16236ac495dSmrg _cpp_init_lexer ();
16336ac495dSmrg
16436ac495dSmrg /* Set up the trigraph map. This doesn't need to do anything if
16536ac495dSmrg we were compiled with a compiler that supports C99 designated
16636ac495dSmrg initializers. */
16736ac495dSmrg init_trigraph_map ();
16836ac495dSmrg
16936ac495dSmrg #ifdef ENABLE_NLS
17036ac495dSmrg (void) bindtextdomain (PACKAGE, LOCALEDIR);
17136ac495dSmrg #endif
17236ac495dSmrg }
17336ac495dSmrg }
17436ac495dSmrg
17536ac495dSmrg /* Initialize a cpp_reader structure. */
17636ac495dSmrg cpp_reader *
cpp_create_reader(enum c_lang lang,cpp_hash_table * table,class line_maps * line_table)17736ac495dSmrg cpp_create_reader (enum c_lang lang, cpp_hash_table *table,
178*8feb0f0bSmrg class line_maps *line_table)
17936ac495dSmrg {
18036ac495dSmrg cpp_reader *pfile;
18136ac495dSmrg
18236ac495dSmrg /* Initialize this instance of the library if it hasn't been already. */
18336ac495dSmrg init_library ();
18436ac495dSmrg
18536ac495dSmrg pfile = XCNEW (cpp_reader);
18636ac495dSmrg memset (&pfile->base_context, 0, sizeof (pfile->base_context));
18736ac495dSmrg
18836ac495dSmrg cpp_set_lang (pfile, lang);
18936ac495dSmrg CPP_OPTION (pfile, warn_multichar) = 1;
19036ac495dSmrg CPP_OPTION (pfile, discard_comments) = 1;
19136ac495dSmrg CPP_OPTION (pfile, discard_comments_in_macro_exp) = 1;
192*8feb0f0bSmrg CPP_OPTION (pfile, max_include_depth) = 200;
19336ac495dSmrg CPP_OPTION (pfile, tabstop) = 8;
19436ac495dSmrg CPP_OPTION (pfile, operator_names) = 1;
19536ac495dSmrg CPP_OPTION (pfile, warn_trigraphs) = 2;
19636ac495dSmrg CPP_OPTION (pfile, warn_endif_labels) = 1;
19736ac495dSmrg CPP_OPTION (pfile, cpp_warn_c90_c99_compat) = -1;
198*8feb0f0bSmrg CPP_OPTION (pfile, cpp_warn_c11_c2x_compat) = -1;
19936ac495dSmrg CPP_OPTION (pfile, cpp_warn_cxx11_compat) = 0;
20036ac495dSmrg CPP_OPTION (pfile, cpp_warn_deprecated) = 1;
20136ac495dSmrg CPP_OPTION (pfile, cpp_warn_long_long) = 0;
20236ac495dSmrg CPP_OPTION (pfile, dollars_in_ident) = 1;
20336ac495dSmrg CPP_OPTION (pfile, warn_dollars) = 1;
20436ac495dSmrg CPP_OPTION (pfile, warn_variadic_macros) = 1;
20536ac495dSmrg CPP_OPTION (pfile, warn_builtin_macro_redefined) = 1;
20636ac495dSmrg CPP_OPTION (pfile, cpp_warn_implicit_fallthrough) = 0;
20736ac495dSmrg /* By default, track locations of tokens resulting from macro
20836ac495dSmrg expansion. The '2' means, track the locations with the highest
20936ac495dSmrg accuracy. Read the comments for struct
21036ac495dSmrg cpp_options::track_macro_expansion to learn about the other
21136ac495dSmrg values. */
21236ac495dSmrg CPP_OPTION (pfile, track_macro_expansion) = 2;
21336ac495dSmrg CPP_OPTION (pfile, warn_normalize) = normalized_C;
21436ac495dSmrg CPP_OPTION (pfile, warn_literal_suffix) = 1;
21536ac495dSmrg CPP_OPTION (pfile, canonical_system_headers)
21636ac495dSmrg = ENABLE_CANONICAL_SYSTEM_HEADERS;
21736ac495dSmrg CPP_OPTION (pfile, ext_numeric_literals) = 1;
21836ac495dSmrg CPP_OPTION (pfile, warn_date_time) = 0;
21936ac495dSmrg
22036ac495dSmrg /* Default CPP arithmetic to something sensible for the host for the
22136ac495dSmrg benefit of dumb users like fix-header. */
22236ac495dSmrg CPP_OPTION (pfile, precision) = CHAR_BIT * sizeof (long);
22336ac495dSmrg CPP_OPTION (pfile, char_precision) = CHAR_BIT;
22436ac495dSmrg CPP_OPTION (pfile, wchar_precision) = CHAR_BIT * sizeof (int);
22536ac495dSmrg CPP_OPTION (pfile, int_precision) = CHAR_BIT * sizeof (int);
22636ac495dSmrg CPP_OPTION (pfile, unsigned_char) = 0;
22736ac495dSmrg CPP_OPTION (pfile, unsigned_wchar) = 1;
22836ac495dSmrg CPP_OPTION (pfile, bytes_big_endian) = 1; /* does not matter */
22936ac495dSmrg
23036ac495dSmrg /* Default to no charset conversion. */
23136ac495dSmrg CPP_OPTION (pfile, narrow_charset) = _cpp_default_encoding ();
23236ac495dSmrg CPP_OPTION (pfile, wide_charset) = 0;
23336ac495dSmrg
23436ac495dSmrg /* Default the input character set to UTF-8. */
23536ac495dSmrg CPP_OPTION (pfile, input_charset) = _cpp_default_encoding ();
23636ac495dSmrg
23736ac495dSmrg /* A fake empty "directory" used as the starting point for files
23836ac495dSmrg looked up without a search path. Name cannot be '/' because we
23936ac495dSmrg don't want to prepend anything at all to filenames using it. All
24036ac495dSmrg other entries are correct zero-initialized. */
24136ac495dSmrg pfile->no_search_path.name = (char *) "";
24236ac495dSmrg
24336ac495dSmrg /* Initialize the line map. */
24436ac495dSmrg pfile->line_table = line_table;
24536ac495dSmrg
24636ac495dSmrg /* Initialize lexer state. */
24736ac495dSmrg pfile->state.save_comments = ! CPP_OPTION (pfile, discard_comments);
24836ac495dSmrg
24936ac495dSmrg /* Set up static tokens. */
25036ac495dSmrg pfile->avoid_paste.type = CPP_PADDING;
25136ac495dSmrg pfile->avoid_paste.val.source = NULL;
25236ac495dSmrg pfile->eof.type = CPP_EOF;
25336ac495dSmrg pfile->eof.flags = 0;
25436ac495dSmrg
25536ac495dSmrg /* Create a token buffer for the lexer. */
25636ac495dSmrg _cpp_init_tokenrun (&pfile->base_run, 250);
25736ac495dSmrg pfile->cur_run = &pfile->base_run;
25836ac495dSmrg pfile->cur_token = pfile->base_run.base;
25936ac495dSmrg
26036ac495dSmrg /* Initialize the base context. */
26136ac495dSmrg pfile->context = &pfile->base_context;
26236ac495dSmrg pfile->base_context.c.macro = 0;
26336ac495dSmrg pfile->base_context.prev = pfile->base_context.next = 0;
26436ac495dSmrg
26536ac495dSmrg /* Aligned and unaligned storage. */
26636ac495dSmrg pfile->a_buff = _cpp_get_buff (pfile, 0);
26736ac495dSmrg pfile->u_buff = _cpp_get_buff (pfile, 0);
26836ac495dSmrg
26936ac495dSmrg /* Initialize table for push_macro/pop_macro. */
27036ac495dSmrg pfile->pushed_macros = 0;
27136ac495dSmrg
27236ac495dSmrg /* Do not force token locations by default. */
273c0a68be4Smrg pfile->forced_token_location = 0;
27436ac495dSmrg
27536ac495dSmrg /* Initialize source_date_epoch to -2 (not yet set). */
27636ac495dSmrg pfile->source_date_epoch = (time_t) -2;
27736ac495dSmrg
27836ac495dSmrg /* The expression parser stack. */
27936ac495dSmrg _cpp_expand_op_stack (pfile);
28036ac495dSmrg
28136ac495dSmrg /* Initialize the buffer obstack. */
28236ac495dSmrg obstack_specify_allocation (&pfile->buffer_ob, 0, 0, xmalloc, free);
28336ac495dSmrg
28436ac495dSmrg _cpp_init_files (pfile);
28536ac495dSmrg
28636ac495dSmrg _cpp_init_hashtable (pfile, table);
28736ac495dSmrg
28836ac495dSmrg return pfile;
28936ac495dSmrg }
29036ac495dSmrg
29136ac495dSmrg /* Set the line_table entry in PFILE. This is called after reading a
29236ac495dSmrg PCH file, as the old line_table will be incorrect. */
29336ac495dSmrg void
cpp_set_line_map(cpp_reader * pfile,class line_maps * line_table)294*8feb0f0bSmrg cpp_set_line_map (cpp_reader *pfile, class line_maps *line_table)
29536ac495dSmrg {
29636ac495dSmrg pfile->line_table = line_table;
29736ac495dSmrg }
29836ac495dSmrg
29936ac495dSmrg /* Free resources used by PFILE. Accessing PFILE after this function
30036ac495dSmrg returns leads to undefined behavior. Returns the error count. */
30136ac495dSmrg void
cpp_destroy(cpp_reader * pfile)30236ac495dSmrg cpp_destroy (cpp_reader *pfile)
30336ac495dSmrg {
30436ac495dSmrg cpp_context *context, *contextn;
30536ac495dSmrg struct def_pragma_macro *pmacro;
30636ac495dSmrg tokenrun *run, *runn;
30736ac495dSmrg int i;
30836ac495dSmrg
30936ac495dSmrg free (pfile->op_stack);
31036ac495dSmrg
31136ac495dSmrg while (CPP_BUFFER (pfile) != NULL)
31236ac495dSmrg _cpp_pop_buffer (pfile);
31336ac495dSmrg
31436ac495dSmrg free (pfile->out.base);
31536ac495dSmrg
31636ac495dSmrg if (pfile->macro_buffer)
31736ac495dSmrg {
31836ac495dSmrg free (pfile->macro_buffer);
31936ac495dSmrg pfile->macro_buffer = NULL;
32036ac495dSmrg pfile->macro_buffer_len = 0;
32136ac495dSmrg }
32236ac495dSmrg
32336ac495dSmrg if (pfile->deps)
32436ac495dSmrg deps_free (pfile->deps);
32536ac495dSmrg obstack_free (&pfile->buffer_ob, 0);
32636ac495dSmrg
32736ac495dSmrg _cpp_destroy_hashtable (pfile);
32836ac495dSmrg _cpp_cleanup_files (pfile);
32936ac495dSmrg _cpp_destroy_iconv (pfile);
33036ac495dSmrg
33136ac495dSmrg _cpp_free_buff (pfile->a_buff);
33236ac495dSmrg _cpp_free_buff (pfile->u_buff);
33336ac495dSmrg _cpp_free_buff (pfile->free_buffs);
33436ac495dSmrg
33536ac495dSmrg for (run = &pfile->base_run; run; run = runn)
33636ac495dSmrg {
33736ac495dSmrg runn = run->next;
33836ac495dSmrg free (run->base);
33936ac495dSmrg if (run != &pfile->base_run)
34036ac495dSmrg free (run);
34136ac495dSmrg }
34236ac495dSmrg
34336ac495dSmrg for (context = pfile->base_context.next; context; context = contextn)
34436ac495dSmrg {
34536ac495dSmrg contextn = context->next;
34636ac495dSmrg free (context);
34736ac495dSmrg }
34836ac495dSmrg
34936ac495dSmrg if (pfile->comments.entries)
35036ac495dSmrg {
35136ac495dSmrg for (i = 0; i < pfile->comments.count; i++)
35236ac495dSmrg free (pfile->comments.entries[i].comment);
35336ac495dSmrg
35436ac495dSmrg free (pfile->comments.entries);
35536ac495dSmrg }
35636ac495dSmrg if (pfile->pushed_macros)
35736ac495dSmrg {
35836ac495dSmrg do
35936ac495dSmrg {
36036ac495dSmrg pmacro = pfile->pushed_macros;
36136ac495dSmrg pfile->pushed_macros = pmacro->next;
36236ac495dSmrg free (pmacro->name);
36336ac495dSmrg free (pmacro);
36436ac495dSmrg }
36536ac495dSmrg while (pfile->pushed_macros);
36636ac495dSmrg }
36736ac495dSmrg
36836ac495dSmrg free (pfile);
36936ac495dSmrg }
37036ac495dSmrg
37136ac495dSmrg /* This structure defines one built-in identifier. A node will be
37236ac495dSmrg entered in the hash table under the name NAME, with value VALUE.
37336ac495dSmrg
37436ac495dSmrg There are two tables of these. builtin_array holds all the
37536ac495dSmrg "builtin" macros: these are handled by builtin_macro() in
37636ac495dSmrg macro.c. Builtin is somewhat of a misnomer -- the property of
37736ac495dSmrg interest is that these macros require special code to compute their
37836ac495dSmrg expansions. The value is a "cpp_builtin_type" enumerator.
37936ac495dSmrg
38036ac495dSmrg operator_array holds the C++ named operators. These are keywords
38136ac495dSmrg which act as aliases for punctuators. In C++, they cannot be
38236ac495dSmrg altered through #define, and #if recognizes them as operators. In
38336ac495dSmrg C, these are not entered into the hash table at all (but see
38436ac495dSmrg <iso646.h>). The value is a token-type enumerator. */
38536ac495dSmrg struct builtin_macro
38636ac495dSmrg {
38736ac495dSmrg const uchar *const name;
38836ac495dSmrg const unsigned short len;
38936ac495dSmrg const unsigned short value;
39036ac495dSmrg const bool always_warn_if_redefined;
39136ac495dSmrg };
39236ac495dSmrg
39336ac495dSmrg #define B(n, t, f) { DSC(n), t, f }
39436ac495dSmrg static const struct builtin_macro builtin_array[] =
39536ac495dSmrg {
39636ac495dSmrg B("__TIMESTAMP__", BT_TIMESTAMP, false),
39736ac495dSmrg B("__TIME__", BT_TIME, false),
39836ac495dSmrg B("__DATE__", BT_DATE, false),
39936ac495dSmrg B("__FILE__", BT_FILE, false),
40036ac495dSmrg B("__BASE_FILE__", BT_BASE_FILE, false),
40136ac495dSmrg B("__LINE__", BT_SPECLINE, true),
40236ac495dSmrg B("__INCLUDE_LEVEL__", BT_INCLUDE_LEVEL, true),
40336ac495dSmrg B("__COUNTER__", BT_COUNTER, true),
404*8feb0f0bSmrg /* Make sure to update the list of built-in
405*8feb0f0bSmrg function-like macros in traditional.c:
406*8feb0f0bSmrg fun_like_macro() when adding more following */
40736ac495dSmrg B("__has_attribute", BT_HAS_ATTRIBUTE, true),
40836ac495dSmrg B("__has_cpp_attribute", BT_HAS_ATTRIBUTE, true),
409*8feb0f0bSmrg B("__has_builtin", BT_HAS_BUILTIN, true),
410*8feb0f0bSmrg B("__has_include", BT_HAS_INCLUDE, true),
411*8feb0f0bSmrg B("__has_include_next",BT_HAS_INCLUDE_NEXT, true),
41236ac495dSmrg /* Keep builtins not used for -traditional-cpp at the end, and
41336ac495dSmrg update init_builtins() if any more are added. */
41436ac495dSmrg B("_Pragma", BT_PRAGMA, true),
41536ac495dSmrg B("__STDC__", BT_STDC, true),
41636ac495dSmrg };
41736ac495dSmrg #undef B
41836ac495dSmrg
41936ac495dSmrg struct builtin_operator
42036ac495dSmrg {
42136ac495dSmrg const uchar *const name;
42236ac495dSmrg const unsigned short len;
42336ac495dSmrg const unsigned short value;
42436ac495dSmrg };
42536ac495dSmrg
42636ac495dSmrg #define B(n, t) { DSC(n), t }
42736ac495dSmrg static const struct builtin_operator operator_array[] =
42836ac495dSmrg {
42936ac495dSmrg B("and", CPP_AND_AND),
43036ac495dSmrg B("and_eq", CPP_AND_EQ),
43136ac495dSmrg B("bitand", CPP_AND),
43236ac495dSmrg B("bitor", CPP_OR),
43336ac495dSmrg B("compl", CPP_COMPL),
43436ac495dSmrg B("not", CPP_NOT),
43536ac495dSmrg B("not_eq", CPP_NOT_EQ),
43636ac495dSmrg B("or", CPP_OR_OR),
43736ac495dSmrg B("or_eq", CPP_OR_EQ),
43836ac495dSmrg B("xor", CPP_XOR),
43936ac495dSmrg B("xor_eq", CPP_XOR_EQ)
44036ac495dSmrg };
44136ac495dSmrg #undef B
44236ac495dSmrg
44336ac495dSmrg /* Mark the C++ named operators in the hash table. */
44436ac495dSmrg static void
mark_named_operators(cpp_reader * pfile,int flags)44536ac495dSmrg mark_named_operators (cpp_reader *pfile, int flags)
44636ac495dSmrg {
44736ac495dSmrg const struct builtin_operator *b;
44836ac495dSmrg
44936ac495dSmrg for (b = operator_array;
45036ac495dSmrg b < (operator_array + ARRAY_SIZE (operator_array));
45136ac495dSmrg b++)
45236ac495dSmrg {
45336ac495dSmrg cpp_hashnode *hp = cpp_lookup (pfile, b->name, b->len);
45436ac495dSmrg hp->flags |= flags;
45536ac495dSmrg hp->is_directive = 0;
45636ac495dSmrg hp->directive_index = b->value;
45736ac495dSmrg }
45836ac495dSmrg }
45936ac495dSmrg
46036ac495dSmrg /* Helper function of cpp_type2name. Return the string associated with
46136ac495dSmrg named operator TYPE. */
46236ac495dSmrg const char *
cpp_named_operator2name(enum cpp_ttype type)46336ac495dSmrg cpp_named_operator2name (enum cpp_ttype type)
46436ac495dSmrg {
46536ac495dSmrg const struct builtin_operator *b;
46636ac495dSmrg
46736ac495dSmrg for (b = operator_array;
46836ac495dSmrg b < (operator_array + ARRAY_SIZE (operator_array));
46936ac495dSmrg b++)
47036ac495dSmrg {
47136ac495dSmrg if (type == b->value)
47236ac495dSmrg return (const char *) b->name;
47336ac495dSmrg }
47436ac495dSmrg
47536ac495dSmrg return NULL;
47636ac495dSmrg }
47736ac495dSmrg
47836ac495dSmrg void
cpp_init_special_builtins(cpp_reader * pfile)47936ac495dSmrg cpp_init_special_builtins (cpp_reader *pfile)
48036ac495dSmrg {
48136ac495dSmrg const struct builtin_macro *b;
48236ac495dSmrg size_t n = ARRAY_SIZE (builtin_array);
48336ac495dSmrg
48436ac495dSmrg if (CPP_OPTION (pfile, traditional))
48536ac495dSmrg n -= 2;
48636ac495dSmrg else if (! CPP_OPTION (pfile, stdc_0_in_system_headers)
48736ac495dSmrg || CPP_OPTION (pfile, std))
48836ac495dSmrg n--;
48936ac495dSmrg
49036ac495dSmrg for (b = builtin_array; b < builtin_array + n; b++)
49136ac495dSmrg {
492*8feb0f0bSmrg if ((b->value == BT_HAS_ATTRIBUTE
493*8feb0f0bSmrg || b->value == BT_HAS_BUILTIN)
49436ac495dSmrg && (CPP_OPTION (pfile, lang) == CLK_ASM
49536ac495dSmrg || pfile->cb.has_attribute == NULL))
49636ac495dSmrg continue;
49736ac495dSmrg cpp_hashnode *hp = cpp_lookup (pfile, b->name, b->len);
498c0a68be4Smrg hp->type = NT_BUILTIN_MACRO;
49936ac495dSmrg if (b->always_warn_if_redefined)
50036ac495dSmrg hp->flags |= NODE_WARN;
50136ac495dSmrg hp->value.builtin = (enum cpp_builtin_type) b->value;
50236ac495dSmrg }
50336ac495dSmrg }
50436ac495dSmrg
505a2dc1f3fSmrg /* Restore macro C to builtin macro definition. */
506a2dc1f3fSmrg
507a2dc1f3fSmrg void
_cpp_restore_special_builtin(cpp_reader * pfile,struct def_pragma_macro * c)508a2dc1f3fSmrg _cpp_restore_special_builtin (cpp_reader *pfile, struct def_pragma_macro *c)
509a2dc1f3fSmrg {
510a2dc1f3fSmrg size_t len = strlen (c->name);
511a2dc1f3fSmrg
512a2dc1f3fSmrg for (const struct builtin_macro *b = builtin_array;
513a2dc1f3fSmrg b < builtin_array + ARRAY_SIZE (builtin_array); b++)
514a2dc1f3fSmrg if (b->len == len && memcmp (c->name, b->name, len + 1) == 0)
515a2dc1f3fSmrg {
516a2dc1f3fSmrg cpp_hashnode *hp = cpp_lookup (pfile, b->name, b->len);
517c0a68be4Smrg hp->type = NT_BUILTIN_MACRO;
518a2dc1f3fSmrg if (b->always_warn_if_redefined)
519a2dc1f3fSmrg hp->flags |= NODE_WARN;
520a2dc1f3fSmrg hp->value.builtin = (enum cpp_builtin_type) b->value;
521a2dc1f3fSmrg }
522a2dc1f3fSmrg }
523a2dc1f3fSmrg
52436ac495dSmrg /* Read the builtins table above and enter them, and language-specific
52536ac495dSmrg macros, into the hash table. HOSTED is true if this is a hosted
52636ac495dSmrg environment. */
52736ac495dSmrg void
cpp_init_builtins(cpp_reader * pfile,int hosted)52836ac495dSmrg cpp_init_builtins (cpp_reader *pfile, int hosted)
52936ac495dSmrg {
53036ac495dSmrg cpp_init_special_builtins (pfile);
53136ac495dSmrg
53236ac495dSmrg if (!CPP_OPTION (pfile, traditional)
53336ac495dSmrg && (! CPP_OPTION (pfile, stdc_0_in_system_headers)
53436ac495dSmrg || CPP_OPTION (pfile, std)))
53536ac495dSmrg _cpp_define_builtin (pfile, "__STDC__ 1");
53636ac495dSmrg
53736ac495dSmrg if (CPP_OPTION (pfile, cplusplus))
53836ac495dSmrg {
539a2dc1f3fSmrg if (CPP_OPTION (pfile, lang) == CLK_CXX2A
540a2dc1f3fSmrg || CPP_OPTION (pfile, lang) == CLK_GNUCXX2A)
541a2dc1f3fSmrg _cpp_define_builtin (pfile, "__cplusplus 201709L");
542a2dc1f3fSmrg else if (CPP_OPTION (pfile, lang) == CLK_CXX17
543a2dc1f3fSmrg || CPP_OPTION (pfile, lang) == CLK_GNUCXX17)
54436ac495dSmrg _cpp_define_builtin (pfile, "__cplusplus 201703L");
54536ac495dSmrg else if (CPP_OPTION (pfile, lang) == CLK_CXX14
54636ac495dSmrg || CPP_OPTION (pfile, lang) == CLK_GNUCXX14)
54736ac495dSmrg _cpp_define_builtin (pfile, "__cplusplus 201402L");
54836ac495dSmrg else if (CPP_OPTION (pfile, lang) == CLK_CXX11
54936ac495dSmrg || CPP_OPTION (pfile, lang) == CLK_GNUCXX11)
55036ac495dSmrg _cpp_define_builtin (pfile, "__cplusplus 201103L");
55136ac495dSmrg else
55236ac495dSmrg _cpp_define_builtin (pfile, "__cplusplus 199711L");
55336ac495dSmrg }
55436ac495dSmrg else if (CPP_OPTION (pfile, lang) == CLK_ASM)
55536ac495dSmrg _cpp_define_builtin (pfile, "__ASSEMBLER__ 1");
55636ac495dSmrg else if (CPP_OPTION (pfile, lang) == CLK_STDC94)
55736ac495dSmrg _cpp_define_builtin (pfile, "__STDC_VERSION__ 199409L");
558c0a68be4Smrg else if (CPP_OPTION (pfile, lang) == CLK_STDC2X
559c0a68be4Smrg || CPP_OPTION (pfile, lang) == CLK_GNUC2X)
560c0a68be4Smrg _cpp_define_builtin (pfile, "__STDC_VERSION__ 202000L");
561a2dc1f3fSmrg else if (CPP_OPTION (pfile, lang) == CLK_STDC17
562a2dc1f3fSmrg || CPP_OPTION (pfile, lang) == CLK_GNUC17)
563a2dc1f3fSmrg _cpp_define_builtin (pfile, "__STDC_VERSION__ 201710L");
56436ac495dSmrg else if (CPP_OPTION (pfile, lang) == CLK_STDC11
56536ac495dSmrg || CPP_OPTION (pfile, lang) == CLK_GNUC11)
56636ac495dSmrg _cpp_define_builtin (pfile, "__STDC_VERSION__ 201112L");
56736ac495dSmrg else if (CPP_OPTION (pfile, c99))
56836ac495dSmrg _cpp_define_builtin (pfile, "__STDC_VERSION__ 199901L");
56936ac495dSmrg
57036ac495dSmrg if (CPP_OPTION (pfile, uliterals)
57136ac495dSmrg && !(CPP_OPTION (pfile, cplusplus)
57236ac495dSmrg && (CPP_OPTION (pfile, lang) == CLK_GNUCXX
57336ac495dSmrg || CPP_OPTION (pfile, lang) == CLK_CXX98)))
57436ac495dSmrg {
57536ac495dSmrg _cpp_define_builtin (pfile, "__STDC_UTF_16__ 1");
57636ac495dSmrg _cpp_define_builtin (pfile, "__STDC_UTF_32__ 1");
57736ac495dSmrg }
57836ac495dSmrg
57936ac495dSmrg if (hosted)
58036ac495dSmrg _cpp_define_builtin (pfile, "__STDC_HOSTED__ 1");
58136ac495dSmrg else
58236ac495dSmrg _cpp_define_builtin (pfile, "__STDC_HOSTED__ 0");
58336ac495dSmrg
58436ac495dSmrg if (CPP_OPTION (pfile, objc))
58536ac495dSmrg _cpp_define_builtin (pfile, "__OBJC__ 1");
58636ac495dSmrg }
58736ac495dSmrg
58836ac495dSmrg /* Sanity-checks are dependent on command-line options, so it is
58936ac495dSmrg called as a subroutine of cpp_read_main_file. */
59036ac495dSmrg #if CHECKING_P
59136ac495dSmrg static void sanity_checks (cpp_reader *);
sanity_checks(cpp_reader * pfile)59236ac495dSmrg static void sanity_checks (cpp_reader *pfile)
59336ac495dSmrg {
59436ac495dSmrg cppchar_t test = 0;
59536ac495dSmrg size_t max_precision = 2 * CHAR_BIT * sizeof (cpp_num_part);
59636ac495dSmrg
59736ac495dSmrg /* Sanity checks for assumptions about CPP arithmetic and target
59836ac495dSmrg type precisions made by cpplib. */
59936ac495dSmrg test--;
60036ac495dSmrg if (test < 1)
60136ac495dSmrg cpp_error (pfile, CPP_DL_ICE, "cppchar_t must be an unsigned type");
60236ac495dSmrg
60336ac495dSmrg if (CPP_OPTION (pfile, precision) > max_precision)
60436ac495dSmrg cpp_error (pfile, CPP_DL_ICE,
60536ac495dSmrg "preprocessor arithmetic has maximum precision of %lu bits;"
60636ac495dSmrg " target requires %lu bits",
60736ac495dSmrg (unsigned long) max_precision,
60836ac495dSmrg (unsigned long) CPP_OPTION (pfile, precision));
60936ac495dSmrg
61036ac495dSmrg if (CPP_OPTION (pfile, precision) < CPP_OPTION (pfile, int_precision))
61136ac495dSmrg cpp_error (pfile, CPP_DL_ICE,
61236ac495dSmrg "CPP arithmetic must be at least as precise as a target int");
61336ac495dSmrg
61436ac495dSmrg if (CPP_OPTION (pfile, char_precision) < 8)
61536ac495dSmrg cpp_error (pfile, CPP_DL_ICE, "target char is less than 8 bits wide");
61636ac495dSmrg
61736ac495dSmrg if (CPP_OPTION (pfile, wchar_precision) < CPP_OPTION (pfile, char_precision))
61836ac495dSmrg cpp_error (pfile, CPP_DL_ICE,
61936ac495dSmrg "target wchar_t is narrower than target char");
62036ac495dSmrg
62136ac495dSmrg if (CPP_OPTION (pfile, int_precision) < CPP_OPTION (pfile, char_precision))
62236ac495dSmrg cpp_error (pfile, CPP_DL_ICE,
62336ac495dSmrg "target int is narrower than target char");
62436ac495dSmrg
62536ac495dSmrg /* This is assumed in eval_token() and could be fixed if necessary. */
62636ac495dSmrg if (sizeof (cppchar_t) > sizeof (cpp_num_part))
62736ac495dSmrg cpp_error (pfile, CPP_DL_ICE,
62836ac495dSmrg "CPP half-integer narrower than CPP character");
62936ac495dSmrg
63036ac495dSmrg if (CPP_OPTION (pfile, wchar_precision) > BITS_PER_CPPCHAR_T)
63136ac495dSmrg cpp_error (pfile, CPP_DL_ICE,
63236ac495dSmrg "CPP on this host cannot handle wide character constants over"
63336ac495dSmrg " %lu bits, but the target requires %lu bits",
63436ac495dSmrg (unsigned long) BITS_PER_CPPCHAR_T,
63536ac495dSmrg (unsigned long) CPP_OPTION (pfile, wchar_precision));
63636ac495dSmrg }
63736ac495dSmrg #else
63836ac495dSmrg # define sanity_checks(PFILE)
63936ac495dSmrg #endif
64036ac495dSmrg
64136ac495dSmrg /* This is called after options have been parsed, and partially
64236ac495dSmrg processed. */
64336ac495dSmrg void
cpp_post_options(cpp_reader * pfile)64436ac495dSmrg cpp_post_options (cpp_reader *pfile)
64536ac495dSmrg {
64636ac495dSmrg int flags;
64736ac495dSmrg
64836ac495dSmrg sanity_checks (pfile);
64936ac495dSmrg
65036ac495dSmrg post_options (pfile);
65136ac495dSmrg
65236ac495dSmrg /* Mark named operators before handling command line macros. */
65336ac495dSmrg flags = 0;
65436ac495dSmrg if (CPP_OPTION (pfile, cplusplus) && CPP_OPTION (pfile, operator_names))
65536ac495dSmrg flags |= NODE_OPERATOR;
65636ac495dSmrg if (CPP_OPTION (pfile, warn_cxx_operator_names))
65736ac495dSmrg flags |= NODE_DIAGNOSTIC | NODE_WARN_OPERATOR;
65836ac495dSmrg if (flags != 0)
65936ac495dSmrg mark_named_operators (pfile, flags);
66036ac495dSmrg }
66136ac495dSmrg
66236ac495dSmrg /* Setup for processing input from the file named FNAME, or stdin if
66336ac495dSmrg it is the empty string. Return the original filename
66436ac495dSmrg on success (e.g. foo.i->foo.c), or NULL on failure. */
66536ac495dSmrg const char *
cpp_read_main_file(cpp_reader * pfile,const char * fname)66636ac495dSmrg cpp_read_main_file (cpp_reader *pfile, const char *fname)
66736ac495dSmrg {
668c0a68be4Smrg const location_t loc = 0;
66936ac495dSmrg
67036ac495dSmrg if (CPP_OPTION (pfile, deps.style) != DEPS_NONE)
67136ac495dSmrg {
67236ac495dSmrg if (!pfile->deps)
67336ac495dSmrg pfile->deps = deps_init ();
67436ac495dSmrg
67536ac495dSmrg /* Set the default target (if there is none already). */
67636ac495dSmrg deps_add_default_target (pfile->deps, fname);
67736ac495dSmrg }
67836ac495dSmrg
67936ac495dSmrg pfile->main_file
680*8feb0f0bSmrg = _cpp_find_file (pfile, fname, &pfile->no_search_path, /*angle=*/0,
681*8feb0f0bSmrg /*fake=*/false, /*preinclude=*/false, /*hasinclude=*/false,
68236ac495dSmrg loc);
68336ac495dSmrg if (_cpp_find_failed (pfile->main_file))
68436ac495dSmrg return NULL;
68536ac495dSmrg
686*8feb0f0bSmrg _cpp_stack_file (pfile, pfile->main_file, IT_MAIN, 0);
68736ac495dSmrg
68836ac495dSmrg /* For foo.i, read the original filename foo.c now, for the benefit
68936ac495dSmrg of the front ends. */
69036ac495dSmrg if (CPP_OPTION (pfile, preprocessed))
69136ac495dSmrg {
69236ac495dSmrg read_original_filename (pfile);
69336ac495dSmrg fname =
69436ac495dSmrg ORDINARY_MAP_FILE_NAME
69536ac495dSmrg ((LINEMAPS_LAST_ORDINARY_MAP (pfile->line_table)));
69636ac495dSmrg }
69736ac495dSmrg return fname;
69836ac495dSmrg }
69936ac495dSmrg
70036ac495dSmrg /* For preprocessed files, if the first tokens are of the form # NUM.
70136ac495dSmrg handle the directive so we know the original file name. This will
70236ac495dSmrg generate file_change callbacks, which the front ends must handle
70336ac495dSmrg appropriately given their state of initialization. */
70436ac495dSmrg static void
read_original_filename(cpp_reader * pfile)70536ac495dSmrg read_original_filename (cpp_reader *pfile)
70636ac495dSmrg {
70736ac495dSmrg const cpp_token *token, *token1;
70836ac495dSmrg
70936ac495dSmrg /* Lex ahead; if the first tokens are of the form # NUM, then
71036ac495dSmrg process the directive, otherwise back up. */
71136ac495dSmrg token = _cpp_lex_direct (pfile);
71236ac495dSmrg if (token->type == CPP_HASH)
71336ac495dSmrg {
71436ac495dSmrg pfile->state.in_directive = 1;
71536ac495dSmrg token1 = _cpp_lex_direct (pfile);
71636ac495dSmrg _cpp_backup_tokens (pfile, 1);
71736ac495dSmrg pfile->state.in_directive = 0;
71836ac495dSmrg
71936ac495dSmrg /* If it's a #line directive, handle it. */
72036ac495dSmrg if (token1->type == CPP_NUMBER
72136ac495dSmrg && _cpp_handle_directive (pfile, token->flags & PREV_WHITE))
72236ac495dSmrg {
72336ac495dSmrg read_original_directory (pfile);
72436ac495dSmrg return;
72536ac495dSmrg }
72636ac495dSmrg }
72736ac495dSmrg
72836ac495dSmrg /* Backup as if nothing happened. */
72936ac495dSmrg _cpp_backup_tokens (pfile, 1);
73036ac495dSmrg }
73136ac495dSmrg
73236ac495dSmrg /* For preprocessed files, if the tokens following the first filename
73336ac495dSmrg line is of the form # <line> "/path/name//", handle the
73436ac495dSmrg directive so we know the original current directory. */
73536ac495dSmrg static void
read_original_directory(cpp_reader * pfile)73636ac495dSmrg read_original_directory (cpp_reader *pfile)
73736ac495dSmrg {
73836ac495dSmrg const cpp_token *hash, *token;
73936ac495dSmrg
74036ac495dSmrg /* Lex ahead; if the first tokens are of the form # NUM, then
74136ac495dSmrg process the directive, otherwise back up. */
74236ac495dSmrg hash = _cpp_lex_direct (pfile);
74336ac495dSmrg if (hash->type != CPP_HASH)
74436ac495dSmrg {
74536ac495dSmrg _cpp_backup_tokens (pfile, 1);
74636ac495dSmrg return;
74736ac495dSmrg }
74836ac495dSmrg
74936ac495dSmrg token = _cpp_lex_direct (pfile);
75036ac495dSmrg
75136ac495dSmrg if (token->type != CPP_NUMBER)
75236ac495dSmrg {
75336ac495dSmrg _cpp_backup_tokens (pfile, 2);
75436ac495dSmrg return;
75536ac495dSmrg }
75636ac495dSmrg
75736ac495dSmrg token = _cpp_lex_direct (pfile);
75836ac495dSmrg
75936ac495dSmrg if (token->type != CPP_STRING
76036ac495dSmrg || ! (token->val.str.len >= 5
76136ac495dSmrg && IS_DIR_SEPARATOR (token->val.str.text[token->val.str.len-2])
76236ac495dSmrg && IS_DIR_SEPARATOR (token->val.str.text[token->val.str.len-3])))
76336ac495dSmrg {
76436ac495dSmrg _cpp_backup_tokens (pfile, 3);
76536ac495dSmrg return;
76636ac495dSmrg }
76736ac495dSmrg
76836ac495dSmrg if (pfile->cb.dir_change)
76936ac495dSmrg {
77036ac495dSmrg char *debugdir = (char *) alloca (token->val.str.len - 3);
77136ac495dSmrg
77236ac495dSmrg memcpy (debugdir, (const char *) token->val.str.text + 1,
77336ac495dSmrg token->val.str.len - 4);
77436ac495dSmrg debugdir[token->val.str.len - 4] = '\0';
77536ac495dSmrg
77636ac495dSmrg pfile->cb.dir_change (pfile, debugdir);
77736ac495dSmrg }
77836ac495dSmrg }
77936ac495dSmrg
78036ac495dSmrg /* This is called at the end of preprocessing. It pops the last
78136ac495dSmrg buffer and writes dependency output.
78236ac495dSmrg
78336ac495dSmrg Maybe it should also reset state, such that you could call
78436ac495dSmrg cpp_start_read with a new filename to restart processing. */
78536ac495dSmrg void
cpp_finish(cpp_reader * pfile,FILE * deps_stream)78636ac495dSmrg cpp_finish (cpp_reader *pfile, FILE *deps_stream)
78736ac495dSmrg {
78836ac495dSmrg /* Warn about unused macros before popping the final buffer. */
78936ac495dSmrg if (CPP_OPTION (pfile, warn_unused_macros))
79036ac495dSmrg cpp_forall_identifiers (pfile, _cpp_warn_if_unused_macro, NULL);
79136ac495dSmrg
79236ac495dSmrg /* lex.c leaves the final buffer on the stack. This it so that
79336ac495dSmrg it returns an unending stream of CPP_EOFs to the client. If we
79436ac495dSmrg popped the buffer, we'd dereference a NULL buffer pointer and
79536ac495dSmrg segfault. It's nice to allow the client to do worry-free excess
79636ac495dSmrg cpp_get_token calls. */
79736ac495dSmrg while (pfile->buffer)
79836ac495dSmrg _cpp_pop_buffer (pfile);
79936ac495dSmrg
800*8feb0f0bSmrg if (CPP_OPTION (pfile, deps.style) != DEPS_NONE && deps_stream)
801*8feb0f0bSmrg deps_write (pfile->deps, deps_stream,
802*8feb0f0bSmrg CPP_OPTION (pfile, deps.phony_targets), 72);
80336ac495dSmrg
80436ac495dSmrg /* Report on headers that could use multiple include guards. */
80536ac495dSmrg if (CPP_OPTION (pfile, print_include_names))
80636ac495dSmrg _cpp_report_missing_guards (pfile);
80736ac495dSmrg }
80836ac495dSmrg
80936ac495dSmrg static void
post_options(cpp_reader * pfile)81036ac495dSmrg post_options (cpp_reader *pfile)
81136ac495dSmrg {
81236ac495dSmrg /* -Wtraditional is not useful in C++ mode. */
81336ac495dSmrg if (CPP_OPTION (pfile, cplusplus))
81436ac495dSmrg CPP_OPTION (pfile, cpp_warn_traditional) = 0;
81536ac495dSmrg
81636ac495dSmrg /* Permanently disable macro expansion if we are rescanning
81736ac495dSmrg preprocessed text. Read preprocesed source in ISO mode. */
81836ac495dSmrg if (CPP_OPTION (pfile, preprocessed))
81936ac495dSmrg {
82036ac495dSmrg if (!CPP_OPTION (pfile, directives_only))
82136ac495dSmrg pfile->state.prevent_expansion = 1;
82236ac495dSmrg CPP_OPTION (pfile, traditional) = 0;
82336ac495dSmrg }
82436ac495dSmrg
82536ac495dSmrg if (CPP_OPTION (pfile, warn_trigraphs) == 2)
82636ac495dSmrg CPP_OPTION (pfile, warn_trigraphs) = !CPP_OPTION (pfile, trigraphs);
82736ac495dSmrg
82836ac495dSmrg if (CPP_OPTION (pfile, traditional))
82936ac495dSmrg {
83036ac495dSmrg CPP_OPTION (pfile, trigraphs) = 0;
83136ac495dSmrg CPP_OPTION (pfile, warn_trigraphs) = 0;
83236ac495dSmrg }
83336ac495dSmrg }
834