JDevlieghere created this revision.
JDevlieghere added reviewers: jasonmolenda, friss, labath.
Herald added a project: All.
JDevlieghere requested review of this revision.

This patch is another attempt to fix platform selection on Apple Silicon. It 
partially undoes D117340 <https://reviews.llvm.org/D117340> which tried to fix 
the issue by always instantiating a remote-ios platform for "iPhone and iPad 
Apps on Apple Silicon Macs". While the previous patch worked for attaching, it 
broke launching and everything else that expects the remote platform to be 
connected. I made an attempt to work around that, but quickly found out that 
there were just too may places that had this assumption baked in.

This patch takes a different approach and reverts back to marking the host 
platform compatible with iOS triples. This brings us back to the original 
situation where platform selection was broken for remote iOS debugging on Apple 
Silicon. To fix that, I now look at the process' system architecture to 
differentiate between iOS binaries running remotely and iOS binaries running 
locally. I wish I could make this distinction in the platform, but you need a 
connected process to do this.

I tested the following scenarios, which now all uses the desired platform:

- Launching an iOS binary on macOS: uses the `host` platform
- Attaching to an iOS binary on macOS: uses the `host` platform
- Attaching to a remote iOS binary: uses the `remote-ios` platform

rdar://89840215


https://reviews.llvm.org/D121444

Files:
  lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h
  lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp
  lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp
  lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.h
  lldb/source/Target/Process.cpp


Index: lldb/source/Target/Process.cpp
===================================================================
--- lldb/source/Target/Process.cpp
+++ lldb/source/Target/Process.cpp
@@ -2922,6 +2922,30 @@
     }
   }
 
+#if TARGET_OS_OSX
+#if defined(__arm__) || defined(__arm64__) || defined(__aarch64__)
+  // On Apple Silicon the host platform is compatible with arm64(e)-apple-ios
+  // to support unmodified "iPhone and iPad Apps on Apple Silicon Macs".
+  //
+  // Because the binaries are identical and platform selection relies on the
+  // triple, there's no way to differentiate the two statically. Once we have a
+  // process, we can use its system architecture to tell the two apart and
+  // change the platform if necessary.
+  if (platform_sp->GetPluginName() == "host") {
+    llvm::Triple target_triple = GetTarget().GetArchitecture().GetTriple();
+    if (target_triple.getOS() == llvm::Triple::IOS &&
+        target_triple.getVendor() == llvm::Triple::Apple) {
+      llvm::Triple system_triple = GetSystemArchitecture().GetTriple();
+      if (system_triple.getOS() == llvm::Triple::IOS) {
+        Status error;
+        GetTarget().SetPlatform(
+            Platform::Create(ConstString("remote-ios"), error));
+      }
+    }
+  }
+#endif
+#endif
+
   // We have completed the attach, now it is time to find the dynamic loader
   // plug-in
   DynamicLoader *dyld = GetDynamicLoader();
Index: lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.h
===================================================================
--- lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.h
+++ lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.h
@@ -42,8 +42,6 @@
   std::vector<lldb_private::ArchSpec> GetSupportedArchitectures() override;
 
 protected:
-  bool CheckLocalSharedCache() const override;
-
   llvm::StringRef GetDeviceSupportDirectoryName() override;
   llvm::StringRef GetPlatformName() override;
 };
Index: lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp
===================================================================
--- lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp
+++ lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp
@@ -140,13 +140,6 @@
   return result;
 }
 
-bool PlatformRemoteiOS::CheckLocalSharedCache() const {
-  // You can run iPhone and iPad apps on Mac with Apple Silicon. At the
-  // platform level there's no way to distinguish them from remote iOS
-  // applications. Make sure we still read from our own shared cache.
-  return true;
-}
-
 llvm::StringRef PlatformRemoteiOS::GetDeviceSupportDirectoryName() {
   return "iOS DeviceSupport";
 }
Index: lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp
===================================================================
--- lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp
+++ lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp
@@ -151,6 +151,8 @@
     result.push_back(ArchSpec("x86_64-apple-ios-macabi"));
     result.push_back(ArchSpec("arm64-apple-ios-macabi"));
     result.push_back(ArchSpec("arm64e-apple-ios-macabi"));
+    result.push_back(ArchSpec("arm64-apple-ios"));
+    result.push_back(ArchSpec("arm64e-apple-ios"));
   }
 #else
   x86GetSupportedArchitectures(result);
Index: lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h
===================================================================
--- lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h
+++ lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h
@@ -143,7 +143,7 @@
       const lldb_private::FileSpecList *module_search_paths_ptr,
       llvm::SmallVectorImpl<lldb::ModuleSP> *old_modules, bool 
*did_create_ptr);
 
-  virtual bool CheckLocalSharedCache() const { return IsHost(); }
+  bool CheckLocalSharedCache() const { return IsHost(); }
 
   struct SDKEnumeratorInfo {
     lldb_private::FileSpec found_path;


Index: lldb/source/Target/Process.cpp
===================================================================
--- lldb/source/Target/Process.cpp
+++ lldb/source/Target/Process.cpp
@@ -2922,6 +2922,30 @@
     }
   }
 
+#if TARGET_OS_OSX
+#if defined(__arm__) || defined(__arm64__) || defined(__aarch64__)
+  // On Apple Silicon the host platform is compatible with arm64(e)-apple-ios
+  // to support unmodified "iPhone and iPad Apps on Apple Silicon Macs".
+  //
+  // Because the binaries are identical and platform selection relies on the
+  // triple, there's no way to differentiate the two statically. Once we have a
+  // process, we can use its system architecture to tell the two apart and
+  // change the platform if necessary.
+  if (platform_sp->GetPluginName() == "host") {
+    llvm::Triple target_triple = GetTarget().GetArchitecture().GetTriple();
+    if (target_triple.getOS() == llvm::Triple::IOS &&
+        target_triple.getVendor() == llvm::Triple::Apple) {
+      llvm::Triple system_triple = GetSystemArchitecture().GetTriple();
+      if (system_triple.getOS() == llvm::Triple::IOS) {
+        Status error;
+        GetTarget().SetPlatform(
+            Platform::Create(ConstString("remote-ios"), error));
+      }
+    }
+  }
+#endif
+#endif
+
   // We have completed the attach, now it is time to find the dynamic loader
   // plug-in
   DynamicLoader *dyld = GetDynamicLoader();
Index: lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.h
===================================================================
--- lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.h
+++ lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.h
@@ -42,8 +42,6 @@
   std::vector<lldb_private::ArchSpec> GetSupportedArchitectures() override;
 
 protected:
-  bool CheckLocalSharedCache() const override;
-
   llvm::StringRef GetDeviceSupportDirectoryName() override;
   llvm::StringRef GetPlatformName() override;
 };
Index: lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp
===================================================================
--- lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp
+++ lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp
@@ -140,13 +140,6 @@
   return result;
 }
 
-bool PlatformRemoteiOS::CheckLocalSharedCache() const {
-  // You can run iPhone and iPad apps on Mac with Apple Silicon. At the
-  // platform level there's no way to distinguish them from remote iOS
-  // applications. Make sure we still read from our own shared cache.
-  return true;
-}
-
 llvm::StringRef PlatformRemoteiOS::GetDeviceSupportDirectoryName() {
   return "iOS DeviceSupport";
 }
Index: lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp
===================================================================
--- lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp
+++ lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp
@@ -151,6 +151,8 @@
     result.push_back(ArchSpec("x86_64-apple-ios-macabi"));
     result.push_back(ArchSpec("arm64-apple-ios-macabi"));
     result.push_back(ArchSpec("arm64e-apple-ios-macabi"));
+    result.push_back(ArchSpec("arm64-apple-ios"));
+    result.push_back(ArchSpec("arm64e-apple-ios"));
   }
 #else
   x86GetSupportedArchitectures(result);
Index: lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h
===================================================================
--- lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h
+++ lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h
@@ -143,7 +143,7 @@
       const lldb_private::FileSpecList *module_search_paths_ptr,
       llvm::SmallVectorImpl<lldb::ModuleSP> *old_modules, bool *did_create_ptr);
 
-  virtual bool CheckLocalSharedCache() const { return IsHost(); }
+  bool CheckLocalSharedCache() const { return IsHost(); }
 
   struct SDKEnumeratorInfo {
     lldb_private::FileSpec found_path;
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to