From a04323f4cbc780f714ee126c1d7b3953b0c04e44 Mon Sep 17 00:00:00 2001 From: Bryce McKinlay Date: Thu, 26 May 2005 21:07:04 +0000 Subject: [PATCH] decl.c (GCJ_BINARYCOMPAT_ADDITION, [...]): Removed. 2005-05-26 Bryce McKinlay * 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 * 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 | 10 ++++++++ gcc/java/decl.c | 54 +++++++++++++++++++++++++++---------------- libjava/ChangeLog | 11 +++++++++ libjava/include/jvm.h | 47 ++++++++++++++++++++++++++----------- 4 files changed, 88 insertions(+), 34 deletions(-) diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index 82a2ba8a615..47b3ebe9bbb 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,13 @@ +2005-05-26 Bryce McKinlay + + * 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 PR libgcj/21692 diff --git a/gcc/java/decl.c b/gcc/java/decl.c index a31b668f1bc..891e4dbe406 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 ca1e1f2e878..3fdf9e1c81c 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,14 @@ +2005-05-26 Bryce McKinlay + + * 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 PR libgcj/21692 diff --git a/libjava/include/jvm.h b/libjava/include/jvm.h index bceb291fb58..3a2eb9b923e 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