diff --git a/car_llvmkot/kotlib/kotlin_main.ll b/car_llvmkot/kotlib/kotlin_main.ll index 461f3839abd..d8e32d0047e 100644 --- a/car_llvmkot/kotlib/kotlin_main.ll +++ b/car_llvmkot/kotlib/kotlin_main.ll @@ -1,7 +1,8 @@ declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32, i1) -declare i8* @malloc(i32) +declare i8* @malloc_static(i32) +attributes #0 = { nounwind "stack-protector-buffer-size"="8" "target-cpu"="cortex-m3" "target-features"="+hwdiv,+strict-align" } %class.ComplexRef = type { i32, %class.Simple* } -define void @ComplexRef(%class.ComplexRef* %classvariable.this, i32 %i, %class.Simple* %s) +define void @ComplexRef(%class.ComplexRef* %classvariable.this, i32 %i, %class.Simple* %s) #0 { %classvariable.this.addr = alloca %class.ComplexRef, align 4 %i.addr = alloca i32, align 4 @@ -17,7 +18,7 @@ call void @llvm.memcpy.p0i8.p0i8.i64(i8* %var4, i8* %var5, i64 8, i32 4, i1 fals ret void } %class.Simple = type { i32 } -define void @Simple(%class.Simple* %classvariable.this, i32 %i) +define void @Simple(%class.Simple* %classvariable.this, i32 %i) #0 { %classvariable.this.addr = alloca %class.Simple, align 4 %i.addr = alloca i32, align 4 @@ -30,20 +31,30 @@ store i32 %var6, i32* %var7, align 4 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %var8, i8* %var9, i64 4, i32 4, i1 false) ret void } -define void @main() +define void @myFunction(%class.ComplexRef* %ref) #0 { -%var11 = call i8* @malloc(i32 4) -%var10 = bitcast i8* %var11 to %class.Simple* -call void @Simple(%class.Simple* %var10, i32 5) -%managed.s.1 = alloca %class.Simple, align 4 -%var12 = load %class.Simple* %var10, align 4 -store %class.Simple %var12, %class.Simple* %managed.s.1, align 4 -%var14 = call i8* @malloc(i32 4) -%var13 = bitcast i8* %var14 to %class.ComplexRef* -call void @ComplexRef(%class.ComplexRef* %var13, i32 1, %class.Simple* %managed.s.1) -%managed.i.1 = alloca %class.ComplexRef, align 4 -%var15 = load %class.ComplexRef* %var13, align 4 -store %class.ComplexRef %var15, %class.ComplexRef* %managed.i.1, align 4 +%var10 = getelementptr inbounds %class.ComplexRef* %ref, i32 0, i32 0 +%var11 = load i32* %var10, align 4 +store i32 1, i32* %var10, align 4 +ret void +} +define i32 @const(i32 %i) #0 +{ +%i.addr = alloca i32, align 4 +store i32 %i, i32* %i.addr, align 4 +%var12 = load i32* %i.addr, align 4 +ret i32 %var12 +} +define void @kotlin_main() #0 +{ +%var13 = add nsw i32 3, 4 +%var14 = call i32 @const(i32 %var13) +%var15 = alloca i32, align 4 +store i32 %var14, i32* %var15, align 4 +%var16 = load i32* %var15, align 4 +%var17 = call i32 @const(i32 %var16) +%var18 = alloca i32, align 4 +store i32 %var17, i32* %var18, align 4 ret void } diff --git a/car_llvmkot/kotlib/memory.ll b/car_llvmkot/kotlib/memory.ll index 0c043d1e97b..d5abdca4b13 100644 --- a/car_llvmkot/kotlib/memory.ll +++ b/car_llvmkot/kotlib/memory.ll @@ -85,9 +85,3 @@ define i8* @malloc_dynamic(i32 %size) #0 { attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } -!llvm.module.flags = !{!0, !1} -!llvm.ident = !{!2} - -!0 = !{i32 1, !"wchar_size", i32 4} -!1 = !{i32 1, !"min_enum_size", i32 4} -!2 = !{!"Ubuntu clang version 3.6.2-3ubuntu2 (tags/RELEASE_362/final) (based on LLVM 3.6.2)"} diff --git a/translator/src/main/kotlin/main.kt b/translator/src/main/kotlin/main.kt index 74d15cdca22..92c79a6085e 100644 --- a/translator/src/main/kotlin/main.kt +++ b/translator/src/main/kotlin/main.kt @@ -10,7 +10,7 @@ fun main(args: Array) { } val disposer = Disposer.newDisposable() - val state = parseAndAnalyze(args.asList(), disposer, arm = false) + val state = parseAndAnalyze(args.asList(), disposer, arm = true) val files = state.environment.getSourceFiles() if (files.isEmpty()) { diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt index 5c97040677b..69fbb2ffd21 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt @@ -311,8 +311,7 @@ class FunctionCodegen(val state: TranslationState, val variableManager: Variable for (arg in args) { val currentExpression = evaluateExpression(arg.getArgumentExpression(), scopeDepth) as LLVMSingleValue - val nativeExpression = codeBuilder.receiveNativeValue(currentExpression) - result.add(nativeExpression) + result.add(currentExpression) } return result @@ -448,6 +447,7 @@ class FunctionCodegen(val state: TranslationState, val variableManager: Variable private fun copyVariable(from: LLVMVariable, to: LLVMVariable) = when (from.type) { is LLVMStringType -> codeBuilder.storeString(to, from, 0) + is LLVMReferenceType -> codeBuilder.copyVariableRef(to, from) else -> codeBuilder.copyVariableValue(to, from) } @@ -459,10 +459,7 @@ class FunctionCodegen(val state: TranslationState, val variableManager: Variable when (assignExpression) { is LLVMVariable -> { - val allocVar = variableManager.receiveVariable(identifier!!.text, assignExpression.type, LLVMRegisterScope(), pointer = 1) - codeBuilder.allocStackVar(allocVar) - variableManager.addVariable(identifier.text, allocVar, scopeDepth) - copyVariable(assignExpression, allocVar) + variableManager.addVariable(identifier!!.text, assignExpression, scopeDepth) } is LLVMConstant -> { val newVar = variableManager.receiveVariable(identifier!!.text, assignExpression.type!!, LLVMRegisterScope(), pointer = 1) 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 8c73ebeec78..73c29b21096 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt @@ -162,6 +162,10 @@ class LLVMBuilder(val arm: Boolean) { localCode.appendln("store ${target.type} $from, ${target.getType()} $target, align ${from.type.align}") } + fun copyVariableRef(to: LLVMVariable, from: LLVMVariable) { + var i = 1 + } + fun loadArgument(llvmVariable: LLVMVariable, store: Boolean = true): LLVMVariable { val allocVar = LLVMVariable("${llvmVariable.label}.addr", llvmVariable.type, llvmVariable.kotlinName, LLVMRegisterScope(), pointer = llvmVariable.pointer + 1) addVariableByRef(allocVar, llvmVariable, store) @@ -174,7 +178,7 @@ class LLVMBuilder(val arm: Boolean) { } fun allocStackVar(target: LLVMVariable) { - localCode.appendln("$target = alloca ${target.type}, align ${target.type.align}") + localCode.appendln("$target = alloca ${target.getType()}, align ${target.type.align}") } fun allocStaticVar(target: LLVMVariable) { @@ -239,4 +243,5 @@ class LLVMBuilder(val arm: Boolean) { } override fun toString() = globalCode.toString() + localCode.toString() + } \ No newline at end of file diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMReferenceType.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMReferenceType.kt index b4f458512f3..80090dc9f71 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMReferenceType.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMReferenceType.kt @@ -2,7 +2,7 @@ package org.kotlinnative.translator.llvm.types import java.util.* -class LLVMReferenceType(val type: String, var prefix: String = "", override val align: Int = 4, var byRef: Boolean = false) : LLVMType() { +class LLVMReferenceType(val type: String, var prefix: String = "", override val align: Int = 4, var byRef: Boolean = true) : LLVMType() { override val defaultValue: String = ""