#!/bin/bash # Make sure no code in ld.so uses xmm/ymm/zmm registers on i386. # Copyright (C) 2009-2016 Free Software Foundation, Inc. # This file is part of the GNU C Library. # The GNU C Library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # The GNU C Library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # You should have received a copy of the GNU Lesser General Public # License along with the GNU C Library; if not, see # . set -e objpfx="$1" NM="$2" OBJDUMP="$3" READELF="$4" tmp=$(mktemp ${objpfx}tst-ld-sse-use.XXXXXX) trap 'rm -f "$tmp"' 1 2 3 15 # 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) } /,%[xyz]mm[[:digit:]]*$/ { if (last != fct) { print fct; last=fct} }' | while read fct; do if test "$fct" = "_dl_runtime_profile" -o "$fct" = "_dl_x86_64_restore_sse"; then continue; fi echo "function $fct in $f modifies xmm/ymm/zmm" >> "$tmp" result=1 done done if test -s "$tmp"; then echo echo cat "$tmp" result=1 else result=0 fi rm "$tmp" exit $result