diff --git a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt index 17a60736854..96fb0d855f5 100644 --- a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt +++ b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt @@ -20,6 +20,7 @@ import com.intellij.openapi.Disposable import org.jetbrains.annotations.NotNull import org.jetbrains.annotations.Nullable import org.jetbrains.kotlin.backend.konan.* +import org.jetbrains.kotlin.backend.konan.serialization.KonanMetadataVersion import org.jetbrains.kotlin.cli.common.CLICompiler import org.jetbrains.kotlin.cli.common.CLITool import org.jetbrains.kotlin.cli.common.CommonCompilerPerformanceManager @@ -33,11 +34,13 @@ import org.jetbrains.kotlin.konan.KonanVersion import org.jetbrains.kotlin.konan.file.File import org.jetbrains.kotlin.konan.target.CompilerOutputKind import org.jetbrains.kotlin.konan.util.profile +import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.utils.KotlinPaths private class K2NativeCompilerPerformanceManager: CommonCompilerPerformanceManager("Kotlin to Native Compiler") class K2Native : CLICompiler() { + override fun createMetadataVersion(p0: IntArray): BinaryVersion = KonanMetadataVersion(*p0) private val performanceManager by lazy { K2NativeCompilerPerformanceManager() @@ -64,6 +67,12 @@ class K2Native : CLICompiler() { configuration.report(ERROR, "You have not specified any compilation arguments. No output has been produced.") } + /* Set default version of metadata version */ + val metadataVersionString = arguments.metadataVersion + if (metadataVersionString == null) { + configuration.put(CommonConfigurationKeys.METADATA_VERSION, KonanMetadataVersion.INSTANCE) + } + if (konanConfig.linkOnly) { configuration.report(WARNING, "You have not specified any source files. " + "Only libraries will be used to produce the output binary.") diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanDriver.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanDriver.kt index 065e690a4cf..b37ef12a969 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanDriver.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanDriver.kt @@ -24,6 +24,8 @@ import org.jetbrains.kotlin.backend.konan.serialization.KonanSerializationUtil import org.jetbrains.kotlin.backend.konan.serialization.markBackingFields import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment +import org.jetbrains.kotlin.config.CommonConfigurationKeys +import org.jetbrains.kotlin.config.CompilerConfigurationKey import org.jetbrains.kotlin.config.kotlinSourceRoots import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.psi2ir.Psi2IrConfiguration @@ -83,7 +85,7 @@ fun runTopLevelPhases(konanConfig: KonanConfig, environment: KotlinCoreEnvironme } phaser.phase(KonanPhase.SERIALIZER) { markBackingFields(context) - val serializer = KonanSerializationUtil(context) + val serializer = KonanSerializationUtil(context, context.config.configuration.get(CommonConfigurationKeys.METADATA_VERSION)!!) context.serializedLinkData = serializer.serializeModule(context.moduleDescriptor) } 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 index eaa25792491..68492edba14 100644 --- 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 @@ -73,13 +73,11 @@ class KonanBuiltIns(storageManager: StorageManager) : KotlinBuiltIns(storageMana } object KonanPlatform : TargetPlatform("Konan") { - override val multiTargetPlatform = MultiTargetPlatform.Specific(platformName) - override fun getDefaultImports(includeKotlinComparisons: Boolean): List { - return Common.getDefaultImports(includeKotlinComparisons) + listOf( - ImportPath.fromString("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/ir/Ir.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Ir.kt index 0537ad9c259..4a3bc9523a3 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 @@ -17,8 +17,6 @@ package org.jetbrains.kotlin.backend.konan.ir import org.jetbrains.kotlin.backend.common.COROUTINE_SUSPENDED_NAME -import org.jetbrains.kotlin.backend.common.INTERCEPTED_NAME -import org.jetbrains.kotlin.backend.common.SUSPEND_COROUTINE_UNINTERCEPTED_OR_RETURN_NAME import org.jetbrains.kotlin.backend.common.atMostOne import org.jetbrains.kotlin.backend.common.ir.Ir import org.jetbrains.kotlin.backend.common.ir.Symbols @@ -344,14 +342,6 @@ internal class KonanSymbols(context: Context, val symbolTable: SymbolTable): Sym private val coroutinesPackage = context.builtIns.builtInsModule.getPackage( context.config.configuration.languageVersionSettings.coroutinesPackageFqName()).memberScope - val intercepted = coroutinesIntrinsicsPackage - .getContributedFunctions(INTERCEPTED_NAME, NoLookupLocation.FROM_BACKEND) - .single() - - val suspendCoroutineUninterceptedOrReturn = coroutinesIntrinsicsPackage - .getContributedFunctions(SUSPEND_COROUTINE_UNINTERCEPTED_OR_RETURN_NAME, NoLookupLocation.FROM_BACKEND) - .single() - val coroutineContextGetter = coroutinesPackage .getContributedVariables(Name.identifier("coroutineContext"), NoLookupLocation.FROM_BACKEND) .single() diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionInlining.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionInlining.kt index eb5bc8055c4..f92cc371310 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionInlining.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionInlining.kt @@ -99,14 +99,14 @@ internal class FunctionInlining(val context: Context): IrElementTransformerVoidW private fun getFunctionDeclaration(descriptor: FunctionDescriptor): IrFunction? = descriptor.resolveFakeOverride().original.let { - when (it) { - context.ir.symbols.intercepted -> + when { + it.isBuiltInIntercepted(context.config.configuration.languageVersionSettings) -> getFunctionDeclaration(context.ir.symbols.konanIntercepted.descriptor) - context.ir.symbols.suspendCoroutineUninterceptedOrReturn -> + it.isBuiltInSuspendCoroutineUninterceptedOrReturn(context.config.configuration.languageVersionSettings) -> getFunctionDeclaration(context.ir.symbols.konanSuspendCoroutineUninterceptedOrReturn.descriptor) - context.ir.symbols.coroutineContextGetter -> + it == context.ir.symbols.coroutineContextGetter -> getFunctionDeclaration(context.ir.symbols.konanCoroutineContextGetter.descriptor) else -> { diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanClassDataFinder.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanClassDataFinder.kt index e657bbda252..314d1b411f3 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanClassDataFinder.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanClassDataFinder.kt @@ -32,16 +32,14 @@ class KonanClassDataFinder( val proto = fragment.classes val nameList = proto.getClassNameList() - val index = nameList.indexOfFirst({ - nameResolver.getClassId(it) == classId }) - if (index == -1) - error("Could not find serialized class ${classId}") + val index = nameList.indexOfFirst { + nameResolver.getClassId(it) == classId } + if (index == -1) + error("Could not find serialized class $classId") - val foundClass = proto.getClasses(index) - if (foundClass == null) - error("Could not find data for serialized class ${classId}") - - return ClassData(nameResolver, foundClass, SourceElement.NO_SOURCE) + val foundClass = proto.getClasses(index) ?: error("Could not find data for serialized class $classId") + /* TODO: binary version supposed to be read from protobuf. */ + return ClassData(nameResolver, foundClass, KonanMetadataVersion.INSTANCE, SourceElement.NO_SOURCE) } } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanDescriptorSerializer.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanDescriptorSerializer.kt index baface6f0b6..4bd625a5ed7 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanDescriptorSerializer.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanDescriptorSerializer.kt @@ -164,7 +164,7 @@ class KonanDescriptorSerializer private constructor( builder.versionRequirementTable = versionRequirementTableProto } - extension.serializeClass(classDescriptor, builder) + extension.serializeClass(classDescriptor, builder, versionRequirementTable) return builder } @@ -256,7 +256,7 @@ class KonanDescriptorSerializer private constructor( builder.versionRequirement = writeVersionRequirement(LanguageFeature.Coroutines) } - extension.serializeProperty(descriptor, builder) + extension.serializeProperty(descriptor, builder, versionRequirementTable) /* Konan specific chunk */ if (extension is IrAwareExtension) { diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanMetadataVersion.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanMetadataVersion.kt new file mode 100644 index 00000000000..7d85973af59 --- /dev/null +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanMetadataVersion.kt @@ -0,0 +1,32 @@ +package org.jetbrains.kotlin.backend.konan.serialization + +import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion + + +/* + * Copyright 2010-2015 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. + */ + +class KonanMetadataVersion(vararg numbers: Int): BinaryVersion(*numbers){ + override fun isCompatible(): Boolean = this.major == 1 && this.minor == 0 + companion object { + @JvmField + val INSTANCE = KonanMetadataVersion(1, 0, 0) + + @JvmField + val INVALID_VERSION = KonanMetadataVersion() + } + +} \ No newline at end of file diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanPackageFragment.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanPackageFragment.kt index 2b7ec10f8bd..bc2e505881a 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanPackageFragment.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanPackageFragment.kt @@ -61,8 +61,9 @@ class KonanPackageFragment( } private val memberScope_ by lazy { + /* TODO: we fake proto binary versioning for now. */ DeserializedPackageMemberScope(this, proto.getPackage(), - nameResolver, /* containerSource = */ null, + nameResolver, KonanMetadataVersion.INSTANCE,/* containerSource = */ null, components, { loadClassNames() }) } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanSerializationUtil.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanSerializationUtil.kt index 2453919f814..00bdfbab4dd 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanSerializationUtil.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanSerializationUtil.kt @@ -30,6 +30,7 @@ import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.metadata.KonanLinkData import org.jetbrains.kotlin.metadata.KonanLinkData.* import org.jetbrains.kotlin.metadata.ProtoBuf +import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.CompilerDeserializationConfiguration @@ -140,9 +141,9 @@ internal fun deserializeModule(languageVersionSettings: LanguageVersionSettings, /* ------------ Serializer part ------------------------------------------*/ -internal class KonanSerializationUtil(val context: Context) { +internal class KonanSerializationUtil(val context: Context, metadataVersion: BinaryVersion) { - val serializerExtension = KonanSerializerExtension(context) + val serializerExtension = KonanSerializerExtension(context, metadataVersion) val topSerializer = KonanDescriptorSerializer.createTopLevel(serializerExtension) var classSerializer: KonanDescriptorSerializer = topSerializer diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanSerializerExtension.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanSerializerExtension.kt index e08413ab7da..d1c92687f38 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanSerializerExtension.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanSerializerExtension.kt @@ -19,11 +19,13 @@ package org.jetbrains.kotlin.backend.konan.serialization import org.jetbrains.kotlin.backend.konan.Context import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.metadata.* +import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion +import org.jetbrains.kotlin.metadata.serialization.MutableVersionRequirementTable import org.jetbrains.kotlin.protobuf.ExtensionRegistryLite import org.jetbrains.kotlin.serialization.* import org.jetbrains.kotlin.types.KotlinType -internal class KonanSerializerExtension(val context: Context) : +internal class KonanSerializerExtension(val context: Context, override val metadataVersion: BinaryVersion) : KotlinSerializerExtensionBase(KonanSerializerProtocol), IrAwareExtension { val inlineDescriptorTable = DescriptorTable(context.irBuiltIns) @@ -59,9 +61,9 @@ internal class KonanSerializerExtension(val context: Context) : super.serializeConstructor(descriptor, proto) } - override fun serializeClass(descriptor: ClassDescriptor, proto: ProtoBuf.Class.Builder) { + override fun serializeClass(descriptor: ClassDescriptor, proto: ProtoBuf.Class.Builder, versionRequirementTable: MutableVersionRequirementTable) { - super.serializeClass(descriptor, proto) + super.serializeClass(descriptor, proto, versionRequirementTable) } override fun serializeFunction(descriptor: FunctionDescriptor, proto: ProtoBuf.Function.Builder) { @@ -69,7 +71,7 @@ internal class KonanSerializerExtension(val context: Context) : super.serializeFunction(descriptor, proto) } - override fun serializeProperty(descriptor: PropertyDescriptor, proto: ProtoBuf.Property.Builder) { + override fun serializeProperty(descriptor: PropertyDescriptor, proto: ProtoBuf.Property.Builder, versionRequirementTable: MutableVersionRequirementTable) { val variable = originalVariables[descriptor] if (variable != null) { proto.setExtension(KonanLinkData.usedAsVariable, true) @@ -78,7 +80,7 @@ internal class KonanSerializerExtension(val context: Context) : proto.setExtension(KonanLinkData.hasBackingField, context.ir.propertiesWithBackingFields.contains(descriptor)) - super.serializeProperty(descriptor, proto) + super.serializeProperty(descriptor, proto, versionRequirementTable) } override fun addFunctionIR(proto: ProtoBuf.Function.Builder, serializedIR: String) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/LocalDeclarationDeserializer.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/LocalDeclarationDeserializer.kt index eb636d5bc11..9a150c5ce1e 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/LocalDeclarationDeserializer.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/LocalDeclarationDeserializer.kt @@ -22,13 +22,10 @@ import org.jetbrains.kotlin.backend.common.push import org.jetbrains.kotlin.backend.konan.descriptors.allContainingDeclarations import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor -import org.jetbrains.kotlin.metadata.deserialization.Flags import org.jetbrains.kotlin.metadata.KonanIr import org.jetbrains.kotlin.metadata.KonanLinkData import org.jetbrains.kotlin.metadata.ProtoBuf -import org.jetbrains.kotlin.metadata.deserialization.NameResolverImpl -import org.jetbrains.kotlin.metadata.deserialization.TypeTable -import org.jetbrains.kotlin.metadata.deserialization.VersionRequirementTable +import org.jetbrains.kotlin.metadata.deserialization.* import org.jetbrains.kotlin.serialization.deserialization.* import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor @@ -74,8 +71,9 @@ class LocalDeclarationDeserializer(val rootDescriptor: DeclarationDescriptor) { fun newContext(descriptor: DeclarationDescriptor): DeserializationContext { if (descriptor is KonanPackageFragment) { val packageTypeTable = TypeTable(pkg.proto.getPackage().typeTable) + /* TODO: Check metadata version usege here. */ return components.createContext( - pkg, nameResolver, packageTypeTable, VersionRequirementTable.EMPTY, null) + pkg, nameResolver, packageTypeTable, VersionRequirementTable.EMPTY, KonanMetadataVersion.INSTANCE, null) } // Only packages and classes have their type tables. @@ -105,7 +103,8 @@ class LocalDeclarationDeserializer(val rootDescriptor: DeclarationDescriptor) { fun deserializeInlineType(type: ProtoBuf.Type) = typeDeserializer.type(type) fun deserializeClass(irProto: KonanIr.KotlinDescriptor): ClassDescriptor { - return DeserializedClassDescriptor(parentContext, irProto.irLocalDeclaration.descriptor.clazz, nameResolver, SourceElement.NO_SOURCE) + /* TODO: metadata version should be fixed. */ + return DeserializedClassDescriptor(parentContext, irProto.irLocalDeclaration.descriptor.clazz, nameResolver, KonanMetadataVersion.INSTANCE, SourceElement.NO_SOURCE) } diff --git a/gradle.properties b/gradle.properties index 11d7f1b1970..25ead93d3ec 100644 --- a/gradle.properties +++ b/gradle.properties @@ -20,8 +20,8 @@ remoteRoot=konan_tests #kotlinCompilerModule=org.jetbrains.kotlin:kotlin-compiler:1.1-SNAPSHOT # Download artifacts of https://teamcity.jetbrains.com/viewType.html?buildTypeId=Kotlin_120_Compiler testDataVersion=1226829:id -kotlinCompilerRepo=https://teamcity.jetbrains.com/guestAuth/app/rest/builds/buildType:(id:Kotlin_dev_CompilerAllPlugins),number:1.2.70-dev-402,tag:kotlin-native,pinned:true/artifacts/content/maven -kotlinVersion=1.2.70-dev-402 +kotlinCompilerRepo=https://teamcity.jetbrains.com/guestAuth/app/rest/builds/buildType:(id:Kotlin_dev_CompilerAllPlugins),number:1.2.70-dev-616,tag:kotlin-native,pinned:true/artifacts/content/maven +kotlinVersion=1.2.70-dev-616 konanVersion=0.9 org.gradle.jvmargs='-Dfile.encoding=UTF-8'