Move KonanBuiltIns to a separate module (#1860)
1. Separate (temporary) modules for the code to be moved to https://github.com/JetBrains/kotlin repo 2. KonanBuiltIns, functions for creation of module descriptors and interop descriptors and moved to "konan.descriptors" module 3. Re-organizing KonanModuleOrigin and it's inheritors to better naming/understanding
This commit is contained in:
@@ -138,6 +138,9 @@ dependencies {
|
|||||||
compilerCompile kotlinNativeInterop['llvm'].configuration
|
compilerCompile kotlinNativeInterop['llvm'].configuration
|
||||||
compilerCompile kotlinNativeInterop['hash'].configuration
|
compilerCompile kotlinNativeInterop['hash'].configuration
|
||||||
compilerCompile "org.jetbrains.kotlin:kotlin-native-shared:$konanVersion"
|
compilerCompile "org.jetbrains.kotlin:kotlin-native-shared:$konanVersion"
|
||||||
|
compilerCompile "org.jetbrains.kotlin:konan.descriptors:$konanVersion"
|
||||||
|
compilerCompile "org.jetbrains.kotlin:konan.metadata:$konanVersion"
|
||||||
|
compilerCompile "org.jetbrains.kotlin:konan.metadata.serializer:$konanVersion"
|
||||||
|
|
||||||
cli_bcCompile kotlinCompilerModule
|
cli_bcCompile kotlinCompilerModule
|
||||||
cli_bcCompile "org.jetbrains.kotlin:kotlin-native-shared:$konanVersion"
|
cli_bcCompile "org.jetbrains.kotlin:kotlin-native-shared:$konanVersion"
|
||||||
|
|||||||
+24
-1
@@ -35,6 +35,7 @@ import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl
|
|||||||
import org.jetbrains.kotlin.descriptors.impl.ReceiverParameterDescriptorImpl
|
import org.jetbrains.kotlin.descriptors.impl.ReceiverParameterDescriptorImpl
|
||||||
import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl
|
import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl
|
||||||
import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl
|
import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl
|
||||||
|
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
||||||
import org.jetbrains.kotlin.ir.IrElement
|
import org.jetbrains.kotlin.ir.IrElement
|
||||||
import org.jetbrains.kotlin.ir.SourceManager
|
import org.jetbrains.kotlin.ir.SourceManager
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
@@ -49,10 +50,14 @@ import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
|
|||||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
|
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
|
||||||
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
|
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
|
||||||
import org.jetbrains.kotlin.ir.visitors.acceptVoid
|
import org.jetbrains.kotlin.ir.visitors.acceptVoid
|
||||||
|
import org.jetbrains.kotlin.builtins.konan.KonanBuiltIns
|
||||||
import org.jetbrains.kotlin.konan.target.CompilerOutputKind
|
import org.jetbrains.kotlin.konan.target.CompilerOutputKind
|
||||||
import org.jetbrains.kotlin.metadata.KonanLinkData
|
import org.jetbrains.kotlin.metadata.KonanLinkData
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext
|
import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext
|
||||||
|
import org.jetbrains.kotlin.resolve.descriptorUtil.module
|
||||||
|
import org.jetbrains.kotlin.resolve.scopes.MemberScope
|
||||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitClassReceiver
|
import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitClassReceiver
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor
|
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.getName
|
import org.jetbrains.kotlin.serialization.deserialization.getName
|
||||||
@@ -280,6 +285,16 @@ internal class Context(config: KonanConfig) : KonanBackendContext(config) {
|
|||||||
moduleDescriptor.builtIns as KonanBuiltIns
|
moduleDescriptor.builtIns as KonanBuiltIns
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val packageScope by lazy { builtIns.builtInsModule.getPackage(KonanFqNames.packageName).memberScope }
|
||||||
|
|
||||||
|
val nativePtr by lazy { packageScope.getContributedClassifier(NATIVE_PTR_NAME) as ClassDescriptor }
|
||||||
|
val nativePtrPlusLong by lazy { nativePtr.unsubstitutedMemberScope.getContributedFunctions("plus").single() }
|
||||||
|
val nativePtrToLong by lazy { nativePtr.unsubstitutedMemberScope.getContributedFunctions("toLong").single() }
|
||||||
|
val getNativeNullPtr by lazy { packageScope.getContributedFunctions("getNativeNullPtr").single() }
|
||||||
|
val immutableBinaryBlobOf by lazy {
|
||||||
|
builtIns.builtInsModule.getPackage(FqName("konan")).memberScope.getContributedFunctions("immutableBinaryBlobOf").single()
|
||||||
|
}
|
||||||
|
|
||||||
val specialDeclarationsFactory = SpecialDeclarationsFactory(this)
|
val specialDeclarationsFactory = SpecialDeclarationsFactory(this)
|
||||||
|
|
||||||
class LazyMember<T>(val initializer: Context.() -> T) {
|
class LazyMember<T>(val initializer: Context.() -> T) {
|
||||||
@@ -350,7 +365,7 @@ internal class Context(config: KonanConfig) : KonanBackendContext(config) {
|
|||||||
get() = ir.irModule.irBuiltins
|
get() = ir.irModule.irBuiltins
|
||||||
|
|
||||||
val interopBuiltIns by lazy {
|
val interopBuiltIns by lazy {
|
||||||
InteropBuiltIns(this.builtIns)
|
InteropBuiltIns(this.builtIns, nativePtr)
|
||||||
}
|
}
|
||||||
|
|
||||||
var llvmModule: LLVMModuleRef? = null
|
var llvmModule: LLVMModuleRef? = null
|
||||||
@@ -509,5 +524,13 @@ internal class Context(config: KonanConfig) : KonanBackendContext(config) {
|
|||||||
val kind = config.configuration.get(KonanConfigKeys.PRODUCE)
|
val kind = config.configuration.get(KonanConfigKeys.PRODUCE)
|
||||||
kind == CompilerOutputKind.DYNAMIC || kind == CompilerOutputKind.STATIC
|
kind == CompilerOutputKind.DYNAMIC || kind == CompilerOutputKind.STATIC
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal val stdlibModule
|
||||||
|
get() = this.builtIns.any.module
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun MemberScope.getContributedClassifier(name: String) =
|
||||||
|
this.getContributedClassifier(Name.identifier(name), NoLookupLocation.FROM_BUILTINS)
|
||||||
|
|
||||||
|
private fun MemberScope.getContributedFunctions(name: String) =
|
||||||
|
this.getContributedFunctions(Name.identifier(name), NoLookupLocation.FROM_BUILTINS)
|
||||||
|
|||||||
+9
-6
@@ -20,10 +20,13 @@ import org.jetbrains.kotlin.backend.konan.irasdescriptors.containsNull
|
|||||||
import org.jetbrains.kotlin.backend.konan.irasdescriptors.fqNameSafe
|
import org.jetbrains.kotlin.backend.konan.irasdescriptors.fqNameSafe
|
||||||
import org.jetbrains.kotlin.builtins.PrimitiveType
|
import org.jetbrains.kotlin.builtins.PrimitiveType
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
|
import org.jetbrains.kotlin.descriptors.konan.interop.InteropFqNames
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrClass
|
import org.jetbrains.kotlin.ir.declarations.IrClass
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
|
||||||
import org.jetbrains.kotlin.ir.types.*
|
import org.jetbrains.kotlin.ir.types.IrType
|
||||||
|
import org.jetbrains.kotlin.ir.types.classifierOrFail
|
||||||
|
import org.jetbrains.kotlin.ir.types.makeNullable
|
||||||
import org.jetbrains.kotlin.ir.util.constructors
|
import org.jetbrains.kotlin.ir.util.constructors
|
||||||
import org.jetbrains.kotlin.ir.util.defaultType
|
import org.jetbrains.kotlin.ir.util.defaultType
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
@@ -81,7 +84,7 @@ enum class KonanPrimitiveType(val classId: ClassId) {
|
|||||||
LONG(PrimitiveType.LONG),
|
LONG(PrimitiveType.LONG),
|
||||||
FLOAT(PrimitiveType.FLOAT),
|
FLOAT(PrimitiveType.FLOAT),
|
||||||
DOUBLE(PrimitiveType.DOUBLE),
|
DOUBLE(PrimitiveType.DOUBLE),
|
||||||
NON_NULL_NATIVE_PTR(ClassId.topLevel(KonanBuiltIns.FqNames.nonNullNativePtr.toSafe()))
|
NON_NULL_NATIVE_PTR(ClassId.topLevel(KonanFqNames.nonNullNativePtr.toSafe()))
|
||||||
|
|
||||||
;
|
;
|
||||||
|
|
||||||
@@ -204,8 +207,8 @@ internal abstract class InlineClassesSupport<Class : Any, Type : Any> {
|
|||||||
|
|
||||||
private val implicitInlineClasses =
|
private val implicitInlineClasses =
|
||||||
(KonanPrimitiveType.values().map { it.fqName } +
|
(KonanPrimitiveType.values().map { it.fqName } +
|
||||||
KonanBuiltIns.FqNames.nativePtr +
|
KonanFqNames.nativePtr +
|
||||||
InteropBuiltIns.FqNames.cPointer).toSet()
|
InteropFqNames.cPointer).toSet()
|
||||||
|
|
||||||
private enum class ValueClass(val fqName: FqNameUnsafe, val binaryType: BinaryType.Primitive) {
|
private enum class ValueClass(val fqName: FqNameUnsafe, val binaryType: BinaryType.Primitive) {
|
||||||
|
|
||||||
@@ -256,7 +259,7 @@ internal object KotlinTypeInlineClassesSupport : InlineClassesSupport<ClassDescr
|
|||||||
override fun hasInlineModifier(clazz: ClassDescriptor): Boolean = clazz.isInline
|
override fun hasInlineModifier(clazz: ClassDescriptor): Boolean = clazz.isInline
|
||||||
|
|
||||||
override fun getNativePointedSuperclass(clazz: ClassDescriptor): ClassDescriptor? = clazz.getAllSuperClassifiers()
|
override fun getNativePointedSuperclass(clazz: ClassDescriptor): ClassDescriptor? = clazz.getAllSuperClassifiers()
|
||||||
.firstOrNull { it.fqNameUnsafe == InteropBuiltIns.FqNames.nativePointed } as ClassDescriptor?
|
.firstOrNull { it.fqNameUnsafe == InteropFqNames.nativePointed } as ClassDescriptor?
|
||||||
|
|
||||||
override fun getInlinedClassUnderlyingType(clazz: ClassDescriptor): KotlinType =
|
override fun getInlinedClassUnderlyingType(clazz: ClassDescriptor): KotlinType =
|
||||||
clazz.unsubstitutedPrimaryConstructor!!.valueParameters.single().type
|
clazz.unsubstitutedPrimaryConstructor!!.valueParameters.single().type
|
||||||
@@ -290,7 +293,7 @@ private object IrTypeInlineClassesSupport : InlineClassesSupport<IrClass, IrType
|
|||||||
override fun hasInlineModifier(clazz: IrClass): Boolean = clazz.descriptor.isInline
|
override fun hasInlineModifier(clazz: IrClass): Boolean = clazz.descriptor.isInline
|
||||||
|
|
||||||
override fun getNativePointedSuperclass(clazz: IrClass): IrClass? = clazz.getAllSuperClassifiers()
|
override fun getNativePointedSuperclass(clazz: IrClass): IrClass? = clazz.getAllSuperClassifiers()
|
||||||
.firstOrNull { it.descriptor.fqNameUnsafe == InteropBuiltIns.FqNames.nativePointed }
|
.firstOrNull { it.fqNameSafe.toUnsafe() == InteropFqNames.nativePointed }
|
||||||
|
|
||||||
override fun getInlinedClassUnderlyingType(clazz: IrClass): IrType =
|
override fun getInlinedClassUnderlyingType(clazz: IrClass): IrType =
|
||||||
clazz.constructors.first { it.isPrimary }.valueParameters.single().type
|
clazz.constructors.first { it.isPrimary }.valueParameters.single().type
|
||||||
|
|||||||
+10
-30
@@ -20,10 +20,11 @@ import org.jetbrains.kotlin.backend.konan.descriptors.ClassifierAliasingPackageF
|
|||||||
import org.jetbrains.kotlin.backend.konan.descriptors.ExportedForwardDeclarationsPackageFragmentDescriptor
|
import org.jetbrains.kotlin.backend.konan.descriptors.ExportedForwardDeclarationsPackageFragmentDescriptor
|
||||||
import org.jetbrains.kotlin.backend.konan.library.KonanLibraryReader
|
import org.jetbrains.kotlin.backend.konan.library.KonanLibraryReader
|
||||||
import org.jetbrains.kotlin.backend.konan.serialization.KonanPackageFragment
|
import org.jetbrains.kotlin.backend.konan.serialization.KonanPackageFragment
|
||||||
|
import org.jetbrains.kotlin.builtins.konan.KonanBuiltIns
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
|
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
import org.jetbrains.kotlin.descriptors.konan.interop.InteropFqNames
|
||||||
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
@@ -50,32 +51,15 @@ fun createInteropLibrary(reader: KonanLibraryReader): InteropLibrary? {
|
|||||||
return InteropLibraryImpl(FqName(pkg), exportForwardDeclarations)
|
return InteropLibraryImpl(FqName(pkg), exportForwardDeclarations)
|
||||||
}
|
}
|
||||||
|
|
||||||
private val cPointerName = "CPointer"
|
internal class InteropBuiltIns(builtIns: KonanBuiltIns, vararg konanPrimitives: ClassDescriptor) {
|
||||||
private val nativePointedName = "NativePointed"
|
|
||||||
|
|
||||||
internal class InteropBuiltIns(builtIns: KonanBuiltIns) {
|
val packageScope = builtIns.builtInsModule.getPackage(InteropFqNames.packageName).memberScope
|
||||||
|
|
||||||
object FqNames {
|
|
||||||
val packageName = FqName("kotlinx.cinterop")
|
|
||||||
|
|
||||||
val cPointer = packageName.child(Name.identifier(cPointerName)).toUnsafe()
|
|
||||||
val nativePointed = packageName.child(Name.identifier(nativePointedName)).toUnsafe()
|
|
||||||
|
|
||||||
val cNames = FqName("cnames")
|
|
||||||
val cNamesStructs = cNames.child(Name.identifier("structs"))
|
|
||||||
|
|
||||||
val objCNames = FqName("objcnames")
|
|
||||||
val objCNamesClasses = objCNames.child(Name.identifier("classes"))
|
|
||||||
val objCNamesProtocols = objCNames.child(Name.identifier("protocols"))
|
|
||||||
}
|
|
||||||
|
|
||||||
val packageScope = builtIns.builtInsModule.getPackage(FqNames.packageName).memberScope
|
|
||||||
|
|
||||||
val getPointerSize = packageScope.getContributedFunctions("getPointerSize").single()
|
val getPointerSize = packageScope.getContributedFunctions("getPointerSize").single()
|
||||||
|
|
||||||
val nativePointed = packageScope.getContributedClass(nativePointedName)
|
val nativePointed = packageScope.getContributedClass(InteropFqNames.nativePointedName)
|
||||||
|
|
||||||
val cPointer = this.packageScope.getContributedClass(cPointerName)
|
val cPointer = this.packageScope.getContributedClass(InteropFqNames.cPointerName)
|
||||||
|
|
||||||
val cPointerRawValue = cPointer.unsubstitutedMemberScope.getContributedVariables("rawValue").single()
|
val cPointerRawValue = cPointer.unsubstitutedMemberScope.getContributedVariables("rawValue").single()
|
||||||
|
|
||||||
@@ -102,11 +86,9 @@ internal class InteropBuiltIns(builtIns: KonanBuiltIns) {
|
|||||||
|
|
||||||
val nativeMemUtils = packageScope.getContributedClass("nativeMemUtils")
|
val nativeMemUtils = packageScope.getContributedClass("nativeMemUtils")
|
||||||
|
|
||||||
private val primitives = listOf(
|
private val primitives = arrayOf(
|
||||||
builtIns.byte, builtIns.short, builtIns.int, builtIns.long,
|
arrayOf(builtIns.byte, builtIns.short, builtIns.int, builtIns.long, builtIns.float, builtIns.double),
|
||||||
builtIns.float, builtIns.double,
|
konanPrimitives).flatten()
|
||||||
builtIns.nativePtr
|
|
||||||
)
|
|
||||||
|
|
||||||
val readPrimitive = primitives.map {
|
val readPrimitive = primitives.map {
|
||||||
nativeMemUtils.unsubstitutedMemberScope.getContributedFunctions("get" + it.name).single()
|
nativeMemUtils.unsubstitutedMemberScope.getContributedFunctions("get" + it.name).single()
|
||||||
@@ -212,12 +194,10 @@ private class InteropLibraryImpl(
|
|||||||
): List<PackageFragmentDescriptor> {
|
): List<PackageFragmentDescriptor> {
|
||||||
val interopPackageFragments = konanPackageFragments.filter { it.fqName == packageFqName }
|
val interopPackageFragments = konanPackageFragments.filter { it.fqName == packageFqName }
|
||||||
|
|
||||||
val fqNames = InteropBuiltIns.FqNames
|
|
||||||
|
|
||||||
val result = mutableListOf<PackageFragmentDescriptor>()
|
val result = mutableListOf<PackageFragmentDescriptor>()
|
||||||
|
|
||||||
// Allow references to forwarding declarations to be resolved into classifiers declared in this library:
|
// Allow references to forwarding declarations to be resolved into classifiers declared in this library:
|
||||||
listOf(fqNames.cNamesStructs, fqNames.objCNamesClasses, fqNames.objCNamesProtocols).mapTo(result) { fqName ->
|
listOf(InteropFqNames.cNamesStructs, InteropFqNames.objCNamesClasses, InteropFqNames.objCNamesProtocols).mapTo(result) { fqName ->
|
||||||
ClassifierAliasingPackageFragmentDescriptor(interopPackageFragments, module, fqName)
|
ClassifierAliasingPackageFragmentDescriptor(interopPackageFragments, module, fqName)
|
||||||
}
|
}
|
||||||
// TODO: use separate namespaces for structs, enums, Objective-C protocols etc.
|
// TODO: use separate namespaces for structs, enums, Objective-C protocols etc.
|
||||||
|
|||||||
+1
@@ -29,6 +29,7 @@ import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
|||||||
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
||||||
import org.jetbrains.kotlin.ir.IrElement
|
import org.jetbrains.kotlin.ir.IrElement
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||||
|
import org.jetbrains.kotlin.builtins.konan.KonanBuiltIns
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
abstract internal class KonanBackendContext(val config: KonanConfig) : CommonBackendContext {
|
abstract internal class KonanBackendContext(val config: KonanConfig) : CommonBackendContext {
|
||||||
|
|||||||
-78
@@ -1,78 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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
|
|
||||||
|
|
||||||
import org.jetbrains.kotlin.builtins.BuiltInsPackageFragment
|
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
|
||||||
/* moved from o.j.k.builtins to o.j.k.builtins.jvm in 959c2f4843803c3b699e3e081d8afd0e433249dc */
|
|
||||||
import org.jetbrains.kotlin.builtins.jvm.CloneableClassScope
|
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
|
||||||
import org.jetbrains.kotlin.descriptors.deserialization.ClassDescriptorFactory
|
|
||||||
import org.jetbrains.kotlin.descriptors.impl.ClassDescriptorImpl
|
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
|
||||||
import org.jetbrains.kotlin.name.FqName
|
|
||||||
import org.jetbrains.kotlin.name.Name
|
|
||||||
import org.jetbrains.kotlin.storage.LockBasedStorageManager
|
|
||||||
import org.jetbrains.kotlin.storage.StorageManager
|
|
||||||
import org.jetbrains.kotlin.storage.getValue
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Note: this class is copy-pasted from [org.jetbrains.kotlin.builtins.JvmBuiltInClassDescriptorFactory].
|
|
||||||
*/
|
|
||||||
class KonanBuiltInClassDescriptorFactory(
|
|
||||||
storageManager: StorageManager,
|
|
||||||
private val moduleDescriptor: ModuleDescriptor,
|
|
||||||
private val computeContainingDeclaration: (ModuleDescriptor) -> DeclarationDescriptor = { module ->
|
|
||||||
module.getPackage(KOTLIN_FQ_NAME).fragments.filterIsInstance<BuiltInsPackageFragment>().first()
|
|
||||||
}
|
|
||||||
) : ClassDescriptorFactory {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Workaround for `kotlin.Cloneable` deserialization: it is manually blacklisted in `ClassDeserializer`,
|
|
||||||
* so apply the same approach as on JVM, i.e. create the descriptor synthetically on demand:
|
|
||||||
*/
|
|
||||||
private val cloneable by storageManager.createLazyValue {
|
|
||||||
ClassDescriptorImpl(
|
|
||||||
computeContainingDeclaration(moduleDescriptor),
|
|
||||||
CLONEABLE_NAME, Modality.ABSTRACT, ClassKind.INTERFACE, listOf(moduleDescriptor.builtIns.anyType),
|
|
||||||
SourceElement.NO_SOURCE, /* isExternal = */ false, LockBasedStorageManager.NO_LOCKS
|
|
||||||
).apply {
|
|
||||||
initialize(CloneableClassScope(storageManager, this), emptySet(), null)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun shouldCreateClass(packageFqName: FqName, name: Name): Boolean =
|
|
||||||
name == CLONEABLE_NAME && packageFqName == KOTLIN_FQ_NAME
|
|
||||||
|
|
||||||
override fun createClass(classId: ClassId): ClassDescriptor? =
|
|
||||||
when (classId) {
|
|
||||||
CLONEABLE_CLASS_ID -> cloneable
|
|
||||||
else -> null
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getAllContributedClassesIfPossible(packageFqName: FqName): Collection<ClassDescriptor> =
|
|
||||||
when (packageFqName) {
|
|
||||||
KOTLIN_FQ_NAME -> setOf(cloneable)
|
|
||||||
else -> emptySet()
|
|
||||||
}
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
private val KOTLIN_FQ_NAME = KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME
|
|
||||||
private val CLONEABLE_NAME = KotlinBuiltIns.FQ_NAMES.cloneable.shortName()
|
|
||||||
val CLONEABLE_CLASS_ID = ClassId.topLevel(KotlinBuiltIns.FQ_NAMES.cloneable.toSafe())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+9
-5
@@ -17,18 +17,22 @@
|
|||||||
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.descriptors.createForwardDeclarationsModule
|
import org.jetbrains.kotlin.backend.konan.library.KonanLibraryReader
|
||||||
import org.jetbrains.kotlin.backend.konan.library.*
|
import org.jetbrains.kotlin.backend.konan.library.impl.LibraryReaderImpl
|
||||||
import org.jetbrains.kotlin.backend.konan.library.impl.*
|
import org.jetbrains.kotlin.backend.konan.library.impl.purgeUnneeded
|
||||||
|
import org.jetbrains.kotlin.backend.konan.library.resolveImmediateLibraries
|
||||||
|
import org.jetbrains.kotlin.backend.konan.library.resolveLibrariesRecursive
|
||||||
|
import org.jetbrains.kotlin.backend.konan.library.withResolvedDependencies
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
|
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
|
||||||
import org.jetbrains.kotlin.cli.common.config.kotlinSourceRoots
|
import org.jetbrains.kotlin.cli.common.config.kotlinSourceRoots
|
||||||
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
|
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
|
||||||
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.*
|
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.STRONG_WARNING
|
||||||
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.descriptors.impl.ModuleDescriptorImpl
|
|
||||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||||
|
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
|
||||||
|
import org.jetbrains.kotlin.descriptors.konan.interop.createForwardDeclarationsModule
|
||||||
import org.jetbrains.kotlin.konan.TempFiles
|
import org.jetbrains.kotlin.konan.TempFiles
|
||||||
import org.jetbrains.kotlin.konan.file.File
|
import org.jetbrains.kotlin.konan.file.File
|
||||||
import org.jetbrains.kotlin.konan.library.defaultResolver
|
import org.jetbrains.kotlin.konan.library.defaultResolver
|
||||||
|
|||||||
+36
@@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* 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
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.name.FqName
|
||||||
|
import org.jetbrains.kotlin.name.FqNameUnsafe
|
||||||
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
|
internal const val NATIVE_PTR_NAME = "NativePtr"
|
||||||
|
|
||||||
|
object KonanFqNames {
|
||||||
|
|
||||||
|
val packageName = FqName("konan.internal")
|
||||||
|
val nativePtr = packageName.child(Name.identifier(NATIVE_PTR_NAME)).toUnsafe()
|
||||||
|
val nonNullNativePtr = FqNameUnsafe("konan.internal.NonNullNativePtr")
|
||||||
|
val throws = FqName("konan.Throws")
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maximum number of parameters supported in function types (e.g. `FunctionXX`, `KFunctionXX`, `SuspendFunctionXX`).
|
||||||
|
*/
|
||||||
|
internal const val KONAN_FUNCTION_INTERFACES_MAX_PARAMETERS = 22
|
||||||
-89
@@ -1,89 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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
|
|
||||||
|
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
|
||||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
|
||||||
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
|
||||||
import org.jetbrains.kotlin.name.FqName
|
|
||||||
import org.jetbrains.kotlin.name.FqNameUnsafe
|
|
||||||
import org.jetbrains.kotlin.name.Name
|
|
||||||
import org.jetbrains.kotlin.resolve.ImportPath
|
|
||||||
import org.jetbrains.kotlin.resolve.MultiTargetPlatform
|
|
||||||
import org.jetbrains.kotlin.resolve.PlatformConfigurator
|
|
||||||
import org.jetbrains.kotlin.resolve.TargetPlatform
|
|
||||||
import org.jetbrains.kotlin.resolve.scopes.MemberScope
|
|
||||||
import org.jetbrains.kotlin.storage.StorageManager
|
|
||||||
|
|
||||||
val STDLIB_MODULE_NAME = Name.special("<stdlib>")
|
|
||||||
|
|
||||||
fun ModuleDescriptor.isStdlib(): Boolean {
|
|
||||||
return name == STDLIB_MODULE_NAME
|
|
||||||
}
|
|
||||||
|
|
||||||
private val nativePtrName = "NativePtr"
|
|
||||||
|
|
||||||
class KonanBuiltIns(storageManager: StorageManager) : KotlinBuiltIns(storageManager) {
|
|
||||||
override fun getClassDescriptorFactories() =
|
|
||||||
super.getClassDescriptorFactories() + KonanBuiltInClassDescriptorFactory(storageManager, builtInsModule)
|
|
||||||
|
|
||||||
override fun getSuspendFunction(parameterCount: Int): ClassDescriptor {
|
|
||||||
return getBuiltInClassByName(Name.identifier("SuspendFunction$parameterCount"))
|
|
||||||
}
|
|
||||||
|
|
||||||
object FqNames {
|
|
||||||
val packageName = FqName("konan.internal")
|
|
||||||
|
|
||||||
val nativePtr = packageName.child(Name.identifier(nativePtrName)).toUnsafe()
|
|
||||||
val nonNullNativePtr = FqNameUnsafe("konan.internal.NonNullNativePtr")
|
|
||||||
|
|
||||||
val throws = FqName("konan.Throws")
|
|
||||||
}
|
|
||||||
|
|
||||||
private val packageScope by lazy { builtInsModule.getPackage(FqNames.packageName).memberScope }
|
|
||||||
|
|
||||||
val nativePtr by lazy { packageScope.getContributedClassifier(nativePtrName) as ClassDescriptor }
|
|
||||||
|
|
||||||
val nativePtrPlusLong by lazy { nativePtr.unsubstitutedMemberScope.getContributedFunctions("plus").single() }
|
|
||||||
val nativePtrToLong by lazy { nativePtr.unsubstitutedMemberScope.getContributedFunctions("toLong").single() }
|
|
||||||
val getNativeNullPtr by lazy { packageScope.getContributedFunctions("getNativeNullPtr").single() }
|
|
||||||
val immutableBinaryBlobOf by lazy {
|
|
||||||
builtInsModule.getPackage(FqName("konan")).memberScope.
|
|
||||||
getContributedFunctions("immutableBinaryBlobOf").single()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun MemberScope.getContributedClassifier(name: String) =
|
|
||||||
this.getContributedClassifier(Name.identifier(name), NoLookupLocation.FROM_BUILTINS)
|
|
||||||
|
|
||||||
private fun MemberScope.getContributedFunctions(name: String) =
|
|
||||||
this.getContributedFunctions(Name.identifier(name), NoLookupLocation.FROM_BUILTINS)
|
|
||||||
}
|
|
||||||
|
|
||||||
object KonanPlatform : TargetPlatform("Konan") {
|
|
||||||
override fun computePlatformSpecificDefaultImports(storageManager: StorageManager, result: MutableList<ImportPath>) {
|
|
||||||
result.add(ImportPath.fromString("konan.*"))
|
|
||||||
}
|
|
||||||
|
|
||||||
override val multiTargetPlatform = MultiTargetPlatform.Specific(platformName)
|
|
||||||
override val platformConfigurator: PlatformConfigurator = KonanPlatformConfigurator
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Maximum number of parameters supported in function types (e.g. `FunctionXX`, `KFunctionXX`, `SuspendFunctionXX`).
|
|
||||||
*/
|
|
||||||
internal const val KONAN_FUNCTION_INTERFACES_MAX_PARAMETERS = 22
|
|
||||||
+8
-7
@@ -18,12 +18,11 @@ package org.jetbrains.kotlin.backend.konan
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.backend.konan.descriptors.findPackage
|
import org.jetbrains.kotlin.backend.konan.descriptors.findPackage
|
||||||
import org.jetbrains.kotlin.backend.konan.descriptors.getStringValue
|
import org.jetbrains.kotlin.backend.konan.descriptors.getStringValue
|
||||||
import org.jetbrains.kotlin.backend.konan.irasdescriptors.*
|
import org.jetbrains.kotlin.backend.konan.irasdescriptors.constructedClass
|
||||||
|
import org.jetbrains.kotlin.backend.konan.irasdescriptors.getExternalObjCMethodInfo
|
||||||
|
import org.jetbrains.kotlin.backend.konan.irasdescriptors.isReal
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
import org.jetbrains.kotlin.descriptors.konan.interop.InteropFqNames
|
||||||
import org.jetbrains.kotlin.descriptors.ConstructorDescriptor
|
|
||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
|
||||||
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
|
|
||||||
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrConstructor
|
import org.jetbrains.kotlin.ir.declarations.IrConstructor
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
||||||
@@ -32,12 +31,14 @@ import org.jetbrains.kotlin.name.FqName
|
|||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.resolve.ExternalOverridabilityCondition
|
import org.jetbrains.kotlin.resolve.ExternalOverridabilityCondition
|
||||||
import org.jetbrains.kotlin.resolve.constants.BooleanValue
|
import org.jetbrains.kotlin.resolve.constants.BooleanValue
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.*
|
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
|
||||||
|
import org.jetbrains.kotlin.resolve.descriptorUtil.getAllSuperClassifiers
|
||||||
|
import org.jetbrains.kotlin.resolve.descriptorUtil.parentsWithSelf
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
import org.jetbrains.kotlin.types.TypeUtils
|
import org.jetbrains.kotlin.types.TypeUtils
|
||||||
import org.jetbrains.kotlin.types.typeUtil.supertypes
|
import org.jetbrains.kotlin.types.typeUtil.supertypes
|
||||||
|
|
||||||
private val interopPackageName = InteropBuiltIns.FqNames.packageName
|
private val interopPackageName = InteropFqNames.packageName
|
||||||
private val objCObjectFqName = interopPackageName.child(Name.identifier("ObjCObject"))
|
private val objCObjectFqName = interopPackageName.child(Name.identifier("ObjCObject"))
|
||||||
private val objCClassFqName = interopPackageName.child(Name.identifier("ObjCClass"))
|
private val objCClassFqName = interopPackageName.child(Name.identifier("ObjCClass"))
|
||||||
internal val externalObjCClassFqName = interopPackageName.child(Name.identifier("ExternalObjCClass"))
|
internal val externalObjCClassFqName = interopPackageName.child(Name.identifier("ExternalObjCClass"))
|
||||||
|
|||||||
+5
-4
@@ -17,12 +17,13 @@
|
|||||||
package org.jetbrains.kotlin.backend.konan
|
package org.jetbrains.kotlin.backend.konan
|
||||||
|
|
||||||
import org.jetbrains.kotlin.analyzer.AnalysisResult
|
import org.jetbrains.kotlin.analyzer.AnalysisResult
|
||||||
import org.jetbrains.kotlin.backend.konan.descriptors.createKonanModuleDescriptor
|
|
||||||
import org.jetbrains.kotlin.backend.konan.descriptors.CurrentKonanModule
|
|
||||||
import org.jetbrains.kotlin.config.*
|
import org.jetbrains.kotlin.config.*
|
||||||
import org.jetbrains.kotlin.context.ModuleContext
|
import org.jetbrains.kotlin.context.ModuleContext
|
||||||
import org.jetbrains.kotlin.context.MutableModuleContextImpl
|
import org.jetbrains.kotlin.context.MutableModuleContextImpl
|
||||||
import org.jetbrains.kotlin.context.ProjectContext
|
import org.jetbrains.kotlin.context.ProjectContext
|
||||||
|
import org.jetbrains.kotlin.descriptors.konan.CurrentKonanModuleOrigin
|
||||||
|
import org.jetbrains.kotlin.descriptors.konan.createKonanModuleDescriptor
|
||||||
|
import org.jetbrains.kotlin.descriptors.konan.isKonanStdlib
|
||||||
import org.jetbrains.kotlin.konan.util.visibleName
|
import org.jetbrains.kotlin.konan.util.visibleName
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
@@ -35,10 +36,10 @@ object TopDownAnalyzerFacadeForKonan {
|
|||||||
|
|
||||||
val projectContext = ProjectContext(config.project)
|
val projectContext = ProjectContext(config.project)
|
||||||
|
|
||||||
val module = createKonanModuleDescriptor(moduleName, projectContext.storageManager, origin = CurrentKonanModule)
|
val module = createKonanModuleDescriptor(moduleName, projectContext.storageManager, origin = CurrentKonanModuleOrigin)
|
||||||
val context = MutableModuleContextImpl(module, projectContext)
|
val context = MutableModuleContextImpl(module, projectContext)
|
||||||
|
|
||||||
if (!module.isStdlib()) {
|
if (!module.isKonanStdlib()) {
|
||||||
val dependencies = listOf(module) + config.moduleDescriptors +
|
val dependencies = listOf(module) + config.moduleDescriptors +
|
||||||
config.getOrCreateForwardDeclarationsModule(module.builtIns, projectContext.storageManager)
|
config.getOrCreateForwardDeclarationsModule(module.builtIns, projectContext.storageManager)
|
||||||
module.setDependencies(dependencies, config.friends)
|
module.setDependencies(dependencies, config.friends)
|
||||||
|
|||||||
+2
-87
@@ -16,23 +16,15 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.backend.konan.descriptors
|
package org.jetbrains.kotlin.backend.konan.descriptors
|
||||||
|
|
||||||
import org.jetbrains.kotlin.backend.konan.InteropBuiltIns
|
|
||||||
import org.jetbrains.kotlin.backend.konan.serialization.KonanPackageFragment
|
import org.jetbrains.kotlin.backend.konan.serialization.KonanPackageFragment
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.descriptors.ClassifierDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.impl.ClassDescriptorImpl
|
|
||||||
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
|
|
||||||
import org.jetbrains.kotlin.descriptors.impl.PackageFragmentDescriptorImpl
|
import org.jetbrains.kotlin.descriptors.impl.PackageFragmentDescriptorImpl
|
||||||
import org.jetbrains.kotlin.incremental.components.LookupLocation
|
import org.jetbrains.kotlin.incremental.components.LookupLocation
|
||||||
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns
|
|
||||||
import org.jetbrains.kotlin.resolve.scopes.MemberScope
|
import org.jetbrains.kotlin.resolve.scopes.MemberScope
|
||||||
import org.jetbrains.kotlin.resolve.scopes.MemberScopeImpl
|
import org.jetbrains.kotlin.resolve.scopes.MemberScopeImpl
|
||||||
import org.jetbrains.kotlin.storage.LockBasedStorageManager
|
|
||||||
import org.jetbrains.kotlin.storage.StorageManager
|
|
||||||
import org.jetbrains.kotlin.storage.getValue
|
|
||||||
import org.jetbrains.kotlin.utils.Printer
|
import org.jetbrains.kotlin.utils.Printer
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult
|
import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult
|
||||||
|
|
||||||
@@ -101,80 +93,3 @@ class ClassifierAliasingPackageFragmentDescriptor(
|
|||||||
|
|
||||||
override fun getMemberScope(): MemberScope = memberScope
|
override fun getMemberScope(): MemberScope = memberScope
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Package fragment which creates descriptors for forward declarations on demand.
|
|
||||||
*/
|
|
||||||
private class ForwardDeclarationsPackageFragmentDescriptor(
|
|
||||||
storageManager: StorageManager,
|
|
||||||
module: ModuleDescriptor, fqName: FqName, supertypeName: Name, classKind: ClassKind
|
|
||||||
) : PackageFragmentDescriptorImpl(module, fqName) {
|
|
||||||
|
|
||||||
private val memberScope = object : MemberScopeImpl() {
|
|
||||||
|
|
||||||
private val declarations = storageManager.createMemoizedFunction(this::createDeclaration)
|
|
||||||
|
|
||||||
private val supertype by storageManager.createLazyValue {
|
|
||||||
val descriptor = builtIns.builtInsModule.getPackage(InteropBuiltIns.FqNames.packageName)
|
|
||||||
.memberScope
|
|
||||||
.getContributedClassifier(supertypeName, NoLookupLocation.FROM_BACKEND) as ClassDescriptor
|
|
||||||
|
|
||||||
descriptor.defaultType
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createDeclaration(name: Name): ClassDescriptor {
|
|
||||||
return ClassDescriptorImpl(
|
|
||||||
this@ForwardDeclarationsPackageFragmentDescriptor,
|
|
||||||
name, Modality.FINAL, classKind,
|
|
||||||
listOf(supertype), SourceElement.NO_SOURCE, false, LockBasedStorageManager.NO_LOCKS
|
|
||||||
).apply {
|
|
||||||
this.initialize(MemberScope.Empty, emptySet(), null)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getContributedClassifier(name: Name, location: LookupLocation) = declarations(name)
|
|
||||||
|
|
||||||
override fun printScopeStructure(p: Printer) {
|
|
||||||
p.println(this::class.java.simpleName, "{}")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getMemberScope(): MemberScope = memberScope
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates module which "contains" forward declarations.
|
|
||||||
* Note: this module should be unique per compilation and should always be the last dependency of any module.
|
|
||||||
*/
|
|
||||||
fun createForwardDeclarationsModule(builtIns: KotlinBuiltIns, storageManager: StorageManager): ModuleDescriptorImpl {
|
|
||||||
val module = createKonanModuleDescriptor(
|
|
||||||
Name.special("<forward declarations>"),
|
|
||||||
storageManager,
|
|
||||||
builtIns,
|
|
||||||
origin = SyntheticModules
|
|
||||||
)
|
|
||||||
|
|
||||||
fun createPackage(fqName: FqName, supertypeName: String, classKind: ClassKind = ClassKind.CLASS) =
|
|
||||||
ForwardDeclarationsPackageFragmentDescriptor(
|
|
||||||
storageManager,
|
|
||||||
module,
|
|
||||||
fqName,
|
|
||||||
Name.identifier(supertypeName),
|
|
||||||
classKind
|
|
||||||
)
|
|
||||||
|
|
||||||
val fqNames = InteropBuiltIns.FqNames
|
|
||||||
|
|
||||||
val packageFragmentProvider = PackageFragmentProviderImpl(
|
|
||||||
listOf(
|
|
||||||
createPackage(fqNames.cNamesStructs, "COpaque"),
|
|
||||||
createPackage(fqNames.objCNamesClasses, "ObjCObjectBase"),
|
|
||||||
createPackage(fqNames.objCNamesProtocols, "ObjCObject", ClassKind.INTERFACE)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
module.initialize(packageFragmentProvider)
|
|
||||||
module.setDependencies(module)
|
|
||||||
|
|
||||||
return module
|
|
||||||
}
|
|
||||||
-70
@@ -1,70 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.descriptors
|
|
||||||
|
|
||||||
import org.jetbrains.kotlin.backend.konan.Context
|
|
||||||
import org.jetbrains.kotlin.backend.konan.KonanBuiltIns
|
|
||||||
import org.jetbrains.kotlin.backend.konan.library.KonanLibraryReader
|
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
|
||||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
|
||||||
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
|
|
||||||
import org.jetbrains.kotlin.name.Name
|
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.module
|
|
||||||
import org.jetbrains.kotlin.storage.StorageManager
|
|
||||||
|
|
||||||
sealed class KonanModuleOrigin {
|
|
||||||
companion object {
|
|
||||||
val CAPABILITY = ModuleDescriptor.Capability<KonanModuleOrigin>("KonanModuleOrigin")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Note: merging these two concepts (LlvmSymbolOrigin and KonanModuleOrigin) for simplicity:
|
|
||||||
sealed class LlvmSymbolOrigin : KonanModuleOrigin()
|
|
||||||
|
|
||||||
data class DeserializedKonanModule(val reader: KonanLibraryReader) : LlvmSymbolOrigin()
|
|
||||||
object CurrentKonanModule : LlvmSymbolOrigin()
|
|
||||||
|
|
||||||
object SyntheticModules : KonanModuleOrigin()
|
|
||||||
|
|
||||||
val ModuleDescriptor.origin get() = this.getCapability(KonanModuleOrigin.CAPABILITY)!!
|
|
||||||
|
|
||||||
internal val Context.stdlibModule get() = this.builtIns.any.module
|
|
||||||
|
|
||||||
internal fun createKonanModuleDescriptor(
|
|
||||||
name: Name,
|
|
||||||
storageManager: StorageManager,
|
|
||||||
origin: KonanModuleOrigin
|
|
||||||
): ModuleDescriptorImpl {
|
|
||||||
val builtIns = KonanBuiltIns(storageManager)
|
|
||||||
|
|
||||||
val moduleDescriptor = createKonanModuleDescriptor(name, storageManager, builtIns, origin)
|
|
||||||
|
|
||||||
builtIns.builtInsModule = moduleDescriptor
|
|
||||||
// It is mostly correct because any module should depend on stdlib.
|
|
||||||
|
|
||||||
return moduleDescriptor
|
|
||||||
}
|
|
||||||
|
|
||||||
internal fun createKonanModuleDescriptor(
|
|
||||||
name: Name,
|
|
||||||
storageManager: StorageManager,
|
|
||||||
builtIns: KotlinBuiltIns,
|
|
||||||
origin: KonanModuleOrigin
|
|
||||||
) = ModuleDescriptorImpl(
|
|
||||||
name, storageManager, builtIns,
|
|
||||||
capabilities = mapOf(KonanModuleOrigin.CAPABILITY to origin)
|
|
||||||
)
|
|
||||||
+1
-1
@@ -17,13 +17,13 @@
|
|||||||
package org.jetbrains.kotlin.backend.konan.descriptors
|
package org.jetbrains.kotlin.backend.konan.descriptors
|
||||||
|
|
||||||
import org.jetbrains.kotlin.backend.common.atMostOne
|
import org.jetbrains.kotlin.backend.common.atMostOne
|
||||||
import org.jetbrains.kotlin.backend.konan.KonanBuiltIns
|
|
||||||
import org.jetbrains.kotlin.backend.konan.serialization.isExported
|
import org.jetbrains.kotlin.backend.konan.serialization.isExported
|
||||||
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor
|
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor
|
||||||
import org.jetbrains.kotlin.builtins.getFunctionalClassKind
|
import org.jetbrains.kotlin.builtins.getFunctionalClassKind
|
||||||
import org.jetbrains.kotlin.builtins.isFunctionType
|
import org.jetbrains.kotlin.builtins.isFunctionType
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
|
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
|
||||||
|
import org.jetbrains.kotlin.builtins.konan.KonanBuiltIns
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.resolve.OverridingUtil
|
import org.jetbrains.kotlin.resolve.OverridingUtil
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
|
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
|
||||||
|
|||||||
+1
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.context.ModuleContext
|
|||||||
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
|
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
|
||||||
import org.jetbrains.kotlin.frontend.di.configureModule
|
import org.jetbrains.kotlin.frontend.di.configureModule
|
||||||
import org.jetbrains.kotlin.resolve.*
|
import org.jetbrains.kotlin.resolve.*
|
||||||
|
import org.jetbrains.kotlin.resolve.konan.platform.KonanPlatform
|
||||||
import org.jetbrains.kotlin.resolve.lazy.KotlinCodeAnalyzer
|
import org.jetbrains.kotlin.resolve.lazy.KotlinCodeAnalyzer
|
||||||
import org.jetbrains.kotlin.resolve.lazy.ResolveSession
|
import org.jetbrains.kotlin.resolve.lazy.ResolveSession
|
||||||
import org.jetbrains.kotlin.resolve.lazy.declarations.DeclarationProviderFactory
|
import org.jetbrains.kotlin.resolve.lazy.declarations.DeclarationProviderFactory
|
||||||
|
|||||||
+3
-3
@@ -131,7 +131,7 @@ internal class KonanSymbols(context: Context, val symbolTable: SymbolTable, val
|
|||||||
val throwable = symbolTable.referenceClass(builtIns.throwable)
|
val throwable = symbolTable.referenceClass(builtIns.throwable)
|
||||||
val string = symbolTable.referenceClass(builtIns.string)
|
val string = symbolTable.referenceClass(builtIns.string)
|
||||||
val enum = symbolTable.referenceClass(builtIns.enum)
|
val enum = symbolTable.referenceClass(builtIns.enum)
|
||||||
val nativePtr = symbolTable.referenceClass(context.builtIns.nativePtr)
|
val nativePtr = symbolTable.referenceClass(context.nativePtr)
|
||||||
val nativePtrType = nativePtr.typeWith(arguments = emptyList())
|
val nativePtrType = nativePtr.typeWith(arguments = emptyList())
|
||||||
|
|
||||||
val arrayList = symbolTable.referenceClass(getArrayListClassDescriptor(context))
|
val arrayList = symbolTable.referenceClass(getArrayListClassDescriptor(context))
|
||||||
@@ -178,7 +178,7 @@ internal class KonanSymbols(context: Context, val symbolTable: SymbolTable, val
|
|||||||
NoLookupLocation.FROM_BACKEND
|
NoLookupLocation.FROM_BACKEND
|
||||||
).single())
|
).single())
|
||||||
|
|
||||||
val getNativeNullPtr = symbolTable.referenceSimpleFunction(context.builtIns.getNativeNullPtr)
|
val getNativeNullPtr = symbolTable.referenceSimpleFunction(context.getNativeNullPtr)
|
||||||
|
|
||||||
val boxCachePredicates = BoxCache.values().associate {
|
val boxCachePredicates = BoxCache.values().associate {
|
||||||
val name = "in${it.name.toLowerCase().capitalize()}BoxCache"
|
val name = "in${it.name.toLowerCase().capitalize()}BoxCache"
|
||||||
@@ -196,7 +196,7 @@ internal class KonanSymbols(context: Context, val symbolTable: SymbolTable, val
|
|||||||
) as ClassDescriptor
|
) as ClassDescriptor
|
||||||
)
|
)
|
||||||
|
|
||||||
val immutableBinaryBlobOf = symbolTable.referenceSimpleFunction(context.builtIns.immutableBinaryBlobOf)
|
val immutableBinaryBlobOf = symbolTable.referenceSimpleFunction(context.immutableBinaryBlobOf)
|
||||||
|
|
||||||
val scheduleImpl = symbolTable.referenceSimpleFunction(context.interopBuiltIns.scheduleImplFunction)
|
val scheduleImpl = symbolTable.referenceSimpleFunction(context.interopBuiltIns.scheduleImplFunction)
|
||||||
|
|
||||||
|
|||||||
+8
-10
@@ -22,17 +22,15 @@ import kotlinx.cinterop.get
|
|||||||
import kotlinx.cinterop.memScoped
|
import kotlinx.cinterop.memScoped
|
||||||
import llvm.*
|
import llvm.*
|
||||||
import org.jetbrains.kotlin.backend.konan.Context
|
import org.jetbrains.kotlin.backend.konan.Context
|
||||||
import org.jetbrains.kotlin.backend.konan.descriptors.CurrentKonanModule
|
|
||||||
import org.jetbrains.kotlin.backend.konan.descriptors.DeserializedKonanModule
|
|
||||||
import org.jetbrains.kotlin.backend.konan.descriptors.LlvmSymbolOrigin
|
|
||||||
import org.jetbrains.kotlin.backend.konan.descriptors.findPackage
|
import org.jetbrains.kotlin.backend.konan.descriptors.findPackage
|
||||||
import org.jetbrains.kotlin.backend.konan.hash.GlobalHash
|
import org.jetbrains.kotlin.backend.konan.hash.GlobalHash
|
||||||
import org.jetbrains.kotlin.backend.konan.irasdescriptors.*
|
import org.jetbrains.kotlin.backend.konan.irasdescriptors.*
|
||||||
import org.jetbrains.kotlin.backend.konan.library.KonanLibraryReader
|
import org.jetbrains.kotlin.backend.konan.library.KonanLibraryReader
|
||||||
import org.jetbrains.kotlin.backend.konan.library.impl.LibraryReaderImpl
|
import org.jetbrains.kotlin.backend.konan.library.impl.LibraryReaderImpl
|
||||||
import org.jetbrains.kotlin.backend.konan.library.withResolvedDependencies
|
import org.jetbrains.kotlin.backend.konan.library.withResolvedDependencies
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithVisibility
|
import org.jetbrains.kotlin.descriptors.konan.CompiledKonanModuleOrigin
|
||||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
import org.jetbrains.kotlin.descriptors.konan.CurrentKonanModuleOrigin
|
||||||
|
import org.jetbrains.kotlin.descriptors.konan.DeserializedKonanModuleOrigin
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrExternalPackageFragment
|
import org.jetbrains.kotlin.ir.declarations.IrExternalPackageFragment
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrField
|
import org.jetbrains.kotlin.ir.declarations.IrField
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||||
@@ -307,7 +305,7 @@ internal class Llvm(val context: Context, val llvmModule: LLVMModuleRef) {
|
|||||||
return LLVMAddFunction(llvmModule, "llvm.memset.p0i8.i32", functionType)!!
|
return LLVMAddFunction(llvmModule, "llvm.memset.p0i8.i32", functionType)!!
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun externalFunction(name: String, type: LLVMTypeRef, origin: LlvmSymbolOrigin): LLVMValueRef {
|
internal fun externalFunction(name: String, type: LLVMTypeRef, origin: CompiledKonanModuleOrigin): LLVMValueRef {
|
||||||
this.imports.add(origin)
|
this.imports.add(origin)
|
||||||
|
|
||||||
val found = LLVMGetNamedFunction(llvmModule, name)
|
val found = LLVMGetNamedFunction(llvmModule, name)
|
||||||
@@ -320,7 +318,7 @@ internal class Llvm(val context: Context, val llvmModule: LLVMModuleRef) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun externalNounwindFunction(name: String, type: LLVMTypeRef, origin: LlvmSymbolOrigin): LLVMValueRef {
|
private fun externalNounwindFunction(name: String, type: LLVMTypeRef, origin: CompiledKonanModuleOrigin): LLVMValueRef {
|
||||||
val function = externalFunction(name, type, origin)
|
val function = externalFunction(name, type, origin)
|
||||||
setFunctionNoUnwind(function)
|
setFunctionNoUnwind(function)
|
||||||
return function
|
return function
|
||||||
@@ -332,10 +330,10 @@ internal class Llvm(val context: Context, val llvmModule: LLVMModuleRef) {
|
|||||||
|
|
||||||
private val allLibraries = context.librariesWithDependencies.toSet()
|
private val allLibraries = context.librariesWithDependencies.toSet()
|
||||||
|
|
||||||
override fun add(origin: LlvmSymbolOrigin) {
|
override fun add(origin: CompiledKonanModuleOrigin) {
|
||||||
val reader = when (origin) {
|
val reader = when (origin) {
|
||||||
CurrentKonanModule -> return
|
CurrentKonanModuleOrigin -> return
|
||||||
is DeserializedKonanModule -> origin.reader
|
is DeserializedKonanModuleOrigin -> origin.reader as KonanLibraryReader
|
||||||
}
|
}
|
||||||
|
|
||||||
if (reader !in allLibraries) {
|
if (reader !in allLibraries) {
|
||||||
|
|||||||
+10
-7
@@ -17,24 +17,27 @@
|
|||||||
package org.jetbrains.kotlin.backend.konan.llvm
|
package org.jetbrains.kotlin.backend.konan.llvm
|
||||||
|
|
||||||
import org.jetbrains.kotlin.backend.konan.Context
|
import org.jetbrains.kotlin.backend.konan.Context
|
||||||
import org.jetbrains.kotlin.backend.konan.descriptors.*
|
import org.jetbrains.kotlin.backend.konan.descriptors.isExpectMember
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||||
|
import org.jetbrains.kotlin.descriptors.konan.CompiledKonanModuleOrigin
|
||||||
|
import org.jetbrains.kotlin.descriptors.konan.SyntheticModulesOrigin
|
||||||
|
import org.jetbrains.kotlin.descriptors.konan.konanModuleOrigin
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.module
|
import org.jetbrains.kotlin.resolve.descriptorUtil.module
|
||||||
|
|
||||||
internal interface LlvmImports {
|
internal interface LlvmImports {
|
||||||
fun add(origin: LlvmSymbolOrigin)
|
fun add(origin: CompiledKonanModuleOrigin)
|
||||||
}
|
}
|
||||||
|
|
||||||
internal val DeclarationDescriptor.llvmSymbolOrigin: LlvmSymbolOrigin
|
internal val DeclarationDescriptor.llvmSymbolOrigin: CompiledKonanModuleOrigin
|
||||||
get() {
|
get() {
|
||||||
assert(!this.isExpectMember) { this }
|
assert(!this.isExpectMember) { this }
|
||||||
|
|
||||||
val module = this.module
|
val module = this.module
|
||||||
val moduleOrigin = module.origin
|
val moduleOrigin = module.konanModuleOrigin
|
||||||
when (moduleOrigin) {
|
when (moduleOrigin) {
|
||||||
is LlvmSymbolOrigin -> return moduleOrigin
|
is CompiledKonanModuleOrigin -> return moduleOrigin
|
||||||
SyntheticModules -> error("Declaration is synthetic and can't be an origin of LLVM symbol:\n${this}")
|
SyntheticModulesOrigin -> error("Declaration is synthetic and can't be an origin of LLVM symbol:\n${this}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal val Context.standardLlvmSymbolsOrigin: LlvmSymbolOrigin get() = this.stdlibModule.llvmSymbolOrigin
|
internal val Context.standardLlvmSymbolsOrigin: CompiledKonanModuleOrigin get() = this.stdlibModule.llvmSymbolOrigin
|
||||||
|
|||||||
+6
-5
@@ -28,6 +28,7 @@ import org.jetbrains.kotlin.backend.konan.objcexport.ObjCExport
|
|||||||
import org.jetbrains.kotlin.backend.konan.optimizations.*
|
import org.jetbrains.kotlin.backend.konan.optimizations.*
|
||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
import org.jetbrains.kotlin.descriptors.Modality
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
|
import org.jetbrains.kotlin.descriptors.konan.CurrentKonanModuleOrigin
|
||||||
import org.jetbrains.kotlin.ir.IrElement
|
import org.jetbrains.kotlin.ir.IrElement
|
||||||
import org.jetbrains.kotlin.ir.IrStatement
|
import org.jetbrains.kotlin.ir.IrStatement
|
||||||
import org.jetbrains.kotlin.ir.SourceManager
|
import org.jetbrains.kotlin.ir.SourceManager
|
||||||
@@ -1701,7 +1702,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
|
|||||||
return receiver
|
return receiver
|
||||||
}
|
}
|
||||||
|
|
||||||
context.builtIns.immutableBinaryBlobOf -> {
|
context.immutableBinaryBlobOf -> {
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
val arg = expression.getValueArgument(0) as IrConst<String>
|
val arg = expression.getValueArgument(0) as IrConst<String>
|
||||||
return context.llvm.staticData.createImmutableBinaryBlob(arg)
|
return context.llvm.staticData.createImmutableBinaryBlob(arg)
|
||||||
@@ -2152,10 +2153,10 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
|
|||||||
functionGenerationContext.store(args[2], pointer)
|
functionGenerationContext.store(args[2], pointer)
|
||||||
codegen.theUnitInstanceRef.llvm
|
codegen.theUnitInstanceRef.llvm
|
||||||
}
|
}
|
||||||
context.builtIns.nativePtrPlusLong -> functionGenerationContext.gep(args[0], args[1])
|
context.nativePtrPlusLong -> functionGenerationContext.gep(args[0], args[1])
|
||||||
context.builtIns.getNativeNullPtr -> kNullInt8Ptr
|
context.getNativeNullPtr -> kNullInt8Ptr
|
||||||
interop.getPointerSize -> Int32(LLVMPointerSize(codegen.llvmTargetData)).llvm
|
interop.getPointerSize -> Int32(LLVMPointerSize(codegen.llvmTargetData)).llvm
|
||||||
context.builtIns.nativePtrToLong -> {
|
context.nativePtrToLong -> {
|
||||||
val intPtrValue = functionGenerationContext.ptrToInt(args.single(), codegen.intPtrType)
|
val intPtrValue = functionGenerationContext.ptrToInt(args.single(), codegen.intPtrType)
|
||||||
val resultType = functionGenerationContext.getLLVMType(function.returnType)
|
val resultType = functionGenerationContext.getLLVMType(function.returnType)
|
||||||
|
|
||||||
@@ -2626,7 +2627,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
|
|||||||
if (context.config.produce.isNativeBinary) {
|
if (context.config.produce.isNativeBinary) {
|
||||||
context.llvm.librariesToLink.forEach {
|
context.llvm.librariesToLink.forEach {
|
||||||
val dependencyCtorFunction = context.llvm.externalFunction(
|
val dependencyCtorFunction = context.llvm.externalFunction(
|
||||||
it.moduleConstructorName, kVoidFuncType, CurrentKonanModule)
|
it.moduleConstructorName, kVoidFuncType, CurrentKonanModuleOrigin)
|
||||||
call(dependencyCtorFunction, emptyList(), Lifetime.IRRELEVANT,
|
call(dependencyCtorFunction, emptyList(), Lifetime.IRRELEVANT,
|
||||||
exceptionHandler = ExceptionHandler.Caller, verbatim = true)
|
exceptionHandler = ExceptionHandler.Caller, verbatim = true)
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -18,7 +18,7 @@ package org.jetbrains.kotlin.backend.konan.llvm
|
|||||||
|
|
||||||
import kotlinx.cinterop.*
|
import kotlinx.cinterop.*
|
||||||
import llvm.*
|
import llvm.*
|
||||||
import org.jetbrains.kotlin.backend.konan.descriptors.LlvmSymbolOrigin
|
import org.jetbrains.kotlin.descriptors.konan.CompiledKonanModuleOrigin
|
||||||
|
|
||||||
internal val LLVMValueRef.type: LLVMTypeRef
|
internal val LLVMValueRef.type: LLVMTypeRef
|
||||||
get() = LLVMTypeOf(this)!!
|
get() = LLVMTypeOf(this)!!
|
||||||
@@ -206,7 +206,7 @@ internal fun ContextUtils.addGlobal(name: String, type: LLVMTypeRef, isExported:
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun ContextUtils.importGlobal(name: String, type: LLVMTypeRef, origin: LlvmSymbolOrigin,
|
internal fun ContextUtils.importGlobal(name: String, type: LLVMTypeRef, origin: CompiledKonanModuleOrigin,
|
||||||
threadLocal: Boolean = false): LLVMValueRef {
|
threadLocal: Boolean = false): LLVMValueRef {
|
||||||
|
|
||||||
context.llvm.imports.add(origin)
|
context.llvm.imports.add(origin)
|
||||||
|
|||||||
-1
@@ -18,7 +18,6 @@ package org.jetbrains.kotlin.backend.konan.llvm.objc
|
|||||||
|
|
||||||
import llvm.LLVMTypeRef
|
import llvm.LLVMTypeRef
|
||||||
import llvm.LLVMValueRef
|
import llvm.LLVMValueRef
|
||||||
import org.jetbrains.kotlin.backend.konan.descriptors.stdlibModule
|
|
||||||
import org.jetbrains.kotlin.backend.konan.llvm.*
|
import org.jetbrains.kotlin.backend.konan.llvm.*
|
||||||
|
|
||||||
internal open class ObjCCodeGenerator(val codegen: CodeGenerator) {
|
internal open class ObjCCodeGenerator(val codegen: CodeGenerator) {
|
||||||
|
|||||||
+3
-3
@@ -17,8 +17,8 @@
|
|||||||
package org.jetbrains.kotlin.backend.konan.llvm.objc
|
package org.jetbrains.kotlin.backend.konan.llvm.objc
|
||||||
|
|
||||||
import llvm.*
|
import llvm.*
|
||||||
import org.jetbrains.kotlin.backend.konan.descriptors.CurrentKonanModule
|
|
||||||
import org.jetbrains.kotlin.backend.konan.llvm.*
|
import org.jetbrains.kotlin.backend.konan.llvm.*
|
||||||
|
import org.jetbrains.kotlin.descriptors.konan.CurrentKonanModuleOrigin
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class provides methods to generate Objective-C RTTI and other data.
|
* This class provides methods to generate Objective-C RTTI and other data.
|
||||||
@@ -86,7 +86,7 @@ internal class ObjCDataGenerator(val codegen: CodeGenerator) {
|
|||||||
|
|
||||||
// TODO: refactor usages and use [Global] class.
|
// TODO: refactor usages and use [Global] class.
|
||||||
val llvmGlobal = LLVMGetNamedGlobal(context.llvmModule, globalName) ?:
|
val llvmGlobal = LLVMGetNamedGlobal(context.llvmModule, globalName) ?:
|
||||||
codegen.importGlobal(globalName, classObjectType, CurrentKonanModule)
|
codegen.importGlobal(globalName, classObjectType, CurrentKonanModuleOrigin)
|
||||||
|
|
||||||
return constPointer(llvmGlobal)
|
return constPointer(llvmGlobal)
|
||||||
}
|
}
|
||||||
@@ -95,7 +95,7 @@ internal class ObjCDataGenerator(val codegen: CodeGenerator) {
|
|||||||
codegen.importGlobal(
|
codegen.importGlobal(
|
||||||
"_objc_empty_cache",
|
"_objc_empty_cache",
|
||||||
codegen.runtime.getStructType("_objc_cache"),
|
codegen.runtime.getStructType("_objc_cache"),
|
||||||
CurrentKonanModule
|
CurrentKonanModuleOrigin
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
+8
-5
@@ -16,9 +16,12 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.backend.konan.llvm.objcexport
|
package org.jetbrains.kotlin.backend.konan.llvm.objcexport
|
||||||
|
|
||||||
import llvm.*
|
import llvm.LLVMLinkage
|
||||||
import org.jetbrains.kotlin.backend.konan.descriptors.CurrentKonanModule
|
import llvm.LLVMSetLinkage
|
||||||
|
import llvm.LLVMStoreSizeOfType
|
||||||
|
import llvm.LLVMValueRef
|
||||||
import org.jetbrains.kotlin.backend.konan.llvm.*
|
import org.jetbrains.kotlin.backend.konan.llvm.*
|
||||||
|
import org.jetbrains.kotlin.descriptors.konan.CurrentKonanModuleOrigin
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
|
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
|
||||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||||
|
|
||||||
@@ -184,7 +187,7 @@ internal class BlockAdapterToFunctionGenerator(val objCExportCodeGenerator: ObjC
|
|||||||
val isa = codegen.importGlobal(
|
val isa = codegen.importGlobal(
|
||||||
"_NSConcreteStackBlock",
|
"_NSConcreteStackBlock",
|
||||||
int8TypePtr,
|
int8TypePtr,
|
||||||
CurrentKonanModule
|
CurrentKonanModuleOrigin
|
||||||
)
|
)
|
||||||
|
|
||||||
val flags = Int32((1 shl 25) or (1 shl 30) or (1 shl 31)).llvm
|
val flags = Int32((1 shl 25) or (1 shl 30) or (1 shl 31)).llvm
|
||||||
@@ -208,7 +211,7 @@ internal class BlockAdapterToFunctionGenerator(val objCExportCodeGenerator: ObjC
|
|||||||
val retainBlock = context.llvm.externalFunction(
|
val retainBlock = context.llvm.externalFunction(
|
||||||
"objc_retainBlock",
|
"objc_retainBlock",
|
||||||
functionType(int8TypePtr, false, int8TypePtr),
|
functionType(int8TypePtr, false, int8TypePtr),
|
||||||
CurrentKonanModule
|
CurrentKonanModuleOrigin
|
||||||
)
|
)
|
||||||
|
|
||||||
val copiedBlock = callFromBridge(retainBlock, listOf(bitcast(int8TypePtr, blockOnStack)))
|
val copiedBlock = callFromBridge(retainBlock, listOf(bitcast(int8TypePtr, blockOnStack)))
|
||||||
@@ -216,7 +219,7 @@ internal class BlockAdapterToFunctionGenerator(val objCExportCodeGenerator: ObjC
|
|||||||
val autoreleaseReturnValue = context.llvm.externalFunction(
|
val autoreleaseReturnValue = context.llvm.externalFunction(
|
||||||
"objc_autoreleaseReturnValue",
|
"objc_autoreleaseReturnValue",
|
||||||
functionType(int8TypePtr, false, int8TypePtr),
|
functionType(int8TypePtr, false, int8TypePtr),
|
||||||
CurrentKonanModule
|
CurrentKonanModuleOrigin
|
||||||
)
|
)
|
||||||
|
|
||||||
ret(callFromBridge(autoreleaseReturnValue, listOf(copiedBlock)))
|
ret(callFromBridge(autoreleaseReturnValue, listOf(copiedBlock)))
|
||||||
|
|||||||
+2
-1
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.backend.konan.llvm.*
|
|||||||
import org.jetbrains.kotlin.backend.konan.llvm.objc.ObjCCodeGenerator
|
import org.jetbrains.kotlin.backend.konan.llvm.objc.ObjCCodeGenerator
|
||||||
import org.jetbrains.kotlin.backend.konan.objcexport.*
|
import org.jetbrains.kotlin.backend.konan.objcexport.*
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
|
import org.jetbrains.kotlin.descriptors.konan.CurrentKonanModuleOrigin
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrConstructor
|
import org.jetbrains.kotlin.ir.declarations.IrConstructor
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
|
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
|
||||||
@@ -50,7 +51,7 @@ internal class ObjCExportCodeGenerator(
|
|||||||
context.llvm.externalFunction(
|
context.llvm.externalFunction(
|
||||||
"objc_terminate",
|
"objc_terminate",
|
||||||
functionType(voidType, false),
|
functionType(voidType, false),
|
||||||
CurrentKonanModule
|
CurrentKonanModuleOrigin
|
||||||
).also {
|
).also {
|
||||||
setFunctionNoUnwind(it)
|
setFunctionNoUnwind(it)
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -564,10 +564,10 @@ abstract class ObjCExportHeaderGenerator(
|
|||||||
|
|
||||||
private fun exportThrown(method: FunctionDescriptor) {
|
private fun exportThrown(method: FunctionDescriptor) {
|
||||||
if (!method.kind.isReal) return
|
if (!method.kind.isReal) return
|
||||||
val throwsAnnotation = method.annotations.findAnnotation(KonanBuiltIns.FqNames.throws) ?: return
|
val throwsAnnotation = method.annotations.findAnnotation(KonanFqNames.throws) ?: return
|
||||||
|
|
||||||
if (!mapper.doesThrow(method)) {
|
if (!mapper.doesThrow(method)) {
|
||||||
reportWarning(method, "@${KonanBuiltIns.FqNames.throws.shortName()} annotation should also be added to a base method")
|
reportWarning(method, "@${KonanFqNames.throws.shortName()} annotation should also be added to a base method")
|
||||||
}
|
}
|
||||||
|
|
||||||
if (method in methodsWithThrowAnnotationConsidered) return
|
if (method in methodsWithThrowAnnotationConsidered) return
|
||||||
|
|||||||
+1
-1
@@ -107,7 +107,7 @@ internal fun ObjCExportMapper.isObjCProperty(property: PropertyDescriptor): Bool
|
|||||||
property.extensionReceiverParameter == null || getClassIfCategory(property) != null
|
property.extensionReceiverParameter == null || getClassIfCategory(property) != null
|
||||||
|
|
||||||
internal fun ObjCExportMapper.doesThrow(method: FunctionDescriptor): Boolean = method.allOverriddenDescriptors.any {
|
internal fun ObjCExportMapper.doesThrow(method: FunctionDescriptor): Boolean = method.allOverriddenDescriptors.any {
|
||||||
it.overriddenDescriptors.isEmpty() && it.annotations.hasAnnotation(KonanBuiltIns.FqNames.throws)
|
it.overriddenDescriptors.isEmpty() && it.annotations.hasAnnotation(KonanFqNames.throws)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun ObjCExportMapper.bridgeType(kotlinType: KotlinType): TypeBridge = kotlinType.unwrapToPrimitiveOrReference(
|
private fun ObjCExportMapper.bridgeType(kotlinType: KotlinType): TypeBridge = kotlinType.unwrapToPrimitiveOrReference(
|
||||||
|
|||||||
+3
-3
@@ -18,14 +18,14 @@ 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.createInteropLibrary
|
import org.jetbrains.kotlin.backend.konan.createInteropLibrary
|
||||||
import org.jetbrains.kotlin.backend.konan.descriptors.DeserializedKonanModule
|
|
||||||
import org.jetbrains.kotlin.backend.konan.descriptors.createKonanModuleDescriptor
|
|
||||||
import org.jetbrains.kotlin.backend.konan.descriptors.isExpectMember
|
import org.jetbrains.kotlin.backend.konan.descriptors.isExpectMember
|
||||||
import org.jetbrains.kotlin.backend.konan.library.KonanLibraryReader
|
import org.jetbrains.kotlin.backend.konan.library.KonanLibraryReader
|
||||||
import org.jetbrains.kotlin.backend.konan.library.LinkData
|
import org.jetbrains.kotlin.backend.konan.library.LinkData
|
||||||
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.ModuleDescriptorImpl
|
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
|
||||||
|
import org.jetbrains.kotlin.descriptors.konan.DeserializedKonanModuleOrigin
|
||||||
|
import org.jetbrains.kotlin.descriptors.konan.createKonanModuleDescriptor
|
||||||
import org.jetbrains.kotlin.incremental.components.LookupTracker
|
import org.jetbrains.kotlin.incremental.components.LookupTracker
|
||||||
import org.jetbrains.kotlin.metadata.KonanLinkData
|
import org.jetbrains.kotlin.metadata.KonanLinkData
|
||||||
import org.jetbrains.kotlin.metadata.KonanLinkData.*
|
import org.jetbrains.kotlin.metadata.KonanLinkData.*
|
||||||
@@ -123,7 +123,7 @@ internal fun deserializeModule(languageVersionSettings: LanguageVersionSettings,
|
|||||||
val storageManager = LockBasedStorageManager()
|
val storageManager = LockBasedStorageManager()
|
||||||
val moduleDescriptor = createKonanModuleDescriptor(
|
val moduleDescriptor = createKonanModuleDescriptor(
|
||||||
Name.special(moduleName), storageManager,
|
Name.special(moduleName), storageManager,
|
||||||
origin = DeserializedKonanModule(reader)
|
origin = DeserializedKonanModuleOrigin(reader)
|
||||||
)
|
)
|
||||||
val deserializationConfiguration = CompilerDeserializationConfiguration(languageVersionSettings)
|
val deserializationConfiguration = CompilerDeserializationConfiguration(languageVersionSettings)
|
||||||
|
|
||||||
|
|||||||
@@ -251,6 +251,18 @@ task distCompiler(type: Copy) {
|
|||||||
into('konan/lib')
|
into('konan/lib')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
from(file("${gradle.includedBuild('konan.descriptors').projectDir}/build/libs")) {
|
||||||
|
into('konan/lib')
|
||||||
|
}
|
||||||
|
|
||||||
|
from(file("${gradle.includedBuild('konan.metadata').projectDir}/build/libs")) {
|
||||||
|
into('konan/lib')
|
||||||
|
}
|
||||||
|
|
||||||
|
from(file("${gradle.includedBuild('konan.metadata.serializer').projectDir}/build/libs")) {
|
||||||
|
into('konan/lib')
|
||||||
|
}
|
||||||
|
|
||||||
from(file('cmd')) {
|
from(file('cmd')) {
|
||||||
fileMode(0755)
|
fileMode(0755)
|
||||||
into('bin')
|
into('bin')
|
||||||
|
|||||||
+4
-1
@@ -85,9 +85,12 @@ STUB_GENERATOR_JAR="${KONAN_HOME}/konan/lib/StubGenerator.jar"
|
|||||||
INTEROP_INDEXER_JAR="${KONAN_HOME}/konan/lib/Indexer.jar"
|
INTEROP_INDEXER_JAR="${KONAN_HOME}/konan/lib/Indexer.jar"
|
||||||
INTEROP_JAR="${KONAN_HOME}/konan/lib/Runtime.jar"
|
INTEROP_JAR="${KONAN_HOME}/konan/lib/Runtime.jar"
|
||||||
SHARED_JAR="${KONAN_HOME}/konan/lib/shared.jar"
|
SHARED_JAR="${KONAN_HOME}/konan/lib/shared.jar"
|
||||||
|
EXTRACTED_DESCRIPTORS_JAR="${KONAN_HOME}/konan/lib/konan.descriptors.jar"
|
||||||
|
EXTRACTED_METADATA_JAR="${KONAN_HOME}/konan/lib/konan.metadata.jar"
|
||||||
|
EXTRACTED_METADATA_SERIALIZER_JAR="${KONAN_HOME}/konan/lib/konan.metadata.serializer.jar"
|
||||||
KLIB_JAR="${KONAN_HOME}/konan/lib/klib.jar"
|
KLIB_JAR="${KONAN_HOME}/konan/lib/klib.jar"
|
||||||
UTILITIES_JAR="${KONAN_HOME}/konan/lib/utilities.jar"
|
UTILITIES_JAR="${KONAN_HOME}/konan/lib/utilities.jar"
|
||||||
KONAN_CLASSPATH="$KOTLIN_JAR:$KOTLIN_STDLIB_JAR:$KOTLIN_REFLECT_JAR:$KOTLIN_SCRIPT_RUNTIME_JAR:$INTEROP_JAR:$STUB_GENERATOR_JAR:$INTEROP_INDEXER_JAR:$KONAN_JAR:$KLIB_JAR:$UTILITIES_JAR:$SHARED_JAR"
|
KONAN_CLASSPATH="$KOTLIN_JAR:$KOTLIN_STDLIB_JAR:$KOTLIN_REFLECT_JAR:$KOTLIN_SCRIPT_RUNTIME_JAR:$INTEROP_JAR:$STUB_GENERATOR_JAR:$INTEROP_INDEXER_JAR:$KONAN_JAR:$KLIB_JAR:$UTILITIES_JAR:$SHARED_JAR:$EXTRACTED_DESCRIPTORS_JAR:$EXTRACTED_METADATA_JAR:$EXTRACTED_METADATA_SERIALIZER_JAR"
|
||||||
TOOL_CLASS=org.jetbrains.kotlin.cli.utilities.MainKt
|
TOOL_CLASS=org.jetbrains.kotlin.cli.utilities.MainKt
|
||||||
|
|
||||||
LIBCLANG_DISABLE_CRASH_RECOVERY=1 \
|
LIBCLANG_DISABLE_CRASH_RECOVERY=1 \
|
||||||
|
|||||||
+4
-1
@@ -55,6 +55,9 @@ set "NATIVE_LIB=%_KONAN_HOME%\konan\nativelib"
|
|||||||
set "KONAN_LIB=%_KONAN_HOME%\konan\lib"
|
set "KONAN_LIB=%_KONAN_HOME%\konan\lib"
|
||||||
|
|
||||||
set "SHARED_JAR=%KONAN_LIB%\shared.jar"
|
set "SHARED_JAR=%KONAN_LIB%\shared.jar"
|
||||||
|
set "EXTRACTED_DESCRIPTORS_JAR=%KONAN_LIB%\konan.descriptors.jar"
|
||||||
|
set "EXTRACTED_METADATA_JAR=%KONAN_LIB%\konan.metadata.jar"
|
||||||
|
set "EXTRACTED_METADATA_SERIALIZER_JAR=%KONAN_LIB%\konan.metadata.serializer.jar"
|
||||||
set "INTEROP_INDEXER_JAR=%KONAN_LIB%\Indexer.jar"
|
set "INTEROP_INDEXER_JAR=%KONAN_LIB%\Indexer.jar"
|
||||||
set "INTEROP_RUNTIME_JAR=%KONAN_LIB%\Runtime.jar"
|
set "INTEROP_RUNTIME_JAR=%KONAN_LIB%\Runtime.jar"
|
||||||
set "KLIB_JAR=%KONAN_LIB%\klib.jar"
|
set "KLIB_JAR=%KONAN_LIB%\klib.jar"
|
||||||
@@ -66,7 +69,7 @@ set "KOTLIN_SCRIPT_RUNTIME_JAR=%KONAN_LIB%\kotlin-script-runtime.jar"
|
|||||||
set "STUB_GENERATOR_JAR=%KONAN_LIB%\StubGenerator.jar"
|
set "STUB_GENERATOR_JAR=%KONAN_LIB%\StubGenerator.jar"
|
||||||
set "UTILITIES_JAR=%KONAN_LIB%\utilities.jar"
|
set "UTILITIES_JAR=%KONAN_LIB%\utilities.jar"
|
||||||
|
|
||||||
set "KONAN_CLASSPATH=%KOTLIN_JAR%;%KOTLIN_STDLIB_JAR%;%KOTLIN_REFLECT_JAR%;%KOTLIN_SCRIPT_RUNTIME_JAR%;%INTEROP_RUNTIME_JAR%;%KONAN_JAR%;%STUB_GENERATOR_JAR%;%INTEROP_INDEXER_JAR%;%SHARED_JAR%;%KLIB_JAR%;%UTILITIES_JAR%"
|
set "KONAN_CLASSPATH=%KOTLIN_JAR%;%KOTLIN_STDLIB_JAR%;%KOTLIN_REFLECT_JAR%;%KOTLIN_SCRIPT_RUNTIME_JAR%;%INTEROP_RUNTIME_JAR%;%KONAN_JAR%;%STUB_GENERATOR_JAR%;%INTEROP_INDEXER_JAR%;%SHARED_JAR%;%EXTRACTED_DESCRIPTORS_JAR%;%EXTRACTED_METADATA_JAR%;%EXTRACTED_METADATA_SERIALIZER_JAR%;%KLIB_JAR%;%UTILITIES_JAR%"
|
||||||
|
|
||||||
set JAVA_OPTS=-ea ^
|
set JAVA_OPTS=-ea ^
|
||||||
-Xmx3G ^
|
-Xmx3G ^
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
buildscript {
|
||||||
|
ext.rootBuildDirectory = file('../..')
|
||||||
|
|
||||||
|
apply from: "$rootBuildDirectory/gradle/loadRootProperties.gradle"
|
||||||
|
apply from: "$rootBuildDirectory/gradle/kotlinGradlePlugin.gradle"
|
||||||
|
}
|
||||||
|
|
||||||
|
apply plugin: 'kotlin'
|
||||||
|
|
||||||
|
group = 'org.jetbrains.kotlin'
|
||||||
|
version = konanVersion
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
mavenCentral()
|
||||||
|
maven {
|
||||||
|
url kotlinCompilerRepo
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sourceSets {
|
||||||
|
main.kotlin {
|
||||||
|
srcDir 'src/main/kotlin'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
jar {
|
||||||
|
archiveName = "${project.name}.jar"
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
compile "org.jetbrains.kotlin:kotlin-stdlib:$buildKotlinVersion"
|
||||||
|
compile "org.jetbrains.kotlin:kotlin-native-shared:$konanVersion"
|
||||||
|
compile "org.jetbrains.kotlin:kotlin-compiler:$kotlinVersion"
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
rootProject.name = "konan.descriptors"
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
package org.jetbrains.kotlin.builtins.konan
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
import org.jetbrains.kotlin.storage.StorageManager
|
||||||
|
|
||||||
|
class KonanBuiltIns(storageManager: StorageManager) : KotlinBuiltIns(storageManager) {
|
||||||
|
|
||||||
|
override fun getSuspendFunction(parameterCount: Int) =
|
||||||
|
getBuiltInClassByName(Name.identifier("SuspendFunction$parameterCount"))
|
||||||
|
}
|
||||||
|
|
||||||
+37
@@ -0,0 +1,37 @@
|
|||||||
|
package org.jetbrains.kotlin.descriptors.konan
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
|
import org.jetbrains.kotlin.builtins.konan.KonanBuiltIns
|
||||||
|
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||||
|
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
|
||||||
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
import org.jetbrains.kotlin.storage.StorageManager
|
||||||
|
|
||||||
|
fun createKonanModuleDescriptor(
|
||||||
|
name: Name,
|
||||||
|
storageManager: StorageManager,
|
||||||
|
origin: KonanModuleOrigin
|
||||||
|
): ModuleDescriptorImpl {
|
||||||
|
val builtIns = KonanBuiltIns(storageManager)
|
||||||
|
|
||||||
|
val moduleDescriptor = createKonanModuleDescriptor(name, storageManager, builtIns, origin)
|
||||||
|
|
||||||
|
builtIns.builtInsModule = moduleDescriptor
|
||||||
|
// It is mostly correct because any module should depend on stdlib.
|
||||||
|
|
||||||
|
return moduleDescriptor
|
||||||
|
}
|
||||||
|
|
||||||
|
fun createKonanModuleDescriptor(
|
||||||
|
name: Name,
|
||||||
|
storageManager: StorageManager,
|
||||||
|
builtIns: KotlinBuiltIns,
|
||||||
|
origin: KonanModuleOrigin
|
||||||
|
) = ModuleDescriptorImpl(
|
||||||
|
name, storageManager, builtIns,
|
||||||
|
capabilities = mapOf(KonanModuleOrigin.CAPABILITY to origin)
|
||||||
|
)
|
||||||
|
|
||||||
|
private val STDLIB_MODULE_NAME = Name.special("<stdlib>")
|
||||||
|
|
||||||
|
fun ModuleDescriptor.isKonanStdlib() = name == STDLIB_MODULE_NAME
|
||||||
+21
@@ -0,0 +1,21 @@
|
|||||||
|
package org.jetbrains.kotlin.descriptors.konan
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||||
|
|
||||||
|
sealed class KonanModuleOrigin {
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
val CAPABILITY = ModuleDescriptor.Capability<KonanModuleOrigin>("KonanModuleOrigin")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sealed class CompiledKonanModuleOrigin: KonanModuleOrigin()
|
||||||
|
|
||||||
|
// FIXME: ddol: replace `Any` by `KonanLibraryReader` when ready
|
||||||
|
class DeserializedKonanModuleOrigin(val reader: Any) : CompiledKonanModuleOrigin()
|
||||||
|
|
||||||
|
object CurrentKonanModuleOrigin: CompiledKonanModuleOrigin()
|
||||||
|
|
||||||
|
object SyntheticModulesOrigin : KonanModuleOrigin()
|
||||||
|
|
||||||
|
val ModuleDescriptor.konanModuleOrigin get() = this.getCapability(KonanModuleOrigin.CAPABILITY)!!
|
||||||
+113
@@ -0,0 +1,113 @@
|
|||||||
|
package org.jetbrains.kotlin.descriptors.konan.interop
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
|
import org.jetbrains.kotlin.descriptors.impl.ClassDescriptorImpl
|
||||||
|
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
|
||||||
|
import org.jetbrains.kotlin.descriptors.impl.PackageFragmentDescriptorImpl
|
||||||
|
import org.jetbrains.kotlin.descriptors.konan.SyntheticModulesOrigin
|
||||||
|
import org.jetbrains.kotlin.descriptors.konan.createKonanModuleDescriptor
|
||||||
|
import org.jetbrains.kotlin.incremental.components.LookupLocation
|
||||||
|
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
||||||
|
import org.jetbrains.kotlin.name.FqName
|
||||||
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns
|
||||||
|
import org.jetbrains.kotlin.resolve.scopes.MemberScope
|
||||||
|
import org.jetbrains.kotlin.resolve.scopes.MemberScopeImpl
|
||||||
|
import org.jetbrains.kotlin.storage.LockBasedStorageManager
|
||||||
|
import org.jetbrains.kotlin.storage.StorageManager
|
||||||
|
import org.jetbrains.kotlin.storage.getValue
|
||||||
|
import org.jetbrains.kotlin.utils.Printer
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates module which "contains" forward declarations.
|
||||||
|
* Note: this module should be unique per compilation and should always be the last dependency of any module.
|
||||||
|
*/
|
||||||
|
fun createForwardDeclarationsModule(builtIns: KotlinBuiltIns, storageManager: StorageManager): ModuleDescriptorImpl {
|
||||||
|
val module = createKonanModuleDescriptor(
|
||||||
|
Name.special("<forward declarations>"),
|
||||||
|
storageManager,
|
||||||
|
builtIns,
|
||||||
|
origin = SyntheticModulesOrigin
|
||||||
|
)
|
||||||
|
|
||||||
|
fun createPackage(fqName: FqName, supertypeName: String, classKind: ClassKind = ClassKind.CLASS) =
|
||||||
|
ForwardDeclarationsPackageFragmentDescriptor(
|
||||||
|
storageManager,
|
||||||
|
module,
|
||||||
|
fqName,
|
||||||
|
Name.identifier(supertypeName),
|
||||||
|
classKind
|
||||||
|
)
|
||||||
|
|
||||||
|
val packageFragmentProvider = PackageFragmentProviderImpl(
|
||||||
|
listOf(
|
||||||
|
createPackage(InteropFqNames.cNamesStructs, "COpaque"),
|
||||||
|
createPackage(InteropFqNames.objCNamesClasses, "ObjCObjectBase"),
|
||||||
|
createPackage(InteropFqNames.objCNamesProtocols, "ObjCObject", ClassKind.INTERFACE)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
module.initialize(packageFragmentProvider)
|
||||||
|
module.setDependencies(module)
|
||||||
|
|
||||||
|
return module
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Package fragment which creates descriptors for forward declarations on demand.
|
||||||
|
*/
|
||||||
|
private class ForwardDeclarationsPackageFragmentDescriptor(
|
||||||
|
storageManager: StorageManager,
|
||||||
|
module: ModuleDescriptor, fqName: FqName, supertypeName: Name, classKind: ClassKind
|
||||||
|
) : PackageFragmentDescriptorImpl(module, fqName) {
|
||||||
|
|
||||||
|
private val memberScope = object : MemberScopeImpl() {
|
||||||
|
|
||||||
|
private val declarations = storageManager.createMemoizedFunction(this::createDeclaration)
|
||||||
|
|
||||||
|
private val supertype by storageManager.createLazyValue {
|
||||||
|
val descriptor = builtIns.builtInsModule.getPackage(InteropFqNames.packageName)
|
||||||
|
.memberScope
|
||||||
|
.getContributedClassifier(supertypeName, NoLookupLocation.FROM_BACKEND) as ClassDescriptor
|
||||||
|
|
||||||
|
descriptor.defaultType
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun createDeclaration(name: Name): ClassDescriptor {
|
||||||
|
return ClassDescriptorImpl(
|
||||||
|
this@ForwardDeclarationsPackageFragmentDescriptor,
|
||||||
|
name, Modality.FINAL, classKind,
|
||||||
|
listOf(supertype), SourceElement.NO_SOURCE, false, LockBasedStorageManager.NO_LOCKS
|
||||||
|
).apply {
|
||||||
|
this.initialize(MemberScope.Empty, emptySet(), null)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getContributedClassifier(name: Name, location: LookupLocation) = declarations(name)
|
||||||
|
|
||||||
|
override fun printScopeStructure(p: Printer) {
|
||||||
|
p.println(this::class.java.simpleName, "{}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getMemberScope(): MemberScope = memberScope
|
||||||
|
}
|
||||||
|
|
||||||
|
object InteropFqNames {
|
||||||
|
|
||||||
|
const val cPointerName = "CPointer"
|
||||||
|
const val nativePointedName = "NativePointed"
|
||||||
|
|
||||||
|
val packageName = FqName("kotlinx.cinterop")
|
||||||
|
|
||||||
|
val cPointer = packageName.child(Name.identifier(cPointerName)).toUnsafe()
|
||||||
|
val nativePointed = packageName.child(Name.identifier(nativePointedName)).toUnsafe()
|
||||||
|
|
||||||
|
val cNames = FqName("cnames")
|
||||||
|
val cNamesStructs = cNames.child(Name.identifier("structs"))
|
||||||
|
|
||||||
|
val objCNames = FqName("objcnames")
|
||||||
|
val objCNamesClasses = objCNames.child(Name.identifier("classes"))
|
||||||
|
val objCNamesProtocols = objCNames.child(Name.identifier("protocols"))
|
||||||
|
}
|
||||||
+17
@@ -0,0 +1,17 @@
|
|||||||
|
package org.jetbrains.kotlin.resolve.konan.platform
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.resolve.ImportPath
|
||||||
|
import org.jetbrains.kotlin.resolve.MultiTargetPlatform
|
||||||
|
import org.jetbrains.kotlin.resolve.PlatformConfigurator
|
||||||
|
import org.jetbrains.kotlin.resolve.TargetPlatform
|
||||||
|
import org.jetbrains.kotlin.storage.StorageManager
|
||||||
|
|
||||||
|
object KonanPlatform : TargetPlatform("Konan") {
|
||||||
|
|
||||||
|
override fun computePlatformSpecificDefaultImports(storageManager: StorageManager, result: MutableList<ImportPath>) {
|
||||||
|
result.add(ImportPath.fromString("konan.*"))
|
||||||
|
}
|
||||||
|
|
||||||
|
override val multiTargetPlatform = MultiTargetPlatform.Specific(platformName)
|
||||||
|
override val platformConfigurator: PlatformConfigurator = KonanPlatformConfigurator
|
||||||
|
}
|
||||||
+1
-20
@@ -1,22 +1,4 @@
|
|||||||
/*
|
package org.jetbrains.kotlin.resolve.konan.platform
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Adapted from JS compiler, but everyhing has been switched off for now.
|
|
||||||
|
|
||||||
package org.jetbrains.kotlin.backend.konan
|
|
||||||
|
|
||||||
import org.jetbrains.kotlin.builtins.PlatformToKotlinClassMap
|
import org.jetbrains.kotlin.builtins.PlatformToKotlinClassMap
|
||||||
import org.jetbrains.kotlin.container.StorageComponentContainer
|
import org.jetbrains.kotlin.container.StorageComponentContainer
|
||||||
@@ -30,7 +12,6 @@ import org.jetbrains.kotlin.resolve.lazy.DelegationFilter
|
|||||||
import org.jetbrains.kotlin.resolve.scopes.SyntheticScopes
|
import org.jetbrains.kotlin.resolve.scopes.SyntheticScopes
|
||||||
import org.jetbrains.kotlin.types.DynamicTypesSettings
|
import org.jetbrains.kotlin.types.DynamicTypesSettings
|
||||||
|
|
||||||
|
|
||||||
object KonanPlatformConfigurator : PlatformConfigurator(
|
object KonanPlatformConfigurator : PlatformConfigurator(
|
||||||
DynamicTypesSettings(),
|
DynamicTypesSettings(),
|
||||||
additionalDeclarationCheckers = listOf(ExpectedActualDeclarationChecker),
|
additionalDeclarationCheckers = listOf(ExpectedActualDeclarationChecker),
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
buildscript {
|
||||||
|
ext.rootBuildDirectory = file('../..')
|
||||||
|
|
||||||
|
apply from: "$rootBuildDirectory/gradle/loadRootProperties.gradle"
|
||||||
|
apply from: "$rootBuildDirectory/gradle/kotlinGradlePlugin.gradle"
|
||||||
|
}
|
||||||
|
|
||||||
|
apply plugin: 'kotlin'
|
||||||
|
|
||||||
|
group = 'org.jetbrains.kotlin'
|
||||||
|
version = konanVersion
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
mavenCentral()
|
||||||
|
maven {
|
||||||
|
url kotlinCompilerRepo
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sourceSets {
|
||||||
|
main.kotlin {
|
||||||
|
srcDir 'src/main/kotlin'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
jar {
|
||||||
|
archiveName = "${project.name}.jar"
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
compile "org.jetbrains.kotlin:konan.descriptors:$konanVersion"
|
||||||
|
compile "org.jetbrains.kotlin:konan.metadata:$konanVersion"
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
rootProject.name = "konan.metadata.serializer"
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
buildscript {
|
||||||
|
ext.rootBuildDirectory = file('../..')
|
||||||
|
|
||||||
|
apply from: "$rootBuildDirectory/gradle/loadRootProperties.gradle"
|
||||||
|
apply from: "$rootBuildDirectory/gradle/kotlinGradlePlugin.gradle"
|
||||||
|
}
|
||||||
|
|
||||||
|
apply plugin: 'kotlin'
|
||||||
|
|
||||||
|
group = 'org.jetbrains.kotlin'
|
||||||
|
version = konanVersion
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
mavenCentral()
|
||||||
|
maven {
|
||||||
|
url kotlinCompilerRepo
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sourceSets {
|
||||||
|
main.kotlin {
|
||||||
|
srcDir 'src/main/kotlin'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
jar {
|
||||||
|
archiveName = "${project.name}.jar"
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
compile "org.jetbrains.kotlin:kotlin-stdlib:$buildKotlinVersion"
|
||||||
|
compile "org.jetbrains.kotlin:kotlin-native-shared:$konanVersion"
|
||||||
|
compile "org.jetbrains.kotlin:kotlin-compiler:$kotlinVersion"
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
rootProject.name = "konan.metadata"
|
||||||
@@ -17,7 +17,6 @@
|
|||||||
package org.jetbrains.kotlin.cli.klib
|
package org.jetbrains.kotlin.cli.klib
|
||||||
|
|
||||||
// TODO: Extract `library` package as a shared jar?
|
// TODO: Extract `library` package as a shared jar?
|
||||||
import org.jetbrains.kotlin.backend.konan.isStdlib
|
|
||||||
import org.jetbrains.kotlin.backend.konan.library.impl.LibraryReaderImpl
|
import org.jetbrains.kotlin.backend.konan.library.impl.LibraryReaderImpl
|
||||||
import org.jetbrains.kotlin.backend.konan.library.impl.UnzippedKonanLibrary
|
import org.jetbrains.kotlin.backend.konan.library.impl.UnzippedKonanLibrary
|
||||||
import org.jetbrains.kotlin.backend.konan.library.impl.ZippedKonanLibrary
|
import org.jetbrains.kotlin.backend.konan.library.impl.ZippedKonanLibrary
|
||||||
@@ -26,6 +25,7 @@ import org.jetbrains.kotlin.config.ApiVersion
|
|||||||
import org.jetbrains.kotlin.config.LanguageVersion
|
import org.jetbrains.kotlin.config.LanguageVersion
|
||||||
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
|
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
|
||||||
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
|
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
|
||||||
|
import org.jetbrains.kotlin.descriptors.konan.isKonanStdlib
|
||||||
import org.jetbrains.kotlin.konan.file.File
|
import org.jetbrains.kotlin.konan.file.File
|
||||||
import org.jetbrains.kotlin.konan.library.KonanLibrarySearchPathResolver
|
import org.jetbrains.kotlin.konan.library.KonanLibrarySearchPathResolver
|
||||||
import org.jetbrains.kotlin.konan.target.Distribution
|
import org.jetbrains.kotlin.konan.target.Distribution
|
||||||
@@ -146,7 +146,7 @@ class Library(val name: String, val requestedRepository: String?, val target: St
|
|||||||
val versionSpec = LanguageVersionSettingsImpl(currentLanguageVersion, currentApiVersion)
|
val versionSpec = LanguageVersionSettingsImpl(currentLanguageVersion, currentApiVersion)
|
||||||
val module = reader.moduleDescriptor(versionSpec)
|
val module = reader.moduleDescriptor(versionSpec)
|
||||||
val defaultModules = mutableListOf<ModuleDescriptorImpl>()
|
val defaultModules = mutableListOf<ModuleDescriptorImpl>()
|
||||||
if (!module.isStdlib()) {
|
if (!module.isKonanStdlib()) {
|
||||||
val resolver = KonanLibrarySearchPathResolver(emptyList(),
|
val resolver = KonanLibrarySearchPathResolver(emptyList(),
|
||||||
target = null,
|
target = null,
|
||||||
distributionKlib = Distribution().klib,
|
distributionKlib = Distribution().klib,
|
||||||
|
|||||||
@@ -33,6 +33,9 @@ include ':performance'
|
|||||||
include ':platformLibs'
|
include ':platformLibs'
|
||||||
|
|
||||||
includeBuild 'shared'
|
includeBuild 'shared'
|
||||||
|
includeBuild 'extracted/konan.descriptors'
|
||||||
|
includeBuild 'extracted/konan.metadata'
|
||||||
|
includeBuild 'extracted/konan.metadata.serializer'
|
||||||
includeBuild 'tools/kotlin-native-gradle-plugin'
|
includeBuild 'tools/kotlin-native-gradle-plugin'
|
||||||
|
|
||||||
if (hasProperty("kotlinProjectPath")) {
|
if (hasProperty("kotlinProjectPath")) {
|
||||||
|
|||||||
Reference in New Issue
Block a user