From 7d4e608072513671c3775ca95ce698df708c6d42 Mon Sep 17 00:00:00 2001 From: e5l Date: Tue, 19 Jul 2016 17:14:19 +0300 Subject: [PATCH] translator: reference type move without copy, tests --- car_llvmkot/kotlib/kotlin_main.ll | 35 +++++++++++++------ .../kotlinnative/translator/ClassCodegen.kt | 1 - .../kotlinnative/translator/ObjectCodegen.kt | 4 +-- .../translator/llvm/LLVMBuilder.kt | 18 +++++++--- .../translator/llvm/types/LLVMEnumItemType.kt | 3 -- .../test/kotlin/tests/input/nullable_1.txt | 2 ++ .../test/kotlin/tests/kotlin/nullable_1.kt | 18 ++++++++++ 7 files changed, 61 insertions(+), 20 deletions(-) create mode 100644 translator/src/test/kotlin/tests/input/nullable_1.txt create mode 100644 translator/src/test/kotlin/tests/kotlin/nullable_1.kt diff --git a/car_llvmkot/kotlib/kotlin_main.ll b/car_llvmkot/kotlib/kotlin_main.ll index e0b9dce0fcf..80efca64166 100644 --- a/car_llvmkot/kotlib/kotlin_main.ll +++ b/car_llvmkot/kotlib/kotlin_main.ll @@ -1,14 +1,29 @@ declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32, i1) -declare i8* @malloc_static(i32) -attributes #0 = { nounwind "stack-protector-buffer-size"="8" "target-cpu"="cortex-m3" "target-features"="+hwdiv,+strict-align" } -define i32 @reassigment_1(i32 %x) #0 +declare i8* @malloc(i32) +%class.MyClass = type { i32 } +define void @MyClass(%class.MyClass* %classvariable.this, i32 %i) { -%x.addr = alloca i32, align 4 -store i32 %x, i32* %x.addr, align 4 -%var1 = load i32* %x.addr, align 4 -%var2 = add nsw i32 %var1, 1 -%var3 = add nsw i32 %var2, 1 -store i32 %var3, i32 %var2, align 4 -ret i32 %var2 +%classvariable.this.addr = alloca %class.MyClass, align 4 +%i.addr = alloca i32, align 4 +store i32 %i, i32* %i.addr, align 4 +%var1 = load i32* %i.addr, align 4 +%var2 = getelementptr inbounds %class.MyClass* %classvariable.this.addr, i32 0, i32 0 +store i32 %var1, i32* %var2, align 4 +%var3 = bitcast %class.MyClass* %classvariable.this to i8* +%var4 = bitcast %class.MyClass* %classvariable.this.addr to i8* +call void @llvm.memcpy.p0i8.p0i8.i64(i8* %var3, i8* %var4, i64 4, i32 4, i1 false) +ret void +} +define void @main() +{ +%a = alloca %class.MyClass*, align 4 +store %class.MyClass* null, %class.MyClass** %a, align 4 +%var5 = load %class.MyClass** %a, align 4 +%var7 = call i8* @malloc(i32 4) +%var6 = bitcast i8* %var7 to %class.MyClass* +call void @MyClass(%class.MyClass* %var6, i32 2) +%var8 = load %class.MyClass* %var5, align 4 +%var9 = load %class.MyClass* %var6, align 4 +ret void } diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/ClassCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/ClassCodegen.kt index a58958eef81..62f83ed5a01 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/ClassCodegen.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/ClassCodegen.kt @@ -21,7 +21,6 @@ class ClassCodegen(override val state: TranslationState, override val variableMa override val structName: String override val type: LLVMType = LLVMReferenceType(clazz.name.toString(), "class", byRef = true) - init { structName = clazz.name.toString() val descriptor = state.bindingContext.get(BindingContext.CLASS, clazz) ?: throw TranslationException() diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/ObjectCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/ObjectCodegen.kt index e9d65ec581a..8cb84cd8c96 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/ObjectCodegen.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/ObjectCodegen.kt @@ -22,8 +22,8 @@ class ObjectCodegen(override val state: TranslationState, override val variableM fun generate() { generate(objectDeclaration.declarations) - val classInstance = LLVMVariable("object.instance.${structName}", type, objectDeclaration.name, LLVMVariableScope()) - codeBuilder.addGlobalIntialize(classInstance, type); + val classInstance = LLVMVariable("object.instance.$structName", type, objectDeclaration.name, LLVMVariableScope()) + codeBuilder.addGlobalIntialize(classInstance, type) variableManager.addGlobalVariable(structName, classInstance) } } diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt index bc221fa5efe..139bf6c0e70 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt @@ -3,10 +3,7 @@ package org.kotlinnative.translator.llvm import com.intellij.psi.tree.IElementType import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtSimpleNameExpression -import org.kotlinnative.translator.llvm.types.LLVMCharType -import org.kotlinnative.translator.llvm.types.LLVMIntType -import org.kotlinnative.translator.llvm.types.LLVMStringType -import org.kotlinnative.translator.llvm.types.LLVMType +import org.kotlinnative.translator.llvm.types.* class LLVMBuilder(val arm: Boolean) { private val POINTER_SIZE = 4 @@ -87,6 +84,19 @@ class LLVMBuilder(val arm: Boolean) { KtTokens.EQEQ -> firstOp.type!!.operatorEq(firstNativeOp, secondNativeOp) KtTokens.EXCLEQ -> firstOp.type!!.operatorNeq(firstNativeOp, secondNativeOp) KtTokens.EQ -> { + if (secondOp.type is LLVMNullType) { + val result = getNewVariable(firstOp.type!!, firstOp.pointer) + allocStackVar(result) + result.pointer++ + + storeNull(result) + return result + } + + if (firstOp.pointer > 0 && secondOp.pointer > 0) { + return secondOp as LLVMVariable + } + val result = firstOp as LLVMVariable storeVariable(result, secondNativeOp) return result diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMEnumItemType.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMEnumItemType.kt index 2739286f0f0..66aa5bdc67b 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMEnumItemType.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMEnumItemType.kt @@ -1,8 +1,5 @@ package org.kotlinnative.translator.llvm.types -import org.kotlinnative.translator.llvm.LLVMExpression -import org.kotlinnative.translator.llvm.LLVMSingleValue - class LLVMEnumItemType() : LLVMType() { diff --git a/translator/src/test/kotlin/tests/input/nullable_1.txt b/translator/src/test/kotlin/tests/input/nullable_1.txt new file mode 100644 index 00000000000..02c3e96bd33 --- /dev/null +++ b/translator/src/test/kotlin/tests/input/nullable_1.txt @@ -0,0 +1,2 @@ +nullable_test(1) == 2 +nullable_test_2(1) == 1 diff --git a/translator/src/test/kotlin/tests/kotlin/nullable_1.kt b/translator/src/test/kotlin/tests/kotlin/nullable_1.kt new file mode 100644 index 00000000000..0a8d3fb2b71 --- /dev/null +++ b/translator/src/test/kotlin/tests/kotlin/nullable_1.kt @@ -0,0 +1,18 @@ + +class MyAwesomeClass(var i: Int) + +fun nullable_test(i: Int): Int { + var x: MyAwesomeClass? = null + x = MyAwesomeClass(i) +// x = MyAwesomeClass(i + 1) + + return i + 1 +} + +fun nullable_test_2(i: Int): Int { +// var x: MyAwesomeClass? = MyAwesomeClass(i) +// x = null +// x = MyAwesomeClass(i) + + return i +} \ No newline at end of file