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)