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
This commit is contained in:
Bryce McKinlay 2005-05-26 21:07:04 +00:00 committed by Bryce McKinlay
parent b9fa227db9
commit a04323f4cb
4 changed files with 88 additions and 34 deletions

View 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

View 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);
}

View 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

View 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