Index: include/lldb/Target/Platform.h =================================================================== --- include/lldb/Target/Platform.h +++ include/lldb/Target/Platform.h @@ -12,6 +12,7 @@ // C Includes // C++ Includes +#include #include #include #include @@ -1128,10 +1129,14 @@ lldb::ModuleSP &module_sp, const FileSpecList *module_search_paths_ptr, Platform &remote_platform); + private: + typedef std::function ModuleResolver; - bool - GetCachedSharedModule (const ModuleSpec &module_spec, - lldb::ModuleSP &module_sp); + Error + GetRemoteSharedModule (const ModuleSpec &module_spec, + lldb::ModuleSP &module_sp, + const ModuleResolver &module_resolver, + bool *did_create_ptr); Error DownloadModuleSlice (const FileSpec& src_file_spec, @@ -1140,12 +1145,13 @@ const FileSpec& dst_file_spec); bool - GetModuleFromLocalCache (const ModuleSpec& module_spec, - lldb::ModuleSP &module_sp); + GetCachedSharedModule (const ModuleSpec& module_spec, + lldb::ModuleSP &module_sp, + bool *did_create_ptr); - FileSpec GetModuleCacheRoot (); + FileSpec + GetModuleCacheRoot (); - private: Error LoadCachedExecutable (const ModuleSpec &module_spec, lldb::ModuleSP &module_sp, Index: source/Target/Platform.cpp =================================================================== --- source/Target/Platform.cpp +++ source/Target/Platform.cpp @@ -252,23 +252,22 @@ ModuleSP *old_module_sp_ptr, bool *did_create_ptr) { - if (!IsHost () && GetGlobalPlatformProperties ()->GetUseModuleCache ()) - { - // Use caching only when talking to a remote platform. - if (GetCachedSharedModule (module_spec, module_sp)) - { - if (did_create_ptr) - *did_create_ptr = true; - - return Error (); - } - } - return ModuleList::GetSharedModule (module_spec, - module_sp, - module_search_paths_ptr, - old_module_sp_ptr, - did_create_ptr, - false); + if (IsHost ()) + return ModuleList::GetSharedModule (module_spec, + module_sp, + module_search_paths_ptr, + old_module_sp_ptr, + did_create_ptr, + false); + + return GetRemoteSharedModule (module_spec, + module_sp, + [&](const ModuleSpec &spec) + { + return ModuleList::GetSharedModule ( + spec, module_sp, module_search_paths_ptr, old_module_sp_ptr, did_create_ptr, false); + }, + did_create_ptr); } bool @@ -1778,51 +1777,66 @@ const FileSpecList *module_search_paths_ptr, Platform &remote_platform) { - if (GetGlobalPlatformProperties ()->GetUseModuleCache ()) + return GetRemoteSharedModule (module_spec, + module_sp, + [&](const ModuleSpec &spec) + { + return remote_platform.ResolveExecutable ( + spec, module_sp, module_search_paths_ptr); + }, + nullptr); +} + +Error +Platform::GetRemoteSharedModule (const ModuleSpec &module_spec, + lldb::ModuleSP &module_sp, + const ModuleResolver &module_resolver, + bool *did_create_ptr) +{ + // Get module information from a target. + ModuleSpec resolved_module_spec; + if (!GetModuleSpec (module_spec.GetFileSpec (), module_spec.GetArchitecture (), resolved_module_spec)) + return module_resolver (module_spec); + + // Trying to find a module by UUID on local file system. + const auto error = module_resolver (resolved_module_spec); + if (error.Fail ()) { - if (GetCachedSharedModule (module_spec, module_sp)) + if (GetCachedSharedModule (resolved_module_spec, module_sp, did_create_ptr)) return Error (); } - return remote_platform.ResolveExecutable (module_spec, - module_sp, - module_search_paths_ptr); + return error; } bool -Platform::GetCachedSharedModule (const ModuleSpec &module_spec, - lldb::ModuleSP &module_sp) +Platform::GetCachedSharedModule (const ModuleSpec& module_spec, + lldb::ModuleSP &module_sp, + bool *did_create_ptr) { - return (m_module_cache && GetModuleFromLocalCache (module_spec, module_sp)); -} + if (IsHost() || + !GetGlobalPlatformProperties ()->GetUseModuleCache ()) + return false; -bool -Platform::GetModuleFromLocalCache (const ModuleSpec& module_spec, - lldb::ModuleSP &module_sp) -{ Log *log = GetLogIfAnyCategoriesSet (LIBLLDB_LOG_PLATFORM); - // Get module information from a target. - ModuleSpec resolved_module_spec; - if (!GetModuleSpec (module_spec.GetFileSpec (), module_spec.GetArchitecture (), resolved_module_spec)) - return false; - // Check local cache for a module. auto error = m_module_cache->Get (GetModuleCacheRoot (), GetHostname (), - resolved_module_spec, - module_sp); + module_spec, + module_sp, + did_create_ptr); if (error.Success ()) return true; if (log) log->Printf("Platform::%s - module %s not found in local cache: %s", - __FUNCTION__, resolved_module_spec.GetUUID ().GetAsString ().c_str (), error.AsCString ()); + __FUNCTION__, module_spec.GetUUID ().GetAsString ().c_str (), error.AsCString ()); // Get temporary file name for a downloaded module. llvm::SmallString tmp_download_file_path; const auto err_code = llvm::sys::fs::createTemporaryFile ( - "lldb", resolved_module_spec.GetUUID ().GetAsString ().c_str (), tmp_download_file_path); + "lldb", module_spec.GetUUID ().GetAsString ().c_str (), tmp_download_file_path); if (err_code) { if (log) @@ -1835,9 +1849,9 @@ const FileSpec tmp_download_file_spec (tmp_download_file_path.c_str (), true); // Download a module file. - error = DownloadModuleSlice (resolved_module_spec.GetFileSpec (), - resolved_module_spec.GetObjectOffset (), - resolved_module_spec.GetObjectSize (), + error = DownloadModuleSlice (module_spec.GetFileSpec (), + module_spec.GetObjectOffset (), + module_spec.GetObjectSize (), tmp_download_file_spec); if (error.Fail ()) { @@ -1851,21 +1865,22 @@ // Put downloaded file into local module cache. error = m_module_cache->Put (GetModuleCacheRoot (), GetHostname (), - resolved_module_spec, + module_spec, tmp_download_file_spec); if (error.Fail ()) { if (log) log->Printf("Platform::%s - failed to put module %s into cache: %s", - __FUNCTION__, resolved_module_spec.GetUUID ().GetAsString ().c_str (), + __FUNCTION__, module_spec.GetUUID ().GetAsString ().c_str (), error.AsCString ()); return false; } error = m_module_cache->Get (GetModuleCacheRoot (), GetHostname (), - resolved_module_spec, - module_sp); + module_spec, + module_sp, + did_create_ptr); return error.Success (); } Index: source/Utility/ModuleCache.h =================================================================== --- source/Utility/ModuleCache.h +++ source/Utility/ModuleCache.h @@ -54,7 +54,8 @@ Get (const FileSpec &root_dir_spec, const char *hostname, const ModuleSpec &module_spec, - lldb::ModuleSP &cached_module_sp); + lldb::ModuleSP &cached_module_sp, + bool *did_create_ptr); private: static FileSpec Index: source/Utility/ModuleCache.cpp =================================================================== --- source/Utility/ModuleCache.cpp +++ source/Utility/ModuleCache.cpp @@ -82,7 +82,8 @@ ModuleCache::Get (const FileSpec &root_dir_spec, const char *hostname, const ModuleSpec &module_spec, - ModuleSP &cached_module_sp) + ModuleSP &cached_module_sp, + bool *did_create_ptr) { const auto find_it = m_loaded_modules.find (module_spec.GetUUID ().GetAsString()); if (find_it != m_loaded_modules.end ()) @@ -109,6 +110,8 @@ cached_module_spec.GetFileSpec () = module_file_path; cached_module_spec.GetPlatformFileSpec () = module_spec.GetFileSpec (); cached_module_sp.reset (new Module (cached_module_spec)); + if (did_create_ptr) + *did_create_ptr = true; m_loaded_modules.insert (std::make_pair (module_spec.GetUUID ().GetAsString (), cached_module_sp));