Skip to content

Commit 037f6b9

Browse files
committedMar 24, 2015
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
1 parent 6ba3831 commit 037f6b9

File tree

4 files changed

+92
-67
lines changed

4 files changed

+92
-67
lines changed
 

‎lldb/include/lldb/Target/Platform.h

+17-11
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
// C Includes
1414
// C++ Includes
15+
#include <functional>
1516
#include <map>
1617
#include <memory>
1718
#include <string>
@@ -1130,31 +1131,36 @@ class ModuleCache;
11301131
const FileSpecList *module_search_paths_ptr,
11311132
Platform &remote_platform);
11321133

1133-
bool
1134-
GetCachedSharedModule (const ModuleSpec &module_spec,
1135-
Process* process,
1136-
lldb::ModuleSP &module_sp);
1137-
11381134
Error
11391135
DownloadModuleSlice (const FileSpec& src_file_spec,
11401136
const uint64_t src_offset,
11411137
const uint64_t src_size,
11421138
const FileSpec& dst_file_spec);
11431139

1144-
bool
1145-
GetModuleFromLocalCache (const ModuleSpec& module_spec,
1146-
Process* process,
1147-
lldb::ModuleSP &module_sp);
1140+
private:
1141+
typedef std::function<Error (const ModuleSpec &)> ModuleResolver;
1142+
1143+
Error
1144+
GetRemoteSharedModule (const ModuleSpec &module_spec,
1145+
Process* process,
1146+
lldb::ModuleSP &module_sp,
1147+
const ModuleResolver &module_resolver,
1148+
bool *did_create_ptr);
11481149

1149-
FileSpec GetModuleCacheRoot ();
1150+
bool
1151+
GetCachedSharedModule (const ModuleSpec& module_spec,
1152+
lldb::ModuleSP &module_sp,
1153+
bool *did_create_ptr);
11501154

1151-
private:
11521155
Error
11531156
LoadCachedExecutable (const ModuleSpec &module_spec,
11541157
lldb::ModuleSP &module_sp,
11551158
const FileSpecList *module_search_paths_ptr,
11561159
Platform &remote_platform);
11571160

1161+
FileSpec
1162+
GetModuleCacheRoot ();
1163+
11581164
DISALLOW_COPY_AND_ASSIGN (Platform);
11591165
};
11601166

‎lldb/source/Target/Platform.cpp

+69-54
Original file line numberDiff line numberDiff line change
@@ -253,23 +253,23 @@ Platform::GetSharedModule (const ModuleSpec &module_spec,
253253
ModuleSP *old_module_sp_ptr,
254254
bool *did_create_ptr)
255255
{
256-
if (!IsHost () && GetGlobalPlatformProperties ()->GetUseModuleCache ())
257-
{
258-
// Use caching only when talking to a remote platform.
259-
if (GetCachedSharedModule (module_spec, process, module_sp))
260-
{
261-
if (did_create_ptr)
262-
*did_create_ptr = true;
263-
264-
return Error ();
265-
}
266-
}
267-
return ModuleList::GetSharedModule (module_spec,
268-
module_sp,
269-
module_search_paths_ptr,
270-
old_module_sp_ptr,
271-
did_create_ptr,
272-
false);
256+
if (IsHost ())
257+
return ModuleList::GetSharedModule (module_spec,
258+
module_sp,
259+
module_search_paths_ptr,
260+
old_module_sp_ptr,
261+
did_create_ptr,
262+
false);
263+
264+
return GetRemoteSharedModule (module_spec,
265+
process,
266+
module_sp,
267+
[&](const ModuleSpec &spec)
268+
{
269+
return ModuleList::GetSharedModule (
270+
spec, module_sp, module_search_paths_ptr, old_module_sp_ptr, did_create_ptr, false);
271+
},
272+
did_create_ptr);
273273
}
274274

