diff mbox series

preprocessor: Deferred macro support

Message ID 0d67748d-5ab5-ad22-de3a-b2a147a828c5@acm.org
State New
Headers show
Series preprocessor: Deferred macro support | expand

Commit Message

Nathan Sidwell Dec. 14, 2020, 3:23 p.m. UTC
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.

pushing to trunk
diff mbox series

Patch

diff --git i/libcpp/include/cpplib.h w/libcpp/include/cpplib.h
index 692aee58d19..50d28dc9d5a 100644
--- i/libcpp/include/cpplib.h
+++ w/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 i/libcpp/macro.c w/libcpp/macro.c
index 05755859cd6..cdb182112bc 100644
--- i/libcpp/macro.c
+++ w/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;