Setup a split resolver cache
This commit is contained in:
parent
6c43e376ed
commit
56efcfa969
@ -93,6 +93,8 @@ namespace libdwarf {
|
|||||||
bool generated_cu_cache = false;
|
bool generated_cu_cache = false;
|
||||||
// Map from CU -> {srcfiles, count}
|
// Map from CU -> {srcfiles, count}
|
||||||
std::unordered_map<Dwarf_Off, std::pair<char**, Dwarf_Signed>> srcfiles_cache;
|
std::unordered_map<Dwarf_Off, std::pair<char**, Dwarf_Signed>> srcfiles_cache;
|
||||||
|
// Map from CU -> split full cu resolver
|
||||||
|
std::unordered_map<Dwarf_Off, std::unique_ptr<dwarf_resolver>> split_full_cu_resolvers;
|
||||||
// info for resolving a dwo object
|
// info for resolving a dwo object
|
||||||
optional<skeleton_info> skeleton;
|
optional<skeleton_info> skeleton;
|
||||||
|
|
||||||
@ -962,11 +964,30 @@ namespace libdwarf {
|
|||||||
// maybe default to dwo_name but for now not doing anything
|
// maybe default to dwo_name but for now not doing anything
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
dwarf_resolver resolver(
|
// todo: slight inefficiency in this copy-back strategy due to other frame members
|
||||||
path,
|
frame_with_inlines res;
|
||||||
skeleton_info{cu_die.clone(), dwversion, *this}
|
if(get_cache_mode() == cache_mode::prioritize_memory) {
|
||||||
);
|
dwarf_resolver resolver(
|
||||||
auto res = resolver.resolve_frame(object_frame_info);
|
path,
|
||||||
|
skeleton_info{cu_die.clone(), dwversion, *this}
|
||||||
|
);
|
||||||
|
res = resolver.resolve_frame(object_frame_info);
|
||||||
|
} else {
|
||||||
|
auto off = cu_die.get_global_offset();
|
||||||
|
auto it = split_full_cu_resolvers.find(off);
|
||||||
|
if(it == split_full_cu_resolvers.end()) {
|
||||||
|
it = split_full_cu_resolvers.emplace(
|
||||||
|
off,
|
||||||
|
std::unique_ptr<dwarf_resolver>(
|
||||||
|
new dwarf_resolver(
|
||||||
|
path,
|
||||||
|
skeleton_info{cu_die.clone(), dwversion, *this}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
).first;
|
||||||
|
}
|
||||||
|
res = it->second->resolve_frame(object_frame_info);
|
||||||
|
}
|
||||||
frame = std::move(res.frame);
|
frame = std::move(res.frame);
|
||||||
inlines = std::move(res.inlines);
|
inlines = std::move(res.inlines);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user