From ef44a0dd7bac836047751d6505dc27c363ca52ae Mon Sep 17 00:00:00 2001 From: Vasily Levchenko Date: Sat, 28 Apr 2018 19:00:40 +0300 Subject: [PATCH] [kotlin compiler][update] 1.2.50-dev-1070 --- .../jetbrains/kotlin/backend/konan/Context.kt | 4 +++ .../konan/EnumSpecialDescriptorsFactory.kt | 3 +- .../KonanBuiltInClassDescriptorFactory.kt | 3 +- .../kotlin/backend/konan/ObjCInterop.kt | 19 ++++++------ .../konan/descriptors/DescriptorUtils.kt | 3 +- .../konan/descriptors/InteropDescriptors.kt | 3 +- .../kotlin/backend/konan/ir/KonanIr.kt | 2 ++ .../konan/irasdescriptors/FakeIrUtils.kt | 11 +++++-- .../konan/irasdescriptors/NewIrUtils.kt | 4 ++- .../backend/konan/llvm/BinaryInterface.kt | 29 +++++++++---------- .../kotlin/backend/konan/llvm/IrToBitcode.kt | 2 +- .../llvm/KotlinObjCClassInfoGenerator.kt | 4 +-- .../backend/konan/llvm/RTTIGenerator.kt | 2 +- .../konan/lower/CallableReferenceLowering.kt | 4 ++- .../lower/DeepCopyIrTreeWithDescriptors.kt | 4 ++- .../backend/konan/lower/EnumClassLowering.kt | 3 +- .../konan/lower/InitializersLowering.kt | 7 ++--- .../konan/lower/SuspendFunctionsLowering.kt | 4 ++- .../backend/konan/lower/TestProcessor.kt | 4 ++- .../backend/konan/optimizations/DFGBuilder.kt | 19 ++++++++++-- .../backend/konan/optimizations/DataFlowIR.kt | 4 +-- .../konan/serialization/CapturedTypes.kt | 4 ++- .../KonanDescriptorSerializer.kt | 7 +++-- .../konan/serialization/KonanStringTable.kt | 7 +++++ .../LocalDeclarationDeserializer.kt | 2 +- gradle.properties | 6 ++-- 26 files changed, 107 insertions(+), 57 deletions(-) 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 160ea51bf2f..586d8d893b7 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 @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.backend.common.validateIrModule import org.jetbrains.kotlin.backend.jvm.descriptors.initialize import org.jetbrains.kotlin.backend.konan.descriptors.* import org.jetbrains.kotlin.backend.common.DumpIrTreeWithDescriptorsVisitor +import org.jetbrains.kotlin.backend.common.descriptors.DescriptorsFactory import org.jetbrains.kotlin.backend.konan.ir.KonanIr import org.jetbrains.kotlin.backend.konan.library.KonanLibraryWriter import org.jetbrains.kotlin.backend.konan.library.LinkData @@ -168,6 +169,9 @@ internal class SpecialDeclarationsFactory(val context: Context) { } internal class Context(config: KonanConfig) : KonanBackendContext(config) { + override val descriptorsFactory: DescriptorsFactory + get() = TODO("not implemented") + override fun getClass(fqName: FqName): ClassDescriptor { TODO("not implemented") } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/EnumSpecialDescriptorsFactory.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/EnumSpecialDescriptorsFactory.kt index cb17e0b35c6..d38033ea632 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/EnumSpecialDescriptorsFactory.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/EnumSpecialDescriptorsFactory.kt @@ -30,6 +30,7 @@ import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitClassReceiver +import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.types.TypeProjectionImpl import org.jetbrains.kotlin.types.TypeSubstitutor import org.jetbrains.kotlin.types.Variance @@ -53,7 +54,7 @@ internal class EnumSpecialDeclarationsFactory(val context: Context) { val endOffset = enumClassDescriptor.endOffsetOrUndefined val implObjectDescriptor = ClassDescriptorImpl(enumClassDescriptor, "OBJECT".synthesizedName, Modality.FINAL, - ClassKind.OBJECT, listOf(context.builtIns.anyType), SourceElement.NO_SOURCE, false) + ClassKind.OBJECT, listOf(context.builtIns.anyType), SourceElement.NO_SOURCE, false, LockBasedStorageManager.NO_LOCKS) val valuesProperty = createEnumValuesField(enumClassDescriptor, implObjectDescriptor) val valuesField = IrFieldImpl(startOffset, endOffset, DECLARATION_ORIGIN_ENUM, valuesProperty) 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 index 36955b7f1db..e210655da00 100644 --- 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 @@ -25,6 +25,7 @@ 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 @@ -47,7 +48,7 @@ class KonanBuiltInClassDescriptorFactory( ClassDescriptorImpl( computeContainingDeclaration(moduleDescriptor), CLONEABLE_NAME, Modality.ABSTRACT, ClassKind.INTERFACE, listOf(moduleDescriptor.builtIns.anyType), - SourceElement.NO_SOURCE, /* isExternal = */ false + SourceElement.NO_SOURCE, /* isExternal = */ false, LockBasedStorageManager.NO_LOCKS ).apply { initialize(CloneableClassScope(storageManager, this), emptySet(), null) } 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 0ecc57e53c1..be8cb82539f 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,11 +18,12 @@ 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.annotations -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.backend.konan.irasdescriptors.* 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.incremental.components.NoLookupLocation import org.jetbrains.kotlin.ir.declarations.IrConstructor import org.jetbrains.kotlin.ir.declarations.IrFunction @@ -128,9 +129,9 @@ fun FunctionDescriptor.getObjCMethodInfo(): ObjCMethodInfo? = this.getObjCMethod fun IrFunction.isObjCBridgeBased(): Boolean { assert(this.isReal) - return this.annotations.hasAnnotation(objCMethodFqName) || - this.annotations.hasAnnotation(objCFactoryFqName) || - this.annotations.hasAnnotation(objCConstructorFqName) + return this.descriptor.annotations.hasAnnotation(objCMethodFqName) || + this.descriptor.annotations.hasAnnotation(objCFactoryFqName) || + this.descriptor.annotations.hasAnnotation(objCConstructorFqName) } /** @@ -208,10 +209,10 @@ fun ConstructorDescriptor.getObjCInitMethod(): FunctionDescriptor? { } } -fun IrConstructor.isObjCConstructor(): Boolean = this.annotations.hasAnnotation(objCConstructorFqName) +fun IrConstructor.isObjCConstructor(): Boolean = this.descriptor.annotations.hasAnnotation(objCConstructorFqName) fun IrConstructor.getObjCInitMethod(): IrSimpleFunction? { - return this.annotations.findAnnotation(objCConstructorFqName)?.let { + return this.descriptor.annotations.findAnnotation(objCConstructorFqName)?.let { val initSelector = it.getStringValue("initSelector") this.constructedClass.declarations.asSequence() .filterIsInstance() diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/DescriptorUtils.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/DescriptorUtils.kt index 0a148dc945b..cd0e0c73975 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/DescriptorUtils.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/DescriptorUtils.kt @@ -88,8 +88,9 @@ internal fun IrSimpleFunction.resolveFakeOverride(): IrSimpleFunction { private val intrinsicAnnotation = FqName("konan.internal.Intrinsic") +// TODO: don't forget to remove descriptor access here. internal val FunctionDescriptor.isIntrinsic: Boolean - get() = this.annotations.hasAnnotation(intrinsicAnnotation) + get() = this.descriptor.annotations.hasAnnotation(intrinsicAnnotation) private val intrinsicTypes = setOf( "kotlin.Boolean", "kotlin.Char", 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 91de17b04ef..92c69733cce 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 @@ -30,6 +30,7 @@ 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 @@ -125,7 +126,7 @@ private class ForwardDeclarationsPackageFragmentDescriptor( return ClassDescriptorImpl( this@ForwardDeclarationsPackageFragmentDescriptor, name, Modality.FINAL, classKind, - listOf(supertype), SourceElement.NO_SOURCE, false + listOf(supertype), SourceElement.NO_SOURCE, false, LockBasedStorageManager.NO_LOCKS ).apply { this.initialize(MemberScope.Empty, emptySet(), null) } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/KonanIr.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/KonanIr.kt index 706156dadaf..74afc2e4f48 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/KonanIr.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/KonanIr.kt @@ -107,6 +107,8 @@ class IrFileImpl(entry: SourceManager.FileEntry) : IrFile { //-------------------------------------------------------------------------// + override val annotations: MutableList + get() = TODO("not implemented") override val fqName: FqName get() = TODO("not implemented") override val fileAnnotations: MutableList diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/irasdescriptors/FakeIrUtils.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/irasdescriptors/FakeIrUtils.kt index 5caa0c7e848..f44f1671727 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/irasdescriptors/FakeIrUtils.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/irasdescriptors/FakeIrUtils.kt @@ -18,11 +18,17 @@ package org.jetbrains.kotlin.backend.konan.irasdescriptors import org.jetbrains.kotlin.backend.konan.* import org.jetbrains.kotlin.backend.konan.llvm.llvmSymbolOrigin +import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.idea.MainFunctionDetector +import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.* -import org.jetbrains.kotlin.ir.expressions.IrCatch -import org.jetbrains.kotlin.ir.expressions.IrTypeOperatorCall +import org.jetbrains.kotlin.ir.expressions.* +import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.DescriptorUtils +import org.jetbrains.kotlin.resolve.constants.* +import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.resolve.descriptorUtil.module // This file contains some IR utilities which actually use descriptors. @@ -58,3 +64,4 @@ internal fun IrTypeOperatorCall.getTypeOperandClass(context: Context): IrClass? internal fun IrCatch.getCatchParameterTypeClass(context: Context): IrClass? = context.ir.getClass(this.catchParameter.type) + diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/irasdescriptors/NewIrUtils.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/irasdescriptors/NewIrUtils.kt index 6a0dd6be888..7d42cf681e5 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/irasdescriptors/NewIrUtils.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/irasdescriptors/NewIrUtils.kt @@ -28,10 +28,12 @@ import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.impl.IrFieldImpl +import org.jetbrains.kotlin.ir.expressions.IrConst import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression import org.jetbrains.kotlin.ir.expressions.getTypeArgumentOrDefault import org.jetbrains.kotlin.ir.util.SymbolTable +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 @@ -218,7 +220,7 @@ fun IrModuleFragment.referenceAllTypeExternalClassifiers(symbolTable: SymbolTabl override fun visitDeclaration(declaration: IrDeclaration) { super.visitDeclaration(declaration) - declaration.annotations.getAllAnnotations().forEach { + declaration.descriptor.annotations.getAllAnnotations().forEach { handleClassReferences(it.annotation) } } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryInterface.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryInterface.kt index 444e4669b2c..1f1f52209e1 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryInterface.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryInterface.kt @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.descriptors.PropertyAccessorDescriptor import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor import org.jetbrains.kotlin.ir.declarations.* +import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.resolve.constants.StringValue import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe @@ -48,26 +49,26 @@ import org.jetbrains.kotlin.utils.addToStdlib.ifNotEmpty */ internal tailrec fun DeclarationDescriptor.isExported(): Boolean { // TODO: revise - - if (this.annotations.findAnnotation(symbolNameAnnotation) != null) { + val descriptorAnnotations = this.descriptor.annotations + if (descriptorAnnotations.hasAnnotation(symbolNameAnnotation)) { // Treat any `@SymbolName` declaration as exported. return true } - if (this.annotations.findAnnotation(exportForCppRuntimeAnnotation) != null) { + if (descriptorAnnotations.hasAnnotation(exportForCppRuntimeAnnotation)) { // Treat any `@ExportForCppRuntime` declaration as exported. return true } - if (this.annotations.findAnnotation(cnameAnnotation) != null) { + if (descriptorAnnotations.hasAnnotation(cnameAnnotation)) { // Treat `@CName` declaration as exported. return true } - if (this.annotations.hasAnnotation(exportForCompilerAnnotation)) { + if (descriptorAnnotations.hasAnnotation(exportForCompilerAnnotation)) { return true } - if (this.annotations.hasAnnotation(publishedApiAnnotation)){ + if (descriptorAnnotations.hasAnnotation(publishedApiAnnotation)){ return true } - if (this.annotations.hasAnnotation(inlineExposedAnnotation)){ + if (descriptorAnnotations.hasAnnotation(inlineExposedAnnotation)){ return true } @@ -202,16 +203,14 @@ internal val FunctionDescriptor.symbolName: String if (!this.isExported()) { throw AssertionError(this.descriptor.toString()) } - - this.annotations.findAnnotation(symbolNameAnnotation)?.let { + this.descriptor.annotations.findAnnotation(symbolNameAnnotation)?.let { if (this.isExternal) { return getStringValue(it)!! } else { // ignore; TODO: report compile error } } - - this.annotations.findAnnotation(exportForCppRuntimeAnnotation)?.let { + this.descriptor.annotations.findAnnotation(exportForCppRuntimeAnnotation)?.let { val name = getStringValue(it) ?: this.name.asString() return name // no wrapping currently required } @@ -234,12 +233,10 @@ internal val IrField.symbolName: String } private fun getStringValue(annotation: AnnotationDescriptor): String? { - annotation.allValueArguments.values.ifNotEmpty { - val stringValue = this.single() as StringValue - return stringValue.value + return annotation.allValueArguments.values.ifNotEmpty { + val stringValue = single() as? StringValue + stringValue?.value } - - return null } // TODO: bring here dependencies of this method? 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 cfae7cc5b3c..9b8f60dcf55 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 @@ -2316,7 +2316,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map() .mapNotNull { val annotation = - it.annotations.findAnnotation(context.interopBuiltIns.objCMethodImp.fqNameSafe) ?: + it.descriptor.annotations.findAnnotation(context.interopBuiltIns.objCMethodImp.fqNameSafe) ?: return@mapNotNull null ObjCMethodDesc( diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/RTTIGenerator.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/RTTIGenerator.kt index 157cdbf1588..243ede26140 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/RTTIGenerator.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/RTTIGenerator.kt @@ -87,7 +87,7 @@ internal class RTTIGenerator(override val context: Context) : ContextUtils { } private fun exportTypeInfoIfRequired(classDesc: ClassDescriptor, typeInfoGlobal: LLVMValueRef?) { - val annot = classDesc.annotations.findAnnotation(FqName("konan.ExportTypeInfo")) + val annot = classDesc.descriptor.annotations.findAnnotation(FqName("konan.ExportTypeInfo")) if (annot != null) { val nameValue = annot.allValueArguments.values.single() as StringValue // TODO: use LLVMAddAlias? diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/CallableReferenceLowering.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/CallableReferenceLowering.kt index ac228deb7a0..4b8012063ca 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/CallableReferenceLowering.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/CallableReferenceLowering.kt @@ -57,6 +57,7 @@ import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.scopes.MemberScope +import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.TypeUtils @@ -208,7 +209,8 @@ internal class CallableReferenceLowering(val context: Context): FileLoweringPass /* kind = */ ClassKind.CLASS, /* superTypes = */ superTypes, /* source = */ SourceElement.NO_SOURCE, - /* isExternal = */ false + /* isExternal = */ false, + /* storageManager = */ LockBasedStorageManager.NO_LOCKS ) { override fun getVisibility() = Visibilities.PRIVATE } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/DeepCopyIrTreeWithDescriptors.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/DeepCopyIrTreeWithDescriptors.kt index 32eaf579f58..01821075111 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/DeepCopyIrTreeWithDescriptors.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/DeepCopyIrTreeWithDescriptors.kt @@ -40,6 +40,7 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassOrAny import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperInterfaces +import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.TypeSubstitutor import org.jetbrains.kotlin.types.TypeUtils @@ -221,7 +222,8 @@ internal class DeepCopyIrTreeWithDescriptors(val targetDescriptor: FunctionDescr /* kind = */ oldDescriptor.kind, /* supertypes = */ listOf(newSuperClass.defaultType) + newInterfaces.map { it.defaultType }, /* source = */ oldDescriptor.source, - /* isExternal = */ oldDescriptor.isExternal + /* isExternal = */ oldDescriptor.isExternal, + /* storageManager = */ LockBasedStorageManager.NO_LOCKS ) { override fun getVisibility() = visibility } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/EnumClassLowering.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/EnumClassLowering.kt index 115beba9f88..59801d912e0 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/EnumClassLowering.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/EnumClassLowering.kt @@ -46,6 +46,7 @@ import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.descriptorUtil.module import org.jetbrains.kotlin.resolve.scopes.MemberScope +import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.types.TypeProjectionImpl import org.jetbrains.kotlin.types.TypeSubstitutor import org.jetbrains.kotlin.types.Variance @@ -252,7 +253,7 @@ internal class EnumClassLowering(val context: Context) : ClassLoweringPass { val endOffset = irClass.endOffset val descriptor = irClass.descriptor val defaultClassDescriptor = ClassDescriptorImpl(descriptor, "DEFAULT".synthesizedName, Modality.FINAL, - ClassKind.CLASS, listOf(descriptor.defaultType), SourceElement.NO_SOURCE, false) + ClassKind.CLASS, listOf(descriptor.defaultType), SourceElement.NO_SOURCE, false, LockBasedStorageManager.NO_LOCKS) val defaultClass = IrClassImpl(startOffset, endOffset, IrDeclarationOrigin.DEFINED, defaultClassDescriptor) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InitializersLowering.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InitializersLowering.kt index a3ff4698bb3..23418049ae4 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InitializersLowering.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InitializersLowering.kt @@ -19,10 +19,7 @@ package org.jetbrains.kotlin.backend.konan.lower import org.jetbrains.kotlin.backend.common.ClassLoweringPass import org.jetbrains.kotlin.backend.common.CommonBackendContext import org.jetbrains.kotlin.backend.konan.descriptors.synthesizedName -import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor -import org.jetbrains.kotlin.descriptors.Modality -import org.jetbrains.kotlin.descriptors.SourceElement -import org.jetbrains.kotlin.descriptors.Visibilities +import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl import org.jetbrains.kotlin.ir.IrStatement @@ -138,6 +135,8 @@ internal class InitializersLowering(val context: CommonBackendContext) : ClassLo } private fun lowerConstructors(initializerMethodSymbol: IrSimpleFunctionSymbol?) { + if (irClass.kind == ClassKind.ANNOTATION_CLASS) + return irClass.transformChildrenVoid(object : IrElementTransformerVoid() { override fun visitClass(declaration: IrClass): IrStatement { diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/SuspendFunctionsLowering.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/SuspendFunctionsLowering.kt index db248e8a384..a96e0b7fe98 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/SuspendFunctionsLowering.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/SuspendFunctionsLowering.kt @@ -56,6 +56,7 @@ import org.jetbrains.kotlin.ir.visitors.* import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.scopes.MemberScope +import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.typeUtil.isUnit import org.jetbrains.kotlin.types.typeUtil.makeNotNullable @@ -331,7 +332,8 @@ internal class SuspendFunctionsLowering(val context: Context): DeclarationContai /* kind = */ ClassKind.CLASS, /* superTypes = */ superTypes, /* source = */ SourceElement.NO_SOURCE, - /* isExternal = */ false + /* isExternal = */ false, + /* storageManager = */ LockBasedStorageManager.NO_LOCKS ) coroutineClass = IrClassImpl( startOffset = irFunction.startOffset, diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/TestProcessor.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/TestProcessor.kt index 44cf45e7af7..0cf0bdc66a0 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/TestProcessor.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/TestProcessor.kt @@ -53,6 +53,7 @@ import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe +import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.types.KotlinType internal class TestProcessor (val context: KonanBackendContext) { @@ -531,7 +532,8 @@ internal class TestProcessor (val context: KonanBackendContext) { /* kind = */ ClassKind.CLASS, /* superTypes = */ listOf(superType), /* source = */ SourceElement.NO_SOURCE, - /* isExternal = */ false + /* isExternal = */ false, + /* storageManager = */ LockBasedStorageManager.NO_LOCKS ) ) } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DFGBuilder.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DFGBuilder.kt index 2395a280e6d..e1d4a201164 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DFGBuilder.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DFGBuilder.kt @@ -30,12 +30,15 @@ import org.jetbrains.kotlin.backend.konan.ir.IrSuspensionPoint import org.jetbrains.kotlin.backend.konan.irasdescriptors.* import org.jetbrains.kotlin.backend.konan.llvm.functionName import org.jetbrains.kotlin.backend.konan.llvm.localHash +import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET +import org.jetbrains.kotlin.ir.backend.js.utils.constructedClass import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.* +import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol import org.jetbrains.kotlin.ir.util.getArguments import org.jetbrains.kotlin.ir.util.simpleFunctions import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid @@ -231,6 +234,18 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag element.acceptChildrenVoid(this) } + override fun visitConstructor(declaration: IrConstructor) { + val body = declaration.body + assert (body != null || declaration.symbol.constructedClass.kind == ClassKind.ANNOTATION_CLASS) { + "Non-annotation class constructor has empty body" + } + DEBUG_OUTPUT(0) { + println("Analysing function ${declaration.descriptor}") + println("IR: ${ir2stringWhole(declaration)}") + } + analyze(declaration, body) + } + override fun visitFunction(declaration: IrFunction) { declaration.body?.let { DEBUG_OUTPUT(0) { @@ -251,10 +266,10 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag } } - private fun analyze(descriptor: DeclarationDescriptor, body: IrElement) { + private fun analyze(descriptor: DeclarationDescriptor, body: IrElement?) { // Find all interesting expressions, variables and functions. val visitor = ElementFinderVisitor() - body.acceptVoid(visitor) + body?.acceptVoid(visitor) DEBUG_OUTPUT(0) { println("FIRST PHASE") diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DataFlowIR.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DataFlowIR.kt index dac836c23d8..4aa3bd58b73 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DataFlowIR.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DataFlowIR.kt @@ -522,8 +522,8 @@ internal object DataFlowIR { val name = if (it.isExported()) it.symbolName else it.internalName val numberOfParameters = it.allParameters.size + if (it.isSuspend) 1 else 0 if (it.module != irModule.descriptor || it.isExternal || (it.origin == IrDeclarationOrigin.IR_BUILTINS_STUB)) { - val escapesAnnotation = it.annotations.findAnnotation(FQ_NAME_ESCAPES) - val pointsToAnnotation = it.annotations.findAnnotation(FQ_NAME_POINTS_TO) + val escapesAnnotation = it.descriptor.annotations.findAnnotation(FQ_NAME_ESCAPES) + val pointsToAnnotation = it.descriptor.annotations.findAnnotation(FQ_NAME_POINTS_TO) @Suppress("UNCHECKED_CAST") val escapesBitMask = (escapesAnnotation?.allValueArguments?.get(escapesWhoDescriptor.name) as? ConstantValue)?.value @Suppress("UNCHECKED_CAST") diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/CapturedTypes.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/CapturedTypes.kt index da46a70a188..0771bb901ab 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/CapturedTypes.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/CapturedTypes.kt @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.name.* import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.resolve.calls.inference.* +import org.jetbrains.kotlin.storage.LockBasedStorageManager private val konanInternalPackageName = FqName("konan.internal") private val fakeCapturedTypeClassName = Name.identifier("FAKE_CAPTURED_TYPE_CLASS") @@ -36,7 +37,8 @@ internal fun createFakeClass(packageName: FqName, className: Name) /* isInner = */ false, /* isExternal = */ false, className, - SourceElement.NO_SOURCE + SourceElement.NO_SOURCE, + LockBasedStorageManager.NO_LOCKS ) // We do the trick similar to FAKE_CONTINUATION_CLASS_DESCRIPTOR. 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 97b4aad8eab..baface6f0b6 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 @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.serialization import org.jetbrains.kotlin.backend.common.onlyIf import org.jetbrains.kotlin.backend.konan.descriptors.needsSerializedIr import org.jetbrains.kotlin.backend.konan.serialization.IrAwareExtension +import org.jetbrains.kotlin.backend.konan.serialization.KonanStringTable import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.isSuspendFunctionType import org.jetbrains.kotlin.builtins.transformSuspendFunctionToRuntimeFunctionType @@ -27,6 +28,7 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.Annotated import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.deserialization.Flags +import org.jetbrains.kotlin.metadata.deserialization.VersionRequirement import org.jetbrains.kotlin.metadata.serialization.Interner import org.jetbrains.kotlin.metadata.serialization.MutableTypeTable import org.jetbrains.kotlin.metadata.serialization.MutableVersionRequirementTable @@ -44,7 +46,6 @@ import org.jetbrains.kotlin.resolve.constants.IntValue import org.jetbrains.kotlin.resolve.constants.NullValue import org.jetbrains.kotlin.resolve.constants.StringValue import org.jetbrains.kotlin.serialization.deserialization.ProtoEnumFlags -import org.jetbrains.kotlin.serialization.deserialization.descriptors.VersionRequirement import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.typeUtil.contains import org.jetbrains.kotlin.metadata.serialization.* @@ -540,7 +541,7 @@ class KonanDescriptorSerializer private constructor( } if (type.isSuspendFunctionType) { - val functionType = type(transformSuspendFunctionToRuntimeFunctionType(type)) + val functionType = type(transformSuspendFunctionToRuntimeFunctionType(type, extension.releaseCoroutines())) functionType.flags = Flags.getTypeFlags(true) return functionType } @@ -773,7 +774,7 @@ class KonanDescriptorSerializer private constructor( @JvmStatic fun serialize(message: MessageLite, stringTable: StringTable): ByteArray { return ByteArrayOutputStream().apply { - stringTable.serializeTo(this) + (stringTable as KonanStringTable).serializeTo(this) message.writeTo(this) }.toByteArray() } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanStringTable.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanStringTable.kt index d0c91ef19d0..8bed61e7f29 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanStringTable.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanStringTable.kt @@ -24,6 +24,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.classId import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.resolve.descriptorUtil.getAllSuperClassifiers import org.jetbrains.kotlin.resolve.descriptorUtil.module +import java.io.OutputStream class KonanStringTable : StringTableImpl() { @@ -54,4 +55,10 @@ class KonanStringTable : StringTableImpl() { super.getLocalClassIdReplacement(descriptor) } } + + fun serializeTo(output: OutputStream) { + val (strings, qualifiedNames) = buildProto() + strings.writeDelimitedTo(output) + qualifiedNames.writeDelimitedTo(output) + } } 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 e04af466d01..eb636d5bc11 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 @@ -28,9 +28,9 @@ 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.serialization.deserialization.* import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor -import org.jetbrains.kotlin.serialization.deserialization.descriptors.VersionRequirementTable // This class knows how to construct contexts for // MemberDeserializer to deserialize descriptors declared in IR. diff --git a/gradle.properties b/gradle.properties index 4e8762868bd..1468cda53ac 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,13 +15,13 @@ # # A version of the Kotlin "toolchain" (compiler, runtime, stdlib etc) used by the build script. -buildKotlinVersion=1.2.40 +buildKotlinVersion=1.2.41 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.50-dev-515,tag:kotlin-native,pinned:true/artifacts/content/maven -kotlinVersion=1.2.50-dev-515 +kotlinCompilerRepo=https://teamcity.jetbrains.com/guestAuth/app/rest/builds/buildType:(id:Kotlin_dev_CompilerAllPlugins),number:1.2.50-dev-1070,tag:kotlin-native,pinned:true/artifacts/content/maven +kotlinVersion=1.2.50-dev-1070 konanVersion=0.7 org.gradle.jvmargs='-Dfile.encoding=UTF-8'