diff --git a/scripts/firstversions.awk b/scripts/firstversions.awk index 7f1c2edf52..8da92ae485 100644 --- a/scripts/firstversions.awk +++ b/scripts/firstversions.awk @@ -11,7 +11,7 @@ NF > 2 && $2 == ":" { NF == 2 && $2 == "{" { thislib = $1; print; next } $1 == "}" { - if (firstversion[thislib, idx[thislib]]) { + 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]]; @@ -21,16 +21,42 @@ $1 == "}" { next; } -{ - v = firstversion[thislib, idx[thislib]]; +/GLIBC_PRIVATE/ { print; next } - if (! v) - print; - else if ($1 == v) { - print; - firstversion[thislib, idx[thislib]] = 0; - idx[thislib]++; +{ + 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 $1, "=", v; + print; }