OSDN Git Service

* config/mips/dbxmdebug.h: Remove.
[pf3gnuchains/gcc-fork.git] / gcc / lto-cgraph.c
index acac0e0..5d05731 100644 (file)
@@ -282,27 +282,11 @@ lto_output_edge (struct lto_simple_output_block *ob, struct cgraph_edge *edge,
   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)
@@ -328,10 +312,12 @@ referenced_from_other_partition_p (struct ipa_ref_list *list, cgraph_node_set se
 
 /* 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)
@@ -342,47 +328,6 @@ reachable_from_other_partition_p (struct cgraph_node *node, cgraph_node_set set)
   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
@@ -394,7 +339,6 @@ reachable_from_this_partition_p (struct cgraph_node *node, cgraph_node_set set)
 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;
@@ -456,9 +400,7 @@ lto_output_node (struct lto_simple_output_block *ob, struct cgraph_node *node,
   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);
@@ -736,22 +678,39 @@ output_refs (cgraph_node_set set, varpool_node_set vset,
   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))
@@ -768,6 +727,11 @@ compute_ltrans_boundary (struct lto_out_decl_state *state,
       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.  */
@@ -801,37 +765,6 @@ compute_ltrans_boundary (struct lto_out_decl_state *state,
            }
        }
     }
-}
-
-/* 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
@@ -840,7 +773,7 @@ output_cgraph (cgraph_node_set set, varpool_node_set vset)
   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);
@@ -1132,7 +1065,6 @@ input_edge (struct lto_input_block *ib, VEC(cgraph_node_ptr, heap) *nodes,
   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)
@@ -1164,7 +1096,7 @@ input_edge (struct lto_input_block *ib, VEC(cgraph_node_ptr, heap) *nodes,
     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);
 
@@ -1173,22 +1105,6 @@ input_edge (struct lto_input_block *ib, VEC(cgraph_node_ptr, heap) *nodes,
   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);
 }