This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Patch: RFC: fix non-BC / BC link problem


Bryce> Its unfortunate that we don't have a proper way to check the
Bryce> ABI type.

Yeah.  We should do something here when we change how we represent
compiled classes.

Bryce> Perhaps this current hack could be encapsulated in a
Bryce> _Jv_IsBinaryCompatABI() function in order to make it easier to improve
Bryce> it later?

Good idea.

The actual patch I'm committing is appended.
I'm going to put it on the 4.0 branch as well.

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.

Index: libjava/ChangeLog
from  Tom Tromey  <tromey@redhat.com>

	* java/lang/Class.h (_Jv_IsBinaryCompatibilityABI): Declare as
	friend.
	* include/jvm.h (_Jv_IsBinaryCompatibilityABI): New function.
	* 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: 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 17 Aug 2005 20:37:14 -0000
@@ -1659,11 +1659,10 @@
   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)
+  else if (_Jv_IsBinaryCompatibilityABI (klass))
     abi = "BC-compiled";
   else
     abi = "pre-compiled";
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 17 Aug 2005 20:37:23 -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/include/jvm.h
===================================================================
RCS file: /cvs/gcc/gcc/libjava/include/jvm.h,v
retrieving revision 1.88
diff -u -r1.88 jvm.h
--- libjava/include/jvm.h 15 Jun 2005 19:11:38 -0000 1.88
+++ libjava/include/jvm.h 17 Aug 2005 20:37:23 -0000
@@ -621,4 +621,13 @@
   return (c->accflags & java::lang::reflect::Modifier::INTERPRETED) != 0;
 }
 
+// Return true if the class was compiled with the BC ABI.
+extern inline jboolean
+_Jv_IsBinaryCompatibilityABI (jclass c)
+{
+  // There isn't really a better test for the ABI type at this point,
+  // that will work once the class has been registered.
+  return c->otable_syms || c->atable_syms || c->itable_syms;
+}
+
 #endif /* __JAVA_JVM_H__ */
Index: libjava/java/lang/Class.h
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/Class.h,v
retrieving revision 1.84
diff -u -r1.84 Class.h
--- libjava/java/lang/Class.h 14 Jun 2005 18:51:54 -0000 1.84
+++ libjava/java/lang/Class.h 17 Aug 2005 20:37:23 -0000
@@ -235,6 +235,7 @@
 jclass _Jv_GetArrayClass (jclass klass, java::lang::ClassLoader *loader);
 
 jboolean _Jv_IsInterpretedClass (jclass);
+jboolean _Jv_IsBinaryCompatibilityABI (jclass);
 
 void _Jv_CopyClassesToSystemLoader (java::lang::ClassLoader *);
 
@@ -470,6 +471,7 @@
 				       java::lang::ClassLoader *loader);
 
   friend jboolean (::_Jv_IsInterpretedClass) (jclass);
+  friend jboolean (::_Jv_IsBinaryCompatibilityABI) (jclass);
 
 #ifdef INTERPRETER
   friend void ::_Jv_InitField (jobject, jclass, int);
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 17 Aug 2005 20:37:25 -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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]