labath added a comment.

In D110571#3033282 <https://reviews.llvm.org/D110571#3033282>, @jarin wrote:

> In D110571#3033078 <https://reviews.llvm.org/D110571#3033078>, @labath wrote:
>
>> Here's one more question. AIUI, lldb relies on the order of formal parameter 
>> declarations in dwarf to establish the the function signature (dwarf doesn't 
>> leave us much choice. This then affects how the function is printed in the 
>> backtrace, for instance. What will be the resulting order of arguments for 
>> these functions? I'm wondering if we don't need a two-pass algorithm, which 
>> first parses the arguments in the function declaration (to establish their 
>> order), and then do another pass over the concrete instance to fill in the 
>> missing information. (I'm sorry if you're doing this already, but I'm still 
>> too scared of the code to figure it out myself :P ).
>
> The code already does the merging. For DW_TAG_inlined_subroutine, it first 
> collects the formal_parameter list from from its abstract_origin and then it 
> will parse/insert all the missing one while parsing the concrete instance. 
> This will preserve the order of formal parameters. Now that I think about 
> this, it might add some formal parameters after local variables, but I hope 
> this is not a real problem for LLDB. If this is a problem, we could perhaps 
> flush the abstract formal parameters whenever we encounter DW_TAG_variable.

Cool. I see you're way ahead of me. If you're not careful you may end up as the 
dwarf maintainer. :P

>> In D110571#3032599 <https://reviews.llvm.org/D110571#3032599>, @jarin wrote:
>>
>>> From what you say, this is not the desired behavior? If we wanted two 
>>> instances of the variable (one for each block), we could change the 
>>> DIE-to-variable cache 
>>> <https://github.com/llvm/llvm-project/blob/47d66355ef9039a15b7265945e3deb331d7f9e05/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h#L324>
>>>  to be indexed by a pair <symbol-context-DIE, variable-DIE>.
>>
>> Given that was Greg's (and yours, kinda) reaction as well. I guess we should 
>> do something like that. Even if it does not cause problems now, it could 
>> certainly cause them in the future, if something starts relying on the 
>> symbol_context_scope link making sense.
>>
>> I am wondering about the best way to implement in though. Having a pair as a 
>> key seems very redundant to me. As we already know the block its going to 
>> end up in maybe we could somehow check if its already present there? Since 
>> blocks/functions don't generally have that many variables [citation needed], 
>> maybe even a simple iteration would suffice? (The situation is probably 
>> different for global variables, but those don't need the extra key.)
>
> Are you worried about code redundancy or memory redundancy?

A little bit of both, but I would mostly say its because "it doesn't feel 
right". However,

> I do not think a pair would be much extra code. If you are worried about 
> memory, we could also have a separate map for the abstract parameters - we 
> always know whether we are inserting an abstract parameter or a concrete one. 
> (I did not quite understand the idea with block lookup/iteration.)
>
> An interesting question is whether the caching is needed at all in the 
> context of functions - even without the cache, we should not parse block 
> variables multiple times because the variables are already cached in their 
> block's variable list. I actually verified that the cache never hits for 
> function scoped variables on the LLDB test suite (with and without this 
> patch). It does hit for global variables, but they take a different path now. 
> So how would you feel about bypassing the cache when parsing in the function 
> context? (I would basically move the caching code from 
> SymbolFileDWARF::ParseVariableDIE to 
> SymbolFileDWARF::ParseAndAppendGlobalVariable.)

this sounds like an excellent idea. Make the code correct by deleting it, and 
saving some memory in the process. :)



================
Comment at: lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h:396
+      const lldb::addr_t func_low_pc, lldb_private::VariableList 
&variable_list,
+      DIEVector &abstract_formal_parameters, size_t &abstract_parameter_index);
 
----------------
The correct thing to do (despite the weird-looking name) is for the function to 
take a `SmallVectorImpl<DWARFDIE> &` argument.


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