]> gcc.gnu.org Git - gcc.git/commitdiff
decl.c (GCJ_BINARYCOMPAT_ADDITION, [...]): Removed.
authorBryce McKinlay <mckinlay@redhat.com>
Thu, 26 May 2005 21:07:04 +0000 (21:07 +0000)
committerBryce McKinlay <bryce@gcc.gnu.org>
Thu, 26 May 2005 21:07:04 +0000 (22:07 +0100)
2005-05-26  Bryce McKinlay  <mckinlay@redhat.com>

* decl.c (GCJ_BINARYCOMPAT_ADDITION,
GCJ_BOOTSTRAP_LOADER_ADDITION): Removed.
(FLAG_BINARYCOMPAT_ABI, FLAG_BOOTSTRAP_LOADER,
MINOR_BINARYCOMPAT_ABI_VERSION): New.
(GCJ_CURRENT_BC_ABI_VERSION): Use new method to calculate version ID.
(parse_version): Calculate version ID using new method. Use
bit-flags for flag_indirect_dispatch and flag_bootstrap_classes.

2005-05-26  Bryce McKinlay  <mckinlay@redhat.com>

* include/jvm.h (FLAG_BINARYCOMPAT_ABI, FLAG_BOOTSTRAP_LOADER): New.
(GCJ_BINARYCOMPAT_ADDITION, GCJ_BOOTSTRAP_LOADER_ADDITION): Removed.
(OLD_GCJ_40_BC_ABI_VERSION): Renamed. Old-style version ID for
BC-ABI classes.
(GCJ_CXX_ABI_VERSION): Renamed from GCJ_ABI_VERSION.
(GCJ_40_BC_ABI_VERSION): New. Calculate version IDs using new
method.
(_Jv_CheckABIVersion): Check for both old and new style version IDs.
(_Jv_ClassForBootstrapLoader): Use FLAG_BOOTSTRAP_LOADER.

From-SVN: r100222

gcc/java/ChangeLog
gcc/java/decl.c
libjava/ChangeLog
libjava/include/jvm.h

index 82a2ba8a615f9a7aa825c01f6019782186109d22..47b3ebe9bbb74e2ac503947f3ab105c7aac800db 100644 (file)
@@ -1,3 +1,13 @@
+2005-05-26  Bryce McKinlay  <mckinlay@redhat.com>
+
+       * decl.c (GCJ_BINARYCOMPAT_ADDITION, 
+       GCJ_BOOTSTRAP_LOADER_ADDITION): Removed.
+       (FLAG_BINARYCOMPAT_ABI, FLAG_BOOTSTRAP_LOADER,
+       MINOR_BINARYCOMPAT_ABI_VERSION): New.
+       (GCJ_CURRENT_BC_ABI_VERSION): Use new method to calculate version ID.
+       (parse_version): Calculate version ID using new method. Use bit-flags
+       for flag_indirect_dispatch and flag_bootstrap_classes.
+
 2005-05-25  Richard Henderson  <rth@redhat.com>
 
        PR libgcj/21692
index a31b668f1bcaa3ff3060e871566822f5e91ebedf..891e4dbe40646e54f8635c0c8d8c94d63417870d 100644 (file)
@@ -61,19 +61,31 @@ static tree create_primitive_vtable (const char *);
 static tree check_local_unnamed_variable (tree, tree, tree);
 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 following ABI flags are used in the high-order bits of the version
+   ID field. The version ID number itself should never be larger than 
+   0xfffff, so it should be safe to use top 12 bits for these flags. */
 
-/* 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
-   changes, this must change.  */
+#define FLAG_BINARYCOMPAT_ABI (1<<31)  /* Class is built with the BC-ABI. */
+
+#define FLAG_BOOTSTRAP_LOADER (1<<30)  /* Used when defining a class that 
+                                         should be loaded by the bootstrap
+                                         loader.  */
+
+/* If an ABI change is made within a GCC release series, rendering current
+   binaries incompatible with the old runtimes, this number can be set to
+   enforce the compatibility rules. */
+#define MINOR_BINARYCOMPAT_ABI_VERSION 0
+
+/* The runtime may recognize a variety of BC ABIs (objects generated by 
+   different version of gcj), but will probably always require strict 
+   matching for the ordinary (C++) ABI.  */
+
+/* The version ID of the BC ABI that we generate.  This must be kept in
+   sync with parse_version(), libgcj, and reality (if the BC format changes, 
+   this must change).  */
 #define GCJ_CURRENT_BC_ABI_VERSION \
-  (4 * 10000 + 0 * 10 + GCJ_BINARYCOMPAT_ADDITION)
+  (4 * 100000 + 0 * 1000 + MINOR_BINARYCOMPAT_ABI_VERSION)
 
 /* The ABI version number.  */
 tree gcj_abi_version;
@@ -613,18 +625,20 @@ parse_version (void)
       ++p;
     }
 
