Added a fix to not re-use object files when doing DWARF with debug map.
llvm-svn: 127659
diff --git a/lldb/source/Core/ModuleList.cpp b/lldb/source/Core/ModuleList.cpp
index 864634f..451db38 100644
--- a/lldb/source/Core/ModuleList.cpp
+++ b/lldb/source/Core/ModuleList.cpp
@@ -540,7 +540,6 @@
)
{
ModuleList &shared_module_list = GetSharedModuleList ();
- Mutex::Locker locker(shared_module_list.m_modules_mutex);
return shared_module_list.FindModules (&in_file_spec, &arch, uuid_ptr, object_name_ptr, matching_module_list);
}
@@ -554,10 +553,12 @@
off_t object_offset,
ModuleSP &module_sp,
ModuleSP *old_module_sp_ptr,
- bool *did_create_ptr
+ bool *did_create_ptr,
+ bool always_create
)
{
ModuleList &shared_module_list = GetSharedModuleList ();
+ Mutex::Locker locker(shared_module_list.m_modules_mutex);
char path[PATH_MAX];
char uuid_cstr[64];
@@ -579,31 +580,43 @@
// Make sure no one else can try and get or create a module while this
// function is actively working on it by doing an extra lock on the
// global mutex list.
- ModuleList matching_module_list;
- Mutex::Locker locker(shared_module_list.m_modules_mutex);
- if (shared_module_list.FindModules (&in_file_spec, &arch, uuid_ptr, object_name_ptr, matching_module_list) > 0)
+ if (always_create == false)
{
- module_sp = matching_module_list.GetModuleAtIndex(0);
-
- // If we didn't have a UUID in mind when looking for the object file,
- // then we should make sure the modification time hasn't changed!
- if (uuid_ptr == NULL)
+ ModuleList matching_module_list;
+ const size_t num_matching_modules = shared_module_list.FindModules (&in_file_spec, &arch, NULL, object_name_ptr, matching_module_list);
+ if (num_matching_modules > 0)
{
- TimeValue file_spec_mod_time(in_file_spec.GetModificationTime());
- if (file_spec_mod_time.IsValid())
+ for (uint32_t module_idx = 0; module_idx < num_matching_modules; ++module_idx)
{
- if (file_spec_mod_time != module_sp->GetModificationTime())
+ module_sp = matching_module_list.GetModuleAtIndex(module_idx);
+ if (uuid_ptr && uuid_ptr->IsValid())
{
- if (old_module_sp_ptr)
- *old_module_sp_ptr = module_sp;
- shared_module_list.Remove (module_sp);
- module_sp.reset();
+ // We found the module we were looking for.
+ if (module_sp->GetUUID() == *uuid_ptr)
+ return error;
}
+ else
+ {
+ // If we didn't have a UUID in mind when looking for the object file,
+ // then we should make sure the modification time hasn't changed!
+ TimeValue file_spec_mod_time(in_file_spec.GetModificationTime());
+ if (file_spec_mod_time.IsValid())
+ {
+ if (file_spec_mod_time == module_sp->GetModificationTime())
+ return error;
+ }
+ }
+ if (old_module_sp_ptr && !old_module_sp_ptr->get())
+ *old_module_sp_ptr = module_sp;
+ shared_module_list.Remove (module_sp);
+ module_sp.reset();
}
}
}
- if (module_sp.get() == NULL)
+ if (module_sp)
+ return error;
+ else
{
module_sp.reset (new Module (in_file_spec, arch, object_name_ptr, object_offset));
if (module_sp)
@@ -666,7 +679,6 @@
// Make sure no one else can try and get or create a module while this
// function is actively working on it by doing an extra lock on the
// global mutex list.
- Mutex::Locker locker(shared_module_list.m_modules_mutex);
ModuleList matching_module_list;
if (shared_module_list.FindModules (&file_spec, &arch, uuid_ptr, object_name_ptr, matching_module_list) > 0)
{
@@ -730,3 +742,10 @@
return error;
}
+bool
+ModuleList::RemoveSharedModule (lldb::ModuleSP &module_sp)
+{
+ return GetSharedModuleList ().Remove (module_sp);
+}
+
+