Patch: FYI: sign extension in new verifier

Tom Tromey tromey@redhat.com
Mon Jan 17 19:28:00 GMT 2005


I'm checking this in.

The libgcj bytecode verifier was written knowing the sizes of various
java types like 'jint'.  In the compiler, a 'jint' is only guaranteed
to be at least 32 bits -- on x86-64, it is 64.  This meant that sign
extension didn't happen properly, leading to a bugs when compiling
certain bytecode.

This patch fixes the problem by introducing sign extension as
appropriate.

Tom

Index: ChangeLog
from  Tom Tromey  <tromey@redhat.com>

	* verify-impl.c (get_short): Sign extend.
	(get_int): Likewise.

Index: verify-impl.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/java/verify-impl.c,v
retrieving revision 1.3
diff -u -r1.3 verify-impl.c
--- verify-impl.c 25 Nov 2004 05:14:25 -0000 1.3
+++ verify-impl.c 17 Jan 2005 19:24:48 -0000
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001, 2002, 2003, 2004  Free Software Foundation
+/* Copyright (C) 2001, 2002, 2003, 2004, 2005  Free Software Foundation
 
    This file is part of libgcj.
 
@@ -1439,7 +1439,7 @@
 static jint
 get_short (void)
 {
-  jint b1 = get_byte ();
+  signed char b1 = (signed char) get_byte ();
   jint b2 = get_byte ();
   jshort s = (b1 << 8) | b2;
   return (jint) s;
@@ -1452,7 +1452,10 @@
   jint b2 = get_byte ();
   jint b3 = get_byte ();
   jint b4 = get_byte ();
-  return (b1 << 24) | (b2 << 16) | (b3 << 8) | b4;
+  jword result = (b1 << 24) | (b2 << 16) | (b3 << 8) | b4;
+  /* In the compiler, 'jint' might have more than 32 bits, so we must
+     sign extend.  */
+  return WORD_TO_INT (result);
 }
 
 static int



More information about the Gcc-patches mailing list