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:
parent
cd0b240bf1
commit
cca1655eab
15 changed files with 112 additions and 12 deletions
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
2
libjava/external/sax/Makefile.am
vendored
2
libjava/external/sax/Makefile.am
vendored
|
@ -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 \
|
||||
|
|
2
libjava/external/sax/Makefile.in
vendored
2
libjava/external/sax/Makefile.in
vendored
|
@ -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 \
|
||||
|
|
2
libjava/external/w3c_dom/Makefile.am
vendored
2
libjava/external/w3c_dom/Makefile.am
vendored
|
@ -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 \
|
||||
|
|
2
libjava/external/w3c_dom/Makefile.in
vendored
2
libjava/external/w3c_dom/Makefile.in
vendored
|
@ -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 \
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue