[Lldb-commits] [PATCH] D68678: Speed up accelerator table lookups
Greg Clayton via Phabricator via lldb-commits
lldb-commits at lists.llvm.org
Thu Oct 10 09:18:09 PDT 2019
clayborg added a comment.
So now we are doing two lookups each time we are doing a lookup? One idea to improve upon this would be to do this search a bit later on after we lookup "iterator" and only do this extra context matching if we find at last a certain number of results? So the flow would go:
- do normal lookup on "iterator" and find N matches
- if N is large enough then do your search above?
See inline code for an example of a possible improvement
================
Comment at: lldb/source/Plugins/SymbolFile/DWARF/AppleDWARFIndex.cpp:114
// When searching for a scoped type (for exampe,
// "std::vector<int>::const_iterator") searching for the innermost
----------------
s/exampe/example/
================
Comment at: lldb/source/Plugins/SymbolFile/DWARF/AppleDWARFIndex.cpp:120-127
+ if (!has_qualified_name_hash && (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;
----------------
This should probably be moved down into line 139 and 143 instead of checking "if (! has_qualified_name_hash..."? See inline comments below.
================
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);
----------------
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?
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D68678/new/
https://reviews.llvm.org/D68678
More information about the lldb-commits
mailing list