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