From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2153) id A114E3858281; Fri, 10 Mar 2023 09:40:29 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A114E3858281 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1678441229; bh=fsF/iZoQDOq7HKgDjSOCT/Qp7gPy929v5yxuZHdS8TM=; h=From:To:Subject:Date:From; b=jZcl7eCQmyT+SJwpdIxO9Qy+SzGWa9NO7i++jY3I8E4Q5uyco/++R/bUUg+AEYbaZ UlkFtS+wdSwUwWJvxB5fqzhIj+b1YaqqcGI9P1CKFXFRXjHmgVSPd+7l818KTK8JPD s8hK/NF3TqHEsf3idqmvCQP+Vz/MDraOdPxKMvDs= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Jakub Jelinek To: gcc-cvs@gcc.gnu.org Subject: [gcc r13-6577] tree: Use comdat tree_code_{type, length} even for C++11/14 [PR108634] X-Act-Checkin: gcc X-Git-Author: Jakub Jelinek X-Git-Refname: refs/heads/master X-Git-Oldrev: 2eb0191aa104badf3cab127f7f87d371c0fef92b X-Git-Newrev: 4c599ae6e081496466cada6f97b0d4687a6d765a Message-Id: <20230310094029.A114E3858281@sourceware.org> Date: Fri, 10 Mar 2023 09:40:29 +0000 (GMT) List-Id: https://gcc.gnu.org/g:4c599ae6e081496466cada6f97b0d4687a6d765a commit r13-6577-g4c599ae6e081496466cada6f97b0d4687a6d765a Author: Jakub Jelinek Date: Fri Mar 10 10:38:49 2023 +0100 tree: Use comdat tree_code_{type,length} even for C++11/14 [PR108634] The recent change to undo the tree_code_type/tree_code_length excessive duplication apparently broke building the Linux kernel plugin. While it is certainly desirable that GCC plugins are built with the same compiler as GCC has been built and with the same options (at least the important ones), it might be hard to arrange that, e.g. if gcc is built using a cross-compiler but the plugin then built natively, or GCC isn't bootstrapped for other reasons, or just as in the kernel case they were building the plugin with -std=gnu++11 while the bootstrapped GCC has been built without any such option and so with whatever the compiler defaulted to. For C++17 and later tree_code_{type,length} are UNIQUE symbols with those assembler names, while for C++11/14 they were _ZL14tree_code_type and _ZL16tree_code_length. The following patch uses a comdat var for those even for C++11/14 as suggested by Maciej Cencora. Relying on weak attribute is not an option because not all hosts support it and there are non-GNU system compilers. While we could use it unconditionally, I think defining a template just to make it comdat is weird, and the compiler itself is always built with the same compiler. Plugins, being separate shared libraries, will have a separate copy of the arrays if they are ODR-used in the plugin, so there is not a big deal if e.g. cc1plus uses tree_code_type while plugin uses _ZN19tree_code_type_tmplILi0EE14tree_code_typeE or vice versa. 2023-03-10 Jakub Jelinek PR plugins/108634 * tree-core.h (tree_code_type, tree_code_length): For C++11 or C++14, don't declare as extern const arrays. (tree_code_type_tmpl, tree_code_length_tmpl): New types with static constexpr member arrays for C++11 or C++14. * tree.h (TREE_CODE_CLASS): For C++11 or C++14 use tree_code_type_tmpl <0>::tree_code_type instead of tree_code_type. (TREE_CODE_LENGTH): For C++11 or C++14 use tree_code_length_tmpl <0>::tree_code_length instead of tree_code_length. * tree.cc (tree_code_type, tree_code_length): Remove. Diff: --- gcc/tree-core.h | 33 +++++++++++++++++++++++++-------- gcc/tree.cc | 28 ---------------------------- gcc/tree.h | 10 ++++++++++ 3 files changed, 35 insertions(+), 36 deletions(-) diff --git a/gcc/tree-core.h b/gcc/tree-core.h index acd8deea34e..fd2be57b78c 100644 --- a/gcc/tree-core.h +++ b/gcc/tree-core.h @@ -2285,19 +2285,27 @@ struct floatn_type_info { extern bool tree_contains_struct[MAX_TREE_CODES][64]; /* Class of tree given its code. */ -#if __cpp_inline_variables >= 201606L #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE, #define END_OF_BASE_TREE_CODES tcc_exceptional, +#if __cpp_inline_variables < 201606L +template +struct tree_code_type_tmpl { + static constexpr enum tree_code_class tree_code_type[] = { +#include "all-tree.def" + }; +}; + +template +constexpr enum tree_code_class tree_code_type_tmpl::tree_code_type[]; +#else constexpr inline enum tree_code_class tree_code_type[] = { #include "all-tree.def" }; +#endif #undef DEFTREECODE #undef END_OF_BASE_TREE_CODES -#else -extern const enum tree_code_class tree_code_type[]; -#endif /* Each tree code class has an associated string representation. These must correspond to the tree_code_class entries. */ @@ -2305,18 +2313,27 @@ extern const char *const tree_code_class_strings[]; /* Number of argument-words in each kind of tree-node. */ -#if __cpp_inline_variables >= 201606L #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) LENGTH, #define END_OF_BASE_TREE_CODES 0, + +#if __cpp_inline_variables < 201606L +template +struct tree_code_length_tmpl { + static constexpr unsigned char tree_code_length[] = { +#include "all-tree.def" + }; +}; + +template +constexpr unsigned char tree_code_length_tmpl::tree_code_length[]; +#else constexpr inline unsigned char tree_code_length[] = { #include "all-tree.def" }; +#endif #undef DEFTREECODE #undef END_OF_BASE_TREE_CODES -#else -extern const unsigned char tree_code_length[]; -#endif /* Vector of all alias pairs for global symbols. */ extern GTY(()) vec *alias_pairs; diff --git a/gcc/tree.cc b/gcc/tree.cc index 41ccbf3b3cb..d17106e99a8 100644 --- a/gcc/tree.cc +++ b/gcc/tree.cc @@ -74,34 +74,6 @@ along with GCC; see the file COPYING3. If not see #include "asan.h" #include "ubsan.h" -#if __cpp_inline_variables < 201606L -/* Tree code classes. */ - -#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE, -#define END_OF_BASE_TREE_CODES tcc_exceptional, - -const enum tree_code_class tree_code_type[] = { -#include "all-tree.def" -}; - -#undef DEFTREECODE -#undef END_OF_BASE_TREE_CODES - -/* Table indexed by tree code giving number of expression - operands beyond the fixed part of the node structure. - Not used for types or decls. */ - -#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) LENGTH, -#define END_OF_BASE_TREE_CODES 0, - -const unsigned char tree_code_length[] = { -#include "all-tree.def" -}; - -#undef DEFTREECODE -#undef END_OF_BASE_TREE_CODES -#endif - /* Names of tree components. Used for printing out the tree and error messages. */ #define DEFTREECODE(SYM, NAME, TYPE, LEN) NAME, diff --git a/gcc/tree.h b/gcc/tree.h index 92ac0e6a214..91375f9652f 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -177,7 +177,12 @@ code_helper::is_builtin_fn () const #define TREE_CODE_CLASS_STRING(CLASS)\ tree_code_class_strings[(int) (CLASS)] +#if __cpp_inline_variables < 201606L +#define TREE_CODE_CLASS(CODE) \ + tree_code_type_tmpl <0>::tree_code_type[(int) (CODE)] +#else #define TREE_CODE_CLASS(CODE) tree_code_type[(int) (CODE)] +#endif /* Nonzero if NODE represents an exceptional code. */ @@ -271,7 +276,12 @@ code_helper::is_builtin_fn () const #define EXPR_P(NODE) IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (NODE))) +#if __cpp_inline_variables < 201606L +#define TREE_CODE_LENGTH(CODE) \ + tree_code_length_tmpl <0>::tree_code_length[(int) (CODE)] +#else #define TREE_CODE_LENGTH(CODE) tree_code_length[(int) (CODE)] +#endif /* Helper macros for math builtins. */