jarin added a comment.

First of all, thank you, Greg and Pavel, for all the great feedback and 
discussion. I have followed all your suggestions (use plain method, use `image 
lookup`, added the additional tests). I have also packaged the C test, but as 
Greg notes I am not convinced it will keep testing what it's supposed to.

Now, let me answer the question regarding the context:

In D110571#3030913 <https://reviews.llvm.org/D110571#3030913>, @clayborg wrote:

> LLDB doesn't parse function definitions that have no low/high PC into 
> lldb_private::Function with lldb_private::Block objects, it only does this 
> for instances of functions with address ranges.
>
> I would expect that the SymbolContextScope (one pointer that can identify the 
> SymbolContext) for each variable parsed by ParseVariableDIE to point to the 
> DW_TAG_variable that is in the function with the address range. Are you 
> saying that the symbol context points to the definition?

With this change, the symbol context for unused parameters points to one of the 
concrete inlined function block (DW_TAG_inlined_subroutine). That concrete 
inlined function will not contain that formal parameter because after the clang 
change https://reviews.llvm.org/D95617, unused formal parameters are deleted 
from their concrete inlined functions (i.e., from their 
DW_TAG_inlined_subroutine).

The point here is that if a function is inlined into two places, i.e., there 
are two corresponding DW_TAG_inlined_subroutines for the inlined function, we 
still create just one instance of Variable and its symbol context will be one 
randomly chosen DW_TAG_inlined_subroutine.

As Pavel suggested, an alternative would be creating one Variable instance per 
DW_TAG_inlined_subroutine. That would require some changes to other data 
structures because the existing code assumes there is just one Variable for 
each DIE (see SymbolFileDWARF::GetDIEToVariable).

For illustration:

  0x100  DW_TAG_subprogram
           DW_AT_name "inlined_function"
           ... no DW_AT_low_pc here ...
  0x110    DW_TAG_formal_parameter
             DW_AT_name "unused"
             ...
         ...
  0x200  DW_TAG_subprogram
           DW_AT_name    ("top_level_function_with_address"
           DW_AT_low_pc  (0x3000)
           DW_AT_high_pc  (0x3100)
           ...
  0x210    DW_TAG_inlined_subroutine
             DW_AT_abstract_origin (0x100 "inlined_function")
             DW_AT_low_pc  (0x3010)
             DW_AT_high_pc  (0x3020)
             # Note the missing DW_TAG_formal_parameter here!
           NULL
         ...
  0x400  DW_TAG_subprogram
           DW_AT_name    ("another_top_level_function_with_address"
           DW_AT_low_pc  (0x5000)
           DW_AT_high_pc  (0x5100)
           ...
  0x410    DW_TAG_inlined_subroutine
             DW_AT_abstract_origin (0x100 "inlined_function")
             DW_AT_low_pc  (0x5030)
             DW_AT_high_pc  (0x5040)
             # Note the missing DW_TAG_formal_parameter here!
           NULL
         ...

Here, we will create just one variable for the formal parameter "unused" (DIE 
offset 0x110). That variable's symbol context will be randomly one of the 
DW_TAG_inline subroutine blocks (either 0x210 or 0x410), and the variable will 
be inserted into two variable lists, one for the Block associated with the DIE 
at 0x210 and one for DIE associated with 0x410.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D110571

_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to