+2001-07-31 Alexandre Petit-Bianco <apbianco@redhat.com>
+
+ * expr.c (safe_from_p): Use WITH_CLEANUP_EXPR_RTL instead of
+ RTL_EXPR_RTL while handling WITH_CLEANUP_EXPR nodes. Fixed typo in
+ comment.
+ (expand_expr): Use WITH_CLEANUP_EXPR_RTL instead of RTL_EXPR_RTL
+ while handling WITH_CLEANUP_EXPR node. Use second operand calling
+ expand_decl_cleanup.
+ * tree.c (firt_rtl_op): The third operand of WITH_CLEANUP_EXPR is
+ the first RTX.
+ (simple_cst_equal): WITH_CLEANUP_EXPR node to use its second
+ operand while calling simple_cst_equal.
+ * tree.def (WITH_CLEANUP_EXPR): Switched operands: the second
+ operand is the cleanup expression, the third is the RTL_EXPR.
+ * tree.h (WITH_CLEANUP_EXPR_RTL): New macro.
+
2001-07-31 Jeff Sturm <jsturm@one-point.com>
* except.c (duplicate_eh_regions): Test n_array[i] for NULL.
+2001-07-31 Alexandre Petit-Bianco <apbianco@redhat.com>
+
+ * tree.c (cp_tree_equal): WITH_CLEANUP_EXPR node to use its second
+ operand while calling cp_tree_equal.
+
2001-07-31 Nathan Sidwell <nathan@codesourcery.com>
The 3.0 ABI no longer has vbase pointer fields.
cmp = cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
if (cmp <= 0)
return cmp;
- return cp_tree_equal (TREE_OPERAND (t1, 2), TREE_OPERAND (t1, 2));
+ return cp_tree_equal (TREE_OPERAND (t1, 1), TREE_OPERAND (t1, 1));
case COMPONENT_REF:
if (TREE_OPERAND (t1, 1) == TREE_OPERAND (t2, 1))
break;
case WITH_CLEANUP_EXPR:
- exp_rtl = RTL_EXPR_RTL (exp);
+ exp_rtl = WITH_CLEANUP_EXPR_RTL (exp);
break;
case CLEANUP_POINT_EXPR:
lineno = EXPR_WFL_LINENO (exp);
if (EXPR_WFL_EMIT_LINE_NOTE (exp))
emit_line_note (input_filename, lineno);
- /* Possibly avoid switching back and force here. */
+ /* Possibly avoid switching back and forth here. */
to_return = expand_expr (EXPR_WFL_NODE (exp), target, tmode, modifier);
input_filename = saved_input_filename;
lineno = saved_lineno;
}
case WITH_CLEANUP_EXPR:
- if (RTL_EXPR_RTL (exp) == 0)
+ if (WITH_CLEANUP_EXPR_RTL (exp) == 0)
{
- RTL_EXPR_RTL (exp)
+ WITH_CLEANUP_EXPR_RTL (exp)
= expand_expr (TREE_OPERAND (exp, 0), target, tmode, ro_modifier);
- expand_decl_cleanup (NULL_TREE, TREE_OPERAND (exp, 2));
+ expand_decl_cleanup (NULL_TREE, TREE_OPERAND (exp, 1));
/* That's it for this cleanup. */
- TREE_OPERAND (exp, 2) = 0;
+ TREE_OPERAND (exp, 1) = 0;
}
- return RTL_EXPR_RTL (exp);
+ return WITH_CLEANUP_EXPR_RTL (exp);
case CLEANUP_POINT_EXPR:
{
+2001-07-31 Alexandre Petit-Bianco <apbianco@redhat.com>
+
+ * check-init.c (check_init): WITH_CLEANUP_EXPR node to use its
+ second operand calling check_init.
+ * decl.c (complete_start_java_method): Swaped second and third
+ arguments while creating WITH_CLEANUP_EXPR node.
+ * jcf-write.c (generate_bytecode_insns): Use second operand
+ instead of third when handling WITH_CLEANUP_EXPR.
+ * parse.y (java_complete_lhs): Expand second operand of
+ WITH_CLEANUP_EXPR nodes.
+ (patch_synchronized_statement): Swaped second and third arguments
+ while creating WITH_CLEANUP_EXPR node.
+
2001-07-18 Alexandre Petit-Bianco <apbianco@redhat.com>
* parse.y (create_interface): Avoid cyclic inheritance report when
#endif
check_init (TREE_OPERAND (exp, 0), before);
UNION (alt->combined, alt->combined, before);
- check_init (TREE_OPERAND (exp, 2), alt->combined);
+ check_init (TREE_OPERAND (exp, 1), alt->combined);
return;
}
tree function_body = DECL_FUNCTION_BODY (fndecl);
tree body = BLOCK_EXPR_BODY (function_body);
lock = build (WITH_CLEANUP_EXPR, void_type_node,
- enter, NULL_TREE, exit);
+ enter, exit, NULL_TREE);
TREE_SIDE_EFFECTS (lock) = 1;
lock = build (COMPOUND_EXPR, TREE_TYPE (body), lock, body);
TREE_SIDE_EFFECTS (lock) = 1;
label->next = state->labeled_blocks;
state->labeled_blocks = label;
state->num_finalizers++;
- label->u.labeled_block = TREE_OPERAND (exp, 2);
+ label->u.labeled_block = TREE_OPERAND (exp, 1);
label->v.start_label = get_jcf_label_here (state);
if (target != IGNORE_TARGET)
abort ();
case WITH_CLEANUP_EXPR:
COMPLETE_CHECK_OP_0 (node);
- COMPLETE_CHECK_OP_2 (node);
+ COMPLETE_CHECK_OP_1 (node);
CAN_COMPLETE_NORMALLY (node) =
CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 0));
TREE_TYPE (node) = void_type_node;
build (WITH_CLEANUP_EXPR, NULL_TREE,
build (COMPOUND_EXPR, NULL_TREE,
assignment, enter),
- NULL_TREE, exit),
+ exit, NULL_TREE),
block));
node = build_expr_block (node, expr_decl);
case RTL_EXPR:
return 0;
case WITH_CLEANUP_EXPR:
- /* Should be defined to be 2. */
- return 1;
+ return 2;
case METHOD_CALL_EXPR:
return 3;
default:
if (cmp <= 0)
return cmp;
- return simple_cst_equal (TREE_OPERAND (t1, 2), TREE_OPERAND (t1, 2));
+ return simple_cst_equal (TREE_OPERAND (t1, 1), TREE_OPERAND (t1, 1));
case COMPONENT_REF:
if (TREE_OPERAND (t1, 1) == TREE_OPERAND (t2, 1))
/* Specify a value to compute along with its corresponding cleanup.
Operand 0 argument is an expression whose value needs a cleanup.
- Operand 1 is an RTL_EXPR which will eventually represent that value.
- Operand 2 is the cleanup expression for the object.
+ Operand 1 is the cleanup expression for the object.
+ Operand 2 is an RTL_EXPR which will eventually represent that value.
The RTL_EXPR is used in this expression, which is how the expression
manages to act on the proper value.
The cleanup is executed by the first enclosing CLEANUP_POINT_EXPR, if
#define RTL_EXPR_SEQUENCE(NODE) (*(struct rtx_def **) &EXPR_CHECK (NODE)->exp.operands[0])
#define RTL_EXPR_RTL(NODE) (*(struct rtx_def **) &EXPR_CHECK (NODE)->exp.operands[1])
+/* In a WITH_CLEANUP_EXPR node. */
+#define WITH_CLEANUP_EXPR_RTL(NODE) \
+ (*(struct rtx_def **) &EXPR_CHECK (NODE)->exp.operands[2])
+
/* In a CONSTRUCTOR node. */
#define CONSTRUCTOR_ELTS(NODE) TREE_OPERAND (NODE, 1)