summaryrefslogtreecommitdiff
path: root/libc/scripts/firstversions.awk
diff options
context:
space:
mode:
Diffstat (limited to 'libc/scripts/firstversions.awk')
-rw-r--r--libc/scripts/firstversions.awk62
1 files changed, 62 insertions, 0 deletions
diff --git a/libc/scripts/firstversions.awk b/libc/scripts/firstversions.awk
new file mode 100644
index 000000000..8da92ae48
--- /dev/null
+++ b/libc/scripts/firstversions.awk
@@ -0,0 +1,62 @@
+# Script to preprocess Versions.all lists based on "earliest version"
+# specifications in the shlib-versions file.
+
+NF > 2 && $2 == ":" {
+ for (i = 0; i <= NF - 3; ++i)
+ firstversion[$1, i] = $(3 + i);
+ idx[$1] = 0;
+ next;
+}
+
+NF == 2 && $2 == "{" { thislib = $1; print; next }
+
+$1 == "}" {
+ if ((thislib, idx[thislib]) in firstversion) {
+ # We haven't seen the stated version, but have produced
+ # others pointing to it, so we synthesize it now.
+ printf " %s\n", firstversion[thislib, idx[thislib]];
+ idx[thislib]++;
+ }
+ print;
+ next;
+}
+
+/GLIBC_PRIVATE/ { print; next }
+
+{
+ if ((thislib, idx[thislib]) in firstversion) {
+ # XXX relative string comparison loses if we ever have multiple digits
+ # between dots in GLIBC_x.y[.z] names.
+ f = v = firstversion[thislib, idx[thislib]];
+ while ($1 >= v) {
+ delete firstversion[thislib, idx[thislib]];
+ idx[thislib]++;
+ if ((thislib, idx[thislib]) in firstversion)
+ v = firstversion[thislib, idx[thislib]];
+ else
+ break;
+ }
+ if ($1 == v || $1 == f)
+ # This version was the specified earliest version itself.
+ print;
+ else if ($1 < v) {
+ # This version is older than the specified earliest version.
+ print " " $1, "=", v;
+ # Record that V has been referred to, so we will be sure to emit it
+ # if we hit a later one without hitting V itself.
+ usedversion[thislib, v] = 1;
+ }
+ else {
+ # This version is newer than the specified earliest version.
+ # We haven't seen that version itself or else we wouldn't be here
+ # because we would have removed it from the firstversion array.
+ # If there were any earlier versions that used that one, emit it now.
+ if ((thislib, v) in usedversion) {
+ print " " v;
+ }
+ print " " $1;
+ }
+ }
+ else
+ print;
+}