tberghammer created this revision. tberghammer added a reviewer: ovyalov. tberghammer added a subscriber: lldb-commits. Herald added subscribers: danalbert, tberghammer.
Add modules downloaded by ModuleCache to the global ModuleList Adding the modules to the global module list eliminate issues in the case when a module is unloaded from the target but some object (e.g. breakpoint) still referencing them with weak pointers. It also speeds up the case when we load, unload, load the same shared library because the global module cache will keep the parsed debug info around between the 2 load (this scenario happens for some code on android). http://reviews.llvm.org/D15415 Files: source/Utility/ModuleCache.cpp Index: source/Utility/ModuleCache.cpp =================================================================== --- source/Utility/ModuleCache.cpp +++ source/Utility/ModuleCache.cpp @@ -11,6 +11,7 @@ #include "lldb/Core/Log.h" #include "lldb/Core/Module.h" +#include "lldb/Core/ModuleList.h" #include "lldb/Core/ModuleSpec.h" #include "lldb/Host/File.h" #include "lldb/Host/FileSystem.h" @@ -234,23 +235,28 @@ return Error ("Module %s has invalid file size", 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 link to it. - const auto error = CreateHostSysRootModuleLink(root_dir_spec, hostname, module_spec.GetFileSpec(), module_file_path, false); + auto error = CreateHostSysRootModuleLink(root_dir_spec, hostname, module_spec.GetFileSpec(), module_file_path, false); if (error.Fail ()) return Error ("Failed to create link to %s: %s", module_file_path.GetPath().c_str(), error.AsCString()); 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)); + + error = ModuleList::GetSharedModule(cached_module_spec, + cached_module_sp, + nullptr, + nullptr, + did_create_ptr, + false); + if (error.Fail()) + return error; FileSpec symfile_spec = GetSymbolFileSpec(cached_module_sp->GetFileSpec ()); if (symfile_spec.Exists ()) cached_module_sp->SetSymbolFileFileSpec (symfile_spec); - if (did_create_ptr) - *did_create_ptr = true; - m_loaded_modules.insert (std::make_pair (module_spec.GetUUID ().GetAsString (), cached_module_sp)); return Error ();
Index: source/Utility/ModuleCache.cpp =================================================================== --- source/Utility/ModuleCache.cpp +++ source/Utility/ModuleCache.cpp @@ -11,6 +11,7 @@ #include "lldb/Core/Log.h" #include "lldb/Core/Module.h" +#include "lldb/Core/ModuleList.h" #include "lldb/Core/ModuleSpec.h" #include "lldb/Host/File.h" #include "lldb/Host/FileSystem.h" @@ -234,23 +235,28 @@ return Error ("Module %s has invalid file size", 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 link to it. - const auto error = CreateHostSysRootModuleLink(root_dir_spec, hostname, module_spec.GetFileSpec(), module_file_path, false); + auto error = CreateHostSysRootModuleLink(root_dir_spec, hostname, module_spec.GetFileSpec(), module_file_path, false); if (error.Fail ()) return Error ("Failed to create link to %s: %s", module_file_path.GetPath().c_str(), error.AsCString()); 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)); + + error = ModuleList::GetSharedModule(cached_module_spec, + cached_module_sp, + nullptr, + nullptr, + did_create_ptr, + false); + if (error.Fail()) + return error; FileSpec symfile_spec = GetSymbolFileSpec(cached_module_sp->GetFileSpec ()); if (symfile_spec.Exists ()) cached_module_sp->SetSymbolFileFileSpec (symfile_spec); - if (did_create_ptr) - *did_create_ptr = true; - m_loaded_modules.insert (std::make_pair (module_spec.GetUUID ().GetAsString (), cached_module_sp)); return Error ();
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits