typeck.c (convert_ieee_real_to_integer): Use save_expr instead of explicit build_decl.
� * typeck.c (convert_ieee_real_to_integer): Use save_expr instead of explicit build_decl. (Avoids crash in reload when optimizing.) * decl.c (complete_start_java_method): Handle synchronized method even when compiling from bytecode. From-SVN: r25468
This commit is contained in:
parent
686fb23678
commit
37a08adb75
@ -1514,29 +1514,6 @@ complete_start_java_method (fndecl)
|
||||
expand_expr_stmt (init);
|
||||
}
|
||||
|
||||
if (METHOD_SYNCHRONIZED (fndecl) && ! flag_emit_class_files
|
||||
&& DECL_FUNCTION_BODY (fndecl) != NULL_TREE)
|
||||
{
|
||||
/* Warp function body with a monitorenter plus monitorexit cleanup. */
|
||||
tree function_body = DECL_FUNCTION_BODY (fndecl);
|
||||
tree body = BLOCK_EXPR_BODY (function_body);
|
||||
tree enter, exit, lock;
|
||||
if (METHOD_STATIC (fndecl))
|
||||
lock = build_class_ref (DECL_CONTEXT (fndecl));
|
||||
else
|
||||
lock = DECL_ARGUMENTS (fndecl);
|
||||
BUILD_MONITOR_ENTER (enter, lock);
|
||||
BUILD_MONITOR_EXIT (exit, lock);
|
||||
lock = build (WITH_CLEANUP_EXPR, void_type_node,
|
||||
enter, NULL_TREE, exit);
|
||||
TREE_SIDE_EFFECTS (lock) = 1;
|
||||
lock = build (COMPOUND_EXPR, TREE_TYPE (body), lock, body);
|
||||
TREE_SIDE_EFFECTS (lock) = 1;
|
||||
lock = build1 (CLEANUP_POINT_EXPR, TREE_TYPE (body), lock);
|
||||
TREE_SIDE_EFFECTS (lock) = 1;
|
||||
BLOCK_EXPR_BODY (function_body) = lock;
|
||||
}
|
||||
|
||||
/* Push local variables. Function compiled from source code are
|
||||
using a different local variables management, and for them,
|
||||
pushlevel shouldn't be called from here. */
|
||||
@ -1546,6 +1523,36 @@ complete_start_java_method (fndecl)
|
||||
if (! flag_emit_class_files)
|
||||
expand_start_bindings (1);
|
||||
}
|
||||
|
||||
if (METHOD_SYNCHRONIZED (fndecl) && ! flag_emit_class_files)
|
||||
{
|
||||
/* Warp function body with a monitorenter plus monitorexit cleanup. */
|
||||
tree enter, exit, lock;
|
||||
if (METHOD_STATIC (fndecl))
|
||||
lock = build_class_ref (DECL_CONTEXT (fndecl));
|
||||
else
|
||||
lock = DECL_ARGUMENTS (fndecl);
|
||||
BUILD_MONITOR_ENTER (enter, lock);
|
||||
BUILD_MONITOR_EXIT (exit, lock);
|
||||
if (!CLASS_FROM_SOURCE_P (DECL_CONTEXT (fndecl)))
|
||||
{
|
||||
expand_expr_stmt (enter);
|
||||
expand_decl_cleanup (NULL_TREE, exit);
|
||||
}
|
||||
else
|
||||
{
|
||||
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);
|
||||
TREE_SIDE_EFFECTS (lock) = 1;
|
||||
lock = build (COMPOUND_EXPR, TREE_TYPE (body), lock, body);
|
||||
TREE_SIDE_EFFECTS (lock) = 1;
|
||||
lock = build1 (CLEANUP_POINT_EXPR, TREE_TYPE (body), lock);
|
||||
TREE_SIDE_EFFECTS (lock) = 1;
|
||||
BLOCK_EXPR_BODY (function_body) = lock;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -67,23 +67,12 @@ convert_ieee_real_to_integer (type, expr)
|
||||
tree type, expr;
|
||||
{
|
||||
tree node, assignment, expr_decl;
|
||||
expr = save_expr (expr);
|
||||
|
||||
expr_decl = build_decl (VAR_DECL, generate_name (), TREE_TYPE (expr));
|
||||
layout_decl (expr_decl, 0);
|
||||
expand_decl (pushdecl (expr_decl));
|
||||
assignment = build (MODIFY_EXPR, NULL_TREE, expr_decl, expr);
|
||||
TREE_SIDE_EFFECTS (assignment) = 1;
|
||||
TREE_TYPE (assignment) = type;
|
||||
|
||||
expr = build (COMPOUND_EXPR, NULL_TREE,
|
||||
assignment,
|
||||
build (COND_EXPR, type,
|
||||
build (NE_EXPR, boolean_type_node, expr_decl, expr_decl),
|
||||
build_int_2 (0, 0),
|
||||
convert_to_integer (type, expr_decl)));
|
||||
|
||||
TREE_TYPE (expr) = type;
|
||||
return expr;
|
||||
return build (COND_EXPR, type,
|
||||
build (NE_EXPR, boolean_type_node, expr, expr),
|
||||
convert (type, integer_zero_node),
|
||||
convert_to_integer (type, expr));
|
||||
}
|
||||
|
||||
/* Create an expression whose value is that of EXPR,
|
||||
|
Loading…
Reference in New Issue
Block a user