From ca9c4cde51a17e717a7535560e9530f12e3a6454 Mon Sep 17 00:00:00 2001 From: Svyatoslav Scherbina Date: Thu, 6 Dec 2018 09:39:16 +0300 Subject: [PATCH] Move Kotlin static data to read-only section --- .../kotlin/backend/konan/llvm/IrToBitcode.kt | 6 +++--- .../kotlin/backend/konan/llvm/RTTIGenerator.kt | 1 + .../kotlin/backend/konan/llvm/StaticData.kt | 2 +- .../kotlin/backend/konan/llvm/StaticObjects.kt | 17 ++++++++++------- 4 files changed, 15 insertions(+), 11 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 8e13d6efa8c..6e1aa1f363d 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 @@ -955,7 +955,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map`, but `createArrayList` expects `Array`; + // Note: dirty hack here: `vararg` has type `Array`, but `createConstArrayList` expects `Array`; // however `vararg` is immutable, and in current implementation it has type `Array`, // so let's ignore this mismatch currently for simplicity. - return context.llvm.staticData.createArrayList(array, length).llvm + return context.llvm.staticData.createConstArrayList(array, length).llvm } else -> TODO(callee.descriptor.original.toString()) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/RTTIGenerator.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/RTTIGenerator.kt index 617f5555ee0..127c63f0ef6 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/RTTIGenerator.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/RTTIGenerator.kt @@ -304,6 +304,7 @@ internal class RTTIGenerator(override val context: Context) : ContextUtils { Struct(runtime.extendedTypeInfoType, Int32(fields.size), offsetsPtr, typesPtr, namesPtr) } val result = staticData.placeGlobal("", value) + result.setConstant(true) return result.pointer } 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 d26c5b4a6d7..8b27ff9bebc 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 @@ -174,5 +174,5 @@ internal class StaticData(override val context: Context): ContextUtils { */ internal fun StaticData.createImmutableBlob(value: IrConst): LLVMValueRef { val args = value.value.map { Int8(it.toByte()).llvm } - return createKotlinArray(context.ir.symbols.immutableBlob.owner, args) + return createConstKotlinArray(context.ir.symbols.immutableBlob.owner, args) } \ No newline at end of file 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 3fdb107e194..001fbd5c22b 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 @@ -38,7 +38,7 @@ internal fun StaticData.createKotlinStringLiteral(value: String): ConstPointer { val name = "kstr:" + value.globalHashBase64 val elements = value.toCharArray().map(::Char16) - val objRef = createKotlinArray(context.ir.symbols.string.owner, elements) + val objRef = createConstKotlinArray(context.ir.symbols.string.owner, elements) val res = createAlias(name, objRef) LLVMSetLinkage(res.llvm, LLVMLinkage.LLVMWeakAnyLinkage) @@ -48,10 +48,10 @@ internal fun StaticData.createKotlinStringLiteral(value: String): ConstPointer { private fun StaticData.createRef(objHeaderPtr: ConstPointer) = objHeaderPtr.bitcast(kObjHeaderPtr) -internal fun StaticData.createKotlinArray(arrayClass: IrClass, elements: List) = - createKotlinArray(arrayClass, elements.map { constValue(it) }).llvm +internal fun StaticData.createConstKotlinArray(arrayClass: IrClass, elements: List) = + createConstKotlinArray(arrayClass, elements.map { constValue(it) }).llvm -internal fun StaticData.createKotlinArray(arrayClass: IrClass, elements: List): ConstPointer { +internal fun StaticData.createConstKotlinArray(arrayClass: IrClass, elements: List): ConstPointer { val typeInfo = arrayClass.typeInfoPtr val bodyElementType: LLVMTypeRef = elements.firstOrNull()?.llvmType ?: int8Type @@ -66,11 +66,12 @@ internal fun StaticData.createKotlinArray(arrayClass: IrClass, elements: List` field. * @param length value for `length: Int` field. */ -internal fun StaticData.createArrayList(array: ConstPointer, length: Int): ConstPointer { +internal fun StaticData.createConstArrayList(array: ConstPointer, length: Int): ConstPointer { val arrayListClass = context.ir.symbols.arrayList.owner val arrayListFqName = arrayListClass.fqNameSafe @@ -123,7 +125,7 @@ internal fun StaticData.createArrayList(array: ConstPointer, length: Int): Const val body = Struct(*(sorted.values.toTypedArray())) - return createKotlinObject(arrayListClass, body) + return createConstKotlinObject(arrayListClass, body) } internal fun StaticData.createUniqueInstance( @@ -134,6 +136,7 @@ internal fun StaticData.createUniqueInstance( UniqueKind.EMPTY_ARRAY -> arrayHeader(typeInfo, 0) } val global = this.placeGlobal(kind.llvmName, objHeader, isExported = true) + global.setConstant(true) return global.pointer }