diff options
-rw-r--r-- | gcc/java/ChangeLog | 13 | ||||
-rw-r--r-- | gcc/java/check-init.c | 3 | ||||
-rw-r--r-- | gcc/java/decl.c | 21 | ||||
-rw-r--r-- | gcc/java/expr.c | 2 | ||||
-rw-r--r-- | gcc/java/java-tree.h | 4 | ||||
-rw-r--r-- | gcc/java/jcf-write.c | 3 | ||||
-rw-r--r-- | gcc/java/parse.h | 14 |
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 */ |