From a4a235be421b3204fd19a2e4057cea2ceed16391 Mon Sep 17 00:00:00 2001 From: Dmitriy Dolovov <41585329+ddolovov@users.noreply.github.com> Date: Tue, 14 Aug 2018 13:20:28 +0300 Subject: [PATCH] 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 --- backend.native/build.gradle | 3 + .../jetbrains/kotlin/backend/konan/Context.kt | 25 +++- .../kotlin/backend/konan/InlineClasses.kt | 17 +-- .../kotlin/backend/konan/InteropUtils.kt | 40 ++----- .../backend/konan/KonanBackendContext.kt | 1 + .../KonanBuiltInClassDescriptorFactory.kt | 78 ------------ .../kotlin/backend/konan/KonanConfig.kt | 14 ++- .../kotlin/backend/konan/KonanFqNames.kt | 36 ++++++ .../kotlin/backend/konan/KonanPlatform.kt | 89 -------------- .../kotlin/backend/konan/ObjCInterop.kt | 15 +-- .../konan/TopDownAnalyzerFacadeForKonan.kt | 9 +- .../konan/descriptors/InteropDescriptors.kt | 89 +------------- .../descriptors/KonanModuleDescriptors.kt | 70 ----------- .../descriptors/LegacyDescriptorUtils.kt | 2 +- .../kotlin/backend/konan/injection.kt | 1 + .../jetbrains/kotlin/backend/konan/ir/Ir.kt | 6 +- .../kotlin/backend/konan/llvm/ContextUtils.kt | 18 ++- .../kotlin/backend/konan/llvm/Imports.kt | 17 +-- .../kotlin/backend/konan/llvm/IrToBitcode.kt | 11 +- .../kotlin/backend/konan/llvm/LlvmUtils.kt | 4 +- .../konan/llvm/objc/ObjCCodeGenerator.kt | 1 - .../konan/llvm/objc/ObjCDataGenerator.kt | 6 +- .../llvm/objcexport/BlockPointerSupport.kt | 13 +- .../objcexport/ObjCExportCodeGenerator.kt | 3 +- .../objcexport/ObjCExportHeaderGenerator.kt | 4 +- .../konan/objcexport/ObjCExportMapper.kt | 2 +- .../konan/optimizations/Devirtualization.kt | 2 +- .../serialization/KonanSerializationUtil.kt | 6 +- build.gradle | 12 ++ cmd/run_konan | 5 +- cmd/run_konan.bat | 5 +- extracted/konan.descriptors/build.gradle | 34 ++++++ extracted/konan.descriptors/settings.gradle | 1 + .../kotlin/builtins/konan/KonanBuiltIns.kt | 12 ++ .../konan/KonanModuleDescriptors.kt | 37 ++++++ .../descriptors/konan/KonanModuleOrigin.kt | 21 ++++ .../konan/interop/InteropDescriptors.kt | 113 ++++++++++++++++++ .../resolve/konan/platform/KonanPlatform.kt | 17 +++ .../platform}/KonanPlatformConfigurator.kt | 21 +--- .../konan.metadata.serializer/build.gradle | 33 +++++ .../konan.metadata.serializer/settings.gradle | 1 + extracted/konan.metadata/build.gradle | 34 ++++++ extracted/konan.metadata/settings.gradle | 1 + .../org/jetbrains/kotlin/cli/klib/main.kt | 4 +- settings.gradle | 3 + 45 files changed, 489 insertions(+), 447 deletions(-) delete mode 100644 backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanBuiltInClassDescriptorFactory.kt create mode 100644 backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanFqNames.kt delete mode 100644 backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanPlatform.kt delete mode 100644 backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/KonanModuleDescriptors.kt create mode 100644 extracted/konan.descriptors/build.gradle create mode 100644 extracted/konan.descriptors/settings.gradle create mode 100644 extracted/konan.descriptors/src/main/kotlin/org/jetbrains/kotlin/builtins/konan/KonanBuiltIns.kt create mode 100644 extracted/konan.descriptors/src/main/kotlin/org/jetbrains/kotlin/descriptors/konan/KonanModuleDescriptors.kt create mode 100644 extracted/konan.descriptors/src/main/kotlin/org/jetbrains/kotlin/descriptors/konan/KonanModuleOrigin.kt create mode 100644 extracted/konan.descriptors/src/main/kotlin/org/jetbrains/kotlin/descriptors/konan/interop/InteropDescriptors.kt create mode 100644 extracted/konan.descriptors/src/main/kotlin/org/jetbrains/kotlin/resolve/konan/platform/KonanPlatform.kt rename {backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan => extracted/konan.descriptors/src/main/kotlin/org/jetbrains/kotlin/resolve/konan/platform}/KonanPlatformConfigurator.kt (72%) create mode 100644 extracted/konan.metadata.serializer/build.gradle create mode 100644 extracted/konan.metadata.serializer/settings.gradle create mode 100644 extracted/konan.metadata/build.gradle create mode 100644 extracted/konan.metadata/settings.gradle diff --git a/backend.native/build.gradle b/backend.native/build.gradle index d73d339a56e..e4ff0341ea3 100644 --- a/backend.native/build.gradle +++ b/backend.native/build.gradle @@ -138,6 +138,9 @@ dependencies { compilerCompile kotlinNativeInterop['llvm'].configuration compilerCompile kotlinNativeInterop['hash'].configuration 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 "org.jetbrains.kotlin:kotlin-native-shared:$konanVersion" diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt index 53d6e8bb681..6a2b59be479 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt @@ -35,6 +35,7 @@ import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.ReceiverParameterDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl 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.SourceManager 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.acceptChildrenVoid 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.metadata.KonanLinkData import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name 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.serialization.deserialization.descriptors.DeserializedClassDescriptor import org.jetbrains.kotlin.serialization.deserialization.getName @@ -280,6 +285,16 @@ internal class Context(config: KonanConfig) : KonanBackendContext(config) { 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) class LazyMember(val initializer: Context.() -> T) { @@ -350,7 +365,7 @@ internal class Context(config: KonanConfig) : KonanBackendContext(config) { get() = ir.irModule.irBuiltins val interopBuiltIns by lazy { - InteropBuiltIns(this.builtIns) + InteropBuiltIns(this.builtIns, nativePtr) } var llvmModule: LLVMModuleRef? = null @@ -509,5 +524,13 @@ internal class Context(config: KonanConfig) : KonanBackendContext(config) { val kind = config.configuration.get(KonanConfigKeys.PRODUCE) 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) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/InlineClasses.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/InlineClasses.kt index 56d3de8ce1e..0f74065a1e5 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/InlineClasses.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/InlineClasses.kt @@ -20,10 +20,13 @@ import org.jetbrains.kotlin.backend.konan.irasdescriptors.containsNull import org.jetbrains.kotlin.backend.konan.irasdescriptors.fqNameSafe import org.jetbrains.kotlin.builtins.PrimitiveType 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.symbols.IrClassSymbol 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.defaultType import org.jetbrains.kotlin.name.ClassId @@ -81,7 +84,7 @@ enum class KonanPrimitiveType(val classId: ClassId) { LONG(PrimitiveType.LONG), FLOAT(PrimitiveType.FLOAT), 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 { private val implicitInlineClasses = (KonanPrimitiveType.values().map { it.fqName } + - KonanBuiltIns.FqNames.nativePtr + - InteropBuiltIns.FqNames.cPointer).toSet() + KonanFqNames.nativePtr + + InteropFqNames.cPointer).toSet() private enum class ValueClass(val fqName: FqNameUnsafe, val binaryType: BinaryType.Primitive) { @@ -256,7 +259,7 @@ internal object KotlinTypeInlineClassesSupport : InlineClassesSupport { val interopPackageFragments = konanPackageFragments.filter { it.fqName == packageFqName } - val fqNames = InteropBuiltIns.FqNames - val result = mutableListOf() // 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) } // TODO: use separate namespaces for structs, enums, Objective-C protocols etc. diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanBackendContext.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanBackendContext.kt index 056713ae58b..e5c90a653db 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanBackendContext.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanBackendContext.kt @@ -29,6 +29,7 @@ import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.IrFile +import org.jetbrains.kotlin.builtins.konan.KonanBuiltIns import org.jetbrains.kotlin.name.Name abstract internal class KonanBackendContext(val config: KonanConfig) : CommonBackendContext { diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanBuiltInClassDescriptorFactory.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanBuiltInClassDescriptorFactory.kt deleted file mode 100644 index c6d43286e10..00000000000 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanBuiltInClassDescriptorFactory.kt +++ /dev/null @@ -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().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 = - 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()) - } -} diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt index 275eea6081a..8fc3e3b819c 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt @@ -17,18 +17,22 @@ package org.jetbrains.kotlin.backend.konan import com.intellij.openapi.project.Project -import org.jetbrains.kotlin.backend.konan.descriptors.createForwardDeclarationsModule -import org.jetbrains.kotlin.backend.konan.library.* -import org.jetbrains.kotlin.backend.konan.library.impl.* +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.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.cli.common.CLIConfigurationKeys 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.STRONG_WARNING import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.config.CompilerConfiguration -import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl 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.file.File import org.jetbrains.kotlin.konan.library.defaultResolver diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanFqNames.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanFqNames.kt new file mode 100644 index 00000000000..fe1dfd3fa03 --- /dev/null +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanFqNames.kt @@ -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 diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanPlatform.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanPlatform.kt deleted file mode 100644 index 6892fbf83fc..00000000000 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanPlatform.kt +++ /dev/null @@ -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("") - -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) { - 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 diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ObjCInterop.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ObjCInterop.kt index be8cb82539f..b8493c0fe58 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ObjCInterop.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ObjCInterop.kt @@ -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.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.ClassDescriptor -import org.jetbrains.kotlin.descriptors.ConstructorDescriptor -import org.jetbrains.kotlin.descriptors.FunctionDescriptor -import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor +import org.jetbrains.kotlin.descriptors.konan.interop.InteropFqNames import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.ir.declarations.IrConstructor 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.resolve.ExternalOverridabilityCondition 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.TypeUtils 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 objCClassFqName = interopPackageName.child(Name.identifier("ObjCClass")) internal val externalObjCClassFqName = interopPackageName.child(Name.identifier("ExternalObjCClass")) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/TopDownAnalyzerFacadeForKonan.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/TopDownAnalyzerFacadeForKonan.kt index 5926529e28a..d016e07eff7 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/TopDownAnalyzerFacadeForKonan.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/TopDownAnalyzerFacadeForKonan.kt @@ -17,12 +17,13 @@ package org.jetbrains.kotlin.backend.konan 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.context.ModuleContext import org.jetbrains.kotlin.context.MutableModuleContextImpl 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.name.Name import org.jetbrains.kotlin.psi.KtFile @@ -35,10 +36,10 @@ object TopDownAnalyzerFacadeForKonan { 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) - if (!module.isStdlib()) { + if (!module.isKonanStdlib()) { val dependencies = listOf(module) + config.moduleDescriptors + config.getOrCreateForwardDeclarationsModule(module.builtIns, projectContext.storageManager) module.setDependencies(dependencies, config.friends) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/InteropDescriptors.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/InteropDescriptors.kt index 92c69733cce..ef403a78c69 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/InteropDescriptors.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/InteropDescriptors.kt @@ -16,23 +16,15 @@ 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.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.ClassifierDescriptor +import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.impl.PackageFragmentDescriptorImpl 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 import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult @@ -101,80 +93,3 @@ class ClassifierAliasingPackageFragmentDescriptor( 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(""), - 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 -} \ No newline at end of file diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/KonanModuleDescriptors.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/KonanModuleDescriptors.kt deleted file mode 100644 index ad6f13326b9..00000000000 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/KonanModuleDescriptors.kt +++ /dev/null @@ -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") - } -} - -// 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) -) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/LegacyDescriptorUtils.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/LegacyDescriptorUtils.kt index 4f2ca5ee218..8394531fa79 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/LegacyDescriptorUtils.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/LegacyDescriptorUtils.kt @@ -17,13 +17,13 @@ package org.jetbrains.kotlin.backend.konan.descriptors 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.builtins.functions.FunctionClassDescriptor import org.jetbrains.kotlin.builtins.getFunctionalClassKind import org.jetbrains.kotlin.builtins.isFunctionType import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor +import org.jetbrains.kotlin.builtins.konan.KonanBuiltIns import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.resolve.OverridingUtil import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/injection.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/injection.kt index 055a9e84fa8..6cb5e7cadd6 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/injection.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/injection.kt @@ -24,6 +24,7 @@ import org.jetbrains.kotlin.context.ModuleContext import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.frontend.di.configureModule 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.ResolveSession import org.jetbrains.kotlin.resolve.lazy.declarations.DeclarationProviderFactory diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Ir.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Ir.kt index b85c28abae3..19b8e512828 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Ir.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Ir.kt @@ -131,7 +131,7 @@ internal class KonanSymbols(context: Context, val symbolTable: SymbolTable, val val throwable = symbolTable.referenceClass(builtIns.throwable) val string = symbolTable.referenceClass(builtIns.string) 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 arrayList = symbolTable.referenceClass(getArrayListClassDescriptor(context)) @@ -178,7 +178,7 @@ internal class KonanSymbols(context: Context, val symbolTable: SymbolTable, val NoLookupLocation.FROM_BACKEND ).single()) - val getNativeNullPtr = symbolTable.referenceSimpleFunction(context.builtIns.getNativeNullPtr) + val getNativeNullPtr = symbolTable.referenceSimpleFunction(context.getNativeNullPtr) val boxCachePredicates = BoxCache.values().associate { val name = "in${it.name.toLowerCase().capitalize()}BoxCache" @@ -196,7 +196,7 @@ internal class KonanSymbols(context: Context, val symbolTable: SymbolTable, val ) as ClassDescriptor ) - val immutableBinaryBlobOf = symbolTable.referenceSimpleFunction(context.builtIns.immutableBinaryBlobOf) + val immutableBinaryBlobOf = symbolTable.referenceSimpleFunction(context.immutableBinaryBlobOf) val scheduleImpl = symbolTable.referenceSimpleFunction(context.interopBuiltIns.scheduleImplFunction) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/ContextUtils.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/ContextUtils.kt index 90e38d93401..c233b633478 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/ContextUtils.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/ContextUtils.kt @@ -22,17 +22,15 @@ import kotlinx.cinterop.get import kotlinx.cinterop.memScoped import llvm.* 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.hash.GlobalHash import org.jetbrains.kotlin.backend.konan.irasdescriptors.* import org.jetbrains.kotlin.backend.konan.library.KonanLibraryReader import org.jetbrains.kotlin.backend.konan.library.impl.LibraryReaderImpl import org.jetbrains.kotlin.backend.konan.library.withResolvedDependencies -import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithVisibility -import org.jetbrains.kotlin.descriptors.Visibilities +import org.jetbrains.kotlin.descriptors.konan.CompiledKonanModuleOrigin +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.IrField 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)!! } - internal fun externalFunction(name: String, type: LLVMTypeRef, origin: LlvmSymbolOrigin): LLVMValueRef { + internal fun externalFunction(name: String, type: LLVMTypeRef, origin: CompiledKonanModuleOrigin): LLVMValueRef { this.imports.add(origin) 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) setFunctionNoUnwind(function) return function @@ -332,10 +330,10 @@ internal class Llvm(val context: Context, val llvmModule: LLVMModuleRef) { private val allLibraries = context.librariesWithDependencies.toSet() - override fun add(origin: LlvmSymbolOrigin) { + override fun add(origin: CompiledKonanModuleOrigin) { val reader = when (origin) { - CurrentKonanModule -> return - is DeserializedKonanModule -> origin.reader + CurrentKonanModuleOrigin -> return + is DeserializedKonanModuleOrigin -> origin.reader as KonanLibraryReader } if (reader !in allLibraries) { diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/Imports.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/Imports.kt index 564e3f431ac..4a900fc3b2f 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/Imports.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/Imports.kt @@ -17,24 +17,27 @@ package org.jetbrains.kotlin.backend.konan.llvm 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.konan.CompiledKonanModuleOrigin +import org.jetbrains.kotlin.descriptors.konan.SyntheticModulesOrigin +import org.jetbrains.kotlin.descriptors.konan.konanModuleOrigin import org.jetbrains.kotlin.resolve.descriptorUtil.module internal interface LlvmImports { - fun add(origin: LlvmSymbolOrigin) + fun add(origin: CompiledKonanModuleOrigin) } -internal val DeclarationDescriptor.llvmSymbolOrigin: LlvmSymbolOrigin +internal val DeclarationDescriptor.llvmSymbolOrigin: CompiledKonanModuleOrigin get() { assert(!this.isExpectMember) { this } val module = this.module - val moduleOrigin = module.origin + val moduleOrigin = module.konanModuleOrigin when (moduleOrigin) { - is LlvmSymbolOrigin -> return moduleOrigin - SyntheticModules -> error("Declaration is synthetic and can't be an origin of LLVM symbol:\n${this}") + is CompiledKonanModuleOrigin -> return moduleOrigin + 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 diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt index 32c0c430ca0..3b1b49d1ed9 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.backend.konan.objcexport.ObjCExport import org.jetbrains.kotlin.backend.konan.optimizations.* import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.Modality +import org.jetbrains.kotlin.descriptors.konan.CurrentKonanModuleOrigin import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.SourceManager @@ -1701,7 +1702,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map { + context.immutableBinaryBlobOf -> { @Suppress("UNCHECKED_CAST") val arg = expression.getValueArgument(0) as IrConst return context.llvm.staticData.createImmutableBinaryBlob(arg) @@ -2152,10 +2153,10 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map functionGenerationContext.gep(args[0], args[1]) - context.builtIns.getNativeNullPtr -> kNullInt8Ptr + context.nativePtrPlusLong -> functionGenerationContext.gep(args[0], args[1]) + context.getNativeNullPtr -> kNullInt8Ptr interop.getPointerSize -> Int32(LLVMPointerSize(codegen.llvmTargetData)).llvm - context.builtIns.nativePtrToLong -> { + context.nativePtrToLong -> { val intPtrValue = functionGenerationContext.ptrToInt(args.single(), codegen.intPtrType) val resultType = functionGenerationContext.getLLVMType(function.returnType) @@ -2626,7 +2627,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map") + +fun ModuleDescriptor.isKonanStdlib() = name == STDLIB_MODULE_NAME diff --git a/extracted/konan.descriptors/src/main/kotlin/org/jetbrains/kotlin/descriptors/konan/KonanModuleOrigin.kt b/extracted/konan.descriptors/src/main/kotlin/org/jetbrains/kotlin/descriptors/konan/KonanModuleOrigin.kt new file mode 100644 index 00000000000..05386f1965c --- /dev/null +++ b/extracted/konan.descriptors/src/main/kotlin/org/jetbrains/kotlin/descriptors/konan/KonanModuleOrigin.kt @@ -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") + } +} + +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)!! diff --git a/extracted/konan.descriptors/src/main/kotlin/org/jetbrains/kotlin/descriptors/konan/interop/InteropDescriptors.kt b/extracted/konan.descriptors/src/main/kotlin/org/jetbrains/kotlin/descriptors/konan/interop/InteropDescriptors.kt new file mode 100644 index 00000000000..cb7b12e117a --- /dev/null +++ b/extracted/konan.descriptors/src/main/kotlin/org/jetbrains/kotlin/descriptors/konan/interop/InteropDescriptors.kt @@ -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(""), + 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")) +} diff --git a/extracted/konan.descriptors/src/main/kotlin/org/jetbrains/kotlin/resolve/konan/platform/KonanPlatform.kt b/extracted/konan.descriptors/src/main/kotlin/org/jetbrains/kotlin/resolve/konan/platform/KonanPlatform.kt new file mode 100644 index 00000000000..e2fa5f35859 --- /dev/null +++ b/extracted/konan.descriptors/src/main/kotlin/org/jetbrains/kotlin/resolve/konan/platform/KonanPlatform.kt @@ -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) { + result.add(ImportPath.fromString("konan.*")) + } + + override val multiTargetPlatform = MultiTargetPlatform.Specific(platformName) + override val platformConfigurator: PlatformConfigurator = KonanPlatformConfigurator +} diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanPlatformConfigurator.kt b/extracted/konan.descriptors/src/main/kotlin/org/jetbrains/kotlin/resolve/konan/platform/KonanPlatformConfigurator.kt similarity index 72% rename from backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanPlatformConfigurator.kt rename to extracted/konan.descriptors/src/main/kotlin/org/jetbrains/kotlin/resolve/konan/platform/KonanPlatformConfigurator.kt index 7ff9e95a2bc..ed3e03efd9f 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanPlatformConfigurator.kt +++ b/extracted/konan.descriptors/src/main/kotlin/org/jetbrains/kotlin/resolve/konan/platform/KonanPlatformConfigurator.kt @@ -1,22 +1,4 @@ -/* - * 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 +package org.jetbrains.kotlin.resolve.konan.platform import org.jetbrains.kotlin.builtins.PlatformToKotlinClassMap 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.types.DynamicTypesSettings - object KonanPlatformConfigurator : PlatformConfigurator( DynamicTypesSettings(), additionalDeclarationCheckers = listOf(ExpectedActualDeclarationChecker), diff --git a/extracted/konan.metadata.serializer/build.gradle b/extracted/konan.metadata.serializer/build.gradle new file mode 100644 index 00000000000..39c6f022f94 --- /dev/null +++ b/extracted/konan.metadata.serializer/build.gradle @@ -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" +} diff --git a/extracted/konan.metadata.serializer/settings.gradle b/extracted/konan.metadata.serializer/settings.gradle new file mode 100644 index 00000000000..bc8cffdb99b --- /dev/null +++ b/extracted/konan.metadata.serializer/settings.gradle @@ -0,0 +1 @@ +rootProject.name = "konan.metadata.serializer" diff --git a/extracted/konan.metadata/build.gradle b/extracted/konan.metadata/build.gradle new file mode 100644 index 00000000000..79ab93707f7 --- /dev/null +++ b/extracted/konan.metadata/build.gradle @@ -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" +} diff --git a/extracted/konan.metadata/settings.gradle b/extracted/konan.metadata/settings.gradle new file mode 100644 index 00000000000..0ed665747b8 --- /dev/null +++ b/extracted/konan.metadata/settings.gradle @@ -0,0 +1 @@ +rootProject.name = "konan.metadata" diff --git a/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/main.kt b/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/main.kt index eb5ba558c13..fb82de5b821 100644 --- a/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/main.kt +++ b/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/main.kt @@ -17,7 +17,6 @@ package org.jetbrains.kotlin.cli.klib // 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.UnzippedKonanLibrary 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.LanguageVersionSettingsImpl 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.library.KonanLibrarySearchPathResolver 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 module = reader.moduleDescriptor(versionSpec) val defaultModules = mutableListOf() - if (!module.isStdlib()) { + if (!module.isKonanStdlib()) { val resolver = KonanLibrarySearchPathResolver(emptyList(), target = null, distributionKlib = Distribution().klib, diff --git a/settings.gradle b/settings.gradle index b8dfc6908d7..28126975131 100644 --- a/settings.gradle +++ b/settings.gradle @@ -33,6 +33,9 @@ include ':performance' include ':platformLibs' includeBuild 'shared' +includeBuild 'extracted/konan.descriptors' +includeBuild 'extracted/konan.metadata' +includeBuild 'extracted/konan.metadata.serializer' includeBuild 'tools/kotlin-native-gradle-plugin' if (hasProperty("kotlinProjectPath")) {