int java_gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p) { enum tree_code code = TREE_CODE (*expr_p); switch (code) { case BLOCK: *expr_p = java_gimplify_block (*expr_p); break; case MODIFY_EXPR: return java_gimplify_modify_expr (expr_p); case POSTINCREMENT_EXPR: case POSTDECREMENT_EXPR: case PREINCREMENT_EXPR: case PREDECREMENT_EXPR: return java_gimplify_self_mod_expr (expr_p, pre_p, post_p); /* These should already be lowered before we get here. */ case URSHIFT_EXPR: case COMPARE_EXPR: case COMPARE_L_EXPR: case COMPARE_G_EXPR: gcc_unreachable (); default: return GS_UNHANDLED; } return GS_OK; }
int java_gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p) { enum tree_code code = TREE_CODE (*expr_p); switch (code) { case BLOCK: *expr_p = java_gimplify_block (*expr_p); break; case VAR_DECL: *expr_p = java_replace_reference (*expr_p, /* want_lvalue */ false); return GS_UNHANDLED; case MODIFY_EXPR: return java_gimplify_modify_expr (expr_p); case SAVE_EXPR: /* Note that we can see <save_expr NULL> if the save_expr was already handled by gimplify_save_expr. */ if (TREE_OPERAND (*expr_p, 0) != NULL_TREE && TREE_CODE (TREE_OPERAND (*expr_p, 0)) == VAR_DECL) TREE_OPERAND (*expr_p, 0) = java_replace_reference (TREE_OPERAND (*expr_p, 0), /* want_lvalue */ false); return GS_UNHANDLED; case POSTINCREMENT_EXPR: case POSTDECREMENT_EXPR: case PREINCREMENT_EXPR: case PREDECREMENT_EXPR: return java_gimplify_self_mod_expr (expr_p, pre_p, post_p); /* These should already be lowered before we get here. */ case URSHIFT_EXPR: case COMPARE_EXPR: case COMPARE_L_EXPR: case COMPARE_G_EXPR: gcc_unreachable (); default: /* Java insists on strict left-to-right evaluation of expressions. A problem may arise if a variable used in the LHS of a binary operation is altered by an assignment to that value in the RHS before we've performed the operation. So, we always copy every LHS to a temporary variable. FIXME: Are there any other cases where we should do this? Parameter lists, maybe? Or perhaps that's unnecessary because the front end already generates SAVE_EXPRs. */ if (TREE_CODE_CLASS (code) == tcc_binary || TREE_CODE_CLASS (code) == tcc_comparison) { enum gimplify_status stat = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p, is_gimple_formal_tmp_var, fb_rvalue); if (stat == GS_ERROR) return stat; } return GS_UNHANDLED; } return GS_OK; }