translator: add support parallel run tests, rearrangement test files

This commit is contained in:
Alexey Stepanov
2016-08-26 16:33:15 +03:00
parent 9b2164da82
commit 3268a0d756
185 changed files with 122 additions and 50 deletions
+1 -1
View File
@@ -2,7 +2,7 @@
.idea/shelf
dependencies
dist
translator/src/test/kotlin/tests/linked
translator/src/test/kotlin/tests/*/linked
out
tmp
workspace.xml
+17
View File
@@ -0,0 +1,17 @@
DIRECTORY = "src/test/kotlin/tests"
OUTPUT = $(shell ls ${DIRECTORY}/*/*.txt)
OBJECTS = $(OUTPUT:.txt=.out)
green = '\033[0;32m'
red = '\033[0;31m'
lightRed = '\033[1;31m'
orange = '\033[0;33m'
nc = '\033[0m'
%.out: %.txt
@./run_one_test.sh $(@:.out=.txt)
all: $(OBJECTS)
@echo "ok"
.PHONY: all
+76
View File
@@ -0,0 +1,76 @@
#!/bin/bash
green='\033[0;32m'
red='\033[0;31m'
lightRed='\033[1;31m'
orange='\033[0;33m'
cd ../translator
i=$1
TEST=`basename $i ".txt"`
DIRECTORY="src/test/kotlin/tests"
MAIN="$DIRECTORY/$TEST/linked/main.c"
rm -f $DIRECTORY/$TEST/linked/*
echo "#include <stdlib.h>" >> $MAIN
echo "#include <stdio.h>" >> $MAIN
echo "#include <assert.h>" >> $MAIN
echo "int main(){" >> $MAIN
echo "printf(\"%stest: $TEST%s\n\", \"\x1B[33m\", \"\x1B[0m\");" >> $MAIN
cat "$i" | while read LINE
do
echo " assert($LINE);" >> $MAIN
echo " printf(\"%s[OK]:%s $LINE\n\", \"\x1B[32m\", \"\x1B[0m\");" >> $MAIN
done
echo "printf(\"TEST RESULT: OK\n\");" >> $MAIN
echo "return 0;}" >> $MAIN
if [ $? -ne 0 ]; then
echo -e "${orange}test: ${TEST}${nc}"
echo -e "${red}Error somewhere in main.c generation${nc}"
exit 1
fi
clang-3.6 -S -emit-llvm $DIRECTORY/$TEST/linked/main.c -o $DIRECTORY/$TEST/linked/main.ll -Wno-implicit-function-declaration
if [ $? -ne 0 ]; then
echo -e "${orange}test: ${TEST}${nc}"
echo -e "${red}Error building main.c${nc}"
exit 1
fi
cp ../kotstd/build/stdlib_x86.ll $DIRECTORY/$TEST/linked/
if [ $? -ne 0 ]; then
echo -e "${orange}test: ${TEST}${nc}"
echo -e "${red}Error copying ../kotstd/build/stdlib_x86.ll to ${DIRECTORY}/${TEST}/linked/${nc}"
exit 1
fi
if [ -f "$DIRECTORY/$TEST/$TEST.c" ]
then
clang-3.6 -S -emit-llvm "$DIRECTORY/$TEST/$TEST.c" -o $DIRECTORY/$TEST/linked/$TEST"_c.ll" -Wno-implicit-function-declaration
if [ $? -ne 0 ]; then
echo -e "${orange}test: ${TEST}${nc}"
echo -e "${red}Error building: ${DIRECTORY}/${TEST}/linked/${TEST}_c.ll${nc}"
fi
fi
java -jar build/libs/translator-1.0.jar -I ../kotstd/include $DIRECTORY/$TEST/$TEST.kt > $DIRECTORY/$TEST/linked/$TEST.ll
if [ $? -ne 0 ]; then
echo -e "${orange}test: ${TEST}${nc}"
echo -e "${red}Translation error: ${DIRECTORY}/$TEST/${TEST}.kt${nc}"
fi
llvm-link-3.6 -S $DIRECTORY/$TEST/linked/*.ll > $DIRECTORY/$TEST/linked/run.ll
if [ $? -ne 0 ]; then
echo -e "${orange}test: ${TEST}${nc}"
echo -e "${red}Error linking with llvm${nc}"
fi
lli-3.6 $DIRECTORY/$TEST/linked/run.ll
if [ $? -ne 0 ]; then
echo -e "${orange}test: ${TEST}${nc}"
echo -e "${lightRed}Error running test${nc}"
fi
+16 -24
View File
@@ -5,15 +5,6 @@ lightRed='\033[1;31m'
orange='\033[0;33m'
nc='\033[0m'
if [ ! -d "src/test/kotlin/tests/linked" ]; then
mkdir -p "src/test/kotlin/tests/linked"
fi
if [ $? -ne 0 ]; then
echo -e "${red}Error creating folder \"src/test/kotlin/tests/linked\"${nc}"
exit 1
fi
if [ "$3" == "--debug" ]; then
cd ../kotstd && make clean && make debug
else
@@ -28,18 +19,18 @@ fi
cd ../translator
DIRECTORY="src/test/kotlin/tests"
MAIN="$DIRECTORY/linked/main.c"
TESTS=$( ls $DIRECTORY/input/* $1) # Note that "ls $DIRECTORY/input $1" is wrong. Why? Because it's bash.
TESTS=$( ls $DIRECTORY/*/*.txt $1) # Note that "ls $DIRECTORY/input $1" is wrong. Why? Because it's bash.
if [ "$2" == "--proto" ]; then
TESTS=$( ls $DIRECTORY/input/proto* $1)
TESTS=$( ls $DIRECTORY/*/proto*.txt $1)
fi
total_scripts=0
successful_scripts=0
for i in $TESTS; do
rm -f $DIRECTORY/linked/*
TEST=`basename $i ".txt"`
TEST=`basename $i ".txt"`
MAIN="$DIRECTORY/$TEST/linked/main.c"
rm -f $DIRECTORY/$TEST/linked/*
successful=1
echo -e "${orange}test: ${TEST}${nc}"
echo "#include <stdlib.h>" >> $MAIN
@@ -61,40 +52,41 @@ for i in $TESTS; do
exit 1
fi
clang-3.6 -S -emit-llvm $DIRECTORY/linked/main.c -o $DIRECTORY/linked/main.ll -Wno-implicit-function-declaration
clang-3.6 -S -emit-llvm $DIRECTORY/$TEST/linked/main.c -o $DIRECTORY/$TEST/linked/main.ll -Wno-implicit-function-declaration
if [ $? -ne 0 ]; then
echo -e "${red}Error building main.c${nc}"
exit 1
fi
cp ../kotstd/build/stdlib_x86.ll $DIRECTORY/linked/
cp ../kotstd/build/stdlib_x86.ll $DIRECTORY/$TEST/linked/
if [ $? -ne 0 ]; then
echo -e "${red}Error copying ../kotstd/build/stdlib_x86.ll to ${DIRECTORY}/linked/${nc}"
echo -e "${red}Error copying ../kotstd/build/stdlib_x86.ll to ${DIRECTORY}/${TEST}/linked/${nc}"
exit 1
fi
if [ -f "$DIRECTORY/c/$TEST.c" ]
if [ -f "$DIRECTORY/$TEST/$TEST.c" ]
then
clang-3.6 -S -emit-llvm "$DIRECTORY/c/$TEST.c" -o $DIRECTORY/linked/$TEST"_c.ll" -Wno-implicit-function-declaration
clang-3.6 -S -emit-llvm "$DIRECTORY/$TEST/$TEST.c" -o $DIRECTORY/$TEST/linked/$TEST"_c.ll" -Wno-implicit-function-declaration
if [ $? -ne 0 ]; then
echo -e "${red}Error building: ${DIRECTORY}/linked/${TEST}_c.ll${nc}"
echo -e "${red}Error building: ${DIRECTORY}/${TEST}/linked/${TEST}_c.ll${nc}"
fi
fi
java -jar build/libs/translator-1.0.jar -I ../kotstd/include $DIRECTORY/kotlin/$TEST.kt > $DIRECTORY/linked/$TEST.ll
java -jar build/libs/translator-1.0.jar -I ../kotstd/include $DIRECTORY/$TEST/$TEST.kt > $DIRECTORY/$TEST/linked/$TEST.ll
if [ $? -ne 0 ]; then
echo -e "${red}Translation error: ${DIRECTORY}/kotlin/${TEST}.kt${nc}"
echo -e "${red}Translation error: ${DIRECTORY}/$TEST/${TEST}.kt${nc}"
successful=0
fi
llvm-link-3.6 -S $DIRECTORY/linked/*.ll > $DIRECTORY/linked/run.ll
llvm-link-3.6 -S $DIRECTORY/$TEST/linked/*.ll > $DIRECTORY/$TEST/linked/run.ll
if [ $? -ne 0 ]; then
echo -e "${red}Error linking with llvm${nc}"
successful=0
fi
lli-3.6 $DIRECTORY/linked/run.ll
lli-3.6 $DIRECTORY/$TEST/linked/run.ll
if [ $? -ne 0 ]; then
echo -e "${lightRed}Error running test${nc}"
successful=0
@@ -34,7 +34,6 @@ abstract class StructCodegen(val state: TranslationState,
var methods = HashMap<String, FunctionCodegen>()
abstract val structName: String
val fullName: String
//get() = "${if (type.location.size > 0) "${type.location.joinToString(".")}." else ""}$structName"
get() = structName
open fun prepareForGenerate() {
@@ -106,8 +105,6 @@ abstract class StructCodegen(val state: TranslationState,
enumFields.put(name, field)
}
is KtClass -> {
//declaration.fqName?.asString() ?: declaration.name!!
//declaration.fqName!!.asString()
nestedClasses.put(declaration.fqName!!.asString(),
ClassCodegen(state,
VariableManager(state.globalVariableCollection),
@@ -176,7 +173,6 @@ abstract class StructCodegen(val state: TranslationState,
private fun generatePrimaryConstructor() {
val argFields = ArrayList<LLVMVariable>()
val classVal = LLVMVariable("classvariable.this", type, pointer = 1)
variableManager.addVariable("this", classVal, 0)
@@ -253,17 +249,10 @@ abstract class StructCodegen(val state: TranslationState,
protected fun resolveType(field: KtNamedDeclaration, ktType: KotlinType): LLVMClassVariable {
val annotations = parseFieldAnnotations(field)
/*val fieldName = when(field) {
is KtParameter->
else ->
}*/
//}
val fieldName = state.bindingContext.get(BindingContext.VALUE_PARAMETER, field as?KtParameter)?.fqNameSafe?.asString()?.replace(".<init>", "")
?: field.fqName?.asString() ?: field.name!!
val result = LLVMInstanceOfStandardType(fieldName, ktType, LLVMRegisterScope(), state = state)
//throw RuntimeException("Unknown field " + field.name!!)
if (result.type is LLVMReferenceType) {
val type = result.type as LLVMReferenceType
@@ -36,8 +36,7 @@ fun LLVMInstanceOfStandardType(name: String, type: KotlinType, scope: LLVMScope
else -> {
val declarationDescriptor = type.constructor.declarationDescriptor!!
val refName = declarationDescriptor.fqNameSafe.asString()
val targetPackage = declarationDescriptor.fqNameSafe.parent().asString()
val refType = state.classes[type.toString()]?.type ?: LLVMReferenceType(refName, packageName = targetPackage, align = TranslationState.pointerAlign, prefix = "class")
val refType = state.classes[type.toString()]?.type ?: LLVMReferenceType(refName, align = TranslationState.pointerAlign, prefix = "class")
val result = LLVMVariable(name, refType, name, scope, pointer = 1)
var currentPrefix = ""
@@ -4,7 +4,7 @@ import org.kotlinnative.translator.llvm.LLVMExpression
import org.kotlinnative.translator.llvm.LLVMSingleValue
class LLVMBooleanType() : LLVMType("kotlin") {
class LLVMBooleanType() : LLVMType() {
//TODO switch by types: int + double = int
override fun operatorMinus(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression =
@@ -3,7 +3,7 @@ package org.kotlinnative.translator.llvm.types
import org.kotlinnative.translator.llvm.LLVMExpression
import org.kotlinnative.translator.llvm.LLVMSingleValue
class LLVMByteType() : LLVMType("kotlin") {
class LLVMByteType() : LLVMType() {
override fun operatorLt(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression =
LLVMExpression(LLVMBooleanType(), "icmp slt i8 $firstOp, $secondOp")
@@ -3,7 +3,7 @@ package org.kotlinnative.translator.llvm.types
import org.kotlinnative.translator.llvm.LLVMExpression
import org.kotlinnative.translator.llvm.LLVMSingleValue
class LLVMCharType() : LLVMType("kotlin") {
class LLVMCharType() : LLVMType() {
override fun operatorLt(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression =
LLVMExpression(LLVMBooleanType(), "icmp slt i8 $firstOp, $secondOp")
@@ -4,7 +4,7 @@ import org.kotlinnative.translator.llvm.LLVMExpression
import org.kotlinnative.translator.llvm.LLVMSingleValue
class LLVMDoubleType() : LLVMType("kotlin") {
class LLVMDoubleType() : LLVMType() {
//TODO switch by types: int + double = int
override fun operatorMinus(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression =
@@ -4,7 +4,7 @@ import org.kotlinnative.translator.llvm.LLVMExpression
import org.kotlinnative.translator.llvm.LLVMSingleValue
class LLVMFloatType() : LLVMType("kotlin") {
class LLVMFloatType() : LLVMType() {
//TODO switch by types: int + double = int
override fun operatorMinus(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression =
@@ -5,7 +5,7 @@ import org.kotlinnative.translator.llvm.LLVMExpression
import org.kotlinnative.translator.llvm.LLVMSingleValue
class LLVMIntType() : LLVMType("kotlin") {
class LLVMIntType() : LLVMType() {
override fun operatorOr(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression =
LLVMExpression(LLVMIntType(), "or i32 $firstOp, $secondOp")
@@ -5,7 +5,7 @@ import org.kotlinnative.translator.llvm.LLVMExpression
import org.kotlinnative.translator.llvm.LLVMSingleValue
class LLVMLongType() : LLVMType("kotlin") {
class LLVMLongType() : LLVMType() {
override fun operatorOr(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression =
LLVMExpression(LLVMLongType(), "or i64 $firstOp, $secondOp")
@@ -9,8 +9,7 @@ class LLVMReferenceType(val type: String,
var prefix: String = "",
override var align: Int = TranslationState.pointerAlign,
override var size: Int = TranslationState.pointerSize,
packageName: String = "",
var byRef: Boolean = true) : LLVMReferred, LLVMType(packageName) {
var byRef: Boolean = true) : LLVMReferred, LLVMType() {
override val defaultValue: String = "null"
@@ -3,7 +3,7 @@ package org.kotlinnative.translator.llvm.types
import org.kotlinnative.translator.llvm.LLVMExpression
import org.kotlinnative.translator.llvm.LLVMSingleValue
class LLVMShortType() : LLVMType("kotlin") {
class LLVMShortType() : LLVMType() {
override fun operatorLt(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression =
LLVMExpression(LLVMBooleanType(), "icmp slt i16 $firstOp, $secondOp")
@@ -1,6 +1,6 @@
package org.kotlinnative.translator.llvm.types
class LLVMStringType(override val length: Int, var isLoaded: Boolean = true) : LLVMArray, LLVMType("kotlin") {
class LLVMStringType(override val length: Int, var isLoaded: Boolean = true) : LLVMArray, LLVMType() {
override var size: Int = 1
override val align = 8
@@ -4,7 +4,7 @@ import org.kotlinnative.translator.exceptions.UnimplementedException
import org.kotlinnative.translator.llvm.LLVMExpression
import org.kotlinnative.translator.llvm.LLVMSingleValue
abstract class LLVMType(val packageName: String = "") : Cloneable {
abstract class LLVMType() : Cloneable {
open fun operatorPlus(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression = throw UnimplementedException()
open fun operatorTimes(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression = throw UnimplementedException()

Some files were not shown because too many files have changed in this diff Show More