aboutsummaryrefslogtreecommitdiff
path: root/gcc/java/verify.c
diff options
context:
space:
mode:
authorPer Bothner <bothner@cygnus.com>1999-04-06 14:28:39 +0000
committerPer Bothner <bothner@gcc.gnu.org>1999-04-06 07:28:39 -0700
commitab45646c4ec90373b5db6279ef1869bb00c44dcd (patch)
tree2fc92b2fe38c1015a881fc6144ab600f9aa2737d /gcc/java/verify.c
parentddcd8199a816e1d7d6dba84ab77105ff423b4188 (diff)
downloadgcc-ab45646c4ec90373b5db6279ef1869bb00c44dcd.zip
gcc-ab45646c4ec90373b5db6279ef1869bb00c44dcd.tar.gz
gcc-ab45646c4ec90373b5db6279ef1869bb00c44dcd.tar.bz2
expr.c (pop_type_0): New function.
� * expr.c (pop_type_0): New function. (pop_type): Use pop_type_0. * java-tree.h (pop_type_0): New declaration. * verify.c (verify_jvm_instructions): Check return instructions. From-SVN: r26218
Diffstat (limited to 'gcc/java/verify.c')
-rw-r--r--gcc/java/verify.c29
1 files changed, 24 insertions, 5 deletions
diff --git a/gcc/java/verify.c b/gcc/java/verify.c
index 1a233a2..4b34c47 100644
--- a/gcc/java/verify.c
+++ b/gcc/java/verify.c
@@ -340,6 +340,7 @@ verify_jvm_instructions (jcf, byte_ops, length)
register unsigned char *p;
struct eh_range *prev_eh_ranges = NULL_EH_RANGE;
struct eh_range *eh_ranges;
+ tree return_type = TREE_TYPE (TREE_TYPE (current_function_decl));
jint int_value = -1;
@@ -707,15 +708,33 @@ verify_jvm_instructions (jcf, byte_ops, length)
VERIFICATION_ERROR ("invalid use of wide instruction");
}
break;
- case OPCODE_ireturn: type = int_type_node; goto ret;
+ case OPCODE_return: type = void_type_node; goto ret;
+ case OPCODE_ireturn:
+ if ((TREE_CODE (return_type) == BOOLEAN_TYPE
+ || TREE_CODE (return_type) == CHAR_TYPE
+ || TREE_CODE (return_type) == INTEGER_TYPE)
+ && TYPE_PRECISION (return_type) <= 32)
+ type = return_type;
+ else
+ type = NULL_TREE;
+ goto ret;
case OPCODE_lreturn: type = long_type_node; goto ret;
case OPCODE_freturn: type = float_type_node; goto ret;
case OPCODE_dreturn: type = double_type_node; goto ret;
- case OPCODE_areturn: type = ptr_type_node; goto ret;
+ case OPCODE_areturn:
+ if (TREE_CODE (return_type) == POINTER_TYPE)
+ type = return_type;
+ else
+ type = NULL_TREE;
+ goto ret;
ret:
- pop_type (type);
- /* ... fall through ... */
- case OPCODE_return:
+ if (type != return_type)
+ VERIFICATION_ERROR ("incorrect ?return opcode");
+ if (type != void_type_node)
+ {
+ if (pop_type_0 (type) == NULL_TREE)
+ VERIFICATION_ERROR ("return value has wrong type");
+ }
INVALIDATE_PC;
break;
case OPCODE_getstatic: is_putting = 0; is_static = 1; goto field;