[Dwarf] Reference the correct CU when inlining
authorEllis Hoag <ellis.sparky.hoag@gmail.com>
Tue, 4 Oct 2022 19:34:31 +0000 (12:34 -0700)
committerEllis Hoag <ellis.sparky.hoag@gmail.com>
Wed, 5 Oct 2022 16:19:12 +0000 (09:19 -0700)
commit549773f9e98f9c5895f4cc461a7fb1dbdb216af8
tree6c89c2e7ed87f2f3f07d4eea03552625b10aabba
parent083617afc297f9d62a926fe8decbd9f616bd1b60
[Dwarf] Reference the correct CU when inlining

Sometimes when a function is inlined into a different CU, `llvm-dwarfdump --verify` would find an inlined subroutine with an invalid abstract origin. This is because `DwarfUnit::addDIEEntry()` will incorrectly assume the inlined subroutine and the abstract origin are from the same CU if it can't find the CU for the inlined subroutine.

In the added test, the inlined subroutine for `bar()` is created before the CU for `B.swift` is created, so it tries to point to `goo()` in the wrong CU. Interestingly, if we swap the order of the two functions then we don't see a crash since the module for `goo()` is created first.

The fix is to give a parent DIE to `ScopeDIE` before calling `addDIEEntry()` so that its CU can be found. Luckily, `constructInlinedScopeDIE()` is only called once so we can pass it the DIE of the scope's parent and give it a child just after it's created.

`constructInlinedScopeDIE()` should always return a DIE, so assert that it is not null.

Reviewed By: aprantl

Differential Revision: https://reviews.llvm.org/D135114
llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h
llvm/test/DebugInfo/Generic/cross-cu-inlining-2.ll [new file with mode: 0644]