mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 02:33:06 +01:00
This is my script for narrowing down miscompilations to a single file.
llvm-svn: 10890
This commit is contained in:
parent
cce1db873e
commit
d22e443f1e
147
utils/check-each-file
Executable file
147
utils/check-each-file
Executable file
@ -0,0 +1,147 @@
|
||||
#!/bin/sh
|
||||
# check-each-file
|
||||
# Used to narrow down a miscompilation to one .o file from a list. Please read
|
||||
# the usage procedure, below, for command-line syntax (or run it with --help).
|
||||
# This script depends on the llvm-native-gcc script.
|
||||
|
||||
if [ x$1 = x--make-linker-script ]
|
||||
then
|
||||
program=$2
|
||||
linker=./link-$program
|
||||
echo "Building $program with llvm-native-gcc"
|
||||
rm -f $program
|
||||
gmake -s $program CC=llvm-native-gcc
|
||||
echo "Erasing $program and re-linking it"
|
||||
rm -f $program
|
||||
echo "rm -f $program" > $linker
|
||||
gmake -n $program >> $linker
|
||||
chmod 755 $linker
|
||||
echo "Linker script created in $linker; testing it out"
|
||||
output=`./$linker 2>&1`
|
||||
case "$output" in
|
||||
*undefined*reference*__main*)
|
||||
echo "$program appears to need a dummy __main function; adding one"
|
||||
echo "void __main () { }" > __main.c
|
||||
gcc -c __main.c
|
||||
echo "Done; rebuilding $linker"
|
||||
echo "rm -f $program" > $linker
|
||||
gmake -n $program 2>&1 | sed '/gcc/s/$/__main.o/' >> $linker
|
||||
./$linker > /dev/null 2>&1
|
||||
if [ ! -x $program ]
|
||||
then
|
||||
echo "WARNING: linker script didn't work"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
if [ ! -x $program ]
|
||||
then
|
||||
echo "WARNING: linker script didn't work"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
echo "Linker script created in $linker; please check it manually"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
checkfiles="$1"
|
||||
program="$2"
|
||||
linker="$3"
|
||||
checker="$4"
|
||||
|
||||
usage () {
|
||||
myname=`basename $0`
|
||||
echo "$myname --make-linker-script PROGRAM"
|
||||
echo "$myname OBJECTS-FILE PROGRAM LINKER CHECKER"
|
||||
echo ""
|
||||
echo "OBJECTS-FILE is a text file containing the names of all the .o files"
|
||||
echo "PROGRAM is the name of the executable under test"
|
||||
echo "(there must also exist a Makefile in the current directory which
|
||||
echo "has PROGRAM as a target)"
|
||||
echo "LINKER is the script that builds PROGRAM; try --make-linker-script"
|
||||
echo "to automatically generate it"
|
||||
echo "CHECKER is the script that exits 0 if PROGRAM is ok, 1 if it is not OK"
|
||||
echo "(LINKER and CHECKER must be in your PATH, or you should specify ./)"
|
||||
echo ""
|
||||
echo "Bugs to <gaeke@uiuc.edu>."
|
||||
exit 1
|
||||
}
|
||||
|
||||
if [ x$1 = x--help ]
|
||||
then
|
||||
usage
|
||||
fi
|
||||
|
||||
if [ -z "$checkfiles" ]
|
||||
then
|
||||
echo "ERROR: Must specify name of file w/ list of objects as 1st arg."
|
||||
echo "(got \"$checkfiles\")"
|
||||
usage
|
||||
fi
|
||||
if [ ! -f "$checkfiles" ]
|
||||
then
|
||||
echo "ERROR: $checkfiles not found"
|
||||
usage
|
||||
fi
|
||||
if [ -z "$program" ]
|
||||
then
|
||||
echo "ERROR: Must specify name of program as 2nd arg."
|
||||
usage
|
||||
fi
|
||||
if [ -z "$linker" ]
|
||||
then
|
||||
echo "ERROR: Must specify name of link script as 3rd arg."
|
||||
usage
|
||||
fi
|
||||
if [ ! -x "$linker" ]
|
||||
then
|
||||
echo "ERROR: $linker not found or not executable"
|
||||
echo "You may wish to try: $0 --make-linker-script $program"
|
||||
usage
|
||||
fi
|
||||
if [ -z "$checker" ]
|
||||
then
|
||||
echo "ERROR: Must specify name of $program check script as 3rd arg."
|
||||
usage
|
||||
fi
|
||||
if [ ! -x "$checker" ]
|
||||
then
|
||||
echo "ERROR: $checker not found or not executable"
|
||||
usage
|
||||
fi
|
||||
|
||||
files=`cat $checkfiles`
|
||||
echo "Recompiling everything with llvm-native-gcc"
|
||||
for f in $files
|
||||
do
|
||||
rm -f $f && gmake $f CC=llvm-native-gcc
|
||||
done
|
||||
if $checker
|
||||
then
|
||||
echo "Sorry, I can't help you, $program is OK when compiled with llvm-native-gcc"
|
||||
exit 1
|
||||
fi
|
||||
for f in $files
|
||||
do
|
||||
echo Trying to compile $f with native gcc and rebuild $program
|
||||
mv ${f} ${f}__OLD__
|
||||
gmake ${f} CC=gcc > /dev/null 2>&1
|
||||
$linker
|
||||
echo Checking validity of new $program
|
||||
if $checker
|
||||
then
|
||||
echo Program is OK
|
||||
okfiles="$okfiles $f"
|
||||
else
|
||||
echo Program is not OK
|
||||
notokfiles="$notokfiles $f"
|
||||
fi
|
||||
mv ${f}__OLD__ ${f}
|
||||
done
|
||||
echo ""
|
||||
echo "Program is OK when these files are recompiled with native gcc: "
|
||||
echo "$okfiles"
|
||||
echo ""
|
||||
echo "Program is not OK when these files are recompiled with native gcc: "
|
||||
echo "$notokfiles"
|
||||
echo ""
|
||||
exit 0
|
Loading…
Reference in New Issue
Block a user