From 1ffef21ce50a959cc438fd57e1874e5e28ad8186 Mon Sep 17 00:00:00 2001 From: Sergey Bogolepov Date: Tue, 24 Jan 2023 14:28:40 +0200 Subject: [PATCH] [K/N] Untie WriteBitcodeFilePhase from NativeGenerationState --- .../kotlin/backend/konan/CompilerOutput.kt | 6 +++--- .../backend/konan/driver/phases/Bitcode.kt | 21 +++++++++---------- .../konan/driver/phases/TopLevelPhases.kt | 6 ++++-- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CompilerOutput.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CompilerOutput.kt index bb6f72bddd7..2c09f7c61f1 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CompilerOutput.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CompilerOutput.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.backend.common.phaser.ActionState import org.jetbrains.kotlin.backend.common.phaser.BeforeOrAfter import org.jetbrains.kotlin.backend.common.serialization.KlibIrVersion import org.jetbrains.kotlin.backend.konan.cexport.produceCAdapterBitcode +import org.jetbrains.kotlin.backend.konan.driver.PhaseContext import org.jetbrains.kotlin.backend.konan.llvm.* import org.jetbrains.kotlin.backend.konan.llvm.objc.patchObjCRuntimeModule import org.jetbrains.kotlin.backend.konan.objcexport.createObjCFramework @@ -172,12 +173,11 @@ private fun linkAllDependencies(generationState: NativeGenerationState, generate } } -internal fun insertAliasToEntryPoint(generationState: NativeGenerationState) { - val config = generationState.config +internal fun insertAliasToEntryPoint(context: PhaseContext, module: LLVMModuleRef) { + val config = context.config val nomain = config.configuration.get(KonanConfigKeys.NOMAIN) ?: false if (config.produce != CompilerOutputKind.PROGRAM || nomain) return - val module = generationState.llvm.module val entryPointName = config.entryPointName val entryPoint = LLVMGetNamedFunction(module, entryPointName) ?: error("Module doesn't contain `$entryPointName`") diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/Bitcode.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/Bitcode.kt index 0035bc73685..682dd30e56f 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/Bitcode.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/Bitcode.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.backend.konan.llvm.coverage.runCoveragePass import org.jetbrains.kotlin.backend.konan.llvm.verifyModule import org.jetbrains.kotlin.backend.konan.optimizations.RemoveRedundantSafepointsPass import org.jetbrains.kotlin.backend.konan.optimizations.removeMultipleThreadDataLoads +import java.io.File private val nativeLLVMDumper = fun(actionState: ActionState, _: Unit, context: NativeGenerationState) { @@ -29,23 +30,21 @@ private val nativeLLVMDumper = private val llvmPhaseActions: Set> = setOf(nativeLLVMDumper) +internal data class WriteBitcodeFileInput( + val llvmModule: LLVMModuleRef, + val outputFile: File, +) + /** * Write in-memory LLVM module to filesystem as a bitcode. - * - * TODO: Use explicit input (LLVMModule) and output (File) - * after static driver removal. */ - -internal val WriteBitcodeFilePhase = createSimpleNamedCompilerPhase( +internal val WriteBitcodeFilePhase = createSimpleNamedCompilerPhase( "WriteBitcodeFile", "Write bitcode file", - outputIfNotEnabled = { _, _, _, _ -> error("WriteBitcodeFile be disabled") } -) { context, llvmModule -> - val output = context.tempFiles.nativeBinaryFileName +) { context, (llvmModule, outputFile) -> // Insert `_main` after pipeline, so we won't worry about optimizations corrupting entry point. - insertAliasToEntryPoint(context) - LLVMWriteBitcodeToFile(llvmModule, output) - output + insertAliasToEntryPoint(context, llvmModule) + LLVMWriteBitcodeToFile(llvmModule, outputFile.canonicalPath) } internal val CheckExternalCallsPhase = createSimpleNamedCompilerPhase( diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/TopLevelPhases.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/TopLevelPhases.kt index ab916fd0f11..6ec1bc2ed18 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/TopLevelPhases.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/TopLevelPhases.kt @@ -19,6 +19,7 @@ import org.jetbrains.kotlin.ir.declarations.path import org.jetbrains.kotlin.ir.util.hasAnnotation import org.jetbrains.kotlin.konan.TempFiles import org.jetbrains.kotlin.konan.target.CompilerOutputKind +import org.jetbrains.kotlin.library.impl.javaFile internal fun PhaseEngine.runFrontend(config: KonanConfig, environment: KotlinCoreEnvironment): FrontendPhaseOutput.Full? { val frontendOutput = useContext(FrontendContextImpl(config)) { it.runPhase(FrontendPhase, environment) } @@ -136,13 +137,14 @@ internal fun PhaseEngine.compileModule(module: IrModuleFr if (context.config.produce.isCache) { runPhase(SaveAdditionalCacheInfoPhase) } - val bitcodeFile = runPhase(WriteBitcodeFilePhase, context.llvm.module) + val bitcodeFile = context.tempFiles.nativeBinaryFile.javaFile() + runPhase(WriteBitcodeFilePhase, WriteBitcodeFileInput(context.llvm.module, bitcodeFile)) val dependenciesTrackingResult = DependenciesTrackingResult( context.dependenciesTracker.bitcodeToLink, context.dependenciesTracker.allNativeDependencies, context.dependenciesTracker.allCachedBitcodeDependencies, ) - return ModuleCompilationOutput(bitcodeFile, dependenciesTrackingResult, context.tempFiles, context.outputFiles) + return ModuleCompilationOutput(bitcodeFile.canonicalPath, dependenciesTrackingResult, context.tempFiles, context.outputFiles) } internal fun PhaseEngine.compileAndLink(