xref: /netbsd-src/external/gpl3/gcc/dist/libcpp/init.cc (revision b1e838363e3c6fc78a55519254d99869742dd33c)
1 /* CPP Library.
2    Copyright (C) 1986-2022 Free Software Foundation, Inc.
3    Contributed by Per Bothner, 1994-95.
4    Based on CCCP program by Paul Rubin, June 1986
5    Adapted to ANSI C, Richard Stallman, Jan 1987
6 
7 This program is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by the
9 Free Software Foundation; either version 3, or (at your option) any
10 later version.
11 
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with this program; see the file COPYING3.  If not see
19 <http://www.gnu.org/licenses/>.  */
20 
21 #include "config.h"
22 #include "system.h"
23 #include "cpplib.h"
24 #include "internal.h"
25 #include "mkdeps.h"
26 #include "localedir.h"
27 #include "filenames.h"
28 
29 #ifndef ENABLE_CANONICAL_SYSTEM_HEADERS
30 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
31 #define ENABLE_CANONICAL_SYSTEM_HEADERS 1
32 #else
33 #define ENABLE_CANONICAL_SYSTEM_HEADERS 0
34 #endif
35 #endif
36 
37 static void init_library (void);
38 static void mark_named_operators (cpp_reader *, int);
39 static bool read_original_filename (cpp_reader *);
40 static void read_original_directory (cpp_reader *);
41 static void post_options (cpp_reader *);
42 
43 /* If we have designated initializers (GCC >2.7) these tables can be
44    initialized, constant data.  Otherwise, they have to be filled in at
45    runtime.  */
46 #if HAVE_DESIGNATED_INITIALIZERS
47 
48 #define init_trigraph_map()  /* Nothing.  */
49 #define TRIGRAPH_MAP \
50 __extension__ const uchar _cpp_trigraph_map[UCHAR_MAX + 1] = {
51 
52 #define END };
53 #define s(p, v) [p] = v,
54 
55 #else
56 
57 #define TRIGRAPH_MAP uchar _cpp_trigraph_map[UCHAR_MAX + 1] = { 0 }; \
58  static void init_trigraph_map (void) { \
59  unsigned char *x = _cpp_trigraph_map;
60 
61 #define END }
62 #define s(p, v) x[p] = v;
63 
64 #endif
65 
66 TRIGRAPH_MAP
67   s('=', '#')	s(')', ']')	s('!', '|')
68   s('(', '[')	s('\'', '^')	s('>', '}')
69   s('/', '\\')	s('<', '{')	s('-', '~')
70 END
71 
72 #undef s
73 #undef END
74 #undef TRIGRAPH_MAP
75 
76 /* A set of booleans indicating what CPP features each source language
77    requires.  */
78 struct lang_flags
79 {
80   char c99;
81   char cplusplus;
82   char extended_numbers;
83   char extended_identifiers;
84   char c11_identifiers;
85   char std;
86   char digraphs;
87   char uliterals;
88   char rliterals;
89   char user_literals;
90   char binary_constants;
91   char digit_separators;
92   char trigraphs;
93   char utf8_char_literals;
94   char va_opt;
95   char scope;
96   char dfp_constants;
97   char size_t_literals;
98   char elifdef;
99 };
100 
101 static const struct lang_flags lang_defaults[] =
102 { /*              c99 c++ xnum xid c11 std digr ulit rlit udlit bincst digsep trig u8chlit vaopt scope dfp szlit elifdef */
103   /* GNUC89   */  { 0,  0,  1,  0,  0,  0,  1,   0,   0,   0,    0,     0,     0,   0,      1,   1,     0,   0,   0 },
104   /* GNUC99   */  { 1,  0,  1,  1,  0,  0,  1,   1,   1,   0,    0,     0,     0,   0,      1,   1,     0,   0,   0 },
105   /* GNUC11   */  { 1,  0,  1,  1,  1,  0,  1,   1,   1,   0,    0,     0,     0,   0,      1,   1,     0,   0,   0 },
106   /* GNUC17   */  { 1,  0,  1,  1,  1,  0,  1,   1,   1,   0,    0,     0,     0,   0,      1,   1,     0,   0,   0 },
107   /* GNUC2X   */  { 1,  0,  1,  1,  1,  0,  1,   1,   1,   0,    1,     1,     0,   1,      1,   1,     1,   0,   1 },
108   /* STDC89   */  { 0,  0,  0,  0,  0,  1,  0,   0,   0,   0,    0,     0,     1,   0,      0,   0,     0,   0,   0 },
109   /* STDC94   */  { 0,  0,  0,  0,  0,  1,  1,   0,   0,   0,    0,     0,     1,   0,      0,   0,     0,   0,   0 },
110   /* STDC99   */  { 1,  0,  1,  1,  0,  1,  1,   0,   0,   0,    0,     0,     1,   0,      0,   0,     0,   0,   0 },
111   /* STDC11   */  { 1,  0,  1,  1,  1,  1,  1,   1,   0,   0,    0,     0,     1,   0,      0,   0,     0,   0,   0 },
112   /* STDC17   */  { 1,  0,  1,  1,  1,  1,  1,   1,   0,   0,    0,     0,     1,   0,      0,   0,     0,   0,   0 },
113   /* STDC2X   */  { 1,  0,  1,  1,  1,  1,  1,   1,   0,   0,    1,     1,     1,   1,      0,   1,     1,   0,   1 },
114   /* GNUCXX   */  { 0,  1,  1,  1,  0,  0,  1,   0,   0,   0,    0,     0,     0,   0,      1,   1,     0,   0,   0 },
115   /* CXX98    */  { 0,  1,  0,  1,  0,  1,  1,   0,   0,   0,    0,     0,     1,   0,      0,   1,     0,   0,   0 },
116   /* GNUCXX11 */  { 1,  1,  1,  1,  1,  0,  1,   1,   1,   1,    0,     0,     0,   0,      1,   1,     0,   0,   0 },
117   /* CXX11    */  { 1,  1,  0,  1,  1,  1,  1,   1,   1,   1,    0,     0,     1,   0,      0,   1,     0,   0,   0 },
118   /* GNUCXX14 */  { 1,  1,  1,  1,  1,  0,  1,   1,   1,   1,    1,     1,     0,   0,      1,   1,     0,   0,   0 },
119   /* CXX14    */  { 1,  1,  0,  1,  1,  1,  1,   1,   1,   1,    1,     1,     1,   0,      0,   1,     0,   0,   0 },
120   /* GNUCXX17 */  { 1,  1,  1,  1,  1,  0,  1,   1,   1,   1,    1,     1,     0,   1,      1,   1,     0,   0,   0 },
121   /* CXX17    */  { 1,  1,  1,  1,  1,  1,  1,   1,   1,   1,    1,     1,     0,   1,      0,   1,     0,   0,   0 },
122   /* GNUCXX20 */  { 1,  1,  1,  1,  1,  0,  1,   1,   1,   1,    1,     1,     0,   1,      1,   1,     0,   0,   0 },
123   /* CXX20    */  { 1,  1,  1,  1,  1,  1,  1,   1,   1,   1,    1,     1,     0,   1,      1,   1,     0,   0,   0 },
124   /* GNUCXX23 */  { 1,  1,  1,  1,  1,  0,  1,   1,   1,   1,    1,     1,     0,   1,      1,   1,     0,   1,   1 },
125   /* CXX23    */  { 1,  1,  1,  1,  1,  1,  1,   1,   1,   1,    1,     1,     0,   1,      1,   1,     0,   1,   1 },
126   /* ASM      */  { 0,  0,  1,  0,  0,  0,  0,   0,   0,   0,    0,     0,     0,   0,      0,   0,     0,   0,   0 }
127 };
128 
129 /* Sets internal flags correctly for a given language.  */
130 void
cpp_set_lang(cpp_reader * pfile,enum c_lang lang)131 cpp_set_lang (cpp_reader *pfile, enum c_lang lang)
132 {
133   const struct lang_flags *l = &lang_defaults[(int) lang];
134 
135   CPP_OPTION (pfile, lang) = lang;
136 
137   CPP_OPTION (pfile, c99)			 = l->c99;
138   CPP_OPTION (pfile, cplusplus)			 = l->cplusplus;
139   CPP_OPTION (pfile, extended_numbers)		 = l->extended_numbers;
140   CPP_OPTION (pfile, extended_identifiers)	 = l->extended_identifiers;
141   CPP_OPTION (pfile, c11_identifiers)		 = l->c11_identifiers;
142   CPP_OPTION (pfile, std)			 = l->std;
143   CPP_OPTION (pfile, digraphs)			 = l->digraphs;
144   CPP_OPTION (pfile, uliterals)			 = l->uliterals;
145   CPP_OPTION (pfile, rliterals)			 = l->rliterals;
146   CPP_OPTION (pfile, user_literals)		 = l->user_literals;
147   CPP_OPTION (pfile, binary_constants)		 = l->binary_constants;
148   CPP_OPTION (pfile, digit_separators)		 = l->digit_separators;
149   CPP_OPTION (pfile, trigraphs)			 = l->trigraphs;
150   CPP_OPTION (pfile, utf8_char_literals)	 = l->utf8_char_literals;
151   CPP_OPTION (pfile, va_opt)			 = l->va_opt;
152   CPP_OPTION (pfile, scope)			 = l->scope;
153   CPP_OPTION (pfile, dfp_constants)		 = l->dfp_constants;
154   CPP_OPTION (pfile, size_t_literals)		 = l->size_t_literals;
155   CPP_OPTION (pfile, elifdef)			 = l->elifdef;
156 }
157 
158 /* Initialize library global state.  */
159 static void
init_library(void)160 init_library (void)
161 {
162   static int initialized = 0;
163 
164   if (! initialized)
165     {
166       initialized = 1;
167 
168       _cpp_init_lexer ();
169 
170       /* Set up the trigraph map.  This doesn't need to do anything if
171 	 we were compiled with a compiler that supports C99 designated
172 	 initializers.  */
173       init_trigraph_map ();
174 
175 #ifdef ENABLE_NLS
176        (void) bindtextdomain (PACKAGE, LOCALEDIR);
177 #endif
178     }
179 }
180 
181 /* Initialize a cpp_reader structure.  */
182 cpp_reader *
cpp_create_reader(enum c_lang lang,cpp_hash_table * table,class line_maps * line_table)183 cpp_create_reader (enum c_lang lang, cpp_hash_table *table,
184 		   class line_maps *line_table)
185 {
186   cpp_reader *pfile;
187 
188   /* Initialize this instance of the library if it hasn't been already.  */
189   init_library ();
190 
191   pfile = XCNEW (cpp_reader);
192   memset (&pfile->base_context, 0, sizeof (pfile->base_context));
193 
194   cpp_set_lang (pfile, lang);
195   CPP_OPTION (pfile, warn_multichar) = 1;
196   CPP_OPTION (pfile, discard_comments) = 1;
197   CPP_OPTION (pfile, discard_comments_in_macro_exp) = 1;
198   CPP_OPTION (pfile, max_include_depth) = 200;
199   CPP_OPTION (pfile, operator_names) = 1;
200   CPP_OPTION (pfile, warn_trigraphs) = 2;
201   CPP_OPTION (pfile, warn_endif_labels) = 1;
202   CPP_OPTION (pfile, cpp_warn_c90_c99_compat) = -1;
203   CPP_OPTION (pfile, cpp_warn_c11_c2x_compat) = -1;
204   CPP_OPTION (pfile, cpp_warn_cxx11_compat) = 0;
205   CPP_OPTION (pfile, cpp_warn_deprecated) = 1;
206   CPP_OPTION (pfile, cpp_warn_long_long) = 0;
207   CPP_OPTION (pfile, dollars_in_ident) = 1;
208   CPP_OPTION (pfile, warn_dollars) = 1;
209   CPP_OPTION (pfile, warn_variadic_macros) = 1;
210   CPP_OPTION (pfile, warn_builtin_macro_redefined) = 1;
211   CPP_OPTION (pfile, cpp_warn_implicit_fallthrough) = 0;
212   /* By default, track locations of tokens resulting from macro
213      expansion.  The '2' means, track the locations with the highest
214      accuracy.  Read the comments for struct
215      cpp_options::track_macro_expansion to learn about the other
216      values.  */
217   CPP_OPTION (pfile, track_macro_expansion) = 2;
218   CPP_OPTION (pfile, warn_normalize) = normalized_C;
219   CPP_OPTION (pfile, warn_literal_suffix) = 1;
220   CPP_OPTION (pfile, canonical_system_headers)
221       = ENABLE_CANONICAL_SYSTEM_HEADERS;
222   CPP_OPTION (pfile, ext_numeric_literals) = 1;
223   CPP_OPTION (pfile, warn_date_time) = 0;
224   CPP_OPTION (pfile, cpp_warn_bidirectional) = bidirectional_unpaired;
225 
226   /* Default CPP arithmetic to something sensible for the host for the
227      benefit of dumb users like fix-header.  */
228   CPP_OPTION (pfile, precision) = CHAR_BIT * sizeof (long);
229   CPP_OPTION (pfile, char_precision) = CHAR_BIT;
230   CPP_OPTION (pfile, wchar_precision) = CHAR_BIT * sizeof (int);
231   CPP_OPTION (pfile, int_precision) = CHAR_BIT * sizeof (int);
232   CPP_OPTION (pfile, unsigned_char) = 0;
233   CPP_OPTION (pfile, unsigned_wchar) = 1;
234   CPP_OPTION (pfile, bytes_big_endian) = 1;  /* does not matter */
235 
236   /* Default to no charset conversion.  */
237   CPP_OPTION (pfile, narrow_charset) = _cpp_default_encoding ();
238   CPP_OPTION (pfile, wide_charset) = 0;
239 
240   /* Default the input character set to UTF-8.  */
241   CPP_OPTION (pfile, input_charset) = _cpp_default_encoding ();
242 
243   /* A fake empty "directory" used as the starting point for files
244      looked up without a search path.  Name cannot be '/' because we
245      don't want to prepend anything at all to filenames using it.  All
246      other entries are correct zero-initialized.  */
247   pfile->no_search_path.name = (char *) "";
248 
249   /* Initialize the line map.  */
250   pfile->line_table = line_table;
251 
252   /* Initialize lexer state.  */
253   pfile->state.save_comments = ! CPP_OPTION (pfile, discard_comments);
254 
255   /* Set up static tokens.  */
256   pfile->avoid_paste.type = CPP_PADDING;
257   pfile->avoid_paste.val.source = NULL;
258   pfile->avoid_paste.src_loc = 0;
259   pfile->endarg.type = CPP_EOF;
260   pfile->endarg.flags = 0;
261   pfile->endarg.src_loc = 0;
262 
263   /* Create a token buffer for the lexer.  */
264   _cpp_init_tokenrun (&pfile->base_run, 250);
265   pfile->cur_run = &pfile->base_run;
266   pfile->cur_token = pfile->base_run.base;
267 
268   /* Initialize the base context.  */
269   pfile->context = &pfile->base_context;
270   pfile->base_context.c.macro = 0;
271   pfile->base_context.prev = pfile->base_context.next = 0;
272 
273   /* Aligned and unaligned storage.  */
274   pfile->a_buff = _cpp_get_buff (pfile, 0);
275   pfile->u_buff = _cpp_get_buff (pfile, 0);
276 
277   /* Initialize table for push_macro/pop_macro.  */
278   pfile->pushed_macros = 0;
279 
280   /* Do not force token locations by default.  */
281   pfile->forced_token_location = 0;
282 
283   /* Note the timestamp is unset.  */
284   pfile->time_stamp = time_t (-1);
285   pfile->time_stamp_kind = 0;
286 
287   /* The expression parser stack.  */
288   _cpp_expand_op_stack (pfile);
289 
290   /* Initialize the buffer obstack.  */
291   obstack_specify_allocation (&pfile->buffer_ob, 0, 0, xmalloc, free);
292 
293   _cpp_init_files (pfile);
294 
295   _cpp_init_hashtable (pfile, table);
296 
297   return pfile;
298 }
299 
300 /* Set the line_table entry in PFILE.  This is called after reading a
301    PCH file, as the old line_table will be incorrect.  */
302 void
cpp_set_line_map(cpp_reader * pfile,class line_maps * line_table)303 cpp_set_line_map (cpp_reader *pfile, class line_maps *line_table)
304 {
305   pfile->line_table = line_table;
306 }
307 
308 /* Free resources used by PFILE.  Accessing PFILE after this function
309    returns leads to undefined behavior.  Returns the error count.  */
310 void
cpp_destroy(cpp_reader * pfile)311 cpp_destroy (cpp_reader *pfile)
312 {
313   cpp_context *context, *contextn;
314   struct def_pragma_macro *pmacro;
315   tokenrun *run, *runn;
316   int i;
317 
318   free (pfile->op_stack);
319 
320   while (CPP_BUFFER (pfile) != NULL)
321     _cpp_pop_buffer (pfile);
322 
323   free (pfile->out.base);
324 
325   if (pfile->macro_buffer)
326     {
327       free (pfile->macro_buffer);
328       pfile->macro_buffer = NULL;
329       pfile->macro_buffer_len = 0;
330     }
331 
332   if (pfile->deps)
333     deps_free (pfile->deps);
334   obstack_free (&pfile->buffer_ob, 0);
335 
336   _cpp_destroy_hashtable (pfile);
337   _cpp_cleanup_files (pfile);
338   _cpp_destroy_iconv (pfile);
339 
340   _cpp_free_buff (pfile->a_buff);
341   _cpp_free_buff (pfile->u_buff);
342   _cpp_free_buff (pfile->free_buffs);
343 
344   for (run = &pfile->base_run; run; run = runn)
345     {
346       runn = run->next;
347       free (run->base);
348       if (run != &pfile->base_run)
349 	free (run);
350     }
351 
352   for (context = pfile->base_context.next; context; context = contextn)
353     {
354       contextn = context->next;
355       free (context);
356     }
357 
358   if (pfile->comments.entries)
359     {
360       for (i = 0; i < pfile->comments.count; i++)
361 	free (pfile->comments.entries[i].comment);
362 
363       free (pfile->comments.entries);
364     }
365   if (pfile->pushed_macros)
366     {
367       do
368 	{
369 	  pmacro = pfile->pushed_macros;
370 	  pfile->pushed_macros = pmacro->next;
371 	  free (pmacro->name);
372 	  free (pmacro);
373 	}
374       while (pfile->pushed_macros);
375     }
376 
377   free (pfile);
378 }
379 
380 /* This structure defines one built-in identifier.  A node will be
381    entered in the hash table under the name NAME, with value VALUE.
382 
383    There are two tables of these.  builtin_array holds all the
384    "builtin" macros: these are handled by builtin_macro() in
385    macro.cc.  Builtin is somewhat of a misnomer -- the property of
386    interest is that these macros require special code to compute their
387    expansions.  The value is a "cpp_builtin_type" enumerator.
388 
389    operator_array holds the C++ named operators.  These are keywords
390    which act as aliases for punctuators.  In C++, they cannot be
391    altered through #define, and #if recognizes them as operators.  In
392    C, these are not entered into the hash table at all (but see
393    <iso646.h>).  The value is a token-type enumerator.  */
394 struct builtin_macro
395 {
396   const uchar *const name;
397   const unsigned short len;
398   const unsigned short value;
399   const bool always_warn_if_redefined;
400 };
401 
402 #define B(n, t, f)    { DSC(n), t, f }
403 static const struct builtin_macro builtin_array[] =
404 {
405   B("__TIMESTAMP__",	 BT_TIMESTAMP,     false),
406   B("__TIME__",		 BT_TIME,          false),
407   B("__DATE__",		 BT_DATE,          false),
408   B("__FILE__",		 BT_FILE,          false),
409   B("__FILE_NAME__",	 BT_FILE_NAME,     false),
410   B("__BASE_FILE__",	 BT_BASE_FILE,     false),
411   B("__LINE__",		 BT_SPECLINE,      true),
412   B("__INCLUDE_LEVEL__", BT_INCLUDE_LEVEL, true),
413   B("__COUNTER__",	 BT_COUNTER,       true),
414   /* Make sure to update the list of built-in
415      function-like macros in traditional.cc:
416      fun_like_macro() when adding more following */
417   B("__has_attribute",	 BT_HAS_ATTRIBUTE, true),
418   B("__has_c_attribute", BT_HAS_STD_ATTRIBUTE, true),
419   B("__has_cpp_attribute", BT_HAS_ATTRIBUTE, true),
420   B("__has_builtin",	 BT_HAS_BUILTIN,   true),
421   B("__has_include",	 BT_HAS_INCLUDE,   true),
422   B("__has_include_next",BT_HAS_INCLUDE_NEXT,   true),
423   /* Keep builtins not used for -traditional-cpp at the end, and
424      update init_builtins() if any more are added.  */
425   B("_Pragma",		 BT_PRAGMA,        true),
426   B("__STDC__",		 BT_STDC,          true),
427 };
428 #undef B
429 
430 struct builtin_operator
431 {
432   const uchar *const name;
433   const unsigned short len;
434   const unsigned short value;
435 };
436 
437 #define B(n, t)    { DSC(n), t }
438 static const struct builtin_operator operator_array[] =
439 {
440   B("and",	CPP_AND_AND),
441   B("and_eq",	CPP_AND_EQ),
442   B("bitand",	CPP_AND),
443   B("bitor",	CPP_OR),
444   B("compl",	CPP_COMPL),
445   B("not",	CPP_NOT),
446   B("not_eq",	CPP_NOT_EQ),
447   B("or",	CPP_OR_OR),
448   B("or_eq",	CPP_OR_EQ),
449   B("xor",	CPP_XOR),
450   B("xor_eq",	CPP_XOR_EQ)
451 };
452 #undef B
453 
454 /* Mark the C++ named operators in the hash table.  */
455 static void
mark_named_operators(cpp_reader * pfile,int flags)456 mark_named_operators (cpp_reader *pfile, int flags)
457 {
458   const struct builtin_operator *b;
459 
460   for (b = operator_array;
461        b < (operator_array + ARRAY_SIZE (operator_array));
462        b++)
463     {
464       cpp_hashnode *hp = cpp_lookup (pfile, b->name, b->len);
465       hp->flags |= flags;
466       hp->is_directive = 0;
467       hp->directive_index = b->value;
468     }
469 }
470 
471 /* Helper function of cpp_type2name. Return the string associated with
472    named operator TYPE.  */
473 const char *
cpp_named_operator2name(enum cpp_ttype type)474 cpp_named_operator2name (enum cpp_ttype type)
475 {
476   const struct builtin_operator *b;
477 
478   for (b = operator_array;
479        b < (operator_array + ARRAY_SIZE (operator_array));
480        b++)
481     {
482       if (type == b->value)
483 	return (const char *) b->name;
484     }
485 
486   return NULL;
487 }
488 
489 void
cpp_init_special_builtins(cpp_reader * pfile)490 cpp_init_special_builtins (cpp_reader *pfile)
491 {
492   const struct builtin_macro *b;
493   size_t n = ARRAY_SIZE (builtin_array);
494 
495   if (CPP_OPTION (pfile, traditional))
496     n -= 2;
497   else if (! CPP_OPTION (pfile, stdc_0_in_system_headers)
498 	   || CPP_OPTION (pfile, std))
499     n--;
500 
501   for (b = builtin_array; b < builtin_array + n; b++)
502     {
503       if ((b->value == BT_HAS_ATTRIBUTE
504 	   || b->value == BT_HAS_STD_ATTRIBUTE
505 	   || b->value == BT_HAS_BUILTIN)
506 	  && (CPP_OPTION (pfile, lang) == CLK_ASM
507 	      || pfile->cb.has_attribute == NULL))
508 	continue;
509       cpp_hashnode *hp = cpp_lookup (pfile, b->name, b->len);
510       hp->type = NT_BUILTIN_MACRO;
511       if (b->always_warn_if_redefined)
512 	hp->flags |= NODE_WARN;
513       hp->value.builtin = (enum cpp_builtin_type) b->value;
514     }
515 }
516 
517 /* Restore macro C to builtin macro definition.  */
518 
519 void
_cpp_restore_special_builtin(cpp_reader * pfile,struct def_pragma_macro * c)520 _cpp_restore_special_builtin (cpp_reader *pfile, struct def_pragma_macro *c)
521 {
522   size_t len = strlen (c->name);
523 
524   for (const struct builtin_macro *b = builtin_array;
525        b < builtin_array + ARRAY_SIZE (builtin_array); b++)
526     if (b->len == len && memcmp (c->name, b->name, len + 1) == 0)
527       {
528 	cpp_hashnode *hp = cpp_lookup (pfile, b->name, b->len);
529 	hp->type = NT_BUILTIN_MACRO;
530 	if (b->always_warn_if_redefined)
531 	  hp->flags |= NODE_WARN;
532 	hp->value.builtin = (enum cpp_builtin_type) b->value;
533       }
534 }
535 
536 /* Read the builtins table above and enter them, and language-specific
537    macros, into the hash table.  HOSTED is true if this is a hosted
538    environment.  */
539 void
cpp_init_builtins(cpp_reader * pfile,int hosted)540 cpp_init_builtins (cpp_reader *pfile, int hosted)
541 {
542   cpp_init_special_builtins (pfile);
543 
544   if (!CPP_OPTION (pfile, traditional)
545       && (! CPP_OPTION (pfile, stdc_0_in_system_headers)
546 	  || CPP_OPTION (pfile, std)))
547     _cpp_define_builtin (pfile, "__STDC__ 1");
548 
549   if (CPP_OPTION (pfile, cplusplus))
550     {
551       /* C++23 is not yet a standard.  For now, use an invalid
552        * year/month, 202100L, which is larger than 202002L.  */
553       if (CPP_OPTION (pfile, lang) == CLK_CXX23
554 	  || CPP_OPTION (pfile, lang) == CLK_GNUCXX23)
555 	_cpp_define_builtin (pfile, "__cplusplus 202100L");
556       else if (CPP_OPTION (pfile, lang) == CLK_CXX20
557 	  || CPP_OPTION (pfile, lang) == CLK_GNUCXX20)
558 	_cpp_define_builtin (pfile, "__cplusplus 202002L");
559       else if (CPP_OPTION (pfile, lang) == CLK_CXX17
560 	  || CPP_OPTION (pfile, lang) == CLK_GNUCXX17)
561 	_cpp_define_builtin (pfile, "__cplusplus 201703L");
562       else if (CPP_OPTION (pfile, lang) == CLK_CXX14
563 	  || CPP_OPTION (pfile, lang) == CLK_GNUCXX14)
564 	_cpp_define_builtin (pfile, "__cplusplus 201402L");
565       else if (CPP_OPTION (pfile, lang) == CLK_CXX11
566 	       || CPP_OPTION (pfile, lang) == CLK_GNUCXX11)
567 	_cpp_define_builtin (pfile, "__cplusplus 201103L");
568       else
569 	_cpp_define_builtin (pfile, "__cplusplus 199711L");
570     }
571   else if (CPP_OPTION (pfile, lang) == CLK_ASM)
572     _cpp_define_builtin (pfile, "__ASSEMBLER__ 1");
573   else if (CPP_OPTION (pfile, lang) == CLK_STDC94)
574     _cpp_define_builtin (pfile, "__STDC_VERSION__ 199409L");
575   else if (CPP_OPTION (pfile, lang) == CLK_STDC2X
576 	   || CPP_OPTION (pfile, lang) == CLK_GNUC2X)
577     _cpp_define_builtin (pfile, "__STDC_VERSION__ 202000L");
578   else if (CPP_OPTION (pfile, lang) == CLK_STDC17
579 	   || CPP_OPTION (pfile, lang) == CLK_GNUC17)
580     _cpp_define_builtin (pfile, "__STDC_VERSION__ 201710L");
581   else if (CPP_OPTION (pfile, lang) == CLK_STDC11
582 	   || CPP_OPTION (pfile, lang) == CLK_GNUC11)
583     _cpp_define_builtin (pfile, "__STDC_VERSION__ 201112L");
584   else if (CPP_OPTION (pfile, c99))
585     _cpp_define_builtin (pfile, "__STDC_VERSION__ 199901L");
586 
587   if (CPP_OPTION (pfile, uliterals)
588       && !(CPP_OPTION (pfile, cplusplus)
589 	   && (CPP_OPTION (pfile, lang) == CLK_GNUCXX
590 	    || CPP_OPTION (pfile, lang) == CLK_CXX98)))
591     {
592       _cpp_define_builtin (pfile, "__STDC_UTF_16__ 1");
593       _cpp_define_builtin (pfile, "__STDC_UTF_32__ 1");
594     }
595 
596   if (hosted)
597     _cpp_define_builtin (pfile, "__STDC_HOSTED__ 1");
598   else
599     _cpp_define_builtin (pfile, "__STDC_HOSTED__ 0");
600 
601   if (CPP_OPTION (pfile, objc))
602     _cpp_define_builtin (pfile, "__OBJC__ 1");
603 }
604 
605 /* Sanity-checks are dependent on command-line options, so it is
606    called as a subroutine of cpp_read_main_file.  */
607 #if CHECKING_P
608 static void sanity_checks (cpp_reader *);
sanity_checks(cpp_reader * pfile)609 static void sanity_checks (cpp_reader *pfile)
610 {
611   cppchar_t test = 0;
612   size_t max_precision = 2 * CHAR_BIT * sizeof (cpp_num_part);
613 
614   /* Sanity checks for assumptions about CPP arithmetic and target
615      type precisions made by cpplib.  */
616   test--;
617   if (test < 1)
618     cpp_error (pfile, CPP_DL_ICE, "cppchar_t must be an unsigned type");
619 
620   if (CPP_OPTION (pfile, precision) > max_precision)
621     cpp_error (pfile, CPP_DL_ICE,
622 	       "preprocessor arithmetic has maximum precision of %lu bits;"
623 	       " target requires %lu bits",
624 	       (unsigned long) max_precision,
625 	       (unsigned long) CPP_OPTION (pfile, precision));
626 
627   if (CPP_OPTION (pfile, precision) < CPP_OPTION (pfile, int_precision))
628     cpp_error (pfile, CPP_DL_ICE,
629 	       "CPP arithmetic must be at least as precise as a target int");
630 
631   if (CPP_OPTION (pfile, char_precision) < 8)
632     cpp_error (pfile, CPP_DL_ICE, "target char is less than 8 bits wide");
633 
634   if (CPP_OPTION (pfile, wchar_precision) < CPP_OPTION (pfile, char_precision))
635     cpp_error (pfile, CPP_DL_ICE,
636 	       "target wchar_t is narrower than target char");
637 
638   if (CPP_OPTION (pfile, int_precision) < CPP_OPTION (pfile, char_precision))
639     cpp_error (pfile, CPP_DL_ICE,
640 	       "target int is narrower than target char");
641 
642   /* This is assumed in eval_token() and could be fixed if necessary.  */
643   if (sizeof (cppchar_t) > sizeof (cpp_num_part))
644     cpp_error (pfile, CPP_DL_ICE,
645 	       "CPP half-integer narrower than CPP character");
646 
647   if (CPP_OPTION (pfile, wchar_precision) > BITS_PER_CPPCHAR_T)
648     cpp_error (pfile, CPP_DL_ICE,
649 	       "CPP on this host cannot handle wide character constants over"
650 	       " %lu bits, but the target requires %lu bits",
651 	       (unsigned long) BITS_PER_CPPCHAR_T,
652 	       (unsigned long) CPP_OPTION (pfile, wchar_precision));
653 }
654 #else
655 # define sanity_checks(PFILE)
656 #endif
657 
658 /* This is called after options have been parsed, and partially
659    processed.  */
660 void
cpp_post_options(cpp_reader * pfile)661 cpp_post_options (cpp_reader *pfile)
662 {
663   int flags;
664 
665   sanity_checks (pfile);
666 
667   post_options (pfile);
668 
669   /* Mark named operators before handling command line macros.  */
670   flags = 0;
671   if (CPP_OPTION (pfile, cplusplus) && CPP_OPTION (pfile, operator_names))
672     flags |= NODE_OPERATOR;
673   if (CPP_OPTION (pfile, warn_cxx_operator_names))
674     flags |= NODE_DIAGNOSTIC | NODE_WARN_OPERATOR;
675   if (flags != 0)
676     mark_named_operators (pfile, flags);
677 }
678 
679 /* Setup for processing input from the file named FNAME, or stdin if
680    it is the empty string.  Return the original filename on success
681    (e.g. foo.i->foo.c), or NULL on failure.  INJECTING is true if
682    there may be injected headers before line 1 of the main file.  */
683 const char *
cpp_read_main_file(cpp_reader * pfile,const char * fname,bool injecting)684 cpp_read_main_file (cpp_reader *pfile, const char *fname, bool injecting)
685 {
686   if (mkdeps *deps = cpp_get_deps (pfile))
687     /* Set the default target (if there is none already).  */
688     deps_add_default_target (deps, fname);
689 
690   pfile->main_file
691     = _cpp_find_file (pfile, fname,
692 		      CPP_OPTION (pfile, preprocessed) ? &pfile->no_search_path
693 		      : CPP_OPTION (pfile, main_search) == CMS_user
694 		      ? pfile->quote_include
695 		      : CPP_OPTION (pfile, main_search) == CMS_system
696 		      ? pfile->bracket_include : &pfile->no_search_path,
697 		      /*angle=*/0, _cpp_FFK_NORMAL, 0);
698 
699   if (_cpp_find_failed (pfile->main_file))
700     return NULL;
701 
702   _cpp_stack_file (pfile, pfile->main_file,
703 		   injecting || CPP_OPTION (pfile, preprocessed)
704 		   ? IT_PRE_MAIN : IT_MAIN, 0);
705 
706   /* For foo.i, read the original filename foo.c now, for the benefit
707      of the front ends.  */
708   if (CPP_OPTION (pfile, preprocessed))
709     if (!read_original_filename (pfile))
710       {
711 	/* We're on line 1 after all.  */
712 	auto *last = linemap_check_ordinary
713 	  (LINEMAPS_LAST_MAP (pfile->line_table, false));
714 	last->to_line = 1;
715 	/* Inform of as-if a file change.  */
716 	_cpp_do_file_change (pfile, LC_RENAME_VERBATIM, LINEMAP_FILE (last),
717 			     LINEMAP_LINE (last), LINEMAP_SYSP (last));
718       }
719 
720   auto *map = LINEMAPS_LAST_ORDINARY_MAP (pfile->line_table);
721   pfile->main_loc = MAP_START_LOCATION (map);
722 
723   return ORDINARY_MAP_FILE_NAME (map);
724 }
725 
726 location_t
cpp_main_loc(const cpp_reader * pfile)727 cpp_main_loc (const cpp_reader *pfile)
728 {
729   return pfile->main_loc;
730 }
731 
732 /* For preprocessed files, if the very first characters are
733    '#<SPACE>[01]<SPACE>', then handle a line directive so we know the
734    original file name.  This will generate file_change callbacks,
735    which the front ends must handle appropriately given their state of
736    initialization.  We peek directly into the character buffer, so
737    that we're not confused by otherwise-skipped white space &
738    comments.  We can be very picky, because this should have been
739    machine-generated text (by us, no less).  This way we do not
740    interfere with the module directive state machine.  */
741 
742 static bool
read_original_filename(cpp_reader * pfile)743 read_original_filename (cpp_reader *pfile)
744 {
745   auto *buf = pfile->buffer->next_line;
746 
747   if (pfile->buffer->rlimit - buf > 4
748       && buf[0] == '#'
749       && buf[1] == ' '
750       // Also permit '1', as that's what used to be here
751       && (buf[2] == '0' || buf[2] == '1')
752       && buf[3] == ' ')
753     {
754       const cpp_token *token = _cpp_lex_direct (pfile);
755       gcc_checking_assert (token->type == CPP_HASH);
756       if (_cpp_handle_directive (pfile, token->flags & PREV_WHITE))
757 	{
758 	  read_original_directory (pfile);
759 
760 	  auto *penult = &linemap_check_ordinary
761 	    (LINEMAPS_LAST_MAP (pfile->line_table, false))[-1];
762 	  if (penult[1].reason == LC_RENAME_VERBATIM)
763 	    {
764 	      /* Expunge any evidence of the original linemap.  */
765 	      pfile->line_table->highest_location
766 		= pfile->line_table->highest_line
767 		= penult[0].start_location;
768 
769 	      penult[1].start_location = penult[0].start_location;
770 	      penult[1].reason = penult[0].reason;
771 	      penult[0] = penult[1];
772 	      pfile->line_table->info_ordinary.used--;
773 	      pfile->line_table->info_ordinary.cache = 0;
774 	    }
775 
776 	  return true;
777 	}
778     }
779 
780   return false;
781 }
782 
783 /* For preprocessed files, if the tokens following the first filename
784    line is of the form # <line> "/path/name//", handle the
785    directive so we know the original current directory.
786 
787    As with the first line peeking, we can do this without lexing by
788    being picky.  */
789 static void
read_original_directory(cpp_reader * pfile)790 read_original_directory (cpp_reader *pfile)
791 {
792   auto *buf = pfile->buffer->next_line;
793 
794   if (pfile->buffer->rlimit - buf > 4
795       && buf[0] == '#'
796       && buf[1] == ' '
797       // Also permit '1', as that's what used to be here
798       && (buf[2] == '0' || buf[2] == '1')
799       && buf[3] == ' ')
800     {
801       const cpp_token *hash = _cpp_lex_direct (pfile);
802       gcc_checking_assert (hash->type == CPP_HASH);
803       pfile->state.in_directive = 1;
804       const cpp_token *number = _cpp_lex_direct (pfile);
805       gcc_checking_assert (number->type == CPP_NUMBER);
806       const cpp_token *string = _cpp_lex_direct (pfile);
807       pfile->state.in_directive = 0;
808 
809       const unsigned char *text = nullptr;
810       size_t len = 0;
811       if (string->type == CPP_STRING)
812 	{
813 	  /* The string value includes the quotes.  */
814 	  text = string->val.str.text;
815 	  len = string->val.str.len;
816 	}
817       if (len < 5
818 	  || !IS_DIR_SEPARATOR (text[len - 2])
819 	  || !IS_DIR_SEPARATOR (text[len - 3]))
820 	{
821 	  /* That didn't work out, back out.   */
822 	  _cpp_backup_tokens (pfile, 3);
823 	  return;
824 	}
825 
826       if (pfile->cb.dir_change)
827 	{
828 	  /* Smash the string directly, it's dead at this point  */
829 	  char *smashy = (char *)text;
830 	  smashy[len - 3] = 0;
831 
832 	  pfile->cb.dir_change (pfile, smashy + 1);
833 	}
834 
835       /* We should be at EOL.  */
836     }
837 }
838 
839 /* This is called at the end of preprocessing.  It pops the last
840    buffer and writes dependency output.
841 
842    Maybe it should also reset state, such that you could call
843    cpp_start_read with a new filename to restart processing.  */
844 void
cpp_finish(cpp_reader * pfile,FILE * deps_stream)845 cpp_finish (cpp_reader *pfile, FILE *deps_stream)
846 {
847   /* Warn about unused macros before popping the final buffer.  */
848   if (CPP_OPTION (pfile, warn_unused_macros))
849     cpp_forall_identifiers (pfile, _cpp_warn_if_unused_macro, NULL);
850 
851   /* lex.cc leaves the final buffer on the stack.  This it so that
852      it returns an unending stream of CPP_EOFs to the client.  If we
853      popped the buffer, we'd dereference a NULL buffer pointer and
854      segfault.  It's nice to allow the client to do worry-free excess
855      cpp_get_token calls.  */
856   while (pfile->buffer)
857     _cpp_pop_buffer (pfile);
858 
859   if (deps_stream)
860     deps_write (pfile, deps_stream, 72);
861 
862   /* Report on headers that could use multiple include guards.  */
863   if (CPP_OPTION (pfile, print_include_names))
864     _cpp_report_missing_guards (pfile);
865 }
866 
867 static void
post_options(cpp_reader * pfile)868 post_options (cpp_reader *pfile)
869 {
870   /* -Wtraditional is not useful in C++ mode.  */
871   if (CPP_OPTION (pfile, cplusplus))
872     CPP_OPTION (pfile, cpp_warn_traditional) = 0;
873 
874   /* Permanently disable macro expansion if we are rescanning
875      preprocessed text.  Read preprocesed source in ISO mode.  */
876   if (CPP_OPTION (pfile, preprocessed))
877     {
878       if (!CPP_OPTION (pfile, directives_only))
879 	pfile->state.prevent_expansion = 1;
880       CPP_OPTION (pfile, traditional) = 0;
881     }
882 
883   if (CPP_OPTION (pfile, warn_trigraphs) == 2)
884     CPP_OPTION (pfile, warn_trigraphs) = !CPP_OPTION (pfile, trigraphs);
885 
886   if (CPP_OPTION (pfile, traditional))
887     {
888       CPP_OPTION (pfile, trigraphs) = 0;
889       CPP_OPTION (pfile, warn_trigraphs) = 0;
890     }
891 
892   if (CPP_OPTION (pfile, module_directives))
893     {
894       /* These unspellable tokens have a leading space.  */
895       const char *const inits[spec_nodes::M_HWM]
896 	= {"export ", "module ", "import ", "__import"};
897 
898       for (int ix = 0; ix != spec_nodes::M_HWM; ix++)
899 	{
900 	  cpp_hashnode *node = cpp_lookup (pfile, UC (inits[ix]),
901 					   strlen (inits[ix]));
902 
903 	  /* Token we pass to the compiler.  */
904 	  pfile->spec_nodes.n_modules[ix][1] = node;
905 
906 	  if (ix != spec_nodes::M__IMPORT)
907 	    /* Token we recognize when lexing, drop the trailing ' '.  */
908 	    node = cpp_lookup (pfile, NODE_NAME (node), NODE_LEN (node) - 1);
909 
910 	  node->flags |= NODE_MODULE;
911 	  pfile->spec_nodes.n_modules[ix][0] = node;
912 	}
913     }
914 }
915