Home | History | Annotate | Download | only in utils
      1 #!/bin/sh
      2 # check-each-file
      3 # Used to narrow down a miscompilation to one .o file from a list. Please read
      4 # the usage procedure, below, for command-line syntax (or run it with --help).
      5 # This script depends on the llvm-native-gcc script.
      6 
      7 if [ x$1 = x--make-linker-script ]
      8 then
      9 	program=$2
     10 	linker=./link-$program
     11 	echo "Building $program with llvm-native-gcc"
     12 	rm -f $program
     13 	gmake -e $program CC=llvm-native-gcc CXX=llvm-native-gxx
     14 	echo "Erasing $program and re-linking it" 
     15 	rm -f $program
     16 	echo "rm -f $program" > $linker
     17 	gmake -n $program >> $linker
     18 	chmod 755 $linker
     19 	echo "Linker script created in $linker; testing it out"
     20 	output=`./$linker 2>&1`
     21 	case "$output" in
     22 		*undefined*reference*__main*) 
     23 			echo "$program appears to need a dummy __main function; adding one"
     24 			echo "void __main () { }" > __main.c
     25 			gcc -c __main.c
     26 			echo "Done; rebuilding $linker"
     27 			echo "rm -f $program" > $linker
     28 			gmake -n $program 2>&1 | sed '/gcc/s/$/__main.o/' >> $linker
     29 			./$linker > /dev/null 2>&1
     30 			if [ ! -x $program ]
     31 			then
     32 				echo "WARNING: linker script didn't work"
     33 			fi
     34 			;;
     35 		*)
     36 			if [ ! -x $program ]
     37 			then
     38 				echo "WARNING: linker script didn't work"
     39 			fi
     40 			;;
     41 	esac
     42 	echo "Linker script created in $linker; please check it manually"
     43 	exit 0
     44 fi
     45 
     46 checkfiles="$1"
     47 program="$2"
     48 linker="$3"
     49 checker="$4"
     50 
     51 usage () {
     52 	myname=`basename $0`
     53 	echo "$myname --make-linker-script PROGRAM"
     54 	echo "$myname OBJECTS-FILE PROGRAM LINKER CHECKER"
     55 	echo ""
     56 	echo "OBJECTS-FILE is a text file containing the names of all the .o files"
     57 	echo "PROGRAM is the name of the executable under test"
     58 	echo "(there must also exist a Makefile in the current directory which"
     59 	echo "has PROGRAM as a target)"
     60 	echo "LINKER is the script that builds PROGRAM; try --make-linker-script" 
     61 	echo "to automatically generate it"
     62 	echo "CHECKER is the script that exits 0 if PROGRAM is ok, 1 if it is not OK"
     63 	echo "(LINKER and CHECKER must be in your PATH, or you should specify ./)"
     64 	echo ""
     65 	echo "Bugs to <gaeke (at] uiuc.edu>."
     66 	exit 1
     67 }
     68 
     69 if [ x$1 = x--help ]
     70 then
     71 	usage
     72 fi
     73 
     74 if [ -z "$checkfiles" ]
     75 then
     76 	echo "ERROR: Must specify name of file w/ list of objects as 1st arg."
     77 	echo "(got \"$checkfiles\")"
     78 	usage
     79 fi
     80 if [ ! -f "$checkfiles" ]
     81 then
     82 	echo "ERROR: $checkfiles not found"
     83 	usage
     84 fi
     85 if [ -z "$program" ]
     86 then
     87 	echo "ERROR: Must specify name of program as 2nd arg."
     88 	usage
     89 fi
     90 if [ -z "$linker" ]
     91 then
     92 	echo "ERROR: Must specify name of link script as 3rd arg."
     93 	usage
     94 fi
     95 if [ ! -x "$linker" ]
     96 then
     97 	echo "ERROR: $linker not found or not executable"
     98 	echo "You may wish to try: $0 --make-linker-script $program"
     99 	usage
    100 fi
    101 if [ -z "$checker" ]
    102 then
    103 	echo "ERROR: Must specify name of $program check script as 3rd arg."
    104 	usage
    105 fi
    106 if [ ! -x "$checker" ]
    107 then
    108 	echo "ERROR: $checker not found or not executable"
    109 	usage
    110 fi
    111 
    112 files=`cat $checkfiles`
    113 echo "Recompiling everything with llvm-native-gcc"
    114 for f in $files
    115 do
    116 	rm -f $f
    117 	gmake $f CC=llvm-native-gcc CXX=llvm-native-gxx
    118 done
    119 rm -f $program
    120 $linker
    121 if $checker
    122 then
    123 	echo "Sorry, I can't help you, $program is OK when compiled with llvm-native-gcc"
    124 	exit 1
    125 fi
    126 for f in $files
    127 do
    128 	echo Trying to compile $f with native gcc and rebuild $program
    129 	mv ${f} ${f}__OLD__
    130 	gmake ${f} CC=gcc > /dev/null 2>&1
    131 	$linker
    132 	echo Checking validity of new $program
    133 	if $checker
    134 	then
    135 		echo Program is OK
    136 		okfiles="$okfiles $f"
    137 	else
    138 		echo Program is not OK
    139 		notokfiles="$notokfiles $f"
    140 	fi
    141 	mv ${f}__OLD__ ${f}
    142 done
    143 echo ""
    144 echo "Program is OK when these files are recompiled with native gcc: "
    145 echo "$okfiles"
    146 echo ""
    147 echo "Program is not OK when these files are recompiled with native gcc: "
    148 echo "$notokfiles"
    149 echo ""
    150 exit 0
    151