diff options
author | Ulrich Drepper <drepper@redhat.com> | 2009-07-27 13:40:27 -0700 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2009-07-27 13:40:27 -0700 |
commit | e83c1a8a72b3ea3009e18ecb3fc0778e81655d3b (patch) | |
tree | e8622f5dbc5c21deb7f70f1a6b9a1164f484734f /sysdeps/x86_64 | |
parent | 87cfd82a1fc269635c9b0dd37c47470b5465e775 (diff) | |
download | glibc-e83c1a8a72b3ea3009e18ecb3fc0778e81655d3b.tar glibc-e83c1a8a72b3ea3009e18ecb3fc0778e81655d3b.tar.gz glibc-e83c1a8a72b3ea3009e18ecb3fc0778e81655d3b.tar.bz2 glibc-e83c1a8a72b3ea3009e18ecb3fc0778e81655d3b.zip |
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.
Diffstat (limited to 'sysdeps/x86_64')
-rw-r--r-- | sysdeps/x86_64/Makefile | 1 | ||||
-rw-r--r-- | sysdeps/x86_64/multiarch/rtld-rawmemchr.c | 1 | ||||
-rw-r--r-- | sysdeps/x86_64/rtld-memchr.c | 1 | ||||
-rw-r--r-- | sysdeps/x86_64/rtld-rawmemchr.c | 1 | ||||
-rwxr-xr-x | sysdeps/x86_64/tst-xmmymm.sh | 80 |
5 files changed, 72 insertions, 12 deletions
diff --git a/sysdeps/x86_64/Makefile b/sysdeps/x86_64/Makefile index 57cd88432a..e8d0285e26 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 53a90675ab..0000000000 --- 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 f63fefbcec..0000000000 --- a/sysdeps/x86_64/rtld-memchr.c +++ /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 index 2b9189393c..0000000000 --- a/sysdeps/x86_64/rtld-rawmemchr.c +++ /dev/null @@ -1 +0,0 @@ -#include <string/rawmemchr.c> diff --git a/sysdeps/x86_64/tst-xmmymm.sh b/sysdeps/x86_64/tst-xmmymm.sh index 0735276e6d..a576e7da0d 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 '/^ </ { 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 |