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 | |
parent | 87cfd82a1fc269635c9b0dd37c47470b5465e775 (diff) | |
download | glibc-e83c1a8a72b3ea3009e18ecb3fc0778e81655d3b.tar.gz glibc-e83c1a8a72b3ea3009e18ecb3fc0778e81655d3b.tar.xz 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')
-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 |