From 64cb79ab7a0bec736d9a52c52a78d308f2c03e07 Mon Sep 17 00:00:00 2001 From: Elena Lepilkina Date: Tue, 21 Jan 2020 16:59:42 +0300 Subject: [PATCH] Cache calculated LLVMRefs for IrType and external functions --- .../org/jetbrains/kotlin/backend/konan/llvm/ContextUtils.kt | 5 +++-- .../org/jetbrains/kotlin/backend/konan/llvm/DataLayout.kt | 2 +- .../src/org/jetbrains/kotlin/backend/konan/llvm/Runtime.kt | 4 ++++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/ContextUtils.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/ContextUtils.kt index a16c0a8cc26..0fac988ca61 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/ContextUtils.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/ContextUtils.kt @@ -164,8 +164,9 @@ internal interface ContextUtils : RuntimeAware { assert(this.isReal) return if (isExternal(this)) { - context.llvm.externalFunction(this.symbolName, getLlvmFunctionType(this), - origin = this.llvmSymbolOrigin) + runtime.addedLLVMExternalFunctions.getOrPut(this) { context.llvm.externalFunction(this.symbolName, getLlvmFunctionType(this), + origin = this.llvmSymbolOrigin) } + } else { context.llvmDeclarations.forFunctionOrNull(this)?.llvmFunction } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/DataLayout.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/DataLayout.kt index 71542ec7c74..b9da8cafac9 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/DataLayout.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/DataLayout.kt @@ -28,7 +28,7 @@ private fun RuntimeAware.getLlvmType(primitiveBinaryType: PrimitiveBinaryType?) } internal fun RuntimeAware.getLLVMType(type: IrType): LLVMTypeRef = - getLlvmType(type.computePrimitiveBinaryTypeOrNull()) + runtime.calculatedLLVMTypes.getOrPut(type) { getLlvmType(type.computePrimitiveBinaryTypeOrNull()) } internal fun RuntimeAware.getLLVMType(type: DataFlowIR.Type) = getLlvmType(type.primitiveBinaryType) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/Runtime.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/Runtime.kt index de6ebe82476..15b890aa1da 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/Runtime.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/Runtime.kt @@ -7,6 +7,8 @@ package org.jetbrains.kotlin.backend.konan.llvm import kotlinx.cinterop.* import llvm.* +import org.jetbrains.kotlin.ir.types.IrType +import org.jetbrains.kotlin.ir.declarations.IrFunction interface RuntimeAware { val runtime: Runtime @@ -14,6 +16,8 @@ interface RuntimeAware { class Runtime(bitcodeFile: String) { val llvmModule: LLVMModuleRef = parseBitcodeFile(bitcodeFile) + val calculatedLLVMTypes: MutableMap = HashMap() + val addedLLVMExternalFunctions: MutableMap = HashMap() internal fun getStructTypeOrNull(name: String) = LLVMGetTypeByName(llvmModule, "struct.$name") internal fun getStructType(name: String) = getStructTypeOrNull(name)