From e5d4dc932bf76ceadd08b72960ba40cdfa281414 Mon Sep 17 00:00:00 2001 From: Svyatoslav Scherbina Date: Thu, 17 Nov 2016 11:34:51 +0700 Subject: [PATCH] backend: don't generate the same string literal twice --- .../org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt | 2 +- .../org/jetbrains/kotlin/backend/konan/llvm/StaticData.kt | 6 ++++++ .../jetbrains/kotlin/backend/konan/llvm/StaticObjects.kt | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt index 28e3a08c3e3..788b27b6ffd 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt @@ -360,7 +360,7 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid IrConstKind.Int -> return LLVMConstInt(LLVMInt32Type(), (value.value as Int).toLong(), 1) IrConstKind.Long -> return LLVMConstInt(LLVMInt64Type(), value.value as Long, 1) IrConstKind.String -> - return context.staticData.createStringLiteral(value as IrConst).getLlvmValue() + return context.staticData.kotlinStringLiteral(value as IrConst).getLlvmValue() IrConstKind.Float -> return LLVMConstRealOfString(LLVMFloatType(), (value.value as Float).toString()) IrConstKind.Double -> return LLVMConstRealOfString(LLVMDoubleType(), (value.value as Double).toString()) } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/StaticData.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/StaticData.kt index 811b10ff189..39312eb7855 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/StaticData.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/StaticData.kt @@ -1,6 +1,7 @@ package org.jetbrains.kotlin.backend.konan.llvm import llvm.* +import org.jetbrains.kotlin.ir.expressions.IrConst /** * Provides utilities to create static data. @@ -108,4 +109,9 @@ internal class StaticData(override val context: Context): ContextUtils { return global } + + private val stringLiterals = mutableMapOf() + + fun kotlinStringLiteral(value: IrConst) = + stringLiterals.getOrPut(value.value) { createKotlinStringLiteral(value) } } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/StaticObjects.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/StaticObjects.kt index 504f581e752..6c894145014 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/StaticObjects.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/StaticObjects.kt @@ -21,7 +21,7 @@ private fun StaticData.staticContainerHeader(): Struct { return Struct(runtime.containerHeaderType, Int32(CONTAINER_TAG_NOCOUNT)) } -internal fun StaticData.createStringLiteral(value: IrConst): ConstPointer { +internal fun StaticData.createKotlinStringLiteral(value: IrConst): ConstPointer { val base64Str = value.value.globalHashBase64 val valueBytes = value.value.toByteArray(Charsets.UTF_8)