From 008b8ec0316b74f7d5ec2b42f89340977b229f3e Mon Sep 17 00:00:00 2001 From: Svyatoslav Scherbina Date: Fri, 23 Dec 2016 16:47:58 +0700 Subject: [PATCH] backend: connect lowering with IR generators --- .../kotlin/backend/common/BackendContext.kt | 2 + .../kotlin/backend/common/lower/LowerUtils.kt | 39 +++++++++++++++++++ .../jetbrains/kotlin/backend/konan/Context.kt | 3 ++ .../backend/konan/KonanBackendContext.kt | 2 +- 4 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/common/lower/LowerUtils.kt diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/common/BackendContext.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/common/BackendContext.kt index 3334fbac094..3326ad404ce 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/common/BackendContext.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/common/BackendContext.kt @@ -18,8 +18,10 @@ package org.jetbrains.kotlin.backend.common import org.jetbrains.kotlin.backend.common.descriptors.SharedVariablesManager import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns interface BackendContext { val builtIns: KotlinBuiltIns + val irBuiltIns: IrBuiltIns val sharedVariablesManager: SharedVariablesManager } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/common/lower/LowerUtils.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/common/lower/LowerUtils.kt new file mode 100644 index 00000000000..1a4622b4c9e --- /dev/null +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/common/lower/LowerUtils.kt @@ -0,0 +1,39 @@ +package org.jetbrains.kotlin.backend.common.lower + +import org.jetbrains.kotlin.backend.common.BackendContext +import org.jetbrains.kotlin.descriptors.FunctionDescriptor +import org.jetbrains.kotlin.ir.IrElement +import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET +import org.jetbrains.kotlin.ir.builders.* +import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns +import org.jetbrains.kotlin.ir.expressions.IrExpression +import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin +import org.jetbrains.kotlin.types.KotlinType + +class IrLoweringContext(backendContext: BackendContext) : GeneratorContext { + override val irBuiltIns: IrBuiltIns = backendContext.irBuiltIns +} + +class FunctionIrGenerator(backendContext: BackendContext, functionDescriptor: FunctionDescriptor) : GeneratorWithScope { + override val context = IrLoweringContext(backendContext) + override val scope = Scope(functionDescriptor) +} + +fun BackendContext.createFunctionIrGenerator(functionDescriptor: FunctionDescriptor) = + FunctionIrGenerator(this, functionDescriptor) + +class FunctionIrBuilder(context: IrLoweringContext, scope: Scope, startOffset: Int, endOffset: Int) : + IrBuilderWithScope(context, scope, startOffset, endOffset) + +fun FunctionIrGenerator.createIrBuilder() = FunctionIrBuilder(context, scope, UNDEFINED_OFFSET, UNDEFINED_OFFSET) + +/** + * Builds [IrBlock] to be used instead of given expression. + */ +inline fun FunctionIrGenerator.irBlock(expression: IrExpression, origin: IrStatementOrigin? = null, + resultType: KotlinType? = expression.type, + body: IrBlockBuilder.() -> Unit) = + this.irBlock(expression.startOffset, expression.endOffset, origin, resultType, body) + +inline fun FunctionIrGenerator.irBlockBody(irElement: IrElement, body: IrBlockBodyBuilder.() -> Unit) = + this.irBlockBody(irElement.startOffset, irElement.endOffset, body) \ No newline at end of file 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 231cff7f324..9df44cfbb84 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 @@ -37,6 +37,9 @@ internal final class Context(val config: KonanConfig, lateinit var ir: Ir + override val irBuiltIns + get() = ir.irModule.irBuiltins + var llvmModule: LLVMModuleRef? = null set(module: LLVMModuleRef?) { if (field != null) { 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 0cef8de535d..d28da612e4c 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 @@ -4,7 +4,7 @@ import org.jetbrains.kotlin.backend.common.BackendContext import org.jetbrains.kotlin.backend.konan.descriptors.KonanSharedVariablesManager import org.jetbrains.kotlin.backend.konan.KonanPlatform -open internal class KonanBackendContext : BackendContext { +abstract internal class KonanBackendContext : BackendContext { override val builtIns = KonanPlatform.builtIns override val sharedVariablesManager by lazy {