KT-78726: Add a separate PhaseType.IrLinkage for IR Linker
diff --git a/build-common/src/org/jetbrains/kotlin/build/report/compilerPerformanceReporting.kt b/build-common/src/org/jetbrains/kotlin/build/report/compilerPerformanceReporting.kt
index 17d6c47..40a1f4e 100644
--- a/build-common/src/org/jetbrains/kotlin/build/report/compilerPerformanceReporting.kt
+++ b/build-common/src/org/jetbrains/kotlin/build/report/compilerPerformanceReporting.kt
@@ -32,6 +32,7 @@
             PhaseType.IrPreLowering -> GradleBuildTime.IR_PRE_LOWERING
             PhaseType.IrSerialization -> GradleBuildTime.IR_SERIALIZATION
             PhaseType.KlibWriting -> GradleBuildTime.KLIB_WRITING
+            PhaseType.IrLinkage -> GradleBuildTime.IR_LINKAGE
             PhaseType.IrLowering -> {
                 codegenTime += time
                 GradleBuildTime.IR_LOWERING
diff --git a/compiler/build-tools/kotlin-build-statistics/src/org/jetbrains/kotlin/build/report/metrics/BuildTime.kt b/compiler/build-tools/kotlin-build-statistics/src/org/jetbrains/kotlin/build/report/metrics/BuildTime.kt
index e482b6a..16a6a39 100644
--- a/compiler/build-tools/kotlin-build-statistics/src/org/jetbrains/kotlin/build/report/metrics/BuildTime.kt
+++ b/compiler/build-tools/kotlin-build-statistics/src/org/jetbrains/kotlin/build/report/metrics/BuildTime.kt
@@ -125,6 +125,7 @@
                             IR_PRE_LOWERING(COMPILER_PERFORMANCE, "Compiler IR pre-lowering"),
                             IR_SERIALIZATION(COMPILER_PERFORMANCE, "Compiler IR Serialization"),
                             KLIB_WRITING(COMPILER_PERFORMANCE, "Compiler Klib writing"),
+                            IR_LINKAGE(COMPILER_PERFORMANCE, "Compiler IR linkage"),
                             CODE_GENERATION(COMPILER_PERFORMANCE, "Compiler code generation"),
                                 IR_LOWERING(CODE_GENERATION, "Compiler IR lowering"),
                                 BACKEND(CODE_GENERATION, "Compiler backend"),
diff --git a/compiler/fir/modularized-tests/tests/org/jetbrains/kotlin/fir/AbstractFullPipelineModularizedTest.kt b/compiler/fir/modularized-tests/tests/org/jetbrains/kotlin/fir/AbstractFullPipelineModularizedTest.kt
index 3ca65a1..6f1115c 100644
--- a/compiler/fir/modularized-tests/tests/org/jetbrains/kotlin/fir/AbstractFullPipelineModularizedTest.kt
+++ b/compiler/fir/modularized-tests/tests/org/jetbrains/kotlin/fir/AbstractFullPipelineModularizedTest.kt
@@ -344,6 +344,7 @@
                 unitStats.irPreLoweringStats?.millis?.let { put("Pre-lowering", it) }
                 unitStats.irSerializationStats?.millis?.let { put("Serialization", it) }
                 unitStats.klibWritingStats?.millis?.let { put("Klib writing", it) }
+                unitStats.irLinkageStats?.millis?.let { put("IR linker", it) }
                 unitStats.irLoweringStats?.millis?.let { put("Lowering", it) }
                 unitStats.backendStats?.millis?.let { put("Generation", it) }
             }
diff --git a/core/compiler.common/src/org/jetbrains/kotlin/stats/StatsCalculator.kt b/core/compiler.common/src/org/jetbrains/kotlin/stats/StatsCalculator.kt
index 84f3407..f475625 100644
--- a/core/compiler.common/src/org/jetbrains/kotlin/stats/StatsCalculator.kt
+++ b/core/compiler.common/src/org/jetbrains/kotlin/stats/StatsCalculator.kt
@@ -98,6 +98,7 @@
         var irPreLoweringStats: Time = Time.ZERO
         var irSerializationStats: Time = Time.ZERO
         var klibWritingStats: Time = Time.ZERO
+        var irLinkageStats: Time = Time.ZERO
         var irLoweringStats: Time = Time.ZERO
         var backendStats: Time = Time.ZERO
         var findJavaClassStats: SideStats = SideStats.EMPTY
