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
This commit is contained in:
Andrew Haley 2006-02-07 19:02:39 +00:00 committed by Andrew Haley
parent 7935dc1bc3
commit 0920886f9f
3 changed files with 31 additions and 2 deletions

View File

@ -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:

View File

@ -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,

View File

@ -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