Commit 3910a7cb by Richard Kenner

(contains_placeholder_p): Call contains_this_placeholder_p.

(contains_this_placeholder_p): Renamed from contains_placeholder_p.
Added new arg, PL.
Rework to make more consistent, check more codes, and avoid
undefined fields.

From-SVN: r14497
parent b9a2d591
...@@ -2392,53 +2392,86 @@ unsave_expr_now (expr) ...@@ -2392,53 +2392,86 @@ unsave_expr_now (expr)
} }
/* Return 1 if EXP contains a PLACEHOLDER_EXPR; i.e., if it represents a size /* Return 1 if EXP contains a PLACEHOLDER_EXPR; i.e., if it represents a size
or offset that depends on a field within a record. or offset that depends on a field within a record. */
Note that we only allow such expressions within simple arithmetic
or a COND_EXPR. */
int int
contains_placeholder_p (exp) contains_placeholder_p (exp)
tree exp; tree exp;
{ {
return contains_this_placeholder_p (exp, NULL_TREE);
}
/* Similar, but if PL is non-zero it is assumed to be a PLACEHOLDER_EXPR
and we return 1 if that PLACEHOLDER_EXPR is in EXP. */
int
contains_this_placeholder_p (exp, pl)
tree exp;
tree pl;
{
register enum tree_code code = TREE_CODE (exp); register enum tree_code code = TREE_CODE (exp);
tree inner;
/* If we have a WITH_RECORD_EXPR, it "cancels" any PLACEHOLDER_EXPR /* If we have a WITH_RECORD_EXPR, it "cancels" any PLACEHOLDER_EXPR
in it since it is supplying a value for it. */ in it since it is supplying a value for it. */
if (code == WITH_RECORD_EXPR) if (code == WITH_RECORD_EXPR)
return 0; return 0;
else if (code == PLACEHOLDER_EXPR) else if (code == PLACEHOLDER_EXPR)
return 1; return (pl == 0 || pl == exp);
switch (TREE_CODE_CLASS (code)) switch (TREE_CODE_CLASS (code))
{ {
case 'r': case 'r':
for (inner = TREE_OPERAND (exp, 0); if (TREE_CODE (exp) == ARRAY_REF)
TREE_CODE_CLASS (TREE_CODE (inner)) == 'r'; {
inner = TREE_OPERAND (inner, 0)) tree domain = TYPE_DOMAIN (TREE_TYPE (TREE_OPERAND (exp, 0)));
;
return TREE_CODE (inner) == PLACEHOLDER_EXPR; if (domain != 0
&& ((TREE_CODE (TYPE_MIN_VALUE (domain)) != INTEGER_CST
&& contains_this_placeholder_p (TYPE_MIN_VALUE (domain),
pl))
|| (TREE_CODE (TYPE_MAX_VALUE (domain)) != INTEGER_CST
&& contains_this_placeholder_p (TYPE_MAX_VALUE (domain),
pl))
|| contains_this_placeholder_p (TREE_OPERAND (exp, 1), pl)))
return 1;
}
else if (TREE_CODE (exp) == BIT_FIELD_REF
&& (contains_this_placeholder_p (TREE_OPERAND (exp, 1), pl)
|| contains_this_placeholder_p (TREE_OPERAND (exp, 2), pl)))
return 1;
return contains_this_placeholder_p (TREE_OPERAND (exp, 0), pl);
case '1': case '1':
case '2': case '<': case '2': case '<':
case 'e': case 'e':
switch (code)
{
case COMPOUND_EXPR:
/* Ignoring the first operand isn't quite right, but works best. */
return contains_this_placeholder_p (TREE_OPERAND (exp, 1), pl);
case RTL_EXPR:
case CONSTRUCTOR:
return 0;
case COND_EXPR:
return (contains_this_placeholder_p (TREE_OPERAND (exp, 0), pl)
|| contains_this_placeholder_p (TREE_OPERAND (exp, 1), pl)
|| contains_this_placeholder_p (TREE_OPERAND (exp, 2), pl));
case SAVE_EXPR:
return (SAVE_EXPR_RTL (exp) == 0
&& contains_this_placeholder_p (TREE_OPERAND (exp, 0), pl));
}
switch (tree_code_length[(int) code]) switch (tree_code_length[(int) code])
{ {
case 1: case 1:
return contains_placeholder_p (TREE_OPERAND (exp, 0)); return contains_this_placeholder_p (TREE_OPERAND (exp, 0), pl);
case 2: case 2:
return (code != RTL_EXPR return (contains_this_placeholder_p (TREE_OPERAND (exp, 0), pl)
&& code != CONSTRUCTOR || contains_this_placeholder_p (TREE_OPERAND (exp, 1), pl));
&& ! (code == SAVE_EXPR && SAVE_EXPR_RTL (exp) != 0)
&& code != WITH_RECORD_EXPR
&& (contains_placeholder_p (TREE_OPERAND (exp, 0))
|| contains_placeholder_p (TREE_OPERAND (exp, 1))));
case 3:
return (code == COND_EXPR
&& (contains_placeholder_p (TREE_OPERAND (exp, 0))
|| contains_placeholder_p (TREE_OPERAND (exp, 1))
|| contains_placeholder_p (TREE_OPERAND (exp, 2))));
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment