preprocessor: Deferred macro support

For deferred macros we also need a new field on the macro itself, so
that the module machinery can determine the macro was imported.  Also
the documentation for the hashnode's deferred field was incomplete.

	libcpp/
	* include/cpplib.h (struct cpp_macro): Add imported_p field.
	(struct cpp_hashnode): Tweak deferred field documentation.
	* macro.c (_cpp_new_macro): Clear new field.
	(cpp_get_deferred_macro, get_deferred_or_lazy_macro): Assert
	more.
This commit is contained in:
Nathan Sidwell
2020-12-14 07:21:49 -08:00
parent 159b0bd9ce
commit 62c5ea5228
2 changed files with 13 additions and 7 deletions

View File

@@ -826,7 +826,10 @@ struct GTY(()) cpp_macro {
tokens. */
unsigned int extra_tokens : 1;
/* 1 bits spare (32-bit). 33 on 64-bit target. */
/* Imported C++20 macro (from a header unit). */
unsigned int imported_p : 1;
/* 0 bits spare (32-bit). 32 on 64-bit target. */
union cpp_exp_u
{
@@ -921,9 +924,11 @@ struct GTY(()) cpp_hashnode {
/* 5 bits spare. */
/* On a 64-bit system there would be 32-bits of padding to the value
/* The deferred cookie is applicable to NT_USER_MACRO or NT_VOID.
The latter for when a macro had a prevailing undef.
On a 64-bit system there would be 32-bits of padding to the value
field. So placing the deferred index here is not costly. */
unsigned deferred; /* Deferred index, (unless zero). */
unsigned deferred; /* Deferred cookie */
union _cpp_hashnode_value GTY ((desc ("%1.type"))) value;
};