Hi jasonmolenda, clayborg,

This patch fixes SDK selection in the following case:
```
platform select remote-ios --sysroot "/Users/IliaK/Library/Developer/Xcode/iOS 
DeviceSupport/8.1.2 (12B440)" --build 12B440 --version 8.1.2
target create --arch arm64 "~/Project1.app"
```

Currently the lldb selects a first SDK version (in name order) in directory and 
then updates it after the device is connected. This approach ignores user's 
arguments and actually "platform select" command doesn't make sense.

After this patch, lldb takes a SDK which matches to user's arguments.

http://reviews.llvm.org/D8249

Files:
  source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp
  source/Plugins/Platform/MacOSX/PlatformRemoteiOS.h

Index: source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp
===================================================================
--- source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp
+++ source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp
@@ -304,6 +304,14 @@
 {
     if (m_sdk_directory_infos.empty())
     {
+        // A --sysroot option was supplied - add it to our list of SDKs to 
check
+        if (m_sdk_sysroot)
+        {
+            FileSpec sdk_sysroot_fspec(m_sdk_sysroot.GetCString(), true);
+            const SDKDirectoryInfo 
sdk_sysroot_directory_info(sdk_sysroot_fspec);
+            m_sdk_directory_infos.push_back(sdk_sysroot_directory_info);
+            return true;
+        }
         const char *device_support_dir = GetDeviceSupportDirectory();
         if (device_support_dir)
         {
@@ -745,7 +753,28 @@
             }
         }
         
-        // First try for an exact match of major, minor and update
+        // First try for an exact match of major, minor and update:
+        // If a particalar SDK version was specified via --version or --build, 
look for a match on disk.
+        const SDKDirectoryInfo *current_sdk_info = 
GetSDKDirectoryForCurrentOSVersion();
+        const uint32_t current_sdk_idx = 
GetSDKIndexBySDKDirectoryInfo(current_sdk_info);
+        if (current_sdk_idx < num_sdk_infos && current_sdk_idx != 
m_last_module_sdk_idx)
+        {
+            if (GetFileInSDK (platform_file_path, current_sdk_idx, 
platform_module_spec.GetFileSpec()))
+            {
+                module_sp.reset();
+                error = ResolveExecutable (platform_module_spec,
+                                           module_sp,
+                                           NULL);
+                if (module_sp)
+                {
+                    m_last_module_sdk_idx = current_sdk_idx;
+                    error.Clear();
+                    return error;
+                }
+            }
+        }
+
+        // Second try all SDKs that were found.
         for (uint32_t sdk_idx=0; sdk_idx<num_sdk_infos; ++sdk_idx)
         {
             if (m_last_module_sdk_idx == sdk_idx)
@@ -827,3 +856,13 @@
     return m_connected_module_sdk_idx;
 }
 
+uint32_t
+PlatformRemoteiOS::GetSDKIndexBySDKDirectoryInfo (const SDKDirectoryInfo 
*sdk_info)
+{
+    if (sdk_info == NULL)
+    {
+        return UINT32_MAX;
+    }
+
+    return sdk_info - &m_sdk_directory_infos[0];
+}
Index: source/Plugins/Platform/MacOSX/PlatformRemoteiOS.h
===================================================================
--- source/Plugins/Platform/MacOSX/PlatformRemoteiOS.h
+++ source/Plugins/Platform/MacOSX/PlatformRemoteiOS.h
@@ -163,6 +163,10 @@
     uint32_t
     GetConnectedSDKIndex ();
 
+    // Get index of SDK in SDKDirectoryInfoCollection by its pointer and 
return UINT32_MAX if that SDK not found.
+    uint32_t
+    GetSDKIndexBySDKDirectoryInfo (const SDKDirectoryInfo *sdk_info);
+
 private:
     DISALLOW_COPY_AND_ASSIGN (PlatformRemoteiOS);

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
Index: source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp
===================================================================
--- source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp
+++ source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp
@@ -304,6 +304,14 @@
 {
     if (m_sdk_directory_infos.empty())
     {
+        // A --sysroot option was supplied - add it to our list of SDKs to check
+        if (m_sdk_sysroot)
+        {
+            FileSpec sdk_sysroot_fspec(m_sdk_sysroot.GetCString(), true);
+            const SDKDirectoryInfo sdk_sysroot_directory_info(sdk_sysroot_fspec);
+            m_sdk_directory_infos.push_back(sdk_sysroot_directory_info);
+            return true;
+        }
         const char *device_support_dir = GetDeviceSupportDirectory();
         if (device_support_dir)
         {
@@ -745,7 +753,28 @@
             }
         }
         
-        // First try for an exact match of major, minor and update
+        // First try for an exact match of major, minor and update:
+        // If a particalar SDK version was specified via --version or --build, look for a match on disk.
+        const SDKDirectoryInfo *current_sdk_info = GetSDKDirectoryForCurrentOSVersion();
+        const uint32_t current_sdk_idx = GetSDKIndexBySDKDirectoryInfo(current_sdk_info);
+        if (current_sdk_idx < num_sdk_infos && current_sdk_idx != m_last_module_sdk_idx)
+        {
+            if (GetFileInSDK (platform_file_path, current_sdk_idx, platform_module_spec.GetFileSpec()))
+            {
+                module_sp.reset();
+                error = ResolveExecutable (platform_module_spec,
+                                           module_sp,
+                                           NULL);
+                if (module_sp)
+                {
+                    m_last_module_sdk_idx = current_sdk_idx;
+                    error.Clear();
+                    return error;
+                }
+            }
+        }
+
+        // Second try all SDKs that were found.
         for (uint32_t sdk_idx=0; sdk_idx<num_sdk_infos; ++sdk_idx)
         {
             if (m_last_module_sdk_idx == sdk_idx)
@@ -827,3 +856,13 @@
     return m_connected_module_sdk_idx;
 }
 
+uint32_t
+PlatformRemoteiOS::GetSDKIndexBySDKDirectoryInfo (const SDKDirectoryInfo *sdk_info)
+{
+    if (sdk_info == NULL)
+    {
+        return UINT32_MAX;
+    }
+
+    return sdk_info - &m_sdk_directory_infos[0];
+}
Index: source/Plugins/Platform/MacOSX/PlatformRemoteiOS.h
===================================================================
--- source/Plugins/Platform/MacOSX/PlatformRemoteiOS.h
+++ source/Plugins/Platform/MacOSX/PlatformRemoteiOS.h
@@ -163,6 +163,10 @@
     uint32_t
     GetConnectedSDKIndex ();
 
+    // Get index of SDK in SDKDirectoryInfoCollection by its pointer and return UINT32_MAX if that SDK not found.
+    uint32_t
+    GetSDKIndexBySDKDirectoryInfo (const SDKDirectoryInfo *sdk_info);
+
 private:
     DISALLOW_COPY_AND_ASSIGN (PlatformRemoteiOS);
 
_______________________________________________
lldb-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits

Reply via email to