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