[PATCH] D69027: [llvm-dwarfdump][Statistics] Fix calculation of OffsetToFirstDefinition

Kristina Bessonova via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Oct 16 16:23:55 PDT 2019


krisb added a comment.

In D69027#1711682 <https://reviews.llvm.org/D69027#1711682>, @dblaikie wrote:

> I'm confused - given the presence of noncontiguous ranges, why would the "first def" be an important property?
>
> The existence of this operation is "iffy" to me - I'd expect a general solution that handles all the noncontiguous range chunks equally, so there wouldn't be a special case for the "first def".


Currently, we calculate the variable's coverage this way (if I understand the things correctly):

1. Calculate the size of the whole scope - subprogram, lexical block, etc (either as a distance between scope's HighPC or LowPC or a sum of sizes of scope's ranges).
2. Calculate the number of bytes where the variable is defined (by its location list).
3. Calculate and substruct OffsetToFirstDefinition from the size of the scope.
4. Divide the number of bytes where a variable is defined by the adjusted size of the scope.

OffsetToFirstDefinition is applied in the case the variable first definition address greater than scope's LowPC. I guess this is done to handle cases where the variable is defined not in the beginning of the scope (e.g. in the middle of a function). 
Actually, I don't like this solution with OffsetToFirstDefinition because it makes the statistics more optimistic that it often is and hides some issues. But not sure alternatives are really better. 
So, in this patch, I try to fix some issues related to calculation and usage of OffsetToFirstDefinition. The major one is that the OffsetToFirstDefinition is calculated as a distance between the variable's first definition address and scope's LowPC, which will be obviously wrong in cases like this

  DW_TAG_lexical_block
    DW_AT_ranges  (0x00000000
       [0x0000000000000016, 0x0000000000000020)
       [0x0000000000000183, 0x00000000000002f4))
  
    DW_TAG_variable
      DW_AT_location  (0x0000018e
         [0x0000000000000183,  0x0000000000000197): DW_OP_reg0 RAX)

where we'd say the whole scope of the variable is covered.


Repository:
  rL LLVM

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D69027/new/

https://reviews.llvm.org/D69027





More information about the llvm-commits mailing list