Commit 0920886f by Andrew Haley Committed by Andrew Haley

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
parent 7935dc1b
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> 2006-02-04 Tom Tromey <tromey@redhat.com>
PR java/25676: PR java/25676:
......
/* Handle the constant pool of the Java(TM) Virtual Machine. /* 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. Free Software Foundation, Inc.
This file is part of GCC. This file is part of GCC.
...@@ -480,7 +480,15 @@ build_constants_constructor (void) ...@@ -480,7 +480,15 @@ build_constants_constructor (void)
case CONSTANT_Fieldref: case CONSTANT_Fieldref:
case CONSTANT_NameAndType: 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 tags_list
= tree_cons (NULL_TREE, = tree_cons (NULL_TREE,
......
...@@ -2271,6 +2271,17 @@ expand_invoke (int opcode, int method_ref_index, int nargs ATTRIBUTE_UNUSED) ...@@ -2271,6 +2271,17 @@ expand_invoke (int opcode, int method_ref_index, int nargs ATTRIBUTE_UNUSED)
else else
method = lookup_java_method (self_type, method_name, method_signature); 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 /* We've found a method in an interface, but this isn't an interface
call. */ call. */
if (opcode != OPCODE_invokeinterface if (opcode != OPCODE_invokeinterface
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment