]> git.ipfire.org Git - thirdparty/gcc.git/blame - libcpp/init.cc
PR middle-end/105604 - ICE: in tree_to_shwi with vla in struct and sprintf
[thirdparty/gcc.git] / libcpp / init.cc
CommitLineData
5538ada6 1/* CPP Library.
7adcbafe 2 Copyright (C) 1986-2022 Free Software Foundation, Inc.
5538ada6
ZW
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
7This program is free software; you can redistribute it and/or modify it
8under the terms of the GNU General Public License as published by the
748086b7 9Free Software Foundation; either version 3, or (at your option) any
5538ada6
ZW
10later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
748086b7
JJ
18along with this program; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
5538ada6 20
5538ada6
ZW
21#include "config.h"
22#include "system.h"
6de1e2a9 23#include "cpplib.h"
4f4e53dd 24#include "internal.h"
49e6c08e 25#include "mkdeps.h"
018a4785 26#include "localedir.h"
4489800d 27#include "filenames.h"
88ae23e7 28
5dc99c46 29#ifndef ENABLE_CANONICAL_SYSTEM_HEADERS
eac3e079
JY
30#ifdef HAVE_DOS_BASED_FILE_SYSTEM
31#define ENABLE_CANONICAL_SYSTEM_HEADERS 1
32#else
5dc99c46
SB
33#define ENABLE_CANONICAL_SYSTEM_HEADERS 0
34#endif
eac3e079 35#endif
5dc99c46 36
6cf87ca4 37static void init_library (void);
3d8b2a98 38static void mark_named_operators (cpp_reader *, int);
d1c566d7 39static bool read_original_filename (cpp_reader *);
b20d9f0c 40static void read_original_directory (cpp_reader *);
6cf87ca4 41static void post_options (cpp_reader *);
6de1e2a9 42
61d0346d
NB
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
12cf91fe 45 runtime. */
61d0346d 46#if HAVE_DESIGNATED_INITIALIZERS
a9ae4483 47
4a58aab6 48#define init_trigraph_map() /* Nothing. */
61d0346d 49#define TRIGRAPH_MAP \
562a5c27 50__extension__ const uchar _cpp_trigraph_map[UCHAR_MAX + 1] = {
61d0346d 51
a9ae4483 52#define END };
455d2586 53#define s(p, v) [p] = v,
61d0346d 54
a9ae4483 55#else
61d0346d 56
562a5c27 57#define TRIGRAPH_MAP uchar _cpp_trigraph_map[UCHAR_MAX + 1] = { 0 }; \
6cf87ca4 58 static void init_trigraph_map (void) { \
61d0346d
NB
59 unsigned char *x = _cpp_trigraph_map;
60
ae79697b 61#define END }
455d2586 62#define s(p, v) x[p] = v;
61d0346d 63
a9ae4483 64#endif
6de1e2a9 65
61d0346d
NB
66TRIGRAPH_MAP
67 s('=', '#') s(')', ']') s('!', '|')
68 s('(', '[') s('\'', '^') s('>', '}')
69 s('/', '\\') s('<', '{') s('-', '~')
70END
71
a9ae4483 72#undef s
455d2586 73#undef END
61d0346d 74#undef TRIGRAPH_MAP
6de1e2a9 75
5d8ebbd8
NB
76/* A set of booleans indicating what CPP features each source language
77 requires. */
a01eb545
ZW
78struct lang_flags
79{
80 char c99;
a01eb545
ZW
81 char cplusplus;
82 char extended_numbers;
af15a2fe 83 char extended_identifiers;
d3f4ff8b 84 char c11_identifiers;
58551c23 85 char std;
a01eb545 86 char digraphs;
b6baa67d 87 char uliterals;
a48e3dd1 88 char rliterals;
3ce4f9e4 89 char user_literals;
01187df0 90 char binary_constants;
7057e645 91 char digit_separators;
e4276ba5 92 char trigraphs;
fe95b036 93 char utf8_char_literals;
fb771b9d 94 char va_opt;
93313b94 95 char scope;
175a85b2 96 char dfp_constants;
1f69e63c 97 char size_t_literals;
71d38ec8 98 char elifdef;
a01eb545
ZW
99};
100
a01eb545 101static const struct lang_flags lang_defaults[] =
c264208e
JJ
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 }
a01eb545
ZW
127};
128
5d8ebbd8 129/* Sets internal flags correctly for a given language. */
f749a36b 130void
6cf87ca4 131cpp_set_lang (cpp_reader *pfile, enum c_lang lang)
dd07b884 132{
a01eb545 133 const struct lang_flags *l = &lang_defaults[(int) lang];
df383483 134
bdb05a7b 135 CPP_OPTION (pfile, lang) = lang;
dd07b884 136
af15a2fe
JM
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;
d3f4ff8b 141 CPP_OPTION (pfile, c11_identifiers) = l->c11_identifiers;
af15a2fe 142 CPP_OPTION (pfile, std) = l->std;
af15a2fe 143 CPP_OPTION (pfile, digraphs) = l->digraphs;
b6baa67d 144 CPP_OPTION (pfile, uliterals) = l->uliterals;
a48e3dd1 145 CPP_OPTION (pfile, rliterals) = l->rliterals;
3ce4f9e4 146 CPP_OPTION (pfile, user_literals) = l->user_literals;
01187df0 147 CPP_OPTION (pfile, binary_constants) = l->binary_constants;
7057e645 148 CPP_OPTION (pfile, digit_separators) = l->digit_separators;
e4276ba5 149 CPP_OPTION (pfile, trigraphs) = l->trigraphs;
fe95b036 150 CPP_OPTION (pfile, utf8_char_literals) = l->utf8_char_literals;
fb771b9d 151 CPP_OPTION (pfile, va_opt) = l->va_opt;
93313b94 152 CPP_OPTION (pfile, scope) = l->scope;
175a85b2 153 CPP_OPTION (pfile, dfp_constants) = l->dfp_constants;
1f69e63c 154 CPP_OPTION (pfile, size_t_literals) = l->size_t_literals;
71d38ec8 155 CPP_OPTION (pfile, elifdef) = l->elifdef;
dd07b884
NB
156}
157
c1bad961 158/* Initialize library global state. */
cf44ea52 159static void
6cf87ca4 160init_library (void)
cf44ea52 161{
7ca3d2b1
NB
162 static int initialized = 0;
163
164 if (! initialized)
165 {
166 initialized = 1;
167
b0c084b7
JJ
168 _cpp_init_lexer ();
169
7ca3d2b1
NB
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 ();
4f4e53dd
PB
174
175#ifdef ENABLE_NLS
85eac2a0 176 (void) bindtextdomain (PACKAGE, LOCALEDIR);
4f4e53dd 177#endif
7ca3d2b1 178 }
cf44ea52
NB
179}
180
ec5c56db 181/* Initialize a cpp_reader structure. */
cf44ea52 182cpp_reader *
0823efed 183cpp_create_reader (enum c_lang lang, cpp_hash_table *table,
99b1c316 184 class line_maps *line_table)
6de1e2a9 185{
7ca3d2b1 186 cpp_reader *pfile;
93c80368 187
4912a07c 188 /* Initialize this instance of the library if it hasn't been already. */
674c3b40 189 init_library ();
7ca3d2b1 190
c3f829c1 191 pfile = XCNEW (cpp_reader);
92582b75 192 memset (&pfile->base_context, 0, sizeof (pfile->base_context));
93c80368 193
f749a36b 194 cpp_set_lang (pfile, lang);
a5a49440 195 CPP_OPTION (pfile, warn_multichar) = 1;
ae79697b 196 CPP_OPTION (pfile, discard_comments) = 1;
477cdac7 197 CPP_OPTION (pfile, discard_comments_in_macro_exp) = 1;
1c6ffbab 198 CPP_OPTION (pfile, max_include_depth) = 200;
be768055 199 CPP_OPTION (pfile, operator_names) = 1;
a8eb6044 200 CPP_OPTION (pfile, warn_trigraphs) = 2;
909de5da 201 CPP_OPTION (pfile, warn_endif_labels) = 1;
2b71f4a4 202 CPP_OPTION (pfile, cpp_warn_c90_c99_compat) = -1;
175a85b2 203 CPP_OPTION (pfile, cpp_warn_c11_c2x_compat) = -1;
fe191308 204 CPP_OPTION (pfile, cpp_warn_cxx11_compat) = 0;
e3339d0f
JM
205 CPP_OPTION (pfile, cpp_warn_deprecated) = 1;
206 CPP_OPTION (pfile, cpp_warn_long_long) = 0;
b1822ccc 207 CPP_OPTION (pfile, dollars_in_ident) = 1;
78b8811a 208 CPP_OPTION (pfile, warn_dollars) = 1;
e5b79219 209 CPP_OPTION (pfile, warn_variadic_macros) = 1;
c047ce93 210 CPP_OPTION (pfile, warn_builtin_macro_redefined) = 1;
70f6d5e1 211 CPP_OPTION (pfile, cpp_warn_implicit_fallthrough) = 0;
51fce2d3
DS
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;
50668cf6 218 CPP_OPTION (pfile, warn_normalize) = normalized_C;
7f5f5f98 219 CPP_OPTION (pfile, warn_literal_suffix) = 1;
5dc99c46
SB
220 CPP_OPTION (pfile, canonical_system_headers)
221 = ENABLE_CANONICAL_SYSTEM_HEADERS;
a4a0016d 222 CPP_OPTION (pfile, ext_numeric_literals) = 1;
e8ff5196 223 CPP_OPTION (pfile, warn_date_time) = 0;
51c50026 224 CPP_OPTION (pfile, cpp_warn_bidirectional) = bidirectional_unpaired;
ae79697b 225
2443d4e1
NB
226 /* Default CPP arithmetic to something sensible for the host for the
227 benefit of dumb users like fix-header. */
c9220e3a 228 CPP_OPTION (pfile, precision) = CHAR_BIT * sizeof (long);
2443d4e1
NB
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);
2a1dc0d8 232 CPP_OPTION (pfile, unsigned_char) = 0;
44a147ad 233 CPP_OPTION (pfile, unsigned_wchar) = 1;
e6cc3a24
ZW
234 CPP_OPTION (pfile, bytes_big_endian) = 1; /* does not matter */
235
236 /* Default to no charset conversion. */
16dd5cfe 237 CPP_OPTION (pfile, narrow_charset) = _cpp_default_encoding ();
e6cc3a24 238 CPP_OPTION (pfile, wide_charset) = 0;
4268e8bb 239
16dd5cfe
EC
240 /* Default the input character set to UTF-8. */
241 CPP_OPTION (pfile, input_charset) = _cpp_default_encoding ();
cf551fba 242
8f9b4009
NB
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
500bee0a 249 /* Initialize the line map. */
50f59cd7 250 pfile->line_table = line_table;
d82fc108 251
4a58aab6 252 /* Initialize lexer state. */
93c80368
NB
253 pfile->state.save_comments = ! CPP_OPTION (pfile, discard_comments);
254
4ed5bcfb 255 /* Set up static tokens. */
4ed5bcfb
NB
256 pfile->avoid_paste.type = CPP_PADDING;
257 pfile->avoid_paste.val.source = NULL;
5abe05b4
NS
258 pfile->avoid_paste.src_loc = 0;
259 pfile->endarg.type = CPP_EOF;
260 pfile->endarg.flags = 0;
261 pfile->endarg.src_loc = 0;
93c80368 262
5fddcffc
NB
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;
5fddcffc 267
4912a07c 268 /* Initialize the base context. */
93c80368 269 pfile->context = &pfile->base_context;
92582b75 270 pfile->base_context.c.macro = 0;
93c80368
NB
271 pfile->base_context.prev = pfile->base_context.next = 0;
272
8c3b2693
NB
273 /* Aligned and unaligned storage. */
274 pfile->a_buff = _cpp_get_buff (pfile, 0);
ece54d54 275 pfile->u_buff = _cpp_get_buff (pfile, 0);
93c80368 276
17e7cb85
KT
277 /* Initialize table for push_macro/pop_macro. */
278 pfile->pushed_macros = 0;
279
e3dfef44 280 /* Do not force token locations by default. */
f3f6029d 281 pfile->forced_token_location = 0;
e3dfef44 282
4b5f564a
NS
283 /* Note the timestamp is unset. */
284 pfile->time_stamp = time_t (-1);
285 pfile->time_stamp_kind = 0;
15c98b2e 286
87ed109f
NB
287 /* The expression parser stack. */
288 _cpp_expand_op_stack (pfile);
289
4912a07c 290 /* Initialize the buffer obstack. */
19a9ba64 291 obstack_specify_allocation (&pfile->buffer_ob, 0, 0, xmalloc, free);
2a967f3d 292
8f9b4009 293 _cpp_init_files (pfile);
cf44ea52 294
b4e46cea
PB
295 _cpp_init_hashtable (pfile, table);
296
cf44ea52 297 return pfile;
f2d5f0cc
ZW
298}
299
5ffeb913
TT
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. */
302void
99b1c316 303cpp_set_line_map (cpp_reader *pfile, class line_maps *line_table)
5ffeb913
TT
304{
305 pfile->line_table = line_table;
306}
307
400023a3 308/* Free resources used by PFILE. Accessing PFILE after this function
8d9afc4e 309 returns leads to undefined behavior. Returns the error count. */
76c3e73e 310void
6cf87ca4 311cpp_destroy (cpp_reader *pfile)
6de1e2a9 312{
93c80368 313 cpp_context *context, *contextn;
17e7cb85 314 struct def_pragma_macro *pmacro;
50410426 315 tokenrun *run, *runn;
631d0d36 316 int i;
709e9e50 317
87ed109f 318 free (pfile->op_stack);
af0d16cd 319
38b24ee2 320 while (CPP_BUFFER (pfile) != NULL)
ef6e958a 321 _cpp_pop_buffer (pfile);
6de1e2a9 322
04695783 323 free (pfile->out.base);
004cb263 324
93c80368 325 if (pfile->macro_buffer)
4b49c365 326 {
fad205ff 327 free (pfile->macro_buffer);
4b49c365
AO
328 pfile->macro_buffer = NULL;
329 pfile->macro_buffer_len = 0;
330 }
93c80368 331
f4ff5a69
NB
332 if (pfile->deps)
333 deps_free (pfile->deps);
2a967f3d 334 obstack_free (&pfile->buffer_ob, 0);
49e6c08e 335
2a967f3d 336 _cpp_destroy_hashtable (pfile);
8f9b4009 337 _cpp_cleanup_files (pfile);
e6cc3a24 338 _cpp_destroy_iconv (pfile);
709e9e50 339
8c3b2693 340 _cpp_free_buff (pfile->a_buff);
ece54d54 341 _cpp_free_buff (pfile->u_buff);
b8af0ca5 342 _cpp_free_buff (pfile->free_buffs);
93c80368 343
50410426
NB
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
93c80368
NB
352 for (context = pfile->base_context.next; context; context = contextn)
353 {
354 contextn = context->next;
355 free (context);
356 }
400023a3 357
631d0d36
MG
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 }
17e7cb85
KT
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 }
631d0d36 376
400023a3 377 free (pfile);
6de1e2a9
ZW
378}
379
93c80368 380/* This structure defines one built-in identifier. A node will be
f24a153a
ZW
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
e53b6e56 385 macro.cc. Builtin is somewhat of a misnomer -- the property of
f24a153a 386 interest is that these macros require special code to compute their
128465e6 387 expansions. The value is a "cpp_builtin_type" enumerator.
f24a153a
ZW
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. */
c047ce93 394struct builtin_macro
a9ae4483 395{
c047ce93
SB
396 const uchar *const name;
397 const unsigned short len;
398 const unsigned short value;
399 const bool always_warn_if_redefined;
a9ae4483 400};
93c80368 401
c047ce93
SB
402#define B(n, t, f) { DSC(n), t, f }
403static const struct builtin_macro builtin_array[] =
6de1e2a9 404{
c047ce93
SB
405 B("__TIMESTAMP__", BT_TIMESTAMP, false),
406 B("__TIME__", BT_TIME, false),
407 B("__DATE__", BT_DATE, false),
408 B("__FILE__", BT_FILE, false),
1a9b3f04 409 B("__FILE_NAME__", BT_FILE_NAME, false),
c047ce93
SB
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),
f6fe3bbf 414 /* Make sure to update the list of built-in
e53b6e56 415 function-like macros in traditional.cc:
f6fe3bbf 416 fun_like_macro() when adding more following */
1f8d3e84 417 B("__has_attribute", BT_HAS_ATTRIBUTE, true),
1d00f8c8 418 B("__has_c_attribute", BT_HAS_STD_ATTRIBUTE, true),
1f8d3e84 419 B("__has_cpp_attribute", BT_HAS_ATTRIBUTE, true),
ad1539d5 420 B("__has_builtin", BT_HAS_BUILTIN, true),
3d056cbf
NS
421 B("__has_include", BT_HAS_INCLUDE, true),
422 B("__has_include_next",BT_HAS_INCLUDE_NEXT, true),
278c4662
NB
423 /* Keep builtins not used for -traditional-cpp at the end, and
424 update init_builtins() if any more are added. */
c047ce93
SB
425 B("_Pragma", BT_PRAGMA, true),
426 B("__STDC__", BT_STDC, true),
427};
428#undef B
429
430struct builtin_operator
431{
432 const uchar *const name;
433 const unsigned short len;
434 const unsigned short value;
f24a153a 435};
92936ecf 436
c047ce93
SB
437#define B(n, t) { DSC(n), t }
438static const struct builtin_operator operator_array[] =
f24a153a
ZW
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)
a9ae4483 451};
12cf91fe 452#undef B
a9ae4483 453
17645b15
NB
454/* Mark the C++ named operators in the hash table. */
455static void
3d8b2a98 456mark_named_operators (cpp_reader *pfile, int flags)
17645b15 457{
c047ce93 458 const struct builtin_operator *b;
17645b15
NB
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);
3d8b2a98 465 hp->flags |= flags;
4977bab6
ZW
466 hp->is_directive = 0;
467 hp->directive_index = b->value;
17645b15
NB
468 }
469}
470
cfc93532
MLI
471/* Helper function of cpp_type2name. Return the string associated with
472 named operator TYPE. */
473const char *
474cpp_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
c1bad961 489void
ccfc4c91 490cpp_init_special_builtins (cpp_reader *pfile)
a9ae4483 491{
c047ce93 492 const struct builtin_macro *b;
278c4662 493 size_t n = ARRAY_SIZE (builtin_array);
771c4df3 494
278c4662
NB
495 if (CPP_OPTION (pfile, traditional))
496 n -= 2;
83900997
JJ
497 else if (! CPP_OPTION (pfile, stdc_0_in_system_headers)
498 || CPP_OPTION (pfile, std))
ccfc4c91 499 n--;
278c4662 500
83900997 501 for (b = builtin_array; b < builtin_array + n; b++)
6de1e2a9 502 {
ad1539d5 503 if ((b->value == BT_HAS_ATTRIBUTE
1d00f8c8 504 || b->value == BT_HAS_STD_ATTRIBUTE
ad1539d5 505 || b->value == BT_HAS_BUILTIN)
1f8d3e84
JJ
506 && (CPP_OPTION (pfile, lang) == CLK_ASM
507 || pfile->cb.has_attribute == NULL))
508 continue;
f24a153a 509 cpp_hashnode *hp = cpp_lookup (pfile, b->name, b->len);
a570d97f 510 hp->type = NT_BUILTIN_MACRO;
b753b37b 511 if (b->always_warn_if_redefined)
c047ce93 512 hp->flags |= NODE_WARN;
7e5487a2 513 hp->value.builtin = (enum cpp_builtin_type) b->value;
6de1e2a9 514 }
ccfc4c91
OW
515}
516
aa23e73b
JJ
517/* Restore macro C to builtin macro definition. */
518
519void
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
ccfc4c91
OW
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. */
539void
540cpp_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");
c740cee2
NB
548
549 if (CPP_OPTION (pfile, cplusplus))
1fb80b0c 550 {
78739c2d
PF
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
b04445d4 557 || CPP_OPTION (pfile, lang) == CLK_GNUCXX20)
445430e1 558 _cpp_define_builtin (pfile, "__cplusplus 202002L");
026a79f7 559 else if (CPP_OPTION (pfile, lang) == CLK_CXX17
7b936140 560 || CPP_OPTION (pfile, lang) == CLK_GNUCXX17)
85e653c9 561 _cpp_define_builtin (pfile, "__cplusplus 201703L");
e4276ba5
ESR
562 else if (CPP_OPTION (pfile, lang) == CLK_CXX14
563 || CPP_OPTION (pfile, lang) == CLK_GNUCXX14)
564 _cpp_define_builtin (pfile, "__cplusplus 201402L");
61949153
PC
565 else if (CPP_OPTION (pfile, lang) == CLK_CXX11
566 || CPP_OPTION (pfile, lang) == CLK_GNUCXX11)
1fb80b0c
JM
567 _cpp_define_builtin (pfile, "__cplusplus 201103L");
568 else
569 _cpp_define_builtin (pfile, "__cplusplus 199711L");
570 }
2a1dc0d8
ZW
571 else if (CPP_OPTION (pfile, lang) == CLK_ASM)
572 _cpp_define_builtin (pfile, "__ASSEMBLER__ 1");
0f7866e7 573 else if (CPP_OPTION (pfile, lang) == CLK_STDC94)
c740cee2 574 _cpp_define_builtin (pfile, "__STDC_VERSION__ 199409L");
9f936c86
JM
575 else if (CPP_OPTION (pfile, lang) == CLK_STDC2X
576 || CPP_OPTION (pfile, lang) == CLK_GNUC2X)
577 _cpp_define_builtin (pfile, "__STDC_VERSION__ 202000L");
c76dc9c3
JM
578 else if (CPP_OPTION (pfile, lang) == CLK_STDC17
579 || CPP_OPTION (pfile, lang) == CLK_GNUC17)
580 _cpp_define_builtin (pfile, "__STDC_VERSION__ 201710L");
48b0b196
JM
581 else if (CPP_OPTION (pfile, lang) == CLK_STDC11
582 || CPP_OPTION (pfile, lang) == CLK_GNUC11)
583 _cpp_define_builtin (pfile, "__STDC_VERSION__ 201112L");
c740cee2
NB
584 else if (CPP_OPTION (pfile, c99))
585 _cpp_define_builtin (pfile, "__STDC_VERSION__ 199901L");
586
a48e3dd1 587 if (CPP_OPTION (pfile, uliterals)
e4276ba5
ESR
588 && !(CPP_OPTION (pfile, cplusplus)
589 && (CPP_OPTION (pfile, lang) == CLK_GNUCXX
590 || CPP_OPTION (pfile, lang) == CLK_CXX98)))
a48e3dd1
JM
591 {
592 _cpp_define_builtin (pfile, "__STDC_UTF_16__ 1");
593 _cpp_define_builtin (pfile, "__STDC_UTF_32__ 1");
594 }
595
6e270179 596 if (hosted)
58b5b894 597 _cpp_define_builtin (pfile, "__STDC_HOSTED__ 1");
6e270179 598 else
58b5b894 599 _cpp_define_builtin (pfile, "__STDC_HOSTED__ 0");
6e270179 600
0f7866e7
ZL
601 if (CPP_OPTION (pfile, objc))
602 _cpp_define_builtin (pfile, "__OBJC__ 1");
4a58aab6
NB
603}
604
2443d4e1 605/* Sanity-checks are dependent on command-line options, so it is
174f6622 606 called as a subroutine of cpp_read_main_file. */
22d66382 607#if CHECKING_P
6cf87ca4
ZW
608static void sanity_checks (cpp_reader *);
609static void sanity_checks (cpp_reader *pfile)
2443d4e1
NB
610{
611 cppchar_t test = 0;
c9220e3a 612 size_t max_precision = 2 * CHAR_BIT * sizeof (cpp_num_part);
2443d4e1
NB
613
614 /* Sanity checks for assumptions about CPP arithmetic and target
615 type precisions made by cpplib. */
616 test--;
617 if (test < 1)
0527bc4e 618 cpp_error (pfile, CPP_DL_ICE, "cppchar_t must be an unsigned type");
2443d4e1 619
c9220e3a 620 if (CPP_OPTION (pfile, precision) > max_precision)
0527bc4e 621 cpp_error (pfile, CPP_DL_ICE,
6cf87ca4
ZW
622 "preprocessor arithmetic has maximum precision of %lu bits;"
623 " target requires %lu bits",
c9220e3a
NB
624 (unsigned long) max_precision,
625 (unsigned long) CPP_OPTION (pfile, precision));
2443d4e1
NB
626
627 if (CPP_OPTION (pfile, precision) < CPP_OPTION (pfile, int_precision))
0527bc4e 628 cpp_error (pfile, CPP_DL_ICE,
2443d4e1
NB
629 "CPP arithmetic must be at least as precise as a target int");
630
631 if (CPP_OPTION (pfile, char_precision) < 8)
0527bc4e 632 cpp_error (pfile, CPP_DL_ICE, "target char is less than 8 bits wide");
2443d4e1
NB
633
634 if (CPP_OPTION (pfile, wchar_precision) < CPP_OPTION (pfile, char_precision))
0527bc4e 635 cpp_error (pfile, CPP_DL_ICE,
2443d4e1
NB
636 "target wchar_t is narrower than target char");
637
638 if (CPP_OPTION (pfile, int_precision) < CPP_OPTION (pfile, char_precision))
0527bc4e 639 cpp_error (pfile, CPP_DL_ICE,
2443d4e1
NB
640 "target int is narrower than target char");
641
c9220e3a
NB
642 /* This is assumed in eval_token() and could be fixed if necessary. */
643 if (sizeof (cppchar_t) > sizeof (cpp_num_part))
0527bc4e
JDA
644 cpp_error (pfile, CPP_DL_ICE,
645 "CPP half-integer narrower than CPP character");
c9220e3a 646
2443d4e1 647 if (CPP_OPTION (pfile, wchar_precision) > BITS_PER_CPPCHAR_T)
0527bc4e 648 cpp_error (pfile, CPP_DL_ICE,
6cf87ca4
ZW
649 "CPP on this host cannot handle wide character constants over"
650 " %lu bits, but the target requires %lu bits",
c9220e3a
NB
651 (unsigned long) BITS_PER_CPPCHAR_T,
652 (unsigned long) CPP_OPTION (pfile, wchar_precision));
2443d4e1
NB
653}
654#else
655# define sanity_checks(PFILE)
656#endif
657
f5e99456 658/* This is called after options have been parsed, and partially
59e4e217 659 processed. */
4169c321
PB
660void
661cpp_post_options (cpp_reader *pfile)
6de1e2a9 662{
3d8b2a98
ILT
663 int flags;
664
2443d4e1
NB
665 sanity_checks (pfile);
666
f4ff5a69
NB
667 post_options (pfile);
668
c19b12cb 669 /* Mark named operators before handling command line macros. */
3d8b2a98 670 flags = 0;
c19b12cb 671 if (CPP_OPTION (pfile, cplusplus) && CPP_OPTION (pfile, operator_names))
3d8b2a98
ILT
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);
4169c321 677}
c19b12cb 678
4dc299fb 679/* Setup for processing input from the file named FNAME, or stdin if
6bf2ff0d
NS
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. */
8e9ea4d7 683const char *
6bf2ff0d 684cpp_read_main_file (cpp_reader *pfile, const char *fname, bool injecting)
4169c321 685{
918e8b10
NS
686 if (mkdeps *deps = cpp_get_deps (pfile))
687 /* Set the default target (if there is none already). */
d8909271 688 deps_add_default_target (deps, fname);
96302433 689
4dc299fb 690 pfile->main_file
9844497a
NS
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
4dc299fb 699 if (_cpp_find_failed (pfile->main_file))
3092d0fc 700 return NULL;
f5e99456 701
6bf2ff0d 702 _cpp_stack_file (pfile, pfile->main_file,
d1c566d7
NS
703 injecting || CPP_OPTION (pfile, preprocessed)
704 ? IT_PRE_MAIN : IT_MAIN, 0);
4dc299fb
PB
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))
d1c566d7
NS
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 }
134051f1 719
9844497a
NS
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
726location_t
727cpp_main_loc (const cpp_reader *pfile)
728{
729 return pfile->main_loc;
f5e99456
NB
730}
731
d1c566d7
NS
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
742static bool
6cf87ca4 743read_original_filename (cpp_reader *pfile)
f5e99456 744{
d1c566d7
NS
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] == ' ')
f5e99456 753 {
d1c566d7
NS
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))
f5e99456 757 {
b20d9f0c 758 read_original_directory (pfile);
a13be187
NS
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
d1c566d7 776 return true;
f5e99456
NB
777 }
778 }
779
d1c566d7 780 return false;
f5e99456
NB
781}
782
b20d9f0c
AO
783/* For preprocessed files, if the tokens following the first filename
784 line is of the form # <line> "/path/name//", handle the
d1c566d7
NS
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. */
b20d9f0c
AO
789static void
790read_original_directory (cpp_reader *pfile)
791{
d1c566d7
NS
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] == ' ')
b20d9f0c 800 {
d1c566d7
NS
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;
b20d9f0c 808
d1c566d7
NS
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 }
b20d9f0c 825
d1c566d7
NS
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 }
b20d9f0c 834
d1c566d7 835 /* We should be at EOL. */
b20d9f0c 836 }
b20d9f0c
AO
837}
838
76c3e73e 839/* This is called at the end of preprocessing. It pops the last
148e4216 840 buffer and writes dependency output.
16dd5cfe 841
76c3e73e
NB
842 Maybe it should also reset state, such that you could call
843 cpp_start_read with a new filename to restart processing. */
148e4216 844void
6cf87ca4 845cpp_finish (cpp_reader *pfile, FILE *deps_stream)
6de1e2a9 846{
a69cbaac
NB
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
e53b6e56 851 /* lex.cc leaves the final buffer on the stack. This it so that
7364fdd8 852 it returns an unending stream of CPP_EOFs to the client. If we
a1f300c0 853 popped the buffer, we'd dereference a NULL buffer pointer and
7364fdd8
NB
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);
c1212d2f 858
918e8b10
NS
859 if (deps_stream)
860 deps_write (pfile, deps_stream, 72);
3caee4a8 861
d4506961
ZW
862 /* Report on headers that could use multiple include guards. */
863 if (CPP_OPTION (pfile, print_include_names))
c71f835b 864 _cpp_report_missing_guards (pfile);
6de1e2a9
ZW
865}
866
f4ff5a69 867static void
6cf87ca4 868post_options (cpp_reader *pfile)
96302433
NB
869{
870 /* -Wtraditional is not useful in C++ mode. */
871 if (CPP_OPTION (pfile, cplusplus))
e3339d0f 872 CPP_OPTION (pfile, cpp_warn_traditional) = 0;
96302433 873
6d4587f7 874 /* Permanently disable macro expansion if we are rescanning
43612ffb 875 preprocessed text. Read preprocesed source in ISO mode. */
6d4587f7 876 if (CPP_OPTION (pfile, preprocessed))
43612ffb 877 {
ccfc4c91
OW
878 if (!CPP_OPTION (pfile, directives_only))
879 pfile->state.prevent_expansion = 1;
43612ffb
NB
880 CPP_OPTION (pfile, traditional) = 0;
881 }
882
a8eb6044
NB
883 if (CPP_OPTION (pfile, warn_trigraphs) == 2)
884 CPP_OPTION (pfile, warn_trigraphs) = !CPP_OPTION (pfile, trigraphs);
885
43612ffb 886 if (CPP_OPTION (pfile, traditional))
26aea073 887 {
26aea073
NB
888 CPP_OPTION (pfile, trigraphs) = 0;
889 CPP_OPTION (pfile, warn_trigraphs) = 0;
890 }
c9c3d5f2
NS
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 }
7ca3d2b1 914}