summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOleksiy Vyalov <ovyalov@google.com>2015-03-24 23:45:49 +0000
committerOleksiy Vyalov <ovyalov@google.com>2015-03-24 23:45:49 +0000
commit037f6b9c0f52ed46882ec8800a6c3aeff3a84d35 (patch)
treeca9a1f2c4d69a5115a61ead93c5756f7c6742e6e
parent6ba3831ebeb147823e7ef0b62a42b558cbafc3da (diff)
downloadbcm5719-llvm-037f6b9c0f52ed46882ec8800a6c3aeff3a84d35.tar.gz
bcm5719-llvm-037f6b9c0f52ed46882ec8800a6c3aeff3a84d35.zip
Fix ModuleCache usage in Platform - ask remote platform for module's ModuleSpec beforehand so we can look for a module by UUID locally without need to download it.
http://reviews.llvm.org/D8557 llvm-svn: 233136
-rw-r--r--lldb/include/lldb/Target/Platform.h28
-rw-r--r--lldb/source/Target/Platform.cpp123
-rw-r--r--lldb/source/Utility/ModuleCache.cpp5
-rw-r--r--lldb/source/Utility/ModuleCache.h3
4 files changed, 92 insertions, 67 deletions
diff --git a/lldb/include/lldb/Target/Platform.h b/lldb/include/lldb/Target/Platform.h
index 4e710559774..55e91f027b5 100644
--- a/lldb/include/lldb/Target/Platform.h
+++ b/lldb/include/lldb/Target/Platform.h
@@ -12,6 +12,7 @@
// C Includes
// C++ Includes
+#include <functional>
#include <map>
#include <memory>
#include <string>
@@ -1130,31 +1131,36 @@ class ModuleCache;
const FileSpecList *module_search_paths_ptr,
Platform &remote_platform);
- bool
- GetCachedSharedModule (const ModuleSpec &module_spec,
- Process* process,
- lldb::ModuleSP &module_sp);
-
Error
DownloadModuleSlice (const FileSpec& src_file_spec,
const uint64_t src_offset,
const uint64_t src_size,
const FileSpec& dst_file_spec);
- bool
- GetModuleFromLocalCache (const ModuleSpec& module_spec,
- Process* process,
- lldb::ModuleSP &module_sp);
+ private:
+ typedef std::function<Error (const ModuleSpec &)> ModuleResolver;
+
+ Error
+ GetRemoteSharedModule (const ModuleSpec &module_spec,
+ Process* process,
+ lldb::ModuleSP &module_sp,
+ const ModuleResolver &module_resolver,
+ bool *did_create_ptr);
- FileSpec GetModuleCacheRoot ();
+ bool
+ GetCachedSharedModule (const ModuleSpec& module_spec,
+ lldb::ModuleSP &module_sp,
+ bool *did_create_ptr);
- private:
Error
LoadCachedExecutable (const ModuleSpec &module_spec,
lldb::ModuleSP &module_sp,
const FileSpecList *module_search_paths_ptr,
Platform &remote_platform);
+ FileSpec
+ GetModuleCacheRoot ();
+
DISALLOW_COPY_AND_ASSIGN (Platform);
};
diff --git a/lldb/source/Target/Platform.cpp b/lldb/source/Target/Platform.cpp
index 671ebf071da..d5a61f0ecdb 100644
--- a/lldb/source/Target/Platform.cpp
+++ b/lldb/source/Target/Platform.cpp
@@ -253,23 +253,23 @@ Platform::GetSharedModule (const ModuleSpec &module_spec,
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, process, 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,
+ process,
+ 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
@@ -1779,66 +1779,80 @@ Platform::LoadCachedExecutable (const ModuleSpec &module_spec,
const FileSpecList *module_search_paths_ptr,
Platform &remote_platform)
{
- if (GetGlobalPlatformProperties ()->GetUseModuleCache ())
- {
- if (GetCachedSharedModule (module_spec, nullptr, module_sp))
- return Error ();
- }
-
- return remote_platform.ResolveExecutable (module_spec,
- module_sp,
- module_search_paths_ptr);
+ return GetRemoteSharedModule (module_spec,
+ nullptr,
+ module_sp,
+ [&](const ModuleSpec &spec)
+ {
+ return remote_platform.ResolveExecutable (
+ spec, module_sp, module_search_paths_ptr);
+ },
+ nullptr);
}
-bool
-Platform::GetCachedSharedModule (const ModuleSpec &module_spec,
+Error
+Platform::GetRemoteSharedModule (const ModuleSpec &module_spec,
Process* process,
- lldb::ModuleSP &module_sp)
-{
- return (m_module_cache && GetModuleFromLocalCache (module_spec, process, module_sp));
-}
-
-bool
-Platform::GetModuleFromLocalCache (const ModuleSpec& module_spec,
- Process* process,
- lldb::ModuleSP &module_sp)
+ lldb::ModuleSP &module_sp,
+ const ModuleResolver &module_resolver,
+ bool *did_create_ptr)
{
- Log *log = GetLogIfAnyCategoriesSet (LIBLLDB_LOG_PLATFORM);
-
-
+ // Get module information from a target.
ModuleSpec resolved_module_spec;
bool got_module_spec = false;
-
if (process)
{
// Try to get module information from the process
if (process->GetModuleSpec (module_spec.GetFileSpec (), module_spec.GetArchitecture (), resolved_module_spec))
- got_module_spec = true;
+ got_module_spec = true;
}
if (!got_module_spec)
{
// Get module information from a target.
if (!GetModuleSpec (module_spec.GetFileSpec (), module_spec.GetArchitecture (), resolved_module_spec))
- return false;
+ 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 (resolved_module_spec, module_sp, did_create_ptr))
+ return Error ();
+ }
+
+ return error;
+}
+
+bool
+Platform::GetCachedSharedModule (const ModuleSpec &module_spec,
+ lldb::ModuleSP &module_sp,
+ bool *did_create_ptr)
+{
+ if (IsHost() ||
+ !GetGlobalPlatformProperties ()->GetUseModuleCache ())
+ return false;
+
+ Log *log = GetLogIfAnyCategoriesSet (LIBLLDB_LOG_PLATFORM);
+
// 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<PATH_MAX> 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)
@@ -1851,9 +1865,9 @@ Platform::GetModuleFromLocalCache (const ModuleSpec& module_spec,
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 ())
{
@@ -1867,21 +1881,22 @@ Platform::GetModuleFromLocalCache (const ModuleSpec& module_spec,
// 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 ();
}
diff --git a/lldb/source/Utility/ModuleCache.cpp b/lldb/source/Utility/ModuleCache.cpp
index 3040e12f1d6..41b99bb3f96 100644
--- a/lldb/source/Utility/ModuleCache.cpp
+++ b/lldb/source/Utility/ModuleCache.cpp
@@ -82,7 +82,8 @@ Error
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 @@ ModuleCache::Get (const FileSpec &root_dir_spec,
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));
diff --git a/lldb/source/Utility/ModuleCache.h b/lldb/source/Utility/ModuleCache.h
index 61d7087f9ad..edab6cbb29d 100644
--- a/lldb/source/Utility/ModuleCache.h
+++ b/lldb/source/Utility/ModuleCache.h
@@ -54,7 +54,8 @@ public:
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
OpenPOWER on IntegriCloud