diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt index 00cafbb78e1..5460a405179 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.backend.konan.library.SplitLibraryReader import org.jetbrains.kotlin.backend.konan.util.profile import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.config.CompilerConfiguration +import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import java.io.File @@ -44,20 +45,24 @@ class KonanConfig(val project: Project, val configuration: CompilerConfiguration internal val libraries: List by lazy { // Here we have chosen a particular KonanLibraryReader implementation - libraryNames.map{it -> SplitLibraryReader(it, configuration)} + val currentAbiVersion = configuration.get(KonanConfigKeys.ABI_VERSION)!! + val target = targetManager.currentName + libraryNames.map{it -> SplitLibraryReader(it, currentAbiVersion, target)} } private val loadedDescriptors = loadLibMetadata() - internal val nativeLibraries: List = configuration.getList(KonanConfigKeys.NATIVE_LIBRARY_FILES) + internal val nativeLibraries: List = + configuration.getList(KonanConfigKeys.NATIVE_LIBRARY_FILES) fun loadLibMetadata(): List { val allMetadata = mutableListOf() + val specifics = configuration.get(CommonConfigurationKeys.LANGUAGE_VERSION_SETTINGS)!! for (klib in libraries) { profile("Loading ${klib.libraryName}") { - val moduleDescriptor = klib.moduleDescriptor + val moduleDescriptor = klib.moduleDescriptor(specifics) allMetadata.add(moduleDescriptor) } } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/library/KonanLibrary.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/library/KonanLibrary.kt index 7b93a3ee61a..ff2714e8908 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/library/KonanLibrary.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/library/KonanLibrary.kt @@ -26,26 +26,24 @@ import org.jetbrains.kotlin.backend.konan.util.File import org.jetbrains.kotlin.backend.konan.util.copyTo import org.jetbrains.kotlin.backend.konan.util.unzipAs import org.jetbrains.kotlin.backend.konan.util.zipDirAs -import org.jetbrains.kotlin.config.CompilerConfiguration +import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl interface KonanLibraryReader { val libraryName: String val moduleName: String - val moduleDescriptor: ModuleDescriptorImpl val bitcodePaths: List + fun moduleDescriptor(specifics: LanguageVersionSettings): ModuleDescriptorImpl } -abstract class FileBasedLibraryReader( - val file: File, - val configuration: CompilerConfiguration, +abstract open class FileBasedLibraryReader( + val file: File, val currentAbiVersion: Int, val reader: MetadataReader): KonanLibraryReader { override val libraryName: String get() = file.path - protected val namedModuleData by lazy { - val currentAbiVersion = configuration.get(KonanConfigKeys.ABI_VERSION)!! + protected val namedModuleData: NamedModuleData by lazy { reader.loadSerializedModule(currentAbiVersion) } @@ -58,11 +56,9 @@ abstract class FileBasedLibraryReader( protected fun packageMetadata(fqName: String): Base64 = reader.loadSerializedPackageFragment(fqName) - override val moduleDescriptor: ModuleDescriptorImpl by lazy { - deserializeModule(configuration, - {it -> packageMetadata(it)}, + override fun moduleDescriptor(specifics: LanguageVersionSettings) + = deserializeModule(specifics, {packageMetadata(it)}, tableOfContentsAsString, moduleName) - } } // This scheme describes the Konan Library (klib) layout. @@ -91,14 +87,13 @@ interface SplitScheme { = File(linkdataDir, if (packageName == "") "" else packageName) } -// TODO: Get rid of the configuration here. -class SplitLibraryReader(override val libDir: File, configuration: CompilerConfiguration) - : FileBasedLibraryReader(libDir, configuration, SplitMetadataReader(libDir)), +class SplitLibraryReader(override val libDir: File, currentAbiVersion: Int, + override val target: String) : + FileBasedLibraryReader(libDir, currentAbiVersion, SplitMetadataReader(libDir)), SplitScheme { - public constructor(path: String, configuration: CompilerConfiguration) : this(File(path), configuration) - - override val target: String? = TargetManager(configuration).currentName + public constructor(path: String, currentAbiVersion: Int, target: String) : + this(File(path), currentAbiVersion, target) init { unpackIfNeeded() @@ -149,10 +144,11 @@ abstract class FileBasedLibraryWriter ( val file: File): KonanLibraryWriter { } -class SplitLibraryWriter(override val libDir: File, override val target: String?, val nopack: Boolean = false): - FileBasedLibraryWriter(libDir), SplitScheme { +class SplitLibraryWriter(override val libDir: File, override val target: String?, + val nopack: Boolean = false): FileBasedLibraryWriter(libDir), SplitScheme { - public constructor(path: String, target: String, nopack: Boolean): this(File(path), target, nopack) + public constructor(path: String, target: String, nopack: Boolean): + this(File(path), target, nopack) // TODO: Experiment with separate bitcode files. // Per package or per class. diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/library/KtBcLibrary.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/library/KtBcLibrary.kt index 2c1883d2875..03787f87f28 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/library/KtBcLibrary.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/library/KtBcLibrary.kt @@ -26,13 +26,13 @@ import org.jetbrains.kotlin.backend.konan.util.File import org.jetbrains.kotlin.backend.konan.util.copyTo import org.jetbrains.kotlin.backend.konan.util.unzipAs import org.jetbrains.kotlin.backend.konan.util.zipDirAs -import org.jetbrains.kotlin.config.CompilerConfiguration +import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl -class KtBcLibraryReader(file: File, configuration: CompilerConfiguration) - : FileBasedLibraryReader(file, configuration, KtBcMetadataReader(file)) { +class KtBcLibraryReader(file: File, currentAbiVersion: Int) + : FileBasedLibraryReader(file, currentAbiVersion, KtBcMetadataReader(file)) { - public constructor(path: String, configuration: CompilerConfiguration) : this(File(path), configuration) + public constructor(path: String, currentAbiVersion: Int) : this(File(path), currentAbiVersion) override val bitcodePaths: List get() = listOf(libraryName) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanSerializationUtil.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanSerializationUtil.kt index 098faabdae9..a8bf61bde80 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanSerializationUtil.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanSerializationUtil.kt @@ -24,6 +24,8 @@ import org.jetbrains.kotlin.backend.konan.llvm.base64Decode import org.jetbrains.kotlin.backend.konan.llvm.base64Encode import org.jetbrains.kotlin.backend.konan.llvm.isExported import org.jetbrains.kotlin.config.CompilerConfiguration +import org.jetbrains.kotlin.config.LanguageVersion +import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor @@ -127,7 +129,7 @@ internal fun deserializePackageFragment(base64: Base64): KonanLinkData.PackageFr KonanSerializerProtocol.extensionRegistry) } -internal fun deserializeModule(configuration: CompilerConfiguration, +internal fun deserializeModule(languageVersionSettings: LanguageVersionSettings, packageLoader:(String)->Base64, library: Base64, moduleName: String): ModuleDescriptorImpl { val storageManager = LockBasedStorageManager() @@ -135,7 +137,7 @@ internal fun deserializeModule(configuration: CompilerConfiguration, val moduleDescriptor = ModuleDescriptorImpl( Name.special(moduleName), storageManager, builtIns) builtIns.builtInsModule = moduleDescriptor - val deserializationConfiguration = CompilerDeserializationConfiguration(configuration.languageVersionSettings) + val deserializationConfiguration = CompilerDeserializationConfiguration(languageVersionSettings) val libraryProto = KonanLinkData.Library .parseFrom(base64ToStream(library),