]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gcj.texi (Code Generation): Document -fbootstrap-classes.
authorTom Tromey <tromey@redhat.com>
Thu, 12 May 2005 01:27:15 +0000 (01:27 +0000)
committerTom Tromey <tromey@gcc.gnu.org>
Thu, 12 May 2005 01:27:15 +0000 (01:27 +0000)
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

15 files changed:
gcc/java/ChangeLog
gcc/java/decl.c
gcc/java/gcj.texi
gcc/java/lang.opt
libjava/ChangeLog
libjava/Makefile.am
libjava/Makefile.in
libjava/external/sax/Makefile.am
libjava/external/sax/Makefile.in
libjava/external/w3c_dom/Makefile.am
libjava/external/w3c_dom/Makefile.in
libjava/include/jvm.h
libjava/java/lang/Class.h
libjava/java/lang/natClassLoader.cc
libjava/java/lang/natVMClassLoader.cc

index 5da68340ad32affdcfea16de3cdb92d82be64bc9..126e0c836eecaf09687ef0faa97f457462ae1bd7 100644 (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
index 204a674b1754e10daa9d04628cb69695c8c22c8f..a74e5186b7de443827cfdc82f3f48187f23b4933 100644 (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);
 }
index b5fc57a170a9ea4e682a4f68da813f3465d2d84a..3b2f12e57fdcffea3218c035c63b2b7355dc84ba 100644 (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
 
 
index 562006c620d7178d1103ceafa5df0322cf1ad588..0142915824fc81e44eecade4a037031e7dda62bf 100644 (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
index 1ba485b91b25dbf10c754d11c58a69d3d3fb07d1..9fdb8ade7b3adfe40cc059525dd9784f9b255341 100644 (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.
index 124bfe23a6b9a6817ae3e639430dca66859a2244..a17f7cce2bf423a2598de81ef1cc8e65dcdb5059 100644 (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)
index 966dab73a9873d6267a3a9b055b6075167d87c5a..b5c0fdd9e4f8ac14db8566608b81e2c1e79fdad0 100644 (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)
index 2d93a90532f1d57816a2a0a77c3199c25dea05cf..08b82e5b826caf698b305fb2ea367409a2c2e3cd 100644 (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 \
index a89121728dcbd4f5f3088d7a177f5bcfd013a88d..76ce4436f66eec446d27f96c69d287caef82f165 100644 (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 \
index b7ec429794cde14217784a2a88f7e5714f835159..82f6b76a0b24f7b3d48f5b9216a4a139231dc7a3 100644 (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 \
index e2e445b4327dc03db9bb5ac5dc5bb231f3cdcfb8..4f5774098634c788560864adbd4e67984442f753 100644 (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 \
index 90b61627f3dfb3912a19feba1cbc61a16b05c113..6b978f906e426c1ac550f413b3fa31d3a91390ce 100644 (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
index 854856066ed3328521b84b705c7ec2b7ec7a681b..28721d71daa8068c5398a52c813655c5cec8b97c 100644 (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.
index ed43b7aeb8b06ab2901def36cd3543e193b1d3af..2fa3f49ef1b30359733a79e36f283c2dea8db9ae 100644 (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)
 {
index a94bf98eb9955baef44f3d25d6a36ab12147f321..2e7b90da78911d835f31a65cac26f04cbb8bb5c9 100644 (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;
 }