summaryrefslogtreecommitdiff
path: root/gcc/gimplify.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/gimplify.c')
-rw-r--r--gcc/gimplify.c153
1 files changed, 78 insertions, 75 deletions
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index 0919d9ff76a..8d555f833b9 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -231,9 +231,10 @@ pop_gimplify_context (gimple body)
{
struct gimplify_ctx *c = gimplify_ctxp;
- gcc_assert (c && (c->bind_expr_stack == NULL
- || VEC_empty (gimple, c->bind_expr_stack)));
- VEC_free (gimple, heap, c->bind_expr_stack);
+ gcc_assert (c
+ && (!c->bind_expr_stack.exists ()
+ || c->bind_expr_stack.is_empty ()));
+ c->bind_expr_stack.release ();
gimplify_ctxp = c->prev_context;
if (body)
@@ -250,9 +251,8 @@ pop_gimplify_context (gimple body)
static void
gimple_push_bind_expr (gimple gimple_bind)
{
- if (gimplify_ctxp->bind_expr_stack == NULL)
- gimplify_ctxp->bind_expr_stack = VEC_alloc (gimple, heap, 8);
- VEC_safe_push (gimple, heap, gimplify_ctxp->bind_expr_stack, gimple_bind);
+ gimplify_ctxp->bind_expr_stack.reserve (8);
+ gimplify_ctxp->bind_expr_stack.safe_push (gimple_bind);
}
/* Pop the first element off the stack of bindings. */
@@ -260,7 +260,7 @@ gimple_push_bind_expr (gimple gimple_bind)
static void
gimple_pop_bind_expr (void)
{
- VEC_pop (gimple, gimplify_ctxp->bind_expr_stack);
+ gimplify_ctxp->bind_expr_stack.pop ();
}
/* Return the first element of the stack of bindings. */
@@ -268,12 +268,12 @@ gimple_pop_bind_expr (void)
gimple
gimple_current_bind_expr (void)
{
- return VEC_last (gimple, gimplify_ctxp->bind_expr_stack);
+ return gimplify_ctxp->bind_expr_stack.last ();
}
/* Return the stack of bindings created during gimplification. */
-VEC(gimple, heap) *
+vec<gimple>
gimple_bind_expr_stack (void)
{
return gimplify_ctxp->bind_expr_stack;
@@ -1258,7 +1258,8 @@ gimplify_bind_expr (tree *expr_p, gimple_seq *pre_p)
&& !is_gimple_reg (t)
&& flag_stack_reuse != SR_NONE)
{
- tree clobber = build_constructor (TREE_TYPE (t), NULL);
+ tree clobber = build_constructor (TREE_TYPE (t),
+ NULL);
TREE_THIS_VOLATILE (clobber) = 1;
gimplify_seq_add_stmt (&cleanup, gimple_build_assign (t, clobber));
}
@@ -1569,9 +1570,9 @@ compare_case_labels (const void *p1, const void *p2)
/* Sort the case labels in LABEL_VEC in place in ascending order. */
void
-sort_case_labels (VEC(tree,heap)* label_vec)
+sort_case_labels (vec<tree> label_vec)
{
- VEC_qsort (tree, label_vec, compare_case_labels);
+ label_vec.qsort (compare_case_labels);
}
/* Prepare a vector of case labels to be used in a GIMPLE_SWITCH statement.
@@ -1594,7 +1595,7 @@ sort_case_labels (VEC(tree,heap)* label_vec)
found or not. */
void
-preprocess_case_label_vec_for_gimple (VEC(tree,heap) *labels,
+preprocess_case_label_vec_for_gimple (vec<tree> labels,
tree index_type,
tree *default_casep)
{
@@ -1605,9 +1606,9 @@ preprocess_case_label_vec_for_gimple (VEC(tree,heap) *labels,
i = 0;
min_value = TYPE_MIN_VALUE (index_type);
max_value = TYPE_MAX_VALUE (index_type);
- while (i < VEC_length (tree, labels))
+ while (i < labels.length ())
{
- tree elt = VEC_index (tree, labels, i);
+ tree elt = labels[i];
tree low = CASE_LOW (elt);
tree high = CASE_HIGH (elt);
bool remove_element = FALSE;
@@ -1696,13 +1697,13 @@ preprocess_case_label_vec_for_gimple (VEC(tree,heap) *labels,
}
if (remove_element)
- VEC_ordered_remove (tree, labels, i);
+ labels.ordered_remove (i);
else
i++;
}
len = i;
- if (!VEC_empty (tree, labels))
+ if (!labels.is_empty ())
sort_case_labels (labels);
if (default_casep && !default_case)
@@ -1714,20 +1715,20 @@ preprocess_case_label_vec_for_gimple (VEC(tree,heap) *labels,
if (len
&& TYPE_MIN_VALUE (index_type)
&& TYPE_MAX_VALUE (index_type)
- && tree_int_cst_equal (CASE_LOW (VEC_index (tree, labels, 0)),
+ && tree_int_cst_equal (CASE_LOW (labels[0]),
TYPE_MIN_VALUE (index_type)))
{
- tree low, high = CASE_HIGH (VEC_index (tree, labels, len - 1));
+ tree low, high = CASE_HIGH (labels[len - 1]);
if (!high)
- high = CASE_LOW (VEC_index (tree, labels, len - 1));
+ high = CASE_LOW (labels[len - 1]);
if (tree_int_cst_equal (high, TYPE_MAX_VALUE (index_type)))
{
for (i = 1; i < len; i++)
{
- high = CASE_LOW (VEC_index (tree, labels, i));
- low = CASE_HIGH (VEC_index (tree, labels, i - 1));
+ high = CASE_LOW (labels[i]);
+ low = CASE_HIGH (labels[i - 1]);
if (!low)
- low = CASE_LOW (VEC_index (tree, labels, i - 1));
+ low = CASE_LOW (labels[i - 1]);
if ((TREE_INT_CST_LOW (low) + 1
!= TREE_INT_CST_LOW (high))
|| (TREE_INT_CST_HIGH (low)
@@ -1737,7 +1738,7 @@ preprocess_case_label_vec_for_gimple (VEC(tree,heap) *labels,
}
if (i == len)
{
- tree label = CASE_LABEL (VEC_index (tree, labels, 0));
+ tree label = CASE_LABEL (labels[0]);
default_case = build_case_label (NULL_TREE, NULL_TREE,
label);
}
@@ -1769,8 +1770,8 @@ gimplify_switch_expr (tree *expr_p, gimple_seq *pre_p)
if (SWITCH_BODY (switch_expr))
{
- VEC (tree,heap) *labels;
- VEC (tree,heap) *saved_labels;
+ vec<tree> labels;
+ vec<tree> saved_labels;
tree default_case = NULL_TREE;
gimple gimple_switch;
@@ -1781,7 +1782,7 @@ gimplify_switch_expr (tree *expr_p, gimple_seq *pre_p)
/* Save old labels, get new ones from body, then restore the old
labels. Save all the things from the switch body to append after. */
saved_labels = gimplify_ctxp->case_labels;
- gimplify_ctxp->case_labels = VEC_alloc (tree, heap, 8);
+ gimplify_ctxp->case_labels.create (8);
gimplify_stmt (&SWITCH_BODY (switch_expr), &switch_body_seq);
labels = gimplify_ctxp->case_labels;
@@ -1805,7 +1806,7 @@ gimplify_switch_expr (tree *expr_p, gimple_seq *pre_p)
default_case, labels);
gimplify_seq_add_stmt (pre_p, gimple_switch);
gimplify_seq_add_seq (pre_p, switch_body_seq);
- VEC_free(tree, heap, labels);
+ labels.release ();
}
else
gcc_assert (SWITCH_LABELS (switch_expr));
@@ -1825,11 +1826,11 @@ gimplify_case_label_expr (tree *expr_p, gimple_seq *pre_p)
#pragma omp parallel. At least in the C front end, we don't
detect such invalid branches until after gimplification. */
for (ctxp = gimplify_ctxp; ; ctxp = ctxp->prev_context)
- if (ctxp->case_labels)
+ if (ctxp->case_labels.exists ())
break;
gimple_label = gimple_build_label (CASE_LABEL (*expr_p));
- VEC_safe_push (tree, heap, ctxp->case_labels, *expr_p);
+ ctxp->case_labels.safe_push (*expr_p);
gimplify_seq_add_stmt (pre_p, gimple_label);
return GS_ALL_DONE;
@@ -2129,7 +2130,7 @@ gimplify_compound_lval (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
fallback_t fallback)
{
tree *p;
- VEC(tree,heap) *expr_stack;
+ vec<tree> expr_stack;
enum gimplify_status ret = GS_ALL_DONE, tret;
int i;
location_t loc = EXPR_LOCATION (*expr_p);
@@ -2137,7 +2138,7 @@ gimplify_compound_lval (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
/* Create a stack of the subexpressions so later we can walk them in
order from inner to outer. */
- expr_stack = VEC_alloc (tree, heap, 10);
+ expr_stack.create (10);
/* We can handle anything that get_inner_reference can deal with. */
for (p = expr_p; ; p = &TREE_OPERAND (*p, 0))
@@ -2157,10 +2158,10 @@ gimplify_compound_lval (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
else
break;
- VEC_safe_push (tree, heap, expr_stack, *p);
+ expr_stack.safe_push (*p);
}
- gcc_assert (VEC_length (tree, expr_stack));
+ gcc_assert (expr_stack.length ());
/* Now EXPR_STACK is a stack of pointers to all the refs we've
walked through and P points to the innermost expression.
@@ -2174,9 +2175,9 @@ gimplify_compound_lval (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
So we do this in three steps. First we deal with the annotations
for any variables in the components, then we gimplify the base,
then we gimplify any indices, from left to right. */
- for (i = VEC_length (tree, expr_stack) - 1; i >= 0; i--)
+ for (i = expr_stack.length () - 1; i >= 0; i--)
{
- tree t = VEC_index (tree, expr_stack, i);
+ tree t = expr_stack[i];
if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
{
@@ -2269,9 +2270,9 @@ gimplify_compound_lval (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
/* And finally, the indices and operands of ARRAY_REF. During this
loop we also remove any useless conversions. */
- for (; VEC_length (tree, expr_stack) > 0; )
+ for (; expr_stack.length () > 0; )
{
- tree t = VEC_pop (tree, expr_stack);
+ tree t = expr_stack.pop ();
if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
{
@@ -2299,7 +2300,7 @@ gimplify_compound_lval (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
canonicalize_component_ref (expr_p);
}
- VEC_free (tree, heap, expr_stack);
+ expr_stack.release ();
gcc_assert (*expr_p == expr || ret != GS_ALL_DONE);
@@ -3461,7 +3462,7 @@ gimplify_modify_expr_to_memset (tree *expr_p, tree size, bool want_value,
from = TREE_OPERAND (from, 0);
gcc_assert (TREE_CODE (from) == CONSTRUCTOR
- && VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (from)));
+ && vec_safe_is_empty (CONSTRUCTOR_ELTS (from)));
/* Now proceed. */
to = TREE_OPERAND (*expr_p, 0);
@@ -3572,9 +3573,9 @@ gimplify_init_ctor_preeval (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
{
unsigned HOST_WIDE_INT ix;
constructor_elt *ce;
- VEC(constructor_elt,gc) *v = CONSTRUCTOR_ELTS (*expr_p);
+ vec<constructor_elt, va_gc> *v = CONSTRUCTOR_ELTS (*expr_p);
- FOR_EACH_VEC_ELT (constructor_elt, v, ix, ce)
+ FOR_EACH_VEC_SAFE_ELT (v, ix, ce)
gimplify_init_ctor_preeval (&ce->value, pre_p, post_p, data);
return;
@@ -3634,7 +3635,7 @@ gimplify_init_ctor_preeval (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
Note that we never have to deal with SAVE_EXPRs here, because this has
already been taken care of for us, in gimplify_init_ctor_preeval(). */
-static void gimplify_init_ctor_eval (tree, VEC(constructor_elt,gc) *,
+static void gimplify_init_ctor_eval (tree, vec<constructor_elt, va_gc> *,
gimple_seq *, bool);
static void
@@ -3720,7 +3721,7 @@ zero_sized_type (const_tree type)
zeroed first. */
static void
-gimplify_init_ctor_eval (tree object, VEC(constructor_elt,gc) *elts,
+gimplify_init_ctor_eval (tree object, vec<constructor_elt, va_gc> *elts,
gimple_seq *pre_p, bool cleared)
{
tree array_elt_type = NULL;
@@ -3876,12 +3877,12 @@ static tree
optimize_compound_literals_in_ctor (tree orig_ctor)
{
tree ctor = orig_ctor;
- VEC(constructor_elt,gc) *elts = CONSTRUCTOR_ELTS (ctor);
- unsigned int idx, num = VEC_length (constructor_elt, elts);
+ vec<constructor_elt, va_gc> *elts = CONSTRUCTOR_ELTS (ctor);
+ unsigned int idx, num = vec_safe_length (elts);
for (idx = 0; idx < num; idx++)
{
- tree value = VEC_index (constructor_elt, elts, idx).value;
+ tree value = (*elts)[idx].value;
tree newval = value;
if (TREE_CODE (value) == CONSTRUCTOR)
newval = optimize_compound_literals_in_ctor (value);
@@ -3903,10 +3904,10 @@ optimize_compound_literals_in_ctor (tree orig_ctor)
if (ctor == orig_ctor)
{
ctor = copy_node (orig_ctor);
- CONSTRUCTOR_ELTS (ctor) = VEC_copy (constructor_elt, gc, elts);
+ CONSTRUCTOR_ELTS (ctor) = vec_safe_copy (elts);
elts = CONSTRUCTOR_ELTS (ctor);
}
- VEC_index (constructor_elt, elts, idx).value = newval;
+ (*elts)[idx].value = newval;
}
return ctor;
}
@@ -3930,7 +3931,7 @@ gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
{
tree object, ctor, type;
enum gimplify_status ret;
- VEC(constructor_elt,gc) *elts;
+ vec<constructor_elt, va_gc> *elts;
gcc_assert (TREE_CODE (TREE_OPERAND (*expr_p, 1)) == CONSTRUCTOR);
@@ -3963,7 +3964,7 @@ gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
/* Aggregate types must lower constructors to initialization of
individual elements. The exception is that a CONSTRUCTOR node
with no elements indicates zero-initialization of the whole. */
- if (VEC_empty (constructor_elt, elts))
+ if (vec_safe_is_empty (elts))
{
if (notify_temp_creation)
return GS_OK;
@@ -4099,7 +4100,7 @@ gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
if (TREE_THIS_VOLATILE (object)
&& !TREE_ADDRESSABLE (type)
&& num_nonzero_elements > 0
- && VEC_length (constructor_elt, elts) > 1)
+ && vec_safe_length (elts) > 1)
{
tree temp = create_tmp_var (TYPE_MAIN_VARIANT (type), NULL);
TREE_OPERAND (*expr_p, 0) = temp;
@@ -4156,9 +4157,9 @@ gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
return GS_OK;
/* Extract the real and imaginary parts out of the ctor. */
- gcc_assert (VEC_length (constructor_elt, elts) == 2);
- r = VEC_index (constructor_elt, elts, 0).value;
- i = VEC_index (constructor_elt, elts, 1).value;
+ gcc_assert (elts->length () == 2);
+ r = (*elts)[0].value;
+ i = (*elts)[1].value;
if (r == NULL || i == NULL)
{
tree zero = build_zero_cst (TREE_TYPE (type));
@@ -4230,7 +4231,7 @@ gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
/* Vector types use CONSTRUCTOR all the way through gimple
compilation as a general initializer. */
- FOR_EACH_VEC_ELT (constructor_elt, elts, ix, ce)
+ FOR_EACH_VEC_SAFE_ELT (elts, ix, ce)
{
enum gimplify_status tret;
tret = gimplify_expr (&ce->value, pre_p, post_p, is_gimple_val,
@@ -5223,17 +5224,20 @@ gimplify_asm_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
bool allows_mem, allows_reg, is_inout;
enum gimplify_status ret, tret;
gimple stmt;
- VEC(tree, gc) *inputs;
- VEC(tree, gc) *outputs;
- VEC(tree, gc) *clobbers;
- VEC(tree, gc) *labels;
+ vec<tree, va_gc> *inputs;
+ vec<tree, va_gc> *outputs;
+ vec<tree, va_gc> *clobbers;
+ vec<tree, va_gc> *labels;
tree link_next;
expr = *expr_p;
noutputs = list_length (ASM_OUTPUTS (expr));
oconstraints = (const char **) alloca ((noutputs) * sizeof (const char *));
- inputs = outputs = clobbers = labels = NULL;
+ inputs = NULL;
+ outputs = NULL;
+ clobbers = NULL;
+ labels = NULL;
ret = GS_ALL_DONE;
link_next = NULL_TREE;
@@ -5271,7 +5275,7 @@ gimplify_asm_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
ret = tret;
}
- VEC_safe_push (tree, gc, outputs, link);
+ vec_safe_push (outputs, link);
TREE_CHAIN (link) = NULL_TREE;
if (is_inout)
@@ -5418,14 +5422,14 @@ gimplify_asm_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
}
TREE_CHAIN (link) = NULL_TREE;
- VEC_safe_push (tree, gc, inputs, link);
+ vec_safe_push (inputs, link);
}
for (link = ASM_CLOBBERS (expr); link; ++i, link = TREE_CHAIN (link))
- VEC_safe_push (tree, gc, clobbers, link);
+ vec_safe_push (clobbers, link);
for (link = ASM_LABELS (expr); link; ++i, link = TREE_CHAIN (link))
- VEC_safe_push (tree, gc, labels, link);
+ vec_safe_push (labels, link);
/* Do not add ASMs with errors to the gimple IL stream. */
if (ret != GS_ERROR)
@@ -5658,7 +5662,8 @@ gimplify_target_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
&& needs_to_live_in_memory (temp)
&& flag_stack_reuse == SR_ALL)
{
- tree clobber = build_constructor (TREE_TYPE (temp), NULL);
+ tree clobber = build_constructor (TREE_TYPE (temp),
+ NULL);
TREE_THIS_VOLATILE (clobber) = true;
clobber = build2 (MODIFY_EXPR, TREE_TYPE (temp), temp, clobber);
if (cleanup)
@@ -8254,38 +8259,36 @@ gimplify_body (tree fndecl, bool do_parms)
}
typedef char *char_p; /* For DEF_VEC_P. */
-DEF_VEC_P(char_p);
-DEF_VEC_ALLOC_P(char_p,heap);
/* Return whether we should exclude FNDECL from instrumentation. */
static bool
flag_instrument_functions_exclude_p (tree fndecl)
{
- VEC(char_p,heap) *vec;
+ vec<char_p> *v;
- vec = (VEC(char_p,heap) *) flag_instrument_functions_exclude_functions;
- if (VEC_length (char_p, vec) > 0)
+ v = (vec<char_p> *) flag_instrument_functions_exclude_functions;
+ if (v && v->length () > 0)
{
const char *name;
int i;
char *s;
name = lang_hooks.decl_printable_name (fndecl, 0);
- FOR_EACH_VEC_ELT (char_p, vec, i, s)
+ FOR_EACH_VEC_ELT (*v, i, s)
if (strstr (name, s) != NULL)
return true;
}
- vec = (VEC(char_p,heap) *) flag_instrument_functions_exclude_files;
- if (VEC_length (char_p, vec) > 0)
+ v = (vec<char_p> *) flag_instrument_functions_exclude_files;
+ if (v && v->length () > 0)
{
const char *name;
int i;
char *s;
name = DECL_SOURCE_FILE (fndecl);
- FOR_EACH_VEC_ELT (char_p, vec, i, s)
+ FOR_EACH_VEC_ELT (*v, i, s)
if (strstr (name, s) != NULL)
return true;
}