Commit 8bbb23b7 by Andrew Haley Committed by Andrew Haley

parse.h (BUILD_THROW): Add support for sjlj-exceptions.

1999-11-17  Andrew Haley  <aph@cygnus.com>

	* parse.h (BUILD_THROW): Add support for sjlj-exceptions.
	decl.c (init_decl_processing): Add _Jv_Sjlj_Throw.
	expr.c (build_java_athrow): Add support for sjlj-exceptions.
	java-tree.h: Ditto.
	jcf-write.c: Ditto.

From-SVN: r30859
parent 22d37998
1999-12-10 Andrew Haley <aph@cygnus.com>
* parse.h (BUILD_THROW): Add support for sjlj-exceptions.
decl.c (init_decl_processing): Add _Jv_Sjlj_Throw.
expr.c (build_java_athrow): Add support for sjlj-exceptions.
java-tree.h: Ditto.
jcf-write.c: Ditto.
1999-12-5 Anthony Green <green@cygnus.com> 1999-12-5 Anthony Green <green@cygnus.com>
* decl.c (init_decl_processing): Mark throw_node as a noreturn * decl.c (init_decl_processing): Mark throw_node as a noreturn
......
...@@ -337,7 +337,7 @@ tree soft_newarray_node; ...@@ -337,7 +337,7 @@ tree soft_newarray_node;
tree soft_anewarray_node; tree soft_anewarray_node;
tree soft_multianewarray_node; tree soft_multianewarray_node;
tree soft_badarrayindex_node; tree soft_badarrayindex_node;
tree throw_node; tree throw_node [2];
tree soft_checkarraystore_node; tree soft_checkarraystore_node;
tree soft_monitorenter_node; tree soft_monitorenter_node;
tree soft_monitorexit_node; tree soft_monitorexit_node;
...@@ -706,12 +706,18 @@ init_decl_processing () ...@@ -706,12 +706,18 @@ init_decl_processing ()
0, NOT_BUILT_IN, 0, NOT_BUILT_IN,
NULL_PTR); NULL_PTR);
t = tree_cons (NULL_TREE, ptr_type_node, endlink); t = tree_cons (NULL_TREE, ptr_type_node, endlink);
throw_node = builtin_function ("_Jv_Throw", throw_node[0] = builtin_function ("_Jv_Throw",
build_function_type (ptr_type_node, t), build_function_type (ptr_type_node, t),
0, NOT_BUILT_IN, NULL_PTR); 0, NOT_BUILT_IN, NULL_PTR);
/* Mark throw_node as a `noreturn' function with side effects. */ /* Mark throw_nodes as `noreturn' functions with side effects. */
TREE_THIS_VOLATILE (throw_node) = 1; TREE_THIS_VOLATILE (throw_node[0]) = 1;
TREE_SIDE_EFFECTS (throw_node) = 1; TREE_SIDE_EFFECTS (throw_node[0]) = 1;
t = tree_cons (NULL_TREE, ptr_type_node, endlink);
throw_node[1] = builtin_function ("_Jv_Sjlj_Throw",
build_function_type (ptr_type_node, t),
0, NOT_BUILT_IN, NULL_PTR);
TREE_THIS_VOLATILE (throw_node[1]) = 1;
TREE_SIDE_EFFECTS (throw_node[1]) = 1;
t = build_function_type (int_type_node, endlink); t = build_function_type (int_type_node, endlink);
soft_monitorenter_node soft_monitorenter_node
= builtin_function ("_Jv_MonitorEnter", t, 0, NOT_BUILT_IN, = builtin_function ("_Jv_MonitorEnter", t, 0, NOT_BUILT_IN,
......
...@@ -523,7 +523,8 @@ java_stack_dup (size, offset) ...@@ -523,7 +523,8 @@ java_stack_dup (size, offset)
} }
} }
/* Calls _Jv_Throw. Discard the contents of the value stack. */ /* Calls _Jv_Throw or _Jv_Sjlj_Throw. Discard the contents of the
value stack. */
static void static void
build_java_athrow (node) build_java_athrow (node)
...@@ -533,7 +534,7 @@ build_java_athrow (node) ...@@ -533,7 +534,7 @@ build_java_athrow (node)
call = build (CALL_EXPR, call = build (CALL_EXPR,
void_type_node, void_type_node,
build_address_of (throw_node), build_address_of (throw_node[exceptions_via_longjmp ? 1 : 0]),
build_tree_list (NULL_TREE, node), build_tree_list (NULL_TREE, node),
NULL_TREE); NULL_TREE);
TREE_SIDE_EFFECTS (call) = 1; TREE_SIDE_EFFECTS (call) = 1;
......
...@@ -269,7 +269,7 @@ extern tree soft_newarray_node; ...@@ -269,7 +269,7 @@ extern tree soft_newarray_node;
extern tree soft_anewarray_node; extern tree soft_anewarray_node;
extern tree soft_multianewarray_node; extern tree soft_multianewarray_node;
extern tree soft_badarrayindex_node; extern tree soft_badarrayindex_node;
extern tree throw_node; extern tree throw_node[];
extern tree soft_checkarraystore_node; extern tree soft_checkarraystore_node;
extern tree soft_monitorenter_node; extern tree soft_monitorenter_node;
extern tree soft_monitorexit_node; extern tree soft_monitorexit_node;
......
...@@ -2451,7 +2451,8 @@ generate_bytecode_insns (exp, target, state) ...@@ -2451,7 +2451,8 @@ generate_bytecode_insns (exp, target, state)
} }
else if (f == soft_monitorenter_node else if (f == soft_monitorenter_node
|| f == soft_monitorexit_node || f == soft_monitorexit_node
|| f == throw_node) || f == throw_node[0]
|| f == throw_node[1])
{ {
if (f == soft_monitorenter_node) if (f == soft_monitorenter_node)
op = OPCODE_monitorenter; op = OPCODE_monitorenter;
......
...@@ -534,7 +534,7 @@ typedef struct _jdeplist { ...@@ -534,7 +534,7 @@ typedef struct _jdeplist {
#define BUILD_THROW(WHERE, WHAT) \ #define BUILD_THROW(WHERE, WHAT) \
{ \ { \
(WHERE) = build (CALL_EXPR, void_type_node, \ (WHERE) = build (CALL_EXPR, void_type_node, \
build_address_of (throw_node), \ build_address_of (throw_node[exceptions_via_longjmp ? 1 : 0]), \
build_tree_list (NULL_TREE, (WHAT)), NULL_TREE); \ build_tree_list (NULL_TREE, (WHAT)), NULL_TREE); \
TREE_SIDE_EFFECTS ((WHERE)) = 1; \ TREE_SIDE_EFFECTS ((WHERE)) = 1; \
} }
......
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