Patch: RFC: fix non-BC / BC link problem
Andrew Haley
aph@redhat.com
Wed Aug 17 09:05:00 GMT 2005
Tom Tromey writes:
> I thought I'd post this for comment before committing.
>
> Right now if you have a class compiled with the C++ ABI that inherits
> from a class compiled with the BC ABI, you will get a crash.
>
> This patch fixes the problem by changing the initial state of C++ ABI
> classes, thus ensuring that their super classes are linked at the
> proper time.
>
> I was worried that this would cause a slowdown during class
> initialization, but jonas profiling has shown that class linking is
> down in the noise, so I'm not so worried about this.
>
> Tested on x86 FC2 including jacks (mauve doesn't seem to be building
> atm). New test case included.
>
> Tom
>
> Index: gcc/java/ChangeLog
> from Tom Tromey <tromey@redhat.com>
>
> * class.c (make_class_data): Always emit JV_STATE_PRELOADING for
> class' initial state.
OK.
> Index: libjava/ChangeLog
> from Tom Tromey <tromey@redhat.com>
> * testsuite/libjava.lang/bclink.java: New file.
> * testsuite/libjava.lang/bclink.out: New file.
> * link.cc (print_class_loaded): Changed ABI test to look at
> various _syms fields.
>
> Index: gcc/java/class.c
> ===================================================================
> RCS file: /cvs/gcc/gcc/gcc/java/class.c,v
> retrieving revision 1.238
> diff -u -r1.238 class.c
> --- gcc/java/class.c 16 Aug 2005 16:06:42 -0000 1.238
> +++ gcc/java/class.c 16 Aug 2005 19:05:55 -0000
> @@ -1860,13 +1860,9 @@
> PUSH_FIELD_VALUE (cons, "loader", null_pointer_node);
> PUSH_FIELD_VALUE (cons, "interface_count",
> build_int_cst (NULL_TREE, interface_len));
> - PUSH_FIELD_VALUE
> - (cons, "state",
> - convert (byte_type_node,
> - build_int_cst (NULL_TREE,
> - flag_indirect_dispatch
> - ? JV_STATE_PRELOADING
> - : JV_STATE_COMPILED)));
> + PUSH_FIELD_VALUE (cons, "state",
> + convert (byte_type_node,
> + build_int_cst (NULL_TREE, JV_STATE_PRELOADING)));
>
> PUSH_FIELD_VALUE (cons, "thread", null_pointer_node);
> PUSH_FIELD_VALUE (cons, "depth", integer_zero_node);
>
> Index: libjava/link.cc
> ===================================================================
> RCS file: /cvs/gcc/gcc/libjava/link.cc,v
> retrieving revision 1.16
> diff -u -r1.16 link.cc
> --- libjava/link.cc 15 Jun 2005 19:11:36 -0000 1.16
> +++ libjava/link.cc 16 Aug 2005 19:05:59 -0000
> @@ -1659,11 +1659,11 @@
> if (codesource == NULL)
> codesource = "<no code source>";
>
> - // We use a somewhat bogus test for the ABI here.
> char *abi;
> if (_Jv_IsInterpretedClass (klass))
> abi = "bytecode";
> - else if (klass->state == JV_STATE_PRELOADING)
> + // There isn't really a better test for the ABI type at this point.
> + else if (klass->otable_syms || klass->atable_syms || klass->itable_syms)
It is possible for a class to have no syms at all? What will happen?
> abi = "BC-compiled";
> else
> abi = "pre-compiled";
> Index: libjava/testsuite/libjava.lang/bclink.java
> ===================================================================
> RCS file: libjava/testsuite/libjava.lang/bclink.java
> diff -N libjava/testsuite/libjava.lang/bclink.java
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ libjava/testsuite/libjava.lang/bclink.java 16 Aug 2005 19:06:00 -0000
> @@ -0,0 +1,12 @@
> +// This tests that a C++ ABI class can derive from a BC ABI class.
> +// This can't always work, but if the base class does not change then
> +// it will work fine.
> +
> +import org.xml.sax.*;
> +
> +public class bclink extends SAXParseException {
> + public bclink() { super ("hi", null); }
> +
> + public static void main(String[] args) throws Throwable {
> + }
> +}
> Index: libjava/testsuite/libjava.lang/bclink.out
> ===================================================================
> RCS file: libjava/testsuite/libjava.lang/bclink.out
> diff -N libjava/testsuite/libjava.lang/bclink.out
More information about the Java-patches
mailing list