From 5bf51318ebf3d8d17c2bd1dbd23bcf1c2963b8eb Mon Sep 17 00:00:00 2001 From: Vladimir Sukharev Date: Mon, 29 May 2023 10:38:28 +0000 Subject: [PATCH] [K2/N] Exit compilation on errors at first stage ^KT-56855 Merge-request: KT-MR-10344 Merged-by: Vladimir Sukharev --- .../src/org/jetbrains/kotlin/cli/bc/K2Native.kt | 14 +++++++++----- .../jetbrains/kotlin/backend/konan/FirFrontend.kt | 2 +- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt b/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt index dd42172edd5..21b60dd2ac7 100644 --- a/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt +++ b/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt @@ -34,7 +34,8 @@ import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.util.profile import org.jetbrains.kotlin.utils.KotlinPaths -import java.nio.file.Files +import java.util.* + private class K2NativeCompilerPerformanceManager: CommonCompilerPerformanceManager("Kotlin to Native Compiler") @@ -82,9 +83,11 @@ class K2Native : CLICompiler() { // For the first stage, use "-p library" produce mode firstStageConfiguration.put(KonanConfigKeys.PRODUCE, CompilerOutputKind.LIBRARY) // For the first stage, construct a temporary file name for an intermediate KLib - val originalOutput = firstStageConfiguration.get(KonanConfigKeys.OUTPUT) - val intermediateKLib = Files.createTempFile(File(originalOutput ?: "intermediate").name, ".klib").toString() - firstStageConfiguration.put(KonanConfigKeys.OUTPUT, intermediateKLib) + val intermediateKLib = File(System.getProperty("java.io.tmpdir"), "${UUID.randomUUID()}.klib").also { + require(!it.exists) { "Collision writing intermediate KLib $it"} + it.deleteOnExit() + } + firstStageConfiguration.put(KonanConfigKeys.OUTPUT, intermediateKLib.absolutePath) val firstStageExitCode = executeStage(firstStageConfiguration, arguments, rootDisposable) if (firstStageExitCode != ExitCode.OK) @@ -93,7 +96,8 @@ class K2Native : CLICompiler() { // For the second stage, remove already compiled source files from the configuration configuration.put(CLIConfigurationKeys.CONTENT_ROOTS, listOf()) // For the second stage, provide just compiled intermediate KLib as "-Xinclude=" param - configuration.put(KonanConfigKeys.INCLUDED_LIBRARIES, listOf(intermediateKLib)) + require(intermediateKLib.exists) { "Intermediate KLib $intermediateKLib must have been created by successful first compilation stage" } + configuration.put(KonanConfigKeys.INCLUDED_LIBRARIES, listOf(intermediateKLib.absolutePath)) // Now, `configuration` param is prepared for the second stage of compilation, and `arguments` param does not need changes, as noted above. } return executeStage(configuration, arguments, rootDisposable) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/FirFrontend.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/FirFrontend.kt index 99916f5957a..6f54f48dca9 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/FirFrontend.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/FirFrontend.kt @@ -85,7 +85,7 @@ internal inline fun PhaseContext.firFrontend( return if (syntaxErrors || diagnosticsReporter.hasErrors) { FirDiagnosticsCompilerResultsReporter.reportToMessageCollector(diagnosticsReporter, messageCollector, renderDiagnosticNames) - FirOutput.ShouldNotGenerateCode + throw KonanCompilationException("Compilation failed: there were frontend errors") } else { FirOutput.Full(FirResult(outputs)) }