diff options
Diffstat (limited to 'gcc/lto-streamer.h')
-rw-r--r-- | gcc/lto-streamer.h | 176 |
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) |