From 23ac87f626d33ab7748b831ad6636e189d6618fa Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Mon, 31 Aug 2020 19:22:21 +0500 Subject: [PATCH] [IR] Supported IrExpressionBody --- .../kotlin/backend/konan/llvm/IrToBitcode.kt | 2 +- .../backend/konan/lower/BridgesBuilding.kt | 7 +++---- .../konan/lower/ReturnsInsertionLowering.kt | 17 ++++++++++++----- 3 files changed, 16 insertions(+), 10 deletions(-) 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 21954ae2927..73da41f9216 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 @@ -732,7 +732,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map body.statements.forEach { generateStatement(it) } - is IrExpressionBody -> generateStatement(body.expression) + is IrExpressionBody -> error("IrExpressionBody should've been lowered") is IrSyntheticBody -> throw AssertionError("Synthetic body ${body.kind} has not been lowered") else -> TODO(ir2string(body)) } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BridgesBuilding.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BridgesBuilding.kt index ede5e103ab2..3970d534a30 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BridgesBuilding.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BridgesBuilding.kt @@ -24,7 +24,6 @@ import org.jetbrains.kotlin.ir.descriptors.WrappedValueParameterDescriptor import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.symbols.IrClassSymbol -import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl @@ -149,8 +148,8 @@ internal class BridgesBuilding(val context: Context) : ClassLoweringPass { override fun visitFunction(declaration: IrFunction): IrStatement { declaration.transformChildrenVoid(this) - val body = declaration.body as? IrBlockBody - ?: return declaration + val body = declaration.body ?: return declaration + val descriptor = declaration.descriptor val typeSafeBarrierDescription = BuiltinMethodsWithSpecialGenericSignature.getDefaultValueForOverriddenBuiltinFunction(descriptor) if (typeSafeBarrierDescription == null || builtBridges.contains(declaration)) @@ -159,7 +158,7 @@ internal class BridgesBuilding(val context: Context) : ClassLoweringPass { val irBuilder = context.createIrBuilder(declaration.symbol, declaration.startOffset, declaration.endOffset) declaration.body = irBuilder.irBlockBody(declaration) { buildTypeSafeBarrier(declaration, declaration, typeSafeBarrierDescription) - body.statements.forEach { +it } + (body as IrBlockBody).statements.forEach { +it } } return declaration } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/ReturnsInsertionLowering.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/ReturnsInsertionLowering.kt index 0fd0d495405..35d443b3576 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/ReturnsInsertionLowering.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/ReturnsInsertionLowering.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.ir.declarations.IrConstructor import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.expressions.* +import org.jetbrains.kotlin.ir.expressions.impl.IrBlockBodyImpl import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptVoid @@ -31,11 +32,17 @@ internal class ReturnsInsertionLowering(val context: Context) : FileLoweringPass override fun visitFunction(declaration: IrFunction) { declaration.acceptChildrenVoid(this) - val body = declaration.body ?: return - if (declaration is IrConstructor || declaration.returnType == context.irBuiltIns.unitType) { - val irBuilder = context.createIrBuilder(declaration.symbol, declaration.endOffset, declaration.endOffset) - irBuilder.run { - (body as IrBlockBody).statements += irReturn(irGetObject(symbols.unit)) + context.createIrBuilder(declaration.symbol, declaration.endOffset, declaration.endOffset).run { + when (val body = declaration.body) { + is IrExpressionBody -> { + declaration.body = IrBlockBodyImpl(body.startOffset, body.endOffset) { + statements += irReturn(body.expression) + } + } + is IrBlockBody -> { + if (declaration is IrConstructor || declaration.returnType == context.irBuiltIns.unitType) + body.statements += irReturn(irGetObject(symbols.unit)) + } } } }