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 b0134ddc325..32c0c430ca0 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 @@ -86,37 +86,41 @@ internal fun emitLLVM(context: Context, phaser: PhaseManager) { @Suppress("ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE") var devirtualizationAnalysisResult: Devirtualization.AnalysisResult? = null phaser.phase(KonanPhase.DEVIRTUALIZATION) { - devirtualizationAnalysisResult = Devirtualization.run(irModule, context, moduleDFG!!, externalModulesDFG!!) + externalModulesDFG?.let { externalModulesDFG -> + devirtualizationAnalysisResult = Devirtualization.run(irModule, context, moduleDFG!!, externalModulesDFG) - val privateFunctions = moduleDFG!!.symbolTable.getPrivateFunctionsTableForExport() - privateFunctions.forEachIndexed { index, it -> - val function = codegenVisitor.codegen.llvmFunction(it.first) - LLVMAddAlias( - context.llvmModule, - function.type, - function, - irModule.descriptor.privateFunctionSymbolName(index, it.second.name) - )!! + val privateFunctions = moduleDFG!!.symbolTable.getPrivateFunctionsTableForExport() + privateFunctions.forEachIndexed { index, it -> + val function = codegenVisitor.codegen.llvmFunction(it.first) + LLVMAddAlias( + context.llvmModule, + function.type, + function, + irModule.descriptor.privateFunctionSymbolName(index, it.second.name) + )!! + } + context.privateFunctions = privateFunctions + + val privateClasses = moduleDFG!!.symbolTable.getPrivateClassesTableForExport() + + privateClasses.forEachIndexed { index, it -> + val typeInfoPtr = codegenVisitor.codegen.typeInfoValue(it.first) + LLVMAddAlias( + context.llvmModule, + typeInfoPtr.type, + typeInfoPtr, + irModule.descriptor.privateClassSymbolName(index, it.second.name) + )!! + } + context.privateClasses = privateClasses } - context.privateFunctions = privateFunctions - - val privateClasses = moduleDFG!!.symbolTable.getPrivateClassesTableForExport() - - privateClasses.forEachIndexed { index, it -> - val typeInfoPtr = codegenVisitor.codegen.typeInfoValue(it.first) - LLVMAddAlias( - context.llvmModule, - typeInfoPtr.type, - typeInfoPtr, - irModule.descriptor.privateClassSymbolName(index, it.second.name) - )!! - } - context.privateClasses = privateClasses } phaser.phase(KonanPhase.ESCAPE_ANALYSIS) { - val callGraph = CallGraphBuilder(context, moduleDFG!!, externalModulesDFG!!, devirtualizationAnalysisResult, false).build() - EscapeAnalysis.computeLifetimes(context, moduleDFG!!, externalModulesDFG!!, callGraph, lifetimes) + externalModulesDFG?.let { externalModulesDFG -> + val callGraph = CallGraphBuilder(context, moduleDFG!!, externalModulesDFG, devirtualizationAnalysisResult, false).build() + EscapeAnalysis.computeLifetimes(context, moduleDFG!!, externalModulesDFG, callGraph, lifetimes) + } } phaser.phase(KonanPhase.SERIALIZE_DFG) { diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DFGSerializer.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DFGSerializer.kt index 35658237ce5..2ebe28f0518 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DFGSerializer.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DFGSerializer.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.backend.konan.optimizations +import org.jetbrains.kotlin.backend.common.reportWarning import org.jetbrains.kotlin.backend.konan.Context import org.jetbrains.kotlin.backend.konan.PrimitiveBinaryType import org.jetbrains.kotlin.config.CommonConfigurationKeys @@ -929,7 +930,7 @@ internal object DFGSerializer { } // TODO: Deserialize functions bodies lazily. - fun deserialize(context: Context, startPrivateTypeIndex: Int, startPrivateFunIndex: Int): ExternalModulesDFG { + fun deserialize(context: Context, startPrivateTypeIndex: Int, startPrivateFunIndex: Int): ExternalModulesDFG? { var privateTypeIndex = startPrivateTypeIndex var privateFunIndex = startPrivateFunIndex val publicTypesMap = mutableMapOf() @@ -949,8 +950,10 @@ internal object DFGSerializer { val reader = ArraySlice(libraryDataFlowGraph) val dataLayoutHash = reader.readLong() val expectedHash = computeDataLayoutHash(Module::class) - if (dataLayoutHash != expectedHash) - error("Expected data layout hash: $expectedHash but actual is: $dataLayoutHash") + if (dataLayoutHash != expectedHash) { + context.report(null, null, "Expected data layout hash: $expectedHash but actual is: $dataLayoutHash", false) + return null + } val moduleDataFlowGraph = Module(reader) val symbolTable = moduleDataFlowGraph.symbolTable