PATCH jc1: fix synchronized, float->int conversion
Per Bothner
bothner@cygnus.com
Fri Feb 26 14:45:00 GMT 1999
I've checked these into egcs.
--Per Bothner
Cygnus Solutions bothner@cygnus.com http://www.cygnus.com/~bothner
Fri Feb 26 14:06:21 1999 Per Bothner <bothner@cygnus.com>
* typeck.c (convert_ieee_real_to_integer): Use save_expr instead of
explicit build_decl. (Avoids crash in reload when optimizing.)
Thu Feb 25 21:05:04 1999 Per Bothner <bothner@cygnus.com>
* decl.c (complete_start_java_method): Handle synchronized method
even when compiling from bytecode.
Index: typeck.c
===================================================================
RCS file: /cvs/cvsfiles/devo/gcc/java/typeck.c,v
retrieving revision 1.42
diff -u -p -r1.42 typeck.c
--- typeck.c 1999/02/19 22:59:24 1.42
+++ typeck.c 1999/02/26 22:36:08
@@ -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,
Index: decl.c
===================================================================
RCS file: /cvs/cvsfiles/devo/gcc/java/decl.c,v
retrieving revision 1.67
diff -u -p -r1.67 decl.c
--- decl.c 1999/02/21 23:47:59 1.67
+++ decl.c 1999/02/26 22:36:08
@@ -1514,12 +1514,19 @@ complete_start_java_method (fndecl)
expand_expr_stmt (init);
}
- if (METHOD_SYNCHRONIZED (fndecl) && ! flag_emit_class_files
- && DECL_FUNCTION_BODY (fndecl) != NULL_TREE)
+ /* 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. */
+ if (!CLASS_FROM_SOURCE_P (DECL_CONTEXT (fndecl)))
{
+ pushlevel (2);
+ 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 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));
@@ -1527,24 +1534,24 @@ complete_start_java_method (fndecl)
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. */
- if (!CLASS_FROM_SOURCE_P (DECL_CONTEXT (fndecl)))
- {
- pushlevel (2);
- if (! flag_emit_class_files)
- expand_start_bindings (1);
+ 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;
+ }
}
}
More information about the Gcc-patches
mailing list