From d106e9e8d9993c460e3a7b00290030867f30b0de Mon Sep 17 00:00:00 2001 From: Vasily Levchenko Date: Mon, 27 Mar 2017 17:51:13 +0300 Subject: [PATCH] FLAGS: added --print_locations flag (boolean) for printing lines/column information (cherry picked from commit 9decbaadfb3ef7ca946a732a03e475b576f4f1be) --- .../org/jetbrains/kotlin/cli/bc/K2Native.kt | 1 + .../cli/bc/K2NativeCompilerArguments.java | 3 ++ .../jetbrains/kotlin/backend/konan/Context.kt | 53 ++++++++++++++++++- .../backend/konan/KonanConfigurationKeys.kt | 2 + .../kotlin/backend/konan/KonanPhases.kt | 3 ++ 5 files changed, 61 insertions(+), 1 deletion(-) diff --git a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt index 4267adeb67b..184ac63e7a5 100644 --- a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt +++ b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt @@ -104,6 +104,7 @@ class K2Native : CLICompiler() { put(PRINT_IR, arguments.printIr) put(PRINT_DESCRIPTORS, arguments.printDescriptors) + put(PRINT_LOCATIONS, arguments.printLocations) put(PRINT_BITCODE, arguments.printBitCode) put(VERIFY_IR, arguments.verifyIr) diff --git a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.java b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.java index fa2e21270e3..e36f0f057f0 100644 --- a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.java +++ b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.java @@ -60,6 +60,9 @@ public class K2NativeCompilerArguments extends CommonCompilerArguments { @Argument(value = "print_descriptors", prefix = "--", description = "Print descriptor tree") public boolean printDescriptors; + @Argument(value = "print_locations", prefix = "--", description = "Print locations") + public boolean printLocations; + @Argument(value = "print_bitcode", prefix = "--", description = "Print llvm bitcode") public boolean printBitCode; diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt index 9b0fe6a0911..fded3e902fe 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt @@ -10,7 +10,6 @@ import org.jetbrains.kotlin.backend.konan.llvm.Llvm import org.jetbrains.kotlin.backend.konan.llvm.LlvmDeclarations import org.jetbrains.kotlin.backend.konan.llvm.functionName import org.jetbrains.kotlin.backend.konan.llvm.verifyModule -import org.jetbrains.kotlin.backend.konan.llvm.* import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl @@ -18,11 +17,19 @@ import org.jetbrains.kotlin.descriptors.impl.ReceiverParameterDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl import org.jetbrains.kotlin.incremental.components.NoLookupLocation +import org.jetbrains.kotlin.ir.IrElement +import org.jetbrains.kotlin.ir.SourceManager +import org.jetbrains.kotlin.ir.declarations.IrFile +import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.util.DumpIrTreeVisitor +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.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.DescriptorUtils +import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameOrNull import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitClassReceiver import org.jetbrains.kotlin.types.KotlinType @@ -272,6 +279,46 @@ internal class Context(config: KonanConfig) : KonanBackendContext(config) { irModule!!.accept(DumpIrTreeVisitor(out), "") } + fun printLocations() { + if (irModule == null) return + separator("Locations after: ${phase?.description}") + irModule!!.acceptVoid(object: IrElementVisitorVoid { + override fun visitElement(element: IrElement) { + element.acceptChildrenVoid(this) + } + + override fun visitFile(declaration: IrFile) { + val fileEntry = declaration.fileEntry + declaration.acceptChildrenVoid(object:IrElementVisitorVoid { + override fun visitElement(element: IrElement) { + element.acceptChildrenVoid(this) + } + + override fun visitFunction(declaration: IrFunction) { + super.visitFunction(declaration) + println("${declaration.descriptor.fqNameOrNull()}: ${fileEntry.range(declaration)}") + } + }) + } + + fun SourceManager.FileEntry.range(element:IrElement):String { + try { + /* wasn't use multi line string to prevent appearing odd line + * breaks in the dump. */ + return "${this.name}: ${this.line(element.startOffset)}" + + ":${this.column(element.startOffset)} - " + + "${this.line(element.endOffset)}" + + ":${this.column(element.endOffset)}" + + } catch (e:Exception) { + return "${this.name}: ERROR(${e.javaClass.name}): ${e.message}" + } + } + fun SourceManager.FileEntry.line(offset:Int) = this.getLineNumber(offset) + fun SourceManager.FileEntry.column(offset:Int) = this.getColumnNumber(offset) + }) + } + fun verifyBitCode() { if (llvmModule == null) return verifyModule(llvmModule!!) @@ -319,6 +366,10 @@ internal class Context(config: KonanConfig) : KonanBackendContext(config) { return config.configuration.getBoolean(KonanConfigKeys.PRINT_BITCODE) } + fun shouldPrintLocations(): Boolean { + return config.configuration.getBoolean(KonanConfigKeys.PRINT_LOCATIONS) + } + fun shouldProfilePhases(): Boolean { return config.configuration.getBoolean(KonanConfigKeys.TIME_PHASES) } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt index 3bd2c844dc4..7b41d410ac2 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt @@ -54,6 +54,8 @@ class KonanConfigKeys { = CompilerConfigurationKey.create("print descriptors") val PRINT_BITCODE: CompilerConfigurationKey = CompilerConfigurationKey.create("print bitcode") + val PRINT_LOCATIONS: CompilerConfigurationKey + = CompilerConfigurationKey.create("print locations") val ENABLED_PHASES: CompilerConfigurationKey> = CompilerConfigurationKey.create("enable backend phases") diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanPhases.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanPhases.kt index 757b4511394..72996c5902b 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanPhases.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanPhases.kt @@ -122,6 +122,9 @@ internal class PhaseManager(val context: Context) { if (shouldPrintIr()) { printIr() } + if (shouldPrintLocations()) { + printLocations() + } } context.depth --