From 1be0e58d3003aa8a780d229bf38b0e4a61928b9e Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Thu, 20 Nov 2014 07:15:03 +0100 Subject: [PATCH] tree.c (free_lang_data_in_type): If BINFO has no important information in it, set it to NULL. * tree.c (free_lang_data_in_type): If BINFO has no important information in it, set it to NULL. (get_binfo_at_offset): Do not walk fields, only bases. * ipa-utils.h (polymorphic_type_binfo_p): Be ready for BINFO_TYPE to be NULL. * ipa-polymorphic-call.c (record_known_type): Likewise. From-SVN: r217824 --- gcc/ChangeLog | 9 +++++++++ gcc/ipa-devirt.c | 6 ++---- gcc/ipa-polymorphic-call.c | 1 + gcc/ipa-utils.h | 3 ++- gcc/tree.c | 18 ++++++++++-------- 5 files changed, 24 insertions(+), 13 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d577401..be20db1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2014-11-19 Jan Hubicka + + * tree.c (free_lang_data_in_type): If BINFO has no important + information in it, set it to NULL. + (get_binfo_at_offset): Do not walk fields, only bases. + * ipa-utils.h (polymorphic_type_binfo_p): Be ready for BINFO_TYPE + to be NULL. + * ipa-polymorphic-call.c (record_known_type): Likewise. + 2014-11-19 David Malcolm PR jit/63854 diff --git a/gcc/ipa-devirt.c b/gcc/ipa-devirt.c index 99475f6..41d4554 100644 --- a/gcc/ipa-devirt.c +++ b/gcc/ipa-devirt.c @@ -1849,7 +1849,7 @@ possible_polymorphic_call_targets_1 (vec &nodes, { tree binfo = TYPE_BINFO (type->type); unsigned int i; - vec type_binfos = vNULL; + auto_vec type_binfos; bool possibly_instantiated = type_possibly_instantiated_p (type->type); /* We may need to consider types w/o instances because of possible derived @@ -1868,7 +1868,6 @@ possible_polymorphic_call_targets_1 (vec &nodes, inserted, matched_vtables, type->anonymous_namespace, completep); } - type_binfos.release (); for (i = 0; i < type->derived_types.length (); i++) possible_polymorphic_call_targets_1 (nodes, inserted, matched_vtables, @@ -2226,7 +2225,7 @@ possible_polymorphic_call_targets (tree otr_type, { static struct cgraph_node_hook_list *node_removal_hook_holder; vec nodes = vNULL; - vec bases_to_consider = vNULL; + auto_vec bases_to_consider; odr_type type, outer_type; polymorphic_call_target_d key; polymorphic_call_target_d **slot; @@ -2521,7 +2520,6 @@ possible_polymorphic_call_targets (tree otr_type, } } - bases_to_consider.release(); (*slot)->targets = nodes; (*slot)->complete = complete; if (completep) diff --git a/gcc/ipa-polymorphic-call.c b/gcc/ipa-polymorphic-call.c index 452f2d2..249f0d7 100644 --- a/gcc/ipa-polymorphic-call.c +++ b/gcc/ipa-polymorphic-call.c @@ -1307,6 +1307,7 @@ record_known_type (struct type_change_info *tci, tree type, HOST_WIDE_INT offset if (type && (offset || (TREE_CODE (type) != RECORD_TYPE + || !TYPE_BINFO (type) || !polymorphic_type_binfo_p (TYPE_BINFO (type))))) { ipa_polymorphic_call_context context; diff --git a/gcc/ipa-utils.h b/gcc/ipa-utils.h index e285722..12c6edb 100644 --- a/gcc/ipa-utils.h +++ b/gcc/ipa-utils.h @@ -183,7 +183,8 @@ polymorphic_type_binfo_p (const_tree binfo) /* See if BINFO's type has an virtual table associtated with it. Check is defensive because of Java FE produces BINFOs without BINFO_TYPE set. */ - return BINFO_TYPE (binfo) && BINFO_VTABLE (TYPE_BINFO (BINFO_TYPE (binfo))); + return (BINFO_TYPE (binfo) && TYPE_BINFO (BINFO_TYPE (binfo)) + && BINFO_VTABLE (TYPE_BINFO (BINFO_TYPE (binfo)))); } #endif /* GCC_IPA_UTILS_H */ diff --git a/gcc/tree.c b/gcc/tree.c index 272b2a3..6abe4c3 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -4976,7 +4976,14 @@ free_lang_data_in_type (tree type) TYPE_METHODS (type) = NULL_TREE; if (TYPE_BINFO (type)) - free_lang_data_in_binfo (TYPE_BINFO (type)); + { + free_lang_data_in_binfo (TYPE_BINFO (type)); + if ((!BINFO_VTABLE (TYPE_BINFO (type)) + || !flag_devirtualize) + && (!BINFO_N_BASE_BINFOS (TYPE_BINFO (type)) + || debug_info_level != DINFO_LEVEL_NONE)) + TYPE_BINFO (type) = NULL; + } } else { @@ -11926,7 +11933,7 @@ get_binfo_at_offset (tree binfo, HOST_WIDE_INT offset, tree expected_type) for (fld = TYPE_FIELDS (type); fld; fld = DECL_CHAIN (fld)) { - if (TREE_CODE (fld) != FIELD_DECL) + if (TREE_CODE (fld) != FIELD_DECL || !DECL_ARTIFICIAL (fld)) continue; pos = int_bit_position (fld); @@ -11937,12 +11944,6 @@ get_binfo_at_offset (tree binfo, HOST_WIDE_INT offset, tree expected_type) if (!fld || TREE_CODE (TREE_TYPE (fld)) != RECORD_TYPE) return NULL_TREE; - if (!DECL_ARTIFICIAL (fld)) - { - binfo = TYPE_BINFO (TREE_TYPE (fld)); - if (!binfo) - return NULL_TREE; - } /* Offset 0 indicates the primary base, whose vtable contents are represented in the binfo for the derived class. */ else if (offset != 0) @@ -11967,6 +11968,7 @@ get_binfo_at_offset (tree binfo, HOST_WIDE_INT offset, tree expected_type) * BITS_PER_UNIT < pos /* Rule out types with no virtual methods or we can get confused here by zero sized bases. */ + && TYPE_BINFO (BINFO_TYPE (base_binfo)) && BINFO_VTABLE (TYPE_BINFO (BINFO_TYPE (base_binfo))) && (!containing_binfo || (tree_to_shwi (BINFO_OFFSET (containing_binfo)) -- 2.7.4