Native: quick fix lazy init order problem

Initialize main-thread-bound properties along with shared properties

^KT-48364 Fixed
This commit is contained in:
Svyatoslav Scherbina
2021-08-23 16:54:47 +03:00
committed by Space
parent ff46a63ffa
commit 7f12cda233
2 changed files with 3 additions and 12 deletions
@@ -371,7 +371,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
using(parameterScope) usingParameterScope@{
using(VariableScope()) usingVariableScope@{
context.llvm.initializersGenerationState.topLevelFields
.filter { it.storageKind == FieldStorageKind.SHARED_FROZEN }
.filter { it.storageKind != FieldStorageKind.THREAD_LOCAL }
.filterNot { it.shouldBeInitializedEagerly }
.forEach { initGlobalField(it) }
ret(null)
@@ -387,16 +387,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
val parameterScope = ParameterScope(fileInitFunction, functionGenerationContext)
using(parameterScope) usingParameterScope@{
using(VariableScope()) usingVariableScope@{
val bbInitGlobals = basicBlock("label_init_global", null, null)
val bbInitThreadLocals = basicBlock("label_init_thread_local", null, null)
condBr(param(0), bbInitGlobals, bbInitThreadLocals)
positionAtEnd(bbInitGlobals)
context.llvm.initializersGenerationState.topLevelFields
.filter { it.storageKind == FieldStorageKind.GLOBAL }
.filterNot { it.shouldBeInitializedEagerly }
.forEach { initGlobalField(it) }
br(bbInitThreadLocals)
positionAtEnd(bbInitThreadLocals)
// TODO: remove unused parameter.
context.llvm.initializersGenerationState.topLevelFields
.filter { it.storageKind == FieldStorageKind.THREAD_LOCAL }
.filterNot { it.shouldBeInitializedEagerly }
@@ -57,7 +57,7 @@ internal class FileInitializersLowering(val context: Context) : FileLoweringPass
for (declaration in irFile.declarations) {
val irField = (declaration as? IrField) ?: (declaration as? IrProperty)?.backingField
if (irField == null || !irField.needsInitializationAtRuntime || irField.shouldBeInitializedEagerly) continue
if (irField.storageKind == FieldStorageKind.SHARED_FROZEN) {
if (irField.storageKind != FieldStorageKind.THREAD_LOCAL) {
requireGlobalInitializer = true
} else {
requireThreadLocalInitializer = true // Either marked with thread local or only main thread visible.