Skip to content

Commit 173e94a

Browse files
SvyatoslavScherbinaSpace Team
authored and
Space Team
committed
Fix CMP-7747
TBD.
1 parent dbed512 commit 173e94a

File tree

1 file changed

+19
-9
lines changed
  • kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm

1 file changed

+19
-9
lines changed

kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt

+19-9
Original file line numberDiff line numberDiff line change
@@ -509,13 +509,25 @@ internal class CodeGeneratorVisitor(
509509
}
510510
}
511511

512-
private fun mergeRuntimeInitializers(
513-
runtimeInitializers: List<RuntimeInitializer>
514-
): RuntimeInitializer = generateRuntimeInitializer {
515-
runtimeInitializers.forEach {
516-
this.call(it.llvmCallable, listOf(param(0), param(1)), exceptionHandler = ExceptionHandler.Caller)
512+
private fun mergeRuntimeInitializers(runtimeInitializers: List<RuntimeInitializer>): RuntimeInitializer? {
513+
if (runtimeInitializers.size <= 1) return runtimeInitializers.singleOrNull()
514+
515+
// It would be natural to generate a single runtime initializer function
516+
// and call all the initializers from it.
517+
// However, right now we can have quite many initializers (see e.g. KT-74774).
518+
// So, this natural solution can lead to generating huge LLVM functions triggering slow compilation.
519+
// Apply a cheap trick -- merge them by chunks recursively.
520+
521+
val chunkInitializers = runtimeInitializers.chunked(100) { chunk ->
522+
generateRuntimeInitializer {
523+
chunk.forEach {
524+
this.call(it.llvmCallable, listOf(param(0), param(1)), exceptionHandler = ExceptionHandler.Caller)
525+
}
526+
ret(null)
527+
}
517528
}
518-
ret(null)
529+
530+
return mergeRuntimeInitializers(chunkInitializers)
519531
}
520532

521533
private fun generateRuntimeInitializer(block: FunctionGenerationContext.() -> Unit): RuntimeInitializer {
@@ -2723,9 +2735,7 @@ internal class CodeGeneratorVisitor(
27232735

27242736
val ctorFunctions = dependencies.flatMap { dependency ->
27252737
val library = dependency?.library
2726-
val initializer = libraryToInitializers.getValue(library)
2727-
.takeIf { it.isNotEmpty() }
2728-
?.let { mergeRuntimeInitializers(it) }
2738+
val initializer = mergeRuntimeInitializers(libraryToInitializers.getValue(library))
27292739
?.let { createInitCtor(createInitNode(it)) }
27302740

27312741
val ctorName = when {

0 commit comments

Comments
 (0)