From 56efcfa96917cff5b2c67d4ab8502755c9826693 Mon Sep 17 00:00:00 2001 From: Jeremy <51220084+jeremy-rifkin@users.noreply.github.com> Date: Tue, 28 May 2024 20:32:41 -0500 Subject: [PATCH] Setup a split resolver cache --- src/symbols/dwarf/dwarf_resolver.cpp | 31 +++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/src/symbols/dwarf/dwarf_resolver.cpp b/src/symbols/dwarf/dwarf_resolver.cpp index 7a9c8bc..7627cd6 100644 --- a/src/symbols/dwarf/dwarf_resolver.cpp +++ b/src/symbols/dwarf/dwarf_resolver.cpp @@ -93,6 +93,8 @@ namespace libdwarf { bool generated_cu_cache = false; // Map from CU -> {srcfiles, count} std::unordered_map> srcfiles_cache; + // Map from CU -> split full cu resolver + std::unordered_map> split_full_cu_resolvers; // info for resolving a dwo object optional skeleton; @@ -962,11 +964,30 @@ namespace libdwarf { // maybe default to dwo_name but for now not doing anything return; } - dwarf_resolver resolver( - path, - skeleton_info{cu_die.clone(), dwversion, *this} - ); - auto res = resolver.resolve_frame(object_frame_info); + // todo: slight inefficiency in this copy-back strategy due to other frame members + frame_with_inlines res; + if(get_cache_mode() == cache_mode::prioritize_memory) { + dwarf_resolver resolver( + 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( + 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); inlines = std::move(res.inlines); }