]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
An API for lazy builtin macros.
authorNathan Sidwell <nathan@acm.org>
Fri, 3 Aug 2018 17:48:42 +0000 (17:48 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Fri, 3 Aug 2018 17:48:42 +0000 (17:48 +0000)
libcpp/
* include/libcpp.h (struct cpp_callbacks): Adjust
user_builtin_macro callback.
(cpp_define_lazily, cpp_define_lazy): Declare.
* macro.c (enter_macro_context, warn_of_redefinition): Adjust.
(cpp_define_lazily, cpp_define_lazy): Define.
(cpp_macro_definition): Adjust.
* pch.c (write_macrdef, save_macros): Likewise.
* directives.c (do_ifdef, do_ifndef): Adjust.
* expr.c (parse_defined): Likewise.
gcc/c-family/
* c-cppbuiltin.c (lazy_hex_fp_value): Adjust for API changes.
(builtin_define_with_hex_fp_valye): Likewise.

From-SVN: r263297

ChangeLog.name-lookup
gcc/c-family/c-cppbuiltin.c
libcpp/directives.c
libcpp/expr.c
libcpp/include/cpplib.h
libcpp/macro.c
libcpp/pch.c

index a5a6a0a027673b446460e6c70201d3e29632cdbb..2ddaa4a5d916acaa9a0917ad63fc1616efae8459 100644 (file)
@@ -1,3 +1,20 @@
+2018-08-03  Nathan Sidwell  <nathan@acm.org>
+
+       An API for lazy builtin macros.
+       libcpp/
+       * include/libcpp.h (struct cpp_callbacks): Adjust
+       user_builtin_macro callback.
+       (cpp_define_lazily, cpp_define_lazy): Declare.
+       * macro.c (enter_macro_context, warn_of_redefinition): Adjust.
+       (cpp_define_lazily, cpp_define_lazy): Define.
+       (cpp_macro_definition): Adjust.
+       * pch.c (write_macrdef, save_macros): Likewise.
+       * directives.c (do_ifdef, do_ifndef): Adjust.
+       * expr.c (parse_defined): Likewise.
+       gcc/c-family/
+       * c-cppbuiltin.c (lazy_hex_fp_value): Adjust for API changes.
+       (builtin_define_with_hex_fp_valye): Likewise.
+
 2018-08-02  Nathan Sidwell  <nathan@acm.org>
 
        libcpp/
index bdb5691d78a9bac7dae4186c085e9d3684e43b48..bc26d43dd568a508090e2da5171a9bb3c47cdac4 100644 (file)
@@ -1582,32 +1582,35 @@ static GTY(()) struct lazy_hex_fp_value_struct
 static GTY(()) int lazy_hex_fp_value_count;
 
 static bool
-lazy_hex_fp_value (cpp_reader *pfile ATTRIBUTE_UNUSED,
-                  cpp_hashnode *node)
+lazy_hex_fp_value (cpp_reader *pfile, cpp_hashnode *node, unsigned num)
 {
   REAL_VALUE_TYPE real;
   char dec_str[64], buf1[256];
-  unsigned int idx;
-  if (node->value.builtin < BT_FIRST_USER
-      || (int) node->value.builtin >= BT_FIRST_USER + lazy_hex_fp_value_count)
+  if (num < unsigned (BT_FIRST_USER)
+      || num >= unsigned (BT_FIRST_USER + lazy_hex_fp_value_count))
     return false;
 
-  idx = node->value.builtin - BT_FIRST_USER;
-  real_from_string (&real, lazy_hex_fp_values[idx].hex_str);
+  num -= BT_FIRST_USER;
+  real_from_string (&real, lazy_hex_fp_values[num].hex_str);
   real_to_decimal_for_mode (dec_str, &real, sizeof (dec_str),
-                           lazy_hex_fp_values[idx].digits, 0,
-                           lazy_hex_fp_values[idx].mode);
-
-  sprintf (buf1, "%s%s", dec_str, lazy_hex_fp_values[idx].fp_suffix);
-  node->flags &= ~(NODE_BUILTIN | NODE_USED);
-  node->value.macro = lazy_hex_fp_values[idx].macro;
-  for (idx = 0; idx < node->value.macro->count; idx++)
-    if (node->value.macro->exp.tokens[idx].type == CPP_NUMBER)
-      break;
-  gcc_assert (idx < node->value.macro->count);
-  node->value.macro->exp.tokens[idx].val.str.len = strlen (buf1);
-  node->value.macro->exp.tokens[idx].val.str.text
-    = (const unsigned char *) ggc_strdup (buf1);
+                           lazy_hex_fp_values[num].digits, 0,
+                           lazy_hex_fp_values[num].mode);
+
+  size_t len
+    = sprintf (buf1, "%s%s", dec_str, lazy_hex_fp_values[num].fp_suffix);
+  gcc_assert (len < sizeof (buf1));
+  cpp_macro *macro = lazy_hex_fp_values[num].macro;
+  for (unsigned idx = 0; idx < macro->count; idx++)
+    if (macro->exp.tokens[idx].type == CPP_NUMBER)
+      {
+       macro->exp.tokens[idx].val.str.len = len;
+       macro->exp.tokens[idx].val.str.text
+         = (const unsigned char *) ggc_strdup (buf1);
+       break;
+      }
+
+  cpp_define_lazy (pfile, node, macro);
+  
   return true;
 }
 
