aboutsummaryrefslogtreecommitdiff
path: root/gcc
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
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')
-rw-r--r--gcc/java/ChangeLog5
-rw-r--r--gcc/java/verify.c29
2 files changed, 29 insertions, 5 deletions
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog
index 5289360..1f3708a 100644
--- a/gcc/java/ChangeLog
+++ b/gcc/java/ChangeLog
@@ -1,5 +1,10 @@
1999-04-06 Per Bothner <bothner@cygnus.com>
+ * 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.
+
* parse.y (patch_binop): Don't fold if non-constant and emiting
class files.
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;