275275
bool
@@ -1779,66 +1779,80 @@ Platform::LoadCachedExecutable (const ModuleSpec &module_spec,
17791779
const FileSpecList *module_search_paths_ptr,
17801780
Platform &remote_platform)
17811781
{
1782-
if (GetGlobalPlatformProperties ()->GetUseModuleCache ())
1783-
{
1784-
if (GetCachedSharedModule (module_spec, nullptr, module_sp))
1785-
return Error ();
1786-
}
1787-
1788-
return remote_platform.ResolveExecutable (module_spec,
1789-
module_sp,
1790-
module_search_paths_ptr);
1782+
return GetRemoteSharedModule (module_spec,
1783+
nullptr,
1784+
module_sp,
1785+
[&](const ModuleSpec &spec)
1786+
{
1787+
return remote_platform.ResolveExecutable (
1788+
spec, module_sp, module_search_paths_ptr);
1789+
},
1790+
nullptr);
17911791
}
17921792

1793-
bool
1794-
Platform::GetCachedSharedModule (const ModuleSpec &module_spec,
1793+
Error
1794+
Platform::GetRemoteSharedModule (const ModuleSpec &module_spec,
17951795
Process* process,
1796-
lldb::ModuleSP &module_sp)
1797-
{
1798-
return (m_module_cache && GetModuleFromLocalCache (module_spec, process, module_sp));
1799-
}
1800-
1801-
bool
1802-
Platform::GetModuleFromLocalCache (const ModuleSpec& module_spec,
1803-
Process* process,
1804-
lldb::ModuleSP &module_sp)
1796+
lldb::ModuleSP &module_sp,
1797+
const ModuleResolver &module_resolver,
1798+
bool *did_create_ptr)
18051799
{
1806-
Log *log = GetLogIfAnyCategoriesSet (LIBLLDB_LOG_PLATFORM);
1807-
1808-
1800+
// Get module information from a target.
18091801
ModuleSpec resolved_module_spec;
18101802
bool got_module_spec = false;
1811-
18121803
if (process)
18131804
{
18141805
// Try to get module information from the process
18151806
if (process->GetModuleSpec (module_spec.GetFileSpec (), module_spec.GetArchitecture (), resolved_module_spec))
1816-
got_module_spec = true;
1807+
got_module_spec = true;
18171808
}
18181809

18191810
if (!got_module_spec)
18201811
{
18211812
// Get module information from a target.
18221813
if (!GetModuleSpec (module_spec.GetFileSpec (), module_spec.GetArchitecture (), resolved_module_spec))
1823-
return false;
1814+
return module_resolver (module_spec);
18241815
}
18251816

1817+
// Trying to find a module by UUID on local file system.
1818+
const auto error = module_resolver (resolved_module_spec);
1819+
if (error.Fail ())
1820+
{
1821+
if (GetCachedSharedModule (resolved_module_spec, module_sp, did_create_ptr))
1822+
return Error ();
1823+
}
1824+
1825+
return error;
1826+
}
1827+
1828+
bool
1829+
Platform::GetCachedSharedModule (const ModuleSpec &module_spec,
1830+
lldb::ModuleSP &module_sp,
1831+
bool *did_create_ptr)
1832+
{
1833+
if (IsHost() ||
1834+
!GetGlobalPlatformProperties ()->GetUseModuleCache ())
1835+
return false;
1836+
1837+
Log *log = GetLogIfAnyCategoriesSet (LIBLLDB_LOG_PLATFORM);
1838+
18261839
// Check local cache for a module.
18271840
auto error = m_module_cache->Get (GetModuleCacheRoot (),
18281841
GetHostname (),
1829-
resolved_module_spec,
1830-
module_sp);
1842+
module_spec,
1843+
module_sp,
1844+
did_create_ptr);
18311845
if (error.Success ())
18321846
return true;
18331847

18341848
if (log)
18351849
log->Printf("Platform::%s - module %s not found in local cache: %s",
1836-
__FUNCTION__, resolved_module_spec.GetUUID ().GetAsString ().c_str (), error.AsCString ());
1850+
__FUNCTION__, module_spec.GetUUID ().GetAsString ().c_str (), error.AsCString ());
18371851

