diff options
| author | Oleksiy Vyalov <ovyalov@google.com> | 2015-03-12 18:18:03 +0000 |
|---|---|---|
| committer | Oleksiy Vyalov <ovyalov@google.com> | 2015-03-12 18:18:03 +0000 |
| commit | eda270ee993181e49212332635c7cf8bb2784f71 (patch) | |
| tree | ef4548c4315fba1d9e553bcfa9925e1e7f5c3303 | |
| parent | 285dd51b7b416399b5171863432dab56968f1959 (diff) | |
| download | bcm5719-llvm-eda270ee993181e49212332635c7cf8bb2784f71.tar.gz bcm5719-llvm-eda270ee993181e49212332635c7cf8bb2784f71.zip | |
Make ModuleCache::Get to return instantiated ModuleSP instance so already created in-memory instance can be returned instead of creating a new one.
http://reviews.llvm.org/D8270
llvm-svn: 232075
| -rw-r--r-- | lldb/include/lldb/Target/Platform.h | 4 | ||||
| -rw-r--r-- | lldb/source/Target/Platform.cpp | 29 | ||||
| -rw-r--r-- | lldb/source/Utility/ModuleCache.cpp | 49 | ||||
| -rw-r--r-- | lldb/source/Utility/ModuleCache.h | 12 |
4 files changed, 46 insertions, 48 deletions
diff --git a/lldb/include/lldb/Target/Platform.h b/lldb/include/lldb/Target/Platform.h index 2519c63cb8f..31c8202129c 100644 --- a/lldb/include/lldb/Target/Platform.h +++ b/lldb/include/lldb/Target/Platform.h @@ -1134,8 +1134,8 @@ class ModuleCache; const FileSpec& dst_file_spec); bool - GetFileFromLocalCache (const ModuleSpec& module_spec, - FileSpec &cached_file_spec); + GetModuleFromLocalCache (const ModuleSpec& module_spec, + lldb::ModuleSP &module_sp); FileSpec GetModuleCacheRoot (); diff --git a/lldb/source/Target/Platform.cpp b/lldb/source/Target/Platform.cpp index 955ae66a87c..f5941706377 100644 --- a/lldb/source/Target/Platform.cpp +++ b/lldb/source/Target/Platform.cpp @@ -1756,22 +1756,12 @@ bool Platform::GetCachedSharedModule (const ModuleSpec &module_spec, lldb::ModuleSP &module_sp) { - FileSpec cached_file_spec; - if (m_module_cache && GetFileFromLocalCache (module_spec, cached_file_spec)) - { - auto cached_module_spec (module_spec); - cached_module_spec.GetFileSpec () = cached_file_spec; - cached_module_spec.GetPlatformFileSpec () = module_spec.GetFileSpec (); - module_sp.reset (new Module (cached_module_spec)); - - return true; - } - return false; + return (m_module_cache && GetModuleFromLocalCache (module_spec, module_sp)); } bool -Platform::GetFileFromLocalCache (const ModuleSpec& module_spec, - FileSpec &cached_file_spec) +Platform::GetModuleFromLocalCache (const ModuleSpec& module_spec, + lldb::ModuleSP &module_sp) { Log *log = GetLogIfAnyCategoriesSet (LIBLLDB_LOG_PLATFORM); @@ -1783,9 +1773,8 @@ Platform::GetFileFromLocalCache (const ModuleSpec& module_spec, // Check local cache for a module. auto error = m_module_cache->Get (GetModuleCacheRoot (), GetHostname (), - resolved_module_spec.GetUUID (), - resolved_module_spec.GetFileSpec (), - cached_file_spec); + resolved_module_spec, + module_sp); if (error.Success ()) return true; @@ -1825,8 +1814,7 @@ Platform::GetFileFromLocalCache (const ModuleSpec& module_spec, // Put downloaded file into local module cache. error = m_module_cache->Put (GetModuleCacheRoot (), GetHostname (), - resolved_module_spec.GetUUID (), - resolved_module_spec.GetFileSpec (), + resolved_module_spec, tmp_download_file_spec); if (error.Fail ()) { @@ -1839,9 +1827,8 @@ Platform::GetFileFromLocalCache (const ModuleSpec& module_spec, error = m_module_cache->Get (GetModuleCacheRoot (), GetHostname (), - resolved_module_spec.GetUUID (), - resolved_module_spec.GetFileSpec (), - cached_file_spec); + resolved_module_spec, + module_sp); return error.Success (); } diff --git a/lldb/source/Utility/ModuleCache.cpp b/lldb/source/Utility/ModuleCache.cpp index a58c5a87e50..3040e12f1d6 100644 --- a/lldb/source/Utility/ModuleCache.cpp +++ b/lldb/source/Utility/ModuleCache.cpp @@ -10,6 +10,7 @@ #include "ModuleCache.h" #include "lldb/Core/Module.h" +#include "lldb/Core/ModuleSpec.h" #include "lldb/Host/FileSystem.h" #include "llvm/Support/FileSystem.h" @@ -52,16 +53,15 @@ MakeDirectory (const FileSpec &dir_path) Error ModuleCache::Put (const FileSpec &root_dir_spec, const char *hostname, - const UUID &uuid, - const FileSpec &platform_module_spec, + const ModuleSpec &module_spec, const FileSpec &tmp_file) { - const auto module_spec_dir = GetModuleDirectory (root_dir_spec, uuid); + const auto module_spec_dir = GetModuleDirectory (root_dir_spec, module_spec.GetUUID ()); auto error = MakeDirectory (module_spec_dir); if (error.Fail ()) return error; - const auto module_file_path = JoinPath (module_spec_dir, platform_module_spec.GetFilename ().AsCString ()); + const auto module_file_path = JoinPath (module_spec_dir, module_spec.GetFileSpec ().GetFilename ().AsCString ()); const auto tmp_file_path = tmp_file.GetPath (); const auto err_code = llvm::sys::fs::copy_file (tmp_file_path.c_str (), module_file_path.GetPath ().c_str ()); @@ -74,36 +74,45 @@ ModuleCache::Put (const FileSpec &root_dir_spec, } // Create sysroot link to a module. - const auto sysroot_module_path_spec = GetHostSysRootModulePath (root_dir_spec, hostname, platform_module_spec); + const auto sysroot_module_path_spec = GetHostSysRootModulePath (root_dir_spec, hostname, module_spec.GetFileSpec ()); return CreateHostSysRootModuleSymLink (sysroot_module_path_spec, module_file_path); } Error ModuleCache::Get (const FileSpec &root_dir_spec, const char *hostname, - const UUID &uuid, - const FileSpec &platform_module_spec, - FileSpec &cached_module_spec) + const ModuleSpec &module_spec, + ModuleSP &cached_module_sp) { - cached_module_spec.Clear (); + const auto find_it = m_loaded_modules.find (module_spec.GetUUID ().GetAsString()); + if (find_it != m_loaded_modules.end ()) + { + cached_module_sp = (*find_it).second.lock (); + if (cached_module_sp) + return Error (); + m_loaded_modules.erase (find_it); + } - const auto module_spec_dir = GetModuleDirectory (root_dir_spec, uuid); - const auto module_file_path = JoinPath (module_spec_dir, platform_module_spec.GetFilename ().AsCString ()); + const auto module_spec_dir = GetModuleDirectory (root_dir_spec, module_spec.GetUUID ()); + const auto module_file_path = JoinPath (module_spec_dir, module_spec.GetFileSpec ().GetFilename ().AsCString ()); - Error error; if (!module_file_path.Exists ()) - { - error.SetErrorStringWithFormat ("module %s not found", module_file_path.GetPath ().c_str ()); - return error; - } - cached_module_spec = module_file_path; + return Error ("module %s not found", module_file_path.GetPath ().c_str ()); // We may have already cached module but downloaded from an another host - in this case let's create a symlink to it. - const auto sysroot_module_path_spec = GetHostSysRootModulePath (root_dir_spec, hostname, platform_module_spec); + const auto sysroot_module_path_spec = GetHostSysRootModulePath (root_dir_spec, hostname, module_spec.GetFileSpec ()); if (!sysroot_module_path_spec.Exists ()) - CreateHostSysRootModuleSymLink (sysroot_module_path_spec, cached_module_spec); + CreateHostSysRootModuleSymLink (sysroot_module_path_spec, module_spec.GetFileSpec ()); + + auto cached_module_spec (module_spec); + cached_module_spec.GetUUID ().Clear (); // Clear UUID since it may contain md5 content hash instead of real UUID. + cached_module_spec.GetFileSpec () = module_file_path; + cached_module_spec.GetPlatformFileSpec () = module_spec.GetFileSpec (); + cached_module_sp.reset (new Module (cached_module_spec)); + + m_loaded_modules.insert (std::make_pair (module_spec.GetUUID ().GetAsString (), cached_module_sp)); - return error; + return Error (); } FileSpec diff --git a/lldb/source/Utility/ModuleCache.h b/lldb/source/Utility/ModuleCache.h index 15bed9d88c7..61d7087f9ad 100644 --- a/lldb/source/Utility/ModuleCache.h +++ b/lldb/source/Utility/ModuleCache.h @@ -17,9 +17,11 @@ #include "lldb/Host/FileSpec.h" #include <string> +#include <unordered_map> namespace lldb_private { +class Module; class UUID; //---------------------------------------------------------------------- @@ -45,16 +47,14 @@ public: Error Put (const FileSpec &root_dir_spec, const char *hostname, - const UUID &uuid, - const FileSpec &platform_module_spec, + const ModuleSpec &module_spec, const FileSpec &tmp_file); Error Get (const FileSpec &root_dir_spec, const char *hostname, - const UUID &uuid, - const FileSpec &platform_module_spec, - FileSpec &cached_module_spec); + const ModuleSpec &module_spec, + lldb::ModuleSP &cached_module_sp); private: static FileSpec @@ -65,6 +65,8 @@ private: static Error CreateHostSysRootModuleSymLink (const FileSpec &sysroot_module_path_spec, const FileSpec &module_file_path); + + std::unordered_map<std::string, lldb::ModuleWP> m_loaded_modules; }; } // namespace lldb_private |

