This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
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