This is an archive of the discontinued LLVM Phabricator instance.

dwarfdump --statistics: Use new location list api
ClosedPublic

Authored by labath on Nov 19 2019, 7:43 AM.

Details

Summary

This patch removes manual location list handling in the statistics code
and replaces it with the new DWARFDie api, which provides access to a
"cooked" location list. This has the following effects:

  • the code now properly handles split-dwarf location lists
  • it will automatically support dwarf5 location lists once support for those is added
  • it properly handles location lists with base address selection entries
  • it fixes a bug where the location list code was using the first DW_AT_ranges range as a "base address" of the compile unit (it should have used DW_AT_low_pc instead. The effect of this was that the computation of the start address of a variable in its scope was broken for these kinds of compile units. This only manifested itself on linked files, since in object files the first DW_AT_ranges range normally starts at 0.

Since pretty much every kind of location list was broken in some way,
it's hard to verify that the new implementation is correct -- the output
will be different in all non-trivial cases, and mostly with good reason.

Most of the existing statistics tests continue to pass though, and a
visual inspection of the statistics for non-trivial inputs shows that
the data is more "reasonable" now. I have updated the "dwo statistics"
test to include the new numbers, as the previous ones were completely
bogus, and I have added a targeted test for the "base address" bug.

Event Timeline

labath created this revision.Nov 19 2019, 7:43 AM
Herald added a project: Restricted Project. · View Herald TranscriptNov 19 2019, 7:43 AM
Herald added a subscriber: aprantl. · View Herald Transcript
aprantl accepted this revision.Nov 19 2019, 10:05 AM

Thanks!

llvm/tools/llvm-dwarfdump/Statistics.cpp
247
if (!Loc) {
  consumeError()
  return;
}
This revision is now accepted and ready to land.Nov 19 2019, 10:05 AM
This revision was automatically updated to reflect the committed changes.
labath marked an inline comment as done.