Shuffle some library classes around.
This commit is contained in:
committed by
alexander-gorshenev
parent
c8badb0a38
commit
b42916b08e
+5
-2
@@ -16,12 +16,15 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.backend.konan
|
package org.jetbrains.kotlin.backend.konan
|
||||||
|
|
||||||
import llvm.*
|
import llvm.LLVMDumpModule
|
||||||
import org.jetbrains.kotlin.backend.common.validateIrModule
|
import llvm.LLVMModuleRef
|
||||||
import org.jetbrains.kotlin.backend.jvm.descriptors.initialize
|
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.descriptors.*
|
||||||
import org.jetbrains.kotlin.backend.konan.ir.DumpIrTreeWithDescriptorsVisitor
|
import org.jetbrains.kotlin.backend.konan.ir.DumpIrTreeWithDescriptorsVisitor
|
||||||
import org.jetbrains.kotlin.backend.konan.ir.Ir
|
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.backend.konan.llvm.*
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
||||||
|
|||||||
+2
@@ -17,6 +17,8 @@
|
|||||||
package org.jetbrains.kotlin.backend.konan
|
package org.jetbrains.kotlin.backend.konan
|
||||||
|
|
||||||
import com.intellij.openapi.project.Project
|
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.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
|
||||||
|
|||||||
+3
-44
@@ -14,12 +14,12 @@
|
|||||||
* limitations under the License.
|
* 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.LLVMModuleRef
|
||||||
import llvm.LLVMWriteBitcodeToFile
|
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.Base64
|
||||||
import org.jetbrains.kotlin.backend.konan.serialization.deserializeModule
|
import org.jetbrains.kotlin.backend.konan.serialization.deserializeModule
|
||||||
import org.jetbrains.kotlin.backend.konan.util.File
|
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<String>
|
|
||||||
get() = listOf(libraryName)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Get rid of the configuration here.
|
// TODO: Get rid of the configuration here.
|
||||||
class SplitLibraryReader(val libDir: File, configuration: CompilerConfiguration)
|
class SplitLibraryReader(val libDir: File, configuration: CompilerConfiguration)
|
||||||
: FileBasedLibraryReader(libDir, configuration, SplitMetadataReader(libDir)) {
|
: FileBasedLibraryReader(libDir, configuration, SplitMetadataReader(libDir)) {
|
||||||
@@ -143,37 +133,6 @@ abstract class FileBasedLibraryWriter (
|
|||||||
val file: File): KonanLibraryWriter {
|
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) {
|
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)
|
public constructor(path: String, target: String, nopack: Boolean): this(File(path), target, nopack)
|
||||||
|
|
||||||
|
|||||||
+73
@@ -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<String>
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
+4
-57
@@ -14,49 +14,16 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.jetbrains.kotlin.backend.konan.llvm
|
package org.jetbrains.kotlin.backend.konan.library
|
||||||
|
|
||||||
import kotlinx.cinterop.*
|
import kotlinx.cinterop.*
|
||||||
import llvm.*
|
import llvm.*
|
||||||
import org.jetbrains.kotlin.backend.konan.LinkData
|
|
||||||
import org.jetbrains.kotlin.backend.konan.util.File
|
import org.jetbrains.kotlin.backend.konan.util.File
|
||||||
import java.io.Closeable
|
import java.io.Closeable
|
||||||
import java.util.Properties
|
import java.util.Properties
|
||||||
|
|
||||||
class NamedModuleData(val name:String, val base64: String)
|
// We still keep this format around for now. But, most probably, it will
|
||||||
|
// go away completely soon.
|
||||||
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 == "") "<root>" else fqName
|
|
||||||
|
|
||||||
return File(linkDataDir, realName).readText()
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class KtBcMetadataReader(file: File) : Closeable, MetadataReader {
|
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?>): LLVMValueRef {
|
private fun metadataNode(args: List<LLVMValueRef?>): LLVMValueRef {
|
||||||
return LLVMMDNode(args.toCValues(), args.size)!!
|
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 == "") "<root>" else name
|
|
||||||
File(file, realName).writeText(it)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
+76
@@ -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 == "") "<root>" 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 == "") "<root>" else name
|
||||||
|
File(file, realName).writeText(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
+3
-4
@@ -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.Context
|
||||||
import org.jetbrains.kotlin.backend.konan.KonanConfigKeys
|
import org.jetbrains.kotlin.backend.konan.KonanConfigKeys
|
||||||
import org.jetbrains.kotlin.backend.konan.KonanPhase
|
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.PhaseManager
|
||||||
import org.jetbrains.kotlin.backend.konan.descriptors.*
|
import org.jetbrains.kotlin.backend.konan.descriptors.*
|
||||||
import org.jetbrains.kotlin.backend.konan.ir.*
|
import org.jetbrains.kotlin.backend.konan.ir.*
|
||||||
import org.jetbrains.kotlin.backend.konan.TargetManager
|
import org.jetbrains.kotlin.backend.konan.TargetManager
|
||||||
import org.jetbrains.kotlin.backend.konan.KonanLibraryWriter
|
import org.jetbrains.kotlin.backend.konan.library.KonanLibraryWriter
|
||||||
import org.jetbrains.kotlin.backend.konan.KtBcLibraryWriter
|
import org.jetbrains.kotlin.backend.konan.library.SplitLibraryWriter
|
||||||
import org.jetbrains.kotlin.backend.konan.SplitLibraryWriter
|
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
||||||
|
|||||||
+1
-1
@@ -17,9 +17,9 @@
|
|||||||
package org.jetbrains.kotlin.backend.konan.serialization
|
package org.jetbrains.kotlin.backend.konan.serialization
|
||||||
|
|
||||||
import org.jetbrains.kotlin.backend.konan.Context
|
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.KonanBuiltIns
|
||||||
import org.jetbrains.kotlin.backend.konan.KonanConfigKeys
|
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.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
|
||||||
|
|||||||
Reference in New Issue
Block a user