backend.native: improve memory management using mem scopes
This commit is contained in:
+5
-3
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+5
-2
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+15
-9
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+11
-7
@@ -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
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user