Added a fix to not re-use object files when doing DWARF with debug map.

llvm-svn: 127659
diff --git a/lldb/include/lldb/Core/ModuleList.h b/lldb/include/lldb/Core/ModuleList.h
index 08ddd09..5202a25 100644
--- a/lldb/include/lldb/Core/ModuleList.h
+++ b/lldb/include/lldb/Core/ModuleList.h
@@ -373,7 +373,11 @@
                      off_t object_offset,
                      lldb::ModuleSP &module_sp,
                      lldb::ModuleSP *old_module_sp_ptr,
-                     bool *did_create_ptr);
+                     bool *did_create_ptr,
+                     bool always_create = false);
+
+    static bool
+    RemoveSharedModule (lldb::ModuleSP &module_sp);
 
     static size_t
     FindSharedModules (const FileSpec& in_file_spec,
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);
+}
+
+
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
index 59b0feb..fd8f0bf 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
@@ -165,18 +165,11 @@
         if (oso_symbol)
         {
             FileSpec oso_file_spec(oso_symbol->GetMangled().GetName().AsCString(), true);
-#define SYMBOL_FILE_DWARF_DEBUG_MODULES 1
-#if defined (SYMBOL_FILE_DWARF_DEBUG_MODULES)
-            // Normally we don't want the .o files we open added to the shared
-            // module list. This is because we will add our own section 
-            // remappning to each .o file, and if the executable changes, yet 
-            // the .o file does not change, we can't have the old remapped 
-            // sections in the .o file since they can be out of date. But when
-            // debugging issues in the debug map + DWARF in .o files, it is nice
-            // to be able to use the "image XXX" commands to look at the symbol
-            // tables and sections in the .o files, so the SYMBOL_FILE_DWARF_DEBUG_MODULES
-            // can be used when debugging issues, but it shouldn't be left in
-            // for normal debugging.
+            // Don't allow cached .o files since we dress up each .o file with
+            // new sections. We want them to be in the module list so we can 
+            // always find a shared pointer to the module (in Module::GetSP()),
+            // but just don't share them.
+            const bool always_create = true;
             ModuleList::GetSharedModule (oso_file_spec,
                                          m_obj_file->GetModule()->GetArchitecture(),
                                          NULL,  // lldb_private::UUID pointer
@@ -184,10 +177,8 @@
                                          0,     // object offset
                                          comp_unit_info->oso_module_sp,
                                          NULL,
-                                         NULL);
-#else
-            comp_unit_info->oso_module_sp.reset(new Module (oso_file_spec, m_obj_file->GetModule()->GetArchitecture()));
-#endif
+                                         NULL,
+                                         always_create);
         }
     }
     return comp_unit_info->oso_module_sp.get();