summaryrefslogtreecommitdiff
path: root/gcc/lto/lto.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/lto/lto.c')
-rw-r--r--gcc/lto/lto.c108
1 files changed, 49 insertions, 59 deletions
diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c
index 857e8f6032b..376af85a704 100644
--- a/gcc/lto/lto.c
+++ b/gcc/lto/lto.c
@@ -305,8 +305,6 @@ struct type_pair_d
signed char same_p;
};
typedef struct type_pair_d *type_pair_t;
-DEF_VEC_P(type_pair_t);
-DEF_VEC_ALLOC_P(type_pair_t,heap);
#define GIMPLE_TYPE_PAIR_SIZE 16381
struct type_pair_d *type_pair_cache;
@@ -432,7 +430,7 @@ compare_type_names_p (tree t1, tree t2)
static bool
gimple_types_compatible_p_1 (tree, tree, type_pair_t,
- VEC(type_pair_t, heap) **,
+ vec<type_pair_t> *,
struct pointer_map_t *, struct obstack *);
/* DFS visit the edge from the callers type pair with state *STATE to
@@ -444,7 +442,7 @@ gimple_types_compatible_p_1 (tree, tree, type_pair_t,
static bool
gtc_visit (tree t1, tree t2,
struct sccs *state,
- VEC(type_pair_t, heap) **sccstack,
+ vec<type_pair_t> *sccstack,
struct pointer_map_t *sccstate,
struct obstack *sccstate_obstack)
{
@@ -558,7 +556,7 @@ gtc_visit (tree t1, tree t2,
static bool
gimple_types_compatible_p_1 (tree t1, tree t2, type_pair_t p,
- VEC(type_pair_t, heap) **sccstack,
+ vec<type_pair_t> *sccstack,
struct pointer_map_t *sccstate,
struct obstack *sccstate_obstack)
{
@@ -569,7 +567,7 @@ gimple_types_compatible_p_1 (tree t1, tree t2, type_pair_t p,
state = XOBNEW (sccstate_obstack, struct sccs);
*pointer_map_insert (sccstate, p) = state;
- VEC_safe_push (type_pair_t, heap, *sccstack, p);
+ sccstack->safe_push (p);
state->dfsnum = gtc_next_dfs_num++;
state->low = state->dfsnum;
state->on_sccstack = true;
@@ -857,7 +855,7 @@ pop:
do
{
struct sccs *cstate;
- x = VEC_pop (type_pair_t, *sccstack);
+ x = sccstack->pop ();
cstate = (struct sccs *)*pointer_map_contains (sccstate, x);
cstate->on_sccstack = false;
x->same_p = state->u.same_p;
@@ -875,7 +873,7 @@ pop:
static bool
gimple_types_compatible_p (tree t1, tree t2)
{
- VEC(type_pair_t, heap) *sccstack = NULL;
+ vec<type_pair_t> sccstack = vNULL;
struct pointer_map_t *sccstate;
struct obstack sccstate_obstack;
type_pair_t p = NULL;
@@ -970,7 +968,7 @@ gimple_types_compatible_p (tree t1, tree t2)
gcc_obstack_init (&sccstate_obstack);
res = gimple_types_compatible_p_1 (t1, t2, p,
&sccstack, sccstate, &sccstate_obstack);
- VEC_free (type_pair_t, heap, sccstack);
+ sccstack.release ();
pointer_map_destroy (sccstate);
obstack_free (&sccstate_obstack, NULL);
@@ -978,7 +976,7 @@ gimple_types_compatible_p (tree t1, tree t2)
}
static hashval_t
-iterative_hash_gimple_type (tree, hashval_t, VEC(tree, heap) **,
+iterative_hash_gimple_type (tree, hashval_t, vec<tree> *,
struct pointer_map_t *, struct obstack *);
/* DFS visit the edge from the callers type with state *STATE to T.
@@ -988,7 +986,7 @@ iterative_hash_gimple_type (tree, hashval_t, VEC(tree, heap) **,
static hashval_t
visit (tree t, struct sccs *state, hashval_t v,
- VEC (tree, heap) **sccstack,
+ vec<tree> *sccstack,
struct pointer_map_t *sccstate,
struct obstack *sccstate_obstack)
{
@@ -1081,7 +1079,7 @@ type_hash_pair_compare (const void *p1_, const void *p2_)
static hashval_t
iterative_hash_gimple_type (tree type, hashval_t val,
- VEC(tree, heap) **sccstack,
+ vec<tree> *sccstack,
struct pointer_map_t *sccstate,
struct obstack *sccstate_obstack)
{
@@ -1094,7 +1092,7 @@ iterative_hash_gimple_type (tree type, hashval_t val,
state = XOBNEW (sccstate_obstack, struct sccs);
*pointer_map_insert (sccstate, type) = state;
- VEC_safe_push (tree, heap, *sccstack, type);
+ sccstack->safe_push (type);
state->dfsnum = next_dfs_num++;
state->low = state->dfsnum;
state->on_sccstack = true;
@@ -1216,7 +1214,7 @@ iterative_hash_gimple_type (tree type, hashval_t val,
struct tree_int_map *m;
/* Pop off the SCC and set its hash values. */
- x = VEC_pop (tree, *sccstack);
+ x = sccstack->pop ();
/* Optimize SCC size one. */
if (x == type)
{
@@ -1234,10 +1232,10 @@ iterative_hash_gimple_type (tree type, hashval_t val,
unsigned first, i, size, j;
struct type_hash_pair *pairs;
/* Pop off the SCC and build an array of type, hash pairs. */
- first = VEC_length (tree, *sccstack) - 1;
- while (VEC_index (tree, *sccstack, first) != type)
+ first = sccstack->length () - 1;
+ while ((*sccstack)[first] != type)
--first;
- size = VEC_length (tree, *sccstack) - first + 1;
+ size = sccstack->length () - first + 1;
pairs = XALLOCAVEC (struct type_hash_pair, size);
i = 0;
cstate = (struct sccs *)*pointer_map_contains (sccstate, x);
@@ -1246,7 +1244,7 @@ iterative_hash_gimple_type (tree type, hashval_t val,
pairs[i].hash = cstate->u.hash;
do
{
- x = VEC_pop (tree, *sccstack);
+ x = sccstack->pop ();
cstate = (struct sccs *)*pointer_map_contains (sccstate, x);
cstate->on_sccstack = false;
++i;
@@ -1300,7 +1298,7 @@ static hashval_t
gimple_type_hash (const void *p)
{
const_tree t = (const_tree) p;
- VEC(tree, heap) *sccstack = NULL;
+ vec<tree> sccstack = vNULL;
struct pointer_map_t *sccstate;
struct obstack sccstate_obstack;
hashval_t val;
@@ -1318,7 +1316,7 @@ gimple_type_hash (const void *p)
gcc_obstack_init (&sccstate_obstack);
val = iterative_hash_gimple_type (CONST_CAST_TREE (t), 0,
&sccstack, sccstate, &sccstate_obstack);
- VEC_free (tree, heap, sccstack);
+ sccstack.release ();
pointer_map_destroy (sccstate);
obstack_free (&sccstate_obstack, NULL);
@@ -1581,13 +1579,13 @@ lto_ft_binfo (tree t)
LTO_FIXUP_TREE (BINFO_OFFSET (t));
LTO_FIXUP_TREE (BINFO_VIRTUALS (t));
LTO_FIXUP_TREE (BINFO_VPTR_FIELD (t));
- n = VEC_length (tree, BINFO_BASE_ACCESSES (t));
+ n = vec_safe_length (BINFO_BASE_ACCESSES (t));
for (i = 0; i < n; i++)
{
saved_base = base = BINFO_BASE_ACCESS (t, i);
LTO_FIXUP_TREE (base);
if (base != saved_base)
- VEC_replace (tree, BINFO_BASE_ACCESSES (t), i, base);
+ (*BINFO_BASE_ACCESSES (t))[i] = base;
}
LTO_FIXUP_TREE (BINFO_INHERITANCE_CHAIN (t));
LTO_FIXUP_TREE (BINFO_SUBVTT_INDEX (t));
@@ -1598,7 +1596,7 @@ lto_ft_binfo (tree t)
saved_base = base = BINFO_BASE_BINFO (t, i);
LTO_FIXUP_TREE (base);
if (base != saved_base)
- VEC_replace (tree, BINFO_BASE_BINFOS (t), i, base);
+ (*BINFO_BASE_BINFOS (t))[i] = base;
}
}
@@ -1612,9 +1610,7 @@ lto_ft_constructor (tree t)
lto_ft_typed (t);
- for (idx = 0;
- VEC_iterate(constructor_elt, CONSTRUCTOR_ELTS (t), idx, ce);
- idx++)
+ for (idx = 0; vec_safe_iterate (CONSTRUCTOR_ELTS (t), idx, &ce); idx++)
{
LTO_FIXUP_TREE (ce->index);
LTO_FIXUP_TREE (ce->value);
@@ -1713,18 +1709,15 @@ lto_fixup_types (tree t)
static enum ld_plugin_symbol_resolution
get_resolution (struct data_in *data_in, unsigned index)
{
- if (data_in->globals_resolution)
+ if (data_in->globals_resolution.exists ())
{
ld_plugin_symbol_resolution_t ret;
/* We can have references to not emitted functions in
DECL_FUNCTION_PERSONALITY at least. So we can and have
to indeed return LDPR_UNKNOWN in some cases. */
- if (VEC_length (ld_plugin_symbol_resolution_t,
- data_in->globals_resolution) <= index)
+ if (data_in->globals_resolution.length () <= index)
return LDPR_UNKNOWN;
- ret = VEC_index (ld_plugin_symbol_resolution_t,
- data_in->globals_resolution,
- index);
+ ret = data_in->globals_resolution[index];
return ret;
}
else
@@ -1773,7 +1766,7 @@ lto_register_var_decl_in_symtab (struct data_in *data_in, tree decl)
ASM_FORMAT_PRIVATE_NAME (label, name, DECL_UID (decl));
SET_DECL_ASSEMBLER_NAME (decl, get_identifier (label));
rest_of_decl_compilation (decl, 1, 0);
- VEC_safe_push (tree, gc, lto_global_var_decls, decl);
+ vec_safe_push (lto_global_var_decls, decl);
}
/* If this variable has already been declared, queue the
@@ -1855,7 +1848,7 @@ static void
uniquify_nodes (struct data_in *data_in, unsigned from)
{
struct streamer_tree_cache_d *cache = data_in->reader_cache;
- unsigned len = VEC_length (tree, cache->nodes);
+ unsigned len = cache->nodes.length ();
unsigned i;
/* Go backwards because children streamed for the first time come
@@ -1866,7 +1859,7 @@ uniquify_nodes (struct data_in *data_in, unsigned from)
them and computing hashes. */
for (i = len; i-- > from;)
{
- tree t = VEC_index (tree, cache->nodes, i);
+ tree t = cache->nodes[i];
if (t && TYPE_P (t))
{
tree newt = gimple_register_type (t);
@@ -1881,7 +1874,7 @@ uniquify_nodes (struct data_in *data_in, unsigned from)
/* Second fixup all trees in the new cache entries. */
for (i = len; i-- > from;)
{
- tree t = VEC_index (tree, cache->nodes, i);
+ tree t = cache->nodes[i];
tree oldt = t;
if (!t)
continue;
@@ -2042,7 +2035,7 @@ uniquify_nodes (struct data_in *data_in, unsigned from)
make sure it is done last. */
for (i = len; i-- > from;)
{
- tree t = VEC_index (tree, cache->nodes, i);
+ tree t = cache->nodes[i];
if (t == NULL_TREE)
continue;
@@ -2065,7 +2058,7 @@ uniquify_nodes (struct data_in *data_in, unsigned from)
static void
lto_read_decls (struct lto_file_decl_data *decl_data, const void *data,
- VEC(ld_plugin_symbol_resolution_t,heap) *resolutions)
+ vec<ld_plugin_symbol_resolution_t> resolutions)
{
const struct lto_decl_header *header = (const struct lto_decl_header *) data;
const int decl_offset = sizeof (struct lto_decl_header);
@@ -2090,7 +2083,7 @@ lto_read_decls (struct lto_file_decl_data *decl_data, const void *data,
while (ib_main.p < ib_main.len)
{
tree t;
- unsigned from = VEC_length (tree, data_in->reader_cache->nodes);
+ unsigned from = data_in->reader_cache->nodes.length ();
t = stream_read_tree (&ib_main, data_in);
gcc_assert (t && ib_main.p <= ib_main.len);
uniquify_nodes (data_in, from);
@@ -2242,7 +2235,7 @@ lto_resolution_read (splay_tree file_ids, FILE *resolution, lto_file *file)
format that is only unpacked later when the subfile is processed. */
rp.res = r;
rp.index = index;
- VEC_safe_push (res_pair, heap, file_data->respairs, rp);
+ file_data->respairs.safe_push (rp);
if (file_data->max_index < index)
file_data->max_index = index;
}
@@ -2324,18 +2317,17 @@ lto_file_finalize (struct lto_file_decl_data *file_data, lto_file *file)
{
const char *data;
size_t len;
- VEC(ld_plugin_symbol_resolution_t,heap) *resolutions = NULL;
+ vec<ld_plugin_symbol_resolution_t>
+ resolutions = vNULL;
int i;
res_pair *rp;
/* Create vector for fast access of resolution. We do this lazily
to save memory. */
- VEC_safe_grow_cleared (ld_plugin_symbol_resolution_t, heap,
- resolutions,
- file_data->max_index + 1);
- for (i = 0; VEC_iterate (res_pair, file_data->respairs, i, rp); i++)
- VEC_replace (ld_plugin_symbol_resolution_t, resolutions, rp->index, rp->res);
- VEC_free (res_pair, heap, file_data->respairs);
+ resolutions.safe_grow_cleared (file_data->max_index + 1);
+ for (i = 0; file_data->respairs.iterate (i, &rp); i++)
+ resolutions[rp->index] = rp->res;
+ file_data->respairs.release ();
file_data->renaming_hash_table = lto_create_renaming_table ();
file_data->file_name = file->filename;
@@ -2353,7 +2345,7 @@ lto_file_finalize (struct lto_file_decl_data *file_data, lto_file *file)
/* Finalize FILE_DATA in FILE and increase COUNT. */
static int
-lto_create_files_from_ids (lto_file *file, struct lto_file_decl_data *file_data,
+lto_create_files_from_ids (lto_file *file, struct lto_file_decl_data *file_data,
int *count)
{
lto_file_finalize (file_data, file);
@@ -2608,7 +2600,7 @@ lto_wpa_write_files (void)
timevar_push (TV_WHOPR_WPA);
- FOR_EACH_VEC_ELT (ltrans_partition, ltrans_partitions, i, part)
+ FOR_EACH_VEC_ELT (ltrans_partitions, i, part)
lto_stats.num_output_symtab_nodes += lto_symtab_encoder_size (part->encoder);
/* Find out statics that need to be promoted
@@ -2630,17 +2622,18 @@ lto_wpa_write_files (void)
temp_filename[blen - sizeof (".out") + 1] = '\0';
blen = strlen (temp_filename);
- n_sets = VEC_length (ltrans_partition, ltrans_partitions);
+ n_sets = ltrans_partitions.length ();
/* Sort partitions by size so small ones are compiled last.
FIXME: Even when not reordering we may want to output one list for parallel make
and other for final link command. */
- VEC_qsort (ltrans_partition, ltrans_partitions,
- flag_toplevel_reorder ? cmp_partitions_size : cmp_partitions_order);
+ ltrans_partitions.qsort (flag_toplevel_reorder
+ ? cmp_partitions_size
+ : cmp_partitions_order);
for (i = 0; i < n_sets; i++)
{
size_t len;
- ltrans_partition part = VEC_index (ltrans_partition, ltrans_partitions, i);
+ ltrans_partition part = ltrans_partitions[i];
/* Write all the nodes in SET. */
sprintf (temp_filename + blen, "%u.o", i);
@@ -3091,9 +3084,7 @@ read_cgraph_and_symbols (unsigned nfiles, const char **fnames)
this field into ltrans compilation. */
if (flag_ltrans)
FOR_EACH_DEFINED_FUNCTION (node)
- VEC_safe_push (ipa_opt_pass, heap,
- node->ipa_transforms_to_apply,
- (ipa_opt_pass)&pass_ipa_inline);
+ node->ipa_transforms_to_apply.safe_push ((ipa_opt_pass)&pass_ipa_inline);
timevar_pop (TV_IPA_LTO_CGRAPH_MERGE);
@@ -3148,7 +3139,7 @@ materialize_cgraph (void)
set_cfun (NULL);
/* Inform the middle end about the global variables we have seen. */
- FOR_EACH_VEC_ELT (tree, lto_global_var_decls, i, decl)
+ FOR_EACH_VEC_ELT (*lto_global_var_decls, i, decl)
rest_of_decl_compilation (decl, 1, 0);
if (!quiet_flag)
@@ -3253,8 +3244,7 @@ do_whole_program_analysis (void)
FOR_EACH_SYMBOL (node)
node->symbol.aux = NULL;
- lto_stats.num_cgraph_partitions += VEC_length (ltrans_partition,
- ltrans_partitions);
+ lto_stats.num_cgraph_partitions += ltrans_partitions.length ();
timevar_pop (TV_WHOPR_PARTITIONING);
timevar_stop (TV_PHASE_OPT_GEN);