2000-03-22 Roland McGrath <roland@baalperazim.frob.com>
authorRoland McGrath <roland@gnu.org>
Wed, 22 Mar 2000 05:43:53 +0000 (05:43 +0000)
committerRoland McGrath <roland@gnu.org>
Wed, 22 Mar 2000 05:43:53 +0000 (05:43 +0000)
* 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.

include/shlib-compat.h
scripts/abi-versions.awk

index a125d90..c91e6ce 100644 (file)
 # 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)'.  */
-
-# define SHLIB_COMPAT(lib, version)    ABI_##lib##_##version
+   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, 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) \
index 0cceaad..b8994c7 100644 (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;
 }