xref: /netbsd-src/external/gpl3/gcc.old/dist/libcpp/init.c (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
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