diff utils/check-each-file @ 31:d22a1cf4041c

merge with the LLVM_original
author Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
date Thu, 12 Dec 2013 14:37:49 +0900
parents 95c75e76d11b
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/utils/check-each-file	Thu Dec 12 14:37:49 2013 +0900
@@ -0,0 +1,150 @@
+#!/bin/sh
+# check-each-file
+# Used to narrow down a miscompilation to one .o file from a list. Please read
+# the usage procedure, below, for command-line syntax (or run it with --help).
+# This script depends on the llvm-native-gcc script.
+
+if [ x$1 = x--make-linker-script ]
+then
+	program=$2
+	linker=./link-$program
+	echo "Building $program with llvm-native-gcc"
+	rm -f $program
+	gmake -e $program CC=llvm-native-gcc CXX=llvm-native-gxx
+	echo "Erasing $program and re-linking it" 
+	rm -f $program
+	echo "rm -f $program" > $linker
+	gmake -n $program >> $linker
+	chmod 755 $linker
+	echo "Linker script created in $linker; testing it out"
+	output=`./$linker 2>&1`
+	case "$output" in
+		*undefined*reference*__main*) 
+			echo "$program appears to need a dummy __main function; adding one"
+			echo "void __main () { }" > __main.c
+			gcc -c __main.c
+			echo "Done; rebuilding $linker"
+			echo "rm -f $program" > $linker
+			gmake -n $program 2>&1 | sed '/gcc/s/$/__main.o/' >> $linker
+			./$linker > /dev/null 2>&1
+			if [ ! -x $program ]
+			then
+				echo "WARNING: linker script didn't work"
+			fi
+			;;
+		*)
+			if [ ! -x $program ]
+			then
+				echo "WARNING: linker script didn't work"
+			fi
+			;;
+	esac
+	echo "Linker script created in $linker; please check it manually"
+	exit 0
+fi
+
+checkfiles="$1"
+program="$2"
+linker="$3"
+checker="$4"
+
+usage () {
+	myname=`basename $0`
+	echo "$myname --make-linker-script PROGRAM"
+	echo "$myname OBJECTS-FILE PROGRAM LINKER CHECKER"
+	echo ""
+	echo "OBJECTS-FILE is a text file containing the names of all the .o files"
+	echo "PROGRAM is the name of the executable under test"
+	echo "(there must also exist a Makefile in the current directory which"
+	echo "has PROGRAM as a target)"
+	echo "LINKER is the script that builds PROGRAM; try --make-linker-script" 
+	echo "to automatically generate it"
+	echo "CHECKER is the script that exits 0 if PROGRAM is ok, 1 if it is not OK"
+	echo "(LINKER and CHECKER must be in your PATH, or you should specify ./)"
+	echo ""
+	echo "Bugs to <gaeke@uiuc.edu>."
+	exit 1
+}
+
+if [ x$1 = x--help ]
+then
+	usage
+fi
+
+if [ -z "$checkfiles" ]
+then
+	echo "ERROR: Must specify name of file w/ list of objects as 1st arg."
+	echo "(got \"$checkfiles\")"
+	usage
+fi
+if [ ! -f "$checkfiles" ]
+then
+	echo "ERROR: $checkfiles not found"
+	usage
+fi
+if [ -z "$program" ]
+then
+	echo "ERROR: Must specify name of program as 2nd arg."
+	usage
+fi
+if [ -z "$linker" ]
+then
+	echo "ERROR: Must specify name of link script as 3rd arg."
+	usage
+fi
+if [ ! -x "$linker" ]
+then
+	echo "ERROR: $linker not found or not executable"
+	echo "You may wish to try: $0 --make-linker-script $program"
+	usage
+fi
+if [ -z "$checker" ]
+then
+	echo "ERROR: Must specify name of $program check script as 3rd arg."
+	usage
+fi
+if [ ! -x "$checker" ]
+then
+	echo "ERROR: $checker not found or not executable"
+	usage
+fi
+
+files=`cat $checkfiles`
+echo "Recompiling everything with llvm-native-gcc"
+for f in $files
+do
+	rm -f $f
+	gmake $f CC=llvm-native-gcc CXX=llvm-native-gxx
+done
+rm -f $program
+$linker
+if $checker
+then
+	echo "Sorry, I can't help you, $program is OK when compiled with llvm-native-gcc"
+	exit 1
+fi
+for f in $files
+do
+	echo Trying to compile $f with native gcc and rebuild $program
+	mv ${f} ${f}__OLD__
+	gmake ${f} CC=gcc > /dev/null 2>&1
+	$linker
+	echo Checking validity of new $program
+	if $checker
+	then
+		echo Program is OK
+		okfiles="$okfiles $f"
+	else
+		echo Program is not OK
+		notokfiles="$notokfiles $f"
+	fi
+	mv ${f}__OLD__ ${f}
+done
+echo ""
+echo "Program is OK when these files are recompiled with native gcc: "
+echo "$okfiles"
+echo ""
+echo "Program is not OK when these files are recompiled with native gcc: "
+echo "$notokfiles"
+echo ""
+exit 0