gcj.texi (Code Generation): Document -fbootstrap-classes.

gcc/java:
	* 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.
libjava:
	* 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.

From-SVN: r99604
This commit is contained in:
Tom Tromey 2005-05-12 01:27:15 +00:00 committed by Tom Tromey
parent cd0b240bf1
commit cca1655eab
15 changed files with 112 additions and 12 deletions

View file

@ -1,3 +1,10 @@
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

View file

@ -64,6 +64,10 @@ static void parse_version (void);
/* 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
@ -620,6 +624,8 @@ parse_version (void)
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);
}

View file

@ -515,6 +515,15 @@ ABI. These restrictions will be lifted in some future release.
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

View file

@ -176,5 +176,9 @@ fuse-divide-subroutine
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

View file

@ -1,3 +1,26 @@
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.

View file

@ -204,7 +204,7 @@ AM_GCJFLAGS = \
@LIBGCJ_JAVAFLAGS@ \
-fclasspath= -fbootclasspath=$(BOOTCLASSPATH) \
--encoding=UTF-8 \
-Wno-deprecated
-Wno-deprecated -fbootstrap-classes
if USING_GCC
AM_CFLAGS = @LIBGCJ_CFLAGS@ $(WARNINGS)

View file

@ -4634,7 +4634,7 @@ AM_GCJFLAGS = \
@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)

View file

@ -35,7 +35,7 @@ mostlyclean-local:
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 \

View file

@ -314,7 +314,7 @@ AM_GCJFLAGS = \
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 \

View file

@ -35,7 +35,7 @@ mostlyclean-local:
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 \

View file

@ -314,7 +314,7 @@ AM_GCJFLAGS = \
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 \

View file

@ -565,6 +565,7 @@ extern void _Jv_RegisterBootstrapPackages ();
// 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.
@ -573,10 +574,18 @@ extern void _Jv_RegisterBootstrapPackages ();
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

View file

@ -236,6 +236,8 @@ jclass _Jv_GetArrayClass (jclass klass, java::lang::ClassLoader *loader);
jboolean _Jv_IsInterpretedClass (jclass);
void _Jv_CopyClassesToSystemLoader (java::lang::ClassLoader *);
#ifdef INTERPRETER
void _Jv_InitField (jobject, jclass, int);
@ -494,6 +496,8 @@ private:
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.

View file

@ -52,6 +52,15 @@ details. */
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;
@ -165,6 +174,22 @@ _Jv_RegisterClasses_Counted (const jclass * classes, size_t count)
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.
@ -193,9 +218,6 @@ _Jv_RegisterClassHookDefault (jclass klass)
}
}
// FIXME: this is really bogus!
if (! klass->engine)
klass->engine = &_Jv_soleCompiledEngine;
klass->next_or_version = loaded_classes[hash];
loaded_classes[hash] = klass;
}
@ -216,6 +238,21 @@ _Jv_RegisterClass (jclass 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)
{

View file

@ -99,6 +99,7 @@ java::lang::ClassLoader *
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;
}