From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) by sourceware.org (Postfix) with ESMTPS id 1DF8E3858C2D for ; Fri, 10 Mar 2023 09:32:15 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 1DF8E3858C2D Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=suse.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.de Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id EB1D4229BE; Fri, 10 Mar 2023 09:32:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1678440733; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=mSm8BfWoqjYYR6Tp0KmwTWXJ5Evsq3RLqmqkudHujVE=; b=piXc0nIzDaTQ0G90UlXV//I6wlh3W7dkj+wGUiB4fr3UxB8eABx11VLSdwprtscY9FmiJH JTHScYy4/E5ty0+e66wtF57wopnt2HvqSBVZD4fZ6bjE1MMVBqK679mZ+zLdOifcy7Z2Eb xmJqbt7Bfj079hG++a9rmfT9kxa+pWE= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1678440733; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=mSm8BfWoqjYYR6Tp0KmwTWXJ5Evsq3RLqmqkudHujVE=; b=kvUsUxnoQkn82yosE9n8tj7MSRNA6t5pdzQSkkFhJPhHNOSfri31BsBxzCMuUa4dBrhQx8 4/Te5ztfEqKuSMDg== Received: from wotan.suse.de (wotan.suse.de [10.160.0.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by relay2.suse.de (Postfix) with ESMTPS id DCF372C141; Fri, 10 Mar 2023 09:32:13 +0000 (UTC) Date: Fri, 10 Mar 2023 09:32:13 +0000 (UTC) From: Richard Biener To: Jakub Jelinek cc: Patrick Palka , gcc-patches@gcc.gnu.org Subject: Re: Patch ping - [PATCH] tree: Use comdat tree_code_{type,length} even for C++11/14 [PR108634] In-Reply-To: Message-ID: References: User-Agent: Alpine 2.22 (LSU 394 2020-01-19) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII X-Spam-Status: No, score=-5.0 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,KAM_SHORT,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: On Fri, 10 Mar 2023, Jakub Jelinek wrote: > Hi! > > I'd like to ping this patch, which has been successfully > bootstrapped/regtested on x86_64-linux and i686-linux: > > https://gcc.gnu.org/pipermail/gcc-patches/2023-February/611180.html > - PR108634 - P3 - tree: Use comdat tree_code_{type,length} even for C++11/14 OK. Thanks, Richard. > Thanks > Jakub > > On Thu, Feb 02, 2023 at 03:30:29PM +0100, Jakub Jelinek via Gcc-patches wrote: > > 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. > > > > Tested in non-bootstrapped build with both -std=gnu++17 and -std=gnu++11, > > ok for trunk if it passes full bootstrap/regtest? > > > > 2023-02-02 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. > > > > --- gcc/tree-core.h.jj 2023-01-27 10:51:27.575399052 +0100 > > +++ gcc/tree-core.h 2023-02-02 15:06:05.048665279 +0100 > > @@ -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 > > > > /* 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; > > --- gcc/tree.h.jj 2023-01-27 20:09:16.183970583 +0100 > > +++ gcc/tree.h 2023-02-02 14:37:17.255004291 +0100 > > @@ -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. */ > > --- gcc/tree.cc.jj 2023-02-02 10:54:44.302473853 +0100 > > +++ gcc/tree.cc 2023-02-02 14:20:58.712251654 +0100 > > @@ -74,34 +74,6 @@ along with GCC; see the file COPYING3. > > #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, > > -- Richard Biener SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg, Germany; GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman; HRB 36809 (AG Nuernberg)