From 207141407983d91f286dd0212764af5cad1e4762 Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Wed, 22 Mar 2017 12:53:35 +0300 Subject: [PATCH] Split LINK_STAGE phase into OBJECT_FILES and LINKER sub-phases, to be able to measure lcc/lto time separately from ld time. --- .../kotlin/backend/konan/KonanDriver.kt | 2 +- .../kotlin/backend/konan/KonanPhases.kt | 6 +++-- .../kotlin/backend/konan/LinkStage.kt | 22 ++++++++++++------- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanDriver.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanDriver.kt index 1e3a66f3503..2e29ba55b2d 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanDriver.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanDriver.kt @@ -87,7 +87,7 @@ public fun runTopLevelPhases(konanConfig: KonanConfig, environment: KotlinCoreEn } } - phaser.phase(KonanPhase.LINKER) { + phaser.phase(KonanPhase.LINK_STAGE) { LinkStage(context).linkStage() } } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanPhases.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanPhases.kt index 0e8bba96ee6..5e444a6c586 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanPhases.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanPhases.kt @@ -34,7 +34,9 @@ enum class KonanPhase(val description: String, /* ... ... */ RTTI("RTTI Generation"), /* ... ... */ CODEGEN("Code Generation"), /* ... ... */ METADATOR("Metadata Generation"), - /* */ LINKER("Link Stage"); + /* */ LINK_STAGE("Link stage"), + /* ... */ OBJECT_FILES("Bitcode to object file"), + /* ... */ LINKER("Linker"); val prerequisite = prerequisite.toSet() } @@ -61,7 +63,7 @@ object KonanPhases { verbose?.forEach { phases[known(it)]!!.verbose = true } if (get(NOLINK) ?: false ) { - KonanPhase.LINKER.enabled = false + KonanPhase.LINK_STAGE.enabled = false } }} } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LinkStage.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LinkStage.kt index 26be0890f5d..0ab503bece7 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LinkStage.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LinkStage.kt @@ -262,16 +262,22 @@ internal class LinkStage(val context: Context) { fun linkStage() { context.log("# Compiler root: ${distribution.konanHome}") - val bitcodeFiles = listOf(emitted, distribution.start, distribution.runtime, - distribution.launcher) + libraries + val bitcodeFiles = listOf(emitted, distribution.start, + distribution.runtime, distribution.launcher) + libraries - val objectFiles = if (optimize) { - listOf( llvmLto(bitcodeFiles ) ) - } else { - bitcodeFiles.map{ it -> llvmLlc(it) } + var objectFiles: List = listOf() + + val phaser = PhaseManager(context) + phaser.phase(KonanPhase.OBJECT_FILES) { + objectFiles = if (optimize) { + listOf( llvmLto(bitcodeFiles ) ) + } else { + bitcodeFiles.map{ it -> llvmLlc(it) } + } + } + phaser.phase(KonanPhase.LINKER) { + val executable = link(objectFiles) } - - val executable = link(objectFiles) } }