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