[K/N] Synchronize LLVM target initialization

Race conditions should be avoided during initialization.
See llvm/lib/Support/TargetRegistry.cpp in LLVM repo
This commit is contained in:
Pavel Punegov
2022-01-11 13:33:12 +03:00
committed by Space
parent a22e267b05
commit 3db341213b
@@ -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()