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.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<KonanLibraryReader> 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<String> = configuration.getList(KonanConfigKeys.NATIVE_LIBRARY_FILES)
internal val nativeLibraries: List<String> =
configuration.getList(KonanConfigKeys.NATIVE_LIBRARY_FILES)
fun loadLibMetadata(): List<ModuleDescriptorImpl> {
val allMetadata = mutableListOf<ModuleDescriptorImpl>()
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)
}
}
@@ -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<String>
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 == "") "<root>" 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.
@@ -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<String>
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.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),