This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
another patch for better verifier diagnostics
- To: gcc-patches at gcc dot gnu dot org, java-patches at gcc dot gnu dot org
- Subject: another patch for better verifier diagnostics
- From: Per Bothner <per at bothner dot com>
- Date: 15 Mar 2001 20:30:53 -0800
This is another one in my occasional serious of verifier patches
to improve error messages on verifier failures, inspired by Kawa
code generation bugs. This one improves handling of the "dup"
family of opercodes.
I've checked this into the trunk.
2001-03-13 Per Bothner <per@bothner.com>
* verify.c (verify_jvm_instructions): Better error msgs for dup.
(type_stack_dup): Remove no-longer neded error check.
Index: verify.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/java/verify.c,v
retrieving revision 1.39
diff -u -p -r1.39 verify.c
--- verify.c 2001/02/04 22:44:09 1.39
+++ verify.c 2001/03/16 04:10:59
@@ -294,8 +294,6 @@ type_stack_dup (size, offset)
{
tree type[4];
int index;
- if (size + offset > stack_pointer)
- error ("stack underflow - dup* operation");
for (index = 0; index < size + offset; index++)
{
type[index] = stack_type_map[stack_pointer - 1];
@@ -923,12 +921,18 @@ verify_jvm_instructions (jcf, byte_ops,
case OPCODE_new:
PUSH_TYPE (get_class_constant (jcf, IMMEDIATE_u2));
break;
- case OPCODE_dup: type_stack_dup (1, 0); break;
- case OPCODE_dup_x1: type_stack_dup (1, 1); break;
- case OPCODE_dup_x2: type_stack_dup (1, 2); break;
- case OPCODE_dup2: type_stack_dup (2, 0); break;
- case OPCODE_dup2_x1: type_stack_dup (2, 1); break;
- case OPCODE_dup2_x2: type_stack_dup (2, 2); break;
+ case OPCODE_dup: wide = 1; index = 0; goto dup;
+ case OPCODE_dup_x1: wide = 1; index = 1; goto dup;
+ case OPCODE_dup_x2: wide = 1; index = 2; goto dup;
+ case OPCODE_dup2: wide = 2; index = 0; goto dup;
+ case OPCODE_dup2_x1: wide = 2; index = 1; goto dup;
+ case OPCODE_dup2_x2: wide = 2; index = 2; goto dup;
+ dup:
+ if (wide + index > stack_pointer)
+ VERIFICATION_ERROR ("stack underflow - dup* operation");
+ type_stack_dup (wide, index);
+ wide = 0;
+ break;
case OPCODE_pop: index = 1; goto pop;
case OPCODE_pop2: index = 2; goto pop;
pop:
--
--Per Bothner
per@bothner.com http://www.bothner.com/~per/