diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/ClassLayoutBuilder.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/ClassLayoutBuilder.kt index 12141ad6326..71c7cca7331 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/ClassLayoutBuilder.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/ClassLayoutBuilder.kt @@ -260,10 +260,11 @@ internal class GlobalHierarchyAnalysis(val context: Context, val irModule: IrMod } } -internal fun IrField.toFieldInfo() = - ClassLayoutBuilder.FieldInfo(name.asString(), type, - correspondingPropertySymbol?.owner?.isConst ?: false, - initializer?.expression is IrConst<*>, this) +internal fun IrField.toFieldInfo(): ClassLayoutBuilder.FieldInfo { + val isConst = correspondingPropertySymbol?.owner?.isConst ?: false + require(!isConst || initializer?.expression is IrConst<*>) { "A const val field ${render()} must have constant initializer" } + return ClassLayoutBuilder.FieldInfo(name.asString(), type, isConst, this) +} internal class ClassLayoutBuilder(val irClass: IrClass, val context: Context) { val vtableEntries: List by lazy { @@ -399,7 +400,7 @@ internal class ClassLayoutBuilder(val irClass: IrClass, val context: Context) { return context.getLayoutBuilder(superFunction.parentAsClass).itablePlace(superFunction) } - class FieldInfo(val name: String, val type: IrType, val isConst: Boolean, val hasConstInitializer: Boolean, val irField: IrField?) { + class FieldInfo(val name: String, val type: IrType, val isConst: Boolean, val irField: IrField?) { var index = -1 } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/CodeGenerator.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/CodeGenerator.kt index dba05e33590..f11737ca9f9 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/CodeGenerator.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/CodeGenerator.kt @@ -43,8 +43,7 @@ internal fun IrClass.hasConstStateAndNoSideEffects(context: Context): Boolean { if (!context.shouldOptimize()) return false if (this.hasAnnotation(KonanFqNames.canBePrecreated)) return true val fields = context.getLayoutBuilder(this).fields - return fields.all { it.isConst && it.hasConstInitializer } && - this.constructors.all { it.isAutogeneratedSimpleConstructor(context) } + return fields.all { it.isConst } && this.constructors.all { it.isAutogeneratedSimpleConstructor(context) } } internal class CodeGenerator(override val context: Context) : ContextUtils { diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrlinker.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrlinker.kt index 0b62511c2bd..5014910dd2b 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrlinker.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrlinker.kt @@ -154,7 +154,6 @@ internal object InlineFunctionBodyReferenceSerializer { class SerializedClassFieldInfo(val name: Int, val binaryType: Int, val type: Int, val flags: Int) { companion object { const val FLAG_IS_CONST = 1 - const val FLAG_CONST_INITIALIZER = 2 } } @@ -541,8 +540,6 @@ internal class KonanIrLinker( var flags = 0 if (field.isConst) flags = flags or SerializedClassFieldInfo.FLAG_IS_CONST - if (field.hasConstInitializer) - flags = flags or SerializedClassFieldInfo.FLAG_CONST_INITIALIZER val classifier = irField.type.classifierOrNull ?: error("Fields of type ${irField.type.render()} are not supported") val primitiveBinaryType = irField.type.computePrimitiveBinaryTypeOrNull() @@ -840,10 +837,7 @@ internal class KonanIrLinker( } } ClassLayoutBuilder.FieldInfo( - name, type, - isConst = (field.flags and SerializedClassFieldInfo.FLAG_IS_CONST) != 0, - hasConstInitializer = (field.flags and SerializedClassFieldInfo.FLAG_CONST_INITIALIZER) != 0, - irField = null) + name, type, isConst = (field.flags and SerializedClassFieldInfo.FLAG_IS_CONST) != 0, irField = null) } } }