18381852
// Get temporary file name for a downloaded module.
18391853
llvm::SmallString<PATH_MAX> tmp_download_file_path;
18401854
const auto err_code = llvm::sys::fs::createTemporaryFile (
1841-
"lldb", resolved_module_spec.GetUUID ().GetAsString ().c_str (), tmp_download_file_path);
1855+
"lldb", module_spec.GetUUID ().GetAsString ().c_str (), tmp_download_file_path);
18421856
if (err_code)
18431857
{
18441858
if (log)
@@ -1851,9 +1865,9 @@ Platform::GetModuleFromLocalCache (const ModuleSpec& module_spec,
18511865

18521866
const FileSpec tmp_download_file_spec (tmp_download_file_path.c_str (), true);
18531867
// Download a module file.
1854-
error = DownloadModuleSlice (resolved_module_spec.GetFileSpec (),
1855-
resolved_module_spec.GetObjectOffset (),
1856-
resolved_module_spec.GetObjectSize (),
1868+
error = DownloadModuleSlice (module_spec.GetFileSpec (),
1869+
module_spec.GetObjectOffset (),
1870+
module_spec.GetObjectSize (),
18571871
tmp_download_file_spec);
18581872
if (error.Fail ())
18591873
{
@@ -1867,21 +1881,22 @@ Platform::GetModuleFromLocalCache (const ModuleSpec& module_spec,
18671881
// Put downloaded file into local module cache.
18681882
error = m_module_cache->Put (GetModuleCacheRoot (),
18691883
GetHostname (),
1870-
resolved_module_spec,
1884+
module_spec,
18711885
tmp_download_file_spec);
18721886
if (error.Fail ())
18731887
{
18741888
if (log)
18751889
log->Printf("Platform::%s - failed to put module %s into cache: %s",
1876-
__FUNCTION__, resolved_module_spec.GetUUID ().GetAsString ().c_str (),
1890+
__FUNCTION__, module_spec.GetUUID ().GetAsString ().c_str (),
18771891
error.AsCString ());
18781892
return false;
18791893
}
18801894

18811895
error = m_module_cache->Get (GetModuleCacheRoot (),
18821896
GetHostname (),
1883-
resolved_module_spec,
1884-
module_sp);
1897+
module_spec,
1898+
module_sp,
1899+
did_create_ptr);
18851900
return error.Success ();
18861901
}
18871902

‎lldb/source/Utility/ModuleCache.cpp

+4-1
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,8 @@ Error
8282
ModuleCache::Get (const FileSpec &root_dir_spec,
8383
const char *hostname,
8484
const ModuleSpec &module_spec,
85-
ModuleSP &cached_module_sp)
85+
ModuleSP &cached_module_sp,
86+
bool *did_create_ptr)
8687
{
8788
const auto find_it = m_loaded_modules.find (module_spec.GetUUID ().GetAsString());
8889
if (find_it != m_loaded_modules.end ())
@@ -109,6 +110,8 @@ ModuleCache::Get (const FileSpec &root_dir_spec,
109110
cached_module_spec.GetFileSpec () = module_file_path;
110111
cached_module_spec.GetPlatformFileSpec () = module_spec.GetFileSpec ();
111112
cached_module_sp.reset (new Module (cached_module_spec));
113+
if (did_create_ptr)
114+
*did_create_ptr = true;
112115

113116
m_loaded_modules.insert (std::make_pair (module_spec.GetUUID ().GetAsString (), cached_module_sp));
114117

‎lldb/source/Utility/ModuleCache.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ class ModuleCache
5454
Get (const FileSpec &root_dir_spec,
5555
const char *hostname,
5656
const ModuleSpec &module_spec,
57-
lldb::ModuleSP &cached_module_sp);
57+
lldb::ModuleSP &cached_module_sp,
58+
bool *did_create_ptr);
5859

5960
private:
6061
static FileSpec

0 commit comments

Comments
 (0)