@@ -1639,10 +1642,9 @@ builtin_define_with_hex_fp_value (const char *macro,
       lazy_hex_fp_values[lazy_hex_fp_value_count].mode = TYPE_MODE (type);
       lazy_hex_fp_values[lazy_hex_fp_value_count].digits = digits;
       lazy_hex_fp_values[lazy_hex_fp_value_count].fp_suffix = fp_suffix;
-      lazy_hex_fp_values[lazy_hex_fp_value_count].macro = node->value.macro;
-      node->flags |= NODE_BUILTIN;
-      node->value.builtin
-       = (enum cpp_builtin_type) (BT_FIRST_USER + lazy_hex_fp_value_count);
+      lazy_hex_fp_values[lazy_hex_fp_value_count].macro
+       = cpp_define_lazily (parse_in, node,
+                            BT_FIRST_USER + lazy_hex_fp_value_count);
       lazy_hex_fp_value_count++;
       return;
     }
index 9232f8383d7c8a5f4ae112ceab731da42bc37be5..6eb37a78ccf4e32413b7e9a9c80b7dd5dc91aab8 100644 (file)
@@ -1969,7 +1969,8 @@ do_ifdef (cpp_reader *pfile)
                {
                  if ((node->flags & NODE_BUILTIN)
                      && pfile->cb.user_builtin_macro)
-                   pfile->cb.user_builtin_macro (pfile, node);
+                   pfile->cb.user_builtin_macro (pfile, node,
+                                                 node->value.builtin);
                  if (pfile->cb.used_define)
                    pfile->cb.used_define (pfile, pfile->directive_line, node);
                }
@@ -2015,7 +2016,8 @@ do_ifndef (cpp_reader *pfile)
                {
                  if ((node->flags & NODE_BUILTIN)
                      && pfile->cb.user_builtin_macro)
-                   pfile->cb.user_builtin_macro (pfile, node);
+                   pfile->cb.user_builtin_macro (pfile, node,
+                                                 node->value.builtin);
                  if (pfile->cb.used_define)
                    pfile->cb.used_define (pfile, pfile->directive_line, node);
                }
index 36c3fc474d669adebaa89a8c4fe35bed1e3a78e6..897ffe710aa1a7da2dc2537022cea3f79e5390df 100644 (file)
@@ -1072,7 +1072,7 @@ parse_defined (cpp_reader *pfile)
            {
              if ((node->flags & NODE_BUILTIN)
                  && pfile->cb.user_builtin_macro)
-               pfile->cb.user_builtin_macro (pfile, node);
+               pfile->cb.user_builtin_macro (pfile, node, node->value.builtin);
              if (pfile->cb.used_define)
                pfile->cb.used_define (pfile, pfile->directive_line, node);
            }
index 810e3bd45f69831dd7cb503fac773875516801bc..8b5b10595020425d3c1982e1bb030ad7d8122460 100644 (file)
@@ -605,13 +605,14 @@ struct cpp_callbacks
   int (*has_attribute) (cpp_reader *);
 
   /* Callback that can change a user builtin into normal macro.  */
-  bool (*user_builtin_macro) (cpp_reader *, cpp_hashnode *);
+  bool (*user_builtin_macro) (cpp_reader *, cpp_hashnode *, unsigned);
 
   /* Callback to parse SOURCE_DATE_EPOCH from environment.  */
   time_t (*get_source_date_epoch) (cpp_reader *);
 
   /* Callback for providing suggestions for misspelled directives.  */
