FLAGS: added --print_locations flag (boolean) for printing lines/column information
(cherry picked from commit 9decbaadfb3ef7ca946a732a03e475b576f4f1be)
This commit is contained in:
committed by
vvlevchenko
parent
6f8d75a232
commit
d106e9e8d9
@@ -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;
|
||||
|
||||
|
||||
+52
-1
@@ -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)
|
||||
}
|
||||
|
||||
+2
@@ -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")
|
||||
|
||||
+3
@@ -122,6 +122,9 @@ internal class PhaseManager(val context: Context) {
|
||||
if (shouldPrintIr()) {
|
||||
printIr()
|
||||
}
|
||||
if (shouldPrintLocations()) {
|
||||
printLocations()
|
||||
}
|
||||
}
|
||||
|
||||
context.depth --
|
||||
|
||||
Reference in New Issue
Block a user