[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.
This commit is contained in:
Sergey Bogolepov
2023-01-24 16:15:42 +02:00
committed by Space Team
parent c828ac6167
commit 10f9000d46
7 changed files with 75 additions and 10 deletions
@@ -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<Context> {
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
}
@@ -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.*
@@ -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<PsiToIrContext, SpecialBackendChecksInput>(
"SpecialBackendChecks",
@@ -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<Native
internal data class RTTIInput(
val irModule: IrModuleFragment,
val referencedFunctions: Set<IrFunction>?
)
) : KotlinBackendIrHolder {
override val kotlinIr: IrElement
get() = irModule
}
internal val RTTIPhase = createSimpleNamedCompilerPhase<NativeGenerationState, RTTIInput>(
name = "RTTI",
@@ -43,7 +47,10 @@ internal val RTTIPhase = createSimpleNamedCompilerPhase<NativeGenerationState, R
internal data class CodegenInput(
val irModule: IrModuleFragment,
val lifetimes: Map<IrElement, Lifetime>
)
) : KotlinBackendIrHolder {
override val kotlinIr: IrElement
get() = irModule
}
internal val CodegenPhase = createSimpleNamedCompilerPhase<NativeGenerationState, CodegenInput>(
name = "Codegen",
@@ -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<NativeGenerationStat
internal data class DevirtualizationAnalysisInput(
val irModule: IrModuleFragment,
val moduleDFG: ModuleDFG,
)
) : KotlinBackendIrHolder {
override val kotlinIr: IrElement
get() = irModule
}
internal val DevirtualizationAnalysisPhase = createSimpleNamedCompilerPhase<NativeGenerationState, DevirtualizationAnalysisInput, DevirtualizationAnalysis.AnalysisResult>(
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<NativeGenerationState, DCEInput, Set<IrFunction>?>(
name = "DCEPhase",
@@ -81,7 +88,10 @@ internal val DCEPhase = createSimpleNamedCompilerPhase<NativeGenerationState, DC
internal data class DevirtualizationInput(
val irModule: IrModuleFragment,
val devirtualizationAnalysisResult: DevirtualizationAnalysis.AnalysisResult
)
) : KotlinBackendIrHolder {
override val kotlinIr: IrElement
get() = irModule
}
internal val DevirtualizationPhase = createSimpleNamedCompilerPhase(
name = "Devirtualization",
@@ -106,7 +116,10 @@ internal data class EscapeAnalysisInput(
val irModule: IrModuleFragment,
val moduleDFG: ModuleDFG,
val devirtualizationAnalysisResult: DevirtualizationAnalysis.AnalysisResult,
)
) : KotlinBackendIrHolder {
override val kotlinIr: IrElement
get() = irModule
}
internal val EscapeAnalysisPhase = createSimpleNamedCompilerPhase<NativeGenerationState, EscapeAnalysisInput, Map<IrElement, Lifetime>>(
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",
@@ -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<String, IrModuleFragment>,
irModule: IrModuleFragment,
@@ -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<C : CommonBackendContext> {
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
}