diff options
author | Andrew Haley <aph@redhat.com> | 2006-02-07 19:02:39 +0000 |
---|---|---|
committer | Andrew Haley <aph@gcc.gnu.org> | 2006-02-07 19:02:39 +0000 |
commit | 0920886f9fee2306409279e222b71d858f9f86bf (patch) | |
tree | cc429bbca658b2915a15d04fbecf3596b8c31b7d /gcc | |
parent | 7935dc1bc3c1e806da0f6d2be8d9eae8dd0bdb08 (diff) | |
download | gcc-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')
-rw-r--r-- | gcc/java/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/java/constants.c | 12 | ||||
-rw-r--r-- | gcc/java/expr.c | 11 |
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 |