summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOleksiy Vyalov <ovyalov@google.com>2015-03-12 18:18:03 +0000
committerOleksiy Vyalov <ovyalov@google.com>2015-03-12 18:18:03 +0000
commiteda270ee993181e49212332635c7cf8bb2784f71 (patch)
treeef4548c4315fba1d9e553bcfa9925e1e7f5c3303
parent285dd51b7b416399b5171863432dab56968f1959 (diff)
downloadbcm5719-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.h4
-rw-r--r--lldb/source/Target/Platform.cpp29
-rw-r--r--lldb/source/Utility/ModuleCache.cpp49
-rw-r--r--lldb/source/Utility/ModuleCache.h12
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
OpenPOWER on IntegriCloud