This patch replaces symtab_node with toplevel_node in lto_symtab_encoder
and modifies all places where lto_symtab_encoder is used to handle
(ignore) asm_node.
gcc/ChangeLog:
* ipa-icf.cc (sem_item_optimizer::write_summary): Use
toplevel_node.
(sem_item_optimizer::read_section): Likewise.
* ipa-modref.cc (modref_write): Likewise.
* ipa-prop.cc (ipa_write_return_summaries): Likewise.
(ipcp_write_transformation_summaries): Likewise.
* ipa-reference.cc (ipa_reference_write_optimization_summary):
Likewise.
* lto-cgraph.cc (lto_symtab_encoder_new): Likewise.
(lto_symtab_encoder_encode): Likewise.
(lto_symtab_encoder_delete_node): Likewise.
(lto_symtab_encoder_in_partition_p): Likewise.
(lto_set_symtab_encoder_in_partition): Likewise.
(output_refs): Likewise.
(compute_ltrans_boundary): Likewise.
(output_symtab): Likewise.
(output_cgraph_opt_summary): Likewise.
* lto-streamer-out.cc (lto_output): Likewise.
(produce_symtab): Likewise.
(produce_symtab_extension): Likewise.
* lto-streamer.h (struct lto_encoder_entry): Likewise.
(struct lto_symtab_encoder_d): Likewise.
(lto_symtab_encoder_encode): Likewise.
(lto_symtab_encoder_delete_node): Likewise.
(lto_symtab_encoder_in_partition_p): Likewise.
(lto_symtab_encoder_lookup): Likewise.
(lsei_next): Likewise.
(lsei_varpool_node): Likewise.
gcc/lto/ChangeLog:
* lto-partition.cc (add_symbol_to_partition): Use toplevel_node.
(undo_partition): Likewise.
(join_partitions): Likewise.
(split_partition_into_nodes): Likewise.
(is_partition_reorder): Likewise.
(lto_balanced_map): Likewise.
(lto_promote_cross_file_statics): Likewise.
* lto.cc (lto_wpa_write_files): Likewise.
---
gcc/ipa-icf.cc | 21 ++++++------
gcc/ipa-modref.cc | 8 ++---
gcc/ipa-prop.cc | 16 ++++-----
gcc/ipa-reference.cc | 14 ++++----
gcc/lto-cgraph.cc | 40 ++++++++++++++--------
gcc/lto-streamer-out.cc | 30 ++++++++++++-----
gcc/lto-streamer.h | 20 +++++------
gcc/lto/lto-partition.cc | 72 +++++++++++++++++++++++++---------------
gcc/lto/lto.cc | 9 +++--
9 files changed, 140 insertions(+), 90 deletions(-)
diff --git a/gcc/ipa-icf.cc b/gcc/ipa-icf.cc
index b354fb1e704..c7596f9ff1c 100644
--- a/gcc/ipa-icf.cc
+++ b/gcc/ipa-icf.cc
@@ -2166,7 +2166,9 @@ sem_item_optimizer::write_summary (void)
!lsei_end_p (lsei);
lsei_next_in_partition (&lsei))
{
- symtab_node *node = lsei_node (lsei);
+ symtab_node *node = dyn_cast <symtab_node *> (lsei_node (lsei));
+ if (!node)
+ continue;
if (m_symtab_node_map.get (node))
count++;
@@ -2179,7 +2181,9 @@ sem_item_optimizer::write_summary (void)
!lsei_end_p (lsei);
lsei_next_in_partition (&lsei))
{
- symtab_node *node = lsei_node (lsei);
+ symtab_node *node = dyn_cast <symtab_node *> (lsei_node (lsei));
+ if (!node)
+ continue;
sem_item **item = m_symtab_node_map.get (node);
@@ -2233,7 +2237,7 @@ sem_item_optimizer::read_section (lto_file_decl_data
*file_data,
for (i = 0; i < count; i++)
{
unsigned int index;
- symtab_node *node;
+ toplevel_node *node;
lto_symtab_encoder_t encoder;
index = streamer_read_uhwi (&ib_main);
@@ -2241,12 +2245,11 @@ sem_item_optimizer::read_section (lto_file_decl_data
*file_data,
node = lto_symtab_encoder_deref (encoder, index);
hashval_t hash = streamer_read_uhwi (&ib_main);
- gcc_assert (node->definition);
+ if (symtab_node *snode = dyn_cast <symtab_node *> (node))
+ gcc_assert (snode->definition);
- if (is_a<cgraph_node *> (node))
+ if (cgraph_node *cnode = dyn_cast <cgraph_node *> (node))
{
- cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
-
sem_function *fn = new sem_function (cnode, &m_bmstack);
unsigned count = streamer_read_uhwi (&ib_main);
inchash::hash hstate (0);
@@ -2263,10 +2266,8 @@ sem_item_optimizer::read_section (lto_file_decl_data
*file_data,
fn->set_hash (hash);
m_items.safe_push (fn);
}
- else
+ else if (varpool_node *vnode = dyn_cast <varpool_node *> (node))
{
- varpool_node *vnode = dyn_cast <varpool_node *> (node);
-
sem_variable *var = new sem_variable (vnode, &m_bmstack);
var->set_hash (hash);
m_items.safe_push (var);
diff --git a/gcc/ipa-modref.cc b/gcc/ipa-modref.cc
index d3e510195b5..a319ee35b3b 100644
--- a/gcc/ipa-modref.cc
+++ b/gcc/ipa-modref.cc
@@ -3752,8 +3752,8 @@ modref_write ()
for (i = 0; i < lto_symtab_encoder_size (encoder); i++)
{
- symtab_node *snode = lto_symtab_encoder_deref (encoder, i);
- cgraph_node *cnode = dyn_cast <cgraph_node *> (snode);
+ toplevel_node *tnode = lto_symtab_encoder_deref (encoder, i);
+ cgraph_node *cnode = dyn_cast <cgraph_node *> (tnode);
modref_summary_lto *r;
if (cnode && cnode->definition && !cnode->alias
@@ -3765,8 +3765,8 @@ modref_write ()
for (i = 0; i < lto_symtab_encoder_size (encoder); i++)
{
- symtab_node *snode = lto_symtab_encoder_deref (encoder, i);
- cgraph_node *cnode = dyn_cast <cgraph_node *> (snode);
+ toplevel_node *tnode = lto_symtab_encoder_deref (encoder, i);
+ cgraph_node *cnode = dyn_cast <cgraph_node *> (tnode);
if (cnode && cnode->definition && !cnode->alias)
{
diff --git a/gcc/ipa-prop.cc b/gcc/ipa-prop.cc
index 84d4fb5db67..17662ca027f 100644
--- a/gcc/ipa-prop.cc
+++ b/gcc/ipa-prop.cc
@@ -5482,8 +5482,8 @@ ipa_write_return_summaries (output_block *ob)
unsigned int count = 0;
for (int i = 0; i < lto_symtab_encoder_size (encoder); i++)
{
- symtab_node *snode = lto_symtab_encoder_deref (encoder, i);
- cgraph_node *cnode = dyn_cast <cgraph_node *> (snode);
+ toplevel_node *tnode = lto_symtab_encoder_deref (encoder, i);
+ cgraph_node *cnode = dyn_cast <cgraph_node *> (tnode);
ipa_return_value_summary *v;
if (cnode && cnode->definition && !cnode->alias
@@ -5495,8 +5495,8 @@ ipa_write_return_summaries (output_block *ob)
for (int i = 0; i < lto_symtab_encoder_size (encoder); i++)
{
- symtab_node *snode = lto_symtab_encoder_deref (encoder, i);
- cgraph_node *cnode = dyn_cast <cgraph_node *> (snode);
+ toplevel_node *tnode = lto_symtab_encoder_deref (encoder, i);
+ cgraph_node *cnode = dyn_cast <cgraph_node *> (tnode);
ipa_return_value_summary *v;
if (cnode && cnode->definition && !cnode->alias
@@ -5771,8 +5771,8 @@ ipcp_write_transformation_summaries (void)
for (int i = 0; i < lto_symtab_encoder_size (encoder); i++)
{
- symtab_node *snode = lto_symtab_encoder_deref (encoder, i);
- cgraph_node *cnode = dyn_cast <cgraph_node *> (snode);
+ toplevel_node *tnode = lto_symtab_encoder_deref (encoder, i);
+ cgraph_node *cnode = dyn_cast <cgraph_node *> (tnode);
if (!cnode)
continue;
ipcp_transformation *ts = ipcp_get_transformation_summary (cnode);
@@ -5785,8 +5785,8 @@ ipcp_write_transformation_summaries (void)
for (int i = 0; i < lto_symtab_encoder_size (encoder); i++)
{
- symtab_node *snode = lto_symtab_encoder_deref (encoder, i);
- cgraph_node *cnode = dyn_cast <cgraph_node *> (snode);
+ toplevel_node *tnode = lto_symtab_encoder_deref (encoder, i);
+ cgraph_node *cnode = dyn_cast <cgraph_node *> (tnode);
if (!cnode)
continue;
ipcp_transformation *ts = ipcp_get_transformation_summary (cnode);
diff --git a/gcc/ipa-reference.cc b/gcc/ipa-reference.cc
index 975341c9f6f..173c7a59dd2 100644
--- a/gcc/ipa-reference.cc
+++ b/gcc/ipa-reference.cc
@@ -1070,8 +1070,8 @@ ipa_reference_write_optimization_summary (void)
/* See what variables we are interested in. */
for (i = 0; i < lto_symtab_encoder_size (encoder); i++)
{
- symtab_node *snode = lto_symtab_encoder_deref (encoder, i);
- varpool_node *vnode = dyn_cast <varpool_node *> (snode);
+ toplevel_node *tnode = lto_symtab_encoder_deref (encoder, i);
+ varpool_node *vnode = dyn_cast <varpool_node *> (tnode);
int id;
if (vnode
@@ -1089,8 +1089,8 @@ ipa_reference_write_optimization_summary (void)
if (ltrans_statics_bitcount)
for (i = 0; i < lto_symtab_encoder_size (encoder); i++)
{
- symtab_node *snode = lto_symtab_encoder_deref (encoder, i);
- cgraph_node *cnode = dyn_cast <cgraph_node *> (snode);
+ toplevel_node *tnode = lto_symtab_encoder_deref (encoder, i);
+ cgraph_node *cnode = dyn_cast <cgraph_node *> (tnode);
if (cnode && write_node_summary_p (cnode, encoder, ltrans_statics))
count++;
}
@@ -1104,15 +1104,15 @@ ipa_reference_write_optimization_summary (void)
if (ltrans_statics_bitcount)
for (i = 0; i < lto_symtab_encoder_size (encoder); i++)
{
- symtab_node *snode = lto_symtab_encoder_deref (encoder, i);
- cgraph_node *cnode = dyn_cast <cgraph_node *> (snode);
+ toplevel_node *tnode = lto_symtab_encoder_deref (encoder, i);
+ cgraph_node *cnode = dyn_cast <cgraph_node *> (tnode);
if (cnode && write_node_summary_p (cnode, encoder, ltrans_statics))
{
ipa_reference_optimization_summary_t info;
int node_ref;
info = get_reference_optimization_summary (cnode);
- node_ref = lto_symtab_encoder_encode (encoder, snode);
+ node_ref = lto_symtab_encoder_encode (encoder, tnode);
streamer_write_uhwi_stream (ob->main_stream, node_ref);
stream_out_bitmap (ob, info->statics_read, ltrans_statics,
diff --git a/gcc/lto-cgraph.cc b/gcc/lto-cgraph.cc
index 0af2e889af8..d6e58351ce4 100644
--- a/gcc/lto-cgraph.cc
+++ b/gcc/lto-cgraph.cc
@@ -82,7 +82,7 @@ lto_symtab_encoder_new (bool for_input)
lto_symtab_encoder_t encoder = XCNEW (struct lto_symtab_encoder_d);
if (!for_input)
- encoder->map = new hash_map<symtab_node *, size_t>;
+ encoder->map = new hash_map<toplevel_node *, size_t>;
encoder->nodes.create (0);
return encoder;
}
@@ -108,7 +108,7 @@ lto_symtab_encoder_delete (lto_symtab_encoder_t encoder)
int
lto_symtab_encoder_encode (lto_symtab_encoder_t encoder,
- symtab_node *node)
+ toplevel_node *node)
{
int ref;
@@ -140,7 +140,7 @@ lto_symtab_encoder_encode (lto_symtab_encoder_t encoder,
bool
lto_symtab_encoder_delete_node (lto_symtab_encoder_t encoder,
- symtab_node *node)
+ toplevel_node *node)
{
int index;
@@ -214,7 +214,7 @@ lto_set_symtab_encoder_encode_initializer
(lto_symtab_encoder_t encoder,
bool
lto_symtab_encoder_in_partition_p (lto_symtab_encoder_t encoder,
- symtab_node *node)
+ toplevel_node *node)
{
int index = lto_symtab_encoder_lookup (encoder, node);
if (index == LCC_NOT_FOUND)
@@ -226,11 +226,16 @@ lto_symtab_encoder_in_partition_p (lto_symtab_encoder_t
encoder,
void
lto_set_symtab_encoder_in_partition (lto_symtab_encoder_t encoder,
- symtab_node *node)
+ toplevel_node *node)
{
int index = lto_symtab_encoder_encode (encoder, node);
if (dump_file)
- fprintf(dump_file, "Node %s, index %d\n", node->asm_name(), index);
+ {
+ if (symtab_node* snode = dyn_cast<symtab_node*> (node))
+ fprintf (dump_file, "Node %s, index %d\n", snode->asm_name (), index);
+ else
+ fprintf (dump_file, "Asm node, index %d\n", index);
+ }
encoder->nodes[index].in_partition = true;
}
@@ -767,7 +772,10 @@ output_refs (lto_symtab_encoder_t encoder)
for (int i = 0; i < lto_symtab_encoder_size (encoder); i++)
{
- symtab_node *node = lto_symtab_encoder_deref (encoder, i);
+ toplevel_node *tnode = lto_symtab_encoder_deref (encoder, i);
+ symtab_node *node = dyn_cast <symtab_node *> (tnode);
+ if (!node)
+ continue;
/* IPA_REF_ALIAS references are always preserved
in the boundary. Alias node can't have other references and
@@ -892,7 +900,7 @@ compute_ltrans_boundary (lto_symtab_encoder_t in_encoder)
pickle those too. */
for (i = 0; i < lto_symtab_encoder_size (encoder); i++)
{
- symtab_node *node = lto_symtab_encoder_deref (encoder, i);
+ toplevel_node *node = lto_symtab_encoder_deref (encoder, i);
if (varpool_node *vnode = dyn_cast <varpool_node *> (node))
{
if (!lto_symtab_encoder_encode_initializer_p (encoder,
@@ -959,7 +967,11 @@ compute_ltrans_boundary (lto_symtab_encoder_t in_encoder)
to stay to aid local calling conventions. */
for (i = 0; i < lto_symtab_encoder_size (encoder); i++)
{
- symtab_node *node = lto_symtab_encoder_deref (encoder, i);
+ toplevel_node *tnode = lto_symtab_encoder_deref (encoder, i);
+ symtab_node *node = dyn_cast <symtab_node *> (tnode);
+ if (!node)
+ continue;
+
cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
if (node->alias && node->analyzed)
@@ -1009,11 +1021,11 @@ output_symtab (void)
n_nodes = lto_symtab_encoder_size (encoder);
for (i = 0; i < n_nodes; i++)
{
- symtab_node *node = lto_symtab_encoder_deref (encoder, i);
+ toplevel_node *node = lto_symtab_encoder_deref (encoder, i);
if (cgraph_node *cnode = dyn_cast <cgraph_node *> (node))
lto_output_node (ob, cnode, encoder);
- else
- lto_output_varpool_node (ob, dyn_cast<varpool_node *> (node), encoder);
+ else if (varpool_node *vnode = dyn_cast <varpool_node *> (node))
+ lto_output_varpool_node (ob, vnode, encoder);
}
/* Go over the nodes in SET again to write edges. */
@@ -2105,7 +2117,7 @@ output_cgraph_opt_summary (void)
n_nodes = lto_symtab_encoder_size (encoder);
for (i = 0; i < n_nodes; i++)
{
- symtab_node *node = lto_symtab_encoder_deref (encoder, i);
+ toplevel_node *node = lto_symtab_encoder_deref (encoder, i);
cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
if (cnode && output_cgraph_opt_summary_p (cnode))
count++;
@@ -2113,7 +2125,7 @@ output_cgraph_opt_summary (void)
streamer_write_uhwi (ob, count);
for (i = 0; i < n_nodes; i++)
{
- symtab_node *node = lto_symtab_encoder_deref (encoder, i);
+ toplevel_node *node = lto_symtab_encoder_deref (encoder, i);
cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
if (cnode && output_cgraph_opt_summary_p (cnode))
{
diff --git a/gcc/lto-streamer-out.cc b/gcc/lto-streamer-out.cc
index 308ab3416b3..e5de8d80cf4 100644
--- a/gcc/lto-streamer-out.cc
+++ b/gcc/lto-streamer-out.cc
@@ -2851,16 +2851,18 @@ lto_output (void)
section copying. */
for (i = 0; i < n_nodes; i++)
{
- symtab_node *snode = lto_symtab_encoder_deref (encoder, i);
- if (snode->alias)
+ toplevel_node *tnode = lto_symtab_encoder_deref (encoder, i);
+ symtab_node *node = dyn_cast <symtab_node *> (tnode);
+ if (!node || node->alias)
continue;
- if (cgraph_node *node = dyn_cast <cgraph_node *> (snode))
+
+ if (cgraph_node *node = dyn_cast <cgraph_node *> (tnode))
{
if (lto_symtab_encoder_encode_body_p (encoder, node)
&& !node->clone_of)
symbols_to_copy.safe_push (node);
}
- else if (varpool_node *node = dyn_cast <varpool_node *> (snode))
+ else if (varpool_node *node = dyn_cast <varpool_node *> (tnode))
{
/* Wrap symbol references inside the ctor in a type
preserving MEM_REF. */
@@ -3202,7 +3204,10 @@ produce_symtab (struct output_block *ob)
for (lsei = lsei_start (encoder);
!lsei_end_p (lsei); lsei_next (&lsei))
{
- symtab_node *node = lsei_node (lsei);
+ toplevel_node *tnode = lsei_node (lsei);
+ symtab_node *node = dyn_cast<symtab_node*> (tnode);
+ if (!node)
+ continue;
if (DECL_EXTERNAL (node->decl) || !node->output_to_lto_symbol_table_p ())
continue;
@@ -3212,7 +3217,10 @@ produce_symtab (struct output_block *ob)
for (lsei = lsei_start (encoder);
!lsei_end_p (lsei); lsei_next (&lsei))
{
- symtab_node *node = lsei_node (lsei);
+ toplevel_node *tnode = lsei_node (lsei);
+ symtab_node *node = dyn_cast<symtab_node*> (tnode);
+ if (!node)
+ continue;
if (!DECL_EXTERNAL (node->decl) || !node->output_to_lto_symbol_table_p
())
continue;
@@ -3253,7 +3261,10 @@ produce_symtab_extension (struct output_block *ob,
for (lsei = lsei_start (encoder);
!lsei_end_p (lsei); lsei_next (&lsei))
{
- symtab_node *node = lsei_node (lsei);
+ toplevel_node *tnode = lsei_node (lsei);
+ symtab_node *node = dyn_cast<symtab_node*> (tnode);
+ if (!node)
+ continue;
if (DECL_EXTERNAL (node->decl) || !node->output_to_lto_symbol_table_p ())
continue;
@@ -3263,7 +3274,10 @@ produce_symtab_extension (struct output_block *ob,
for (lsei = lsei_start (encoder);
!lsei_end_p (lsei); lsei_next (&lsei))
{
- symtab_node *node = lsei_node (lsei);
+ toplevel_node *tnode = lsei_node (lsei);
+ symtab_node *node = dyn_cast<symtab_node*> (tnode);
+ if (!node)
+ continue;
if (!DECL_EXTERNAL (node->decl) || !node->output_to_lto_symbol_table_p
())
continue;
diff --git a/gcc/lto-streamer.h b/gcc/lto-streamer.h
index 4b7209e3d82..a1ec3b67b2f 100644
--- a/gcc/lto-streamer.h
+++ b/gcc/lto-streamer.h
@@ -444,12 +444,12 @@ struct lto_stats_d
struct lto_encoder_entry
{
/* Constructor. */
- lto_encoder_entry (symtab_node* n)
+ lto_encoder_entry (toplevel_node* n)
: node (n), in_partition (false), body (false), only_for_inlining (true),
initializer (false)
{}
- symtab_node *node;
+ toplevel_node *node;
/* Is the node in this partition (i.e. ltrans of this partition will
be responsible for outputting it)? */
unsigned int in_partition:1;
@@ -468,7 +468,7 @@ struct lto_encoder_entry
struct lto_symtab_encoder_d
{
vec<lto_encoder_entry> nodes;
- hash_map<symtab_node *, size_t> *map;
+ hash_map<toplevel_node *, size_t> *map;
/* Mapping of input order of nodes onto output order. */
hash_map<int_hash<int, -1, -2>, int> *order_remap;
@@ -918,17 +918,17 @@ void lto_prepare_function_for_streaming (cgraph_node *);
/* In lto-cgraph.cc */
extern bool asm_nodes_output;
lto_symtab_encoder_t lto_symtab_encoder_new (bool);
-int lto_symtab_encoder_encode (lto_symtab_encoder_t, symtab_node *);
+int lto_symtab_encoder_encode (lto_symtab_encoder_t, toplevel_node *);
void lto_symtab_encoder_delete (lto_symtab_encoder_t);
-bool lto_symtab_encoder_delete_node (lto_symtab_encoder_t, symtab_node *);
+bool lto_symtab_encoder_delete_node (lto_symtab_encoder_t, toplevel_node *);
bool lto_symtab_encoder_encode_body_p (lto_symtab_encoder_t,
struct cgraph_node *);
bool lto_symtab_encoder_only_for_inlining_p (lto_symtab_encoder_t,
struct cgraph_node *);
bool lto_symtab_encoder_in_partition_p (lto_symtab_encoder_t,
- symtab_node *);
+ toplevel_node *);
void lto_set_symtab_encoder_in_partition (lto_symtab_encoder_t,
- symtab_node *);
+ toplevel_node *);
bool lto_symtab_encoder_encode_initializer_p (lto_symtab_encoder_t,
varpool_node *);
@@ -1104,7 +1104,7 @@ lto_symtab_encoder_size (lto_symtab_encoder_t encoder)
inline int
lto_symtab_encoder_lookup (lto_symtab_encoder_t encoder,
- symtab_node *node)
+ toplevel_node *node)
{
size_t *slot = encoder->map->get (node);
return (slot && *slot ? *(slot) - 1 : LCC_NOT_FOUND);
@@ -1125,7 +1125,7 @@ lsei_next (lto_symtab_encoder_iterator *lsei)
}
/* Return the node pointed to by LSI. */
-inline symtab_node *
+inline toplevel_node *
lsei_node (lto_symtab_encoder_iterator lsei)
{
return lsei.encoder->nodes[lsei.index].node;
@@ -1147,7 +1147,7 @@ lsei_varpool_node (lto_symtab_encoder_iterator lsei)
/* Return the cgraph node corresponding to REF using ENCODER. */
-inline symtab_node *
+inline toplevel_node *
lto_symtab_encoder_deref (lto_symtab_encoder_t encoder, int ref)
{
if (ref == LCC_NOT_FOUND)
diff --git a/gcc/lto/lto-partition.cc b/gcc/lto/lto-partition.cc
index 650bf638162..a9d7dbb48e9 100644
--- a/gcc/lto/lto-partition.cc
+++ b/gcc/lto/lto-partition.cc
@@ -43,7 +43,8 @@ along with GCC; see the file COPYING3. If not see
vec<ltrans_partition> ltrans_partitions;
-static void add_symbol_to_partition (ltrans_partition part, symtab_node *node);
+static void add_symbol_to_partition (ltrans_partition part,
+ toplevel_node *node);
/* Helper for qsort; compare partitions and return one with smaller order. */
@@ -266,9 +267,15 @@ contained_in_symbol (symtab_node *node)
of other symbol definition, add the other symbol, too. */
static void
-add_symbol_to_partition (ltrans_partition part, symtab_node *node)
+add_symbol_to_partition (ltrans_partition part, toplevel_node *tnode)
{
symtab_node *node1;
+ symtab_node* node = dyn_cast <symtab_node*> (tnode);
+ if (!node)
+ {
+ lto_set_symtab_encoder_in_partition (part->encoder, tnode);
+ return;
+ }
/* Verify that we do not try to duplicate something that cannot be. */
gcc_checking_assert (node->get_partitioning_class () == SYMBOL_DUPLICATE
@@ -299,21 +306,25 @@ undo_partition (ltrans_partition partition, unsigned int
n_nodes)
{
while (lto_symtab_encoder_size (partition->encoder) > (int)n_nodes)
{
- symtab_node *node = lto_symtab_encoder_deref (partition->encoder,
- n_nodes);
- partition->symbols--;
- cgraph_node *cnode;
+ toplevel_node *tnode = lto_symtab_encoder_deref (partition->encoder,
+ n_nodes);
/* After UNDO we no longer know what was visited. */
if (partition->initializers_visited)
delete partition->initializers_visited;
partition->initializers_visited = NULL;
- if (!node->alias && (cnode = dyn_cast <cgraph_node *> (node))
- && node->get_partitioning_class () == SYMBOL_PARTITION)
- partition->insns -= ipa_size_summaries->get (cnode)->size;
- lto_symtab_encoder_delete_node (partition->encoder, node);
- node->aux = (void *)((size_t)node->aux - 1);
+ lto_symtab_encoder_delete_node (partition->encoder, tnode);
+
+ if (symtab_node* node = dyn_cast <symtab_node *> (tnode))
+ {
+ partition->symbols--;
+ cgraph_node *cnode;
+ if (!node->alias && (cnode = dyn_cast <cgraph_node *> (node))
+ && node->get_partitioning_class () == SYMBOL_PARTITION)
+ partition->insns -= ipa_size_summaries->get (cnode)->size;
+ node->aux = (void *)((size_t)node->aux - 1);
+ }
}
}
@@ -467,16 +478,17 @@ join_partitions (ltrans_partition into, ltrans_partition
from)
before adding any symbols to other partition. */
for (lsei = lsei_start (encoder); !lsei_end_p (lsei); lsei_next (&lsei))
{
- symtab_node *node = lsei_node (lsei);
- node->aux = (void *)((size_t)node->aux - 1);
+ if (symtab_node *node = dyn_cast <symtab_node*> (lsei_node (lsei)))
+ node->aux = (void *)((size_t)node->aux - 1);
}
for (lsei = lsei_start (encoder); !lsei_end_p (lsei); lsei_next (&lsei))
{
- symtab_node *node = lsei_node (lsei);
+ toplevel_node *node = lsei_node (lsei);
- if (symbol_partitioned_p (node))
- continue;
+ if (symtab_node *snode = dyn_cast <symtab_node*> (node))
+ if (symbol_partitioned_p (snode))
+ continue;
add_symbol_to_partition (into, node);
}
@@ -498,16 +510,17 @@ split_partition_into_nodes (ltrans_partition part)
for (lsei = lsei_start (encoder); !lsei_end_p (lsei); lsei_next (&lsei))
{
- symtab_node *node = lsei_node (lsei);
- node->aux = (void *)((size_t)node->aux - 1);
+ if (symtab_node *node = dyn_cast <symtab_node*> (lsei_node (lsei)))
+ node->aux = (void *)((size_t)node->aux - 1);
}
for (lsei = lsei_start (encoder); !lsei_end_p (lsei); lsei_next (&lsei))
{
- symtab_node *node = lsei_node (lsei);
+ toplevel_node *node = lsei_node (lsei);
- if (node->get_partitioning_class () != SYMBOL_PARTITION
- || symbol_partitioned_p (node))
+ symtab_node *snode = dyn_cast <symtab_node*> (node);
+ if (snode->get_partitioning_class () != SYMBOL_PARTITION
+ || symbol_partitioned_p (snode))
continue;
ltrans_partition new_part = new_partition_no_push (part->name);
@@ -527,8 +540,8 @@ is_partition_reorder (ltrans_partition part)
for (lsei = lsei_start (encoder); !lsei_end_p (lsei); lsei_next (&lsei))
{
- symtab_node *node = lsei_node (lsei);
- if (node->no_reorder)
+ symtab_node *node = dyn_cast <symtab_node*> (lsei_node (lsei));
+ if (!node || node->no_reorder)
return false;
}
return true;
@@ -1172,8 +1185,12 @@ lto_balanced_map (int n_lto_partitions, int
max_partition_size)
{
int j;
struct ipa_ref *ref = NULL;
- symtab_node *snode = lto_symtab_encoder_deref (partition->encoder,
- last_visited_node);
+ toplevel_node *tnode = lto_symtab_encoder_deref (partition->encoder,
+ last_visited_node);
+
+ symtab_node* snode = dyn_cast <symtab_node*> (tnode);
+ if (!snode)
+ continue;
if (cgraph_node *node = dyn_cast <cgraph_node *> (snode))
{
@@ -1862,7 +1879,10 @@ lto_promote_cross_file_statics (void)
for (lsei = lsei_start (encoder); !lsei_end_p (lsei);
lsei_next (&lsei))
{
- symtab_node *node = lsei_node (lsei);
+ toplevel_node *tnode = lsei_node (lsei);
+ symtab_node *node = dyn_cast <symtab_node*> (tnode);
+ if (!node)
+ continue;
/* If symbol is static, rename it if its assembler name
clashes with anything else in this unit. */
diff --git a/gcc/lto/lto.cc b/gcc/lto/lto.cc
index 183634f2abf..7935b1d1cd8 100644
--- a/gcc/lto/lto.cc
+++ b/gcc/lto/lto.cc
@@ -381,14 +381,17 @@ lto_wpa_write_files (void)
!lsei_end_p (lsei);
lsei_next_in_partition (&lsei))
{
- symtab_node *node = lsei_node (lsei);
- fprintf (symtab->dump_file, "%s ", node->dump_asm_name ());
+ symtab_node *node = dyn_cast<symtab_node*> (lsei_node (lsei));
+ if (node)
+ fprintf (symtab->dump_file, "%s ", node->dump_asm_name ());
}
fprintf (symtab->dump_file, "\n Symbols in boundary: ");
for (lsei = lsei_start (part->encoder); !lsei_end_p (lsei);
lsei_next (&lsei))
{
- symtab_node *node = lsei_node (lsei);
+ symtab_node *node = dyn_cast<symtab_node*> (lsei_node (lsei));
+ if (!node)
+ continue;
if (!lto_symtab_encoder_in_partition_p (part->encoder, node))
{
fprintf (symtab->dump_file, "%s ", node->dump_asm_name ());
--
2.50.0