-  /* Implicit in this computation is the idea that we won't break the
-     old-style binary ABI in a sub-minor release (e.g., from 4.0.0 to
-     4.0.1).  */
-  abi_version = 10000 * major + 10 * minor;
-  /* It is helpful to distinguish BC ABI from ordinary ABI at this
-     level, since at some point we will recognize a variety of BC ABIs
-     (objects generated by different version of gcj), but will
-     probably always require strict matching for ordinary ABI.  */
   if (flag_indirect_dispatch)
-    abi_version = GCJ_CURRENT_BC_ABI_VERSION;
+    {
+      abi_version = GCJ_CURRENT_BC_ABI_VERSION;
+      abi_version |= FLAG_BINARYCOMPAT_ABI;
+    }
+  else /* C++ ABI */
+    {
+      /* Implicit in this computation is the idea that we won't break the
+        old-style binary ABI in a sub-minor release (e.g., from 4.0.0 to
+        4.0.1).  */
+      abi_version = 100000 * major + 1000 * minor;
+    }
   if (flag_bootstrap_classes)
-    abi_version += GCJ_BOOTSTRAP_LOADER_ADDITION;
+    abi_version |= FLAG_BOOTSTRAP_LOADER;
 
   gcj_abi_version = build_int_cstu (ptr_type_node, abi_version);
 }
index ca1e1f2e878f833a45c053c7556ffbcdd7a538e6..3fdf9e1c81c0fd7f4cc11c63b0e79c010084da47 100644 (file)
@@ -1,3 +1,14 @@
+2005-05-26  Bryce McKinlay  <mckinlay@redhat.com>
+
+       * include/jvm.h (FLAG_BINARYCOMPAT_ABI, FLAG_BOOTSTRAP_LOADER): New.
+       (GCJ_BINARYCOMPAT_ADDITION, GCJ_BOOTSTRAP_LOADER_ADDITION): Removed.
+       (OLD_GCJ_40_BC_ABI_VERSION): Renamed. Old-style version ID for BC-ABI
+       classes.
+       (GCJ_CXX_ABI_VERSION): Renamed from GCJ_ABI_VERSION.
+       (GCJ_40_BC_ABI_VERSION): New. Calculate version IDs using new method.
+       (_Jv_CheckABIVersion): Check for both old and new style version IDs.
+       (_Jv_ClassForBootstrapLoader): Use FLAG_BOOTSTRAP_LOADER. 
+
 2005-05-25  Richard Henderson  <rth@redhat.com>
 
        PR libgcj/21692
index bceb291fb581967bdc3587b517817fc9c4846929..3a2eb9b923e7d7548f534356450c5e130a0f9947 100644 (file)
@@ -564,31 +564,50 @@ extern void (*_Jv_JVMPI_Notify_THREAD_END) (JVMPI_Event *event);
 
 extern void _Jv_RegisterBootstrapPackages ();
 
+#define FLAG_BINARYCOMPAT_ABI (1<<31)  /* Class is built with the BC-ABI. */
 
-// 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
+#define FLAG_BOOTSTRAP_LOADER (1<<30)  /* Used when defining a class that 
+                                         should be loaded by the bootstrap
+                                         loader.  */
 
-// At present we know we are compatible with the BC ABI as used in GCC
-// 4.0.
-#define GCJ_40_BC_ABI_VERSION (4 * 10000 + 0 * 10 + GCJ_BINARYCOMPAT_ADDITION)
+// These are used to find ABI versions we recognize.
+#define GCJ_CXX_ABI_VERSION (__GNUC__ * 100000 + __GNUC_MINOR__ * 1000)
+
+// This is the old-style BC version ID used by GCJ 4.0.0.
+#define OLD_GCJ_40_BC_ABI_VERSION (4 * 10000 + 0 * 10 + 5)
+
+// New style version IDs used by GCJ 4.0.1 and later.
+#define GCJ_40_BC_ABI_VERSION (4 * 100000 + 0 * 1000)
 
 inline bool
 _Jv_CheckABIVersion (unsigned long value)
 {
-  // Recognize our defined C++ ABIs.
-  return (value == GCJ_VERSION
-         || value == (GCJ_VERSION + GCJ_BOOTSTRAP_LOADER_ADDITION)
-         || value == GCJ_40_BC_ABI_VERSION
-         || value == (GCJ_40_BC_ABI_VERSION + GCJ_BOOTSTRAP_LOADER_ADDITION));
+  // We are compatible with GCJ 4.0.0 BC-ABI classes. This release used a
+  // different format for the version ID string.
+   if (value == OLD_GCJ_40_BC_ABI_VERSION)
+     return true;
+     
+  // The 20 low-end bits are used for the version number.
+  unsigned long version = value & 0xfffff;
+
+  if (value & FLAG_BINARYCOMPAT_ABI)
+    {
+      int abi_rev = version % 100;
+      int abi_ver = version - abi_rev;
+      if (abi_ver == GCJ_40_BC_ABI_VERSION && abi_rev <= 0)
+        return true;
+    }
+  else
+    // C++ ABI
+    return version == GCJ_CXX_ABI_VERSION;
+  
+  return false;
 }
 
 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));
+  return (value & FLAG_BOOTSTRAP_LOADER);
 }
 
 // It makes the source cleaner if we simply always define this
This page took 0.079109 seconds and 5 git commands to generate.