@@ -129,6 +130,7 @@
             irPreLoweringStats += moduleStats.irPreLoweringStats
             irSerializationStats += moduleStats.irSerializationStats
             klibWritingStats += moduleStats.klibWritingStats
+            irLinkageStats += moduleStats.irLinkageStats
             irLoweringStats += moduleStats.irLoweringStats
             backendStats += moduleStats.backendStats
             findJavaClassStats += moduleStats.findJavaClassStats
@@ -161,6 +163,7 @@
                 irPreLoweringStats = irPreLoweringStats.let { if (total) it else it / size },
                 irSerializationStats = irSerializationStats.let { if (total) it else it / size },
                 klibWritingStats = klibWritingStats.let { if (total) it else it / size },
+                irLinkageStats = irLinkageStats.let { if (total) it else it / size },
                 irLoweringStats = irLoweringStats.let { if (total) it else it / size },
                 backendStats = backendStats.let { if (total) it else it / size },
                 findJavaClassStats = findJavaClassStats.let { if (total) it else it / size },
diff --git a/core/compiler.common/src/org/jetbrains/kotlin/util/PerformanceManager.kt b/core/compiler.common/src/org/jetbrains/kotlin/util/PerformanceManager.kt
index 7d114ca..169aace 100644
--- a/core/compiler.common/src/org/jetbrains/kotlin/util/PerformanceManager.kt
+++ b/core/compiler.common/src/org/jetbrains/kotlin/util/PerformanceManager.kt
@@ -80,6 +80,7 @@
         var irPreLoweringTime: Time? = null
         var irSerializationTime: Time? = null
         var klibWritingTime: Time? = null
+        var irLinkageTime: Time? = null
         var irLoweringTime: Time? = null
         var backendTime: Time? = null
 
@@ -91,6 +92,7 @@
                 PhaseType.IrPreLowering -> irPreLoweringTime = time
                 PhaseType.IrSerialization -> irSerializationTime = time
                 PhaseType.KlibWriting -> klibWritingTime = time
+                PhaseType.IrLinkage -> irLinkageTime = time
                 PhaseType.IrLowering -> irLoweringTime = time
                 PhaseType.Backend -> backendTime = time
             }
@@ -120,6 +122,7 @@
             irPreLoweringTime,
             irSerializationTime,
             klibWritingTime,
+            irLinkageTime,
             irLoweringTime,
             backendTime,
             findJavaClassStats,
diff --git a/core/compiler.common/src/org/jetbrains/kotlin/util/UnitStats.kt b/core/compiler.common/src/org/jetbrains/kotlin/util/UnitStats.kt
index 02098a3..b29b25e 100644
--- a/core/compiler.common/src/org/jetbrains/kotlin/util/UnitStats.kt
+++ b/core/compiler.common/src/org/jetbrains/kotlin/util/UnitStats.kt
@@ -46,6 +46,7 @@
     val irPreLoweringStats: Time?,
     val irSerializationStats: Time?,
     val klibWritingStats: Time?,
+    val irLinkageStats: Time?,
     val irLoweringStats: Time?,
     val backendStats: Time?,
 
@@ -69,6 +70,7 @@
                 irPreLoweringStats +
                 irSerializationStats +
                 klibWritingStats +
+                irLinkageStats +
                 irLoweringStats +
                 backendStats +
                 findJavaClassStats?.time +
@@ -105,6 +107,7 @@
     IrPreLowering,
     IrSerialization,
     KlibWriting,
+    IrLinkage,
     IrLowering,
     Backend,
 }
@@ -199,6 +202,7 @@
     action(PhaseType.TranslationToIr, translationToIrStats)
     action(PhaseType.IrPreLowering, irPreLoweringStats)
     action(PhaseType.IrSerialization, irSerializationStats)
+    action(PhaseType.IrLinkage, irLinkageStats)
     action(PhaseType.KlibWriting, klibWritingStats)
     action(PhaseType.IrLowering, irLoweringStats)
     action(PhaseType.Backend, backendStats)
@@ -216,6 +220,7 @@
     PhaseType.IrPreLowering to "IR PRE-LOWERING",
     PhaseType.IrSerialization to "IR SERIALIZATION",
     PhaseType.KlibWriting to "KLIB WRITING",
+    PhaseType.IrLinkage to "IR LINKAGE",
     PhaseType.IrLowering to "IR LOWERING",
     PhaseType.Backend to "BACKEND",
 )
