From 2a7e32d3aea97091ac60c91d6d72c5f1ed67b880 Mon Sep 17 00:00:00 2001 From: Zalim Bashorov Date: Fri, 10 Jan 2020 18:43:57 +0300 Subject: [PATCH] [JS IR DCE] Add CLI option to print reachability info --- .../common/arguments/K2JSCompilerArguments.kt | 18 +++++------------- .../jetbrains/kotlin/cli/js/K2JsIrCompiler.kt | 6 ++++-- .../org/jetbrains/kotlin/ir/backend/js/Dce.kt | 12 +++++++----- compiler/testData/cli/js/jsExtraHelp.out | 2 ++ .../kotlin/js/config/JSConfigurationKeys.java | 18 +++++------------- 5 files changed, 23 insertions(+), 33 deletions(-) diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSCompilerArguments.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSCompilerArguments.kt index c08a46ccb55..1ba131dba20 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSCompilerArguments.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSCompilerArguments.kt @@ -1,17 +1,6 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ package org.jetbrains.kotlin.cli.common.arguments @@ -133,6 +122,9 @@ class K2JSCompilerArguments : CommonCompilerArguments() { @Argument(value = "-Xir-dce-driven", description = "Perform a more experimental faster dead code elimination") var irDceDriven: Boolean by FreezableVar(false) + @Argument(value = "-Xir-dce-print-reachability-info", description = "Print declarations' reachability info to stdout during performing DCE") + var irDcePrintReachabilityInfo: Boolean by FreezableVar(false) + @Argument(value = "-Xir-only", description = "Disables pre-IR backend") var irOnly: Boolean by FreezableVar(false) 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 dbb4b744285..f89f3971b1a 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 @@ -1,6 +1,6 @@ /* - * Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license - * that can be found in the license/LICENSE.txt file. + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ package org.jetbrains.kotlin.cli.js @@ -317,6 +317,8 @@ class K2JsIrCompiler : CLICompiler() { if (!arguments.sourceMap && sourceMapEmbedContentString != null) { messageCollector.report(WARNING, "source-map-embed-sources argument has no effect without source map", null) } + + configuration.put(JSConfigurationKeys.PRINT_REACHABILITY_INFO, arguments.irDcePrintReachabilityInfo) } override fun executableScriptFileName(): String { diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/Dce.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/Dce.kt index 1cc6e927e07..ef5f9abfe39 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/Dce.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/Dce.kt @@ -19,10 +19,9 @@ import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptVoid +import org.jetbrains.kotlin.js.config.JSConfigurationKeys import java.util.* -private val PRINT_REACHABILITY_INFO = java.lang.Boolean.getBoolean("kotlin.js.ir.dce.print.reachability.info") - fun eliminateDeadDeclarations( module: IrModuleFragment, context: JsIrBackendContext, @@ -99,7 +98,10 @@ private fun removeUselessDeclarations(module: IrModuleFragment, usefulDeclaratio } fun usefulDeclarations(roots: Iterable, context: JsIrBackendContext): Set { - val reachabilityInfo: MutableSet = if (PRINT_REACHABILITY_INFO) linkedSetOf() else Collections.emptySet() + val printReachabilityInfo = + context.configuration.getBoolean(JSConfigurationKeys.PRINT_REACHABILITY_INFO) || + java.lang.Boolean.getBoolean("kotlin.js.ir.dce.print.reachability.info") + val reachabilityInfo: MutableSet = if (printReachabilityInfo) linkedSetOf() else Collections.emptySet() val queue = ArrayDeque() val result = hashSetOf() @@ -116,7 +118,7 @@ fun usefulDeclarations(roots: Iterable, context: JsIrBackendConte return } - if (PRINT_REACHABILITY_INFO) { + if (printReachabilityInfo) { val fromFqn = (from as? IrDeclarationWithName)?.fqNameWhenAvailable?.asString() ?: altFromFqn ?: "" val toFqn = (this as? IrDeclarationWithName)?.fqNameWhenAvailable?.asString() ?: "" @@ -342,7 +344,7 @@ fun usefulDeclarations(roots: Iterable, context: JsIrBackendConte } } - if (PRINT_REACHABILITY_INFO) { + if (printReachabilityInfo) { reachabilityInfo.forEach(::println) } diff --git a/compiler/testData/cli/js/jsExtraHelp.out b/compiler/testData/cli/js/jsExtraHelp.out index f4be5a6c6e8..024f2748e66 100644 --- a/compiler/testData/cli/js/jsExtraHelp.out +++ b/compiler/testData/cli/js/jsExtraHelp.out @@ -7,6 +7,8 @@ where advanced options include: -Xinclude= A path to an intermediate library that should be processed in the same manner as source files. -Xir-dce Perform experimental dead code elimination -Xir-dce-driven Perform a more experimental faster dead code elimination + -Xir-dce-print-reachability-info + Print declarations' reachability info to stdout during performing DCE -Xir-only Disables pre-IR backend -Xir-produce-js Generates JS file using IR backend. Also disables pre-IR backend -Xir-produce-klib-dir Generate unpacked KLIB into parent directory of output JS file. diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/config/JSConfigurationKeys.java b/js/js.frontend/src/org/jetbrains/kotlin/js/config/JSConfigurationKeys.java index dd26445c753..62e95624d77 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/config/JSConfigurationKeys.java +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/config/JSConfigurationKeys.java @@ -1,17 +1,6 @@ /* - * Copyright 2010-2016 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ package org.jetbrains.kotlin.js.config; @@ -91,4 +80,7 @@ public class JSConfigurationKeys { public static final CompilerConfigurationKey> FILE_PATHS_PREFIX_MAP = CompilerConfigurationKey.create("this map used to shorten/replace prefix of paths in comments with file paths, " + "including region comments"); + + public static final CompilerConfigurationKey PRINT_REACHABILITY_INFO = + CompilerConfigurationKey.create("print declarations' reachability info during performing DCE"); }