aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2014-11-20 07:15:03 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2014-11-20 06:15:03 +0000
commit1be0e58d3003aa8a780d229bf38b0e4a61928b9e (patch)
treeb027bc052b062a295ed4e82de7214afde37561ce /gcc
parent1b5695e6100dec3f7c1e86ba5594471987cda466 (diff)
downloadgcc-1be0e58d3003aa8a780d229bf38b0e4a61928b9e.zip
gcc-1be0e58d3003aa8a780d229bf38b0e4a61928b9e.tar.gz
gcc-1be0e58d3003aa8a780d229bf38b0e4a61928b9e.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/ipa-devirt.c6
-rw-r--r--gcc/ipa-polymorphic-call.c1
-rw-r--r--gcc/ipa-utils.h3
-rw-r--r--gcc/tree.c18
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 <hubicka@ucw.cz>
+
+ * 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 <dmalcolm@redhat.com>
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 <cgraph_node *> &nodes,
{
tree binfo = TYPE_BINFO (type->type);
unsigned int i;
- vec <tree> type_binfos = vNULL;
+ auto_vec <tree, 8> 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 <cgraph_node *> &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 <cgraph_node *> nodes = vNULL;
- vec <tree> bases_to_consider = vNULL;
+ auto_vec <tree, 8> 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))