[JS IR DCE] Add CLI option to print reachability info
This commit is contained in:
+5
-13
@@ -1,17 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2015 JetBrains s.r.o.
|
* 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.
|
||||||
* 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.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.jetbrains.kotlin.cli.common.arguments
|
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")
|
@Argument(value = "-Xir-dce-driven", description = "Perform a more experimental faster dead code elimination")
|
||||||
var irDceDriven: Boolean by FreezableVar(false)
|
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")
|
@Argument(value = "-Xir-only", description = "Disables pre-IR backend")
|
||||||
var irOnly: Boolean by FreezableVar(false)
|
var irOnly: Boolean by FreezableVar(false)
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
* that can be found in the license/LICENSE.txt file.
|
* 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
|
package org.jetbrains.kotlin.cli.js
|
||||||
@@ -317,6 +317,8 @@ class K2JsIrCompiler : CLICompiler<K2JSCompilerArguments>() {
|
|||||||
if (!arguments.sourceMap && sourceMapEmbedContentString != null) {
|
if (!arguments.sourceMap && sourceMapEmbedContentString != null) {
|
||||||
messageCollector.report(WARNING, "source-map-embed-sources argument has no effect without source map", 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 {
|
override fun executableScriptFileName(): String {
|
||||||
|
|||||||
@@ -19,10 +19,9 @@ import org.jetbrains.kotlin.ir.util.*
|
|||||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
|
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
|
||||||
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
|
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
|
||||||
import org.jetbrains.kotlin.ir.visitors.acceptVoid
|
import org.jetbrains.kotlin.ir.visitors.acceptVoid
|
||||||
|
import org.jetbrains.kotlin.js.config.JSConfigurationKeys
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
private val PRINT_REACHABILITY_INFO = java.lang.Boolean.getBoolean("kotlin.js.ir.dce.print.reachability.info")
|
|
||||||
|
|
||||||
fun eliminateDeadDeclarations(
|
fun eliminateDeadDeclarations(
|
||||||
module: IrModuleFragment,
|
module: IrModuleFragment,
|
||||||
context: JsIrBackendContext,
|
context: JsIrBackendContext,
|
||||||
@@ -99,7 +98,10 @@ private fun removeUselessDeclarations(module: IrModuleFragment, usefulDeclaratio
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun usefulDeclarations(roots: Iterable<IrDeclaration>, context: JsIrBackendContext): Set<IrDeclaration> {
|
fun usefulDeclarations(roots: Iterable<IrDeclaration>, context: JsIrBackendContext): Set<IrDeclaration> {
|
||||||
val reachabilityInfo: MutableSet<String> = 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<String> = if (printReachabilityInfo) linkedSetOf() else Collections.emptySet()
|
||||||
|
|
||||||
val queue = ArrayDeque<IrDeclaration>()
|
val queue = ArrayDeque<IrDeclaration>()
|
||||||
val result = hashSetOf<IrDeclaration>()
|
val result = hashSetOf<IrDeclaration>()
|
||||||
@@ -116,7 +118,7 @@ fun usefulDeclarations(roots: Iterable<IrDeclaration>, context: JsIrBackendConte
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PRINT_REACHABILITY_INFO) {
|
if (printReachabilityInfo) {
|
||||||
val fromFqn = (from as? IrDeclarationWithName)?.fqNameWhenAvailable?.asString() ?: altFromFqn ?: "<unknown>"
|
val fromFqn = (from as? IrDeclarationWithName)?.fqNameWhenAvailable?.asString() ?: altFromFqn ?: "<unknown>"
|
||||||
|
|
||||||
val toFqn = (this as? IrDeclarationWithName)?.fqNameWhenAvailable?.asString() ?: "<unknown>"
|
val toFqn = (this as? IrDeclarationWithName)?.fqNameWhenAvailable?.asString() ?: "<unknown>"
|
||||||
@@ -342,7 +344,7 @@ fun usefulDeclarations(roots: Iterable<IrDeclaration>, context: JsIrBackendConte
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PRINT_REACHABILITY_INFO) {
|
if (printReachabilityInfo) {
|
||||||
reachabilityInfo.forEach(::println)
|
reachabilityInfo.forEach(::println)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
@@ -7,6 +7,8 @@ where advanced options include:
|
|||||||
-Xinclude=<path> A path to an intermediate library that should be processed in the same manner as source files.
|
-Xinclude=<path> 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 Perform experimental dead code elimination
|
||||||
-Xir-dce-driven Perform a more experimental faster 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-only Disables pre-IR backend
|
||||||
-Xir-produce-js Generates JS file using IR backend. Also 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.
|
-Xir-produce-klib-dir Generate unpacked KLIB into parent directory of output JS file.
|
||||||
|
|||||||
@@ -1,17 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2016 JetBrains s.r.o.
|
* 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.
|
||||||
* 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.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.jetbrains.kotlin.js.config;
|
package org.jetbrains.kotlin.js.config;
|
||||||
@@ -91,4 +80,7 @@ public class JSConfigurationKeys {
|
|||||||
public static final CompilerConfigurationKey<Map<String, String>> FILE_PATHS_PREFIX_MAP =
|
public static final CompilerConfigurationKey<Map<String, String>> FILE_PATHS_PREFIX_MAP =
|
||||||
CompilerConfigurationKey.create("this map used to shorten/replace prefix of paths in comments with file paths, " +
|
CompilerConfigurationKey.create("this map used to shorten/replace prefix of paths in comments with file paths, " +
|
||||||
"including region comments");
|
"including region comments");
|
||||||
|
|
||||||
|
public static final CompilerConfigurationKey<Boolean> PRINT_REACHABILITY_INFO =
|
||||||
|
CompilerConfigurationKey.create("print declarations' reachability info during performing DCE");
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user