From eefc51657a2370faaaf3e8976a88d34245b31aac Mon Sep 17 00:00:00 2001 From: Pavel Kunyavskiy Date: Thu, 10 Aug 2023 11:50:22 +0200 Subject: [PATCH] [K/N] Fix debug info for lambdas inside inline functions ^KT-57365 --- .../kotlin/backend/konan/llvm/IrToBitcode.kt | 19 +++++++++++++------ .../backend/konan/lower/BridgesBuilding.kt | 1 + .../konan/lower/FunctionReferenceLowering.kt | 1 + native/native.tests/testData/lldb/kt42208.txt | 4 ++-- ...2208WithPassingLambdaToAnotherFunction.txt | 4 ++-- .../testData/lldb/kt42208WithVariable.txt | 12 ++++++------ 6 files changed, 25 insertions(+), 16 deletions(-) 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 92a0ad6e01c..8516a4a55ac 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 @@ -813,15 +813,22 @@ internal class CodeGeneratorVisitor( if (!declaration.shouldGenerateBody()) return + // Some special functions may have empty body, thay are handled separetely. val body = declaration.body ?: return - val file = if (declaration.origin != IrDeclarationOrigin.LOCAL_FUNCTION_FOR_LAMBDA) - null - else ((declaration as? IrSimpleFunction)?.attributeOwnerId as? IrSimpleFunction)?.let { context.irLinker.getFileOf(it) }?.takeIf { - (currentCodeContext.fileScope() as FileScope).file != it + val file = run { + val original = (declaration as? IrSimpleFunction)?.attributeOwnerId ?: return@run null + val originalFunction = when (original) { + is IrFunctionExpression -> original.function + is IrFunction -> original + else -> return@run null + } + context.irLinker.getFileOf(originalFunction) } - val scope = file?.let { - FileScope(it) + val scope = if (file != null && file != (currentCodeContext.fileScope() as FileScope).file) { + FileScope(file) + } else { + null } using(scope) { generateFunction(codegen, declaration, diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BridgesBuilding.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BridgesBuilding.kt index b3c178256fd..cf5dcdf27ff 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BridgesBuilding.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BridgesBuilding.kt @@ -70,6 +70,7 @@ internal class BridgesSupport(mapping: NativeMapping, val irBuiltIns: IrBuiltIns returnType = bridgeDirections.returnDirection.type() ?: function.returnType isSuspend = function.isSuspend }.apply { + attributeOwnerId = function.attributeOwnerId parent = function.parent val bridge = this diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionReferenceLowering.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionReferenceLowering.kt index eed56a27926..5495b148d08 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionReferenceLowering.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionReferenceLowering.kt @@ -542,6 +542,7 @@ internal class FunctionReferenceLowering(val generationState: NativeGenerationSt returnType = functionReturnType isSuspend = superFunction.isSuspend }.apply { + attributeOwnerId = functionReference.attributeOwnerId val function = this function.createDispatchReceiverParameter() diff --git a/native/native.tests/testData/lldb/kt42208.txt b/native/native.tests/testData/lldb/kt42208.txt index c2817783da0..548c28ff8e1 100644 --- a/native/native.tests/testData/lldb/kt42208.txt +++ b/native/native.tests/testData/lldb/kt42208.txt @@ -4,8 +4,8 @@ * thread #1, [..] stop reason = breakpoint 1.1 * frame #0: [..]`ThrowException frame #1: [..]`kfun:[..]main$lambda$0[..] at kt42208-2.kt:10:18 - frame #2: [..]`kfun:$main$lambda$0$FUNCTION_REFERENCE$0[..]invoke[..](_this=[..])[..] at kt42208-1.kt:7:60 - frame #3: [..]`kfun:$main$lambda$0$FUNCTION_REFERENCE$0.[..]$invoke(_this=[..]){}kotlin.Nothing[..] at kt42208-1.kt:7:60 + frame #2: [..]`kfun:$main$lambda$0$FUNCTION_REFERENCE$0[..]invoke[..](_this=[..])[..] at kt42208-2.kt:9:20 + frame #3: [..]`kfun:$main$lambda$0$FUNCTION_REFERENCE$0.[..]$invoke(_this=[..]){}kotlin.Nothing[..] at kt42208-2.kt:9:20 frame #4: [..]`kfun:kotlin.Function0#invoke(){}1:0-trampoline at [K][Suspend]Functions:1:1 frame #5: [..]`kfun:#main(){} at kt42208-1.kt:5:5 frame #6: [..]`Konan_start(args=[..]) at [..] diff --git a/native/native.tests/testData/lldb/kt42208WithPassingLambdaToAnotherFunction.txt b/native/native.tests/testData/lldb/kt42208WithPassingLambdaToAnotherFunction.txt index b8231357e7d..7186f7b074e 100644 --- a/native/native.tests/testData/lldb/kt42208WithPassingLambdaToAnotherFunction.txt +++ b/native/native.tests/testData/lldb/kt42208WithPassingLambdaToAnotherFunction.txt @@ -3,8 +3,8 @@ > bt * thread #1, [..] stop reason = breakpoint 1.1 * frame #0: [..]`kfun:[..]main$lambda$0[..] at kt42208-2.kt:14:5 - frame #1: [..]`kfun:$main$lambda$0$FUNCTION_REFERENCE$0.[..]invoke[..](_this=[..])[..] at kt42208-1.kt:9:82 - frame #2: [..]`kfun:$main$lambda$0$FUNCTION_REFERENCE$0.[..]$invoke(_this=[..]){}kotlin.Boolean[..] at kt42208-1.kt:9:82 + frame #1: [..]`kfun:$main$lambda$0$FUNCTION_REFERENCE$0.[..]invoke[..](_this=[..])[..] at kt42208-2.kt:13:20 + frame #2: [..]`kfun:$main$lambda$0$FUNCTION_REFERENCE$0.[..]$invoke(_this=[..]){}kotlin.Boolean[..] at kt42208-2.kt:13:20 frame #3: [..]`kfun:kotlin.Function0#invoke(){}1:0-trampoline at [K][Suspend]Functions:1:1 frame #4: [..]`kfun:#bar(v=[..]){} at kt42208-3.kt:18:5 frame #5: [..]`kfun:#main(){} at kt42208-1.kt:7:5 diff --git a/native/native.tests/testData/lldb/kt42208WithVariable.txt b/native/native.tests/testData/lldb/kt42208WithVariable.txt index 8a3692ae7af..01b312cd107 100644 --- a/native/native.tests/testData/lldb/kt42208WithVariable.txt +++ b/native/native.tests/testData/lldb/kt42208WithVariable.txt @@ -3,8 +3,8 @@ > bt * thread #1, [..] stop reason = breakpoint 1.1 * frame #0: [..]`kfun:[..]main$lambda$0[..] at kt42208-2.kt:15:5 - frame #1: [..]`kfun:$main$lambda$0$FUNCTION_REFERENCE$0[..]invoke[..](_this=[..])[..] at kt42208-1.kt:10:71 - frame #2: [..]`kfun:$main$lambda$0$FUNCTION_REFERENCE$0.[..]$invoke(_this=[..]){}kotlin.Boolean[..] at kt42208-1.kt:10:71 + frame #1: [..]`kfun:$main$lambda$0$FUNCTION_REFERENCE$0[..]invoke[..](_this=[..])[..] at kt42208-2.kt:14:20 + frame #2: [..]`kfun:$main$lambda$0$FUNCTION_REFERENCE$0.[..]$invoke(_this=[..]){}kotlin.Boolean[..] at kt42208-2.kt:14:20 frame #3: [..]`kfun:kotlin.Function0#invoke(){}1:0-trampoline at [K][Suspend]Functions:1:1 frame #4: [..]`kfun:#main(){} at kt42208-1.kt:6:5 frame #5: [..]`Konan_start(args=[..]) at [..] @@ -13,8 +13,8 @@ > bt * thread #1, [..] stop reason = breakpoint 1.1 * frame #0: [..]`kfun:[..]main$lambda$0[..] at kt42208-2.kt:15:5 - frame #1: [..]`kfun:$main$lambda$0$FUNCTION_REFERENCE$0[..]invoke[..](_this=[..])[..] at kt42208-1.kt:10:71 - frame #2: [..]`kfun:$main$lambda$0$FUNCTION_REFERENCE$0.[..]$invoke(_this=[..]){}kotlin.Boolean[..] at kt42208-1.kt:10:71 + frame #1: [..]`kfun:$main$lambda$0$FUNCTION_REFERENCE$0[..]invoke[..](_this=[..])[..] at kt42208-2.kt:14:20 + frame #2: [..]`kfun:$main$lambda$0$FUNCTION_REFERENCE$0.[..]$invoke(_this=[..]){}kotlin.Boolean[..] at kt42208-2.kt:14:20 frame #3: [..]`kfun:kotlin.Function0#invoke(){}1:0-trampoline at [K][Suspend]Functions:1:1 frame #4: [..]`kfun:#main(){} at kt42208-1.kt:7:5 frame #5: [..]`Konan_start(args=[..]) at [..] @@ -22,8 +22,8 @@ > bt * thread #1, [..] stop reason = breakpoint 1.1 * frame #0: [..]`kfun:[..]main$lambda$0[..] at kt42208-2.kt:15:5 - frame #1: [..]`kfun:$main$lambda$0$FUNCTION_REFERENCE$0[..]invoke[..](_this=[..])[..] at kt42208-1.kt:10:71 - frame #2: [..]`kfun:$main$lambda$0$FUNCTION_REFERENCE$0.[..]$invoke(_this=[..]){}kotlin.Boolean[..] at kt42208-1.kt:10:71 + frame #1: [..]`kfun:$main$lambda$0$FUNCTION_REFERENCE$0[..]invoke[..](_this=[..])[..] at kt42208-2.kt:14:20 + frame #2: [..]`kfun:$main$lambda$0$FUNCTION_REFERENCE$0.[..]$invoke(_this=[..]){}kotlin.Boolean[..] at kt42208-2.kt:14:20 frame #3: [..]`kfun:kotlin.Function0#invoke(){}1:0-trampoline at [K][Suspend]Functions:1:1 frame #4: [..]`kfun:#main(){} at kt42208-1.kt:8:5 frame #5: [..]`Konan_start(args=[..]) at [..]