Brian Gaeke | 4a6ca8d | 2004-01-15 22:35:43 +0000 | [diff] [blame] | 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 |
John Criswell | fd04ee6 | 2004-02-26 23:02:25 +0000 | [diff] [blame] | 13 | gmake -e $program CC=llvm-native-gcc CXX=llvm-native-gxx |
Brian Gaeke | 4a6ca8d | 2004-01-15 22:35:43 +0000 | [diff] [blame] | 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" |
Brian Gaeke | 79bf052 | 2004-02-08 08:01:00 +0000 | [diff] [blame] | 58 | echo "(there must also exist a Makefile in the current directory which" |
Brian Gaeke | 4a6ca8d | 2004-01-15 22:35:43 +0000 | [diff] [blame] | 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@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 |
John Criswell | fd04ee6 | 2004-02-26 23:02:25 +0000 | [diff] [blame] | 116 | rm -f $f |
| 117 | gmake $f CC=llvm-native-gcc CXX=llvm-native-gxx |
Brian Gaeke | 4a6ca8d | 2004-01-15 22:35:43 +0000 | [diff] [blame] | 118 | done |
Brian Gaeke | 0afbc2f | 2004-02-11 18:52:05 +0000 | [diff] [blame] | 119 | rm -f $program |
| 120 | $linker |
Brian Gaeke | 4a6ca8d | 2004-01-15 22:35:43 +0000 | [diff] [blame] | 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 |