From d09a18c88bacfcfea799128b8447ad16be173d1f Mon Sep 17 00:00:00 2001 From: Pavel Kunyavskiy Date: Fri, 8 Jul 2022 12:18:55 +0200 Subject: [PATCH] [K/N] Get rid of outdated module initializers --- .../kotlin/backend/konan/llvm/ContextUtils.kt | 5 ---- .../kotlin/backend/konan/llvm/IrToBitcode.kt | 19 +------------- .../konan/lower/FileInitializersLowering.kt | 8 +----- .../backend/konan/lower/TestProcessor.kt | 25 +++++++++++-------- .../backend/konan/optimizations/DataFlowIR.kt | 7 ------ .../optimizations/DevirtualizationAnalysis.kt | 4 +-- 6 files changed, 19 insertions(+), 49 deletions(-) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/ContextUtils.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/ContextUtils.kt index aa5c7b47fa4..02cbf3cb2b9 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/ContextUtils.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/ContextUtils.kt @@ -240,16 +240,12 @@ internal class InitializersGenerationState { val fileThreadLocalInitStates = mutableMapOf() val topLevelFields = mutableListOf() - val moduleThreadLocalInitializers = mutableListOf() - val moduleGlobalInitializers = mutableListOf() var globalInitFunction: IrFunction? = null var globalInitState: LLVMValueRef? = null var threadLocalInitFunction: IrFunction? = null var threadLocalInitState: AddressAccess? = null fun reset() { - moduleThreadLocalInitializers.clear() - moduleGlobalInitializers.clear() topLevelFields.clear() globalInitFunction = null globalInitState = null @@ -258,7 +254,6 @@ internal class InitializersGenerationState { } fun isEmpty() = topLevelFields.isEmpty() && globalInitState == null && threadLocalInitState == null - && moduleGlobalInitializers.isEmpty() && moduleThreadLocalInitializers.isEmpty() } internal class ConstInt1(llvm: Llvm, val value: Boolean) : ConstValue { diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt index 9771cdf4cde..7a5744762f5 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt @@ -18,8 +18,6 @@ import org.jetbrains.kotlin.backend.konan.lower.* import org.jetbrains.kotlin.backend.konan.lower.DECLARATION_ORIGIN_FILE_GLOBAL_INITIALIZER import org.jetbrains.kotlin.backend.konan.lower.DECLARATION_ORIGIN_FILE_STANDALONE_THREAD_LOCAL_INITIALIZER import org.jetbrains.kotlin.backend.konan.lower.DECLARATION_ORIGIN_FILE_THREAD_LOCAL_INITIALIZER -import org.jetbrains.kotlin.backend.konan.lower.DECLARATION_ORIGIN_MODULE_GLOBAL_INITIALIZER -import org.jetbrains.kotlin.backend.konan.lower.DECLARATION_ORIGIN_MODULE_THREAD_LOCAL_INITIALIZER import org.jetbrains.kotlin.builtins.UnsignedType import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.ir.IrElement @@ -501,9 +499,6 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map() + val statements = mutableListOf() // There is no specified order on fake override functions, so to ensure all the tests are run deterministically, // sort the fake override functions by name. @@ -619,19 +620,23 @@ internal class TestProcessor (val context: Context) { } if (statements.isNotEmpty()) { - context.irFactory.buildFun { + context.irFactory.buildField { startOffset = SYNTHETIC_OFFSET endOffset = SYNTHETIC_OFFSET - origin = DECLARATION_ORIGIN_MODULE_THREAD_LOCAL_INITIALIZER - name = Name.identifier("\$createTestSuites") + name = "createTestSuites".synthesizedName visibility = DescriptorVisibilities.PRIVATE - returnType = context.irBuiltIns.unitType + isFinal = true + isStatic = true + type = context.irBuiltIns.unitType }.apply { parent = irFile irFile.declarations.add(this) - + annotations += buildSimpleAnnotation(context.irBuiltIns, startOffset, endOffset, context.ir.symbols.eagerInitialization.owner) + annotations += buildSimpleAnnotation(context.irBuiltIns, startOffset, endOffset, context.ir.symbols.threadLocal.owner) statements.forEach { it.accept(SetDeclarationsParentVisitor, this) } - body = IrBlockBodyImpl(SYNTHETIC_OFFSET, SYNTHETIC_OFFSET, statements) + initializer = IrExpressionBodyImpl(SYNTHETIC_OFFSET, SYNTHETIC_OFFSET, + IrCompositeImpl(SYNTHETIC_OFFSET, SYNTHETIC_OFFSET, context.irBuiltIns.unitType, null, statements) + ) } } } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DataFlowIR.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DataFlowIR.kt index 010d4ef6f62..f41f8120226 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DataFlowIR.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DataFlowIR.kt @@ -13,8 +13,6 @@ import org.jetbrains.kotlin.backend.konan.llvm.computeSymbolName import org.jetbrains.kotlin.backend.konan.llvm.isExported import org.jetbrains.kotlin.backend.konan.llvm.localHash import org.jetbrains.kotlin.backend.konan.lower.DECLARATION_ORIGIN_BRIDGE_METHOD -import org.jetbrains.kotlin.backend.konan.lower.DECLARATION_ORIGIN_MODULE_GLOBAL_INITIALIZER -import org.jetbrains.kotlin.backend.konan.lower.DECLARATION_ORIGIN_MODULE_THREAD_LOCAL_INITIALIZER import org.jetbrains.kotlin.backend.konan.lower.bridgeTarget import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.ModuleDescriptor @@ -113,7 +111,6 @@ internal object DataFlowIR { object FunctionAttributes { val IS_TOP_LEVEL_FIELD_INITIALIZER = 1 - val IS_GLOBAL_INITIALIZER = 2 val RETURNS_UNIT = 4 val RETURNS_NOTHING = 8 val EXPLICITLY_EXPORTED = 16 @@ -126,7 +123,6 @@ internal object DataFlowIR { lateinit var returnParameter: FunctionParameter val isTopLevelFieldInitializer = attributes.and(FunctionAttributes.IS_TOP_LEVEL_FIELD_INITIALIZER) != 0 - val isGlobalInitializer = attributes.and(FunctionAttributes.IS_GLOBAL_INITIALIZER) != 0 val returnsUnit = attributes.and(FunctionAttributes.RETURNS_UNIT) != 0 val returnsNothing = attributes.and(FunctionAttributes.RETURNS_NOTHING) != 0 val explicitlyExported = attributes.and(FunctionAttributes.EXPLICITLY_EXPORTED) != 0 @@ -607,9 +603,6 @@ internal object DataFlowIR { || it.hasAnnotation(RuntimeNames.objCMethodImp)) { attributes = attributes or FunctionAttributes.EXPLICITLY_EXPORTED } - if (it.origin == DECLARATION_ORIGIN_MODULE_GLOBAL_INITIALIZER - || it.origin == DECLARATION_ORIGIN_MODULE_THREAD_LOCAL_INITIALIZER) - attributes = attributes or FunctionAttributes.IS_GLOBAL_INITIALIZER val symbol = when { it.isExternal || it.isBuiltInOperator -> { val escapesAnnotation = it.annotations.findAnnotation(FQ_NAME_ESCAPES) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DevirtualizationAnalysis.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DevirtualizationAnalysis.kt index 569ed92f307..7b321ce832a 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DevirtualizationAnalysis.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DevirtualizationAnalysis.kt @@ -83,8 +83,8 @@ internal object DevirtualizationAnalysis { // TODO: Are globals initializers always called whether they are actually reachable from roots or not? // TODO: With the changed semantics of global initializers this is no longer the case - rework. val globalInitializers = - moduleDFG.symbolTable.functionMap.values.filter { it.isTopLevelFieldInitializer || it.isGlobalInitializer } + - externalModulesDFG.functionDFGs.keys.filter { it.isTopLevelFieldInitializer || it.isGlobalInitializer } + moduleDFG.symbolTable.functionMap.values.filter { it.isTopLevelFieldInitializer } + + externalModulesDFG.functionDFGs.keys.filter { it.isTopLevelFieldInitializer } val explicitlyExported = moduleDFG.symbolTable.functionMap.values.filter { it.explicitlyExported } +