FLAGS: added --print_locations flag (boolean) for printing lines/column information

(cherry picked from commit 9decbaadfb3ef7ca946a732a03e475b576f4f1be)
This commit is contained in:
Vasily Levchenko
2017-03-27 17:51:13 +03:00
committed by vvlevchenko
parent 6f8d75a232
commit d106e9e8d9
5 changed files with 61 additions and 1 deletions
@@ -104,6 +104,7 @@ class K2Native : CLICompiler<K2NativeCompilerArguments>() {
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)
@@ -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;
@@ -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)
}
@@ -54,6 +54,8 @@ class KonanConfigKeys {
= CompilerConfigurationKey.create("print descriptors")
val PRINT_BITCODE: CompilerConfigurationKey<Boolean>
= CompilerConfigurationKey.create("print bitcode")
val PRINT_LOCATIONS: CompilerConfigurationKey<Boolean>
= CompilerConfigurationKey.create("print locations")
val ENABLED_PHASES: CompilerConfigurationKey<List<String>>
= CompilerConfigurationKey.create("enable backend phases")
@@ -122,6 +122,9 @@ internal class PhaseManager(val context: Context) {
if (shouldPrintIr()) {
printIr()
}
if (shouldPrintLocations()) {
printLocations()
}
}
context.depth --