#!/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 -e $program CC=llvm-native-gcc CXX=llvm-native-gxx | |
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 CXX=llvm-native-gxx | |
done | |
rm -f $program | |
$linker | |
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 |