-  const char *(*get_suggestion) (cpp_reader *, const char *, const char *const *);
+  const char *(*get_suggestion) (cpp_reader *, const char *,
+                                const char *const *);
 
   /* Callback for when a comment is encountered, giving the location
      of the opening slash, a pointer to the content (which is not
@@ -919,6 +920,11 @@ extern void cpp_assert (cpp_reader *, const char *);
 extern void cpp_undef (cpp_reader *, const char *);
 extern void cpp_unassert (cpp_reader *, const char *);
 
+/* Mark a node as a lazily defined macro.  */
+extern cpp_macro *cpp_define_lazily (cpp_reader *, cpp_hashnode *node, int);
+/* Supply the definition of a lazily-defined macro.  */
+extern void cpp_define_lazy (cpp_reader *, cpp_hashnode *node, cpp_macro *);
+
 /* Undefine all macros and assertions.  */
 extern void cpp_undef_all (cpp_reader *);
 
index 96841bc6ecfbafe52fed655bdc1642a694404432..a5205e961ac48202b13e2f348f4bccbe69395a97 100644 (file)
@@ -1277,7 +1277,7 @@ enter_macro_context (cpp_reader *pfile, cpp_hashnode *node,
     {
       node->flags |= NODE_USED;
       if ((!pfile->cb.user_builtin_macro
-          || !pfile->cb.user_builtin_macro (pfile, node))
+          || !pfile->cb.user_builtin_macro (pfile, node, node->value.builtin))
          && pfile->cb.used_define)
        pfile->cb.used_define (pfile, pfile->directive_line, node);
     }
@@ -3011,7 +3011,7 @@ warn_of_redefinition (cpp_reader *pfile, cpp_hashnode *node,
      unless Wbuiltin-macro-redefined.  */
   if (node->flags & NODE_BUILTIN
       && (!pfile->cb.user_builtin_macro
-         || !pfile->cb.user_builtin_macro (pfile, node)))
+         || !pfile->cb.user_builtin_macro (pfile, node, node->value.builtin)))
     return CPP_OPTION (pfile, warn_builtin_macro_redefined);
 
   /* Redefinitions of conditional (context-sensitive) macros, on
@@ -3564,6 +3564,26 @@ _cpp_create_definition (cpp_reader *pfile, cpp_hashnode *node)
   return true;
 }
 
+extern cpp_macro *
+cpp_define_lazily (cpp_reader *, cpp_hashnode *node, int num)
+{
+  cpp_macro *macro = node->value.macro;
+
+  node->type = NT_MACRO;
+  node->flags |= NODE_BUILTIN;
+
+  node->value.builtin = (enum cpp_builtin_type) (num);
+
+  return macro;
+}
+
+extern void
+cpp_define_lazy (cpp_reader *, cpp_hashnode *node, cpp_macro *macro)
+{
+  node->flags &= ~(NODE_BUILTIN | NODE_USED);
+  node->value.macro = macro;
+}
+
 /* Warn if a token in STRING matches one of a function-like MACRO's
    parameters.  */
 static void
@@ -3640,7 +3660,7 @@ cpp_macro_definition (cpp_reader *pfile, cpp_hashnode *node)
     {
       if (node->type != NT_MACRO
          || !pfile->cb.user_builtin_macro
-          || !pfile->cb.user_builtin_macro (pfile, node))
+          || !pfile->cb.user_builtin_macro (pfile, node, node->value.builtin))
        {
          cpp_error (pfile, CPP_DL_ICE,
                     "invalid hash type %d in cpp_macro_definition",
index 88bbdc5eb2a2181955fa8ddfdc56ffcb08da76df..24acacdf54c149917889a1e0ef650f6daffd15ce 100644 (file)
@@ -62,7 +62,7 @@ write_macdef (cpp_reader *pfile, cpp_hashnode *hn, void *file_p)
       if (hn->flags & NODE_BUILTIN)
        {
          if (!pfile->cb.user_builtin_macro
-             || !pfile->cb.user_builtin_macro (pfile, hn))
+             || !pfile->cb.user_builtin_macro (pfile, hn, hn->value.builtin))
            return 1;
        }
       else if (hn->value.macro->kind == cmk_assert)
@@ -762,7 +762,7 @@ save_macros (cpp_reader *r, cpp_hashnode *h, void *data_p)
   if (h->flags & NODE_BUILTIN)
     {
       if (r->cb.user_builtin_macro)
-       r->cb.user_builtin_macro (r, h);
+       r->cb.user_builtin_macro (r, h, h->value.builtin);
     }
   else if (h->value.macro->kind == cmk_assert)
     return 1;