Eliminated dependency of library reader interface on compiler configuration.
This commit is contained in:
committed by
alexander-gorshenev
parent
b0d27820c8
commit
7b2f3923a6
+8
-3
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+16
-20
@@ -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.
|
||||||
|
|||||||
+4
-4
@@ -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)
|
||||||
|
|||||||
+4
-2
@@ -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),
|
||||||
|
|||||||
Reference in New Issue
Block a user