[PATCH] D96045: [llvm-dwarfdump][locstats] Unify handling of inlined vars with no loc
Djordje Todorovic via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 14 05:13:41 PDT 2021
djtodoro added a comment.
In D96045#2688025 <https://reviews.llvm.org/D96045#2688025>, @dblaikie wrote:
> In D96045#2685000 <https://reviews.llvm.org/D96045#2685000>, @djtodoro wrote:
>
>> In D96045#2684570 <https://reviews.llvm.org/D96045#2684570>, @dblaikie wrote:
>>
>>> In D96045#2678117 <https://reviews.llvm.org/D96045#2678117>, @rdhindsa wrote:
>>>
>>>> After moving the variable InlinedFnsToBeProcessed to inside the for loop, I noticed a difference in two dwarfdump statistics for a quite large binary with fission=yes:
>>>>
>>>> #variables processed by location statistics
>>>> #variables with 0% of parent scope covered by DW_AT_location
>>>>
>>>> Since I am not very familiar with this code, I would request if you could investigate and apply the patch.
>>>
>>> Hmm, looking at this trying to reproduce the behavior makes me think this wouldn't be the right fix & the change in numbers is probably reflective of a bug in the fix - specifically in LTO situations (where the abstract origin of the function may be in a different CU than the one it's referenced from/inlined into).
>>>
>>> But there might be a reasonable alternative fix/improvement - pruning the contents of the list once it has been handled. Possibly sorting the list so it's easy to just visit the elements that need to.
>>
>> I have taken a look into this and come up with the similar conclusion.
>> This could be reproduced with the Split DWARF -- when building e.g. GDB project with -gsplit-dwarf option enabled, it triggers the issue. I was struggling to make a simple test case (from a high level) that meets all the requirements, but it is very hard. That is why I've sent the email: https://lists.llvm.org/pipermail/llvm-dev/2021-April/149735.html.
>
> Ah, hmm - why would this come up in Split DWARF, do you think? Split DWARF doesn't have any cross-CU references (the format has no way to encode them) so I'd expect no DIEs to be added to the InlinedFnsToBeProcessed list?
The example I had in my mind is a bit different (I haven't looked into cross-cu support yet, but we should have covered it).
Let me first explain two main variables here:
`GlobalInlinedFnInfo` -- keeps track of `DW_TAG_subprogram` copies with `DW_AT_inline`, so when we face a `DW_TAG_inlined_subroutine` we know for how many variables we have zero % location coverage
`InlinedFnsToBeProcessed` -- doing recursive approach if we can firsly meet a `DW_TAG_inlined_subroutine` referencing a `DW_TAG_subprogram` copy with `DW_AT_inline` (since DWARF standard does not propose the order), this variable keeps the `DW_TAG_inlined_subroutine` DIEs that should be processed after we are finished with the dwarf tree
Let us know consider a big project (let it be GDB) compiled with -gsplit-dwarf. Main executable will have debug_info section:
$ llvm-dwarfdump gdb
0x0000000b: DW_TAG_compile_unit
DW_AT_stmt_list (0x00000000)
DW_AT_comp_dir ("/gdb")
DW_AT_GNU_pubnames (true)
DW_AT_GNU_dwo_name ("gdb.dwo")
DW_AT_GNU_dwo_id (0xb8ed71b1bb823706)
DW_AT_low_pc (0x0000000000482370)
DW_AT_high_pc (0x000000000048239a)
DW_AT_GNU_addr_base (0x00000000)
0x00000030: Compile Unit: length = 0x00000030, format = DWARF32, version = 0x0004, abbr_offset = 0x001a, addr_size = 0x08 (next unit at 0x00000064)
0x0000003b: DW_TAG_compile_unit
DW_AT_stmt_list (0x00000069)
DW_AT_comp_dir ("/gdb")
DW_AT_GNU_pubnames (true)
DW_AT_GNU_dwo_name ("amd64-tdep.dwo")
DW_AT_GNU_dwo_id (0x97c5a9e4ce1a43bf)
DW_AT_GNU_ranges_base (0x00000000)
DW_AT_low_pc (0x00000000004823a0)
DW_AT_high_pc (0x000000000048e982)
DW_AT_GNU_addr_base (0x00000018)
0x00000064: Compile Unit: length = 0x0000002c, format = DWARF32, version = 0x0004, abbr_offset = 0x0037, addr_size = 0x08 (next unit at 0x00000094)
0x0000006f: DW_TAG_compile_unit
....
We will keep filling both of these variables (GlobalInlinedFnInfo and InlinedFnsToBeProcessed) for all the CUs, but there could be a situation where we have inlined_subroutine referencing a subprogram, but we accidently use variables info from subprogram from previous CU with the same DIE offset -- that is why we have different numbers for this case.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D96045/new/
https://reviews.llvm.org/D96045
More information about the llvm-commits
mailing list