[gcc(refs/users/aoliva/heads/testme)] strub: cope with identifier GCing
Alexandre Oliva
aoliva@gcc.gnu.org
Fri Oct 6 04:29:44 GMT 2023
https://gcc.gnu.org/g:da51e038ca5ba86c0d33170f7eb18beabe495456
commit da51e038ca5ba86c0d33170f7eb18beabe495456
Author: Alexandre Oliva <oliva@gnu.org>
Date: Thu Oct 5 02:32:15 2023 -0300
strub: cope with identifier GCing
Diff:
---
gcc/Makefile.in | 1 +
gcc/gengtype-lex.l | 3 ++
gcc/ipa-strub.cc | 83 ++++++++++++++++++++++++++++++++----------------------
3 files changed, 54 insertions(+), 33 deletions(-)
diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index 93b7ff2a502..987a6a769ec 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -2846,6 +2846,7 @@ GTFILES = $(CPPLIB_H) $(srcdir)/input.h $(srcdir)/coretypes.h \
$(srcdir)/sanopt.cc \
$(srcdir)/sancov.cc \
$(srcdir)/ipa-devirt.cc \
+ $(srcdir)/ipa-strub.cc \
$(srcdir)/internal-fn.h \
$(srcdir)/calls.cc \
$(srcdir)/omp-general.h \
diff --git a/gcc/gengtype-lex.l b/gcc/gengtype-lex.l
index 34837d9dc9a..a7bb44cf2b9 100644
--- a/gcc/gengtype-lex.l
+++ b/gcc/gengtype-lex.l
@@ -165,6 +165,9 @@ CXX_KEYWORD inline|public:|private:|protected:|template|operator|friend|static|m
[(){},*:<>;=%/|+\!\?\.-] { return yytext[0]; }
/* ignore pp-directives */
+^{HWS}"#"{HWS}[a-z_]+([^\n]*"\\"\n)+[^\n]*\n {
+ update_lineno (yytext, yyleng);
+}
^{HWS}"#"{HWS}[a-z_]+[^\n]*\n {lexer_line.line++;}
. {
diff --git a/gcc/ipa-strub.cc b/gcc/ipa-strub.cc
index 876828ad431..67de14adcd1 100644
--- a/gcc/ipa-strub.cc
+++ b/gcc/ipa-strub.cc
@@ -170,29 +170,42 @@ get_strub_attr_from_decl (tree decl)
return get_strub_attr_from_type (TREE_TYPE (decl));
}
+#define STRUB_ID_COUNT 8
+#define STRUB_IDENT_COUNT 3
+#define STRUB_TYPE_COUNT 5
+
+#define STRUB_ID_BASE 0
+#define STRUB_IDENT_BASE (STRUB_ID_BASE + STRUB_ID_COUNT)
+#define STRUB_TYPE_BASE (STRUB_IDENT_BASE + STRUB_IDENT_COUNT)
+#define STRUB_CACHE_SIZE (STRUB_TYPE_BASE + STRUB_TYPE_COUNT)
+
+/* Keep the strub mode and temp identifiers and types from being GC'd. */
+static GTY((cache)) tree strub_cache[STRUB_CACHE_SIZE];
+
/* Define a function to cache identifier ID, to be used as a strub attribute
parameter for a strub mode named after NAME. */
-#define DEF_STRUB_IDS(NAME, ID) \
-static inline tree get_strub_mode_id_ ## NAME () { \
- static tree identifier = NULL_TREE; \
- if (!identifier) \
- identifier = get_identifier (ID); \
- return identifier; \
+#define DEF_STRUB_IDS(IDX, NAME, ID) \
+static inline tree get_strub_mode_id_ ## NAME () { \
+ int idx = STRUB_ID_BASE + IDX; \
+ tree identifier = strub_cache[idx]; \
+ if (!identifier) \
+ strub_cache[idx] = identifier = get_identifier (ID); \
+ return identifier; \
}
/* Same as DEF_STRUB_IDS, but use the string expansion of NAME as ID. */
-#define DEF_STRUB_ID(NAME) \
-DEF_STRUB_IDS (NAME, #NAME)
+#define DEF_STRUB_ID(IDX, NAME) \
+ DEF_STRUB_IDS (IDX, NAME, #NAME)
/* Define functions for each of the strub mode identifiers.
Expose dashes rather than underscores. */
-DEF_STRUB_ID (disabled)
-DEF_STRUB_IDS (at_calls, "at-calls")
-DEF_STRUB_ID (internal)
-DEF_STRUB_ID (callable)
-DEF_STRUB_ID (wrapped)
-DEF_STRUB_ID (wrapper)
-DEF_STRUB_ID (inlinable)
-DEF_STRUB_IDS (at_calls_opt, "at-calls-opt")
+DEF_STRUB_ID (0, disabled)
+DEF_STRUB_IDS (1, at_calls, "at-calls")
+DEF_STRUB_ID (2, internal)
+DEF_STRUB_ID (3, callable)
+DEF_STRUB_ID (4, wrapped)
+DEF_STRUB_ID (5, wrapper)
+DEF_STRUB_ID (6, inlinable)
+DEF_STRUB_IDS (7, at_calls_opt, "at-calls-opt")
/* Release the temporary macro names. */
#undef DEF_STRUB_IDS
@@ -1604,31 +1617,32 @@ public:
virtual unsigned int execute (function *);
/* Define on demand and cache some types we use often. */
-#define DEF_TYPE(NAME, INIT) \
+#define DEF_TYPE(IDX, NAME, INIT) \
static inline tree get_ ## NAME () { \
- static tree type = NULL_TREE; \
+ int idx = STRUB_TYPE_BASE + IDX; \
+ static tree type = strub_cache[idx]; \
if (!type) \
- type = (INIT); \
+ strub_cache[idx] = type = (INIT); \
return type; \
}
/* Use a distinct ptr_type_node to denote the watermark, so that we can
recognize it in arg lists and avoid modifying types twice. */
- DEF_TYPE (wmt, build_variant_type_copy (ptr_type_node))
+ DEF_TYPE (0, wmt, build_variant_type_copy (ptr_type_node))
- DEF_TYPE (pwmt, build_reference_type (get_wmt ()))
+ DEF_TYPE (1, pwmt, build_reference_type (get_wmt ()))
- DEF_TYPE (qpwmt,
+ DEF_TYPE (2, qpwmt,
build_qualified_type (get_pwmt (),
TYPE_QUAL_RESTRICT
/* | TYPE_QUAL_CONST */))
- DEF_TYPE (qptr,
+ DEF_TYPE (3, qptr,
build_qualified_type (ptr_type_node,
TYPE_QUAL_RESTRICT
| TYPE_QUAL_CONST))
- DEF_TYPE (qpvalst,
+ DEF_TYPE (4, qpvalst,
build_qualified_type (build_reference_type
(va_list_type_node),
TYPE_QUAL_RESTRICT
@@ -1697,17 +1711,18 @@ public:
#undef DEF_SS_BUILTIN
/* Define strub identifiers on demand. */
-#define DEF_IDENT(NAME) \
- static inline tree get_ ## NAME () { \
- static tree identifier = NULL_TREE; \
- if (!identifier) \
- identifier = get_identifier (".strub." #NAME); \
- return identifier; \
+#define DEF_IDENT(IDX, NAME) \
+ static inline tree get_ ## NAME () { \
+ int idx = STRUB_IDENT_BASE + IDX; \
+ tree identifier = strub_cache[idx]; \
+ if (!identifier) \
+ strub_cache[idx] = identifier = get_identifier (".strub." #NAME); \
+ return identifier; \
}
- DEF_IDENT (watermark_ptr)
- DEF_IDENT (va_list_ptr)
- DEF_IDENT (apply_args)
+ DEF_IDENT (0, watermark_ptr)
+ DEF_IDENT (1, va_list_ptr)
+ DEF_IDENT (2, apply_args)
#undef DEF_IDENT
@@ -3432,3 +3447,5 @@ make_pass_ipa_strub (gcc::context *ctxt)
{
return new pass_ipa_strub (ctxt);
}
+
+#include "gt-ipa-strub.h"
More information about the Gcc-cvs
mailing list