Skip to content

Commit 852561c

Browse files
committed
[inliner] parent fix after copy
this change fix issue with inlining lambda in inline function which(function) inlined from other library. E.g. > cat i-lib.kt class _special_class(val v:Int) class _special_class1(val v:Int) class __helper(val v:Int) inline fun foo(h: __helper): Int { val sum = h.op { _special_class(it.v) }.v return sum } inline fun __helper.op(block:(_special_class1) -> _special_class) = block(_special_class1(v)) > cat i-main.kt fun main() { val h = __helper(42) println(foo(h)) } Here how the incorrect parent affects debug information: (lldb) target create "program.kexe" Current executable set to '/Users/minamoto/ws/kotlin-native/program.kexe' (x86_64). (lldb) command source -s 0 'i-test.lldb' Executing commands in '/Users/minamoto/ws/kotlin-native/i-test.lldb'. (lldb) b i-lib.kt:8 Breakpoint 1: where = program.kexe`kfun:#main(){} + 435 [inlined] foo + 98 at i-main.kt:3, address = 0x00000001000540e3 (lldb) r Process 70550 stopped * thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1 frame #0: 0x00000001000540e3 program.kexe`kfun:#main(){} [inlined] foo at i-lib.kt:9:7 6 inline fun foo(h: __helper): Int { 7 val sum = h.op { 8 _special_class(it.v) -> 9 }.v ^ 10 return sum 11 } 12 Target 0: (program.kexe) stopped. the parent of lambda is i-main.kt instead of i-lib.kt, and offsets calculated against wrong file. Here is behaviour with fix: (lldb) target create "program.kexe" Current executable set to '/Users/minamoto/ws/.git-trees/minamoto/debug-info/subprograms-with-missed-scopes/program.kexe' (x86_64). (lldb) command source -s 0 '/Users/minamoto/ws/kotlin-native/i-test.lldb' Executing commands in '/Users/minamoto/ws/kotlin-native/i-test.lldb'. (lldb) b i-lib.kt:8 Breakpoint 1: where = program.kexe`kfun:#main(){} + 337 [inlined] <anonymous>_2 at i-lib.kt:14, address = 0x0000000100054bb1 (lldb) r Process 70560 stopped * thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1 frame #0: 0x0000000100054bb1 program.kexe`kfun:#main(){} [inlined] <anonymous>_2 at i-lib.kt:8:24 5 6 inline fun foo(h: __helper): Int { 7 val sum = h.op { -> 8 _special_class(it.v) ^ 9 }.v 10 return sum 11 } Target 0: (program.kexe) stopped.
1 parent a84780f commit 852561c

File tree

1 file changed

+6
-3
lines changed
  • compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/inline

1 file changed

+6
-3
lines changed

compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/inline/FunctionInlining.kt

+6-3
Original file line numberDiff line numberDiff line change
@@ -143,9 +143,12 @@ class FunctionInlining(
143143
callee: IrFunction,
144144
performRecursiveInline: Boolean
145145
): IrReturnableBlock {
146-
val copiedCallee = if (performRecursiveInline)
147-
visitElement(copyIrElement.copy(callee)) as IrFunction
148-
else copyIrElement.copy(callee) as IrFunction
146+
val copiedCallee = copyIrElement.copy(callee).let {
147+
(it as IrFunction).parent = callee.parent
148+
if (performRecursiveInline)
149+
visitElement(it) as IrFunction
150+
else it
151+
}
149152

150153
val evaluationStatements = evaluateArguments(callSite, copiedCallee)
151154
val statements = (copiedCallee.body as IrBlockBody).statements

0 commit comments

Comments
 (0)