From bebede9e4f748dd4a48f2dd7e67576c9442c4253 Mon Sep 17 00:00:00 2001 From: Vasily Levchenko Date: Mon, 31 May 2021 13:09:41 +0200 Subject: [PATCH 1/3] [codegeneration][debug info] enchance debugger behaviour for paramterless when - generates tramboline like a11b07f6c37 on -Xg-generate-when-marker=enable - fixes issue KT-33364 --- .../cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt | 9 +++++++++ .../jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt | 6 ++++++ .../org/jetbrains/kotlin/backend/konan/KonanConfig.kt | 1 + .../kotlin/backend/konan/KonanConfigurationKeys.kt | 2 ++ .../jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt | 6 ++++++ 5 files changed, 24 insertions(+) diff --git a/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt b/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt index 44986012856..69fd25137ab 100644 --- a/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt +++ b/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt @@ -178,6 +178,15 @@ class K2Native : CLICompiler() { null } }) + putIfNotNull(GENERATE_WHEN_MARKER, when (val it = arguments.generateWhenMarkerString) { + "enable" -> true + "disable" -> false + null -> null + else -> { + configuration.report(ERROR, "Unsupported -Xg-generate-when-marker= value: $it. Possible values are 'enable'/'disable'") + null + } + }) put(STATIC_FRAMEWORK, selectFrameworkType(configuration, arguments, outputKind)) put(OVERRIDE_CLANG_OPTIONS, arguments.clangOptions.toNonNullList()) put(ALLOCATION_MODE, arguments.allocator) diff --git a/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt b/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt index e6422a60f71..68857495adf 100644 --- a/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt +++ b/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt @@ -171,6 +171,12 @@ class K2NativeCompilerArguments : CommonCompilerArguments() { description = """generates marker of inlined function body on call site to make debugger breakpoint resolution more accurate""" ) var generateInlinedFunctionMarkerString: String? = null + @Argument( + value = "-Xg-generate-when-marker", + valueDescription = "{disable|enable}", + description = """generates marker of when to make debugger breakpoint resolution more accurate""" + ) + var generateWhenMarkerString: String? = null @Argument( diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt index e4b4943c7e9..8ce4424d8a2 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt @@ -44,6 +44,7 @@ class KonanConfig(val project: Project, val configuration: CompilerConfiguration val lightDebug: Boolean = configuration.get(KonanConfigKeys.LIGHT_DEBUG) ?: target.family.isAppleFamily // Default is true for Apple targets. val generateInlinedBodyTrampoline = debug && configuration.get(KonanConfigKeys.GENERATE_INLINED_FUNCTION_BODY_MARKER) ?: false + val generateWhenTrampoline = debug && configuration.get(KonanConfigKeys.GENERATE_WHEN_MARKER) ?: false val memoryModel: MemoryModel get() = configuration.get(KonanConfigKeys.MEMORY_MODEL)!! val destroyRuntimeMode: DestroyRuntimeMode get() = configuration.get(KonanConfigKeys.DESTROY_RUNTIME_MODE)!! diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt index c72e1adb0ee..f3e3ca773ee 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt @@ -58,6 +58,8 @@ class KonanConfigKeys { = CompilerConfigurationKey.create("add light debug information") val GENERATE_INLINED_FUNCTION_BODY_MARKER: CompilerConfigurationKey = CompilerConfigurationKey.create("generates inlined function body marker on call site") + val GENERATE_WHEN_MARKER: CompilerConfigurationKey + = CompilerConfigurationKey.create("generates when marker on call site") val LINKER_ARGS: CompilerConfigurationKey> = CompilerConfigurationKey.create("additional linker arguments") val LIST_PHASES: CompilerConfigurationKey diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt index 4f655aa2318..f4957c8adb4 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt @@ -1177,6 +1177,12 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map Date: Mon, 31 May 2021 13:40:03 +0200 Subject: [PATCH 2/3] [kotlin-native][tests] kt-33364 test added --- .../kotlin/native/test/debugger/LldbTests.kt | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/kotlin-native/backend.native/tests/debugger/src/test/kotlin/org/jetbrains/kotlin/native/test/debugger/LldbTests.kt b/kotlin-native/backend.native/tests/debugger/src/test/kotlin/org/jetbrains/kotlin/native/test/debugger/LldbTests.kt index 09a8cbf697f..9b8af253a85 100644 --- a/kotlin-native/backend.native/tests/debugger/src/test/kotlin/org/jetbrains/kotlin/native/test/debugger/LldbTests.kt +++ b/kotlin-native/backend.native/tests/debugger/src/test/kotlin/org/jetbrains/kotlin/native/test/debugger/LldbTests.kt @@ -146,6 +146,7 @@ class LldbTests { > b kfun:#a(){}kotlin.String Breakpoint 2: where = [..]`kfun:#a(){}kotlin.String [..] at a.kt:1:1, [..] + > q """.trimIndent().lldb(application) } @@ -167,9 +168,40 @@ class LldbTests { """ > b 2 Breakpoint 1: where = [..]`kfun:#question(kotlin.String;kotlin.Array){}kotlin.String [..] at kt33055.kt:2:12, [..] + > q """.trimIndent().lldb(kt33055) } + @Test + fun `kt33364`() = lldbComplexTest { + val kt33364 = """ + |fun main() { + | val param = 3 + | + | //breakpoint here (line: 4, breakpoint is set to 5th line) + | when(param) { + | 1 -> print("A") + | 2 -> print("B") + | else -> print("C") + | } + | + | // breakpoint here (line: 11, breakpoint is set to 12th line) + | when { + | param == 1 -> print("A") + | param == 2 -> print("B") + | else -> print("C") + | } + |} + """.trimMargin().binary("kt33364", "-g", "-Xg-generate-when-marker=enable") + """ + > b 5 + Breakpoint 1: where = [..]kfun:#main(){} [..] at kt33364.kt:5:[..] + > b 11 + Breakpoint 2: where = [..]kfun:#main(){} [..] at kt33364.kt:12:[..] + > q + """.trimIndent().lldb(kt33364) + } + @Test fun `kt42208`() = lldbComplexTest { val kt42208One = """ From 79600f32d279291c08680dfef8a13dacf5ce68a0 Mon Sep 17 00:00:00 2001 From: Vasily Levchenko Date: Mon, 7 Jun 2021 13:17:44 +0200 Subject: [PATCH 3/3] [codegenerator][refactor] extract method for tramboline generation --- .../org/jetbrains/kotlin/cli/bc/K2Native.kt | 13 ++--------- .../cli/bc/K2NativeCompilerArguments.kt | 12 +++------- .../kotlin/backend/konan/KonanConfig.kt | 3 +-- .../backend/konan/KonanConfigurationKeys.kt | 6 ++--- .../kotlin/backend/konan/llvm/IrToBitcode.kt | 23 +++++++++---------- .../backend.native/tests/build.gradle | 2 +- .../kotlin/native/test/debugger/LldbTests.kt | 4 ++-- 7 files changed, 22 insertions(+), 41 deletions(-) diff --git a/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt b/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt index 69fd25137ab..88000fd3496 100644 --- a/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt +++ b/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt @@ -169,21 +169,12 @@ class K2Native : CLICompiler() { null } }) - putIfNotNull(GENERATE_INLINED_FUNCTION_BODY_MARKER, when (val it = arguments.generateInlinedFunctionMarkerString) { + putIfNotNull(GENERATE_DEBUG_TRAMPOLINE, when (val it = arguments.generateDebugTrampolineString) { "enable" -> true "disable" -> false null -> null else -> { - configuration.report(ERROR, "Unsupported -Xg-generate-inline-function-body-marker= value: $it. Possible values are 'enable'/'disable'") - null - } - }) - putIfNotNull(GENERATE_WHEN_MARKER, when (val it = arguments.generateWhenMarkerString) { - "enable" -> true - "disable" -> false - null -> null - else -> { - configuration.report(ERROR, "Unsupported -Xg-generate-when-marker= value: $it. Possible values are 'enable'/'disable'") + configuration.report(ERROR, "Unsupported -Xg-generate-debug-tramboline= value: $it. Possible values are 'enable'/'disable'") null } }) diff --git a/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt b/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt index 68857495adf..c6efd07375c 100644 --- a/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt +++ b/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt @@ -166,17 +166,11 @@ class K2NativeCompilerArguments : CommonCompilerArguments() { var lightDebugDeprecated: Boolean = false @Argument( - value = "-Xg-generate-inline-function-body-marker", + value = "-Xg-generate-debug-trampoline", valueDescription = "{disable|enable}", - description = """generates marker of inlined function body on call site to make debugger breakpoint resolution more accurate""" + description = """generates trampolines to make debugger breakpoint resolution more accurate (inlines, when, etc.)""" ) - var generateInlinedFunctionMarkerString: String? = null - @Argument( - value = "-Xg-generate-when-marker", - valueDescription = "{disable|enable}", - description = """generates marker of when to make debugger breakpoint resolution more accurate""" - ) - var generateWhenMarkerString: String? = null + var generateDebugTrampolineString: String? = null @Argument( diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt index 8ce4424d8a2..e12419d22ff 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt @@ -43,8 +43,7 @@ class KonanConfig(val project: Project, val configuration: CompilerConfiguration val debug: Boolean get() = configuration.getBoolean(KonanConfigKeys.DEBUG) val lightDebug: Boolean = configuration.get(KonanConfigKeys.LIGHT_DEBUG) ?: target.family.isAppleFamily // Default is true for Apple targets. - val generateInlinedBodyTrampoline = debug && configuration.get(KonanConfigKeys.GENERATE_INLINED_FUNCTION_BODY_MARKER) ?: false - val generateWhenTrampoline = debug && configuration.get(KonanConfigKeys.GENERATE_WHEN_MARKER) ?: false + val generateDebugTrampoline = debug && configuration.get(KonanConfigKeys.GENERATE_DEBUG_TRAMPOLINE) ?: false val memoryModel: MemoryModel get() = configuration.get(KonanConfigKeys.MEMORY_MODEL)!! val destroyRuntimeMode: DestroyRuntimeMode get() = configuration.get(KonanConfigKeys.DESTROY_RUNTIME_MODE)!! diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt index f3e3ca773ee..97dad2a452a 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt @@ -56,10 +56,8 @@ class KonanConfigKeys { = CompilerConfigurationKey.create("library version") val LIGHT_DEBUG: CompilerConfigurationKey = CompilerConfigurationKey.create("add light debug information") - val GENERATE_INLINED_FUNCTION_BODY_MARKER: CompilerConfigurationKey - = CompilerConfigurationKey.create("generates inlined function body marker on call site") - val GENERATE_WHEN_MARKER: CompilerConfigurationKey - = CompilerConfigurationKey.create("generates when marker on call site") + val GENERATE_DEBUG_TRAMPOLINE: CompilerConfigurationKey + = CompilerConfigurationKey.create("generates debug trampolines to make debugger breakpoint resolution more accurate") val LINKER_ARGS: CompilerConfigurationKey> = CompilerConfigurationKey.create("additional linker arguments") val LIST_PHASES: CompilerConfigurationKey diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt index f4957c8adb4..0fd6b64da18 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt @@ -1177,12 +1177,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map) { | println(question("Subject", args)) |} - """.trimMargin().binary("kt33055", "-g", "-Xg-generate-inline-function-body-marker=enable") + """.trimMargin().binary("kt33055", "-g", "-Xg-generate-debug-trampoline=enable") """ > b 2 Breakpoint 1: where = [..]`kfun:#question(kotlin.String;kotlin.Array){}kotlin.String [..] at kt33055.kt:2:12, [..] @@ -192,7 +192,7 @@ class LldbTests { | else -> print("C") | } |} - """.trimMargin().binary("kt33364", "-g", "-Xg-generate-when-marker=enable") + """.trimMargin().binary("kt33364", "-g", "-Xg-generate-debug-trampoline=enable") """ > b 5 Breakpoint 1: where = [..]kfun:#main(){} [..] at kt33364.kt:5:[..]