wip
diff --git a/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Ir.kt b/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Ir.kt
index 0e03e6c..46dd3fb 100644
--- a/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Ir.kt
+++ b/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Ir.kt
@@ -378,6 +378,7 @@
val cToKotlinBridge = ClassIds.cToKotlinBridge.classSymbol()
val kotlinToCBridge = ClassIds.kotlinToCBridge.classSymbol()
val interopCallMarker = symbolFinder.topLevelFunction(RuntimeNames.kotlinxCInteropInternalPackageName, "interopCallMarker")
+ val interopLowered = symbolFinder.topLevelClass(NativeRuntimeNames.Annotations.interopLoweredClassId)
val objCMethodImp = ClassIds.objCMethodImp.classSymbol()
diff --git a/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Utils.kt b/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Utils.kt
index dd30109..c20aa9e 100644
--- a/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Utils.kt
+++ b/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Utils.kt
@@ -19,13 +19,17 @@
import org.jetbrains.kotlin.ir.types.isMarkedNullable
import org.jetbrains.kotlin.ir.util.IdSignature
import org.jetbrains.kotlin.ir.util.constructors
+import org.jetbrains.kotlin.ir.util.hasTopLevelEqualFqName
import org.jetbrains.kotlin.ir.util.isFunction
import org.jetbrains.kotlin.ir.util.isInterface
import org.jetbrains.kotlin.ir.util.isSuspendFunction
import org.jetbrains.kotlin.utils.atMostOne
+private fun IrClass.hasFqNameEqualToSignature(signature: IdSignature.CommonSignature): Boolean =
+ name.asString() == signature.shortName && hasTopLevelEqualFqName(signature.packageFqName, signature.declarationFqName)
+
private fun IrClass.isClassTypeWithSignature(signature: IdSignature.CommonSignature): Boolean {
- return signature == symbol.signature
+ return signature == symbol.signature || (this.hasFqNameEqualToSignature(signature))
}
fun IrClass.isUnit() = this.isClassTypeWithSignature(IdSignatureValues.unit)
diff --git a/compiler/ir/ir.inline/src/org/jetbrains/kotlin/ir/inline/CommonLoweringPhases.kt b/compiler/ir/ir.inline/src/org/jetbrains/kotlin/ir/inline/CommonLoweringPhases.kt
index c8ffa73..18c5ea6 100644
--- a/compiler/ir/ir.inline/src/org/jetbrains/kotlin/ir/inline/CommonLoweringPhases.kt
+++ b/compiler/ir/ir.inline/src/org/jetbrains/kotlin/ir/inline/CommonLoweringPhases.kt
@@ -38,7 +38,7 @@
prerequisite = setOf(lateinitPhase)
)
-private val localClassesInInlineLambdasPhase = makeIrModulePhase(
+val localClassesInInlineLambdasPhase = makeIrModulePhase(
::LocalClassesInInlineLambdasLowering,
name = "LocalClassesInInlineLambdasPhase",
)
@@ -114,13 +114,14 @@
fun loweringsOfTheFirstPhase(
@Suppress("UNUSED_PARAMETER") irMangler: IrMangler,
- languageVersionSettings: LanguageVersionSettings
+ @Suppress("UNUSED_PARAMETER") languageVersionSettings: LanguageVersionSettings
): List<NamedCompilerPhase<PreSerializationLoweringContext, IrModuleFragment, IrModuleFragment>> = buildList {
this += avoidLocalFOsInInlineFunctionsLowering
if (languageVersionSettings.supportsFeature(LanguageFeature.IrInlinerBeforeKlibSerialization)) {
this += lateinitPhase
this += sharedVariablesLoweringPhase
this += localClassesInInlineLambdasPhase
+ // TODO: interop lowering goes here.
this += arrayConstructorPhase
this += inlineOnlyPrivateFunctionsPhase
this += checkInlineDeclarationsAfterInliningOnlyPrivateFunctions
diff --git a/compiler/ir/ir.inline/src/org/jetbrains/kotlin/ir/inline/konan/NativeFirstPhaseLoweringPhases.kt b/compiler/ir/ir.inline/src/org/jetbrains/kotlin/ir/inline/konan/NativeFirstPhaseLoweringPhases.kt
index 3fc8202..20d7e64 100644
--- a/compiler/ir/ir.inline/src/org/jetbrains/kotlin/ir/inline/konan/NativeFirstPhaseLoweringPhases.kt
+++ b/compiler/ir/ir.inline/src/org/jetbrains/kotlin/ir/inline/konan/NativeFirstPhaseLoweringPhases.kt
@@ -16,7 +16,7 @@
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.ir.inline.loweringsOfTheFirstPhase
-private val upgradeCallableReferencesPhase = makeIrModulePhase(
+val upgradeCallableReferencesPhase = makeIrModulePhase(
lowering = ::UpgradeCallableReferences,
name = "UpgradeCallableReferences"
)
diff --git a/compiler/ir/serialization.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrFileSerializer.kt b/compiler/ir/serialization.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrFileSerializer.kt
index 7ef3724..e3d3fcb 100644
--- a/compiler/ir/serialization.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrFileSerializer.kt
+++ b/compiler/ir/serialization.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrFileSerializer.kt
@@ -25,7 +25,7 @@
else -> return false
}
- return node.hasAnnotation(classId)
+ return node.annotations.hasAnnotation(classId)
}
override fun backendSpecificSerializeAllMembers(irClass: IrClass) = !KonanFakeOverrideClassFilter.needToConstructFakeOverrides(irClass)
diff --git a/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/KlibModuleOrigin.kt b/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/KlibModuleOrigin.kt
index 142fd3f..a6ecf13 100644
--- a/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/KlibModuleOrigin.kt
+++ b/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/KlibModuleOrigin.kt
@@ -29,7 +29,10 @@
CurrentKlibModuleOrigin, SyntheticModulesOrigin -> false
}
-val ModuleDescriptor.klibModuleOrigin get() = this.getCapability(KlibModuleOrigin.CAPABILITY)!!
+val ModuleDescriptor.klibModuleOrigin get() = this.getCapability(KlibModuleOrigin.CAPABILITY)
+ ?: error("KlibModuleOrigin not available: ${this::class.java} $this")
+
+val ModuleDescriptor.klibModuleOriginIfExists get() = this.getCapability(KlibModuleOrigin.CAPABILITY)
val ModuleDescriptor.kotlinLibrary
get() = (this.klibModuleOrigin as DeserializedKlibModuleOrigin).library
diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt
index 50dac65..9e289d5 100644
--- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt
+++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt
@@ -511,7 +511,8 @@
DontCreateSyntheticPropertiesWithoutBaseJavaGetter(sinceVersion = null, "KT-64358"),
JavaTypeParameterDefaultRepresentationWithDNN(sinceVersion = null, testOnly = true, issue = "KT-59138"),
ProperFieldAccessGenerationForFieldAccessShadowedByKotlinProperty(sinceVersion = null, "KT-56386"),
- IrInlinerBeforeKlibSerialization(sinceVersion = null, forcesPreReleaseBinaries = true, issue = "KT-69765"),
+ IrInlinerBeforeKlibSerialization(sinceVersion = KOTLIN_2_0, forcesPreReleaseBinaries = true, issue = "KT-69765"),
+ //IrInlinerBeforeKlibSerialization(sinceVersion = null, forcesPreReleaseBinaries = true, issue = "KT-69765"),
NestedTypeAliases(sinceVersion = null, forcesPreReleaseBinaries = true, issue = "KT-45285"),
ForbidUsingSupertypesWithInaccessibleContentInTypeArguments(sinceVersion = null, enabledInProgressiveMode = true, "KT-66691"), // KT-66691, KT-66742
UnnamedLocalVariables(sinceVersion = null, forcesPreReleaseBinaries = false, issue = "KT-74809"),
@@ -519,7 +520,8 @@
AnnotationsInMetadata(sinceVersion = null, "KT-57919"),
DisableWarningsForValueBasedJavaClasses(sinceVersion = null, "KT-70722"),
DisableWarningsForIdentitySensitiveOperationsOnValueClassesAndPrimitives(sinceVersion = null, "KT-70722"),
- IrRichCallableReferencesInKlibs(sinceVersion = null, "KT-72734"), // KT-72734, KT-74384, KT-74392
+ IrRichCallableReferencesInKlibs(sinceVersion = KOTLIN_2_0, "KT-72734"), // KT-72734, KT-74384, KT-74392
+ //IrRichCallableReferencesInKlibs(sinceVersion = null, "KT-72734"), // KT-72734, KT-74384, KT-74392
ExportKlibToOlderAbiVersion(sinceVersion = null, forcesPreReleaseBinaries = true, issue = "KT-76131"),
;
diff --git a/core/compiler.common.native/src/org/jetbrains/kotlin/name/NativeRuntimeNames.kt b/core/compiler.common.native/src/org/jetbrains/kotlin/name/NativeRuntimeNames.kt
index 0e0839e..3c91cfc 100644
--- a/core/compiler.common.native/src/org/jetbrains/kotlin/name/NativeRuntimeNames.kt
+++ b/core/compiler.common.native/src/org/jetbrains/kotlin/name/NativeRuntimeNames.kt
@@ -42,6 +42,7 @@
val symbolNameClassId = ClassId(kotlinNativePackage, Name.identifier("SymbolName"))
val cNameClassId = ClassId(kotlinNativePackage, Name.identifier("CName"))
val exportedBridgeClassId = ClassId(kotlinNativeInternalPackage, Name.identifier("ExportedBridge"))
+ val interopLoweredClassId = ClassId(kotlinNativeInternalPackage, Name.identifier("InteropLowered"))
val exportForCppRuntimeClassId = ClassId(kotlinNativeInternalPackage, Name.identifier("ExportForCppRuntime"))
val exportForCompilerClassId = ClassId(kotlinNativeInternalPackage, Name.identifier("ExportForCompiler"))
val exportTypeInfoClassId = ClassId(kotlinNativeInternalPackage, Name.identifier("ExportTypeInfo"))
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt
index 5a76132..bc584b7 100644
--- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt
+++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt
@@ -29,6 +29,8 @@
import org.jetbrains.kotlin.ir.types.IrTypeSystemContextImpl
import org.jetbrains.kotlin.ir.util.ReferenceSymbolTable
import org.jetbrains.kotlin.ir.util.render
+import org.jetbrains.kotlin.konan.library.KonanLibrary
+import org.jetbrains.kotlin.library.KotlinLibrary
import org.jetbrains.kotlin.resolve.descriptorUtil.module
import org.jetbrains.kotlin.utils.addToStdlib.getOrSetIfNull
import java.util.concurrent.ConcurrentHashMap
@@ -63,6 +65,8 @@
ExternalDeclarationFileNameProvider(moduleDeserializerProvider)
}
+ override fun getExternalPackageFragmentLibrary(packageFragment: IrExternalPackageFragment) = packageFragment.konanLibrary
+
private val inlineFunctionDeserializers = ConcurrentHashMap<KonanPartialModuleDeserializer, InlineFunctionDeserializer>()
fun getInlineFunctionDeserializer(function: IrFunction): InlineFunctionDeserializer {
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/DependenciesTracker.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/DependenciesTracker.kt
index 8b7c40e..2842334 100644
--- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/DependenciesTracker.kt
+++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/DependenciesTracker.kt
@@ -155,6 +155,13 @@
isNewDependency = usedBitcodeOfFile.add(it) || isNewDependency
}
+// if (isNewDependency) {
+// println("ZZZ: ${library.libraryName} ${library.libraryFile} ${libraryFile?.filePath}")
+// val e = IllegalStateException()
+// println(e.stackTraceToString())
+// println()
+// }
+
require(!(sealed && isNewDependency)) { "The dependencies have been sealed off" }
}
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Fir2Ir.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Fir2Ir.kt
index be4caf8..cfb4fc1 100644
--- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Fir2Ir.kt
+++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Fir2Ir.kt
@@ -26,11 +26,13 @@
import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.declarations.IrExternalPackageFragment
+import org.jetbrains.kotlin.ir.declarations.moduleDescriptor
import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.types.IrTypeSystemContextImpl
import org.jetbrains.kotlin.ir.util.getPackageFragment
import org.jetbrains.kotlin.library.isNativeStdlib
import org.jetbrains.kotlin.library.metadata.KlibMetadataFactories
+import org.jetbrains.kotlin.library.metadata.resolver.KotlinResolvedLibrary
import org.jetbrains.kotlin.name.NativeForwardDeclarationKind
import org.jetbrains.kotlin.storage.LockBasedStorageManager
@@ -86,25 +88,32 @@
"`${actualizedResult.irModuleFragment.name}` must be Name.special, since it's required by KlibMetadataModuleDescriptorFactoryImpl.createDescriptorOptionalBuiltIns()"
}
+ val forwardDeclarationPackages = NativeForwardDeclarationKind.entries.map { it.packageFqName }.toSet()
@OptIn(DelicateDeclarationStorageApi::class)
val usedPackages = buildSet {
fun addExternalPackage(it: IrSymbol) {
// FIXME(KT-64742): Fir2IrDeclarationStorage caches may contain unbound IR symbols, so we filter them out.
val p = it.takeIf { it.isBound }?.owner as? IrDeclaration ?: return
val fragment = (p.getPackageFragment() as? IrExternalPackageFragment) ?: return
- add(fragment.packageFqName)
+ if (fragment.packageFqName !in forwardDeclarationPackages)
+ add(fragment)
}
actualizedResult.components.declarationStorage.forEachCachedDeclarationSymbol(::addExternalPackage)
actualizedResult.components.classifierStorage.forEachCachedDeclarationSymbol(::addExternalPackage)
// These packages exist in all platform libraries, but can contain only synthetic declarations.
// These declarations are not really located in klib, so we don't need to depend on klib to use them.
- removeAll(NativeForwardDeclarationKind.entries.map { it.packageFqName }.toSet())
+ //removeAll(NativeForwardDeclarationKind.entries.map { it.packageFqName }.toSet())
}.toList()
+ val usedPackagesMap = mutableMapOf<IrExternalPackageFragment, KotlinResolvedLibrary>()
+ librariesDescriptors.zip(resolvedLibraries).forEach { (module, library) ->
+ usedPackages.filter { !module.packageFragmentProviderForModuleContentWithoutDependencies.isEmpty(it.packageFqName) }
+ .forEach { usedPackagesMap[it] = library }
+ }
val usedLibraries = librariesDescriptors.zip(resolvedLibraries).filter { (module, _) ->
- usedPackages.any { !module.packageFragmentProviderForModuleContentWithoutDependencies.isEmpty(it) }
+ usedPackages.any { !module.packageFragmentProviderForModuleContentWithoutDependencies.isEmpty(it.packageFqName) }
}.map { it.second }.toSet()
resolvedLibraries.find { it.library.isNativeStdlib }?.let {
@@ -122,7 +131,7 @@
throw KonanCompilationException("Compilation failed: there were some diagnostics during fir2ir")
}
- return Fir2IrOutput(input.firResult, symbols, actualizedResult, usedLibraries)
+ return Fir2IrOutput(input.firResult, symbols, actualizedResult, usedLibraries, usedPackagesMap)
}
private fun PhaseContext.createKonanSymbols(
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanBackendContext.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanBackendContext.kt
index 6bfd6a7..03d5853 100644
--- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanBackendContext.kt
+++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanBackendContext.kt
@@ -7,14 +7,59 @@
import org.jetbrains.kotlin.backend.common.CommonBackendContext
import org.jetbrains.kotlin.backend.common.ir.KlibSharedVariablesManager
+import org.jetbrains.kotlin.backend.common.LoweringContext
+import org.jetbrains.kotlin.backend.common.PreSerializationLoweringContext
import org.jetbrains.kotlin.backend.konan.driver.BasicPhaseContext
import org.jetbrains.kotlin.backend.konan.ir.KonanSymbols
import org.jetbrains.kotlin.builtins.konan.KonanBuiltIns
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
+import org.jetbrains.kotlin.config.CompilerConfiguration
+import org.jetbrains.kotlin.descriptors.ModuleDescriptor
+import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
+import org.jetbrains.kotlin.ir.IrBuiltIns
+import org.jetbrains.kotlin.ir.declarations.IrExternalPackageFragment
import org.jetbrains.kotlin.ir.declarations.IrFactory
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
+import org.jetbrains.kotlin.ir.declarations.moduleDescriptor
+import org.jetbrains.kotlin.ir.types.IrTypeSystemContext
+import org.jetbrains.kotlin.ir.types.IrTypeSystemContextImpl
+import org.jetbrains.kotlin.library.KotlinLibrary
-internal abstract class KonanBackendContext(config: KonanConfig) : BasicPhaseContext(config), CommonBackendContext {
+interface NativeLoweringContext : LoweringContext {
+ override val symbols: KonanSymbols
+ val config: KonanConfig
+ val typeSystem: IrTypeSystemContext
+ fun getExternalPackageFragmentLibrary(packageFragment: IrExternalPackageFragment): KotlinLibrary?
+}
+
+internal class NativePreSerializationLoweringContext2(
+ irBuiltIns: IrBuiltIns,
+ configuration: CompilerConfiguration,
+ diagnosticReporter: DiagnosticReporter,
+ override val config: KonanConfig,
+ //private val usedLibraries: Map<ModuleDescriptor, KotlinLibrary>,
+ private val usedPackages: Map<IrExternalPackageFragment, KotlinLibrary>,
+) : PreSerializationLoweringContext(irBuiltIns, configuration, diagnosticReporter), NativeLoweringContext {
+ private val konanSymbols = KonanSymbols(this, irBuiltIns, configuration)
+
+ override val symbols = konanSymbols
+
+ override val sharedVariablesManager by lazy {
+ // Creating lazily because builtIns module seems to be incomplete during `link` test;
+ // TODO: investigate this.
+ KlibSharedVariablesManager(symbols)
+ }
+
+ override val typeSystem: IrTypeSystemContext
+ get() = IrTypeSystemContextImpl(irBuiltIns)
+
+ override fun getExternalPackageFragmentLibrary(packageFragment: IrExternalPackageFragment) = usedPackages[packageFragment]
+}
+
+
+internal abstract class KonanBackendContext(config: KonanConfig)
+ : BasicPhaseContext(config), CommonBackendContext, NativeLoweringContext
+{
abstract val builtIns: KonanBuiltIns
abstract override val symbols: KonanSymbols
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGen.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGen.kt
index 9f0e5d2..09fc77d 100644
--- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGen.kt
+++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGen.kt
@@ -17,6 +17,7 @@
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
import org.jetbrains.kotlin.descriptors.Modality
+import org.jetbrains.kotlin.fir.descriptors.FirModuleDescriptor
import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.IrStatement
@@ -37,6 +38,7 @@
import org.jetbrains.kotlin.konan.ForeignExceptionMode
import org.jetbrains.kotlin.konan.target.Family
import org.jetbrains.kotlin.konan.target.KonanTarget
+import org.jetbrains.kotlin.library.KotlinLibrary
import org.jetbrains.kotlin.library.metadata.isCInteropLibrary
import org.jetbrains.kotlin.library.uniqueName
import org.jetbrains.kotlin.name.Name
@@ -55,6 +57,7 @@
fun addKotlin(declaration: IrDeclaration)
fun getUniqueCName(prefix: String): String
fun getUniqueKotlinFunctionReferenceClassName(prefix: String): String
+ fun getPackageFragmentLibrary(packageFragment: IrPackageFragment): KotlinLibrary?
fun throwCompilerError(element: IrElement?, message: String): Nothing
fun renderCompilerError(element: IrElement?, message: String = "Failed requirement."): String
@@ -189,11 +192,23 @@
callBuilder.state.addC(listOf("extern const $targetFunctionVariable __asm(\"$cCallSymbolName\");")) // Exported from cinterop stubs.
}
- val libraryName = if (isInvoke) "" else callee.getPackageFragment().konanLibrary.let {
+ val libraryName = if (isInvoke) "" else this.getPackageFragmentLibrary(callee.getPackageFragment()).let {
+ if (it == null) {
+ val moduleDescriptor = callee.getPackageFragment().moduleDescriptor
+ println("QXX: $moduleDescriptor ${moduleDescriptor::class.java}" +
+ " ${System.identityHashCode(moduleDescriptor)}" +
+ " ${(moduleDescriptor as? FirModuleDescriptor)?.moduleData?.name}" +
+ " ${(moduleDescriptor as? FirModuleDescriptor)?.moduleData?.capabilities?.joinToString()}")
+ }
require(it?.isCInteropLibrary() == true) { "Expected a function from a cinterop library: ${callee.render()}" }
it.uniqueName
}
+// val libraryName = if (isInvoke) "" else callee.getPackageFragment().konanLibrary.let {
+// require(it?.isCInteropLibrary() == true) { "Expected a function from a cinterop library: ${callee.render()}" }
+// it.uniqueName
+// }
+
callBuilder.finishBuilding(libraryName)
return result
@@ -342,7 +357,8 @@
val isDirect = directSymbolName != null
val exceptionMode = ForeignExceptionMode.byValue(
- resolved.konanLibrary?.manifestProperties
+ this@generateObjCCall.getPackageFragmentLibrary(resolved.getPackageFragment())
+ ?.manifestProperties
?.getProperty(ForeignExceptionMode.manifestKey)
)
@@ -441,7 +457,7 @@
// an explicit call must have been executed and no edge would be lost.
""
} else { // Category-provided.
- method.getPackageFragment().konanLibrary.let {
+ this@generateObjCCall.getPackageFragmentLibrary(method.getPackageFragment()).let {
require(it?.isCInteropLibrary() == true) { "Expected a function from a cinterop library: ${method.render()}" }
it.uniqueName
}
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/NativeCompilerDriver.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/NativeCompilerDriver.kt
index 7d7629a..51538db 100644
--- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/NativeCompilerDriver.kt
+++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/NativeCompilerDriver.kt
@@ -19,6 +19,9 @@
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
import org.jetbrains.kotlin.config.CommonConfigurationKeys
+import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
+import org.jetbrains.kotlin.config.languageVersionSettings
+import org.jetbrains.kotlin.fir.moduleData
import org.jetbrains.kotlin.konan.file.File
import org.jetbrains.kotlin.konan.target.CompilerOutputKind
import org.jetbrains.kotlin.util.PerformanceManager
@@ -131,6 +134,13 @@
val fir2IrOutput = performanceManager.tryMeasurePhaseTime(PhaseType.TranslationToIr) {
engine.runFir2Ir(frontendOutput)
}
+
+// println("firResult:")
+// frontendOutput.firResult.outputs.forEach {
+// println(" ${it.session.moduleData.name}")
+// it.fir.forEach { println(" ${it.name}") }
+// }
+
val headerKlibPath = config.headerKlibPath
if (!headerKlibPath.isNullOrEmpty()) {
val headerKlib = performanceManager.tryMeasurePhaseTime(PhaseType.IrSerialization) {
@@ -147,7 +157,7 @@
engine.runK2SpecialBackendChecks(fir2IrOutput)
val loweredIr = performanceManager.tryMeasurePhaseTime(PhaseType.IrPreLowering) {
- engine.runPreSerializationLowerings(fir2IrOutput, environment)
+ engine.runPreSerializationLowerings(fir2IrOutput, environment, config)
}
performanceManager.tryMeasurePhaseTime(PhaseType.IrSerialization) {
engine.runFir2IrSerializer(FirSerializerInput(loweredIr))
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/BackendPhases.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/BackendPhases.kt
index 048572c..7d068f3 100644
--- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/BackendPhases.kt
+++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/BackendPhases.kt
@@ -8,14 +8,18 @@
import org.jetbrains.kotlin.backend.common.phaser.KotlinBackendIrHolder
import org.jetbrains.kotlin.backend.common.phaser.PhaseEngine
import org.jetbrains.kotlin.backend.common.phaser.createSimpleNamedCompilerPhase
+import org.jetbrains.kotlin.backend.common.phaser.makeIrModulePhase
import org.jetbrains.kotlin.backend.konan.KonanCompilationException
+import org.jetbrains.kotlin.backend.konan.KonanConfig
import org.jetbrains.kotlin.backend.konan.NativeGenerationState
import org.jetbrains.kotlin.backend.konan.NativePreSerializationLoweringContext
+import org.jetbrains.kotlin.backend.konan.NativePreSerializationLoweringContext2
import org.jetbrains.kotlin.backend.konan.OutputFiles
import org.jetbrains.kotlin.backend.konan.driver.PhaseContext
import org.jetbrains.kotlin.backend.konan.driver.utilities.getDefaultIrActions
import org.jetbrains.kotlin.backend.konan.ir.KonanSymbols
import org.jetbrains.kotlin.backend.konan.lower.ExpectToActualDefaultValueCopier
+import org.jetbrains.kotlin.backend.konan.lower.InteropLowering
import org.jetbrains.kotlin.backend.konan.lower.SpecialBackendChecksTraversal
import org.jetbrains.kotlin.backend.konan.makeEntryPoint
import org.jetbrains.kotlin.backend.konan.objcexport.createTestBundle
@@ -27,6 +31,7 @@
import org.jetbrains.kotlin.config.messageCollector
import org.jetbrains.kotlin.descriptors.impl.PackageFragmentDescriptorImpl
import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory
+import org.jetbrains.kotlin.fir.descriptors.FirModuleDescriptor
import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.IrFileEntry
@@ -34,7 +39,10 @@
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.ir.declarations.impl.IrFileImpl
+import org.jetbrains.kotlin.ir.declarations.moduleDescriptor
import org.jetbrains.kotlin.ir.inline.konan.nativeLoweringsOfTheFirstPhase
+import org.jetbrains.kotlin.ir.inline.konan.upgradeCallableReferencesPhase
+import org.jetbrains.kotlin.ir.inline.localClassesInInlineLambdasPhase
import org.jetbrains.kotlin.ir.util.NaiveSourceBasedFileEntryImpl
import org.jetbrains.kotlin.ir.util.addChild
import org.jetbrains.kotlin.ir.util.addFile
@@ -86,21 +94,39 @@
runPhase(K2SpecialBackendChecksPhase, fir2IrOutput)
}
-internal fun <T : PhaseContext> PhaseEngine<T>.runPreSerializationLowerings(fir2IrOutput: Fir2IrOutput, environment: KotlinCoreEnvironment): Fir2IrOutput {
+internal fun <T : PhaseContext> PhaseEngine<T>.runPreSerializationLowerings(
+ fir2IrOutput: Fir2IrOutput,
+ environment: KotlinCoreEnvironment,
+ config: KonanConfig,
+): Fir2IrOutput {
val diagnosticReporter = DiagnosticReporterFactory.createReporter(environment.configuration.messageCollector)
val irDiagnosticReporter = KtDiagnosticReporterWithImplicitIrBasedContext(
diagnosticReporter,
environment.configuration.languageVersionSettings
)
- val loweringContext = NativePreSerializationLoweringContext(
+ val loweringContext = NativePreSerializationLoweringContext2(
fir2IrOutput.fir2irActualizedResult.irBuiltIns,
environment.configuration,
irDiagnosticReporter,
+ config,
+ //fir2IrOutput.usedLibraries.entries.associate { it.value to it.key.library },
+ fir2IrOutput.usedPackages.entries.associate { it.key to it.value.library },
)
val preSerializationLowered = newEngine(loweringContext) { engine ->
+ val lowerings = nativeLoweringsOfTheFirstPhase(environment.configuration.languageVersionSettings)
+ .toMutableList()
+ val index = lowerings.indexOfFirst { it == localClassesInInlineLambdasPhase }
+ //val index = lowerings.indexOfFirst { it == upgradeCallableReferencesPhase }
+ if (index != -1) {
+ lowerings.add(index + 1, interopModulePhase)
+// println("QZZ")
+// fir2IrOutput.usedPackages.forEach {
+// println(" ${it.key.packageFqName} ${it.value.library.libraryName} ${it.key.moduleDescriptor}")
+// }
+ }
engine.runPreSerializationLoweringPhases(
fir2IrOutput.fir2irActualizedResult,
- nativeLoweringsOfTheFirstPhase(environment.configuration.languageVersionSettings),
+ lowerings,
)
}
// TODO: After KT-73624, generate native diagnostic tests for `compiler/testData/diagnostics/irInliner/syntheticAccessors`
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/Fir2Ir.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/Fir2Ir.kt
index c192e82..afd19f0 100644
--- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/Fir2Ir.kt
+++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/Fir2Ir.kt
@@ -10,15 +10,18 @@
import org.jetbrains.kotlin.backend.konan.driver.PhaseContext
import org.jetbrains.kotlin.backend.konan.fir2Ir
import org.jetbrains.kotlin.backend.konan.ir.KonanSymbols
+import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.fir.pipeline.Fir2IrActualizedResult
import org.jetbrains.kotlin.fir.pipeline.FirResult
+import org.jetbrains.kotlin.ir.declarations.IrExternalPackageFragment
import org.jetbrains.kotlin.library.metadata.resolver.KotlinResolvedLibrary
internal data class Fir2IrOutput(
val firResult: FirResult,
val symbols: KonanSymbols,
val fir2irActualizedResult: Fir2IrActualizedResult,
- val usedLibraries: Set<KotlinResolvedLibrary>
+ val usedLibraries: Set<KotlinResolvedLibrary>,
+ val usedPackages: Map<IrExternalPackageFragment, KotlinResolvedLibrary>
)
internal val Fir2IrPhase = createSimpleNamedCompilerPhase(
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/NativeLoweringPhases.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/NativeLoweringPhases.kt
index 5d6b958..6822e92 100644
--- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/NativeLoweringPhases.kt
+++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/NativeLoweringPhases.kt
@@ -7,6 +7,7 @@
import org.jetbrains.kotlin.backend.common.BodyLoweringPass
import org.jetbrains.kotlin.backend.common.FileLoweringPass
+import org.jetbrains.kotlin.backend.common.PreSerializationLoweringContext
import org.jetbrains.kotlin.backend.common.ir.Symbols
import org.jetbrains.kotlin.backend.common.ir.isReifiable
import org.jetbrains.kotlin.backend.common.lower.*
@@ -33,6 +34,7 @@
import org.jetbrains.kotlin.ir.inline.*
import org.jetbrains.kotlin.backend.konan.lower.NativeAssertionWrapperLowering
import org.jetbrains.kotlin.backend.konan.optimizations.CastsOptimization
+import org.jetbrains.kotlin.config.CommonConfigurationKeys
import org.jetbrains.kotlin.ir.interpreter.IrInterpreterConfiguration
internal typealias LoweringList = List<NamedCompilerPhase<NativeGenerationState, IrFile, IrFile>>
@@ -376,6 +378,13 @@
prerequisite = setOf(extractLocalClassesFromInlineBodies)
)
+val interopModulePhase = makeIrModulePhase(
+ lowering = { context: PreSerializationLoweringContext ->
+ InteropLowering(context as NativeLoweringContext, null)
+ },
+ name = "Interop",
+)
+
private val specialInteropIntrinsicsPhase = createFileLoweringPhase(
lowering = ::SpecialInteropIntrinsicsLowering,
name = "SpecialInteropIntrinsics",
@@ -391,7 +400,7 @@
private val varargPhase = createFileLoweringPhase(
::VarargInjectionLowering,
name = "Vararg",
- prerequisite = setOf(functionReferencePhase, defaultParameterExtentPhase, interopPhase, functionsWithoutBoundCheck)
+ prerequisite = setOf(functionReferencePhase, defaultParameterExtentPhase, /*interopPhase, */functionsWithoutBoundCheck)
)
private val coroutinesPhase = createFileLoweringPhase(
@@ -566,7 +575,7 @@
lateinitPhase,
sharedVariablesPhase,
extractLocalClassesFromInlineBodies,
- interopPhase,
+ //interopPhase,
arrayConstructorPhase,
inlineOnlyPrivateFunctionsPhase,
outerThisSpecialAccessorInInlineFunctionsPhase,
@@ -574,6 +583,7 @@
)
internal fun KonanConfig.getLoweringsAfterInlining(): LoweringList = listOfNotNull(
+ interopPhase,//.takeIf { !this.configuration.getBoolean(CommonConfigurationKeys.USE_FIR) },
specializeSharedVariableBoxes,
specialInteropIntrinsicsPhase,
dumpTestsPhase.takeIf { this.configuration.getNotNull(KonanConfigKeys.GENERATE_TEST_RUNNER) != TestRunnerKind.NONE },
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/TopLevelPhases.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/TopLevelPhases.kt
index 2181434..edeac01 100644
--- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/TopLevelPhases.kt
+++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/TopLevelPhases.kt
@@ -65,7 +65,8 @@
val additionalOutput = produceAdditionalOutput(psiToIrEngine)
val psiToIrInput = PsiToIrInput(frontendOutput.moduleDescriptor, frontendOutput.environment, isProducingLibrary)
val output = psiToIrEngine.runPhase(PsiToIrPhase, psiToIrInput)
- psiToIrEngine.runSpecialBackendChecks(output.irModule, output.irBuiltIns, output.symbols)
+ if (!config.produce.isCache)
+ psiToIrEngine.runSpecialBackendChecks(output.irModule, output.irBuiltIns, output.symbols)
output to additionalOutput
}
runPhase(CopyDefaultValuesToActualPhase, psiToIrOutput)
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 eb6c576..5d0ba7f 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
@@ -9,6 +9,7 @@
import org.jetbrains.kotlin.backend.konan.llvm.KonanMetadata
import org.jetbrains.kotlin.backend.konan.serialization.isFromCInteropLibrary
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
+import org.jetbrains.kotlin.fir.descriptors.FirModuleDescriptor
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrCall
import org.jetbrains.kotlin.ir.expressions.IrExpression
@@ -16,6 +17,7 @@
import org.jetbrains.kotlin.library.KotlinLibrary
import org.jetbrains.kotlin.library.metadata.DeserializedKlibModuleOrigin
import org.jetbrains.kotlin.library.metadata.klibModuleOrigin
+import org.jetbrains.kotlin.library.metadata.klibModuleOriginIfExists
import org.jetbrains.kotlin.utils.atMostOne
internal fun IrExpression.isBoxOrUnboxCall() =
@@ -31,7 +33,8 @@
it.allOverriddenFunctions.atMostOne { it.parent == this }
}
-val ModuleDescriptor.konanLibrary get() = (this.klibModuleOrigin as? DeserializedKlibModuleOrigin)?.library
+val ModuleDescriptor.konanLibrary get() = (this.klibModuleOriginIfExists as? DeserializedKlibModuleOrigin)?.library
+//val ModuleDescriptor.konanLibrary get() = (this.klibModuleOrigin as? DeserializedKlibModuleOrigin)?.library
val IrPackageFragment.konanLibrary: KotlinLibrary?
get() {
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/CacheInfoBuilder.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/CacheInfoBuilder.kt
index 9c08818..456ef11 100644
--- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/CacheInfoBuilder.kt
+++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/CacheInfoBuilder.kt
@@ -61,7 +61,11 @@
if (!declaration.isFakeOverride && declaration.isInline && declaration.isExported) {
val inlineFunctionSerializer = InlineFunctionSerializer(moduleDeserializer)
- generationState.inlineFunctionBodies.add(inlineFunctionSerializer.buildInlineFunctionReference(declaration))
+ val element = inlineFunctionSerializer.buildInlineFunctionReference(declaration)
+ generationState.inlineFunctionBodies.add(element)
+// if (declaration.name.asString() == "useContents") {
+// println("YEAH: ${element.functionSignature} ${declaration.symbol.signature?.render()} ${declaration.render()}")
+// }
trackCallees(declaration)
}
}
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropCallConvertors.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropCallConvertors.kt
index 5712846..2e479ec 100644
--- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropCallConvertors.kt
+++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropCallConvertors.kt
@@ -9,6 +9,7 @@
import org.jetbrains.kotlin.backend.konan.cgen.*
import org.jetbrains.kotlin.ir.util.getAnnotationStringValue
import org.jetbrains.kotlin.backend.konan.ir.KonanSymbols
+import org.jetbrains.kotlin.backend.konan.ir.isAny
import org.jetbrains.kotlin.backend.konan.llvm.IntrinsicType
import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.builders.*
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropLowering.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropLowering.kt
index fbab927..abf0117 100644
--- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropLowering.kt
+++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropLowering.kt
@@ -19,6 +19,7 @@
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.IrStatement
+import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.builders.declarations.IrValueParameterBuilder
import org.jetbrains.kotlin.ir.builders.declarations.buildFun
@@ -35,22 +36,45 @@
import org.jetbrains.kotlin.ir.util.isSubtypeOf
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
import org.jetbrains.kotlin.konan.ForeignExceptionMode
-import org.jetbrains.kotlin.konan.library.KonanLibrary
+import org.jetbrains.kotlin.library.KotlinLibrary
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.name.NativeStandardInteropNames.objCActionClassId
import org.jetbrains.kotlin.native.interop.ObjCMethodInfo
-internal class InteropLowering(val context: Context, val fileLowerState: FileLowerState) : FileLoweringPass, BodyLoweringPass {
+internal class InteropLowering(val context: NativeLoweringContext, val fileLowerState: FileLowerState?) : FileLoweringPass, BodyLoweringPass {
override fun lower(irFile: IrFile) {
+ if (irFile.hasAnnotation(context.symbols.interopLowered))
+ return
+ val fileLowerState = this.fileLowerState ?: FileLowerState()
// TODO: merge these lowerings.
InteropLoweringPart1(context, fileLowerState).lower(irFile)
InteropLoweringPart2(context, fileLowerState).lower(irFile)
+ irFile.annotations += buildSimpleAnnotation(
+ context.irBuiltIns, UNDEFINED_OFFSET, UNDEFINED_OFFSET,
+ context.symbols.interopLowered.owner
+ )
+
+// println("BEFORE:")
+// println(irFile.dump())
+
+// CollectInteropBridges(generationState).lower(irFile)
+
+// println("AFTER:")
+// println(irFile.dump())
}
override fun lower(irBody: IrBody, container: IrDeclaration) {
+ if (container.hasAnnotation(context.symbols.interopLowered))
+ return
+ val fileLowerState = this.fileLowerState ?: error("Expected to be called in per-file mode")
InteropLoweringPart1(context, fileLowerState).lower(irBody, container)
InteropLoweringPart2(context, fileLowerState).lower(irBody, container)
+ container.annotations += buildSimpleAnnotation(
+ context.irBuiltIns, UNDEFINED_OFFSET, UNDEFINED_OFFSET,
+ context.symbols.interopLowered.owner
+ )
+// CollectInteropBridges(generationState).lower(irBody, container)
}
}
@@ -59,7 +83,7 @@
}
private abstract class BaseInteropIrTransformer(
- protected val context: Context,
+ protected val context: NativeLoweringContext,
protected val fileLowerState: FileLowerState,
protected val irFile: IrFile?,
) : IrBuildingTransformer(context) {
@@ -113,8 +137,8 @@
override val symbols get() = context.symbols
override val typeSystem: IrTypeSystemContext get() = context.typeSystem
- val klib: KonanLibrary? get() {
- return (element as? IrCall)?.symbol?.owner?.konanLibrary as? KonanLibrary
+ val klib: KotlinLibrary? = (element as? IrCall)?.symbol?.owner?.getPackageFragment()?.let {
+ getPackageFragmentLibrary(it)
}
override val language: String
@@ -131,6 +155,13 @@
override fun getUniqueKotlinFunctionReferenceClassName(prefix: String) =
fileLowerState.getFunctionReferenceImplUniqueName(prefix)
+ override fun getPackageFragmentLibrary(packageFragment: IrPackageFragment): KotlinLibrary? {
+ (packageFragment as? IrExternalPackageFragment)?.let {
+ return context.getExternalPackageFragmentLibrary(it)
+ }
+ return packageFragment.konanLibrary
+ }
+
override val target get() = context.config.target
override fun throwCompilerError(element: IrElement?, message: String): Nothing {
@@ -146,7 +177,7 @@
renderCompilerError(irFile, element, message)
}
-private class InteropLoweringPart1(val context: Context, val fileLowerState: FileLowerState) : FileLoweringPass, BodyLoweringPass {
+private class InteropLoweringPart1(val context: NativeLoweringContext, val fileLowerState: FileLowerState) : FileLoweringPass, BodyLoweringPass {
private var topLevelInitializersCounter = 0
override fun lower(irFile: IrFile) {
@@ -190,7 +221,7 @@
}
private class InteropTransformerPart1(
- context: Context,
+ context: NativeLoweringContext,
fileLowerState: FileLowerState,
irFile: IrFile?,
) : BaseInteropIrTransformer(context, fileLowerState, irFile) {
@@ -597,6 +628,8 @@
}
override fun visitCall(expression: IrCall): IrExpression {
+ if (tryGetIntrinsicType(expression) == IntrinsicType.INIT_INSTANCE) return expression // Avoid double lowering.
+
expression.transformChildrenVoid()
val callee = expression.symbol.owner
@@ -703,7 +736,7 @@
/**
* Lowers some interop intrinsic calls.
*/
-private class InteropLoweringPart2(val context: Context, val fileLowerState: FileLowerState) : FileLoweringPass, BodyLoweringPass {
+private class InteropLoweringPart2(val context: NativeLoweringContext, val fileLowerState: FileLowerState) : FileLoweringPass, BodyLoweringPass {
override fun lower(irFile: IrFile) {
val transformer = InteropTransformerPart2(context, fileLowerState, irFile)
irFile.transformChildrenVoid(transformer)
@@ -716,7 +749,7 @@
}
private class InteropTransformerPart2(
- context: Context,
+ context: NativeLoweringContext,
fileLowerState: FileLowerState,
irFile: IrFile?,
) : BaseInteropIrTransformer(context, fileLowerState, irFile) {
@@ -811,7 +844,8 @@
val function = expression.symbol.owner
val exceptionMode = ForeignExceptionMode.byValue(
- function.konanLibrary?.manifestProperties?.getProperty(ForeignExceptionMode.manifestKey)
+ context.getExternalPackageFragmentLibrary(function.getPackageFragment() as IrExternalPackageFragment)
+ ?.manifestProperties?.getProperty(ForeignExceptionMode.manifestKey)
)
return builder.generateExpressionWithStubs(expression) { generateCCall(expression, builder, isInvoke = false, exceptionMode) }
}
@@ -865,8 +899,8 @@
}
private fun lowerWorkerExecute(expression: IrCall): IrExpression {
- val staticFunctionArgument = unwrapStaticFunctionArgument(expression.arguments[3]!!)
- require(staticFunctionArgument != null) { renderCompilerError(expression) }
+ val staticFunctionArgument = unwrapStaticFunctionArgument(expression.arguments[3]!!) ?: error("BUGBUGBUG: ${expression.dump()}")
+ //require(staticFunctionArgument != null) { renderCompilerError(expression) }
builder.at(expression)
val targetSymbol = staticFunctionArgument.function.symbol
@@ -901,6 +935,7 @@
IntrinsicType.OBJC_INIT_BY -> return lowerObjCInitBy(expression)
IntrinsicType.INTEROP_STATIC_C_FUNCTION -> return lowerStaticCFunction(expression)
IntrinsicType.WORKER_EXECUTE -> return lowerWorkerExecute(expression)
+ IntrinsicType.INIT_INSTANCE -> return expression // Avoid double lowering.
else -> Unit
}
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 ce58da5..f5dc070 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
@@ -64,7 +64,7 @@
LocalClassesInInlineLambdasLowering(context).lower(body, function)
- InteropLowering(context, generationState.fileLowerState).lower(body, function)
+ //InteropLowering(context, generationState.fileLowerState).lower(body, function)
ArrayConstructorLowering(context).lower(body, function)
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/SpecialBackendChecksTraversal.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/SpecialBackendChecksTraversal.kt
index 1b36238..b3c5d8f 100644
--- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/SpecialBackendChecksTraversal.kt
+++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/SpecialBackendChecksTraversal.kt
@@ -312,8 +312,12 @@
expression.symbol.owner.getObjCInitMethod()?.let { initMethod ->
- if (!expression.symbol.owner.objCConstructorIsDesignated())
- reportError(expression, "Unable to call non-designated initializer as super constructor")
+ if (!expression.symbol.owner.objCConstructorIsDesignated()) {
+// print("BUGBUGBUG: ${expression.dump()}")
+// println(expression.symbol.owner.dump())
+ error("Unable to call non-designated initializer as super constructor")
+// reportError(expression, "Unable to call non-designated initializer as super constructor")
+ }
checkCanGenerateObjCCall(
method = initMethod,
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/CacheSerializationSupport.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/CacheSerializationSupport.kt
index 6c21562..f61ea32 100644
--- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/CacheSerializationSupport.kt
+++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/CacheSerializationSupport.kt
@@ -122,10 +122,14 @@
) {
private val inlineFunctionReferences: Map<IdSignature, SerializedInlineFunctionReference> by lazy {
val cache = cachedLibraries.getLibraryCache(deserializer.klib) ?: error("No cache for ${deserializer.klib.libraryName}")
+ //println("ZZZ: ${deserializer.klib.libraryName}")
cache.serializedInlineFunctionBodies.associateBy {
with(deserializer) {
val symbolDeserializer = it.file.deserializationState.declarationDeserializer.symbolDeserializer
- symbolDeserializer.deserializeIdSignature(it.functionSignature)
+ symbolDeserializer.deserializeIdSignature(it.functionSignature)/*.also { signature ->
+ //if (it.functionSignature == 829)
+ println(" ${it.functionSignature}: ${signature.render()}")
+ }*/
}
}
}
@@ -146,6 +150,8 @@
val fileDeserializationState = with(deserializer) { inlineFunctionReference.file.deserializationState }
val declarationDeserializer = fileDeserializationState.declarationDeserializer
+ //println("QZZ: ${function.render()} ${signature.render()}")
+
if (packageFragment is IrExternalPackageFragment) {
val symbolDeserializer = declarationDeserializer.symbolDeserializer
val outerClasses = (function.parent as? IrClass)?.getOuterClasses(takeOnlyInner = true) ?: emptyList()
diff --git a/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/Annotations.kt b/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/Annotations.kt
index 462f6b6..47c46ce 100644
--- a/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/Annotations.kt
+++ b/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/Annotations.kt
@@ -161,3 +161,6 @@
@Retention(value = AnnotationRetention.BINARY)
@ExperimentalNativeApi
public annotation class ExportedBridge(val bridgeName: String)
+
+@Target(AnnotationTarget.FUNCTION, AnnotationTarget.FILE)
+internal annotation class InteropLowered
\ No newline at end of file