From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2140) id 80A87385802F; Fri, 6 Oct 2023 04:29:44 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 80A87385802F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1696566584; bh=0cKKNIg0EA8sw/Cjmn6GvjuLKsB+snZFGO3bnAm9DTM=; h=From:To:Subject:Date:From; b=C6XXUdtEiI/lROM20rCcQKG4PoCuUkLXqcE6F4kIkjPpKf39AczAxv0LcALMu4hJ/ h7+pJLvwDcHH1udNaveKJaTUD5UJrGyKR89sQq2CJCpLXEp2tKydD7lXDjkh35SML2 j/RyKnRXCLQvHPTP72Mcmg1a7oor9BBtHiqCogXg= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Alexandre Oliva To: gcc-cvs@gcc.gnu.org Subject: [gcc(refs/users/aoliva/heads/testme)] strub: cope with identifier GCing X-Act-Checkin: gcc X-Git-Author: Alexandre Oliva X-Git-Refname: refs/users/aoliva/heads/testme X-Git-Oldrev: d42e4a102c8829eb732b40b88b6d1226d4d8d6fc X-Git-Newrev: da51e038ca5ba86c0d33170f7eb18beabe495456 Message-Id: <20231006042944.80A87385802F@sourceware.org> Date: Fri, 6 Oct 2023 04:29:44 +0000 (GMT) List-Id: https://gcc.gnu.org/g:da51e038ca5ba86c0d33170f7eb18beabe495456 commit da51e038ca5ba86c0d33170f7eb18beabe495456 Author: Alexandre Oliva 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"