bp_pack_value (bp, edge->indirect_inlining_edge, 1);
bp_pack_value (bp, edge->call_stmt_cannot_inline_p, 1);
bp_pack_value (bp, edge->can_throw_external, 1);
- if (edge->indirect_unknown_callee)
- {
- int flags = edge->indirect_info->ecf_flags;
- bp_pack_value (bp, (flags & ECF_CONST) != 0, 1);
- bp_pack_value (bp, (flags & ECF_PURE) != 0, 1);
- bp_pack_value (bp, (flags & ECF_NORETURN) != 0, 1);
- bp_pack_value (bp, (flags & ECF_MALLOC) != 0, 1);
- bp_pack_value (bp, (flags & ECF_NOTHROW) != 0, 1);
- bp_pack_value (bp, (flags & ECF_RETURNS_TWICE) != 0, 1);
- /* Flags that should not appear on indirect calls. */
- gcc_assert (!(flags & (ECF_LOOPING_CONST_OR_PURE
- | ECF_MAY_BE_ALLOCA
- | ECF_SIBCALL
- | ECF_NOVOPS)));
- }
lto_output_bitpack (ob->main_stream, bp);
bitpack_delete (bp);
}
/* Return if LIST contain references from other partitions. */
-
bool
referenced_from_other_partition_p (struct ipa_ref_list *list, cgraph_node_set set,
varpool_node_set vset)
/* Return true when node is reachable from other partition. */
-bool
+static bool
reachable_from_other_partition_p (struct cgraph_node *node, cgraph_node_set set)
{
struct cgraph_edge *e;
+ if (node->needed)
+ return true;
if (!node->analyzed)
return false;
if (node->global.inlined_to)
return false;
}
-/* Return if LIST contain references from other partitions. */
-
-bool
-referenced_from_this_partition_p (struct ipa_ref_list *list, cgraph_node_set set,
- varpool_node_set vset)
-{
- int i;
- struct ipa_ref *ref;
- for (i = 0; ipa_ref_list_refering_iterate (list, i, ref); i++)
- {
- if (ref->refering_type == IPA_REF_CGRAPH)
- {
- if (cgraph_node_in_set_p (ipa_ref_refering_node (ref), set))
- return true;
- }
- else
- {
- if (varpool_node_in_set_p (ipa_ref_refering_varpool_node (ref),
- vset))
- return true;
- }
- }
- return false;
-}
-
-/* Return true when node is reachable from other partition. */
-
-bool
-reachable_from_this_partition_p (struct cgraph_node *node, cgraph_node_set set)
-{
- struct cgraph_edge *e;
- if (!node->analyzed)
- return false;
- if (node->global.inlined_to)
- return false;
- for (e = node->callers; e; e = e->next_caller)
- if (cgraph_node_in_set_p (e->caller, set))
- return true;
- return false;
-}
-
/* Output the cgraph NODE to OB. ENCODER is used to find the
reference number of NODE->inlined_to. SET is the set of nodes we
are writing to the current file. If NODE is not in SET, then NODE
static void
lto_output_node (struct lto_simple_output_block *ob, struct cgraph_node *node,
lto_cgraph_encoder_t encoder, cgraph_node_set set,
- varpool_node_set vset,
bitmap written_decls)
{
unsigned int tag;
bp_pack_value (bp, node->address_taken, 1);
bp_pack_value (bp, node->abstract_and_needed, 1);
bp_pack_value (bp, tag == LTO_cgraph_analyzed_node
- && !DECL_EXTERNAL (node->decl)
- && (reachable_from_other_partition_p (node, set)
- || referenced_from_other_partition_p (&node->ref_list, set, vset)), 1);
+ && reachable_from_other_partition_p (node, set), 1);
bp_pack_value (bp, node->lowered, 1);
bp_pack_value (bp, in_other_partition, 1);
bp_pack_value (bp, node->alias, 1);
lto_destroy_simple_output_block (ob);
}
-/* Find out all cgraph and varpool nodes we want to encode in current unit
- and insert them to encoders. */
+
+/* Output the part of the cgraph in SET. */
+
void
-compute_ltrans_boundary (struct lto_out_decl_state *state,
- cgraph_node_set set, varpool_node_set vset)
+output_cgraph (cgraph_node_set set, varpool_node_set vset)
{
struct cgraph_node *node;
+ struct lto_simple_output_block *ob;
cgraph_node_set_iterator csi;
varpool_node_set_iterator vsi;
struct cgraph_edge *edge;
- int i;
+ int i, n_nodes;
+ bitmap written_decls;
lto_cgraph_encoder_t encoder;
lto_varpool_encoder_t varpool_encoder;
+ struct cgraph_asm_node *can;
+ struct varpool_node *vnode;
+
+ ob = lto_create_simple_output_block (LTO_section_cgraph);
- encoder = state->cgraph_node_encoder = lto_cgraph_encoder_new ();
- varpool_encoder = state->varpool_node_encoder = lto_varpool_encoder_new ();
+ output_profile_summary (ob);
+
+ /* An encoder for cgraph nodes should have been created by
+ ipa_write_summaries_1. */
+ gcc_assert (ob->decl_state->cgraph_node_encoder);
+ gcc_assert (ob->decl_state->varpool_node_encoder);
+ encoder = ob->decl_state->cgraph_node_encoder;
+ varpool_encoder = ob->decl_state->varpool_node_encoder;
+
+ /* The FUNCTION_DECLs for which we have written a node. The first
+ node found is written as the "original" node, the remaining nodes
+ are considered its clones. */
+ written_decls = lto_bitmap_alloc ();
/* Go over all the nodes in SET and assign references. */
for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi))
lto_set_varpool_encoder_encode_initializer (varpool_encoder, vnode);
add_references (encoder, varpool_encoder, &vnode->ref_list);
}
+ /* FIXME: We can not currenlty remove any varpool nodes or we get ICE merging
+ binfos. */
+ for (vnode = varpool_nodes; vnode; vnode = vnode->next)
+ if (vnode->needed)
+ lto_varpool_encoder_encode (varpool_encoder, vnode);
/* Pickle in also the initializer of all referenced readonly variables
to help folding. Constant pool variables are not shared, so we must
pickle those too. */
}
}
}
-}
-
-/* Output the part of the cgraph in SET. */
-
-void
-output_cgraph (cgraph_node_set set, varpool_node_set vset)
-{
- struct cgraph_node *node;
- struct lto_simple_output_block *ob;
- cgraph_node_set_iterator csi;
- int i, n_nodes;
- bitmap written_decls;
- lto_cgraph_encoder_t encoder;
- lto_varpool_encoder_t varpool_encoder;
- struct cgraph_asm_node *can;
-
- ob = lto_create_simple_output_block (LTO_section_cgraph);
-
- output_profile_summary (ob);
-
- /* An encoder for cgraph nodes should have been created by
- ipa_write_summaries_1. */
- gcc_assert (ob->decl_state->cgraph_node_encoder);
- gcc_assert (ob->decl_state->varpool_node_encoder);
- encoder = ob->decl_state->cgraph_node_encoder;
- varpool_encoder = ob->decl_state->varpool_node_encoder;
-
- /* The FUNCTION_DECLs for which we have written a node. The first
- node found is written as the "original" node, the remaining nodes
- are considered its clones. */
- written_decls = lto_bitmap_alloc ();
/* Write out the nodes. We must first output a node and then its clones,
otherwise at a time reading back the node there would be nothing to clone
for (i = 0; i < n_nodes; i++)
{
node = lto_cgraph_encoder_deref (encoder, i);
- lto_output_node (ob, node, encoder, set, vset, written_decls);
+ lto_output_node (ob, node, encoder, set, written_decls);
}
lto_bitmap_free (written_decls);
cgraph_inline_failed_t inline_failed;
struct bitpack_d *bp;
enum ld_plugin_symbol_resolution caller_resolution;
- int ecf_flags = 0;
caller = VEC_index (cgraph_node_ptr, nodes, lto_input_sleb128 (ib));
if (caller == NULL || caller->decl == NULL_TREE)
return;
if (indirect)
- edge = cgraph_create_indirect_edge (caller, NULL, 0, count, freq, nest);
+ edge = cgraph_create_indirect_edge (caller, NULL, count, freq, nest);
else
edge = cgraph_create_edge (caller, callee, NULL, count, freq, nest);
edge->inline_failed = inline_failed;
edge->call_stmt_cannot_inline_p = bp_unpack_value (bp, 1);
edge->can_throw_external = bp_unpack_value (bp, 1);
- if (indirect)
- {
- if (bp_unpack_value (bp, 1))
- ecf_flags |= ECF_CONST;
- if (bp_unpack_value (bp, 1))
- ecf_flags |= ECF_PURE;
- if (bp_unpack_value (bp, 1))
- ecf_flags |= ECF_NORETURN;
- if (bp_unpack_value (bp, 1))
- ecf_flags |= ECF_MALLOC;
- if (bp_unpack_value (bp, 1))
- ecf_flags |= ECF_NOTHROW;
- if (bp_unpack_value (bp, 1))
- ecf_flags |= ECF_RETURNS_TWICE;
- edge->indirect_info->ecf_flags = ecf_flags;
- }
bitpack_delete (bp);
}