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 7if [ x$1 = x--make-linker-script ] 8then 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 44fi 45 46checkfiles="$1" 47program="$2" 48linker="$3" 49checker="$4" 50 51usage () { 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@uiuc.edu>." 66 exit 1 67} 68 69if [ x$1 = x--help ] 70then 71 usage 72fi 73 74if [ -z "$checkfiles" ] 75then 76 echo "ERROR: Must specify name of file w/ list of objects as 1st arg." 77 echo "(got \"$checkfiles\")" 78 usage 79fi 80if [ ! -f "$checkfiles" ] 81then 82 echo "ERROR: $checkfiles not found" 83 usage 84fi 85if [ -z "$program" ] 86then 87 echo "ERROR: Must specify name of program as 2nd arg." 88 usage 89fi 90if [ -z "$linker" ] 91then 92 echo "ERROR: Must specify name of link script as 3rd arg." 93 usage 94fi 95if [ ! -x "$linker" ] 96then 97 echo "ERROR: $linker not found or not executable" 98 echo "You may wish to try: $0 --make-linker-script $program" 99 usage 100fi 101if [ -z "$checker" ] 102then 103 echo "ERROR: Must specify name of $program check script as 3rd arg." 104 usage 105fi 106if [ ! -x "$checker" ] 107then 108 echo "ERROR: $checker not found or not executable" 109 usage 110fi 111 112files=`cat $checkfiles` 113echo "Recompiling everything with llvm-native-gcc" 114for f in $files 115do 116 rm -f $f 117 gmake $f CC=llvm-native-gcc CXX=llvm-native-gxx 118done 119rm -f $program 120$linker 121if $checker 122then 123 echo "Sorry, I can't help you, $program is OK when compiled with llvm-native-gcc" 124 exit 1 125fi 126for f in $files 127do 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} 142done 143echo "" 144echo "Program is OK when these files are recompiled with native gcc: " 145echo "$okfiles" 146echo "" 147echo "Program is not OK when these files are recompiled with native gcc: " 148echo "$notokfiles" 149echo "" 150exit 0 151