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 load(value:LLVMOpaqueValue, varName: String):LLVMOpaqueValue = LLVMBuildLoad(context.llvmBuilder, value, varName)!!
|
||||||
fun store(value:LLVMOpaqueValue, ptr:LLVMOpaqueValue):LLVMOpaqueValue = LLVMBuildStore(context.llvmBuilder, value, ptr)!!
|
fun store(value:LLVMOpaqueValue, ptr:LLVMOpaqueValue):LLVMOpaqueValue = LLVMBuildStore(context.llvmBuilder, value, ptr)!!
|
||||||
fun call(descriptor: FunctionDescriptor, args: MutableList<LLVMOpaqueValue?>, result: String): LLVMOpaqueValue? {
|
fun call(descriptor: FunctionDescriptor, args: MutableList<LLVMOpaqueValue?>, result: String): LLVMOpaqueValue? {
|
||||||
val rargs = malloc(array[args.size](Ref to LLVMOpaqueValue))
|
memScoped {
|
||||||
args.forEachIndexed { i, llvmOpaqueValue -> rargs[i].value = args[i]}
|
val rargs = alloc(array[args.size](Ref to LLVMOpaqueValue))
|
||||||
return LLVMBuildCall(context.llvmBuilder, descriptor.llvmFunction.getLlvmValue(), rargs[0], args.size, result)
|
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 {
|
private fun getPtrToFirstElem(arrayPtr: CompileTimeValue): CompileTimeValue {
|
||||||
val indices = longArrayOf(0, 0).map { LLVMConstInt(LLVMInt32Type(), it, 0) }.toTypedArray()
|
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
|
package org.jetbrains.kotlin.backend.native.llvm
|
||||||
|
|
||||||
import kotlin_native.interop.Int8Box
|
import kotlin_native.interop.*
|
||||||
import kotlin_native.interop.NativeArray
|
|
||||||
import kotlin_native.interop.mallocNativeArrayOf
|
|
||||||
import llvm.*
|
import llvm.*
|
||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||||
import org.jetbrains.kotlin.utils.singletonOrEmptyList
|
import org.jetbrains.kotlin.utils.singletonOrEmptyList
|
||||||
@@ -24,9 +22,12 @@ internal class ConstArray(val elemType: LLVMOpaqueType?, val elements: List<Comp
|
|||||||
|
|
||||||
override fun getLlvmValue(): LLVMOpaqueValue? {
|
override fun getLlvmValue(): LLVMOpaqueValue? {
|
||||||
val values = elements.map { it.getLlvmValue() }.toTypedArray()
|
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? {
|
override fun getLlvmValue(): LLVMOpaqueValue? {
|
||||||
val values = elements.map { it.getLlvmValue() }.toTypedArray()
|
val values = elements.map { it.getLlvmValue() }.toTypedArray()
|
||||||
val valuesNativeArrayPtr = mallocNativeArrayOf(LLVMOpaqueValue, *values)[0] // FIXME: dispose
|
memScoped {
|
||||||
return LLVMConstNamedStruct(type, valuesNativeArrayPtr, values.size)
|
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()
|
val paramTypes = params.map { getLLVMType(it.type) }.toTypedArray()
|
||||||
if (paramTypes.size == 0) return LLVMFunctionType(returnType, null, 0, 0)
|
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
|
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 llvm.*
|
||||||
import org.jetbrains.kotlin.backend.native.implementation
|
import org.jetbrains.kotlin.backend.native.implementation
|
||||||
import org.jetbrains.kotlin.backend.native.implementedInterfaces
|
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? {
|
private fun createStructFor(className: FqName, fields: List<PropertyDescriptor>): LLVMOpaqueType? {
|
||||||
val classType = LLVMStructCreateNamed(LLVMGetModuleContext(context.llvmModule), "kclass:" + className)
|
val classType = LLVMStructCreateNamed(LLVMGetModuleContext(context.llvmModule), "kclass:" + className)
|
||||||
val fieldTypes = fields.map { getLLVMType(it.returnType!!) }.toTypedArray()
|
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
|
return classType
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user