+2005-05-11 Tom Tromey <tromey@redhat.com>
+
+ * gcj.texi (Code Generation): Document -fbootstrap-classes.
+ * decl.c (GCJ_BOOTSTRAP_LOADER_ADDITION): New macro.
+ (parse_version): Use it.
+ * lang.opt (-fbootstrap-classes): New option.
+
2005-05-10 Paolo Bonzini <bonzini@gnu.org>
PR java/21436
/* Used when computing the ABI version. */
#define GCJ_BINARYCOMPAT_ADDITION 5
+/* Used when defining a class that should be loaded by the bootstrap
+ loader. */
+#define GCJ_BOOTSTRAP_LOADER_ADDITION 1
+
/* The version of the BC ABI that we generate. At the moment we are
compatible with what shipped in GCC 4.0. This must be kept in sync
with parse_version(), libgcj, and reality (if the BC format
probably always require strict matching for ordinary ABI. */
if (flag_indirect_dispatch)
abi_version = GCJ_CURRENT_BC_ABI_VERSION;
+ if (flag_bootstrap_classes)
+ abi_version += GCJ_BOOTSTRAP_LOADER_ADDITION;
gcj_abi_version = build_int_cstu (ptr_type_node, abi_version);
}
However, if you compile CNI code with the standard ABI, you can call
it from code built with the binary compatibility ABI.
+@item -fbootstrap-classes
+This option can be use to tell @code{libgcj} that the compiled classes
+should be loaded by the bootstrap loader, not the system class loader.
+By default, if you compile a class and link it into an executable, it
+will be treated as if it was loaded using the system class loader.
+This is convenient, as it means that things like
+@code{Class.forName()} will search @samp{CLASSPATH} to find the
+desired class.
+
@end table
Java Var(flag_use_divide_subroutine) Init(1)
Call a library routine to do integer divisions
+fbootstrap-classes
+Java Var(flag_bootstrap_classes)
+Generated should be loaded by bootstrap loader
+
version
Java
+2005-05-11 Tom Tromey <tromey@redhat.com>
+
+ * external/w3c_dom/Makefile.in: Rebuilt.
+ * external/w3c_dom/Makefile.am (libw3c_gcj_la_GCJFLAGS): Added
+ -fbootstrap-classes.
+ * external/sax/Makefile.in: Rebuilt.
+ * external/sax/Makefile.am (libsax_gcj_la_GCJFLAGS): Added
+ -fbootstrap-classes.
+ * java/lang/Class.h (_Jv_CopyClassesToSystemLoader): Declare as
+ friend.
+ * java/lang/natVMClassLoader.cc (getSystemClassLoaderInternal):
+ Call _Jv_CopyClassesToSystemLoader.
+ * java/lang/natClassLoader.cc (system_class_list): New global.
+ (_Jv_RegisterClassHookDefault): Handle bootstrap and system
+ classes differently.
+ (_Jv_CopyClassesToSystemLoader): New function.
+ (SYSTEM_LOADER_INITIALIZED): New define.
+ * include/jvm.h (GCJ_BOOTSTRAP_LOADER_ADDITION): New define.
+ (_Jv_CheckABIVersion): Use it.
+ (_Jv_ClassForBootstrapLoader): New function.
+ * Makefile.in: Rebuilt.
+ * Makefile.am (AM_GCJFLAGS): Added -fbootstrap-classes.
+
2005-05-10 Tom Tromey <tromey@redhat.com>
* gcj/javaprims.h: Updated.
@LIBGCJ_JAVAFLAGS@ \
-fclasspath= -fbootclasspath=$(BOOTCLASSPATH) \
--encoding=UTF-8 \
- -Wno-deprecated
+ -Wno-deprecated -fbootstrap-classes
if USING_GCC
AM_CFLAGS = @LIBGCJ_CFLAGS@ $(WARNINGS)
@LIBGCJ_JAVAFLAGS@ \
-fclasspath= -fbootclasspath=$(BOOTCLASSPATH) \
--encoding=UTF-8 \
- -Wno-deprecated
+ -Wno-deprecated -fbootstrap-classes
@USING_GCC_FALSE@AM_CFLAGS = @LIBGCJ_CFLAGS@
@USING_GCC_TRUE@AM_CFLAGS = @LIBGCJ_CFLAGS@ $(WARNINGS)
noinst_LTLIBRARIES = libsax-gcj.la
libsax_gcj_la_SOURCES = sax.jar
-libsax_gcj_la_GCJFLAGS = -findirect-dispatch $(AM_GCJFLAGS)
+libsax_gcj_la_GCJFLAGS = -findirect-dispatch -fbootstrap-classes $(AM_GCJFLAGS)
source_files = \
org/xml/sax/SAXNotSupportedException.java \
BUILT_SOURCES = classes.stamp
noinst_LTLIBRARIES = libsax-gcj.la
libsax_gcj_la_SOURCES = sax.jar
-libsax_gcj_la_GCJFLAGS = -findirect-dispatch $(AM_GCJFLAGS)
+libsax_gcj_la_GCJFLAGS = -findirect-dispatch -fbootstrap-classes $(AM_GCJFLAGS)
source_files = \
org/xml/sax/SAXNotSupportedException.java \
org/xml/sax/helpers/NamespaceSupport.java \
noinst_LTLIBRARIES = libw3c-gcj.la
libw3c_gcj_la_SOURCES = w3c.jar
-libw3c_gcj_la_GCJFLAGS = -findirect-dispatch $(AM_GCJFLAGS)
+libw3c_gcj_la_GCJFLAGS = -findirect-dispatch -fbootstrap-classes $(AM_GCJFLAGS)
source_files = \
org/w3c/dom/xpath/XPathNamespace.java \
BUILT_SOURCES = classes.stamp
noinst_LTLIBRARIES = libw3c-gcj.la
libw3c_gcj_la_SOURCES = w3c.jar
-libw3c_gcj_la_GCJFLAGS = -findirect-dispatch $(AM_GCJFLAGS)
+libw3c_gcj_la_GCJFLAGS = -findirect-dispatch -fbootstrap-classes $(AM_GCJFLAGS)
source_files = \
org/w3c/dom/xpath/XPathNamespace.java \
org/w3c/dom/xpath/XPathResult.java \
// This is used to find ABI versions we recognize.
#define GCJ_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 10)
#define GCJ_BINARYCOMPAT_ADDITION 5
+#define GCJ_BOOTSTRAP_LOADER_ADDITION 1
// At present we know we are compatible with the BC ABI as used in GCC
// 4.0.
inline bool
_Jv_CheckABIVersion (unsigned long value)
{
- // Recognize our defined C++ ABI.
+ // Recognize our defined C++ ABIs.
return (value == GCJ_VERSION
- // At the moment this is the only BC ABI we recognize.
- || value == GCJ_40_BC_ABI_VERSION);
+ || value == (GCJ_VERSION + GCJ_BOOTSTRAP_LOADER_ADDITION)
+ || value == GCJ_40_BC_ABI_VERSION
+ || value == (GCJ_40_BC_ABI_VERSION + GCJ_BOOTSTRAP_LOADER_ADDITION));
+}
+
+inline bool
+_Jv_ClassForBootstrapLoader (unsigned long value)
+{
+ return (value == (GCJ_VERSION + GCJ_BOOTSTRAP_LOADER_ADDITION)
+ || value == (GCJ_40_BC_ABI_VERSION + GCJ_BOOTSTRAP_LOADER_ADDITION));
}
// It makes the source cleaner if we simply always define this
jboolean _Jv_IsInterpretedClass (jclass);
+void _Jv_CopyClassesToSystemLoader (java::lang::ClassLoader *);
+
#ifdef INTERPRETER
void _Jv_InitField (jobject, jclass, int);
friend void *::_Jv_ResolvePoolEntry (jclass this_class, jint index);
+ friend void ::_Jv_CopyClassesToSystemLoader (java::lang::ClassLoader *);
+
// Chain for class pool. This also doubles as the ABI version
// number. It is only used for this purpose at class registration
// time, and only for precompiled classes.
static jclass loaded_classes[HASH_LEN];
+// This records classes which will be registered with the system class
+// loader when it is initialized.
+static jclass system_class_list;
+
+// This is used as the value of system_class_list after we have
+// initialized the system class loader; it lets us know that we should
+// no longer pay attention to the system abi flag.
+#define SYSTEM_LOADER_INITIALIZED ((jclass) -1)
+
// This is the root of a linked list of classes
static jclass stack_head;
void
_Jv_RegisterClassHookDefault (jclass klass)
{
+ // This is bogus, but there doesn't seem to be a better place to do
+ // it.
+ if (! klass->engine)
+ klass->engine = &_Jv_soleCompiledEngine;
+
+ if (system_class_list != SYSTEM_LOADER_INITIALIZED)
+ {
+ unsigned long abi = (unsigned long) klass->next_or_version;
+ if (! _Jv_ClassForBootstrapLoader (abi))
+ {
+ klass->next_or_version = system_class_list;
+ system_class_list = klass;
+ return;
+ }
+ }
+
jint hash = HASH_UTF (klass->name);
// If the class is already registered, don't re-register it.
}
}
- // FIXME: this is really bogus!
- if (! klass->engine)
- klass->engine = &_Jv_soleCompiledEngine;
klass->next_or_version = loaded_classes[hash];
loaded_classes[hash] = klass;
}
_Jv_RegisterClasses (classes);
}
+// This is used during initialization to register all compiled-in
+// classes that are not part of the core with the system class loader.
+void
+_Jv_CopyClassesToSystemLoader (java::lang::ClassLoader *loader)
+{
+ for (jclass klass = system_class_list;
+ klass;
+ klass = klass->next_or_version)
+ {
+ klass->loader = loader;
+ loader->loadedClasses->put(klass->name->toString(), klass);
+ }
+ system_class_list = SYSTEM_LOADER_INITIALIZED;
+}
+
jclass
_Jv_FindClass (_Jv_Utf8Const *name, java::lang::ClassLoader *loader)
{
java::lang::VMClassLoader::getSystemClassLoaderInternal()
{
_Jv_InitClass (&gnu::gcj::runtime::ExtensionClassLoader::class$);
+ _Jv_CopyClassesToSystemLoader (gnu::gcj::runtime::ExtensionClassLoader::system_instance);
return gnu::gcj::runtime::ExtensionClassLoader::system_instance;
}