From: Nathan Sidwell Date: Mon, 14 Dec 2020 15:21:49 +0000 (-0800) Subject: preprocessor: Deferred macro support X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=62c5ea5228857a910b38df91c2b0fe28f4d1ddc8;p=gcc.git 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. --- diff --git a/libcpp/include/cpplib.h b/libcpp/include/cpplib.h index 692aee58d19..50d28dc9d5a 100644 --- a/libcpp/include/cpplib.h +++ b/libcpp/include/cpplib.h @@ -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; }; diff --git a/libcpp/macro.c b/libcpp/macro.c index 05755859cd6..cdb182112bc 100644 --- a/libcpp/macro.c +++ b/libcpp/macro.c @@ -3708,6 +3708,7 @@ _cpp_new_macro (cpp_reader *pfile, cpp_macro_kind kind, void *placement) macro->used = !CPP_OPTION (pfile, warn_unused_macros); macro->count = 0; macro->fun_like = 0; + macro->imported_p = false; macro->extra_tokens = 0; /* To suppress some diagnostics. */ macro->syshdr = pfile->buffer && pfile->buffer->sysp != 0; @@ -3791,6 +3792,8 @@ cpp_macro * cpp_get_deferred_macro (cpp_reader *pfile, cpp_hashnode *node, location_t loc) { + gcc_checking_assert (node->type == NT_USER_MACRO); + node->value.macro = pfile->cb.user_deferred_macro (pfile, loc, node); if (!node->value.macro) @@ -3807,11 +3810,9 @@ get_deferred_or_lazy_macro (cpp_reader *pfile, cpp_hashnode *node, if (!macro) { macro = cpp_get_deferred_macro (pfile, node, loc); - if (!macro) - return NULL; + gcc_checking_assert (!macro || !macro->lazy); } - - if (macro->lazy) + else if (macro->lazy) { pfile->cb.user_lazy_macro (pfile, macro, macro->lazy - 1); macro->lazy = 0;