aprantl marked an inline comment as done.
aprantl added inline comments.

================
Comment at: lldb/source/Plugins/SymbolFile/DWARF/AppleDWARFIndex.cpp:138-143
   } else if (has_tag) {
     if (log)
       m_module.LogMessage(log, "FindByNameAndTag()");
     m_apple_types_up->FindByNameAndTag(type_name.GetStringRef(), tag, offsets);
   } else
     m_apple_types_up->FindByName(type_name.GetStringRef(), offsets);
----------------
clayborg wrote:
> We can probably move your code above to here:
> ```
>   } else {
>     if (context.GetSize() > 1) && (context[1].tag == DW_TAG_class_type ||
>                                    context[1].tag == DW_TAG_structure_type)) {
>       DIEArray class_matches;
>       m_apple_types_up->FindByName(context[1].name, class_matches);
>       if (class_matches.empty())
>         return;
>     }
>     if (has_tag) {
>       if (log)
>         m_module.LogMessage(log, "FindByNameAndTag()");
>       m_apple_types_up->FindByNameAndTag(type_name.GetStringRef(), tag, 
> offsets);
>     } else
>       m_apple_types_up->FindByName(type_name.GetStringRef(), offsets);
>   }
> ```
> 
> Or better yet:
> ```
>  } else {
>     if (has_tag) {
>       if (log)
>         m_module.LogMessage(log, "FindByNameAndTag()");
>       m_apple_types_up->FindByNameAndTag(type_name.GetStringRef(), tag, 
> offsets);
>     } else
>       m_apple_types_up->FindByName(type_name.GetStringRef(), offsets);
>     // If we have too many matches, we might want to ensure that the context
>     // that this type is contained in actually exists so we don't end up 
> pulling 
>     // in too much DWARF for common type like "iterator".
>     if (offsets.size() > THRESHOLD) {
>       if (context.GetSize() > 1) && (context[1].tag == DW_TAG_class_type ||
>                                      context[1].tag == 
> DW_TAG_structure_type)) {
>         DIEArray class_matches;
>         m_apple_types_up->FindByName(context[1].name, class_matches);
>         if (class_matches.empty()) {
>           offsets.clear();
>           return;
>         }
>       }
>     }
>   }
> ```
> 
> We might also be able to remove some offsets from "offsets" by iterating 
> through "offsets" and removing any values that come before an entry in 
> "class_matches". For example if offsets contains:
> ```
> offsets = [0x1100, 0x2100, 0x3100, 0x4100]
> ```
> and
> ```
> class_offsets = [0x4000]
> ```
> could we remove "[0x1100, 0x2100, 0x3100]" from offsets? Maybe not with 
> DW_AT_specification and DW_AT_abstract_origin?
Moving the code into the `else` (first suggestion) is equivalent, but may be 
more obvious to read. Thanks.

The second suggestions is not a clear win to me. The point of this patch is to 
eliminate entire .o files quickly that don't have the parent class type in it, 
in order to avoid extracting type DIEs for matches. The assumption here is that 
an accelerator table lookup is much cheaper than extracting a DIE. I believe 
the threshold is 1.

I also learned to never make assumptions about performance, so here are some 
numbers for my clang benchmark:

```
original: 8.7s
this patch: 5.9s
threshold 100: 6.5s
threshold  50: 6.5s
threshold  25: 6.5s
threshold  12: 6.4s
threshold   6: 6.4s
threshold   3: 6.4s
threshold   1: 6.5s
```



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

https://reviews.llvm.org/D68678



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

Reply via email to