Commit 2f67a0d55aea184ec31f81df87ba4aa07c378fdb
1 parent
21664424
Script to check for missing FORCE_RET.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2308 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
47 additions
and
0 deletions
check_ops.sh
0 → 100755
| 1 | +#! /bin/sh | |
| 2 | +# Script to check for duplicate function prologues in op.o | |
| 3 | +# Typically this indicates missing FORCE_RET(); | |
| 4 | +# This script does not detect other errors that may be present. | |
| 5 | + | |
| 6 | +# Usage: check_ops.sh [-m machine] [op.o] | |
| 7 | +# machine and op.o are guessed if not specified. | |
| 8 | + | |
| 9 | +if [ "x$1" = "x-m" ]; then | |
| 10 | + machine=$2 | |
| 11 | + shift 2 | |
| 12 | +else | |
| 13 | + machine=`uname -m` | |
| 14 | +fi | |
| 15 | +if [ -z "$1" ]; then | |
| 16 | + for f in `find . -name op.o`; do | |
| 17 | + /bin/sh "$0" -m $machine $f | |
| 18 | + done | |
| 19 | + exit 0 | |
| 20 | +fi | |
| 21 | + | |
| 22 | +case $machine in | |
| 23 | + i?86) | |
| 24 | + ret='\tret' | |
| 25 | + ;; | |
| 26 | + x86_64) | |
| 27 | + ret='\tretq' | |
| 28 | + ;; | |
| 29 | + arm) | |
| 30 | + ret='\tldm.*pc' | |
| 31 | + ;; | |
| 32 | + ppc* | powerpc*) | |
| 33 | + ret='\tblr' | |
| 34 | + ;; | |
| 35 | + mips*) | |
| 36 | + ret='\tjr.*ra' | |
| 37 | + ;; | |
| 38 | + *) | |
| 39 | + echo "Unknown machine `uname -m`" | |
| 40 | + ;; | |
| 41 | +esac | |
| 42 | +echo $1 | |
| 43 | +# op_exit_tb causes false positives on some hosts. | |
| 44 | +${CROSS}objdump -dr $1 | \ | |
| 45 | + sed -e '/>:$\|'"$ret"'/!d' -e 's/.*<\(.*\)>:/~\1:/' -e 's/.*'"$ret"'.*/!/' | \ | |
| 46 | + sed -e ':1;N;s/\n//;t1' | sed -e 's/~/\n/g' | grep -v '^op_exit_tb' | \ | |
| 47 | + grep '^op_.*!!' | ... | ... |