Refine testing for xmm/ymm register use in x86-64 ld.so.
authorUlrich Drepper <drepper@redhat.com>
Mon, 27 Jul 2009 20:40:27 +0000 (13:40 -0700)
committerUlrich Drepper <drepper@redhat.com>
Mon, 27 Jul 2009 20:40:27 +0000 (13:40 -0700)
The test now takes the callgraph into account.  Only code called
during runtime relocation is affected by the limitation.  We now
determine the affected object files as closely as possible from
the outside.  This allowed to remove some the specializations
for some of the string functions as they are only used in other
code paths.

ChangeLog
sysdeps/x86_64/Makefile
sysdeps/x86_64/multiarch/rtld-rawmemchr.c [deleted file]
sysdeps/x86_64/rtld-memchr.c [deleted file]
sysdeps/x86_64/rtld-rawmemchr.c [deleted file]
sysdeps/x86_64/tst-xmmymm.sh

index e31b72f..60b7654 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,19 @@
 2009-07-27  Ulrich Drepper  <drepper@redhat.com>
 
+       * sysdeps/x86_64/tst-xmmymm.sh: Refine testing.  The script now
+       determines which files are used in runtime lookups and only checks
+       those for SSE use.
+       * sysdeps/x86_64/rtld-memchr.c: Removed.  Not needed with refined
+       testing.
+       * sysdeps/x86_64/rtld-rawmemchr.c: Removed.
+       * sysdeps/x86_64/multiarch/rtld-rawmemchr.c: Removed
+       * sysdeps/x86_64/Makefile: Emit warning that tst-xmmymm.sh might
+       take a while.
+
+       * elf/dl-open.c: Move _dl_scope_free to...
+       * elf/dl-scope.c: ...here.  New file.
+       * elf/Makefile (dl-routines): Add scope.
+
        * resolv/resolv.h (RES_USE_DNSSEC): Define.
        * resolv/res_debug.c (p_option): Handle RES_USE_EDNS0 and
        RES_USE_DNSSEC.
index 57cd884..e8d0285 100644 (file)
@@ -22,6 +22,7 @@ sysdep-rtld-routines += tlsdesc dl-tlsdesc
 
 tests: $(objpfx)tst-xmmymm.out
 $(objpfx)tst-xmmymm.out: ../sysdeps/x86_64/tst-xmmymm.sh $(objpfx)ld.so
+       @echo "Checking ld.so for SSE register use.  This will take a few seconds..."
        $(SHELL) -e $< $(objpfx) > $@
 endif
 
diff --git a/sysdeps/x86_64/multiarch/rtld-rawmemchr.c b/sysdeps/x86_64/multiarch/rtld-rawmemchr.c
deleted file mode 100644 (file)
index 53a9067..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include "../rtld-rawmemchr.c"
diff --git a/sysdeps/x86_64/rtld-memchr.c b/sysdeps/x86_64/rtld-memchr.c
deleted file mode 100644 (file)
index f63fefb..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include <string/memchr.c>
diff --git a/sysdeps/x86_64/rtld-rawmemchr.c b/sysdeps/x86_64/rtld-rawmemchr.c
deleted file mode 100644 (file)
index 2b91893..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include <string/rawmemchr.c>
index 0735276..a576e7d 100755 (executable)
@@ -1,17 +1,79 @@
-#! /bin/sh
+#! /bin/bash
 objpfx="$1"
 
 tmp=$(mktemp ${objpfx}tst-xmmymm.XXXXXX)
 trap 'rm -f "$tmp"' 1 2 3 15
 
-objdump -d "${objpfx}ld.so" |
-awk 'BEGIN { last="" } /^[[:xdigit:]]* <[_[:alnum:]]*>:$/ { fct=substr($2, 2, length($2)-3) } /,%[xy]mm[[:digit:]]*$/ { if (last != fct) { print fct; last=fct} }' |
-tee "$tmp"
+# List of object files we have to test
+rtldobjs=$(readelf -W -wi ${objpfx}dl-allobjs.os |
+    awk '/^ </ { if ($5 == "(DW_TAG_compile_unit)") c=1; else c=0 } $2 == "DW_AT_name" { if (c == 1) print $NF }' |
+    sed 's,\(.*/\|\)\([_[:alnum:]-]*[.]\).$,\2os,')
+rtldobjs="$rtldobjs $(ar t ${objpfx}rtld-libc.a)"
 
-echo "Functions which incorrectly modify xmm/ymm registers:"
-err=1
-egrep -vs '^_dl_runtime_profile$' "$tmp" || err=0
-if test $err -eq 0; then echo "None"; fi
+# OBJECT symbols can be ignored.
+readelf -sW ${objpfx}dl-allobjs.os ${objpfx}rtld-libc.a |
+egrep " OBJECT  *GLOBAL " |
+awk '{if ($7 != "ABS") print $8 }' |
+sort -u > "$tmp"
+declare -a objects
+objects=($(cat "$tmp"))
+
+objs="dl-runtime.os"
+tocheck="dl-runtime.os"
+
+while test -n "$objs"; do
+  this="$objs"
+  objs=""
+
+  for f in $this; do
+    undef=$(nm -u "$objpfx"../*/"$f" | awk '{print $2}')
+    if test -n "$undef"; then
+      for s in $undef; do
+       for obj in ${objects[*]} "_GLOBAL_OFFSET_TABLE_"; do
+         if test "$obj" = "$s"; then
+           continue 2
+         fi
+       done
+        for o in $rtldobjs; do
+         ro=$(echo "$objpfx"../*/"$o")
+         if nm -g --defined-only "$ro" | egrep -qs " $s\$"; then
+           if ! (echo "$tocheck $objs" | fgrep -qs "$o"); then
+             echo "$o needed for $s"
+             objs="$objs $o"
+           fi
+           break;
+         fi
+       done
+      done
+    fi
+  done
+  tocheck="$tocheck$objs"
+done
+
+echo
+echo
+echo "object files needed: $tocheck"
+
+cp /dev/null "$tmp"
+for f in $tocheck; do
+  objdump -d "$objpfx"../*/"$f" |
+  awk 'BEGIN { last="" } /^[[:xdigit:]]* <[_[:alnum:]]*>:$/ { fct=substr($2, 2, length($2)-3) } /,%[xy]mm[[:digit:]]*$/ { if (last != fct) { print fct; last=fct} }' |
+  while read fct; do
+    if test "$fct" != "_dl_runtime_profile"; then
+      echo "function $fct in $f modifies xmm/ymm" >> "$tmp"
+      result=1
+    fi
+  done
+done
+
+if test -s "$tmp"; then
+  echo
+  echo
+  cat "$tmp"
+  result=1
+else
+  result=0
+fi
 
 rm "$tmp"
-exit $err
+exit $result