<rdar://problem/13854277>
<rdar://problem/13594769>

Main changes in this patch include:
- cleanup plug-in interface and use ConstStrings for plug-in names
- Modfiied the BSD Archive plug-in to be able to pick out the correct .o file when .a files contain multiple .o files with the same name by using the timestamp
- Modified SymbolFileDWARFDebugMap to properly verify the timestamp on .o files it loads to ensure we don't load updated .o files and cause problems when debugging

The plug-in interface changes:

Modified the lldb_private::PluginInterface class that all plug-ins inherit from:

Changed:

virtual const char * GetPluginName() = 0;

To: 

virtual ConstString GetPluginName() = 0;

Removed:

virtual const char * GetShortPluginName() = 0;

- Fixed up all plug-in to adhere to the new interface and to return lldb_private::ConstString values for the plug-in names. 
- Fixed all plug-ins to return simple names with no prefixes. Some plug-ins had prefixes and most ones didn't, so now they all don't have prefixed names, just simple names like "linux", "gdb-remote", etc.

llvm-svn: 181631
diff --git a/lldb/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.cpp b/lldb/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.cpp
index a5e87fc..109e429 100644
--- a/lldb/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.cpp
+++ b/lldb/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.cpp
@@ -148,11 +148,29 @@
 }
 
 ObjectContainerBSDArchive::Object *
-ObjectContainerBSDArchive::Archive::FindObject (const ConstString &object_name)
+ObjectContainerBSDArchive::Archive::FindObject (const ConstString &object_name, const TimeValue &object_mod_time)
 {
     const ObjectNameToIndexMap::Entry *match = m_object_name_to_index_map.FindFirstValueForName (object_name.GetCString());
     if (match)
-        return &m_objects[match->value];
+    {
+        if (object_mod_time.IsValid())
+        {
+            const uint64_t object_date = object_mod_time.GetAsSecondsSinceJan1_1970();
+            if (m_objects[match->value].ar_date == object_date)
+                return &m_objects[match->value];
+            const ObjectNameToIndexMap::Entry *next_match = m_object_name_to_index_map.FindNextValueForName (match);
+            while (next_match)
+            {
+                if (m_objects[next_match->value].ar_date == object_date)
+                    return &m_objects[next_match->value];
+                next_match = m_object_name_to_index_map.FindNextValueForName (next_match);
+            }
+        }
+        else
+        {
+            return &m_objects[match->value];
+        }
+    }
     return NULL;
 }
 
@@ -250,10 +268,11 @@
 }
 
 
-const char *
+lldb_private::ConstString
 ObjectContainerBSDArchive::GetPluginNameStatic()
 {
-    return "object-container.bsd-archive";
+    static ConstString g_name("bsd-archive");
+    return g_name;
 }
 
 const char *
@@ -297,11 +316,11 @@
 
                 Archive::shared_ptr archive_sp (Archive::FindCachedArchive (*file, module_sp->GetArchitecture(), module_sp->GetModificationTime()));
                 std::unique_ptr<ObjectContainerBSDArchive> container_ap(new ObjectContainerBSDArchive (module_sp,
-                                                                                                      archive_data_sp,
-                                                                                                      archive_data_offset,
-                                                                                                      file,
-                                                                                                      file_offset,
-                                                                                                      length));
+                                                                                                       archive_data_sp,
+                                                                                                       archive_data_offset,
+                                                                                                       file,
+                                                                                                       file_offset,
+                                                                                                       length));
 
                 if (container_ap.get())
                 {
@@ -434,7 +453,8 @@
     {
         if (module_sp->GetObjectName() && m_archive_sp)
         {
-            Object *object = m_archive_sp->FindObject (module_sp->GetObjectName());
+            Object *object = m_archive_sp->FindObject (module_sp->GetObjectName(),
+                                                       module_sp->GetObjectModificationTime());
             if (object)
             {
                 lldb::offset_t data_offset = m_offset + object->ar_file_offset;
@@ -454,15 +474,9 @@
 //------------------------------------------------------------------
 // PluginInterface protocol
 //------------------------------------------------------------------
-const char *
+lldb_private::ConstString
 ObjectContainerBSDArchive::GetPluginName()
 {
-    return "object-container.bsd-archive";
-}
-
-const char *
-ObjectContainerBSDArchive::GetShortPluginName()
-{
     return GetPluginNameStatic();
 }