From 10f9000d4615a6119f76199cfd912d5c93d463a0 Mon Sep 17 00:00:00 2001 From: Sergey Bogolepov Date: Tue, 24 Jan 2023 16:15:42 +0200 Subject: [PATCH] [K/N] Add utility adapter interfaces for flexible phase processing In the new dynamic driver we have various contexts, inputs and outputs. To make it possible to validate and dump IR uniformly, we need a couple of adapter interfaces that will be accessed from phase actions. --- .../backend/konan/NativeGenerationState.kt | 6 ++++- .../kotlin/backend/konan/driver/Machinery.kt | 1 + .../konan/driver/phases/BackendPhases.kt | 7 ++++- .../konan/driver/phases/BitcodeGeneration.kt | 11 ++++++-- .../kotlin/backend/konan/driver/phases/LTO.kt | 26 +++++++++++++++---- .../backend/konan/driver/phases/PsiToIr.kt | 8 +++++- .../driver/utilities/IrPassesUtilities.kt | 26 +++++++++++++++++++ 7 files changed, 75 insertions(+), 10 deletions(-) create mode 100644 kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/utilities/IrPassesUtilities.kt diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/NativeGenerationState.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/NativeGenerationState.kt index 8dbd436e836..7981343f97f 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/NativeGenerationState.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/NativeGenerationState.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.backend.konan import llvm.* import org.jetbrains.kotlin.backend.konan.driver.BasicPhaseContext +import org.jetbrains.kotlin.backend.konan.driver.utilities.BackendContextHolder import org.jetbrains.kotlin.backend.konan.llvm.* import org.jetbrains.kotlin.backend.konan.llvm.coverage.CoverageManager import org.jetbrains.kotlin.backend.konan.objcexport.ObjCExport @@ -43,7 +44,7 @@ internal class NativeGenerationState( // It will reduce code coupling and make it easier to create NativeGenerationState instances. val context: Context, val cacheDeserializationStrategy: CacheDeserializationStrategy? -) : BasicPhaseContext(config) { +) : BasicPhaseContext(config), BackendContextHolder { private val outputPath = config.cacheSupport.tryGetImplicitOutput(cacheDeserializationStrategy) ?: config.outputPath val outputFiles = OutputFiles(outputPath, config.target, config.produce) val tempFiles = run { @@ -123,4 +124,7 @@ internal class NativeGenerationState( isDisposed = true } + + override val backendContext: Context + get() = context } \ No newline at end of file diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/Machinery.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/Machinery.kt index 80223c29bf1..90612ec56b4 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/Machinery.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/Machinery.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.backend.konan.driver +import org.jetbrains.kotlin.backend.common.CommonBackendContext import org.jetbrains.kotlin.backend.common.ErrorReportingContext import org.jetbrains.kotlin.backend.common.LoggingContext import org.jetbrains.kotlin.backend.common.phaser.* diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/BackendPhases.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/BackendPhases.kt index 6fe580acaf0..795dfb5b430 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/BackendPhases.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/BackendPhases.kt @@ -10,11 +10,13 @@ import org.jetbrains.kotlin.backend.konan.InteropBuiltIns import org.jetbrains.kotlin.backend.konan.NativeGenerationState import org.jetbrains.kotlin.backend.konan.driver.PhaseContext import org.jetbrains.kotlin.backend.konan.driver.PhaseEngine +import org.jetbrains.kotlin.backend.konan.driver.utilities.KotlinBackendIrHolder import org.jetbrains.kotlin.backend.konan.ir.KonanSymbols import org.jetbrains.kotlin.backend.konan.lower.ExpectToActualDefaultValueCopier import org.jetbrains.kotlin.backend.konan.lower.SpecialBackendChecksTraversal import org.jetbrains.kotlin.builtins.konan.KonanBuiltIns import org.jetbrains.kotlin.backend.konan.makeEntryPoint +import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.util.NaiveSourceBasedFileEntryImpl @@ -26,7 +28,10 @@ import org.jetbrains.kotlin.name.FqName internal data class SpecialBackendChecksInput( val irModule: IrModuleFragment, val symbols: KonanSymbols, -) +) : KotlinBackendIrHolder { + override val kotlinIr: IrElement + get() = irModule +} internal val SpecialBackendChecksPhase = createSimpleNamedCompilerPhase( "SpecialBackendChecks", diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/BitcodeGeneration.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/BitcodeGeneration.kt index 223b31f3a27..96ce1c29838 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/BitcodeGeneration.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/BitcodeGeneration.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.backend.konan.driver.phases import llvm.DIFinalize import org.jetbrains.kotlin.backend.konan.NativeGenerationState +import org.jetbrains.kotlin.backend.konan.driver.utilities.KotlinBackendIrHolder import org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor import org.jetbrains.kotlin.backend.konan.llvm.Lifetime import org.jetbrains.kotlin.backend.konan.llvm.RTTIGeneratorVisitor @@ -28,7 +29,10 @@ internal val CreateLLVMDeclarationsPhase = createSimpleNamedCompilerPhase? -) +) : KotlinBackendIrHolder { + override val kotlinIr: IrElement + get() = irModule +} internal val RTTIPhase = createSimpleNamedCompilerPhase( name = "RTTI", @@ -43,7 +47,10 @@ internal val RTTIPhase = createSimpleNamedCompilerPhase -) +) : KotlinBackendIrHolder { + override val kotlinIr: IrElement + get() = irModule +} internal val CodegenPhase = createSimpleNamedCompilerPhase( name = "Codegen", diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/LTO.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/LTO.kt index e2b0752d0e1..4a8fe57c554 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/LTO.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/LTO.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.backend.konan.driver.phases import org.jetbrains.kotlin.backend.common.phaser.ActionState import org.jetbrains.kotlin.backend.konan.NativeGenerationState import org.jetbrains.kotlin.backend.konan.descriptors.GlobalHierarchyAnalysis +import org.jetbrains.kotlin.backend.konan.driver.utilities.KotlinBackendIrHolder import org.jetbrains.kotlin.backend.konan.llvm.Lifetime import org.jetbrains.kotlin.backend.konan.optimizations.* import org.jetbrains.kotlin.backend.konan.optimizations.DevirtualizationAnalysis @@ -44,7 +45,10 @@ internal val BuildDFGPhase = createSimpleNamedCompilerPhase( name = "DevirtualizationAnalysis", @@ -66,7 +70,10 @@ internal data class DCEInput( val irModule: IrModuleFragment, val moduleDFG: ModuleDFG, val devirtualizationAnalysisResult: DevirtualizationAnalysis.AnalysisResult, -) +) : KotlinBackendIrHolder { + override val kotlinIr: IrElement + get() = irModule +} internal val DCEPhase = createSimpleNamedCompilerPhase?>( name = "DCEPhase", @@ -81,7 +88,10 @@ internal val DCEPhase = createSimpleNamedCompilerPhase>( name = "EscapeAnalysis", @@ -147,7 +160,10 @@ internal data class RedundantCallsInput( val moduleDFG: ModuleDFG, val devirtualizationAnalysisResult: DevirtualizationAnalysis.AnalysisResult, val irModule: IrModuleFragment, -) +) : KotlinBackendIrHolder { + override val kotlinIr: IrElement + get() = irModule +} internal val RemoveRedundantCallsToStaticInitializersPhase = createSimpleNamedCompilerPhase( name = "RemoveRedundantCallsToStaticInitializersPhase", diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/PsiToIr.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/PsiToIr.kt index ffe1f53e4a2..3997c594abf 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/PsiToIr.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/PsiToIr.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.backend.konan.KonanConfig import org.jetbrains.kotlin.backend.konan.KonanReflectionTypes import org.jetbrains.kotlin.backend.konan.driver.BasicPhaseContext import org.jetbrains.kotlin.backend.konan.driver.PhaseContext +import org.jetbrains.kotlin.backend.konan.driver.utilities.KotlinBackendIrHolder import org.jetbrains.kotlin.backend.konan.ir.KonanSymbols import org.jetbrains.kotlin.backend.konan.psiToIr import org.jetbrains.kotlin.backend.konan.serialization.KonanIdSignaturer @@ -19,6 +20,7 @@ import org.jetbrains.kotlin.builtins.konan.KonanBuiltIns import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor +import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl import org.jetbrains.kotlin.ir.symbols.IrSymbol @@ -36,7 +38,11 @@ data class PsiToIrInput( internal sealed class PsiToIrOutput( val irModule: IrModuleFragment, val symbols: KonanSymbols, -) { +) : KotlinBackendIrHolder { + + override val kotlinIr: IrElement + get() = irModule + class ForBackend( val irModules: Map, irModule: IrModuleFragment, diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/utilities/IrPassesUtilities.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/utilities/IrPassesUtilities.kt new file mode 100644 index 00000000000..65f4a1749f7 --- /dev/null +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/utilities/IrPassesUtilities.kt @@ -0,0 +1,26 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.backend.konan.driver.utilities + +import org.jetbrains.kotlin.backend.common.CommonBackendContext +import org.jetbrains.kotlin.ir.IrElement + + +/** + * Adapter interface that can be implemented to enabled to access + * IR facilities during phase pre- and postprocessing. + */ +interface BackendContextHolder { + val backendContext: C +} + +/** + * Adapter interface that can be implemented by phase context, input or output + * to enable IR validation, dumping and possibly other pre- and postprocessing. + */ +interface KotlinBackendIrHolder { + val kotlinIr: IrElement +} \ No newline at end of file