From 25403723be4e5a029603dd978a486c6e74905c5a Mon Sep 17 00:00:00 2001 From: Svyatoslav Scherbina Date: Wed, 19 Oct 2016 13:31:00 +0300 Subject: [PATCH] backend.native: improve memory management using mem scopes --- .../backend/native/llvm/CodeGenerator.kt | 8 ++++--- .../backend/native/llvm/ContextUtils.kt | 7 ++++-- .../kotlin/backend/native/llvm/LlvmUtils.kt | 24 ++++++++++++------- .../backend/native/llvm/RTTIGenerator.kt | 18 ++++++++------ 4 files changed, 36 insertions(+), 21 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/CodeGenerator.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/CodeGenerator.kt index e4385de9246..aec90c0eccc 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/CodeGenerator.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/CodeGenerator.kt @@ -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, 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) + } } } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/ContextUtils.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/ContextUtils.kt index 97dc76328ac..4ab4ca692b8 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/ContextUtils.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/ContextUtils.kt @@ -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)) + } } /** diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/LlvmUtils.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/LlvmUtils.kt index 1f8e008b4a1..8fca993ec9f 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/LlvmUtils.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/LlvmUtils.kt @@ -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): 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 }