diff options
author | Shih-wei Liao <sliao@google.com> | 2010-02-10 11:10:31 -0800 |
---|---|---|
committer | Shih-wei Liao <sliao@google.com> | 2010-02-10 11:10:31 -0800 |
commit | e264f62ca09a8f65c87a46d562a4d0f9ec5d457e (patch) | |
tree | 59e3d57ef656cef79afa708ae0a3daf25cd91fcf /utils/check-each-file | |
download | external_llvm-e264f62ca09a8f65c87a46d562a4d0f9ec5d457e.zip external_llvm-e264f62ca09a8f65c87a46d562a4d0f9ec5d457e.tar.gz external_llvm-e264f62ca09a8f65c87a46d562a4d0f9ec5d457e.tar.bz2 |
Check in LLVM r95781.
Diffstat (limited to 'utils/check-each-file')
-rwxr-xr-x | utils/check-each-file | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/utils/check-each-file b/utils/check-each-file new file mode 100755 index 0000000..bd76333 --- /dev/null +++ b/utils/check-each-file @@ -0,0 +1,150 @@ +#!/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 |