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.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)
|
||||
}
|
||||
}
|
||||
|
||||
+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.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.
|
||||
|
||||
+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.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)
|
||||
|
||||
+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.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),
|
||||
|
||||
Reference in New Issue
Block a user