diff options
author | Jan Hubicka <jh@suse.cz> | 2011-05-03 19:22:58 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2011-05-03 17:22:58 +0000 |
commit | 1cb1a99f77b15cd8342ffbb0cd89cc0110350c48 (patch) | |
tree | 29d6574c5d8892da7a62fdb54c7eabbacb56e4b1 /gcc/ipa-utils.c | |
parent | b445518d112c0cd481b15df83fbef474cf4058d6 (diff) | |
download | gcc-1cb1a99f77b15cd8342ffbb0cd89cc0110350c48.zip gcc-1cb1a99f77b15cd8342ffbb0cd89cc0110350c48.tar.gz gcc-1cb1a99f77b15cd8342ffbb0cd89cc0110350c48.tar.bz2 |
cgraph.h (cgraph_node_set_def, [...]): Move out of GTY; replace hash by pointer map.
* cgraph.h (cgraph_node_set_def, varpool_node_set_def): Move out of GTY;
replace hash by pointer map.
(cgraph_node_set_element_def, cgraph_node_set_element,
const_cgraph_node_set_element, varpool_node_set_element_def,
varpool_node_set_element, const_varpool_node_set_element): Remove.
(free_cgraph_node_set, free_varpool_node_set): New function.
(cgraph_node_set_size, varpool_node_set_size): Use vector size.
* tree-emutls.c: Free varpool node set.
* ipa-utils.c (cgraph_node_set_new, cgraph_node_set_add,
cgraph_node_set_remove, cgraph_node_set_find, dump_cgraph_node_set,
debug_cgraph_node_set, free_cgraph_node_set, varpool_node_set_new,
varpool_node_set_add, varpool_node_set_remove, varpool_node_set_find,
dump_varpool_node_set, free_varpool_node_set, debug_varpool_node_set):
Move here from ipa.c; implement using pointer_map
* ipa.c (cgraph_node_set_new, cgraph_node_set_add,
cgraph_node_set_remove, cgraph_node_set_find, dump_cgraph_node_set,
debug_cgraph_node_set, varpool_node_set_new,
varpool_node_set_add, varpool_node_set_remove, varpool_node_set_find,
dump_varpool_node_set, debug_varpool_node_set):
Move to ipa-uitls.c.
* lto/lto.c (ltrans_partition_def): Remove GTY annotations.
(ltrans_partitions): Move to heap.
(new_partition): Update.
(free_ltrans_partitions): New function.
(lto_wpa_write_files): Use it.
* passes.c (ipa_write_summaries): Update.
From-SVN: r173334
Diffstat (limited to 'gcc/ipa-utils.c')
-rw-r--r-- | gcc/ipa-utils.c | 257 |
1 files changed, 257 insertions, 0 deletions
diff --git a/gcc/ipa-utils.c b/gcc/ipa-utils.c index 6324d7c..de4f4b6 100644 --- a/gcc/ipa-utils.c +++ b/gcc/ipa-utils.c @@ -324,3 +324,260 @@ get_base_var (tree t) return t; } + +/* Create a new cgraph node set. */ + +cgraph_node_set +cgraph_node_set_new (void) +{ + cgraph_node_set new_node_set; + + new_node_set = XCNEW (struct cgraph_node_set_def); + new_node_set->map = pointer_map_create (); + new_node_set->nodes = NULL; + return new_node_set; +} + + +/* Add cgraph_node NODE to cgraph_node_set SET. */ + +void +cgraph_node_set_add (cgraph_node_set set, struct cgraph_node *node) +{ + void **slot; + + slot = pointer_map_insert (set->map, node); + + if (*slot) + { + int index = (size_t) *slot - 1; + gcc_checking_assert ((VEC_index (cgraph_node_ptr, set->nodes, index) + == node)); + return; + } + + *slot = (void *)(size_t) (VEC_length (cgraph_node_ptr, set->nodes) + 1); + + /* Insert into node vector. */ + VEC_safe_push (cgraph_node_ptr, heap, set->nodes, node); +} + + +/* Remove cgraph_node NODE from cgraph_node_set SET. */ + +void +cgraph_node_set_remove (cgraph_node_set set, struct cgraph_node *node) +{ + void **slot, **last_slot; + int index; + struct cgraph_node *last_node; + + slot = pointer_map_contains (set->map, node); + if (slot == NULL || !*slot) + return; + + index = (size_t) *slot - 1; + gcc_checking_assert (VEC_index (cgraph_node_ptr, set->nodes, index) + == node); + + /* Remove from vector. We do this by swapping node with the last element + of the vector. */ + last_node = VEC_pop (cgraph_node_ptr, set->nodes); + if (last_node != node) + { + last_slot = pointer_map_contains (set->map, last_node); + gcc_checking_assert (last_slot && *last_slot); + *last_slot = (void *)(size_t) (index + 1); + + /* Move the last element to the original spot of NODE. */ + VEC_replace (cgraph_node_ptr, set->nodes, index, last_node); + } + + /* Remove element from hash table. */ + *slot = NULL; +} + + +/* Find NODE in SET and return an iterator to it if found. A null iterator + is returned if NODE is not in SET. */ + +cgraph_node_set_iterator +cgraph_node_set_find (cgraph_node_set set, struct cgraph_node *node) +{ + void **slot; + cgraph_node_set_iterator csi; + + slot = pointer_map_contains (set->map, node); + if (slot == NULL || !*slot) + csi.index = (unsigned) ~0; + else + csi.index = (size_t)*slot - 1; + csi.set = set; + + return csi; +} + + +/* Dump content of SET to file F. */ + +void +dump_cgraph_node_set (FILE *f, cgraph_node_set set) +{ + cgraph_node_set_iterator iter; + + for (iter = csi_start (set); !csi_end_p (iter); csi_next (&iter)) + { + struct cgraph_node *node = csi_node (iter); + fprintf (f, " %s/%i", cgraph_node_name (node), node->uid); + } + fprintf (f, "\n"); +} + + +/* Dump content of SET to stderr. */ + +DEBUG_FUNCTION void +debug_cgraph_node_set (cgraph_node_set set) +{ + dump_cgraph_node_set (stderr, set); +} + + +/* Free varpool node set. */ + +void +free_cgraph_node_set (cgraph_node_set set) +{ + VEC_free (cgraph_node_ptr, heap, set->nodes); + pointer_map_destroy (set->map); + free (set); +} + + +/* Create a new varpool node set. */ + +varpool_node_set +varpool_node_set_new (void) +{ + varpool_node_set new_node_set; + + new_node_set = XCNEW (struct varpool_node_set_def); + new_node_set->map = pointer_map_create (); + new_node_set->nodes = NULL; + return new_node_set; +} + + +/* Add varpool_node NODE to varpool_node_set SET. */ + +void +varpool_node_set_add (varpool_node_set set, struct varpool_node *node) +{ + void **slot; + + slot = pointer_map_insert (set->map, node); + + if (*slot) + { + int index = (size_t) *slot - 1; + gcc_checking_assert ((VEC_index (varpool_node_ptr, set->nodes, index) + == node)); + return; + } + + *slot = (void *)(size_t) (VEC_length (varpool_node_ptr, set->nodes) + 1); + + /* Insert into node vector. */ + VEC_safe_push (varpool_node_ptr, heap, set->nodes, node); +} + + +/* Remove varpool_node NODE from varpool_node_set SET. */ + +void +varpool_node_set_remove (varpool_node_set set, struct varpool_node *node) +{ + void **slot, **last_slot; + int index; + struct varpool_node *last_node; + + slot = pointer_map_contains (set->map, node); + if (slot == NULL || !*slot) + return; + + index = (size_t) *slot - 1; + gcc_checking_assert (VEC_index (varpool_node_ptr, set->nodes, index) + == node); + + /* Remove from vector. We do this by swapping node with the last element + of the vector. */ + last_node = VEC_pop (varpool_node_ptr, set->nodes); + if (last_node != node) + { + last_slot = pointer_map_contains (set->map, last_node); + gcc_checking_assert (last_slot && *last_slot); + *last_slot = (void *)(size_t) (index + 1); + + /* Move the last element to the original spot of NODE. */ + VEC_replace (varpool_node_ptr, set->nodes, index, last_node); + } + + /* Remove element from hash table. */ + *slot = NULL; +} + + +/* Find NODE in SET and return an iterator to it if found. A null iterator + is returned if NODE is not in SET. */ + +varpool_node_set_iterator +varpool_node_set_find (varpool_node_set set, struct varpool_node *node) +{ + void **slot; + varpool_node_set_iterator vsi; + + slot = pointer_map_contains (set->map, node); + if (slot == NULL || !*slot) + vsi.index = (unsigned) ~0; + else + vsi.index = (size_t)*slot - 1; + vsi.set = set; + + return vsi; +} + + +/* Dump content of SET to file F. */ + +void +dump_varpool_node_set (FILE *f, varpool_node_set set) +{ + varpool_node_set_iterator iter; + + for (iter = vsi_start (set); !vsi_end_p (iter); vsi_next (&iter)) + { + struct varpool_node *node = vsi_node (iter); + fprintf (f, " %s", varpool_node_name (node)); + } + fprintf (f, "\n"); +} + + +/* Free varpool node set. */ + +void +free_varpool_node_set (varpool_node_set set) +{ + VEC_free (varpool_node_ptr, heap, set->nodes); + pointer_map_destroy (set->map); + free (set); +} + + +/* Dump content of SET to stderr. */ + +DEBUG_FUNCTION void +debug_varpool_node_set (varpool_node_set set) +{ + dump_varpool_node_set (stderr, set); +} |