From c37f8ba7085c290054a43b6362cdb8eca5114b45 Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Thu, 18 Feb 2021 11:10:51 +0500 Subject: [PATCH] [IR][cache] Fix for https://youtrack.jetbrains.com/issue/KT-44764 The .konanLibrary is cached for each declaration for performance purposes, but it is only ok to do it after IR has been lowered to its final state (or at least when declarations aren't being moved around), so the fix respects that by only taking .konanLibrary of a IrFile (it is assumed that files stay on their place during entire backend lowering procedure). (cherry picked from commit e021138368b48e306ba99a96f47d93ecbe039f4d) --- .../kotlin/backend/konan/LlvmModuleSpecification.kt | 3 +++ .../kotlin/backend/konan/LlvmModuleSpecificationImpl.kt | 5 +++++ .../src/org/jetbrains/kotlin/backend/konan/ir/NewIrUtils.kt | 5 +++++ .../backend/konan/lower/NativeInlineFunctionResolver.kt | 5 ++++- 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LlvmModuleSpecification.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LlvmModuleSpecification.kt index 1aaf71d5176..9974f05b898 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LlvmModuleSpecification.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LlvmModuleSpecification.kt @@ -7,7 +7,9 @@ package org.jetbrains.kotlin.backend.konan import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.ir.declarations.IrDeclaration +import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.declarations.IrModuleFragment +import org.jetbrains.kotlin.ir.declarations.IrPackageFragment import org.jetbrains.kotlin.library.KotlinLibrary /** @@ -20,5 +22,6 @@ interface LlvmModuleSpecification { fun containsLibrary(library: KotlinLibrary): Boolean fun containsModule(module: ModuleDescriptor): Boolean fun containsModule(module: IrModuleFragment): Boolean + fun containsPackageFragment(packageFragment: IrPackageFragment): Boolean fun containsDeclaration(declaration: IrDeclaration): Boolean } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LlvmModuleSpecificationImpl.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LlvmModuleSpecificationImpl.kt index c17084ffb3c..dfae43f4018 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LlvmModuleSpecificationImpl.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LlvmModuleSpecificationImpl.kt @@ -8,7 +8,9 @@ package org.jetbrains.kotlin.backend.konan import org.jetbrains.kotlin.backend.konan.ir.konanLibrary import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.ir.declarations.IrDeclaration +import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.declarations.IrModuleFragment +import org.jetbrains.kotlin.ir.declarations.IrPackageFragment import org.jetbrains.kotlin.library.KotlinLibrary internal abstract class LlvmModuleSpecificationBase(protected val cachedLibraries: CachedLibraries) : LlvmModuleSpecification { @@ -24,6 +26,9 @@ internal abstract class LlvmModuleSpecificationBase(protected val cachedLibrarie override fun containsModule(module: ModuleDescriptor): Boolean = module.konanLibrary.let { it == null || containsLibrary(it) } + override fun containsPackageFragment(packageFragment: IrPackageFragment): Boolean = + packageFragment.konanLibrary.let { it == null || containsLibrary(it) } + override fun containsDeclaration(declaration: IrDeclaration): Boolean = declaration.konanLibrary.let { it == null || containsLibrary(it) } } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/NewIrUtils.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/NewIrUtils.kt index 1706ff71686..27ff8f9cba4 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/NewIrUtils.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/NewIrUtils.kt @@ -114,6 +114,11 @@ internal fun IrExpression.isBoxOrUnboxCall() = val ModuleDescriptor.konanLibrary get() = (this.klibModuleOrigin as? DeserializedKlibModuleOrigin)?.library val IrModuleFragment.konanLibrary get() = (this as? KonanIrModuleFragmentImpl)?.konanLibrary ?: descriptor.konanLibrary +val IrPackageFragment.konanLibrary get() = + if (this is IrFile) + this.konanLibrary + else + this.packageFragmentDescriptor.containingDeclaration.konanLibrary val IrFile.konanLibrary get() = (metadata as? KonanFileMetadataSource)?.module?.konanLibrary ?: packageFragmentDescriptor.containingDeclaration.konanLibrary val IrDeclaration.konanLibrary: KotlinLibrary? get() { diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/NativeInlineFunctionResolver.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/NativeInlineFunctionResolver.kt index 622a8cfe2c9..eb938d34798 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/NativeInlineFunctionResolver.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/NativeInlineFunctionResolver.kt @@ -15,6 +15,9 @@ import org.jetbrains.kotlin.backend.konan.Context import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol import org.jetbrains.kotlin.ir.util.dump +import org.jetbrains.kotlin.ir.util.file +import org.jetbrains.kotlin.ir.util.fileOrNull +import org.jetbrains.kotlin.ir.util.getPackageFragment // TODO: This is a bit hacky. Think about adopting persistent IR ideas. internal class NativeInlineFunctionResolver(override val context: Context) : DefaultInlineFunctionResolver(context) { @@ -39,7 +42,7 @@ internal class NativeInlineFunctionResolver(override val context: Context) : Def LocalClassesInInlineLambdasLowering(context).lower(body, function) - if (context.llvmModuleSpecification.containsDeclaration(function)) { + if (context.llvmModuleSpecification.containsPackageFragment(function.getPackageFragment()!!)) { // Do not extract local classes off of inline functions from cached libraries. LocalClassesInInlineFunctionsLowering(context).lower(body, function) LocalClassesExtractionFromInlineFunctionsLowering(context).lower(body, function)