2000-03-22 Roland McGrath <roland@baalperazim.frob.com>

* include/shlib-compat.h (SHLIB_COMPAT): Take a third argument,
	indicating the first version set to obsolete the conditionalized code.
	* scripts/abi-versions.awk: For subsumed versions, make ABI_* defn's
	rhs be the ABI_* macro for the subsuming version.  Assign increasing
	integer values to the ABI_* macros for supported versions.
This commit is contained in:
Roland McGrath 2000-03-22 05:43:53 +00:00
parent 62ecda3d7c
commit cb832354c3
2 changed files with 28 additions and 15 deletions

View File

@ -25,14 +25,22 @@
# include <abi-versions.h> /* header generated by abi-versions.awk */
/* The file abi-versions.h (generated by scripts/abi-versions.awk) defines
symbols like `ABI_libm_GLIBC_2_0' to either 1 or 0 indicating whether or
not we want to build binary compatibility for e.g. the GLIBC_2.0 version
set into the libm shared object. If this evaluates to zero, then there
is no need to compile in extra code to support this version set where it
has been superseded by a newer version. The compatibility code should
be conditionalized with `#if SHLIB_COMPAT (libm, GLIBC_2_0)'. */
symbols like `ABI_libm_GLIBC_2_0' for each version set in the source
code for each library. For a version set that is subsumed by a later
version set, the definition gives the subsuming set, i.e. if GLIBC_2_0
is subsumed by GLIBC_2_1, then ABI_libm_GLIBC_2_0 == ABI_libm_GLIBC_2_1.
Each version set that is to be distinctly defined in the output has an
unique positive integer value, increasing with newer versions. Thus,
evaluating two ABI_* symbols reduces to integer values that differ only
when the two version sets named are in fact two different ABIs we are
supporting. If these do not differ, then there is no need to compile in
extra code to support this version set where it has been superseded by a
newer version. The compatibility code should be conditionalized with
e.g. `#if SHLIB_COMPAT (libm, GLIBC_2_0, GLIBC_2_2)' for code introduced
in the GLIBC_2.0 version and obsoleted in the GLIBC_2.2 version. */
# define SHLIB_COMPAT(lib, version) ABI_##lib##_##version
# define SHLIB_COMPAT(lib, introduced, obsoleted) \
(ABI_##lib##_##introduced < ABI_##lib##_##obsoleted)
/* That header also defines symbols like `VERSION_libm_GLIBC_2_1' to
the version set name to use for e.g. symbols first introduced into
@ -51,7 +59,7 @@
#else
/* Not compiling ELF shared libraries at all, so never any old versions. */
# define SHLIB_COMPAT(lib, version) 0
# define SHLIB_COMPAT(lib, introduced, obsoleted) 0
/* No versions to worry about, just make this the global definition. */
# define versioned_symbol(lib, local, symbol, version) \

View File

@ -11,6 +11,7 @@ NF == 2 && $2 == "{" {
thislib = $1;
gsub(/[^A-Za-z0-9_ ]/, "_"); libid = $1;
printf "\n/* start %s */\n", thislib;
n = 0;
next;
}
$1 == "}" {
@ -19,18 +20,22 @@ $1 == "}" {
}
$2 == "=" {
new = $3;
gsub(/[^A-Za-z0-9_ ]/, "_"); id = $1;
printf "#define ABI_%s_%s\t0\t/* earliest supported %s */\n", libid, id, new;
printf "#define VERSION_%s_%s\t%s\n", libid, id, new;
old = $1; new = $3;
gsub(/[^A-Za-z0-9_ ]/, "_");
oldid = $1; newid = $3;
printf "#define ABI_%s_%s\tABI_%s_%s\n", libid, oldid, libid, newid;
printf "#define VERSION_%s_%s\t%s\n", libid, oldid, new;
next;
}
{
vers = $1;
gsub(/[^A-Za-z0-9_ ]/, "_"); id = $1;
printf "#define ABI_%s_%s\t1\t/* support %s */\n", libid, id, vers;
printf "#define VERSION_%s_%s\t%s\n", libid, id, vers;
gsub(/[^A-Za-z0-9_ ]/, "_");
versid = $1;
printf "#define ABI_%s_%s\t%d\t/* support %s */\n", libid, versid, ++n, vers;
printf "#define VERSION_%s_%s\t%s\n", libid, versid, vers;
next;
}