mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-03 14:21:30 +00:00 
			
		
		
		
	Made removing the object files a separate sh command so that it can easily be commented out. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11888 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			151 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			151 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/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
 |