[JS IR] Replace IrModuleToJsTransformer with IrModuleToJsTransformerTmp

This commit is contained in:
Alexander Korepanov
2022-10-19 13:48:25 +02:00
committed by Space Team
parent 2ec07b861b
commit d17794481d
6 changed files with 25 additions and 89 deletions
@@ -82,15 +82,10 @@ class K2JsIrCompiler : CLICompiler<K2JSCompilerArguments>() {
val mainCallArguments: List<String>? val mainCallArguments: List<String>?
) { ) {
private fun lowerIr(): LoweredIr { private fun lowerIr(): LoweredIr {
val irFactory = when {
arguments.irNewIr2Js -> IrFactoryImplForJsIC(WholeWorldStageController())
else -> IrFactoryImpl
}
return compile( return compile(
module, module,
phaseConfig, phaseConfig,
irFactory, IrFactoryImplForJsIC(WholeWorldStageController()),
keep = arguments.irKeep?.split(",") keep = arguments.irKeep?.split(",")
?.filterNot { it.isEmpty() } ?.filterNot { it.isEmpty() }
?.toSet() ?.toSet()
@@ -106,7 +101,7 @@ class K2JsIrCompiler : CLICompiler<K2JSCompilerArguments>() {
messageCollector messageCollector
), ),
granularity = arguments.granularity, granularity = arguments.granularity,
icCompatibleIr2Js = arguments.irNewIr2Js, icCompatibleIr2Js = true,
) )
} }
@@ -123,22 +118,6 @@ class K2JsIrCompiler : CLICompiler<K2JSCompilerArguments>() {
val out = generator.generateJsCode(relativeRequirePath = true, outJsProgram = false) val out = generator.generateJsCode(relativeRequirePath = true, outJsProgram = false)
return TransformResult(out, dts) return TransformResult(out, dts)
} }
fun compileAndTransformIrOld(): TransformResult {
val ir = lowerIr()
val transformer = IrModuleToJsTransformer(
ir.context,
mainCallArguments,
fullJs = !arguments.irDce,
dceJs = arguments.irDce,
multiModule = arguments.irPerModule,
relativeRequirePath = true,
moduleToName = ir.moduleFragmentToUniqueName
)
val result = transformer.generateModule(ir.allModules)
return TransformResult(result.outputs.values.single(), result.tsDefinitions ?: error("No ts definitions"))
}
} }
@@ -427,12 +406,8 @@ class K2JsIrCompiler : CLICompiler<K2JSCompilerArguments>() {
val start = System.currentTimeMillis() val start = System.currentTimeMillis()
try { try {
val ir2JsTransformer = Ir2JsTransformer(arguments, module, phaseConfig, messageCollector, mainCallArguments)
val (outputs, tsDefinitions) = if (arguments.irNewIr2Js) { val (outputs, tsDefinitions) = ir2JsTransformer.compileAndTransformIrNew()
Ir2JsTransformer(arguments, module, phaseConfig, messageCollector, mainCallArguments).compileAndTransformIrNew()
} else {
Ir2JsTransformer(arguments, module, phaseConfig, messageCollector, mainCallArguments).compileAndTransformIrOld()
}
messageCollector.report(INFO, "Executable production duration: ${System.currentTimeMillis() - start}ms") messageCollector.report(INFO, "Executable production duration: ${System.currentTimeMillis() - start}ms")
@@ -15,7 +15,6 @@ import org.jetbrains.kotlin.ir.backend.js.lower.collectNativeImplementations
import org.jetbrains.kotlin.ir.backend.js.lower.generateJsTests import org.jetbrains.kotlin.ir.backend.js.lower.generateJsTests
import org.jetbrains.kotlin.ir.backend.js.lower.moveBodilessDeclarationsToSeparatePlace import org.jetbrains.kotlin.ir.backend.js.lower.moveBodilessDeclarationsToSeparatePlace
import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsIrLinker import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsIrLinker
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.IrModuleToJsTransformer
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.TranslationMode import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.TranslationMode
import org.jetbrains.kotlin.ir.backend.js.utils.NameTables import org.jetbrains.kotlin.ir.backend.js.utils.NameTables
import org.jetbrains.kotlin.ir.declarations.IrFactory import org.jetbrains.kotlin.ir.declarations.IrFactory
@@ -160,21 +159,6 @@ fun compileIr(
return LoweredIr(context, moduleFragment, allModules, moduleToName) return LoweredIr(context, moduleFragment, allModules, moduleToName)
} }
fun generateJsCode(
context: JsIrBackendContext,
moduleFragment: IrModuleFragment,
nameTables: NameTables
): String {
if (context.configuration.getBoolean(JSConfigurationKeys.GENERATE_POLYFILLS)) {
collectNativeImplementations(context, moduleFragment)
}
moveBodilessDeclarationsToSeparatePlace(context, moduleFragment)
jsPhases.invokeToplevel(PhaseConfig(jsPhases), context, listOf(moduleFragment))
val transformer = IrModuleToJsTransformer(context, null, true, nameTables)
return transformer.generateModule(listOf(moduleFragment)).outputs[TranslationMode.FULL]!!.jsCode
}
fun CompilationOutputs.writeSourceMapIfPresent(outputJsFile: File) { fun CompilationOutputs.writeSourceMapIfPresent(outputJsFile: File) {
sourceMap?.let { sourceMap?.let {
val mapFile = outputJsFile.resolveSibling("${outputJsFile.name}.map") val mapFile = outputJsFile.resolveSibling("${outputJsFile.name}.map")
@@ -245,11 +245,6 @@ object JsEnvironmentConfigurationDirectives : SimpleDirectivesContainer() {
applicability = DirectiveApplicability.Global applicability = DirectiveApplicability.Global
) )
val RUN_NEW_IR_2_JS by directive(
description = "",
applicability = DirectiveApplicability.Global
)
val NO_COMMON_FILES by directive( val NO_COMMON_FILES by directive(
""" """
Don't added helper files to prevent linking issues. Don't added helper files to prevent linking issues.
@@ -37,7 +37,8 @@ import org.jetbrains.kotlin.ir.backend.js.*
import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsIrLinker import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsIrLinker
import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsIrModuleSerializer import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsIrModuleSerializer
import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsManglerDesc import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsManglerDesc
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.IrModuleToJsTransformer import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.IrModuleToJsTransformerTmp
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.TranslationMode
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
import org.jetbrains.kotlin.ir.util.ExternalDependenciesGenerator import org.jetbrains.kotlin.ir.util.ExternalDependenciesGenerator
@@ -608,9 +609,9 @@ class GenerateIrRuntime {
jsPhases.invokeToplevel(phaseConfig, context, listOf(module)) jsPhases.invokeToplevel(phaseConfig, context, listOf(module))
val transformer = IrModuleToJsTransformer(context, null) val transformer = IrModuleToJsTransformerTmp(context, null)
return transformer.generateModule(listOf(module)) return transformer.generateModule(listOf(module), setOf(TranslationMode.PER_MODULE), false)
} }
fun compile(files: List<KtFile>): String { fun compile(files: List<KtFile>): String {
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.js.test.converters
import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig
import org.jetbrains.kotlin.backend.common.phaser.toPhaseMap import org.jetbrains.kotlin.backend.common.phaser.toPhaseMap
import org.jetbrains.kotlin.backend.common.serialization.linkerissues.checkNoUnboundSymbols
import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureDescriptor import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureDescriptor
import org.jetbrains.kotlin.cli.common.isWindows import org.jetbrains.kotlin.cli.common.isWindows
import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.config.CommonConfigurationKeys
@@ -16,7 +15,6 @@ import org.jetbrains.kotlin.ir.backend.js.*
import org.jetbrains.kotlin.ir.backend.js.codegen.JsGenerationGranularity import org.jetbrains.kotlin.ir.backend.js.codegen.JsGenerationGranularity
import org.jetbrains.kotlin.ir.backend.js.ic.JsExecutableProducer import org.jetbrains.kotlin.ir.backend.js.ic.JsExecutableProducer
import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsManglerDesc import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsManglerDesc
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.IrModuleToJsTransformer
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.IrModuleToJsTransformerTmp import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.IrModuleToJsTransformerTmp
import org.jetbrains.kotlin.ir.backend.js.SourceMapsInfo import org.jetbrains.kotlin.ir.backend.js.SourceMapsInfo
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.TranslationMode import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.TranslationMode
@@ -24,7 +22,6 @@ import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImplForJsIC import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImplForJsIC
import org.jetbrains.kotlin.ir.util.SymbolTable import org.jetbrains.kotlin.ir.util.SymbolTable
import org.jetbrains.kotlin.ir.util.irMessageLogger import org.jetbrains.kotlin.ir.util.irMessageLogger
import org.jetbrains.kotlin.js.config.ErrorTolerancePolicy
import org.jetbrains.kotlin.js.config.JSConfigurationKeys import org.jetbrains.kotlin.js.config.JSConfigurationKeys
import org.jetbrains.kotlin.js.test.handlers.JsBoxRunner.Companion.TEST_FUNCTION import org.jetbrains.kotlin.js.test.handlers.JsBoxRunner.Companion.TEST_FUNCTION
import org.jetbrains.kotlin.js.test.utils.extractTestPackage import org.jetbrains.kotlin.js.test.utils.extractTestPackage
@@ -77,7 +74,6 @@ class JsIrBackendFacade(
val splitPerModule = JsEnvironmentConfigurationDirectives.SPLIT_PER_MODULE in module.directives val splitPerModule = JsEnvironmentConfigurationDirectives.SPLIT_PER_MODULE in module.directives
val splitPerFile = JsEnvironmentConfigurationDirectives.SPLIT_PER_FILE in module.directives val splitPerFile = JsEnvironmentConfigurationDirectives.SPLIT_PER_FILE in module.directives
val perModule = JsEnvironmentConfigurationDirectives.PER_MODULE in module.directives val perModule = JsEnvironmentConfigurationDirectives.PER_MODULE in module.directives
val runNewIr2Js = JsEnvironmentConfigurationDirectives.RUN_NEW_IR_2_JS in module.directives
val keep = module.directives[JsEnvironmentConfigurationDirectives.KEEP].toSet() val keep = module.directives[JsEnvironmentConfigurationDirectives.KEEP].toSet()
val granularity = when { val granularity = when {
@@ -151,7 +147,7 @@ class JsIrBackendFacade(
safeExternalBoolean = JsEnvironmentConfigurationDirectives.SAFE_EXTERNAL_BOOLEAN in module.directives, safeExternalBoolean = JsEnvironmentConfigurationDirectives.SAFE_EXTERNAL_BOOLEAN in module.directives,
safeExternalBooleanDiagnostic = module.directives[JsEnvironmentConfigurationDirectives.SAFE_EXTERNAL_BOOLEAN_DIAGNOSTIC].singleOrNull(), safeExternalBooleanDiagnostic = module.directives[JsEnvironmentConfigurationDirectives.SAFE_EXTERNAL_BOOLEAN_DIAGNOSTIC].singleOrNull(),
granularity = granularity, granularity = granularity,
icCompatibleIr2Js = runNewIr2Js, icCompatibleIr2Js = true,
) )
return loweredIr2JsArtifact(module, loweredIr, granularity) return loweredIr2JsArtifact(module, loweredIr, granularity)
@@ -166,43 +162,29 @@ class JsIrBackendFacade(
.run { if (shouldBeGenerated()) arguments() else null } .run { if (shouldBeGenerated()) arguments() else null }
val runIrDce = JsEnvironmentConfigurationDirectives.RUN_IR_DCE in module.directives val runIrDce = JsEnvironmentConfigurationDirectives.RUN_IR_DCE in module.directives
val onlyIrDce = JsEnvironmentConfigurationDirectives.ONLY_IR_DCE in module.directives val onlyIrDce = JsEnvironmentConfigurationDirectives.ONLY_IR_DCE in module.directives
val runNewIr2Js = JsEnvironmentConfigurationDirectives.RUN_NEW_IR_2_JS in module.directives
val perModuleOnly = JsEnvironmentConfigurationDirectives.SPLIT_PER_MODULE in module.directives val perModuleOnly = JsEnvironmentConfigurationDirectives.SPLIT_PER_MODULE in module.directives
val isEsModules = JsEnvironmentConfigurationDirectives.ES_MODULES in module.directives || val isEsModules = JsEnvironmentConfigurationDirectives.ES_MODULES in module.directives ||
module.directives[JsEnvironmentConfigurationDirectives.MODULE_KIND].contains(ModuleKind.ES) module.directives[JsEnvironmentConfigurationDirectives.MODULE_KIND].contains(ModuleKind.ES)
val outputFile = File(JsEnvironmentConfigurator.getJsModuleArtifactPath(testServices, module.name, TranslationMode.FULL) + module.kind.extension) val outputFile = File(JsEnvironmentConfigurator.getJsModuleArtifactPath(testServices, module.name, TranslationMode.FULL) + module.kind.extension)
if (runNewIr2Js) { val transformer = IrModuleToJsTransformerTmp(
val transformer = IrModuleToJsTransformerTmp( loweredIr.context,
loweredIr.context, mainArguments,
mainArguments, moduleToName = JsIrModuleToPath(
moduleToName = JsIrModuleToPath( testServices,
testServices, isEsModules && granularity != JsGenerationGranularity.WHOLE_PROGRAM
isEsModules && granularity != JsGenerationGranularity.WHOLE_PROGRAM
)
) )
// If runIrDce then include DCE results )
// If perModuleOnly then skip whole program // If runIrDce then include DCE results
// (it.dce => runIrDce) && (perModuleOnly => it.perModule) // If perModuleOnly then skip whole program
val translationModes = TranslationMode.values() // (it.dce => runIrDce) && (perModuleOnly => it.perModule)
.filter { (it.dce || !onlyIrDce) && (!it.dce || runIrDce) && (!perModuleOnly || it.perModule) } val translationModes = TranslationMode.values()
.filter { it.dce == it.minimizedMemberNames } .filter { (it.dce || !onlyIrDce) && (!it.dce || runIrDce) && (!perModuleOnly || it.perModule) }
.toSet() .filter { it.dce == it.minimizedMemberNames }
val compilationOut = transformer.generateModule(loweredIr.allModules, translationModes, false) .toSet()
return BinaryArtifacts.Js.JsIrArtifact(outputFile, compilationOut).dump(module) val compilationOut = transformer.generateModule(loweredIr.allModules, translationModes, false)
} else { return BinaryArtifacts.Js.JsIrArtifact(outputFile, compilationOut).dump(module)
val transformer = IrModuleToJsTransformer(
loweredIr.context,
mainArguments,
fullJs = true,
dceJs = runIrDce,
multiModule = granularity == JsGenerationGranularity.PER_MODULE,
relativeRequirePath = false
)
return BinaryArtifacts.Js.JsIrArtifact(outputFile, transformer.generateModule(loweredIr.allModules)).dump(module)
}
} }
private fun IrModuleFragment.resolveTestPathes() { private fun IrModuleFragment.resolveTestPathes() {
@@ -69,7 +69,6 @@ abstract class AbstractJsIrTest(
if (getBoolean("kotlin.js.ir.klibMainModule")) +JsEnvironmentConfigurationDirectives.KLIB_MAIN_MODULE if (getBoolean("kotlin.js.ir.klibMainModule")) +JsEnvironmentConfigurationDirectives.KLIB_MAIN_MODULE
if (getBoolean("kotlin.js.ir.perModule", true)) +JsEnvironmentConfigurationDirectives.PER_MODULE if (getBoolean("kotlin.js.ir.perModule", true)) +JsEnvironmentConfigurationDirectives.PER_MODULE
if (getBoolean("kotlin.js.ir.dce", true)) +JsEnvironmentConfigurationDirectives.RUN_IR_DCE if (getBoolean("kotlin.js.ir.dce", true)) +JsEnvironmentConfigurationDirectives.RUN_IR_DCE
if (getBoolean("kotlin.js.ir.newIr2Js", true)) +JsEnvironmentConfigurationDirectives.RUN_NEW_IR_2_JS
-JsEnvironmentConfigurationDirectives.GENERATE_NODE_JS_RUNNER -JsEnvironmentConfigurationDirectives.GENERATE_NODE_JS_RUNNER
} }