From b42916b08ec254896d9e381251e20bf0b3967cce Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Thu, 18 May 2017 12:47:33 +0300 Subject: [PATCH] Shuffle some library classes around. --- .../jetbrains/kotlin/backend/konan/Context.kt | 7 +- .../kotlin/backend/konan/KonanConfig.kt | 2 + .../backend/konan/library/KonanLibrary.kt | 47 +----------- .../backend/konan/library/KtBcLibrary.kt | 73 ++++++++++++++++++ .../KtBcMetadataGenerator.kt} | 61 +-------------- .../konan/library/MetadataGenerator.kt | 76 +++++++++++++++++++ .../kotlin/backend/konan/llvm/IrToBitcode.kt | 7 +- .../serialization/KonanSerializationUtil.kt | 2 +- 8 files changed, 167 insertions(+), 108 deletions(-) create mode 100644 backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/library/KtBcLibrary.kt rename backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/{llvm/MetadataGenerator.kt => library/KtBcMetadataGenerator.kt} (74%) create mode 100644 backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/library/MetadataGenerator.kt diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt index e6b6b3be470..44fdefb52be 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt @@ -16,12 +16,15 @@ package org.jetbrains.kotlin.backend.konan -import llvm.* -import org.jetbrains.kotlin.backend.common.validateIrModule +import llvm.LLVMDumpModule +import llvm.LLVMModuleRef import org.jetbrains.kotlin.backend.jvm.descriptors.initialize +import org.jetbrains.kotlin.backend.common.validateIrModule import org.jetbrains.kotlin.backend.konan.descriptors.* import org.jetbrains.kotlin.backend.konan.ir.DumpIrTreeWithDescriptorsVisitor import org.jetbrains.kotlin.backend.konan.ir.Ir +import org.jetbrains.kotlin.backend.konan.library.LinkData +import org.jetbrains.kotlin.backend.konan.library.KonanLibraryWriter import org.jetbrains.kotlin.backend.konan.llvm.* import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.Annotations 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 d6ba46d83d5..00cafbb78e1 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 @@ -17,6 +17,8 @@ package org.jetbrains.kotlin.backend.konan import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.backend.konan.library.KonanLibraryReader +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 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 090ce757861..d5cea310563 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 @@ -14,12 +14,12 @@ * limitations under the License. */ -package org.jetbrains.kotlin.backend.konan +package org.jetbrains.kotlin.backend.konan.library -import llvm.LLVMLinkModules2 import llvm.LLVMModuleRef import llvm.LLVMWriteBitcodeToFile -import org.jetbrains.kotlin.backend.konan.llvm.* +import org.jetbrains.kotlin.backend.konan.KonanConfigKeys +import org.jetbrains.kotlin.backend.konan.TargetManager import org.jetbrains.kotlin.backend.konan.serialization.Base64 import org.jetbrains.kotlin.backend.konan.serialization.deserializeModule import org.jetbrains.kotlin.backend.konan.util.File @@ -65,16 +65,6 @@ abstract class FileBasedLibraryReader( } } -class KtBcLibraryReader(file: File, configuration: CompilerConfiguration) - : FileBasedLibraryReader(file, configuration, KtBcMetadataReader(file)) { - - public constructor(path: String, configuration: CompilerConfiguration) : this(File(path), configuration) - - override val bitcodePaths: List - get() = listOf(libraryName) - -} - // TODO: Get rid of the configuration here. class SplitLibraryReader(val libDir: File, configuration: CompilerConfiguration) : FileBasedLibraryReader(libDir, configuration, SplitMetadataReader(libDir)) { @@ -143,37 +133,6 @@ abstract class FileBasedLibraryWriter ( val file: File): KonanLibraryWriter { } -class KtBcLibraryWriter(file: File, val llvmModule: LLVMModuleRef) - : FileBasedLibraryWriter(file) { - - override val mainBitcodeFileName = file.path - - public constructor(path: String, llvmModule: LLVMModuleRef) - : this(File(path), llvmModule) - - override fun addKotlinBitcode(llvmModule: LLVMModuleRef) { - // This is a noop for .kt.bc based libraries, - // because the bitcode itself is the container. - } - - override fun addLinkData(linkData: LinkData) { - MetadataGenerator(llvmModule).addLinkData(linkData) - } - - override fun addNativeBitcode(library: String) { - - val libraryModule = parseBitcodeFile(library) - val failed = LLVMLinkModules2(llvmModule, libraryModule) - if (failed != 0) { - throw Error("failed to link $library") // TODO: retrieve error message from LLVM. - } - } - - override fun commit() { - LLVMWriteBitcodeToFile(llvmModule, file.path) - } -} - class SplitLibraryWriter(val libDir: File, target: String, val nopack: Boolean = false): FileBasedLibraryWriter(libDir) { public constructor(path: String, target: String, nopack: Boolean): this(File(path), target, nopack) 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 new file mode 100644 index 00000000000..2c1883d2875 --- /dev/null +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/library/KtBcLibrary.kt @@ -0,0 +1,73 @@ +/* + * Copyright 2010-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.backend.konan.library + +import llvm.LLVMLinkModules2 +import llvm.LLVMModuleRef +import llvm.LLVMWriteBitcodeToFile +import org.jetbrains.kotlin.backend.konan.llvm.* +import org.jetbrains.kotlin.backend.konan.serialization.Base64 +import org.jetbrains.kotlin.backend.konan.serialization.deserializeModule +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.descriptors.impl.ModuleDescriptorImpl + +class KtBcLibraryReader(file: File, configuration: CompilerConfiguration) + : FileBasedLibraryReader(file, configuration, KtBcMetadataReader(file)) { + + public constructor(path: String, configuration: CompilerConfiguration) : this(File(path), configuration) + + override val bitcodePaths: List + get() = listOf(libraryName) + +} + +class KtBcLibraryWriter(file: File, val llvmModule: LLVMModuleRef) + : FileBasedLibraryWriter(file) { + + override val mainBitcodeFileName = file.path + + public constructor(path: String, llvmModule: LLVMModuleRef) + : this(File(path), llvmModule) + + override fun addKotlinBitcode(llvmModule: LLVMModuleRef) { + // This is a noop for .kt.bc based libraries, + // because the bitcode itself is the container. + } + + override fun addLinkData(linkData: LinkData) { + KtBcMetadataGenerator(llvmModule).addLinkData(linkData) + } + + override fun addNativeBitcode(library: String) { + + val libraryModule = parseBitcodeFile(library) + val failed = LLVMLinkModules2(llvmModule, libraryModule) + if (failed != 0) { + throw Error("failed to link $library") // TODO: retrieve error message from LLVM. + } + } + + override fun commit() { + LLVMWriteBitcodeToFile(llvmModule, file.path) + } +} + + diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/MetadataGenerator.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/library/KtBcMetadataGenerator.kt similarity index 74% rename from backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/MetadataGenerator.kt rename to backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/library/KtBcMetadataGenerator.kt index 85357b539f5..15da0486007 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/MetadataGenerator.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/library/KtBcMetadataGenerator.kt @@ -14,49 +14,16 @@ * limitations under the License. */ -package org.jetbrains.kotlin.backend.konan.llvm +package org.jetbrains.kotlin.backend.konan.library import kotlinx.cinterop.* import llvm.* -import org.jetbrains.kotlin.backend.konan.LinkData import org.jetbrains.kotlin.backend.konan.util.File import java.io.Closeable import java.util.Properties -class NamedModuleData(val name:String, val base64: String) - -interface MetadataReader { - fun loadSerializedModule(currentAbiVersion: Int): NamedModuleData - fun loadSerializedPackageFragment(fqName: String): String -} - -class SplitMetadataReader(file: File) : MetadataReader { - - val linkDataDir = File(file, "linkdata") - - override fun loadSerializedModule(currentAbiVersion: Int): NamedModuleData { - val header = Properties() - val file = File(linkDataDir, "module") - file.bufferedReader().use { reader -> - header.load(reader) - } - val headerAbiVersion = header.getProperty("abi_version")!! - val moduleName = header.getProperty("module_name")!! - val moduleData = header.getProperty("module_data")!! - - if ("$currentAbiVersion" != headerAbiVersion) - error("ABI version mismatch. Compiler expects: $currentAbiVersion, the library is $headerAbiVersion") - - return NamedModuleData(moduleName, moduleData) - } - - override fun loadSerializedPackageFragment(fqName: String): String { - val realName = if (fqName == "") "" else fqName - - return File(linkDataDir, realName).readText() - - } -} +// We still keep this format around for now. But, most probably, it will +// go away completely soon. class KtBcMetadataReader(file: File) : Closeable, MetadataReader { @@ -173,7 +140,7 @@ override fun loadSerializedPackageFragment(fqName: String): String { } } -internal class MetadataGenerator(val llvmModule: LLVMModuleRef) { +internal class KtBcMetadataGenerator(val llvmModule: LLVMModuleRef) { private fun metadataNode(args: List): LLVMValueRef { return LLVMMDNode(args.toCValues(), args.size)!! @@ -215,23 +182,3 @@ internal class MetadataGenerator(val llvmModule: LLVMModuleRef) { } } -internal class SplitMetadataGenerator(val file: File) { - - fun addLinkData(linkData: LinkData) { - - val header = Properties() - header.putAll(hashMapOf( - "abi_version" to "${linkData.abiVersion}", - "module_name" to "${linkData.moduleName}", - "module_data" to "${linkData.module}" - )) - header.store(File(file, "module").outputStream(), null) - - linkData.fragments.forEachIndexed { index, it -> - val name = linkData.fragmentNames[index] - val realName = if (name == "") "" else name - File(file, realName).writeText(it) - } - } -} - diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/library/MetadataGenerator.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/library/MetadataGenerator.kt new file mode 100644 index 00000000000..389b5413a46 --- /dev/null +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/library/MetadataGenerator.kt @@ -0,0 +1,76 @@ +/* + * Copyright 2010-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.backend.konan.library + +import org.jetbrains.kotlin.backend.konan.util.File +import java.util.Properties + +class NamedModuleData(val name:String, val base64: String) + +interface MetadataReader { + fun loadSerializedModule(currentAbiVersion: Int): NamedModuleData + fun loadSerializedPackageFragment(fqName: String): String +} + +class SplitMetadataReader(file: File) : MetadataReader { + + val linkDataDir = File(file, "linkdata") + + override fun loadSerializedModule(currentAbiVersion: Int): NamedModuleData { + val header = Properties() + val file = File(linkDataDir, "module") + file.bufferedReader().use { reader -> + header.load(reader) + } + val headerAbiVersion = header.getProperty("abi_version")!! + val moduleName = header.getProperty("module_name")!! + val moduleData = header.getProperty("module_data")!! + + if ("$currentAbiVersion" != headerAbiVersion) + error("ABI version mismatch. Compiler expects: $currentAbiVersion, the library is $headerAbiVersion") + + return NamedModuleData(moduleName, moduleData) + } + + override fun loadSerializedPackageFragment(fqName: String): String { + val realName = if (fqName == "") "" else fqName + + return File(linkDataDir, realName).readText() + + } +} + +internal class SplitMetadataGenerator(val file: File) { + + fun addLinkData(linkData: LinkData) { + + val header = Properties() + header.putAll(hashMapOf( + "abi_version" to "${linkData.abiVersion}", + "module_name" to "${linkData.moduleName}", + "module_data" to "${linkData.module}" + )) + header.store(File(file, "module").outputStream(), null) + + linkData.fragments.forEachIndexed { index, it -> + val name = linkData.fragmentNames[index] + val realName = if (name == "") "" else name + File(file, realName).writeText(it) + } + } +} + diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt index 0272b2cf27e..19e487de4e1 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt @@ -23,14 +23,13 @@ import org.jetbrains.kotlin.backend.common.descriptors.isSuspend import org.jetbrains.kotlin.backend.konan.Context import org.jetbrains.kotlin.backend.konan.KonanConfigKeys import org.jetbrains.kotlin.backend.konan.KonanPhase -import org.jetbrains.kotlin.backend.konan.LinkData +import org.jetbrains.kotlin.backend.konan.library.LinkData import org.jetbrains.kotlin.backend.konan.PhaseManager import org.jetbrains.kotlin.backend.konan.descriptors.* import org.jetbrains.kotlin.backend.konan.ir.* import org.jetbrains.kotlin.backend.konan.TargetManager -import org.jetbrains.kotlin.backend.konan.KonanLibraryWriter -import org.jetbrains.kotlin.backend.konan.KtBcLibraryWriter -import org.jetbrains.kotlin.backend.konan.SplitLibraryWriter +import org.jetbrains.kotlin.backend.konan.library.KonanLibraryWriter +import org.jetbrains.kotlin.backend.konan.library.SplitLibraryWriter import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.incremental.components.NoLookupLocation 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 99da91cfbaf..098faabdae9 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 @@ -17,9 +17,9 @@ package org.jetbrains.kotlin.backend.konan.serialization import org.jetbrains.kotlin.backend.konan.Context -import org.jetbrains.kotlin.backend.konan.LinkData import org.jetbrains.kotlin.backend.konan.KonanBuiltIns import org.jetbrains.kotlin.backend.konan.KonanConfigKeys +import org.jetbrains.kotlin.backend.konan.library.LinkData import org.jetbrains.kotlin.backend.konan.llvm.base64Decode import org.jetbrains.kotlin.backend.konan.llvm.base64Encode import org.jetbrains.kotlin.backend.konan.llvm.isExported