From: Ulrich Drepper Date: Mon, 27 Jul 2009 20:40:27 +0000 (-0700) Subject: Refine testing for xmm/ymm register use in x86-64 ld.so. X-Git-Tag: fedora/glibc-2.10.90-10~1^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e83c1a8a72b3ea3009e18ecb3fc0778e81655d3b;p=thirdparty%2Fglibc.git Refine testing for xmm/ymm register use in x86-64 ld.so. 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. --- diff --git a/ChangeLog b/ChangeLog index e31b72ff65a..60b76547c1e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,19 @@ 2009-07-27 Ulrich Drepper + * 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. diff --git a/sysdeps/x86_64/Makefile b/sysdeps/x86_64/Makefile index 57cd88432a6..e8d0285e26e 100644 --- a/sysdeps/x86_64/Makefile +++ b/sysdeps/x86_64/Makefile @@ -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 index 53a90675ab4..00000000000 --- a/sysdeps/x86_64/multiarch/rtld-rawmemchr.c +++ /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 index f63fefbcecd..00000000000 --- a/sysdeps/x86_64/rtld-memchr.c +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/sysdeps/x86_64/rtld-rawmemchr.c b/sysdeps/x86_64/rtld-rawmemchr.c deleted file mode 100644 index 2b9189393cb..00000000000 --- a/sysdeps/x86_64/rtld-rawmemchr.c +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/sysdeps/x86_64/tst-xmmymm.sh b/sysdeps/x86_64/tst-xmmymm.sh index 0735276e6d2..a576e7da0d5 100755 --- a/sysdeps/x86_64/tst-xmmymm.sh +++ b/sysdeps/x86_64/tst-xmmymm.sh @@ -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 '/^ "$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