proc llvm-runtest { programs objdir srcdir subdir target_triplet llvmgcc llvmgxx prcontext} {

    set timeout 60

    set path [file join $objdir $subdir]
    
    #Make Output Directory if it does not exist already
    if { [file exists path] } {
	cd $path
    } else {
	file mkdir $path
	cd $path
    }
    
    file mkdir Output
 
    foreach test $programs {
	
	#Should figure out best way to set the timeout
	#set timeout 40
	
	set filename [file tail $test]
	set output [file join Output $filename.out]
	set script $output.script
	set outcome PASS
	set tmpFile testscript.
	append tmpFile $filename .tmp

	#set hasRunline bool to check if testcase has a runline
	set hasRunline 0

	#check if script files exists, and delete if it does
	if { [file exists $script] } {
	    file delete $script
	}
	
	#create script file and write run line out to it
	set scriptFileId [open $script w 0700]
	set testFileId [ open $test r]
	foreach line [split [read $testFileId] \n] {
	    
	    #see if this is our run line
	    if {[regexp {RUN:(.+)} $line match runline]} {
		set runline
		set hasRunline 1

		#replace %s with filename
		regsub -all {%s} $runline $test new_runline

		#replace %t with temp filenames
		regsub -all {%t} $new_runline [file join Output $tmpFile] new_runline

		#replace %prcontext with prcontext.tcl (Must replace before %p)
		regsub -all {%prcontext} $new_runline $prcontext new_runline

		#replace %p with path to source, 
		regsub -all {%p} $new_runline [file join $srcdir $subdir] new_runline

		#replace %llvmgcc with actual path to llvmgcc
		regsub -all {%llvmgcc} $new_runline $llvmgcc new_runline

		#replace %llvmgxx with actual path to llvmg++
		regsub -all {%llvmgxx} $new_runline $llvmgxx new_runline
		
		puts $scriptFileId $new_runline
	    } elseif {[regexp {XFAIL:[ *](.+)} $line match targets]} {
		set targets
		

		#split up target if more then 1 specified
		foreach target [split $targets ,] {
		    if { [regexp {\*} $target match] } {
			set outcome XFAIL
		    } elseif { [regexp $target $target_triplet match] } {
			set outcome XFAIL
		    }
		    
		}
	    }
	    
	}
	
	close $testFileId
	close $scriptFileId
	
	
	if { $hasRunline == 0 } {
	    fail "$test: \nDoes not have a RUN line\n"
	} else {

	    #run script and catch errors
	    set retval [ catch {exec /bin/sh $script >& $output} ]
	    
	    if { $retval == 1 } {
		#Get output
		set outputFile [open $output {RDONLY}]
		set result [read $outputFile]
		close $outputFile
		file delete $outputFile
		
		switch $outcome {
		    PASS {
			file delete $output
			fail "$test: \n$result"
		    }
		    XFAIL {
			xfail "$test: \n$result"
		    }
		    default {
			file delete $output
			fail "$test: $result"
		    }
		}
	    } else {
		switch $outcome {
		    XFAIL {
			xpass "$test"
		    }
		    default {
			pass "$test"}
		}
	    }
	}
    }
}