aboutsummaryrefslogtreecommitdiff
path: root/gcc/java
diff options
context:
space:
mode:
authorAndrew Haley <aph@redhat.com>2006-02-07 19:02:39 +0000
committerAndrew Haley <aph@gcc.gnu.org>2006-02-07 19:02:39 +0000
commit0920886f9fee2306409279e222b71d858f9f86bf (patch)
treecc429bbca658b2915a15d04fbecf3596b8c31b7d /gcc/java
parent7935dc1bc3c1e806da0f6d2be8d9eae8dd0bdb08 (diff)
downloadgcc-0920886f9fee2306409279e222b71d858f9f86bf.zip
gcc-0920886f9fee2306409279e222b71d858f9f86bf.tar.gz
gcc-0920886f9fee2306409279e222b71d858f9f86bf.tar.bz2
re PR java/25535 (gcj broken on 64-bit big-endian systems)
2006-02-07 Andrew Haley <aph@redhat.com> * expr.c (expand_invoke): (BC mode.) If we find a method in a class other than the one in which we expected to find it, ignore the result. PR java/25535 * constants.c (build_constants_constructor): move initializer into first halfword on a 6-bit big-endian machine. From-SVN: r110710
Diffstat (limited to 'gcc/java')
-rw-r--r--gcc/java/ChangeLog10
-rw-r--r--gcc/java/constants.c12
-rw-r--r--gcc/java/expr.c11
3 files changed, 31 insertions, 2 deletions
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog
index 5d2515a..bc5a579 100644
--- a/gcc/java/ChangeLog
+++ b/gcc/java/ChangeLog
@@ -1,3 +1,13 @@
+2006-02-07 Andrew Haley <aph@redhat.com>
+
+ * expr.c (expand_invoke): (BC mode.) If we find a method in a
+ class other than the one in which we expected to find it, ignore
+ the result.
+
+ PR java/25535
+ * constants.c (build_constants_constructor): move initializer into
+ first halfword on a 6-bit big-endian machine.
+
2006-02-04 Tom Tromey <tromey@redhat.com>
PR java/25676:
diff --git a/gcc/java/constants.c b/gcc/java/constants.c
index 98a05043..5d2f678 100644
--- a/gcc/java/constants.c
+++ b/gcc/java/constants.c
@@ -1,5 +1,5 @@
/* Handle the constant pool of the Java(TM) Virtual Machine.
- Copyright (C) 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005
+ Copyright (C) 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006
Free Software Foundation, Inc.
This file is part of GCC.
@@ -480,7 +480,15 @@ build_constants_constructor (void)
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.
+ FIXME: This is a kludge. The field we're initializing is
+ not a scalar but a union, and that's how we should
+ represent it in the compiler. We should fix this. */
+ if (BYTES_BIG_ENDIAN && BITS_PER_WORD > 32)
+ temp <<= BITS_PER_WORD - 32;
tags_list
= tree_cons (NULL_TREE,
diff --git a/gcc/java/expr.c b/gcc/java/expr.c
index 5e7699b..52f7e48 100644
--- a/gcc/java/expr.c
+++ b/gcc/java/expr.c
@@ -2271,6 +2271,17 @@ expand_invoke (int opcode, int method_ref_index, int nargs ATTRIBUTE_UNUSED)
else
method = lookup_java_method (self_type, method_name, method_signature);
+ /* We've found a method in a class other than the one in which it
+ was wanted. This can happen if, for instance, we're trying to
+ compile invokespecial super.equals().
+ FIXME: This is a kludge. Rather than nullifying the result, we
+ should change lookup_java_method() so that it doesn't search the
+ superclass chain when we're BC-compiling. */
+ if (! flag_verify_invocations
+ && method
+ && self_type != DECL_CONTEXT (method))
+ method = NULL_TREE;
+
/* We've found a method in an interface, but this isn't an interface
call. */
if (opcode != OPCODE_invokeinterface