From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTPS id 377543858C54 for ; Fri, 10 Mar 2023 09:05:07 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 377543858C54 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1678439106; h=from:from:reply-to:reply-to:subject:subject: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=jMRd4v8fycvcj5btWf167HRVPPM+3Rjnjgpw/EnMlN0=; b=JTDhcRi0/NXTRD71x89LQkzCq+Oz1LWLVzEr7GC4vulpNHydDtZUJcS/7PJlDR4wD2PCOA 3M/k4+5hKVAJKR0Lo9r/6Ypi320gjU0QxKZ96sCkgC8THVXYnqIddp7fSsgtui0CC3l8bS 4csRguJpVNGCYprB74vFHwU8+k6xzKY= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-358-RtHw7OapPMCYbuI_Dl81yw-1; Fri, 10 Mar 2023 04:05:05 -0500 X-MC-Unique: RtHw7OapPMCYbuI_Dl81yw-1 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 40638800B23; Fri, 10 Mar 2023 09:05:05 +0000 (UTC) Received: from tucnak.zalov.cz (unknown [10.39.192.16]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 020902026D4B; Fri, 10 Mar 2023 09:05:04 +0000 (UTC) Received: from tucnak.zalov.cz (localhost [127.0.0.1]) by tucnak.zalov.cz (8.17.1/8.17.1) with ESMTPS id 32A95203844603 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 10 Mar 2023 10:05:02 +0100 Received: (from jakub@localhost) by tucnak.zalov.cz (8.17.1/8.17.1/Submit) id 32A951hG844602; Fri, 10 Mar 2023 10:05:01 +0100 Date: Fri, 10 Mar 2023 10:05:01 +0100 From: Jakub Jelinek To: Richard Biener , Patrick Palka Cc: gcc-patches@gcc.gnu.org Subject: Patch ping - [PATCH] tree: Use comdat tree_code_{type,length} even for C++11/14 [PR108634] Message-ID: Reply-To: Jakub Jelinek References: MIME-Version: 1.0 In-Reply-To: X-Scanned-By: MIMEDefang 3.1 on 10.11.54.4 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Spam-Status: No, score=-3.4 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,KAM_SHORT,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE,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: 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 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,