[K/N] Initialize fields with ConstantValue initializers statically
This commit is contained in:
+7
-5
@@ -73,7 +73,7 @@ internal val IrField.storageKind: FieldStorageKind get() {
|
|||||||
internal fun IrField.needsGCRegistration(context: Context) =
|
internal fun IrField.needsGCRegistration(context: Context) =
|
||||||
context.memoryModel == MemoryModel.EXPERIMENTAL && // only for the new MM
|
context.memoryModel == MemoryModel.EXPERIMENTAL && // only for the new MM
|
||||||
type.binaryTypeIsReference() && // only for references
|
type.binaryTypeIsReference() && // only for references
|
||||||
(initializer?.expression !is IrConst<*>? || // which are initialized from heap object
|
(hasNonConstInitializer || // which are initialized from heap object
|
||||||
!isFinal) // or are not final
|
!isFinal) // or are not final
|
||||||
|
|
||||||
internal fun IrClass.storageKind(context: Context): ObjectStorageKind = when {
|
internal fun IrClass.storageKind(context: Context): ObjectStorageKind = when {
|
||||||
@@ -344,7 +344,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
|
|||||||
|
|
||||||
private fun FunctionGenerationContext.initGlobalField(irField: IrField) {
|
private fun FunctionGenerationContext.initGlobalField(irField: IrField) {
|
||||||
val address = context.llvmDeclarations.forStaticField(irField).storageAddressAccess.getAddress(this)
|
val address = context.llvmDeclarations.forStaticField(irField).storageAddressAccess.getAddress(this)
|
||||||
val initialValue = if (irField.initializer?.expression !is IrConst<*>?) {
|
val initialValue = if (irField.hasNonConstInitializer) {
|
||||||
val initialization = evaluateExpression(irField.initializer!!.expression)
|
val initialization = evaluateExpression(irField.initializer!!.expression)
|
||||||
if (irField.shouldBeFrozen(context))
|
if (irField.shouldBeFrozen(context))
|
||||||
freeze(initialization, currentCodeContext.exceptionHandler)
|
freeze(initialization, currentCodeContext.exceptionHandler)
|
||||||
@@ -943,11 +943,13 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
|
|||||||
if (context.needGlobalInit(declaration)) {
|
if (context.needGlobalInit(declaration)) {
|
||||||
val type = codegen.getLLVMType(declaration.type)
|
val type = codegen.getLLVMType(declaration.type)
|
||||||
val globalPropertyAccess = context.llvmDeclarations.forStaticField(declaration).storageAddressAccess
|
val globalPropertyAccess = context.llvmDeclarations.forStaticField(declaration).storageAddressAccess
|
||||||
val initializer = declaration.initializer?.expression as? IrConst<*>
|
val initializer = declaration.initializer?.expression
|
||||||
val globalProperty = (globalPropertyAccess as? GlobalAddressAccess)?.getAddress(null)
|
val globalProperty = (globalPropertyAccess as? GlobalAddressAccess)?.getAddress(null)
|
||||||
if (globalProperty != null) {
|
if (globalProperty != null) {
|
||||||
LLVMSetInitializer(globalProperty, if (initializer != null)
|
LLVMSetInitializer(globalProperty, when (initializer) {
|
||||||
evaluateExpression(initializer) else LLVMConstNull(type))
|
is IrConst<*>, is IrConstantValue -> evaluateExpression(initializer)
|
||||||
|
else -> LLVMConstNull(type)
|
||||||
|
})
|
||||||
// (Cannot do this before the global is initialized).
|
// (Cannot do this before the global is initialized).
|
||||||
LLVMSetLinkage(globalProperty, LLVMLinkage.LLVMInternalLinkage)
|
LLVMSetLinkage(globalProperty, LLVMLinkage.LLVMInternalLinkage)
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-14
@@ -14,20 +14,14 @@ import org.jetbrains.kotlin.backend.konan.llvm.FieldStorageKind
|
|||||||
import org.jetbrains.kotlin.backend.konan.llvm.needsGCRegistration
|
import org.jetbrains.kotlin.backend.konan.llvm.needsGCRegistration
|
||||||
import org.jetbrains.kotlin.backend.konan.llvm.storageKind
|
import org.jetbrains.kotlin.backend.konan.llvm.storageKind
|
||||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
||||||
import org.jetbrains.kotlin.ir.IrStatement
|
|
||||||
import org.jetbrains.kotlin.ir.builders.*
|
import org.jetbrains.kotlin.ir.builders.*
|
||||||
import org.jetbrains.kotlin.ir.builders.declarations.addValueParameter
|
|
||||||
import org.jetbrains.kotlin.ir.builders.declarations.buildFun
|
import org.jetbrains.kotlin.ir.builders.declarations.buildFun
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrBlockBody
|
import org.jetbrains.kotlin.ir.expressions.IrBlockBody
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrConst
|
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrConstKind
|
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
||||||
import org.jetbrains.kotlin.ir.util.SYNTHETIC_OFFSET
|
import org.jetbrains.kotlin.ir.util.SYNTHETIC_OFFSET
|
||||||
import org.jetbrains.kotlin.ir.util.hasAnnotation
|
import org.jetbrains.kotlin.ir.util.hasAnnotation
|
||||||
import org.jetbrains.kotlin.ir.util.setDeclarationsParent
|
import org.jetbrains.kotlin.ir.util.hasNonConstInitializer
|
||||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
|
||||||
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
internal object DECLARATION_ORIGIN_MODULE_GLOBAL_INITIALIZER : IrDeclarationOriginImpl("MODULE_GLOBAL_INITIALIZER")
|
internal object DECLARATION_ORIGIN_MODULE_GLOBAL_INITIALIZER : IrDeclarationOriginImpl("MODULE_GLOBAL_INITIALIZER")
|
||||||
@@ -115,11 +109,4 @@ internal class FileInitializersLowering(val context: Context) : FileLoweringPass
|
|||||||
private val IrField.needsInitializationAtRuntime: Boolean
|
private val IrField.needsInitializationAtRuntime: Boolean
|
||||||
get() = hasNonConstInitializer || needsGCRegistration(context)
|
get() = hasNonConstInitializer || needsGCRegistration(context)
|
||||||
|
|
||||||
private val IrField.hasNonConstInitializer: Boolean
|
|
||||||
get() {
|
|
||||||
val it = initializer?.expression ?: return false
|
|
||||||
if (it !is IrConst<*>) return true
|
|
||||||
if (it.kind != IrConstKind.Null && it.type != this.type) return true // Might be boxed, so codegen won't treat it as const.
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
+2
@@ -326,6 +326,8 @@ internal object FileInitializersOptimization {
|
|||||||
override fun visitFunctionReference(expression: IrFunctionReference, data: BitSet) = data
|
override fun visitFunctionReference(expression: IrFunctionReference, data: BitSet) = data
|
||||||
override fun visitVararg(expression: IrVararg, data: BitSet) = data
|
override fun visitVararg(expression: IrVararg, data: BitSet) = data
|
||||||
|
|
||||||
|
override fun visitConstantValue(expression: IrConstantValue, data: BitSet) = data
|
||||||
|
|
||||||
override fun visitBreak(jump: IrBreak, data: BitSet): BitSet {
|
override fun visitBreak(jump: IrBreak, data: BitSet): BitSet {
|
||||||
intersectInitializedFiles(initializedFilesAtLoopsBreaks, jump.loop, data)
|
intersectInitializedFiles(initializedFilesAtLoopsBreaks, jump.loop, data)
|
||||||
return data
|
return data
|
||||||
|
|||||||
+3
@@ -379,3 +379,6 @@ fun IrFunction.isRestrictedSuspendFunction(): Boolean =
|
|||||||
|
|
||||||
fun IrBuilderWithScope.irByte(value: Byte) =
|
fun IrBuilderWithScope.irByte(value: Byte) =
|
||||||
IrConstImpl.byte(startOffset, endOffset, context.irBuiltIns.byteType, value)
|
IrConstImpl.byte(startOffset, endOffset, context.irBuiltIns.byteType, value)
|
||||||
|
|
||||||
|
val IrField.hasNonConstInitializer: Boolean
|
||||||
|
get() = initializer?.expression.let { it != null && it !is IrConst<*> && it !is IrConstantValue }
|
||||||
|
|||||||
Reference in New Issue
Block a user