From: Nathan Sidwell Date: Fri, 3 Aug 2018 17:48:42 +0000 (+0000) Subject: An API for lazy builtin macros. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=316e19eeb7312e10660213153f01970d3d3f08e6;p=thirdparty%2Fgcc.git 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. From-SVN: r263297 --- diff --git a/ChangeLog.name-lookup b/ChangeLog.name-lookup index a5a6a0a02767..2ddaa4a5d916 100644 --- a/ChangeLog.name-lookup +++ b/ChangeLog.name-lookup @@ -1,3 +1,20 @@ +2018-08-03 Nathan Sidwell + + 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 libcpp/ diff --git a/gcc/c-family/c-cppbuiltin.c b/gcc/c-family/c-cppbuiltin.c index bdb5691d78a9..bc26d43dd568 100644 --- a/gcc/c-family/c-cppbuiltin.c +++ b/gcc/c-family/c-cppbuiltin.c @@ -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; } diff --git a/libcpp/directives.c b/libcpp/directives.c index 9232f8383d7c..6eb37a78ccf4 100644 --- a/libcpp/directives.c +++ b/libcpp/directives.c @@ -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); } diff --git a/libcpp/expr.c b/libcpp/expr.c index 36c3fc474d66..897ffe710aa1 100644 --- a/libcpp/expr.c +++ b/libcpp/expr.c @@ -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); } diff --git a/libcpp/include/cpplib.h b/libcpp/include/cpplib.h index 810e3bd45f69..8b5b10595020 100644 --- a/libcpp/include/cpplib.h +++ b/libcpp/include/cpplib.h @@ -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 *); diff --git a/libcpp/macro.c b/libcpp/macro.c index 96841bc6ecfb..a5205e961ac4 100644 --- a/libcpp/macro.c +++ b/libcpp/macro.c @@ -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", diff --git a/libcpp/pch.c b/libcpp/pch.c index 88bbdc5eb2a2..24acacdf54c1 100644 --- a/libcpp/pch.c +++ b/libcpp/pch.c @@ -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;