summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/java/ChangeLog13
-rw-r--r--gcc/java/check-init.c3
-rw-r--r--gcc/java/decl.c21
-rw-r--r--gcc/java/expr.c2
-rw-r--r--gcc/java/java-tree.h4
-rw-r--r--gcc/java/jcf-write.c3
-rw-r--r--gcc/java/parse.h14
7 files changed, 32 insertions, 28 deletions
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog
index 081dab16a93..8ccb4b29d03 100644
--- a/gcc/java/ChangeLog
+++ b/gcc/java/ChangeLog
@@ -1,5 +1,18 @@
2001-03-28 Richard Henderson <rth@redhat.com>
+ * java-tree.h (throw_node): Define as a single member of
+ java_global_trees instead of a separate array.
+ (JTI_THROW_NODE): New.
+ * decl.c (throw_node): Don't declare.
+ (init_decl_processing): Init a scalar throw_node.
+ Don't register it for gc.
+ * check-init.c (check_init): Reference scalar throw_node.
+ * expr.c (build_java_athrow): Likewise.
+ * jcf-write.c (generate_bytecode_insns): Likewise.
+ * parse.h (BUILD_THROW): Likewise.
+
+2001-03-28 Richard Henderson <rth@redhat.com>
+
* decl.c (end_java_method): Do not save and restore
flag_non_call_exceptions.
* parse.y (source_end_java_method): Likewise.
diff --git a/gcc/java/check-init.c b/gcc/java/check-init.c
index 49df07291d5..74144020afb 100644
--- a/gcc/java/check-init.c
+++ b/gcc/java/check-init.c
@@ -694,8 +694,7 @@ check_init (exp, before)
for ( ; x != NULL_TREE; x = TREE_CHAIN (x))
check_init (TREE_VALUE (x), before);
- if (func == throw_node[0]
- || func == throw_node[1])
+ if (func == throw_node)
goto never_continues;
}
break;
diff --git a/gcc/java/decl.c b/gcc/java/decl.c
index c81c3421104..c0b67b22d7c 100644
--- a/gcc/java/decl.c
+++ b/gcc/java/decl.c
@@ -72,8 +72,6 @@ tree decl_map;
static tree pending_local_decls = NULL_TREE;
-tree throw_node [2];
-
/* Push a local variable or stack slot into the decl_map,
and assign it an rtl. */
@@ -727,18 +725,13 @@ init_decl_processing ()
t),
0, NOT_BUILT_IN,
NULL_PTR);
- throw_node[0] = builtin_function ("_Jv_Throw",
- build_function_type (ptr_type_node, t),
- 0, NOT_BUILT_IN, NULL_PTR);
+ throw_node = builtin_function ((USING_SJLJ_EXCEPTIONS
+ ? "_Jv_Throw" : "_Jv_Sjlj_Throw"),
+ build_function_type (ptr_type_node, t),
+ 0, NOT_BUILT_IN, NULL_PTR);
/* Mark throw_nodes as `noreturn' functions with side effects. */
- TREE_THIS_VOLATILE (throw_node[0]) = 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;
+ TREE_THIS_VOLATILE (throw_node) = 1;
+ TREE_SIDE_EFFECTS (throw_node) = 1;
t = build_function_type (int_type_node, endlink);
soft_monitorenter_node
= builtin_function ("_Jv_MonitorEnter", t, 0, NOT_BUILT_IN,
@@ -884,8 +877,6 @@ init_decl_processing ()
/* Register nodes with the garbage collector. */
ggc_add_tree_root (java_global_trees,
sizeof (java_global_trees) / sizeof (tree));
- ggc_add_tree_root (throw_node,
- sizeof (throw_node) / sizeof (tree));
ggc_add_tree_root (predef_filenames,
sizeof (predef_filenames) / sizeof (tree));
ggc_add_tree_root (&decl_map, 1);
diff --git a/gcc/java/expr.c b/gcc/java/expr.c
index 7ec5e832e29..42c43aad536 100644
--- a/gcc/java/expr.c
+++ b/gcc/java/expr.c
@@ -600,7 +600,7 @@ build_java_athrow (node)
call = build (CALL_EXPR,
void_type_node,
- build_address_of (throw_node[USING_SJLJ_EXCEPTIONS ? 1 : 0]),
+ build_address_of (throw_node),
build_tree_list (NULL_TREE, node),
NULL_TREE);
TREE_SIDE_EFFECTS (call) = 1;
diff --git a/gcc/java/java-tree.h b/gcc/java/java-tree.h
index 33f8a5b4c18..01a0722d39b 100644
--- a/gcc/java/java-tree.h
+++ b/gcc/java/java-tree.h
@@ -321,6 +321,7 @@ enum java_tree_index
JTI_END_PARAMS_NODE,
+ JTI_THROW_NODE,
JTI_ALLOC_OBJECT_NODE,
JTI_SOFT_INSTANCEOF_NODE,
JTI_SOFT_CHECKCAST_NODE,
@@ -544,6 +545,8 @@ extern tree java_global_trees[JTI_MAX];
java_global_trees[JTI_END_PARAMS_NODE]
/* References to internal libjava functions we use. */
+#define throw_node \
+ java_global_trees[JTI_THROW_NODE]
#define alloc_object_node \
java_global_trees[JTI_ALLOC_OBJECT_NODE]
#define soft_instanceof_node \
@@ -562,7 +565,6 @@ extern tree java_global_trees[JTI_MAX];
java_global_trees[JTI_SOFT_BADARRAYINDEX_NODE]
#define soft_nullpointer_node \
java_global_trees[JTI_SOFT_NULLPOINTER_NODE]
-extern tree throw_node[];
#define soft_checkarraystore_node \
java_global_trees[JTI_SOFT_CHECKARRAYSTORE_NODE]
#define soft_monitorenter_node \
diff --git a/gcc/java/jcf-write.c b/gcc/java/jcf-write.c
index 4593e8a64b5..b84c86ebde2 100644
--- a/gcc/java/jcf-write.c
+++ b/gcc/java/jcf-write.c
@@ -2513,8 +2513,7 @@ generate_bytecode_insns (exp, target, state)
}
else if (f == soft_monitorenter_node
|| f == soft_monitorexit_node
- || f == throw_node[0]
- || f == throw_node[1])
+ || f == throw_node)
{
if (f == soft_monitorenter_node)
op = OPCODE_monitorenter;
diff --git a/gcc/java/parse.h b/gcc/java/parse.h
index 05fb2119e8e..9ca55d4aa47 100644
--- a/gcc/java/parse.h
+++ b/gcc/java/parse.h
@@ -669,13 +669,13 @@ typedef struct _jdeplist {
TREE_SIDE_EFFECTS (WHERE) = 1; \
}
-#define BUILD_THROW(WHERE, WHAT) \
- { \
- (WHERE) = \
- build (CALL_EXPR, void_type_node, \
- build_address_of (throw_node[USING_SJLJ_EXCEPTIONS ? 1 : 0]), \
- build_tree_list (NULL_TREE, (WHAT)), NULL_TREE); \
- TREE_SIDE_EFFECTS ((WHERE)) = 1; \
+#define BUILD_THROW(WHERE, WHAT) \
+ { \
+ (WHERE) = \
+ build (CALL_EXPR, void_type_node, \
+ build_address_of (throw_node), \
+ build_tree_list (NULL_TREE, (WHAT)), NULL_TREE); \
+ TREE_SIDE_EFFECTS ((WHERE)) = 1; \
}
/* Set wfl_operator for the most accurate error location */