about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRoland McGrath <roland@hack.frob.com>2014-03-25 11:16:51 -0700
committerRoland McGrath <roland@hack.frob.com>2014-03-25 15:00:34 -0700
commita5e5f1e281c3472328e67c7744c300018242c5f0 (patch)
treea11ab68e1085db9cd683d03416db922a12f875bf
parent00f4012a2fe0e12e6bc56438a20fff76208e0b5a (diff)
downloadglibc-a5e5f1e281c3472328e67c7744c300018242c5f0.tar.gz
glibc-a5e5f1e281c3472328e67c7744c300018242c5f0.tar.xz
glibc-a5e5f1e281c3472328e67c7744c300018242c5f0.zip
Kludge fix for Versions.def regression
-rw-r--r--ChangeLog5
-rw-r--r--scripts/versionlist.awk38
2 files changed, 38 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 92cd973e10..c4ba460b39 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2014-03-25  Roland McGrath  <roland@hack.frob.com>
+
+	* scripts/versionlist.awk: Partition the version sets and emit all
+	GLIBC_* (sorted) before all others (sorted).
+
 2014-03-25  Joseph Myers  <joseph@codesourcery.com>
 
 	* elf/Versions (libc) [EXPORT_UNWIND_FIND_FDE]: Add empty
diff --git a/scripts/versionlist.awk b/scripts/versionlist.awk
index 19fe672991..236015311e 100644
--- a/scripts/versionlist.awk
+++ b/scripts/versionlist.awk
@@ -3,14 +3,25 @@
 
 BEGIN { in_lib = ""; in_version = 0 }
 
-!in_lib && NF == 2 && $2 == "{" { in_lib = $1; next }
+!in_lib && NF == 2 && $2 == "{" {
+  in_lib = $1;
+  all_libs[in_lib] = 1;
+  next
+}
 !in_lib { next }
 
 NF == 2 && $2 == "{" {
   in_version = 1;
-  libs[in_lib] = libs[in_lib] "  " $1 "\n";
   lib_versions[in_lib, $1] = 1;
-  all_versions[$1] = 1;
+  # Partition the version sets into GLIBC_* and others.
+  if ($1 ~ /GLIBC_/) {
+    libs[in_lib] = libs[in_lib] "  " $1 "\n";
+    all_versions[$1] = 1;
+  }
+  else {
+    others_libs[in_lib] = others_libs[in_lib] "  " $1 "\n";
+    others_all_versions[$1] = 1;
+  }
   next
 }
 
@@ -20,20 +31,37 @@ in_version { next }
 $1 == "}" { in_lib = ""; next }
 
 END {
-  nlibs = asorti(libs, libs_order);
+  nlibs = asorti(all_libs, libs_order);
   for (i = 1; i <= nlibs; ++i) {
     lib = libs_order[i];
 
     for (v in all_versions) {
-      if (!((in_lib, v) in lib_versions)) {
+      if (!((lib, v) in lib_versions)) {
         libs[lib] = libs[lib] "  " v "\n";
       }
     }
 
+    for (v in others_all_versions) {
+      if (!((lib, v) in lib_versions)) {
+        others_libs[lib] = others_libs[lib] "  " v "\n";
+      }
+    }
+
     print lib, "{";
+
+    # Sort and print all the GLIBC_* sets first, then all the others.
+    # This is not really generically right, but it suffices
+    # for the cases we have so far.  e.g. GCC_3.0 is "later than"
+    # all GLIBC_* sets that matter for purposes of Versions files.
+
     sort = "sort -u -t. -k 1,1 -k 2n,2n -k 3";
     printf "%s", libs[lib] | sort;
     close(sort);
+
+    sort = "sort -u -t. -k 1,1 -k 2n,2n -k 3";
+    printf "%s", others_libs[lib] | sort;
+    close(sort);
+
     print "}";
   }
 }