aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-strlen.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/tree-ssa-strlen.c')
-rw-r--r--gcc/tree-ssa-strlen.c81
1 files changed, 38 insertions, 43 deletions
diff --git a/gcc/tree-ssa-strlen.c b/gcc/tree-ssa-strlen.c
index 9d288b3..aa8b3d6 100644
--- a/gcc/tree-ssa-strlen.c
+++ b/gcc/tree-ssa-strlen.c
@@ -33,7 +33,7 @@ along with GCC; see the file COPYING3. If not see
/* A vector indexed by SSA_NAME_VERSION. 0 means unknown, positive value
is an index into strinfo vector, negative value stands for
string length of a string literal (~strlen). */
-static VEC (int, heap) *ssa_ver_to_stridx;
+static vec<int> ssa_ver_to_stridx;
/* Number of currently active string indexes plus one. */
static int max_stridx;
@@ -84,8 +84,6 @@ typedef struct strinfo_struct
be invalidated. Always cleared by maybe_invalidate. */
bool dont_invalidate;
} *strinfo;
-DEF_VEC_P(strinfo);
-DEF_VEC_ALLOC_P(strinfo,heap);
/* Pool for allocating strinfo_struct entries. */
static alloc_pool strinfo_pool;
@@ -96,7 +94,7 @@ static alloc_pool strinfo_pool;
a basic block pointer to the owner basic_block if shared.
If some other bb wants to modify the vector, the vector needs
to be unshared first, and only the owner bb is supposed to free it. */
-static VEC(strinfo, heap) *stridx_to_strinfo;
+static vec<strinfo, va_heap, vl_embed> *stridx_to_strinfo;
/* One OFFSET->IDX mapping. */
struct stridxlist
@@ -180,7 +178,7 @@ get_stridx (tree exp)
tree s, o;
if (TREE_CODE (exp) == SSA_NAME)
- return VEC_index (int, ssa_ver_to_stridx, SSA_NAME_VERSION (exp));
+ return ssa_ver_to_stridx[SSA_NAME_VERSION (exp)];
if (TREE_CODE (exp) == ADDR_EXPR)
{
@@ -209,8 +207,8 @@ get_stridx (tree exp)
static inline bool
strinfo_shared (void)
{
- return VEC_length (strinfo, stridx_to_strinfo)
- && VEC_index (strinfo, stridx_to_strinfo, 0) != NULL;
+ return vec_safe_length (stridx_to_strinfo)
+ && (*stridx_to_strinfo)[0] != NULL;
}
/* Unshare strinfo vector that is shared with the immediate dominator. */
@@ -222,11 +220,11 @@ unshare_strinfo_vec (void)
unsigned int i = 0;
gcc_assert (strinfo_shared ());
- stridx_to_strinfo = VEC_copy (strinfo, heap, stridx_to_strinfo);
- for (i = 1; VEC_iterate (strinfo, stridx_to_strinfo, i, si); ++i)
+ stridx_to_strinfo = vec_safe_copy (stridx_to_strinfo);
+ for (i = 1; vec_safe_iterate (stridx_to_strinfo, i, &si); ++i)
if (si != NULL)
si->refcount++;
- VEC_replace (strinfo, stridx_to_strinfo, 0, NULL);
+ (*stridx_to_strinfo)[0] = NULL;
}
/* Attempt to create a string index for exp, ADDR_EXPR's operand.
@@ -297,7 +295,7 @@ new_stridx (tree exp)
if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (exp))
return 0;
idx = max_stridx++;
- VEC_replace (int, ssa_ver_to_stridx, SSA_NAME_VERSION (exp), idx);
+ ssa_ver_to_stridx[SSA_NAME_VERSION (exp)] = idx;
return idx;
}
if (TREE_CODE (exp) == ADDR_EXPR)
@@ -365,9 +363,9 @@ free_strinfo (strinfo si)
static inline strinfo
get_strinfo (int idx)
{
- if (VEC_length (strinfo, stridx_to_strinfo) <= (unsigned int) idx)
+ if (vec_safe_length (stridx_to_strinfo) <= (unsigned int) idx)
return NULL;
- return VEC_index (strinfo, stridx_to_strinfo, idx);
+ return (*stridx_to_strinfo)[idx];
}
/* Set strinfo in the vector entry IDX to SI. */
@@ -375,11 +373,11 @@ get_strinfo (int idx)
static inline void
set_strinfo (int idx, strinfo si)
{
- if (VEC_length (strinfo, stridx_to_strinfo) && VEC_index (strinfo, stridx_to_strinfo, 0))
+ if (vec_safe_length (stridx_to_strinfo) && (*stridx_to_strinfo)[0])
unshare_strinfo_vec ();
- if (VEC_length (strinfo, stridx_to_strinfo) <= (unsigned int) idx)
- VEC_safe_grow_cleared (strinfo, heap, stridx_to_strinfo, idx + 1);
- VEC_replace (strinfo, stridx_to_strinfo, idx, si);
+ if (vec_safe_length (stridx_to_strinfo) <= (unsigned int) idx)
+ vec_safe_grow_cleared (stridx_to_strinfo, idx + 1);
+ (*stridx_to_strinfo)[idx] = si;
}
/* Return string length, or NULL if it can't be computed. */
@@ -489,7 +487,7 @@ maybe_invalidate (gimple stmt)
unsigned int i;
bool nonempty = false;
- for (i = 1; VEC_iterate (strinfo, stridx_to_strinfo, i, si); ++i)
+ for (i = 1; vec_safe_iterate (stridx_to_strinfo, i, &si); ++i)
if (si != NULL)
{
if (!si->dont_invalidate)
@@ -605,8 +603,7 @@ zero_length_string (tree ptr, strinfo chainsi)
chainsi = unshare_strinfo (chainsi);
chainsi->next = 0;
}
- VEC_replace (int, ssa_ver_to_stridx, SSA_NAME_VERSION (ptr),
- chainsi->idx);
+ ssa_ver_to_stridx[SSA_NAME_VERSION (ptr)] = chainsi->idx;
return chainsi;
}
}
@@ -727,12 +724,12 @@ find_equal_ptrs (tree ptr, int idx)
/* We might find an endptr created in this pass. Grow the
vector in that case. */
- if (VEC_length (int, ssa_ver_to_stridx) <= SSA_NAME_VERSION (ptr))
- VEC_safe_grow_cleared (int, heap, ssa_ver_to_stridx, num_ssa_names);
+ if (ssa_ver_to_stridx.length () <= SSA_NAME_VERSION (ptr))
+ ssa_ver_to_stridx.safe_grow_cleared (num_ssa_names);
- if (VEC_index (int, ssa_ver_to_stridx, SSA_NAME_VERSION (ptr)) != 0)
+ if (ssa_ver_to_stridx[SSA_NAME_VERSION (ptr)] != 0)
return;
- VEC_replace (int, ssa_ver_to_stridx, SSA_NAME_VERSION (ptr), idx);
+ ssa_ver_to_stridx[SSA_NAME_VERSION (ptr)] = idx;
}
}
@@ -1189,12 +1186,12 @@ handle_builtin_strcpy (enum built_in_function bcode, gimple_stmt_iterator *gsi)
case BUILT_IN_STRCPY:
fn = builtin_decl_implicit (BUILT_IN_MEMCPY);
if (lhs)
- VEC_replace (int, ssa_ver_to_stridx, SSA_NAME_VERSION (lhs), didx);
+ ssa_ver_to_stridx[SSA_NAME_VERSION (lhs)] = didx;
break;
case BUILT_IN_STRCPY_CHK:
fn = builtin_decl_explicit (BUILT_IN_MEMCPY_CHK);
if (lhs)
- VEC_replace (int, ssa_ver_to_stridx, SSA_NAME_VERSION (lhs), didx);
+ ssa_ver_to_stridx[SSA_NAME_VERSION (lhs)] = didx;
break;
case BUILT_IN_STPCPY:
/* This would need adjustment of the lhs (subtract one),
@@ -1389,7 +1386,7 @@ handle_builtin_memcpy (enum built_in_function bcode, gimple_stmt_iterator *gsi)
laststmt.len = dsi->length;
laststmt.stridx = dsi->idx;
if (lhs)
- VEC_replace (int, ssa_ver_to_stridx, SSA_NAME_VERSION (lhs), didx);
+ ssa_ver_to_stridx[SSA_NAME_VERSION (lhs)] = didx;
break;
case BUILT_IN_MEMPCPY:
case BUILT_IN_MEMPCPY_CHK:
@@ -1609,8 +1606,8 @@ handle_pointer_plus (gimple_stmt_iterator *gsi)
if (host_integerp (off, 1)
&& (unsigned HOST_WIDE_INT) tree_low_cst (off, 1)
<= (unsigned HOST_WIDE_INT) ~idx)
- VEC_replace (int, ssa_ver_to_stridx, SSA_NAME_VERSION (lhs),
- ~(~idx - (int) tree_low_cst (off, 1)));
+ ssa_ver_to_stridx[SSA_NAME_VERSION (lhs)]
+ = ~(~idx - (int) tree_low_cst (off, 1));
return;
}
@@ -1793,8 +1790,7 @@ strlen_optimize_stmt (gimple_stmt_iterator *gsi)
&& POINTER_TYPE_P (TREE_TYPE (gimple_assign_rhs1 (stmt)))))
{
int idx = get_stridx (gimple_assign_rhs1 (stmt));
- VEC_replace (int, ssa_ver_to_stridx, SSA_NAME_VERSION (lhs),
- idx);
+ ssa_ver_to_stridx[SSA_NAME_VERSION (lhs)] = idx;
}
else if (gimple_assign_rhs_code (stmt) == POINTER_PLUS_EXPR)
handle_pointer_plus (gsi);
@@ -1884,7 +1880,7 @@ strlen_enter_block (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
stridx_to_strinfo = NULL;
else
{
- stridx_to_strinfo = (VEC(strinfo, heap) *) dombb->aux;
+ stridx_to_strinfo = ((vec<strinfo, va_heap, vl_embed> *) dombb->aux);
if (stridx_to_strinfo)
{
for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
@@ -1918,8 +1914,7 @@ strlen_enter_block (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
if (idx != get_stridx (gimple_phi_arg_def (phi, i)))
break;
if (i == n)
- VEC_replace (int, ssa_ver_to_stridx,
- SSA_NAME_VERSION (result), idx);
+ ssa_ver_to_stridx[SSA_NAME_VERSION (result)] = idx;
}
}
}
@@ -1930,8 +1925,8 @@ strlen_enter_block (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
gsi_next (&gsi);
bb->aux = stridx_to_strinfo;
- if (VEC_length (strinfo, stridx_to_strinfo) && !strinfo_shared ())
- VEC_replace (strinfo, stridx_to_strinfo, 0, (strinfo) bb);
+ if (vec_safe_length (stridx_to_strinfo) && !strinfo_shared ())
+ (*stridx_to_strinfo)[0] = (strinfo) bb;
}
/* Callback for walk_dominator_tree. Free strinfo vector if it is
@@ -1943,16 +1938,16 @@ strlen_leave_block (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
{
if (bb->aux)
{
- stridx_to_strinfo = (VEC(strinfo, heap) *) bb->aux;
- if (VEC_length (strinfo, stridx_to_strinfo)
- && VEC_index (strinfo, stridx_to_strinfo, 0) == (strinfo) bb)
+ stridx_to_strinfo = ((vec<strinfo, va_heap, vl_embed> *) bb->aux);
+ if (vec_safe_length (stridx_to_strinfo)
+ && (*stridx_to_strinfo)[0] == (strinfo) bb)
{
unsigned int i;
strinfo si;
- for (i = 1; VEC_iterate (strinfo, stridx_to_strinfo, i, si); ++i)
+ for (i = 1; vec_safe_iterate (stridx_to_strinfo, i, &si); ++i)
free_strinfo (si);
- VEC_free (strinfo, heap, stridx_to_strinfo);
+ vec_free (stridx_to_strinfo);
}
bb->aux = NULL;
}
@@ -1965,7 +1960,7 @@ tree_ssa_strlen (void)
{
struct dom_walk_data walk_data;
- VEC_safe_grow_cleared (int, heap, ssa_ver_to_stridx, num_ssa_names);
+ ssa_ver_to_stridx.safe_grow_cleared (num_ssa_names);
max_stridx = 1;
strinfo_pool = create_alloc_pool ("strinfo_struct pool",
sizeof (struct strinfo_struct), 64);
@@ -1990,7 +1985,7 @@ tree_ssa_strlen (void)
/* Finalize the dominator walker. */
fini_walk_dominator_tree (&walk_data);
- VEC_free (int, heap, ssa_ver_to_stridx);
+ ssa_ver_to_stridx.release ();
free_alloc_pool (strinfo_pool);
if (decl_to_stridxlist_htab)
{