PR java/25535: gcj broken on 64-bit big-endian systems

Andrew Haley aph@redhat.com
Thu Dec 22 17:23:00 GMT 2005


BC-compiled code doesn't work on a big-endian 64-bit box because of a
silly mistake initializing entries in the constant pool.  In all cases
the initializer must appear as the first 32-bit integer of a machine
word stored in memory.

Here's a testcase:

public class Test {
     public static void main(String[] args) {
         System.out.println(javax.rmi.CORBA.Stub.class);
     }
}

This fails with a SEGV on PPC 64.

Andrew.


2005-12-22  Andrew Haley  <aph@redhat.com>

	PR java/25535
	* constants.c (build_constants_constructor): move initializer into
	first halfword on a 6-bit big-endian machine.

Index: constants.c
===================================================================
--- constants.c	(revision 108907)
+++ constants.c	(working copy)
@@ -481,7 +481,12 @@
       case CONSTANT_Fieldref:
       case CONSTANT_NameAndType:
 	{
-	  jword temp = outgoing_cpool->data[i].w;
+	  unsigned HOST_WIDE_INT temp = outgoing_cpool->data[i].w;
+
+	  /* Make sure that on a 64-bit big-endian machine this 32-bit
+	     jint appears in the first word.  */
+	  if (BYTES_BIG_ENDIAN && BITS_PER_WORD > 32)
+	    temp <<= BITS_PER_WORD - 32;
 
 	  tags_list
 	    = tree_cons (NULL_TREE, 



More information about the Java-patches mailing list