Changes in 226712 needed some fixing as a platform is almost always selected and...
authorGreg Clayton <gclayton@apple.com>
Wed, 28 Jan 2015 01:33:37 +0000 (01:33 +0000)
committerGreg Clayton <gclayton@apple.com>
Wed, 28 Jan 2015 01:33:37 +0000 (01:33 +0000)
The change was made so we could re-use a platform if one was already created instead of creating a new one, but it would fail in the above case. To fix this, if we have a selected platform, we verify that the platform matches the current platform before we try to re-use it. We do this by asking the OptionGroupPlatform if the platform matches. If so, it returns true and we don't create a new platform, else we do.

llvm-svn: 227288

lldb/include/lldb/Interpreter/OptionGroupPlatform.h
lldb/source/Interpreter/OptionGroupPlatform.cpp
lldb/source/Target/TargetList.cpp

index 970ad32..f7de50c 100644 (file)
@@ -102,8 +102,10 @@ public:
     SetSDKBuild (const ConstString &sdk_build)
     {
         m_sdk_build = sdk_build;
-    }    
-    
+    }
+
+    bool
+    PlatformMatches(const lldb::PlatformSP &platform_sp) const;
 
 protected:
     std::string m_platform_name;
index 7e5e124..6bb3655 100644 (file)
@@ -147,3 +147,38 @@ OptionGroupPlatform::SetOptionValue (CommandInterpreter &interpreter,
     }
     return error;
 }
+
+bool
+OptionGroupPlatform::PlatformMatches(const lldb::PlatformSP &platform_sp) const
+{
+    if (platform_sp)
+    {
+        if (!m_platform_name.empty())
+        {
+            if (platform_sp->GetName() != ConstString(m_platform_name.c_str()))
+                return false;
+        }
+
+        if (m_sdk_build && m_sdk_build != platform_sp->GetSDKBuild())
+            return false;
+
+        if (m_sdk_sysroot && m_sdk_sysroot != platform_sp->GetSDKRootDirectory())
+            return false;
+
+        if (m_os_version_major != UINT32_MAX)
+        {
+            uint32_t major, minor, update;
+            if (platform_sp->GetOSVersion (major, minor, update))
+            {
+                if (m_os_version_major != major)
+                    return false;
+                if (m_os_version_minor != minor)
+                    return false;
+                if (m_os_version_update != update)
+                    return false;
+            }
+        }
+        return true;
+    }
+    return false;
+}
index 9972fda..1e06341 100644 (file)
@@ -130,16 +130,20 @@ TargetList::CreateTargetInternal (Debugger &debugger,
     // let's see if there is already an existing plaform before we go creating another...
     platform_sp = debugger.GetPlatformList().GetSelectedPlatform();
 
-    if (!platform_sp && platform_options && platform_options->PlatformWasSpecified ())
+    if (platform_options && platform_options->PlatformWasSpecified ())
     {
-        const bool select_platform = true;
-        platform_sp = platform_options->CreatePlatformWithOptions (interpreter,
-                                                                   arch,
-                                                                   select_platform,
-                                                                   error,
-                                                                   platform_arch);
-        if (!platform_sp)
-            return error;
+        // Create a new platform if it doesn't match the selected platform
+        if (!platform_options->PlatformMatches(platform_sp))
+        {
+            const bool select_platform = true;
+            platform_sp = platform_options->CreatePlatformWithOptions (interpreter,
+                                                                       arch,
+                                                                       select_platform,
+                                                                       error,
+                                                                       platform_arch);
+            if (!platform_sp)
+                return error;
+        }
     }
     
     if (user_exe_path && user_exe_path[0])