From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 16755 invoked by alias); 11 Mar 2011 04:23:44 -0000 Received: (qmail 16603 invoked by uid 22791); 11 Mar 2011 04:23:41 -0000 X-SWARE-Spam-Status: No, hits=-1.7 required=5.0 tests=AWL,BAYES_00,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (38.113.113.100) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 11 Mar 2011 04:23:35 +0000 Received: (qmail 1555 invoked from network); 11 Mar 2011 04:23:32 -0000 Received: from unknown (HELO codesourcery.com) (froydnj@127.0.0.2) by mail.codesourcery.com with ESMTPA; 11 Mar 2011 04:23:32 -0000 From: Nathan Froyd To: gcc-patches@gcc.gnu.org Cc: Nathan Froyd Subject: [PATCH 01/18] add typed_tree structure Date: Fri, 11 Mar 2011 04:24:00 -0000 Message-Id: <1299817406-16745-2-git-send-email-froydnj@codesourcery.com> In-Reply-To: <1299817406-16745-1-git-send-email-froydnj@codesourcery.com> References: <1299817406-16745-1-git-send-email-froydnj@codesourcery.com> X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2011-03/txt/msg00555.txt.bz2 The first step in removing TREE_CHAIN (and even TREE_TYPE) from a select few nodes is to create separate substructures for trees-with-type and trees-with-chain. Since trees-with-type but no chain are expected to be more common that vice versa, make the hierarchy reflect that. Modify a few macros to reflect the new inheritance structure, and add a new tree structure enum for the new structure. Make note that we support the new tree structure in the LTO streamer, even though we don't need to do anything about it yet. -Nathan gcc/ * tree.h (struct typed_tree): New. (struct tree_common): Include it instead of tree_base. (TREE_TYPE): Update for new location of type field. (TYPE_USER_ALIGN, TYPE_PACKED): Refer to base field directly. (DECL_USER_ALIGN, DECL_PACKED): Likewise. (union tree_node): Add typed field. * treestruct.def (TS_TYPED): New. * lto-streamer.c (check_handled_ts_structures): Handle it. * tree.c (MARK_TS_TYPED): New macro. (MARK_TS_COMMON): Call it instead of MARK_TS_BASE. diff --git a/gcc/lto-streamer.c b/gcc/lto-streamer.c index dba9d2d..546228c 100644 --- a/gcc/lto-streamer.c +++ b/gcc/lto-streamer.c @@ -270,6 +270,7 @@ check_handled_ts_structures (void) /* These are the TS_* structures that are either handled or explicitly ignored by the streamer routines. */ handled_p[TS_BASE] = true; + handled_p[TS_TYPED] = true; handled_p[TS_COMMON] = true; handled_p[TS_INT_CST] = true; handled_p[TS_REAL_CST] = true; diff --git a/gcc/tree.c b/gcc/tree.c index c947072..798bc08 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -356,9 +356,15 @@ initialize_tree_contains_struct (void) tree_contains_struct[C][TS_BASE] = 1; \ } while (0) -#define MARK_TS_COMMON(C) \ +#define MARK_TS_TYPED(C) \ do { \ MARK_TS_BASE (C); \ + tree_contains_struct[C][TS_TYPED] = 1; \ + } while (0) + +#define MARK_TS_COMMON(C) \ + do { \ + MARK_TS_TYPED (C); \ tree_contains_struct[C][TS_COMMON] = 1; \ } while (0) diff --git a/gcc/tree.h b/gcc/tree.h index a49e335..2f772e1 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -407,12 +407,16 @@ struct GTY(()) tree_base { unsigned address_space : 8; }; -struct GTY(()) tree_common { +struct GTY(()) typed_tree { struct tree_base base; - tree chain; tree type; }; +struct GTY(()) tree_common { + struct typed_tree typed; + tree chain; +}; + /* The following table lists the uses of each of the above flags and for which types of nodes they are defined. @@ -869,7 +873,7 @@ enum tree_node_structure_enum { In VECTOR_TYPE nodes, this is the type of the elements. */ #define TREE_TYPE(NODE) __extension__ \ (*({__typeof (NODE) const __t = (NODE); \ - &__t->common.type; })) + &__t->typed.type; })) extern void tree_contains_struct_check_failed (const_tree, const enum tree_node_structure_enum, @@ -2151,7 +2155,7 @@ extern enum machine_mode vector_type_mode (const_tree); /* 1 if the alignment for this type was requested by "aligned" attribute, 0 if it is the default for this type. */ -#define TYPE_USER_ALIGN(NODE) (TYPE_CHECK (NODE)->common.base.user_align) +#define TYPE_USER_ALIGN(NODE) (TYPE_CHECK (NODE)->base.user_align) /* The alignment for NODE, in bytes. */ #define TYPE_ALIGN_UNIT(NODE) (TYPE_ALIGN (NODE) / BITS_PER_UNIT) @@ -2289,7 +2293,7 @@ extern enum machine_mode vector_type_mode (const_tree); /* Indicated that objects of this type should be laid out in as compact a way as possible. */ -#define TYPE_PACKED(NODE) (TYPE_CHECK (NODE)->common.base.packed_flag) +#define TYPE_PACKED(NODE) (TYPE_CHECK (NODE)->base.packed_flag) /* Used by type_contains_placeholder_p to avoid recomputation. Values are: 0 (unknown), 1 (false), 2 (true). Never access @@ -2632,7 +2636,7 @@ struct GTY(()) tree_decl_minimal { /* Set if the alignment of this DECL has been set by the user, for example with an 'aligned' attribute. */ #define DECL_USER_ALIGN(NODE) \ - (DECL_COMMON_CHECK (NODE)->common.base.user_align) + (DECL_COMMON_CHECK (NODE)->base.user_align) /* Holds the machine mode corresponding to the declaration of a variable or field. Always equal to TYPE_MODE (TREE_TYPE (decl)) except for a FIELD_DECL. */ @@ -2900,7 +2904,7 @@ struct GTY(()) tree_decl_with_rtl { #define DECL_FCONTEXT(NODE) (FIELD_DECL_CHECK (NODE)->field_decl.fcontext) /* In a FIELD_DECL, indicates this field should be bit-packed. */ -#define DECL_PACKED(NODE) (FIELD_DECL_CHECK (NODE)->common.base.packed_flag) +#define DECL_PACKED(NODE) (FIELD_DECL_CHECK (NODE)->base.packed_flag) /* Nonzero in a FIELD_DECL means it is a bit field, and must be accessed specially. */ @@ -3505,6 +3509,7 @@ extern tree build_target_option_node (void); union GTY ((ptr_alias (union lang_tree_node), desc ("tree_node_structure (&%h)"), variable_size)) tree_node { struct tree_base GTY ((tag ("TS_BASE"))) base; + struct typed_tree GTY ((tag ("TS_TYPED"))) typed; struct tree_common GTY ((tag ("TS_COMMON"))) common; struct tree_int_cst GTY ((tag ("TS_INT_CST"))) int_cst; struct tree_real_cst GTY ((tag ("TS_REAL_CST"))) real_cst; diff --git a/gcc/treestruct.def b/gcc/treestruct.def index baea46a..b65bdc2 100644 --- a/gcc/treestruct.def +++ b/gcc/treestruct.def @@ -31,6 +31,7 @@ along with GCC; see the file COPYING3. If not see specifying what structures contain what other structures in the tree_contains_struct array. */ DEFTREESTRUCT(TS_BASE, "base") +DEFTREESTRUCT(TS_TYPED, "typed") DEFTREESTRUCT(TS_COMMON, "common") DEFTREESTRUCT(TS_INT_CST, "integer cst") DEFTREESTRUCT(TS_REAL_CST, "real cst") -- 1.7.0.4