From 0faee23b1deda3221c7c30914989ea015daa91e0 Mon Sep 17 00:00:00 2001 From: SvyatoslavScherbina Date: Mon, 17 Sep 2018 17:44:42 +0300 Subject: [PATCH] Fix #2069 (#2073) --- .../backend/konan/CodeGenerationInfo.kt | 16 +++++++++++ .../kotlin/backend/konan/llvm/IrToBitcode.kt | 4 +-- .../konan/lower/InitializersLowering.kt | 18 ++++++++++--- .../backend/konan/optimizations/DFGBuilder.kt | 3 +-- .../backend/konan/optimizations/DataFlowIR.kt | 2 +- backend.native/tests/build.gradle | 5 ++++ .../tests/codegen/annotations/annotations0.kt | 27 +++++++++++++++++++ 7 files changed, 67 insertions(+), 8 deletions(-) create mode 100644 backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CodeGenerationInfo.kt create mode 100644 backend.native/tests/codegen/annotations/annotations0.kt diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CodeGenerationInfo.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CodeGenerationInfo.kt new file mode 100644 index 00000000000..51090b2e3cb --- /dev/null +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CodeGenerationInfo.kt @@ -0,0 +1,16 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the LICENSE file. + */ + +package org.jetbrains.kotlin.backend.konan + +import org.jetbrains.kotlin.descriptors.ClassKind +import org.jetbrains.kotlin.ir.declarations.IrClass +import org.jetbrains.kotlin.name.FqName + +internal fun IrClass.isNonGeneratedAnnotation(): Boolean = + this.kind == ClassKind.ANNOTATION_CLASS && + !this.descriptor.annotations.hasAnnotation(serialInfoAnnotationFqName) + +private val serialInfoAnnotationFqName = FqName("kotlinx.serialization.SerialInfo") 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 80930d2bf2c..e25731017c4 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 @@ -758,8 +758,8 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map() .forEach { it.acceptVoid(this) } 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 16c122779cb..e45be171032 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 @@ -7,17 +7,21 @@ 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.common.lower.createIrBuilder +import org.jetbrains.kotlin.backend.common.lower.irBlockBody import org.jetbrains.kotlin.backend.konan.descriptors.synthesizedName +import org.jetbrains.kotlin.backend.konan.isNonGeneratedAnnotation 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 +import org.jetbrains.kotlin.ir.builders.irDelegatingConstructorCall import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol -import org.jetbrains.kotlin.ir.util.addChild +import org.jetbrains.kotlin.ir.util.constructors import org.jetbrains.kotlin.ir.util.createDispatchReceiverParameter import org.jetbrains.kotlin.ir.util.transformFlat import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid @@ -134,8 +138,16 @@ internal class InitializersLowering(val context: CommonBackendContext) : ClassLo } private fun lowerConstructors(initializerMethodSymbol: IrSimpleFunctionSymbol?) { - if (irClass.kind == ClassKind.ANNOTATION_CLASS) - return + if (irClass.kind == ClassKind.ANNOTATION_CLASS) { + if (irClass.isNonGeneratedAnnotation()) return + + val irConstructor = irClass.declarations.filterIsInstance().single() + assert(irConstructor.body == null) + irConstructor.body = context.createIrBuilder(irConstructor.symbol).irBlockBody(irConstructor) { + +irDelegatingConstructorCall(context.irBuiltIns.anyClass.owner.constructors.single()) + +IrInstanceInitializerCallImpl(startOffset, endOffset, irClass.symbol, context.irBuiltIns.unitType) + } + } 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/optimizations/DFGBuilder.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DFGBuilder.kt index 04ebf48316e..00f9a533bc7 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 @@ -17,7 +17,6 @@ import org.jetbrains.kotlin.backend.konan.descriptors.target 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.ir.IrElement import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.declarations.* @@ -201,7 +200,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag override fun visitConstructor(declaration: IrConstructor) { val body = declaration.body - assert (body != null || declaration.constructedClass.kind == ClassKind.ANNOTATION_CLASS) { + assert (body != null || declaration.constructedClass.isNonGeneratedAnnotation()) { "Non-annotation class constructor has empty body" } DEBUG_OUTPUT(0) { 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 83eac5cdf34..f4c7810779f 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 @@ -598,7 +598,7 @@ internal object DataFlowIR { } val bridgeTargetSymbol = if (isSpecialBridge || bridgeTarget == null) null else mapFunction(bridgeTarget) val placeToFunctionsTable = !isAbstract && it !is ConstructorDescriptor && classDescriptor != null - && classDescriptor.kind != ClassKind.ANNOTATION_CLASS + && !classDescriptor.isNonGeneratedAnnotation() && (it.isOverridableOrOverrides || bridgeTarget != null || descriptor.name.asString().contains("