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