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