diff options
author | Per Bothner <per@bothner.com> | 2001-01-21 12:36:46 -0800 |
---|---|---|
committer | Per Bothner <bothner@gcc.gnu.org> | 2001-01-21 12:36:46 -0800 |
commit | 9c0c88ac0d8cccd4f48415d4a7d65ff92a2012e5 (patch) | |
tree | 0bd4fbf768c171d6d034dd9eebbfde6a95fcf90f /gcc/java/verify.c | |
parent | 230cbd5f4f3408cfe60415ff3ac70d0496ec6080 (diff) | |
download | gcc-9c0c88ac0d8cccd4f48415d4a7d65ff92a2012e5.zip gcc-9c0c88ac0d8cccd4f48415d4a7d65ff92a2012e5.tar.gz gcc-9c0c88ac0d8cccd4f48415d4a7d65ff92a2012e5.tar.bz2 |
verify.c (VERIFICATION_ERROR_WITH_INDEX): New macro.
* verify.c (VERIFICATION_ERROR_WITH_INDEX): New macro.
(verify_jvm_instructions): Use it, for better error messages on loads.
From-SVN: r39171
Diffstat (limited to 'gcc/java/verify.c')
-rw-r--r-- | gcc/java/verify.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/gcc/java/verify.c b/gcc/java/verify.c index bc0bb73..3f24391 100644 --- a/gcc/java/verify.c +++ b/gcc/java/verify.c @@ -348,6 +348,9 @@ start_pc_cmp (xp, yp) #define VERIFICATION_ERROR(MESSAGE) \ do { message = MESSAGE; goto verify_error; } while (0) +#define VERIFICATION_ERROR_WITH_INDEX(MESSAGE) \ + do { message = MESSAGE; goto error_with_index; } while (0) + /* Recursive helper function to pop argument types during verifiation. ARG_TYPES is the list of formal parameter types. Return NULL on success and a freshly malloc'd error message on failure. */ @@ -412,6 +415,7 @@ verify_jvm_instructions (jcf, byte_ops, length) const char *message; char *pmessage; int i; + int index; register unsigned char *p; struct eh_range *prev_eh_ranges = NULL_EH_RANGE; struct eh_range *eh_ranges; @@ -476,7 +480,6 @@ verify_jvm_instructions (jcf, byte_ops, length) for (PC = 0;;) { - int index; tree type, tmp; if (((PC != INVALID_PC && instruction_bits [PC] & BCODE_TARGET) != 0) @@ -640,9 +643,13 @@ verify_jvm_instructions (jcf, byte_ops, length) if (index < 0 || (index + TYPE_IS_WIDE (type) >= DECL_MAX_LOCALS (current_function_decl))) - VERIFICATION_ERROR ("invalid local variable index in load"); + VERIFICATION_ERROR_WITH_INDEX + ("invalid local variable index %d in load"); tmp = type_map[index]; - if (tmp == TYPE_UNKNOWN || tmp == TYPE_SECOND + if (tmp == TYPE_UNKNOWN) + VERIFICATION_ERROR_WITH_INDEX + ("loading local variable %d which has unknown type"); + else if (tmp == TYPE_SECOND || (TYPE_IS_WIDE (type) && type_map[index+1] != void_type_node) || (type == ptr_type_node @@ -650,7 +657,8 @@ verify_jvm_instructions (jcf, byte_ops, length) : type == int_type_node ? (! INTEGRAL_TYPE_P (tmp) || TYPE_PRECISION (tmp) > 32) : type != tmp)) - VERIFICATION_ERROR("invalid local variable type in load"); + VERIFICATION_ERROR_WITH_INDEX + ("loading local variable %d which has invalid type"); PUSH_TYPE (tmp); goto note_used; case OPCODE_istore: type = int_type_node; goto general_store; @@ -687,7 +695,8 @@ verify_jvm_instructions (jcf, byte_ops, length) || (index + TYPE_IS_WIDE (type) >= DECL_MAX_LOCALS (current_function_decl))) { - VERIFICATION_ERROR ("invalid local variable index in store"); + VERIFICATION_ERROR_WITH_INDEX + ("invalid local variable index %d in store"); return 0; } POP_TYPE_CONV (type, type, NULL); @@ -1409,6 +1418,10 @@ verify_jvm_instructions (jcf, byte_ops, length) bad_pc: message = "program counter out of range"; goto verify_error; + error_with_index: + error ("verification error at PC=%d", oldpc); + error (message, index); + return 0; verify_error: error ("verification error at PC=%d", oldpc); error ("%s", message); |