translator: fix function result store

This commit is contained in:
e5l
2016-07-19 10:13:29 +03:00
parent e0696b6def
commit 1636726349
6 changed files with 38 additions and 31 deletions
+27 -16
View File
@@ -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
}
-6
View File
@@ -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)"}
+1 -1
View File
@@ -10,7 +10,7 @@ fun main(args: Array<String>) {
}
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()) {
@@ -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)
@@ -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()
}
@@ -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 = ""