Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 173e94a

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

File tree

Expand file treeCollapse file tree

1 file changed

+19
-9
lines changed
Filter options
  • kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm
Expand file treeCollapse file tree

1 file changed

+19
-9
lines changed

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

Copy file name to clipboardExpand all lines: kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt
+19-9Lines changed: 19 additions & 9 deletions
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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.