aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBryce McKinlay <mckinlay@redhat.com>2005-05-26 21:07:04 +0000
committerBryce McKinlay <bryce@gcc.gnu.org>2005-05-26 22:07:04 +0100
commita04323f4cbc780f714ee126c1d7b3953b0c04e44 (patch)
treed51ec085994c17aee5e6ebcd727af006310a695e
parentb9fa227db9c8f21061285823768b73adb07cc395 (diff)
downloadgcc-a04323f4cbc780f714ee126c1d7b3953b0c04e44.zip
gcc-a04323f4cbc780f714ee126c1d7b3953b0c04e44.tar.gz
gcc-a04323f4cbc780f714ee126c1d7b3953b0c04e44.tar.bz2
decl.c (GCJ_BINARYCOMPAT_ADDITION, [...]): Removed.
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
-rw-r--r--gcc/java/ChangeLog10
-rw-r--r--gcc/java/decl.c54
-rw-r--r--libjava/ChangeLog11
-rw-r--r--libjava/include/jvm.h47
4 files changed, 88 insertions, 34 deletions
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog
index 82a2ba8..47b3ebe 100644
--- a/gcc/java/ChangeLog
+++ b/gcc/java/ChangeLog
@@ -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
diff --git a/gcc/java/decl.c b/gcc/java/decl.c
index a31b668..891e4db 100644
--- a/gcc/java/decl.c
+++ b/gcc/java/decl.c
@@ -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);
}
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index ca1e1f2..3fdf9e1 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -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
diff --git a/libjava/include/jvm.h b/libjava/include/jvm.h
index bceb291..3a2eb9b 100644
--- a/libjava/include/jvm.h
+++ b/libjava/include/jvm.h
@@ -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