From 1ec88ff560399f16ab180d9baf970872bc20434b Mon Sep 17 00:00:00 2001 From: Alexander Korepanov Date: Mon, 23 Jan 2023 13:12:49 +0100 Subject: [PATCH] [JS IR] Enable IR dump for IC invalidation tests Support 'fd.kotlin.js.debugMode' property in IC invalidation tests. --- .../jetbrains/kotlin/cli/js/K2JsIrCompiler.kt | 1 + .../kotlin/ir/backend/js/compilerWithIC.kt | 8 +++-- .../kotlin/ir/backend/js/ic/CacheUpdater.kt | 2 ++ js/js.tests/build.gradle.kts | 36 +++++++++++-------- .../incremental/AbstractInvalidationTest.kt | 16 +++++++++ .../js/test/ir/AbstractJsKLibABITestCase.kt | 2 +- 6 files changed, 47 insertions(+), 18 deletions(-) diff --git a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt index 146e7a9a3d3..f5cf9f7c6e3 100644 --- a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt +++ b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt @@ -682,6 +682,7 @@ class K2JsIrCompiler : CLICompiler() { mainModule, cfg, arguments.granularity, + PhaseConfig(jsPhases), es6mode = arguments.useEsClasses ) } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compilerWithIC.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compilerWithIC.kt index 68bf591c57f..51b1d0cfadd 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compilerWithIC.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compilerWithIC.kt @@ -26,6 +26,7 @@ class JsIrCompilerWithIC( private val mainModule: IrModuleFragment, configuration: CompilerConfiguration, granularity: JsGenerationGranularity, + private val phaseConfig: PhaseConfig, exportedDeclarations: Set = emptySet(), es6mode: Boolean = false ) : JsIrCompilerICInterface { @@ -64,7 +65,7 @@ class JsIrCompilerWithIC( generateJsTests(context, mainModule) - lowerPreservingTags(allModules, context, PhaseConfig(jsPhases), context.irFactory.stageController as WholeWorldStageController) + lowerPreservingTags(allModules, context, phaseConfig, context.irFactory.stageController as WholeWorldStageController) val transformer = IrModuleToJsTransformer(context, mainArguments) return transformer.makeIrFragmentsGenerators(dirtyFiles, allModules) @@ -72,7 +73,10 @@ class JsIrCompilerWithIC( } fun lowerPreservingTags( - modules: Iterable, context: JsIrBackendContext, phaseConfig: PhaseConfig, controller: WholeWorldStageController + modules: Iterable, + context: JsIrBackendContext, + phaseConfig: PhaseConfig, + controller: WholeWorldStageController ) { // Lower all the things controller.currentStage = 0 diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/CacheUpdater.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/CacheUpdater.kt index 604656260f4..da6e13020ad 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/CacheUpdater.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/CacheUpdater.kt @@ -4,6 +4,7 @@ package org.jetbrains.kotlin.ir.backend.js.ic +import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig import org.jetbrains.kotlin.backend.common.serialization.cityHash64 import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.ir.backend.js.* @@ -758,6 +759,7 @@ fun rebuildCacheForDirtyFiles( currentIrModule, configuration, JsGenerationGranularity.PER_MODULE, + PhaseConfig(jsPhases), exportedDeclarations, es6mode ) diff --git a/js/js.tests/build.gradle.kts b/js/js.tests/build.gradle.kts index a699a744683..2c2cbe0df90 100644 --- a/js/js.tests/build.gradle.kts +++ b/js/js.tests/build.gradle.kts @@ -346,6 +346,23 @@ fun Test.setUpJsBoxTests(jsEnabled: Boolean, jsIrEnabled: Boolean, firEnabled: B setUpBoxTests() } +fun Test.forwardProperties() { + val rootLocalProperties = Properties().apply { + rootProject.file("local.properties").takeIf { it.isFile }?.inputStream()?.use { + load(it) + } + } + + val allProperties = properties + rootLocalProperties + + val prefixForPropertiesToForward = "fd." + for ((key, value) in allProperties) { + if (key is String && key.startsWith(prefixForPropertiesToForward)) { + systemProperty(key.substring(prefixForPropertiesToForward.length), value!!) + } + } +} + fun Test.setUpBoxTests() { workingDir = rootDir dependsOn(antLauncherJar) @@ -362,20 +379,7 @@ fun Test.setUpBoxTests() { .forUseAtConfigurationTime().orNull ?: "false" ) - val rootLocalProperties = Properties().apply { - rootProject.file("local.properties").takeIf { it.isFile }?.inputStream()?.use { - load(it) - } - } - - val allProperties = properties + rootLocalProperties - - val prefixForPropertiesToForward = "fd." - for ((key, value) in allProperties) { - if (key is String && key.startsWith(prefixForPropertiesToForward)) { - systemProperty(key.substring(prefixForPropertiesToForward.length), value!!) - } - } + forwardProperties() } val test = projectTest(parallel = true, jUnitMode = JUnitMode.JUnit5, maxHeapSizeMb = 4096) { @@ -507,8 +511,10 @@ projectTest("invalidationTest", jUnitMode = JUnitMode.JUnit4) { systemProperty("kotlin.js.stdlib.klib.path", "libraries/stdlib/js-ir/build/libs/kotlin-stdlib-js-ir-js-$version.klib") systemProperty("kotlin.js.test.root.out.dir", "$buildDir/") + + forwardProperties() } tasks.named("check") { dependsOn(runMocha) -} \ No newline at end of file +} diff --git a/js/js.tests/test/org/jetbrains/kotlin/incremental/AbstractInvalidationTest.kt b/js/js.tests/test/org/jetbrains/kotlin/incremental/AbstractInvalidationTest.kt index 50029c3a6c0..d0ac15cbdb1 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/incremental/AbstractInvalidationTest.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/incremental/AbstractInvalidationTest.kt @@ -10,6 +10,8 @@ import com.intellij.openapi.vfs.VirtualFileManager import com.intellij.openapi.vfs.local.CoreLocalFileSystem import com.intellij.psi.PsiManager import com.intellij.psi.SingleRootFileViewProvider +import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig +import org.jetbrains.kotlin.backend.common.phaser.toPhaseMap import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport import org.jetbrains.kotlin.cli.js.klib.generateIrForKlibSerialization import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles @@ -36,6 +38,7 @@ import org.jetbrains.kotlin.js.testOld.V8IrJsTestChecker import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.serialization.js.ModuleKind +import org.jetbrains.kotlin.test.DebugMode import org.jetbrains.kotlin.test.builders.LanguageVersionSettingsBuilder import org.jetbrains.kotlin.test.KotlinTestWithEnvironment import org.jetbrains.kotlin.test.TargetBackend @@ -285,6 +288,18 @@ abstract class AbstractInvalidationTest( } } + private fun getPhaseConfig(stepId: Int): PhaseConfig { + if (DebugMode.fromSystemProperty("kotlin.js.debugMode") < DebugMode.SUPER_DEBUG) { + return PhaseConfig(jsPhases) + } + + return PhaseConfig( + jsPhases, + dumpToDirectory = buildDir.resolve("irdump").resolve("step-$stepId").path, + toDumpStateAfter = jsPhases.toPhaseMap().values.toSet() + ) + } + fun execute() { for (projStep in projectInfo.steps) { val testInfo = projStep.order.map { setupTestStep(projStep, it, true) } @@ -308,6 +323,7 @@ abstract class AbstractInvalidationTest( mainModule, cfg, JsGenerationGranularity.PER_MODULE, + getPhaseConfig(projStep.id), setOf(FqName(BOX_FUNCTION_NAME)), targetBackend == TargetBackend.JS_IR_ES6 ) diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/AbstractJsKLibABITestCase.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/AbstractJsKLibABITestCase.kt index ff5597f96f4..313bf598d3e 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/AbstractJsKLibABITestCase.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/AbstractJsKLibABITestCase.kt @@ -191,7 +191,7 @@ abstract class AbstractJsKLibABITestCase : KtUsefulTestCase() { irFactory = { IrFactoryImplForJsIC(WholeWorldStageController()) }, mainArguments = null, compilerInterfaceFactory = { mainModule, cfg -> - JsIrCompilerWithIC(mainModule, cfg, JsGenerationGranularity.PER_MODULE, setOf(BOX_FUN_FQN)) + JsIrCompilerWithIC(mainModule, cfg, JsGenerationGranularity.PER_MODULE, PhaseConfig(jsPhases), setOf(BOX_FUN_FQN)) } ) val icCaches = cacheUpdater.actualizeCaches()