werat added a comment.

Pavel, thanks for review!

In D92223#2422184 <https://reviews.llvm.org/D92223#2422184>, @labath wrote:

> I am not sure if this is the right way to implement this feature. Changing 
> ManualDWARFIndex to provide this additional information is easy enough, but 
> it means that the other index classes will never be able to support this 
> functionality (without, essentially, reimplementing ManualDWARFIndex and 
> scanning all debug info). 
> ...
> I think it might be better to do something at the 
> `SymbolFileDWARF::FindGlobalVariables` level, so that it is common to all 
> indexes. For example, this function could (in case the normal search does not 
> provide any information) try to strip the last component of the name 
> (`foo::bar::baz` => `foo::bar`) and then try to look up the result as a class 
> (type). If it finds the type, it could then check it for the specific 
> (static) variable name.

This makes sense, let me try to implement this approach. A few questions before 
I jump into coding. Do you suggest to call `m_index->GetTypes` from 
`SymbolFileDWARF::FindGlobalVariables` and inspect the DIE for static members? 
Or use something more "high-level", e.g. `SymbolFileDWARF::FindTypes` and 
inspect the returned `lldb_private::Type` object? I had a brief look at `Type` 
and didn't find an easy way to get to static members there. Can you give me a 
pointer?

> I am also worried about the increase to the manual index size, as this would 
> mean that every occurrence of the DW_TAG_member would be placed in the index, 
> whereas now we only place the one which has a location (which is normally 
> just in a single compile unit).

Regarding the index size, we don't put ALL occurrences of `DW_TAG_member` in 
the index, only the ones with constant values. So it should be the same as if 
all these members had a location.



================
Comment at: lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp:3248
+      (parent_tag == DW_TAG_compile_unit || parent_tag == DW_TAG_partial_unit 
||
+       tag == DW_TAG_member) &&
+      (parent_context_die.Tag() == DW_TAG_class_type ||
----------------
labath wrote:
> Why is this needed. I would expect this to evaluate to `true` even without 
> this addition...
In case of `DW_TAG_member` parent_tag is 
`DW_TAG_class_type/DW_TAG_structure_type`, so this check doesn't pass.


================
Comment at: lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp:3270
     if ((parent_tag == DW_TAG_compile_unit ||
-         parent_tag == DW_TAG_partial_unit) &&
+         parent_tag == DW_TAG_partial_unit || tag == DW_TAG_member) &&
         Language::LanguageIsCPlusPlus(GetLanguage(*die.GetCU())))
----------------
labath wrote:
> Same here.
As as above, `parent_tag` for `DW_TAG_member` is 
`DW_TAG_class_type/DW_TAG_structure_type`


================
Comment at: lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp:3518
       if ((tag == DW_TAG_variable) || (tag == DW_TAG_constant) ||
+          (tag == DW_TAG_member) ||
           (tag == DW_TAG_formal_parameter && sc.function)) {
----------------
labath wrote:
> Why is this needed? I wouldn't expect a member inside a function...
I'm not sure I understand, wdym by "member inside a function"?  
`ParseVariables` is called directly from `FindGlobalVariables`, so as far as I 
understand it this check applies for processing global variables as well.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D92223

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

Reply via email to