backend.native: improve memory management using mem scopes

This commit is contained in:
Svyatoslav Scherbina
2016-10-19 13:31:00 +03:00
parent a1593c86f1
commit 25403723be
4 changed files with 36 additions and 21 deletions
@@ -66,9 +66,11 @@ internal class CodeGenerator(override val context:Context) : ContextUtils {
fun load(value:LLVMOpaqueValue, varName: String):LLVMOpaqueValue = LLVMBuildLoad(context.llvmBuilder, value, varName)!!
fun store(value:LLVMOpaqueValue, ptr:LLVMOpaqueValue):LLVMOpaqueValue = LLVMBuildStore(context.llvmBuilder, value, ptr)!!
fun call(descriptor: FunctionDescriptor, args: MutableList<LLVMOpaqueValue?>, result: String): LLVMOpaqueValue? {
val rargs = malloc(array[args.size](Ref to LLVMOpaqueValue))
args.forEachIndexed { i, llvmOpaqueValue -> rargs[i].value = args[i]}
return LLVMBuildCall(context.llvmBuilder, descriptor.llvmFunction.getLlvmValue(), rargs[0], args.size, result)
memScoped {
val rargs = alloc(array[args.size](Ref to LLVMOpaqueValue))
args.forEachIndexed { i, llvmOpaqueValue -> rargs[i].value = args[i] }
return LLVMBuildCall(context.llvmBuilder, descriptor.llvmFunction.getLlvmValue(), rargs[0], args.size, result)
}
}
}
@@ -107,9 +107,12 @@ internal interface ContextUtils {
*/
private fun getPtrToFirstElem(arrayPtr: CompileTimeValue): CompileTimeValue {
val indices = longArrayOf(0, 0).map { LLVMConstInt(LLVMInt32Type(), it, 0) }.toTypedArray()
val indicesNativeArrayPtr = mallocNativeArrayOf(LLVMOpaqueValue, *indices)[0] // TODO: dispose
return compileTimeValue(LLVMConstGEP(arrayPtr.getLlvmValue(), indicesNativeArrayPtr, indices.size))
memScoped {
val indicesNativeArrayPtr = allocNativeArrayOf(LLVMOpaqueValue, *indices)[0]
return compileTimeValue(LLVMConstGEP(arrayPtr.getLlvmValue(), indicesNativeArrayPtr, indices.size))
}
}
/**
@@ -1,8 +1,6 @@
package org.jetbrains.kotlin.backend.native.llvm
import kotlin_native.interop.Int8Box
import kotlin_native.interop.NativeArray
import kotlin_native.interop.mallocNativeArrayOf
import kotlin_native.interop.*
import llvm.*
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.utils.singletonOrEmptyList
@@ -24,9 +22,12 @@ internal class ConstArray(val elemType: LLVMOpaqueType?, val elements: List<Comp
override fun getLlvmValue(): LLVMOpaqueValue? {
val values = elements.map { it.getLlvmValue() }.toTypedArray()
val valuesNativeArrayPtr = mallocNativeArrayOf(LLVMOpaqueValue, *values)[0] // FIXME: dispose
return LLVMConstArray(elemType, valuesNativeArrayPtr, values.size)
memScoped {
val valuesNativeArrayPtr = allocNativeArrayOf(LLVMOpaqueValue, *values)[0]
return LLVMConstArray(elemType, valuesNativeArrayPtr, values.size)
}
}
}
@@ -36,8 +37,10 @@ internal open class Struct(val type: LLVMOpaqueType?, val elements: List<Compile
override fun getLlvmValue(): LLVMOpaqueValue? {
val values = elements.map { it.getLlvmValue() }.toTypedArray()
val valuesNativeArrayPtr = mallocNativeArrayOf(LLVMOpaqueValue, *values)[0] // FIXME: dispose
return LLVMConstNamedStruct(type, valuesNativeArrayPtr, values.size)
memScoped {
val valuesNativeArrayPtr = allocNativeArrayOf(LLVMOpaqueValue, *values)[0]
return LLVMConstNamedStruct(type, valuesNativeArrayPtr, values.size)
}
}
}
@@ -74,8 +77,11 @@ internal fun getLlvmFunctionType(function: FunctionDescriptor): LLVMOpaqueType?
val paramTypes = params.map { getLLVMType(it.type) }.toTypedArray()
if (paramTypes.size == 0) return LLVMFunctionType(returnType, null, 0, 0)
val paramTypesPtr = mallocNativeArrayOf(LLVMOpaqueType, *paramTypes)[0] // TODO: dispose
return LLVMFunctionType(returnType, paramTypesPtr, paramTypes.size, 0)
memScoped {
val paramTypesPtr = allocNativeArrayOf(LLVMOpaqueType, *paramTypes)[0]
return LLVMFunctionType(returnType, paramTypesPtr, paramTypes.size, 0)
}
}
/**
@@ -1,7 +1,8 @@
package org.jetbrains.kotlin.backend.native.llvm
import kotlin_native.interop.mallocNativeArrayOf
import kotlin_native.interop.allocNativeArrayOf
import kotlin_native.interop.memScoped
import llvm.*
import org.jetbrains.kotlin.backend.native.implementation
import org.jetbrains.kotlin.backend.native.implementedInterfaces
@@ -59,13 +60,16 @@ internal class RTTIGenerator(override val context: Context) : ContextUtils {
private fun createStructFor(className: FqName, fields: List<PropertyDescriptor>): LLVMOpaqueType? {
val classType = LLVMStructCreateNamed(LLVMGetModuleContext(context.llvmModule), "kclass:" + className)
val fieldTypes = fields.map { getLLVMType(it.returnType!!) }.toTypedArray()
val fieldTypesNativeArrayPtr = if (fieldTypes.size > 0) {
mallocNativeArrayOf(LLVMOpaqueType, *fieldTypes)[0] // TODO: dispose
} else {
null
}
LLVMStructSetBody(classType, fieldTypesNativeArrayPtr, fieldTypes.size, 0)
memScoped {
val fieldTypesNativeArrayPtr = if (fieldTypes.size > 0) {
allocNativeArrayOf(LLVMOpaqueType, *fieldTypes)[0]
} else {
null
}
LLVMStructSetBody(classType, fieldTypesNativeArrayPtr, fieldTypes.size, 0)
}
return classType
}