From 3db341213b3a0985adedcfd2aca821aac11004a1 Mon Sep 17 00:00:00 2001 From: Pavel Punegov Date: Tue, 11 Jan 2022 13:33:12 +0300 Subject: [PATCH] [K/N] Synchronize LLVM target initialization Race conditions should be avoided during initialization. See llvm/lib/Support/TargetRegistry.cpp in LLVM repo --- .../backend/konan/OptimizationPipeline.kt | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/OptimizationPipeline.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/OptimizationPipeline.kt index 70387a116a5..5300d1d9667 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/OptimizationPipeline.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/OptimizationPipeline.kt @@ -99,6 +99,23 @@ private class LlvmPipelineConfiguration(context: Context) { DEFAULT(1), AGGRESSIVE(2) } + + companion object { + @Volatile + @JvmStatic + private var isInitialized: Boolean = false + + @Synchronized + @JvmStatic + fun initLLVMTargets() { + if (!isInitialized) { + memScoped { + LLVMKotlinInitializeTargets() + } + isInitialized = true + } + } + } } internal fun runLlvmOptimizationPipeline(context: Context) { @@ -115,9 +132,10 @@ internal fun runLlvmOptimizationPipeline(context: Context) { inline_threshold: ${config.customInlineThreshold ?: "default"} """.trimIndent() } - memScoped { - LLVMKotlinInitializeTargets() + LlvmPipelineConfiguration.initLLVMTargets() + + memScoped { initializeLlvmGlobalPassRegistry() val passBuilder = LLVMPassManagerBuilderCreate() val modulePasses = LLVMCreatePassManager()