diff --git a/core/compiler.common/src/org/jetbrains/kotlin/util/UnitStatsJsonDumper.kt b/core/compiler.common/src/org/jetbrains/kotlin/util/UnitStatsJsonDumper.kt
index 9bf2ad9..41c128d 100644
--- a/core/compiler.common/src/org/jetbrains/kotlin/util/UnitStatsJsonDumper.kt
+++ b/core/compiler.common/src/org/jetbrains/kotlin/util/UnitStatsJsonDumper.kt
@@ -30,6 +30,7 @@
                     irPreLoweringStats?.let { appendTime(::irPreLoweringStats, it, indent = 1, trailingComma = true) }
                     irSerializationStats?.let { appendTime(::irSerializationStats, it, indent = 1, trailingComma = true) }
                     klibWritingStats?.let { appendTime(::klibWritingStats, it, indent = 1, trailingComma = true) }
+                    irLinkageStats?.let { appendTime(::irLinkageStats, it, indent = 1, trailingComma = true) }
                     irLoweringStats?.let { appendTime(::irLoweringStats, it, indent = 1, trailingComma = true) }
                     backendStats?.let { appendTime(::backendStats, it, indent = 1, trailingComma = true) }
 
diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/NativeCompilerDriver.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/NativeCompilerDriver.kt
index 83e2041..d85c1e5 100644
--- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/NativeCompilerDriver.kt
+++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/NativeCompilerDriver.kt
@@ -62,7 +62,7 @@
     private fun produceObjCFramework(engine: PhaseEngine<PhaseContext>, config: KonanConfig, environment: KotlinCoreEnvironment) {
         val frontendOutput = performanceManager.tryMeasurePhaseTime(PhaseType.Analysis) { engine.runFrontend(config, environment) } ?: return
 
-        val (objCExportedInterface, linkKlibsOutput, objCCodeSpec) = performanceManager.tryMeasurePhaseTime(PhaseType.TranslationToIr) {
+        val (objCExportedInterface, linkKlibsOutput, objCCodeSpec) = performanceManager.tryMeasurePhaseTime(PhaseType.IrLinkage) {
             val objCExportedInterface = engine.runPhase(ProduceObjCExportInterfacePhase, frontendOutput)
             engine.runPhase(CreateObjCFrameworkPhase, CreateObjCFrameworkInput(frontendOutput.moduleDescriptor, objCExportedInterface))
             val (linkKlibsOutput, objCCodeSpec) = engine.linkKlibs(frontendOutput) {
@@ -84,7 +84,7 @@
     private fun produceCLibrary(engine: PhaseEngine<PhaseContext>, config: KonanConfig, environment: KotlinCoreEnvironment) {
         val frontendOutput = performanceManager.tryMeasurePhaseTime(PhaseType.Analysis) { engine.runFrontend(config, environment) } ?: return
 
-        val (linkKlibsOutput, cAdapterElements) = performanceManager.tryMeasurePhaseTime(PhaseType.TranslationToIr) {
+        val (linkKlibsOutput, cAdapterElements) = performanceManager.tryMeasurePhaseTime(PhaseType.IrLinkage) {
             engine.linkKlibs(frontendOutput) {
                 if (config.cInterfaceGenerationMode == CInterfaceGenerationMode.V1) {
                     it.runPhase(BuildCExports, frontendOutput)
@@ -188,7 +188,7 @@
     private fun produceBinary(engine: PhaseEngine<PhaseContext>, config: KonanConfig, environment: KotlinCoreEnvironment) {
         val frontendOutput = performanceManager.tryMeasurePhaseTime(PhaseType.Analysis) { engine.runFrontend(config, environment) } ?: return
 
-        val linkKlibsOutput = performanceManager.tryMeasurePhaseTime(PhaseType.TranslationToIr) { engine.linkKlibs(frontendOutput) }
+        val linkKlibsOutput = performanceManager.tryMeasurePhaseTime(PhaseType.IrLinkage) { engine.linkKlibs(frontendOutput) }
         val backendContext = createBackendContext(config, frontendOutput, linkKlibsOutput)
         engine.runBackend(backendContext, linkKlibsOutput.irModule, performanceManager)
     }
@@ -223,7 +223,7 @@
         require(config.produce == CompilerOutputKind.TEST_BUNDLE)
 
         val frontendOutput = performanceManager.tryMeasurePhaseTime(PhaseType.Analysis) { engine.runFrontend(config, environment) } ?: return
-        val linkKlibsOutput = performanceManager.tryMeasurePhaseTime(PhaseType.TranslationToIr) {
+        val linkKlibsOutput = performanceManager.tryMeasurePhaseTime(PhaseType.IrLinkage) {
             engine.runPhase(CreateTestBundlePhase, frontendOutput)
             engine.linkKlibs(frontendOutput)
         }
diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/internal/compilerRunner/native/KotlinNativeToolRunner.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/internal/compilerRunner/native/KotlinNativeToolRunner.kt
index 9a2eb93..aa02a552 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/internal/compilerRunner/native/KotlinNativeToolRunner.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/internal/compilerRunner/native/KotlinNativeToolRunner.kt
@@ -309,6 +309,7 @@
                     PhaseType.IrPreLowering -> GradleBuildTime.IR_PRE_LOWERING
                     PhaseType.IrSerialization -> GradleBuildTime.IR_SERIALIZATION
                     PhaseType.KlibWriting -> GradleBuildTime.KLIB_WRITING
+                    PhaseType.IrLinkage -> GradleBuildTime.IR_LINKAGE
                     PhaseType.IrLowering -> GradleBuildTime.IR_LOWERING
                     PhaseType.Backend -> GradleBuildTime.BACKEND
                 }
diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/report/UnitStatsSerializationTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/report/UnitStatsSerializationTest.kt
index 94156b0..9ae1d90 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/report/UnitStatsSerializationTest.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/report/UnitStatsSerializationTest.kt
@@ -30,6 +30,7 @@
             irPreLoweringStats = Time(3_500_000L, 3_500_001L, 3_500_002L),
             irSerializationStats = Time(3_600_000L, 3_600_001L, 3_600_002L),
             klibWritingStats = Time(3_700_000L, 3_700_001L, 3_700_002L),
+            irLinkageStats = Time(3_800_000L, 3_800_001L, 3_800_002L),
             irLoweringStats = Time(4_000_000L, 4_000_001L, 4_000_002L),
             backendStats = Time(5_000_000L, 5_000_001L, 5_000_002L),
             findJavaClassStats = SideStats(1, Time(6_000_000L, 6_000_001L, 6_000_002L)),
diff --git a/libraries/tools/stats-analyser/tests/org/jetbrains/kotlin/stats/StatsCalculatorTests.kt b/libraries/tools/stats-analyser/tests/org/jetbrains/kotlin/stats/StatsCalculatorTests.kt
index 2aefb44..03c934b 100644
--- a/libraries/tools/stats-analyser/tests/org/jetbrains/kotlin/stats/StatsCalculatorTests.kt
+++ b/libraries/tools/stats-analyser/tests/org/jetbrains/kotlin/stats/StatsCalculatorTests.kt
@@ -34,6 +34,7 @@
             assertEquals(moduleStats0.translationToIrStats!! + moduleStats1.translationToIrStats + moduleStats2.translationToIrStats, translationToIrStats)
             assertEquals(moduleStats0.irPreLoweringStats!! + moduleStats1.irPreLoweringStats + moduleStats2.irPreLoweringStats, irPreLoweringStats)
             assertEquals(moduleStats0.irSerializationStats!! + moduleStats1.irSerializationStats + moduleStats2.irSerializationStats, irSerializationStats)
+            assertEquals(moduleStats0.irLinkageStats!! + moduleStats1.irLinkageStats + moduleStats2.irLinkageStats, irLinkageStats)
             assertEquals(moduleStats0.klibWritingStats!! + moduleStats1.klibWritingStats + moduleStats2.klibWritingStats, klibWritingStats)
             assertEquals(moduleStats0.irLoweringStats!! + moduleStats1.irLoweringStats + moduleStats2.irLoweringStats, irLoweringStats)
             assertEquals(moduleStats0.backendStats!! + moduleStats1.backendStats + moduleStats2.backendStats, backendStats)
diff --git a/libraries/tools/stats-analyser/tests/org/jetbrains/kotlin/stats/TestData.kt b/libraries/tools/stats-analyser/tests/org/jetbrains/kotlin/stats/TestData.kt
index 8de02f7..12977a4 100644
--- a/libraries/tools/stats-analyser/tests/org/jetbrains/kotlin/stats/TestData.kt
+++ b/libraries/tools/stats-analyser/tests/org/jetbrains/kotlin/stats/TestData.kt
@@ -51,6 +51,7 @@
             irPreLoweringStats = totalTime * 0.01,
             irSerializationStats = totalTime * 0.01,
             klibWritingStats = totalTime * 0.01,
+            irLinkageStats = totalTime * 0.01,
             irLoweringStats = totalTime * 0.01,
             backendStats = totalTime * 0.16,
             findJavaClassStats = SideStats(increment, totalTime * 0.04),