From patchwork Fri Aug 23 14:36:16 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Hubicka X-Patchwork-Id: 269472 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "localhost", Issuer "www.qmailtoaster.com" (not verified)) by ozlabs.org (Postfix) with ESMTPS id 19CCC2C00A2 for ; Sat, 24 Aug 2013 00:36:27 +1000 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:cc:subject:message-id:references:mime-version :content-type:in-reply-to; q=dns; s=default; b=xc6GVM5mmUkis5vcw ci95ExTIL29d1NHR1zIVyGH4wuLLYxxJ0OcuZxf+xyUtcM2ZdCZWtuRCRRZpjEog +MovCAGlh0vKysjuC5KibLN47b/+OOjwjZanxw0508P+q0K60fxpTEj22wVG6KMz Ng221CqO5bFOZg+j81C2/ZVthM= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:cc:subject:message-id:references:mime-version :content-type:in-reply-to; s=default; bh=vn8UWxpRQrYrtofjPcxqlnl exXM=; b=ilLvqSlJ97BO8/RLKs14bVa+1zR2i6p2HDzHccc+jE1pvEV79ubbfRa 0MjdlBMwcOfSRpg2S03W+73bsLFeGUgnwzQBoPqVzNLxjAZ6Q8sHBfau1G6szq84 ByIz9Dv5IMcmLB9sVaVLptoOFhBA98z4Bvl1T5EFHVxBgKA0xpLA= Received: (qmail 23302 invoked by alias); 23 Aug 2013 14:36:20 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 23287 invoked by uid 89); 23 Aug 2013 14:36:20 -0000 X-Spam-SWARE-Status: No, score=-5.4 required=5.0 tests=AWL, BAYES_00, KHOP_RCVD_UNTRUST, RCVD_IN_DNSWL_LOW, RCVD_IN_HOSTKARMA_NO, RCVD_IN_HOSTKARMA_W, RCVD_IN_HOSTKARMA_WL, RP_MATCHES_RCVD autolearn=ham version=3.3.2 Received: from nikam.ms.mff.cuni.cz (HELO nikam.ms.mff.cuni.cz) (195.113.20.16) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Fri, 23 Aug 2013 14:36:19 +0000 Received: by nikam.ms.mff.cuni.cz (Postfix, from userid 16202) id D42D15433AE; Fri, 23 Aug 2013 16:36:16 +0200 (CEST) Date: Fri, 23 Aug 2013 16:36:16 +0200 From: Jan Hubicka To: Jason Merrill Cc: Jan Hubicka , gcc-patches@gcc.gnu.org Subject: Re: [C++ patch] Move FINAL flag to middle-end trees. Message-ID: <20130823143616.GA27462@kam.mff.cuni.cz> References: <20130822095937.GF16124@kam.mff.cuni.cz> <52162B9B.5060905@redhat.com> <20130822152254.GC19256@kam.mff.cuni.cz> <521769A8.3010204@redhat.com> <20130823135755.GB22972@kam.mff.cuni.cz> <521770DA.300@redhat.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <521770DA.300@redhat.com> User-Agent: Mutt/1.5.20 (2009-06-14) > On 08/23/2013 09:57 AM, Jan Hubicka wrote: > >Ok, I will prepare variant using public_flag of BINFO that seeems unused. > >I.e. having BINFO_FINAL_P and C++ specific macro > >CLASSTYPE_FINAL(t) as BINFO_FINAL_P (TYPE_BINFO (t)). > > Sounds good. Hi, this is patch I am testing. Does it look OK? I have run across the following testcase: namespace { class A { public: virtual int foo(void) { return 0; } }; } class A *b; main() { return b->foo(); } here I now can devirtualize b->foo into A because A is in anonymous namespace. We however won't remove b because it is externally visible. Is it valid to bring b local based on fact that A is anonymous and thus no valid C++ program can read it? The pointer type probably isn't anonymous anymore? Honza * cp-tree.h (struct lang_type_class): Free is_final bit. (CLASSTYPE_FINAL): Define using BINFO_FINAL_P. (DECL_FINAL_P): Remove. * pt.c (instantiate_class_template_1): Guard CLASSTYPE_FINAL by CLASS_TYPE_P * tree.h (tree_base): Add BINFO_FINAL_P docs (BINFO_FINAL_P): Define. (tree_decl_with_vis): One bit is taken for FINAL. (DECL_FINAL_P): New. Index: cp/cp-tree.h =================================================================== --- cp/cp-tree.h (revision 201910) +++ cp/cp-tree.h (working copy) @@ -1416,7 +1416,6 @@ struct GTY(()) lang_type_class { unsigned has_complex_move_ctor : 1; unsigned has_complex_move_assign : 1; unsigned has_constexpr_ctor : 1; - unsigned is_final : 1; /* When adding a flag here, consider whether or not it ought to apply to a template instance if it applies to the template. If @@ -1425,7 +1424,7 @@ struct GTY(()) lang_type_class { /* There are some bits left to fill out a 32-bit word. Keep track of this by updating the size of this bitfield whenever you add or remove a flag. */ - unsigned dummy : 2; + unsigned dummy : 3; tree primary_base; vec *vcall_indices; @@ -1535,7 +1534,7 @@ struct GTY((variable_size)) lang_type { /* Nonzero means that NODE (a class type) is final */ #define CLASSTYPE_FINAL(NODE) \ - (LANG_TYPE_CLASS_CHECK (NODE)->is_final) + BINFO_FINAL_P (TYPE_BINFO (NODE)) /* Nonzero means that this _CLASSTYPE node overloads operator=(X&). */ @@ -2400,10 +2399,6 @@ struct GTY((variable_size)) lang_decl { an override virt-specifier */ #define DECL_OVERRIDE_P(NODE) (TREE_LANG_FLAG_0 (NODE)) -/* True (in a FUNCTION_DECL) if NODE is a function declared with - a final virt-specifier */ -#define DECL_FINAL_P(NODE) (TREE_LANG_FLAG_1 (NODE)) - /* The thunks associated with NODE, a FUNCTION_DECL. */ #define DECL_THUNKS(NODE) \ (DECL_VIRTUAL_P (NODE) ? LANG_DECL_FN_CHECK (NODE)->context : NULL_TREE) Index: cp/pt.c =================================================================== --- cp/pt.c (revision 201910) +++ cp/pt.c (working copy) @@ -8730,7 +8730,8 @@ instantiate_class_template_1 (tree type) /* Adjust visibility for template arguments. */ determine_visibility (TYPE_MAIN_DECL (type)); } - CLASSTYPE_FINAL (type) = CLASSTYPE_FINAL (pattern); + if (CLASS_TYPE_P (type)) + CLASSTYPE_FINAL (type) = CLASSTYPE_FINAL (pattern); pbinfo = TYPE_BINFO (pattern); Index: tree.h =================================================================== --- tree.h (revision 201910) +++ tree.h (working copy) @@ -563,6 +563,9 @@ struct GTY(()) tree_base { TRANSACTION_EXPR_RELAXED in TRANSACTION_EXPR + BINFO_FINAL_P in + BINFO + private_flag: TREE_PRIVATE in @@ -2314,6 +2317,10 @@ enum cv_qualifier #define TYPE_CONTAINS_PLACEHOLDER_INTERNAL(NODE) \ (TYPE_CHECK (NODE)->type_common.contains_placeholder_bits) +/* Nonzero if RECORD_TYPE represents a final derivation of class. */ +#define BINFO_FINAL_P(NODE) \ + (TREE_BINFO_CHECK (NODE)->base.public_flag) + /* The debug output functions use the symtab union field to store information specific to the debugging format. The different debug output hooks store different types in the union field. These three @@ -3224,7 +3231,9 @@ struct GTY(()) tree_decl_with_vis { unsigned init_priority_p : 1; /* Used by C++ only. Might become a generic decl flag. */ unsigned shadowed_for_var_p : 1; - /* 14 unused bits. */ + /* Belong to FUNCTION_DECL exclusively. */ + unsigned final : 1; + /* 13 unused bits. */ }; extern tree decl_debug_expr_lookup (tree); @@ -3474,6 +3483,11 @@ extern vec **decl_debug_arg #define DECL_FUNCTION_VERSIONED(NODE)\ (FUNCTION_DECL_CHECK (NODE)->function_decl.versioned_function) +/* In FUNCTION_DECL that represent an virtual method this is set when + the method is final. */ +#define DECL_FINAL_P(NODE)\ + (FUNCTION_DECL_CHECK (NODE)->decl_with_vis.final) + /* FUNCTION_DECL inherits from DECL_NON_COMMON because of the use of the arguments/result/saved_tree fields by front ends. It was either inherit FUNCTION_DECL from non_common, or inherit non_common from FUNCTION_DECL,