Eliminated dependency of library reader interface on compiler configuration.

This commit is contained in:
Alexander Gorshenev
2017-05-19 03:16:07 +03:00
committed by alexander-gorshenev
parent b0d27820c8
commit 7b2f3923a6
4 changed files with 32 additions and 29 deletions
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.backend.konan.library.SplitLibraryReader
import org.jetbrains.kotlin.backend.konan.util.profile import org.jetbrains.kotlin.backend.konan.util.profile
import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.config.CommonConfigurationKeys
import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import java.io.File import java.io.File
@@ -44,20 +45,24 @@ class KonanConfig(val project: Project, val configuration: CompilerConfiguration
internal val libraries: List<KonanLibraryReader> by lazy { internal val libraries: List<KonanLibraryReader> by lazy {
// Here we have chosen a particular KonanLibraryReader implementation // 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() private val loadedDescriptors = loadLibMetadata()
internal val nativeLibraries: List<String> = configuration.getList(KonanConfigKeys.NATIVE_LIBRARY_FILES) internal val nativeLibraries: List<String> =
configuration.getList(KonanConfigKeys.NATIVE_LIBRARY_FILES)
fun loadLibMetadata(): List<ModuleDescriptorImpl> { fun loadLibMetadata(): List<ModuleDescriptorImpl> {
val allMetadata = mutableListOf<ModuleDescriptorImpl>() val allMetadata = mutableListOf<ModuleDescriptorImpl>()
val specifics = configuration.get(CommonConfigurationKeys.LANGUAGE_VERSION_SETTINGS)!!
for (klib in libraries) { for (klib in libraries) {
profile("Loading ${klib.libraryName}") { profile("Loading ${klib.libraryName}") {
val moduleDescriptor = klib.moduleDescriptor val moduleDescriptor = klib.moduleDescriptor(specifics)
allMetadata.add(moduleDescriptor) allMetadata.add(moduleDescriptor)
} }
} }
@@ -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.copyTo
import org.jetbrains.kotlin.backend.konan.util.unzipAs import org.jetbrains.kotlin.backend.konan.util.unzipAs
import org.jetbrains.kotlin.backend.konan.util.zipDirAs 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 import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
interface KonanLibraryReader { interface KonanLibraryReader {
val libraryName: String val libraryName: String
val moduleName: String val moduleName: String
val moduleDescriptor: ModuleDescriptorImpl
val bitcodePaths: List<String> val bitcodePaths: List<String>
fun moduleDescriptor(specifics: LanguageVersionSettings): ModuleDescriptorImpl
} }
abstract class FileBasedLibraryReader( abstract open class FileBasedLibraryReader(
val file: File, val file: File, val currentAbiVersion: Int,
val configuration: CompilerConfiguration,
val reader: MetadataReader): KonanLibraryReader { val reader: MetadataReader): KonanLibraryReader {
override val libraryName: String override val libraryName: String
get() = file.path get() = file.path
protected val namedModuleData by lazy { protected val namedModuleData: NamedModuleData by lazy {
val currentAbiVersion = configuration.get(KonanConfigKeys.ABI_VERSION)!!
reader.loadSerializedModule(currentAbiVersion) reader.loadSerializedModule(currentAbiVersion)
} }
@@ -58,11 +56,9 @@ abstract class FileBasedLibraryReader(
protected fun packageMetadata(fqName: String): Base64 = protected fun packageMetadata(fqName: String): Base64 =
reader.loadSerializedPackageFragment(fqName) reader.loadSerializedPackageFragment(fqName)
override val moduleDescriptor: ModuleDescriptorImpl by lazy { override fun moduleDescriptor(specifics: LanguageVersionSettings)
deserializeModule(configuration, = deserializeModule(specifics, {packageMetadata(it)},
{it -> packageMetadata(it)},
tableOfContentsAsString, moduleName) tableOfContentsAsString, moduleName)
}
} }
// This scheme describes the Konan Library (klib) layout. // This scheme describes the Konan Library (klib) layout.
@@ -91,14 +87,13 @@ interface SplitScheme {
= File(linkdataDir, if (packageName == "") "<root>" else packageName) = File(linkdataDir, if (packageName == "") "<root>" else packageName)
} }
// TODO: Get rid of the configuration here. class SplitLibraryReader(override val libDir: File, currentAbiVersion: Int,
class SplitLibraryReader(override val libDir: File, configuration: CompilerConfiguration) override val target: String) :
: FileBasedLibraryReader(libDir, configuration, SplitMetadataReader(libDir)), FileBasedLibraryReader(libDir, currentAbiVersion, SplitMetadataReader(libDir)),
SplitScheme { SplitScheme {
public constructor(path: String, configuration: CompilerConfiguration) : this(File(path), configuration) public constructor(path: String, currentAbiVersion: Int, target: String) :
this(File(path), currentAbiVersion, target)
override val target: String? = TargetManager(configuration).currentName
init { init {
unpackIfNeeded() unpackIfNeeded()
@@ -149,10 +144,11 @@ abstract class FileBasedLibraryWriter (
val file: File): KonanLibraryWriter { val file: File): KonanLibraryWriter {
} }
class SplitLibraryWriter(override val libDir: File, override val target: String?, val nopack: Boolean = false): class SplitLibraryWriter(override val libDir: File, override val target: String?,
FileBasedLibraryWriter(libDir), SplitScheme { 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. // TODO: Experiment with separate bitcode files.
// Per package or per class. // Per package or per class.
@@ -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.copyTo
import org.jetbrains.kotlin.backend.konan.util.unzipAs import org.jetbrains.kotlin.backend.konan.util.unzipAs
import org.jetbrains.kotlin.backend.konan.util.zipDirAs 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 import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
class KtBcLibraryReader(file: File, configuration: CompilerConfiguration) class KtBcLibraryReader(file: File, currentAbiVersion: Int)
: FileBasedLibraryReader(file, configuration, KtBcMetadataReader(file)) { : 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<String> override val bitcodePaths: List<String>
get() = listOf(libraryName) get() = listOf(libraryName)
@@ -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.base64Encode
import org.jetbrains.kotlin.backend.konan.llvm.isExported import org.jetbrains.kotlin.backend.konan.llvm.isExported
import org.jetbrains.kotlin.config.CompilerConfiguration 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.config.languageVersionSettings
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor
@@ -127,7 +129,7 @@ internal fun deserializePackageFragment(base64: Base64): KonanLinkData.PackageFr
KonanSerializerProtocol.extensionRegistry) KonanSerializerProtocol.extensionRegistry)
} }
internal fun deserializeModule(configuration: CompilerConfiguration, internal fun deserializeModule(languageVersionSettings: LanguageVersionSettings,
packageLoader:(String)->Base64, library: Base64, moduleName: String): ModuleDescriptorImpl { packageLoader:(String)->Base64, library: Base64, moduleName: String): ModuleDescriptorImpl {
val storageManager = LockBasedStorageManager() val storageManager = LockBasedStorageManager()
@@ -135,7 +137,7 @@ internal fun deserializeModule(configuration: CompilerConfiguration,
val moduleDescriptor = ModuleDescriptorImpl( val moduleDescriptor = ModuleDescriptorImpl(
Name.special(moduleName), storageManager, builtIns) Name.special(moduleName), storageManager, builtIns)
builtIns.builtInsModule = moduleDescriptor builtIns.builtInsModule = moduleDescriptor
val deserializationConfiguration = CompilerDeserializationConfiguration(configuration.languageVersionSettings) val deserializationConfiguration = CompilerDeserializationConfiguration(languageVersionSettings)
val libraryProto = KonanLinkData.Library val libraryProto = KonanLinkData.Library
.parseFrom(base64ToStream(library), .parseFrom(base64ToStream(library),