From 4291174fb97c62d91e83e95f96ffb6deb0a1d295 Mon Sep 17 00:00:00 2001 From: oga-sven Date: Fri, 3 Jul 2026 01:06:18 +0200 Subject: [PATCH] Optimize `resolve_call_target` with caching and update CMake dependencies for improved build consistency. --- cmake/AugmentManifest.cmake | 4 ++-- src/runtime/closure.cpp | 19 +++++++++++++------ 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/cmake/AugmentManifest.cmake b/cmake/AugmentManifest.cmake index de8d8af..eebc10b 100644 --- a/cmake/AugmentManifest.cmake +++ b/cmake/AugmentManifest.cmake @@ -173,7 +173,7 @@ function(augment_manifest) OUTPUT "${_agmf_out}" "${_json_out}" COMMAND dsymutil "${_target_bin}" -o "${_dbg}" COMMAND ${_phase2_cmd} "--binary" "${_dbg}" - DEPENDS "${_target_bin}" + DEPENDS "${_target_bin}" "${_ast_manifest}" COMMENT "augment: phase2 RVA extraction + pack for ${AM_TARGET}" USES_TERMINAL VERBATIM @@ -188,7 +188,7 @@ function(augment_manifest) OUTPUT "${_agmf_out}" "${_json_out}" COMMAND ${_phase2_cmd} ${_strip_cmd} - DEPENDS "${_target_bin}" + DEPENDS "${_target_bin}" "${_ast_manifest}" COMMENT "augment: phase2 RVA extraction + pack for ${AM_TARGET}" USES_TERMINAL VERBATIM diff --git a/src/runtime/closure.cpp b/src/runtime/closure.cpp index 3f46417..ee0dcf8 100644 --- a/src/runtime/closure.cpp +++ b/src/runtime/closure.cpp @@ -220,12 +220,19 @@ extern "C" AUGMENT_API void* augment_make_closure(const char* symbol) { } static void* resolve_call_target(const char* symbol) { - if (void* fn = augment::plat::sym_resolve(symbol)) - return fn; - uint64_t rva = augment::manifest::global_reader().rva_of(symbol); - if (!rva) - return nullptr; - return reinterpret_cast((uintptr_t)((intptr_t)rva + augment::plat::image_slide())); + static std::unordered_map s_cache; + auto it = s_cache.find(symbol); + if (it != s_cache.end()) + return it->second; + + void* fn = nullptr; + if (uint64_t rva = augment::manifest::global_reader().rva_of(symbol)) { + fn = reinterpret_cast((uintptr_t)((intptr_t)rva + augment::plat::image_slide())); + } else if (void* p = augment::plat::sym_resolve(symbol)) { + fn = p; + } + s_cache.emplace(symbol, fn); + return fn; } extern "C" AUGMENT_API int augment_call(const char* symbol, void** args, unsigned nargs,