aboutsummaryrefslogtreecommitdiff
path: root/gcc/lto-streamer.h
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/lto-streamer.h')
-rw-r--r--gcc/lto-streamer.h176
1 files changed, 162 insertions, 14 deletions
diff --git a/gcc/lto-streamer.h b/gcc/lto-streamer.h
index b874b0a..bed408a 100644
--- a/gcc/lto-streamer.h
+++ b/gcc/lto-streamer.h
@@ -433,17 +433,21 @@ struct lto_symtab_encoder_d
struct pointer_set_t *body;
/* Map of nodes where we want to output initializer. */
struct pointer_set_t *initializer;
+ /* Map of nodes in this partition. */
+ struct pointer_set_t *in_partition;
};
typedef struct lto_symtab_encoder_d *lto_symtab_encoder_t;
-/* Return number of encoded nodes in ENCODER. */
-
-static inline int
-lto_symtab_encoder_size (lto_symtab_encoder_t encoder)
+/* Iterator structure for cgraph node sets. */
+typedef struct
{
- return VEC_length (symtab_node, encoder->nodes);
-}
+ lto_symtab_encoder_t encoder;
+ unsigned index;
+} lto_symtab_encoder_iterator;
+
+
+
/* Mapping from indices to trees. */
struct GTY(()) lto_tree_ref_table
@@ -808,28 +812,29 @@ void lto_output_location (struct output_block *, location_t);
/* In lto-cgraph.c */
-symtab_node lto_symtab_encoder_deref (lto_symtab_encoder_t, int);
int lto_symtab_encoder_lookup (lto_symtab_encoder_t, symtab_node);
lto_symtab_encoder_t lto_symtab_encoder_new (void);
int lto_symtab_encoder_encode (lto_symtab_encoder_t, symtab_node);
void lto_symtab_encoder_delete (lto_symtab_encoder_t);
bool lto_symtab_encoder_encode_body_p (lto_symtab_encoder_t,
struct cgraph_node *);
+bool lto_symtab_encoder_in_partition_p (lto_symtab_encoder_t,
+ symtab_node);
+void lto_set_symtab_encoder_in_partition (lto_symtab_encoder_t,
+ symtab_node);
bool lto_symtab_encoder_encode_initializer_p (lto_symtab_encoder_t,
struct varpool_node *);
-void output_symtab (cgraph_node_set, varpool_node_set);
+void output_symtab (void);
void input_symtab (void);
bool referenced_from_other_partition_p (struct ipa_ref_list *,
- cgraph_node_set,
- varpool_node_set vset);
+ lto_symtab_encoder_t);
bool reachable_from_other_partition_p (struct cgraph_node *,
- cgraph_node_set);
+ lto_symtab_encoder_t);
bool referenced_from_this_partition_p (struct ipa_ref_list *,
- cgraph_node_set,
- varpool_node_set vset);
+ lto_symtab_encoder_t);
bool reachable_from_this_partition_p (struct cgraph_node *,
- cgraph_node_set);
+ lto_symtab_encoder_t);
void compute_ltrans_boundary (struct lto_out_decl_state *state,
cgraph_node_set, varpool_node_set);
@@ -985,6 +990,149 @@ emit_label_in_global_context_p (tree label)
return DECL_NONLOCAL (label) || FORCED_LABEL (label);
}
+/* Return number of encoded nodes in ENCODER. */
+static inline int
+lto_symtab_encoder_size (lto_symtab_encoder_t encoder)
+{
+ return VEC_length (symtab_node, encoder->nodes);
+}
+
+/* Return true if iterator LSE points to nothing. */
+static inline bool
+lsei_end_p (lto_symtab_encoder_iterator lsei)
+{
+ return lsei.index >= (unsigned)lto_symtab_encoder_size (lsei.encoder);
+}
+
+/* Advance iterator LSE. */
+static inline void
+lsei_next (lto_symtab_encoder_iterator *lsei)
+{
+ lsei->index++;
+}
+
+/* Return the node pointed to by LSI. */
+static inline symtab_node
+lsei_node (lto_symtab_encoder_iterator lsei)
+{
+ return VEC_index (symtab_node, lsei.encoder->nodes, lsei.index);
+}
+
+/* Return the node pointed to by LSI. */
+static inline struct cgraph_node *
+lsei_cgraph_node (lto_symtab_encoder_iterator lsei)
+{
+ return cgraph (VEC_index (symtab_node, lsei.encoder->nodes, lsei.index));
+}
+
+/* Return the node pointed to by LSI. */
+static inline struct varpool_node *
+lsei_varpool_node (lto_symtab_encoder_iterator lsei)
+{
+ return varpool (VEC_index (symtab_node, lsei.encoder->nodes, lsei.index));
+}
+
+/* Value used to represent failure of lto_symtab_encoder_lookup. */
+#define LCC_NOT_FOUND (-1)
+
+/* Return the cgraph node corresponding to REF using ENCODER. */
+
+static inline symtab_node
+lto_symtab_encoder_deref (lto_symtab_encoder_t encoder, int ref)
+{
+ if (ref == LCC_NOT_FOUND)
+ return NULL;
+
+ return VEC_index (symtab_node, encoder->nodes, ref);
+}
+
+/* Return an iterator to the first node in LSI. */
+static inline lto_symtab_encoder_iterator
+lsei_start (lto_symtab_encoder_t encoder)
+{
+ lto_symtab_encoder_iterator lsei;
+
+ lsei.encoder = encoder;
+ lsei.index = 0;
+ return lsei;
+}
+
+/* Advance iterator LSE. */
+static inline void
+lsei_next_in_partition (lto_symtab_encoder_iterator *lsei)
+{
+ lsei_next (lsei);
+ while (!lsei_end_p (*lsei)
+ && !lto_symtab_encoder_in_partition_p (lsei->encoder, lsei_node (*lsei)))
+ lsei_next (lsei);
+}
+
+/* Return an iterator to the first node in LSI. */
+static inline lto_symtab_encoder_iterator
+lsei_start_in_partition (lto_symtab_encoder_t encoder)
+{
+ lto_symtab_encoder_iterator lsei = lsei_start (encoder);
+
+ if (lsei_end_p (lsei))
+ return lsei;
+ if (!lto_symtab_encoder_in_partition_p (encoder, lsei_node (lsei)))
+ lsei_next_in_partition (&lsei);
+
+ return lsei;
+}
+
+/* Advance iterator LSE. */
+static inline void
+lsei_next_function_in_partition (lto_symtab_encoder_iterator *lsei)
+{
+ lsei_next (lsei);
+ while (!lsei_end_p (*lsei)
+ && (!symtab_function_p (lsei_node (*lsei))
+ || !lto_symtab_encoder_in_partition_p (lsei->encoder, lsei_node (*lsei))))
+ lsei_next (lsei);
+}
+
+/* Return an iterator to the first node in LSI. */
+static inline lto_symtab_encoder_iterator
+lsei_start_function_in_partition (lto_symtab_encoder_t encoder)
+{
+ lto_symtab_encoder_iterator lsei = lsei_start (encoder);
+
+ if (lsei_end_p (lsei))
+ return lsei;
+ if (!symtab_function_p (lsei_node (lsei))
+ || !lto_symtab_encoder_in_partition_p (encoder, lsei_node (lsei)))
+ lsei_next_function_in_partition (&lsei);
+
+ return lsei;
+}
+
+/* Advance iterator LSE. */
+static inline void
+lsei_next_variable_in_partition (lto_symtab_encoder_iterator *lsei)
+{
+ lsei_next (lsei);
+ while (!lsei_end_p (*lsei)
+ && (!symtab_variable_p (lsei_node (*lsei))
+ || !lto_symtab_encoder_in_partition_p (lsei->encoder, lsei_node (*lsei))))
+ lsei_next (lsei);
+}
+
+/* Return an iterator to the first node in LSI. */
+static inline lto_symtab_encoder_iterator
+lsei_start_variable_in_partition (lto_symtab_encoder_t encoder)
+{
+ lto_symtab_encoder_iterator lsei = lsei_start (encoder);
+
+ if (lsei_end_p (lsei))
+ return lsei;
+ if (!symtab_variable_p (lsei_node (lsei))
+ || !lto_symtab_encoder_in_partition_p (encoder, lsei_node (lsei)))
+ lsei_next_variable_in_partition (&lsei);
+
+ return lsei;
+}
+
DEFINE_DECL_STREAM_FUNCS (TYPE, type)
DEFINE_DECL_STREAM_FUNCS (FIELD_DECL, field_decl)
DEFINE_DECL_STREAM_FUNCS (FN_DECL, fn_decl)