From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 10083 invoked by alias); 11 Mar 2011 13:21:32 -0000 Received: (qmail 9866 invoked by uid 22791); 11 Mar 2011 13:21:19 -0000 X-SWARE-Spam-Status: No, hits=-0.7 required=5.0 tests=AWL,BAYES_50,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,TW_BJ,TW_CP,TW_CX,TW_JC X-Spam-Check-By: sourceware.org Received: from mail-iy0-f175.google.com (HELO mail-iy0-f175.google.com) (209.85.210.175) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 11 Mar 2011 13:21:11 +0000 Received: by iyb26 with SMTP id 26so2960724iyb.20 for ; Fri, 11 Mar 2011 05:21:10 -0800 (PST) MIME-Version: 1.0 Received: by 10.42.168.196 with SMTP id x4mr2341200icy.14.1299849664911; Fri, 11 Mar 2011 05:21:04 -0800 (PST) Received: by 10.231.10.130 with HTTP; Fri, 11 Mar 2011 05:21:04 -0800 (PST) In-Reply-To: <1299817406-16745-3-git-send-email-froydnj@codesourcery.com> References: <1299817406-16745-1-git-send-email-froydnj@codesourcery.com> <1299817406-16745-3-git-send-email-froydnj@codesourcery.com> Date: Fri, 11 Mar 2011 13:21:00 -0000 Message-ID: Subject: Re: [PATCH 02/18] enforce TREE_CHAIN and TREE_TYPE accesses From: Richard Guenther To: Nathan Froyd Cc: gcc-patches@gcc.gnu.org, fortran@gcc.gnu.org, java-patches@gcc.gnu.org Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable 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/msg00601.txt.bz2 On Fri, Mar 11, 2011 at 5:23 AM, Nathan Froyd wr= ote: > Now that we have a structure where not every node might include > TREE_CHAIN or TREE_TYPE, we need to make sure that when we call said > accessors that the argument is properly typed. =A0This requires a number > of changes: > > - It's not enough for FEs to assume that FE-specific DECLs are the only > =A0tree that needs to be marked specially; we need to mark things as > =A0TS_TYPED or TS_COMMON. > > - To facilitate doing so, move the MARK_* macros for initializing > =A0tree_contains_struct to tree.h so they are accessible to FEs. > > - Additionally, rearrange *_init_ts methods for the C-family languages > =A0so that we can share code where code needs to be shared. > > - Finally, various places need to check for TS_COMMON structure before > =A0blindly calling TREE_CHAIN. The middle-end changes are ok for 4.7. Thanks, Richard. > -Nathan > > gcc/ada/ > =A0 =A0 =A0 =A0* gcc-interface/ada-tree.h (union lang_tree_node): Check f= or > =A0 =A0 =A0 =A0TS_COMMON before calling TREE_CHAIN. > =A0 =A0 =A0 =A0* gcc-interface/misc.c (gnat_init_ts): New function. > =A0 =A0 =A0 =A0(LANG_HOOKS_INIT_TS): Define. > > gcc/ > =A0 =A0 =A0 =A0* c-decl.c (union lang_tree_node): Check for TS_COMMON bef= ore > =A0 =A0 =A0 =A0calling TREE_CHAIN. > =A0 =A0 =A0 =A0* print-tree.c (print_node): Likewise. > =A0 =A0 =A0 =A0* tree-inline.c (copy_tree_r): Likewise. > =A0 =A0 =A0 =A0* c-lang.c (LANG_HOOKS_INIT_TS): Define. > =A0 =A0 =A0 =A0* lto-streamer-in.c (lto_input_tree_pointers): Check for T= S_TYPED > =A0 =A0 =A0 =A0instead of TS_COMMON. > =A0 =A0 =A0 =A0* lto-streamer-out.c (lto_output_tree_pointers): Likewise. > =A0 =A0 =A0 =A0* tree.c (initialize_tree_contains_struct): Handle TS_TYPE= D. > =A0 =A0 =A0 =A0(copy_node_stat): Zero TREE_CHAIN only if necessary. > =A0 =A0 =A0 =A0(MARK_TS_BASE, MARK_TS_TYPED, MARK_TS_COMMON): Move these.= .. > =A0 =A0 =A0 =A0(MARK_TS_DECL_COMMON, MARK_TS_DECL_COMMON, MARK_TS_DECL_WR= TL): > =A0 =A0 =A0 =A0...and these... > =A0 =A0 =A0 =A0(MARK_TS_DECL_WITH_VIS, MARK_TS_DECL_NON_COMMON): ...and t= hese... > =A0 =A0 =A0 =A0* tree.h: ...here. > =A0 =A0 =A0 =A0(TREE_CHAIN): Check for a TS_COMMON structure. > =A0 =A0 =A0 =A0(TREE_TYPE): Check for a TS_TYPED structure. > > gcc/c-family/ > =A0 =A0 =A0 =A0* c-common.h (c_common_init_ts): Declare. > =A0 =A0 =A0 =A0* c-common.c (c_common_init_ts): Define. > > gcc/cp/ > =A0 =A0 =A0 =A0* cp-lang.c (cp_init_ts): Call cp_common_init_ts. =A0Move > =A0 =A0 =A0 =A0tree_contains_struct initialization to... > =A0 =A0 =A0 =A0* cp-objcp-common.c (cp_common_init_ts): ...here. =A0Use M= ARK_* > =A0 =A0 =A0 =A0macros. > =A0 =A0 =A0 =A0* cp-objcp-common.h (cp_common_init_ts): Declare. > =A0 =A0 =A0 =A0* cp-tree.h (union lang_tree_node): Check for TS_COMMON be= fore > =A0 =A0 =A0 =A0calling TREE_CHAIN. > > gcc/fortran/ > =A0 =A0 =A0 =A0* f95-lang.c (union lang_tree_node): Check for TS_COMMON b= efore > =A0 =A0 =A0 =A0calling TREE_CHAIN. > > gcc/go/ > =A0 =A0 =A0 =A0* go-lang.c (union lang_tree_node): Check for TS_COMMON be= fore > =A0 =A0 =A0 =A0calling TREE_CHAIN. > > gcc/java/ > =A0 =A0 =A0 =A0* java-tree.h (union lang_tree_node): Check for TS_COMMON = before > =A0 =A0 =A0 =A0calling TREE_CHAIN. > > gcc/lto/ > =A0 =A0 =A0 =A0* lto-tree.h (union lang_tree_node): Check for TS_COMMON b= efore > =A0 =A0 =A0 =A0calling TREE_CHAIN. > =A0 =A0 =A0 =A0* lto.c (lto_fixup_common): Likewise. > > gcc/objc/ > =A0 =A0 =A0 =A0* objc-lang.c (objc_init_ts): Move code for this function.= .. > =A0 =A0 =A0 =A0* objc-act.c (objc_common_init_ts): ...here. Define. > =A0 =A0 =A0 =A0* objc-act.h (objc_common_init_ts): Declare. > > gcc/objcp/ > =A0 =A0 =A0 =A0* objcp-lang.c (objcxx_init_ts): Call objc_common_init_ts = and > =A0 =A0 =A0 =A0cp_common_init_ts. > > diff --git a/gcc/ada/gcc-interface/ada-tree.h b/gcc/ada/gcc-interface/ada= -tree.h > index 9002fa1..3542349 100644 > --- a/gcc/ada/gcc-interface/ada-tree.h > +++ b/gcc/ada/gcc-interface/ada-tree.h > @@ -25,7 +25,7 @@ > > =A0/* The resulting tree type. =A0*/ > =A0union GTY((desc ("0"), > - =A0 =A0 =A0 =A0 =A0chain_next ("(union lang_tree_node *)TREE_CHAIN (&%h= .generic)"))) > + =A0 =A0 =A0 =A0 =A0chain_next ("CODE_CONTAINS_STRUCT (TREE_CODE (&%h.ge= neric), TS_COMMON) ? ((union lang_tree_node *) TREE_CHAIN (&%h.generic)) : = NULL"))) > =A0 lang_tree_node > =A0{ > =A0 union tree_node GTY((tag ("0"), > diff --git a/gcc/ada/gcc-interface/misc.c b/gcc/ada/gcc-interface/misc.c > index 4f7a5e1..89823ca 100644 > --- a/gcc/ada/gcc-interface/misc.c > +++ b/gcc/ada/gcc-interface/misc.c > @@ -696,6 +696,20 @@ gnat_eh_personality (void) > =A0 return gnat_eh_personality_decl; > =A0} > > +/* Initialize language-specific bits of tree_contains_struct. =A0*/ > + > +static void > +gnat_init_ts (void) > +{ > + =A0MARK_TS_COMMON (UNCONSTRAINED_ARRAY_TYPE); > + > + =A0MARK_TS_TYPED (UNCONSTRAINED_ARRAY_REF); > + =A0MARK_TS_TYPED (LOOP_STMT); > + =A0MARK_TS_TYPED (STMT_STMT); > + =A0MARK_TS_TYPED (EXIT_STMT); > + =A0MARK_TS_TYPED (NULL_EXPR); > +} > + > =A0/* Definitions for our language-specific hooks. =A0*/ > > =A0#undef =A0LANG_HOOKS_NAME > @@ -754,6 +768,8 @@ gnat_eh_personality (void) > =A0#define LANG_HOOKS_EH_PERSONALITY =A0 =A0 =A0gnat_eh_personality > =A0#undef =A0LANG_HOOKS_DEEP_UNSHARING > =A0#define LANG_HOOKS_DEEP_UNSHARING =A0 =A0 =A0true > +#undef =A0LANG_HOOKS_INIT_TS > +#define LANG_HOOKS_INIT_TS =A0 =A0 =A0 =A0 =A0 =A0 gnat_init_ts > > =A0struct lang_hooks lang_hooks =3D LANG_HOOKS_INITIALIZER; > > diff --git a/gcc/c-decl.c b/gcc/c-decl.c > index b438b06..14aef5f 100644 > --- a/gcc/c-decl.c > +++ b/gcc/c-decl.c > @@ -242,7 +242,7 @@ extern char C_SIZEOF_STRUCT_LANG_IDENTIFIER_isnt_accu= rate > =A0/* The resulting tree type. =A0*/ > > =A0union GTY((desc ("TREE_CODE (&%h.generic) =3D=3D IDENTIFIER_NODE"), > - =A0 =A0 =A0 chain_next ("TREE_CODE (&%h.generic) =3D=3D INTEGER_TYPE ? = (union lang_tree_node *) TYPE_NEXT_VARIANT (&%h.generic) : ((union lang_tre= e_node *) TREE_CHAIN (&%h.generic))"))) =A0lang_tree_node > + =A0 =A0 =A0 chain_next ("TREE_CODE (&%h.generic) =3D=3D INTEGER_TYPE ? = (union lang_tree_node *) TYPE_NEXT_VARIANT (&%h.generic) : CODE_CONTAINS_ST= RUCT (TREE_CODE (&%h.generic), TS_COMMON) ? ((union lang_tree_node *) TREE_= CHAIN (&%h.generic)) : NULL"))) =A0lang_tree_node > =A0{ > =A0 union tree_node GTY ((tag ("0"), > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0desc ("tree_node_structure= (&%h)"))) > diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c > index d696b5f..7207335 100644 > --- a/gcc/c-family/c-common.c > +++ b/gcc/c-family/c-common.c > @@ -9692,4 +9692,13 @@ keyword_is_decl_specifier (enum rid keyword) > =A0 =A0 } > =A0} > > +/* Initialize language-specific-bits of tree_contains_struct. =A0*/ > + > +void > +c_common_init_ts (void) > +{ > + =A0MARK_TS_TYPED (C_MAYBE_CONST_EXPR); > + =A0MARK_TS_TYPED (EXCESS_PRECISION_EXPR); > +} > + > =A0#include "gt-c-family-c-common.h" > diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h > index 406def9..7e4f0a1 100644 > --- a/gcc/c-family/c-common.h > +++ b/gcc/c-family/c-common.h > @@ -707,6 +707,7 @@ extern tree c_common_fixed_point_type_for_size (unsig= ned int, unsigned int, > =A0extern tree c_common_unsigned_type (tree); > =A0extern tree c_common_signed_type (tree); > =A0extern tree c_common_signed_or_unsigned_type (int, tree); > +extern void c_common_init_ts (void); > =A0extern tree c_build_bitfield_integer_type (unsigned HOST_WIDE_INT, int= ); > =A0extern bool decl_with_nonnull_addr_p (const_tree); > =A0extern tree c_fully_fold (tree, bool, bool *); > diff --git a/gcc/c-lang.c b/gcc/c-lang.c > index 0ca2e7c..ae1b081 100644 > --- a/gcc/c-lang.c > +++ b/gcc/c-lang.c > @@ -43,6 +43,8 @@ enum c_language_kind c_language =3D clk_c; > =A0#define LANG_HOOKS_NAME "GNU C" > =A0#undef LANG_HOOKS_INIT > =A0#define LANG_HOOKS_INIT c_objc_common_init > +#undef LANG_HOOKS_INIT_TS > +#define LANG_HOOKS_INIT_TS c_common_init_ts > > =A0/* Each front end provides its own lang hook initializer. =A0*/ > =A0struct lang_hooks lang_hooks =3D LANG_HOOKS_INITIALIZER; > diff --git a/gcc/cp/cp-lang.c b/gcc/cp/cp-lang.c > index e5c1c09..6506930 100644 > --- a/gcc/cp/cp-lang.c > +++ b/gcc/cp/cp-lang.c > @@ -100,32 +100,12 @@ objcp_tsubst_copy_and_build (tree t ATTRIBUTE_UNUSE= D, > =A0 return NULL_TREE; > =A0} > > - > =A0static void > =A0cp_init_ts (void) > =A0{ > - =A0tree_contains_struct[NAMESPACE_DECL][TS_DECL_NON_COMMON] =3D 1; > - =A0tree_contains_struct[USING_DECL][TS_DECL_NON_COMMON] =3D 1; > - =A0tree_contains_struct[TEMPLATE_DECL][TS_DECL_NON_COMMON] =3D 1; > - > - =A0tree_contains_struct[NAMESPACE_DECL][TS_DECL_WITH_VIS] =3D 1; > - =A0tree_contains_struct[USING_DECL][TS_DECL_WITH_VIS] =3D 1; > - =A0tree_contains_struct[TEMPLATE_DECL][TS_DECL_WITH_VIS] =3D 1; > - > - =A0tree_contains_struct[NAMESPACE_DECL][TS_DECL_WRTL] =3D 1; > - =A0tree_contains_struct[USING_DECL][TS_DECL_WRTL] =3D 1; > - =A0tree_contains_struct[TEMPLATE_DECL][TS_DECL_WRTL] =3D 1; > - > - =A0tree_contains_struct[NAMESPACE_DECL][TS_DECL_COMMON] =3D 1; > - =A0tree_contains_struct[USING_DECL][TS_DECL_COMMON] =3D 1; > - =A0tree_contains_struct[TEMPLATE_DECL][TS_DECL_COMMON] =3D 1; > - > - =A0tree_contains_struct[NAMESPACE_DECL][TS_DECL_MINIMAL] =3D 1; > - =A0tree_contains_struct[USING_DECL][TS_DECL_MINIMAL] =3D 1; > - =A0tree_contains_struct[TEMPLATE_DECL][TS_DECL_MINIMAL] =3D 1; > + =A0cp_common_init_ts (); > > =A0 init_shadowed_var_for_decl (); > - > =A0} > > =A0static const char * > diff --git a/gcc/cp/cp-objcp-common.c b/gcc/cp/cp-objcp-common.c > index f045d29..66d2d27 100644 > --- a/gcc/cp/cp-objcp-common.c > +++ b/gcc/cp/cp-objcp-common.c > @@ -222,5 +222,78 @@ init_shadowed_var_for_decl (void) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 tree_decl_map_eq, 0); > =A0} > > +void > +cp_common_init_ts (void) > +{ > + =A0MARK_TS_DECL_NON_COMMON (NAMESPACE_DECL); > + =A0MARK_TS_DECL_NON_COMMON (USING_DECL); > + =A0MARK_TS_DECL_NON_COMMON (TEMPLATE_DECL); > + > + =A0MARK_TS_COMMON (TEMPLATE_TEMPLATE_PARM); > + =A0MARK_TS_COMMON (TEMPLATE_TYPE_PARM); > + =A0MARK_TS_COMMON (TEMPLATE_PARM_INDEX); > + =A0MARK_TS_COMMON (OVERLOAD); > + =A0MARK_TS_COMMON (TEMPLATE_INFO); > + =A0MARK_TS_COMMON (FOR_STMT); > + =A0MARK_TS_COMMON (TYPENAME_TYPE); > + =A0MARK_TS_COMMON (TYPEOF_TYPE); > + =A0MARK_TS_COMMON (IF_STMT); > + =A0MARK_TS_COMMON (BASELINK); > + =A0MARK_TS_COMMON (SWITCH_STMT); > + =A0MARK_TS_COMMON (TYPE_PACK_EXPANSION); > + =A0MARK_TS_COMMON (EXPR_PACK_EXPANSION); > + =A0MARK_TS_COMMON (DECLTYPE_TYPE); > + =A0MARK_TS_COMMON (BOUND_TEMPLATE_TEMPLATE_PARM); > + =A0MARK_TS_COMMON (UNBOUND_CLASS_TEMPLATE); > + =A0MARK_TS_COMMON (RANGE_FOR_STMT); > + > + =A0MARK_TS_TYPED (AGGR_INIT_EXPR); > + =A0MARK_TS_TYPED (EXPR_STMT); > + =A0MARK_TS_TYPED (EH_SPEC_BLOCK); > + =A0MARK_TS_TYPED (CLEANUP_STMT); > + =A0MARK_TS_TYPED (SCOPE_REF); > + =A0MARK_TS_TYPED (CAST_EXPR); > + =A0MARK_TS_TYPED (NON_DEPENDENT_EXPR); > + =A0MARK_TS_TYPED (MODOP_EXPR); > + =A0MARK_TS_TYPED (TRY_BLOCK); > + =A0MARK_TS_TYPED (THROW_EXPR); > + =A0MARK_TS_TYPED (HANDLER); > + =A0MARK_TS_TYPED (REINTERPRET_CAST_EXPR); > + =A0MARK_TS_TYPED (CONST_CAST_EXPR); > + =A0MARK_TS_TYPED (STATIC_CAST_EXPR); > + =A0MARK_TS_TYPED (DYNAMIC_CAST_EXPR); > + =A0MARK_TS_TYPED (TEMPLATE_ID_EXPR); > + =A0MARK_TS_TYPED (ARROW_EXPR); > + =A0MARK_TS_TYPED (SIZEOF_EXPR); > + =A0MARK_TS_TYPED (ALIGNOF_EXPR); > + =A0MARK_TS_TYPED (AT_ENCODE_EXPR); > + =A0MARK_TS_TYPED (UNARY_PLUS_EXPR); > + =A0MARK_TS_TYPED (TRAIT_EXPR); > + =A0MARK_TS_TYPED (TYPE_ARGUMENT_PACK); > + =A0MARK_TS_TYPED (NOEXCEPT_EXPR); > + =A0MARK_TS_TYPED (NONTYPE_ARGUMENT_PACK); > + =A0MARK_TS_TYPED (WHILE_STMT); > + =A0MARK_TS_TYPED (NEW_EXPR); > + =A0MARK_TS_TYPED (VEC_NEW_EXPR); > + =A0MARK_TS_TYPED (BREAK_STMT); > + =A0MARK_TS_TYPED (MEMBER_REF); > + =A0MARK_TS_TYPED (DOTSTAR_EXPR); > + =A0MARK_TS_TYPED (DO_STMT); > + =A0MARK_TS_TYPED (DELETE_EXPR); > + =A0MARK_TS_TYPED (VEC_DELETE_EXPR); > + =A0MARK_TS_TYPED (CONTINUE_STMT); > + =A0MARK_TS_TYPED (TAG_DEFN); > + =A0MARK_TS_TYPED (PSEUDO_DTOR_EXPR); > + =A0MARK_TS_TYPED (TYPEID_EXPR); > + =A0MARK_TS_TYPED (MUST_NOT_THROW_EXPR); > + =A0MARK_TS_TYPED (STMT_EXPR); > + =A0MARK_TS_TYPED (OFFSET_REF); > + =A0MARK_TS_TYPED (OFFSETOF_EXPR); > + =A0MARK_TS_TYPED (PTRMEM_CST); > + =A0MARK_TS_TYPED (EMPTY_CLASS_EXPR); > + =A0MARK_TS_TYPED (VEC_INIT_EXPR); > + =A0MARK_TS_TYPED (USING_STMT); > + =A0MARK_TS_TYPED (LAMBDA_EXPR); > +} > > =A0#include "gt-cp-cp-objcp-common.h" > diff --git a/gcc/cp/cp-objcp-common.h b/gcc/cp/cp-objcp-common.h > index 38da59e..c668ad8 100644 > --- a/gcc/cp/cp-objcp-common.h > +++ b/gcc/cp/cp-objcp-common.h > @@ -28,6 +28,7 @@ extern tree objcp_tsubst_copy_and_build (tree, tree, ts= ubst_flags_t, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 tree, bool); > > =A0extern bool cp_function_decl_explicit_p (tree decl); > +extern void cp_common_init_ts (void); > > =A0/* Lang hooks that are shared between C++ and ObjC++ are defined here.= =A0Hooks > =A0 =A0specific to C++ or ObjC++ go in cp/cp-lang.c and objcp/objcp-lang.= c, > diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h > index 238d0cf..1783915 100644 > --- a/gcc/cp/cp-tree.h > +++ b/gcc/cp/cp-tree.h > @@ -702,7 +702,7 @@ enum cp_tree_node_structure_enum { > > =A0/* The resulting tree type. =A0*/ > =A0union GTY((desc ("cp_tree_node_structure (&%h)"), > - =A0 =A0 =A0 chain_next ("(union lang_tree_node *)TREE_CHAIN (&%h.generi= c)"))) lang_tree_node { > + =A0 =A0 =A0 chain_next ("CODE_CONTAINS_STRUCT (TREE_CODE (&%h.generic),= TS_COMMON) ? ((union lang_tree_node *) TREE_CHAIN (&%h.generic)) : NULL"))= ) lang_tree_node { > =A0 union tree_node GTY ((tag ("TS_CP_GENERIC"), > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0desc ("tree_node_structure= (&%h)"))) generic; > =A0 struct template_parm_index_s GTY ((tag ("TS_CP_TPI"))) tpi; > diff --git a/gcc/fortran/f95-lang.c b/gcc/fortran/f95-lang.c > index a3ac860..687f60b 100644 > --- a/gcc/fortran/f95-lang.c > +++ b/gcc/fortran/f95-lang.c > @@ -59,7 +59,7 @@ lang_identifier { > =A0/* The resulting tree type. =A0*/ > > =A0union GTY((desc ("TREE_CODE (&%h.generic) =3D=3D IDENTIFIER_NODE"), > - =A0 =A0 chain_next ("(union lang_tree_node *)TREE_CHAIN (&%h.generic)")= )) > + =A0 =A0 chain_next ("CODE_CONTAINS_STRUCT (TREE_CODE (&%h.generic), TS_= COMMON) ? ((union lang_tree_node *) TREE_CHAIN (&%h.generic)) : NULL"))) > > =A0lang_tree_node { > =A0 union tree_node GTY((tag ("0"), > diff --git a/gcc/go/go-lang.c b/gcc/go/go-lang.c > index b59e72d..5132e97 100644 > --- a/gcc/go/go-lang.c > +++ b/gcc/go/go-lang.c > @@ -65,7 +65,7 @@ struct GTY(()) lang_identifier > =A0/* The resulting tree type. =A0*/ > > =A0union GTY((desc ("TREE_CODE (&%h.generic) =3D=3D IDENTIFIER_NODE"), > - =A0 =A0 =A0 =A0 =A0chain_next ("(union lang_tree_node *) TREE_CHAIN (&%= h.generic)"))) > + =A0 =A0 =A0 =A0 =A0chain_next ("CODE_CONTAINS_STRUCT (TREE_CODE (&%h.ge= neric), TS_COMMON) ? ((union lang_tree_node *) TREE_CHAIN (&%h.generic)) : = NULL"))) > =A0lang_tree_node > =A0{ > =A0 union tree_node GTY((tag ("0"), > diff --git a/gcc/java/java-tree.h b/gcc/java/java-tree.h > index 3addcca..e422b4a 100644 > --- a/gcc/java/java-tree.h > +++ b/gcc/java/java-tree.h > @@ -587,7 +587,7 @@ struct GTY(()) lang_identifier { > > =A0/* The resulting tree type. =A0*/ > =A0union GTY((desc ("TREE_CODE (&%h.generic) =3D=3D IDENTIFIER_NODE"), > - =A0 =A0 =A0 chain_next ("(union lang_tree_node *)TREE_CHAIN (&%h.generi= c)"))) > + =A0 =A0 =A0 chain_next ("CODE_CONTAINS_STRUCT (TREE_CODE (&%h.generic),= TS_COMMON) ? ((union lang_tree_node *) TREE_CHAIN (&%h.generic)) : NULL"))) > > =A0 lang_tree_node { > =A0 union tree_node GTY ((tag ("0"), > diff --git a/gcc/lto-streamer-in.c b/gcc/lto-streamer-in.c > index 7409c1a..45809b8 100644 > --- a/gcc/lto-streamer-in.c > +++ b/gcc/lto-streamer-in.c > @@ -2326,7 +2326,7 @@ lto_input_tree_pointers (struct lto_input_block *ib= , struct data_in *data_in, > > =A0 code =3D TREE_CODE (expr); > > - =A0if (CODE_CONTAINS_STRUCT (code, TS_COMMON)) > + =A0if (CODE_CONTAINS_STRUCT (code, TS_TYPED)) > =A0 =A0 lto_input_ts_common_tree_pointers (ib, data_in, expr); > > =A0 if (CODE_CONTAINS_STRUCT (code, TS_VECTOR)) > diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c > index 29d171b..a4e8b70 100644 > --- a/gcc/lto-streamer-out.c > +++ b/gcc/lto-streamer-out.c > @@ -1169,7 +1169,7 @@ lto_output_tree_pointers (struct output_block *ob, = tree expr, bool ref_p) > > =A0 code =3D TREE_CODE (expr); > > - =A0if (CODE_CONTAINS_STRUCT (code, TS_COMMON)) > + =A0if (CODE_CONTAINS_STRUCT (code, TS_TYPED)) > =A0 =A0 lto_output_ts_common_tree_pointers (ob, expr, ref_p); > > =A0 if (CODE_CONTAINS_STRUCT (code, TS_VECTOR)) > diff --git a/gcc/lto/lto-tree.h b/gcc/lto/lto-tree.h > index d187fe2..847348c 100644 > --- a/gcc/lto/lto-tree.h > +++ b/gcc/lto/lto-tree.h > @@ -48,7 +48,7 @@ enum lto_tree_node_structure_enum { > =A0}; > > =A0union GTY((desc ("lto_tree_node_structure (&%h)"), > - =A0 =A0 =A0 =A0 chain_next ("(union lang_tree_node *)TREE_CHAIN (&%h.ge= neric)"))) > + =A0 =A0 =A0 =A0 chain_next ("CODE_CONTAINS_STRUCT (TREE_CODE (&%h.gener= ic), TS_COMMON) ? ((union lang_tree_node *) TREE_CHAIN (&%h.generic)) : NUL= L"))) > =A0 =A0 lang_tree_node > =A0{ > =A0 union tree_node GTY ((tag ("TS_LTO_GENERIC"), > diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c > index 71c8cdb..78a7977 100644 > --- a/gcc/lto/lto.c > +++ b/gcc/lto/lto.c > @@ -1618,7 +1618,8 @@ lto_fixup_common (tree t, void *data) > > =A0 /* This is not very efficient because we cannot do tail-recursion with > =A0 =A0 =A0a long chain of trees. */ > - =A0LTO_FIXUP_SUBTREE (TREE_CHAIN (t)); > + =A0if (CODE_CONTAINS_STRUCT (TREE_CODE (t), TS_COMMON)) > + =A0 =A0LTO_FIXUP_SUBTREE (TREE_CHAIN (t)); > =A0} > > =A0/* Fix up fields of a decl_minimal T. =A0DATA points to fix-up states.= =A0*/ > diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c > index 049dc00..e5bd52a 100644 > --- a/gcc/objc/objc-act.c > +++ b/gcc/objc/objc-act.c > @@ -10541,4 +10541,22 @@ objc_v2_encode_prop_attr (tree property) > =A0 return get_identifier (string); > =A0} > > +void > +objc_common_init_ts (void) > +{ > + =A0c_common_init_ts (); > + > + =A0MARK_TS_DECL_NON_COMMON (CLASS_METHOD_DECL); > + =A0MARK_TS_DECL_NON_COMMON (INSTANCE_METHOD_DECL); > + =A0MARK_TS_DECL_NON_COMMON (KEYWORD_DECL); > + =A0MARK_TS_DECL_NON_COMMON (PROPERTY_DECL); > + > + =A0MARK_TS_COMMON (CLASS_INTERFACE_TYPE); > + =A0MARK_TS_COMMON (PROTOCOL_INTERFACE_TYPE); > + =A0MARK_TS_COMMON (CLASS_IMPLEMENTATION_TYPE); > + > + =A0MARK_TS_TYPED (MESSAGE_SEND_EXPR); > + =A0MARK_TS_TYPED (PROPERTY_REF); > +} > + > =A0#include "gt-objc-objc-act.h" > diff --git a/gcc/objc/objc-act.h b/gcc/objc/objc-act.h > index 3983d4b..909181a 100644 > --- a/gcc/objc/objc-act.h > +++ b/gcc/objc/objc-act.h > @@ -28,6 +28,7 @@ bool objc_init (void); > =A0const char *objc_printable_name (tree, int); > =A0tree objc_fold_obj_type_ref (tree, tree); > =A0int objc_gimplify_expr (tree *, gimple_seq *, gimple_seq *); > +void objc_common_init_ts (void); > > =A0/* NB: The remaining public functions are prototyped in c-common.h, fo= r the > =A0 =A0benefit of stub-objc.c and objc-act.c. =A0*/ > diff --git a/gcc/objc/objc-lang.c b/gcc/objc/objc-lang.c > index fd65776..169b894 100644 > --- a/gcc/objc/objc-lang.c > +++ b/gcc/objc/objc-lang.c > @@ -36,7 +36,6 @@ along with GCC; see the file COPYING3. =A0If not see > =A0#include "c-lang.h" > > =A0enum c_language_kind c_language =3D clk_objc; > -static void objc_init_ts (void); > > =A0/* Lang hooks common to C and ObjC are declared in c-objc-common.h; > =A0 =A0consequently, there should be very few hooks below. =A0*/ > @@ -50,7 +49,7 @@ static void objc_init_ts (void); > =A0#undef LANG_HOOKS_GIMPLIFY_EXPR > =A0#define LANG_HOOKS_GIMPLIFY_EXPR objc_gimplify_expr > =A0#undef LANG_HOOKS_INIT_TS > -#define LANG_HOOKS_INIT_TS objc_init_ts > +#define LANG_HOOKS_INIT_TS objc_common_init_ts > > =A0/* Each front end provides its own lang hook initializer. =A0*/ > =A0struct lang_hooks lang_hooks =3D LANG_HOOKS_INITIALIZER; > @@ -58,33 +57,4 @@ struct lang_hooks lang_hooks =3D LANG_HOOKS_INITIALIZE= R; > =A0/* Lang hook routines common to C and ObjC appear in c-objc-common.c; > =A0 =A0there should be very few (if any) routines below. =A0*/ > > -static void > -objc_init_ts (void) > -{ > - =A0tree_contains_struct[CLASS_METHOD_DECL][TS_DECL_NON_COMMON] =3D 1; > - =A0tree_contains_struct[INSTANCE_METHOD_DECL][TS_DECL_NON_COMMON] =3D 1; > - =A0tree_contains_struct[KEYWORD_DECL][TS_DECL_NON_COMMON] =3D 1; > - =A0tree_contains_struct[PROPERTY_DECL][TS_DECL_NON_COMMON] =3D 1; > - > - =A0tree_contains_struct[CLASS_METHOD_DECL][TS_DECL_WITH_VIS] =3D 1; > - =A0tree_contains_struct[INSTANCE_METHOD_DECL][TS_DECL_WITH_VIS] =3D 1; > - =A0tree_contains_struct[KEYWORD_DECL][TS_DECL_WITH_VIS] =3D 1; > - =A0tree_contains_struct[PROPERTY_DECL][TS_DECL_WITH_VIS] =3D 1; > - > - =A0tree_contains_struct[CLASS_METHOD_DECL][TS_DECL_WRTL] =3D 1; > - =A0tree_contains_struct[INSTANCE_METHOD_DECL][TS_DECL_WRTL] =3D 1; > - =A0tree_contains_struct[KEYWORD_DECL][TS_DECL_WRTL] =3D 1; > - =A0tree_contains_struct[PROPERTY_DECL][TS_DECL_WRTL] =3D 1; > - > - =A0tree_contains_struct[CLASS_METHOD_DECL][TS_DECL_MINIMAL] =3D 1; > - =A0tree_contains_struct[INSTANCE_METHOD_DECL][TS_DECL_MINIMAL] =3D 1; > - =A0tree_contains_struct[KEYWORD_DECL][TS_DECL_MINIMAL] =3D 1; > - =A0tree_contains_struct[PROPERTY_DECL][TS_DECL_MINIMAL] =3D 1; > - > - =A0tree_contains_struct[CLASS_METHOD_DECL][TS_DECL_COMMON] =3D 1; > - =A0tree_contains_struct[INSTANCE_METHOD_DECL][TS_DECL_COMMON] =3D 1; > - =A0tree_contains_struct[KEYWORD_DECL][TS_DECL_COMMON] =3D 1; > - =A0tree_contains_struct[PROPERTY_DECL][TS_DECL_COMMON] =3D 1; > -} > - > =A0#include "gtype-objc.h" > diff --git a/gcc/objcp/objcp-lang.c b/gcc/objcp/objcp-lang.c > index fe2be66..0019022 100644 > --- a/gcc/objcp/objcp-lang.c > +++ b/gcc/objcp/objcp-lang.c > @@ -89,52 +89,8 @@ objcp_tsubst_copy_and_build (tree t, tree args, tsubst= _flags_t complain, > =A0static void > =A0objcxx_init_ts (void) > =A0{ > - =A0/* objc decls */ > - =A0tree_contains_struct[CLASS_METHOD_DECL][TS_DECL_NON_COMMON] =3D 1; > - =A0tree_contains_struct[INSTANCE_METHOD_DECL][TS_DECL_NON_COMMON] =3D 1; > - =A0tree_contains_struct[KEYWORD_DECL][TS_DECL_NON_COMMON] =3D 1; > - =A0tree_contains_struct[PROPERTY_DECL][TS_DECL_NON_COMMON] =3D 1; > - > - =A0tree_contains_struct[CLASS_METHOD_DECL][TS_DECL_WITH_VIS] =3D 1; > - =A0tree_contains_struct[INSTANCE_METHOD_DECL][TS_DECL_WITH_VIS] =3D 1; > - =A0tree_contains_struct[KEYWORD_DECL][TS_DECL_WITH_VIS] =3D 1; > - =A0tree_contains_struct[PROPERTY_DECL][TS_DECL_WITH_VIS] =3D 1; > - > - =A0tree_contains_struct[CLASS_METHOD_DECL][TS_DECL_WRTL] =3D 1; > - =A0tree_contains_struct[INSTANCE_METHOD_DECL][TS_DECL_WRTL] =3D 1; > - =A0tree_contains_struct[KEYWORD_DECL][TS_DECL_WRTL] =3D 1; > - =A0tree_contains_struct[PROPERTY_DECL][TS_DECL_WRTL] =3D 1; > - > - =A0tree_contains_struct[CLASS_METHOD_DECL][TS_DECL_MINIMAL] =3D 1; > - =A0tree_contains_struct[INSTANCE_METHOD_DECL][TS_DECL_MINIMAL] =3D 1; > - =A0tree_contains_struct[KEYWORD_DECL][TS_DECL_MINIMAL] =3D 1; > - =A0tree_contains_struct[PROPERTY_DECL][TS_DECL_MINIMAL] =3D 1; > - > - =A0tree_contains_struct[CLASS_METHOD_DECL][TS_DECL_COMMON] =3D 1; > - =A0tree_contains_struct[INSTANCE_METHOD_DECL][TS_DECL_COMMON] =3D 1; > - =A0tree_contains_struct[KEYWORD_DECL][TS_DECL_COMMON] =3D 1; > - =A0tree_contains_struct[PROPERTY_DECL][TS_DECL_COMMON] =3D 1; > - > - =A0/* C++ decls */ > - =A0tree_contains_struct[NAMESPACE_DECL][TS_DECL_NON_COMMON] =3D 1; > - =A0tree_contains_struct[USING_DECL][TS_DECL_NON_COMMON] =3D 1; > - =A0tree_contains_struct[TEMPLATE_DECL][TS_DECL_NON_COMMON] =3D 1; > - > - =A0tree_contains_struct[NAMESPACE_DECL][TS_DECL_WITH_VIS] =3D 1; > - =A0tree_contains_struct[USING_DECL][TS_DECL_WITH_VIS] =3D 1; > - =A0tree_contains_struct[TEMPLATE_DECL][TS_DECL_WITH_VIS] =3D 1; > - > - =A0tree_contains_struct[NAMESPACE_DECL][TS_DECL_WRTL] =3D 1; > - =A0tree_contains_struct[USING_DECL][TS_DECL_WRTL] =3D 1; > - =A0tree_contains_struct[TEMPLATE_DECL][TS_DECL_WRTL] =3D 1; > - > - =A0tree_contains_struct[NAMESPACE_DECL][TS_DECL_COMMON] =3D 1; > - =A0tree_contains_struct[USING_DECL][TS_DECL_COMMON] =3D 1; > - =A0tree_contains_struct[TEMPLATE_DECL][TS_DECL_COMMON] =3D 1; > - > - =A0tree_contains_struct[NAMESPACE_DECL][TS_DECL_MINIMAL] =3D 1; > - =A0tree_contains_struct[USING_DECL][TS_DECL_MINIMAL] =3D 1; > - =A0tree_contains_struct[TEMPLATE_DECL][TS_DECL_MINIMAL] =3D 1; > + =A0objc_common_init_ts (); > + =A0cp_common_init_ts (); > > =A0 init_shadowed_var_for_decl (); > =A0} > diff --git a/gcc/print-tree.c b/gcc/print-tree.c > index dfd3589..b0c6899 100644 > --- a/gcc/print-tree.c > +++ b/gcc/print-tree.c > @@ -756,7 +756,8 @@ print_node (FILE *file, const char *prefix, tree node= , int indent) > =A0 =A0 =A0 =A0 =A0 =A0 =A0print_node (file, temp, TREE_OPERAND (node, i)= , indent + 4); > =A0 =A0 =A0 =A0 =A0 =A0} > =A0 =A0 =A0 =A0} > - =A0 =A0 =A0print_node (file, "chain", TREE_CHAIN (node), indent + 4); > + =A0 =A0 =A0if (CODE_CONTAINS_STRUCT (code, TS_COMMON)) > + =A0 =A0 =A0 print_node (file, "chain", TREE_CHAIN (node), indent + 4); > =A0 =A0 =A0 break; > > =A0 =A0 case tcc_constant: > diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c > index de30cfd..45c7e88 100644 > --- a/gcc/tree-inline.c > +++ b/gcc/tree-inline.c > @@ -4295,7 +4295,8 @@ copy_tree_r (tree *tp, int *walk_subtrees, void *da= ta ATTRIBUTE_UNUSED) > =A0 =A0 =A0 =A0 here. =A0*/ > =A0 =A0 =A0 tree chain =3D NULL_TREE, new_tree; > > - =A0 =A0 =A0chain =3D TREE_CHAIN (*tp); > + =A0 =A0 =A0if (CODE_CONTAINS_STRUCT (code, TS_COMMON)) > + =A0 =A0 =A0 chain =3D TREE_CHAIN (*tp); > > =A0 =A0 =A0 /* Copy the node. =A0*/ > =A0 =A0 =A0 new_tree =3D copy_node (*tp); > diff --git a/gcc/tree.c b/gcc/tree.c > index 798bc08..68f40c9 100644 > --- a/gcc/tree.c > +++ b/gcc/tree.c > @@ -351,53 +351,6 @@ initialize_tree_contains_struct (void) > =A0{ > =A0 unsigned i; > > -#define MARK_TS_BASE(C) =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0\ > - =A0do { =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 \ > - =A0 =A0tree_contains_struct[C][TS_BASE] =3D 1; =A0 =A0 =A0 =A0 =A0 =A0 = =A0\ > - =A0} while (0) > - > -#define MARK_TS_TYPED(C) =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 \ > - =A0do { =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 \ > - =A0 =A0MARK_TS_BASE (C); =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0\ > - =A0 =A0tree_contains_struct[C][TS_TYPED] =3D 1; =A0 =A0 =A0 =A0 =A0 =A0= \ > - =A0} while (0) > - > -#define MARK_TS_COMMON(C) =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0\ > - =A0do { =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 \ > - =A0 =A0MARK_TS_TYPED (C); =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 \ > - =A0 =A0tree_contains_struct[C][TS_COMMON] =3D 1; =A0 =A0 =A0 =A0 =A0 = =A0\ > - =A0} while (0) > - > -#define MARK_TS_DECL_MINIMAL(C) =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0\ > - =A0do { =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 \ > - =A0 =A0MARK_TS_COMMON (C); =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0\ > - =A0 =A0tree_contains_struct[C][TS_DECL_MINIMAL] =3D 1; =A0 =A0 =A0\ > - =A0} while (0) > - > -#define MARK_TS_DECL_COMMON(C) =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 \ > - =A0do { =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 \ > - =A0 =A0MARK_TS_DECL_MINIMAL (C); =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0\ > - =A0 =A0tree_contains_struct[C][TS_DECL_COMMON] =3D 1; =A0 =A0 =A0 \ > - =A0} while (0) > - > -#define MARK_TS_DECL_WRTL(C) =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 \ > - =A0do { =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 \ > - =A0 =A0MARK_TS_DECL_COMMON (C); =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 \ > - =A0 =A0tree_contains_struct[C][TS_DECL_WRTL] =3D 1; =A0 =A0 =A0 =A0 \ > - =A0} while (0) > - > -#define MARK_TS_DECL_WITH_VIS(C) =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 \ > - =A0do { =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 \ > - =A0 =A0MARK_TS_DECL_WRTL (C); =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 \ > - =A0 =A0tree_contains_struct[C][TS_DECL_WITH_VIS] =3D 1; =A0 =A0 \ > - =A0} while (0) > - > -#define MARK_TS_DECL_NON_COMMON(C) =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 \ > - =A0do { =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 \ > - =A0 =A0MARK_TS_DECL_WITH_VIS (C); =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 \ > - =A0 =A0tree_contains_struct[C][TS_DECL_NON_COMMON] =3D 1; =A0 \ > - =A0} while (0) > - > =A0 for (i =3D ERROR_MARK; i < LAST_AND_UNUSED_TREE_CODE; i++) > =A0 =A0 { > =A0 =A0 =A0 enum tree_code code; > @@ -412,10 +365,14 @@ initialize_tree_contains_struct (void) > =A0 =A0 =A0 /* Mark all the structures that TS is derived from. =A0*/ > =A0 =A0 =A0 switch (ts_code) > =A0 =A0 =A0 =A0{ > - =A0 =A0 =A0 case TS_COMMON: > + =A0 =A0 =A0 case TS_TYPED: > =A0 =A0 =A0 =A0 =A0MARK_TS_BASE (code); > =A0 =A0 =A0 =A0 =A0break; > > + =A0 =A0 =A0 case TS_COMMON: > + =A0 =A0 =A0 =A0 MARK_TS_TYPED (code); > + =A0 =A0 =A0 =A0 break; > + > =A0 =A0 =A0 =A0case TS_INT_CST: > =A0 =A0 =A0 =A0case TS_REAL_CST: > =A0 =A0 =A0 =A0case TS_FIXED_CST: > @@ -521,14 +478,6 @@ initialize_tree_contains_struct (void) > =A0 gcc_assert (tree_contains_struct[FUNCTION_DECL][TS_FUNCTION_DECL]); > =A0 gcc_assert (tree_contains_struct[IMPORTED_DECL][TS_DECL_MINIMAL]); > =A0 gcc_assert (tree_contains_struct[IMPORTED_DECL][TS_DECL_COMMON]); > - > -#undef MARK_TS_BASE > -#undef MARK_TS_COMMON > -#undef MARK_TS_DECL_MINIMAL > -#undef MARK_TS_DECL_COMMON > -#undef MARK_TS_DECL_WRTL > -#undef MARK_TS_DECL_WITH_VIS > -#undef MARK_TS_DECL_NON_COMMON > =A0} > > > @@ -944,7 +893,7 @@ make_node_stat (enum tree_code code MEM_STAT_DECL) > =A0} > > =A0/* Return a new node with the same contents as NODE except that its > - =A0 TREE_CHAIN is zero and it has a fresh uid. =A0*/ > + =A0 TREE_CHAIN, if it has one, is zero and it has a fresh uid. =A0*/ > > =A0tree > =A0copy_node_stat (tree node MEM_STAT_DECL) > @@ -959,7 +908,8 @@ copy_node_stat (tree node MEM_STAT_DECL) > =A0 t =3D ggc_alloc_zone_tree_node_stat (&tree_zone, length PASS_MEM_STAT= ); > =A0 memcpy (t, node, length); > > - =A0TREE_CHAIN (t) =3D 0; > + =A0if (CODE_CONTAINS_STRUCT (code, TS_COMMON)) > + =A0 =A0TREE_CHAIN (t) =3D 0; > =A0 TREE_ASM_WRITTEN (t) =3D 0; > =A0 TREE_VISITED (t) =3D 0; > =A0 if (code =3D=3D VAR_DECL || code =3D=3D PARM_DECL || code =3D=3D RESU= LT_DECL) > diff --git a/gcc/tree.h b/gcc/tree.h > index 2f772e1..4ad2d3e 100644 > --- a/gcc/tree.h > +++ b/gcc/tree.h > @@ -50,6 +50,54 @@ MAX_TREE_CODES > =A0extern unsigned char tree_contains_struct[MAX_TREE_CODES][64]; > =A0#define CODE_CONTAINS_STRUCT(CODE, STRUCT) (tree_contains_struct[(CODE= )][(STRUCT)]) > > +/* Macros for initializing `tree_contains_struct'. =A0*/ > +#define MARK_TS_BASE(C) =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0\ > + =A0do { =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 \ > + =A0 =A0tree_contains_struct[C][TS_BASE] =3D 1; =A0 =A0 =A0 =A0 =A0 =A0 = =A0\ > + =A0} while (0) > + > +#define MARK_TS_TYPED(C) =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 \ > + =A0do { =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 \ > + =A0 =A0MARK_TS_BASE (C); =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0\ > + =A0 =A0tree_contains_struct[C][TS_TYPED] =3D 1; =A0 =A0 =A0 =A0 =A0 =A0= \ > + =A0} while (0) > + > +#define MARK_TS_COMMON(C) =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0\ > + =A0do { =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 \ > + =A0 =A0MARK_TS_TYPED (C); =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 \ > + =A0 =A0tree_contains_struct[C][TS_COMMON] =3D 1; =A0 =A0 =A0 =A0 =A0 = =A0\ > + =A0} while (0) > + > +#define MARK_TS_DECL_MINIMAL(C) =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0\ > + =A0do { =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 \ > + =A0 =A0MARK_TS_COMMON (C); =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0\ > + =A0 =A0tree_contains_struct[C][TS_DECL_MINIMAL] =3D 1; =A0 =A0 =A0\ > + =A0} while (0) > + > +#define MARK_TS_DECL_COMMON(C) =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 \ > + =A0do { =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 \ > + =A0 =A0MARK_TS_DECL_MINIMAL (C); =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0\ > + =A0 =A0tree_contains_struct[C][TS_DECL_COMMON] =3D 1; =A0 =A0 =A0 \ > + =A0} while (0) > + > +#define MARK_TS_DECL_WRTL(C) =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 \ > + =A0do { =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 \ > + =A0 =A0MARK_TS_DECL_COMMON (C); =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 \ > + =A0 =A0tree_contains_struct[C][TS_DECL_WRTL] =3D 1; =A0 =A0 =A0 =A0 \ > + =A0} while (0) > + > +#define MARK_TS_DECL_WITH_VIS(C) =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 \ > + =A0do { =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 \ > + =A0 =A0MARK_TS_DECL_WRTL (C); =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 \ > + =A0 =A0tree_contains_struct[C][TS_DECL_WITH_VIS] =3D 1; =A0 =A0 \ > + =A0} while (0) > + > +#define MARK_TS_DECL_NON_COMMON(C) =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 \ > + =A0do { =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 \ > + =A0 =A0MARK_TS_DECL_WITH_VIS (C); =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 \ > + =A0 =A0tree_contains_struct[C][TS_DECL_NON_COMMON] =3D 1; =A0 \ > + =A0} while (0) > + > =A0/* Number of language-independent tree codes. =A0*/ > =A0#define NUM_TREE_CODES ((int) LAST_AND_UNUSED_TREE_CODE) > > @@ -864,7 +912,7 @@ enum tree_node_structure_enum { > =A0 =A0are chained together. =A0*/ > > =A0#define TREE_CHAIN(NODE) __extension__ \ > -(*({__typeof (NODE) const __t =3D (NODE); =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0\ > +(*({__typeof (NODE) const __t =3D CONTAINS_STRUCT_CHECK (NODE, TS_COMMON= );\ > =A0 =A0 &__t->common.chain; })) > > =A0/* In all nodes that are expressions, this is the data type of the exp= ression. > @@ -872,7 +920,7 @@ enum tree_node_structure_enum { > =A0 =A0In ARRAY_TYPE nodes, this is the type of the elements. > =A0 =A0In VECTOR_TYPE nodes, this is the type of the elements. =A0*/ > =A0#define TREE_TYPE(NODE) __extension__ \ > -(*({__typeof (NODE) const __t =3D (NODE); =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0\ > +(*({__typeof (NODE) const __t =3D CONTAINS_STRUCT_CHECK (NODE, TS_TYPED)= ; \ > =A0 =A0 &__t->typed.type; })) > > =A0extern void tree_contains_struct_check_failed (const_tree, > -- > 1.7.0.4 > >