[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:
committed by
Space Team
parent
c828ac6167
commit
10f9000d46
+5
-1
@@ -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
|
||||
}
|
||||
+1
@@ -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.*
|
||||
|
||||
+6
-1
@@ -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",
|
||||
|
||||
+9
-2
@@ -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",
|
||||
|
||||
+21
-5
@@ -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",
|
||||
|
||||
+7
-1
@@ -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,
|
||||
|
||||
+26
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user