[Lldb-commits] [lldb] [lldb] Search both visionOS and XROS DeviceSupport directories (PR #228573)

Med Ismail Bennani via lldb-commits lldb-commits at lists.llvm.org
Fri Oct 2 17:09:16 PDT 2026


https://github.com/medismailben updated https://github.com/llvm/llvm-project/pull/228573

>From 8de59d3b4aea791606d1471669e4f5aa6e152176 Mon Sep 17 00:00:00 2001
From: Med Ismail Bennani <ismail at bennani.ma>
Date: Fri, 2 Oct 2026 15:09:16 -0700
Subject: [PATCH] [lldb] Search both visionOS and XROS DeviceSupport
 directories

Xcode now downloads visionOS shared cache symbols into
~/Library/Developer/Xcode/visionOS DeviceSupport, but
PlatformRemoteAppleXR only looked in "XROS DeviceSupport". As a result,
LLDB never found the expanded shared cache for visionOS devices and
failed to resolve symbols like memcpy, which breaks expression
evaluation and loading images into the inferior.

Make GetDeviceSupportDirectoryName return a list of directory names
(renamed to GetDeviceSupportDirectoryNames) and have
PlatformDarwinDevice search each of them. visionOS returns both the
current and the legacy name; all other platforms keep their single name.

Signed-off-by: Med Ismail Bennani <ismail at bennani.ma>
---
 .../Platform/MacOSX/PlatformDarwinDevice.cpp  | 29 ++++++++++---------
 .../Platform/MacOSX/PlatformDarwinDevice.h    |  4 ++-
 .../Platform/MacOSX/PlatformMacOSX.cpp        |  5 ++--
 .../Plugins/Platform/MacOSX/PlatformMacOSX.h  |  2 +-
 .../MacOSX/PlatformRemoteAppleBridge.cpp      |  5 ++--
 .../MacOSX/PlatformRemoteAppleBridge.h        |  2 +-
 .../Platform/MacOSX/PlatformRemoteAppleTV.cpp |  5 ++--
 .../Platform/MacOSX/PlatformRemoteAppleTV.h   |  2 +-
 .../MacOSX/PlatformRemoteAppleWatch.cpp       |  5 ++--
 .../MacOSX/PlatformRemoteAppleWatch.h         |  2 +-
 .../Platform/MacOSX/PlatformRemoteAppleXR.cpp |  7 +++--
 .../Platform/MacOSX/PlatformRemoteAppleXR.h   |  2 +-
 .../Platform/MacOSX/PlatformRemoteMacOSX.cpp  |  5 ++--
 .../Platform/MacOSX/PlatformRemoteMacOSX.h    |  2 +-
 .../Platform/MacOSX/PlatformRemoteiOS.cpp     |  5 ++--
 .../Platform/MacOSX/PlatformRemoteiOS.h       |  2 +-
 16 files changed, 49 insertions(+), 35 deletions(-)

diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinDevice.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinDevice.cpp
index 825b9df61f2e887..3584c73f4faaf01 100644
--- a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinDevice.cpp
+++ b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinDevice.cpp
@@ -96,19 +96,22 @@ bool PlatformDarwinDevice::UpdateSDKDirectoryInfosIfNeeded() {
     if (device_support_dir) {
       AddSharedCacheDirectory(device_support_dir, "builtin SDK directory");
 
-      // "macOS DeviceSupport", "iOS DeviceSupport", etc.
-      llvm::StringRef dirname = GetDeviceSupportDirectoryName();
-      std::string local_sdk_cache_str = "~/Library/Developer/Xcode/";
-      local_sdk_cache_str += std::string(dirname);
-      FileSpec local_sdk_cache(local_sdk_cache_str.c_str());
-      FileSystem::Instance().Resolve(local_sdk_cache);
-      if (FileSystem::Instance().Exists(local_sdk_cache)) {
-        LLDB_LOGF(log,
-                  "PlatformDarwinDevice::UpdateSDKDirectoryInfosIfNeeded "
-                  "searching %s for additional SDKs",
-                  local_sdk_cache.GetPath().c_str());
-        AddSharedCacheDirectory(local_sdk_cache.GetPath().c_str(),
-                                "system developer dir directory");
+      // "macOS DeviceSupport", "iOS DeviceSupport", etc. The names are in
+      // order of preference, so stop at the first one that exists.
+      for (llvm::StringRef dirname : GetDeviceSupportDirectoryNames()) {
+        std::string local_sdk_cache_str = "~/Library/Developer/Xcode/";
+        local_sdk_cache_str += std::string(dirname);
+        FileSpec local_sdk_cache(local_sdk_cache_str.c_str());
+        FileSystem::Instance().Resolve(local_sdk_cache);
+        if (FileSystem::Instance().Exists(local_sdk_cache)) {
+          LLDB_LOGF(log,
+                    "PlatformDarwinDevice::UpdateSDKDirectoryInfosIfNeeded "
+                    "searching %s for additional SDKs",
+                    local_sdk_cache.GetPath().c_str());
+          AddSharedCacheDirectory(local_sdk_cache.GetPath().c_str(),
+                                  "system developer dir directory");
+          break;
+        }
       }
 
       const char *addtional_platform_dirs = getenv("PLATFORM_SDK_DIRECTORY");
diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinDevice.h b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinDevice.h
index e2699db983368fa..3240080d691914e 100644
--- a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinDevice.h
+++ b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinDevice.h
@@ -11,6 +11,7 @@
 
 #include "PlatformDarwin.h"
 
+#include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/StringRef.h"
 
 #include <string>
@@ -64,7 +65,8 @@ class PlatformDarwinDevice : public PlatformDarwin {
   const char *GetDeviceSupportDirectoryForOSVersion();
 
   virtual llvm::StringRef GetPlatformName() = 0;
-  virtual llvm::StringRef GetDeviceSupportDirectoryName() = 0;
+  virtual llvm::SmallVector<llvm::StringRef>
+  GetDeviceSupportDirectoryNames() = 0;
 
   std::mutex m_sdk_dir_mutex;
   SDKDirectoryInfoCollection m_sdk_directory_infos;
diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp
index ebc81692cbc1e6b..bb3c4210bff9093 100644
--- a/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp
+++ b/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp
@@ -178,8 +178,9 @@ lldb_private::Status PlatformMacOSX::GetSharedModule(
   return error;
 }
 
-llvm::StringRef PlatformMacOSX::GetDeviceSupportDirectoryName() {
-  return "macOS DeviceSupport";
+llvm::SmallVector<llvm::StringRef>
+PlatformMacOSX::GetDeviceSupportDirectoryNames() {
+  return {"macOS DeviceSupport"};
 }
 
 llvm::StringRef PlatformMacOSX::GetPlatformName() { return "MacOSX.platform"; }
diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.h b/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.h
index 93eb9ddfd185846..251e0d498d5ed21 100644
--- a/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.h
+++ b/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.h
@@ -68,7 +68,7 @@ class PlatformMacOSX : public PlatformDarwinDevice {
   }
 
 protected:
-  llvm::StringRef GetDeviceSupportDirectoryName() override;
+  llvm::SmallVector<llvm::StringRef> GetDeviceSupportDirectoryNames() override;
   llvm::StringRef GetPlatformName() override;
 };
 
diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleBridge.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleBridge.cpp
index 2aa4ad56bb84ad8..4b04db7c2c4f2e1 100644
--- a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleBridge.cpp
+++ b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleBridge.cpp
@@ -142,8 +142,9 @@ std::vector<ArchSpec> PlatformRemoteAppleBridge::GetSupportedArchitectures(
   return {ArchSpec("arm64-apple-bridgeos")};
 }
 
-llvm::StringRef PlatformRemoteAppleBridge::GetDeviceSupportDirectoryName() {
-  return "BridgeOS DeviceSupport";
+llvm::SmallVector<llvm::StringRef>
+PlatformRemoteAppleBridge::GetDeviceSupportDirectoryNames() {
+  return {"BridgeOS DeviceSupport"};
 }
 
 llvm::StringRef PlatformRemoteAppleBridge::GetPlatformName() {
diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleBridge.h b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleBridge.h
index 91dd02cc943235b..74dceb0d1412b2e 100644
--- a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleBridge.h
+++ b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleBridge.h
@@ -42,7 +42,7 @@ class PlatformRemoteAppleBridge : public PlatformRemoteDarwinDevice {
   GetSupportedArchitectures(const ArchSpec &process_host_arch) override;
 
 protected:
-  llvm::StringRef GetDeviceSupportDirectoryName() override;
+  llvm::SmallVector<llvm::StringRef> GetDeviceSupportDirectoryNames() override;
   llvm::StringRef GetPlatformName() override;
 };
 
diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleTV.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleTV.cpp
index 5b729690eda13ab..66d8d06f9135f4a 100644
--- a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleTV.cpp
+++ b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleTV.cpp
@@ -154,8 +154,9 @@ std::vector<ArchSpec> PlatformRemoteAppleTV::GetSupportedArchitectures(
   }
 }
 
-llvm::StringRef PlatformRemoteAppleTV::GetDeviceSupportDirectoryName() {
-  return "tvOS DeviceSupport";
+llvm::SmallVector<llvm::StringRef>
+PlatformRemoteAppleTV::GetDeviceSupportDirectoryNames() {
+  return {"tvOS DeviceSupport"};
 }
 
 llvm::StringRef PlatformRemoteAppleTV::GetPlatformName() {
diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleTV.h b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleTV.h
index 2962f19bd2ee268..aee1512cc4fa9d5 100644
--- a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleTV.h
+++ b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleTV.h
@@ -48,7 +48,7 @@ class PlatformRemoteAppleTV : public PlatformRemoteDarwinDevice {
       const lldb_private::ArchSpec &process_host_arch) override;
 
 protected:
-  llvm::StringRef GetDeviceSupportDirectoryName() override;
+  llvm::SmallVector<llvm::StringRef> GetDeviceSupportDirectoryNames() override;
   llvm::StringRef GetPlatformName() override;
 };
 
diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleWatch.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleWatch.cpp
index 7dc8b9b4c9de32f..1cb1389cb8aee91 100644
--- a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleWatch.cpp
+++ b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleWatch.cpp
@@ -180,8 +180,9 @@ PlatformRemoteAppleWatch::GetSupportedArchitectures(const ArchSpec &host_info) {
   }
 }
 
-llvm::StringRef PlatformRemoteAppleWatch::GetDeviceSupportDirectoryName() {
-  return "watchOS DeviceSupport";
+llvm::SmallVector<llvm::StringRef>
+PlatformRemoteAppleWatch::GetDeviceSupportDirectoryNames() {
+  return {"watchOS DeviceSupport"};
 }
 
 llvm::StringRef PlatformRemoteAppleWatch::GetPlatformName() {
diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleWatch.h b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleWatch.h
index 20694f00d9f5e88..9b63c476e41090b 100644
--- a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleWatch.h
+++ b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleWatch.h
@@ -40,7 +40,7 @@ class PlatformRemoteAppleWatch : public PlatformRemoteDarwinDevice {
   GetSupportedArchitectures(const ArchSpec &process_host_arch) override;
 
 protected:
-  llvm::StringRef GetDeviceSupportDirectoryName() override;
+  llvm::SmallVector<llvm::StringRef> GetDeviceSupportDirectoryNames() override;
   llvm::StringRef GetPlatformName() override;
 };
 
diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleXR.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleXR.cpp
index c7e734a5a098d7a..fd1015c4a80b225 100644
--- a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleXR.cpp
+++ b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleXR.cpp
@@ -148,8 +148,11 @@ PlatformRemoteAppleXR::GetSupportedArchitectures(
   return result;
 }
 
-llvm::StringRef PlatformRemoteAppleXR::GetDeviceSupportDirectoryName() {
-  return "XROS DeviceSupport";
+llvm::SmallVector<llvm::StringRef>
+PlatformRemoteAppleXR::GetDeviceSupportDirectoryNames() {
+  // Xcode 27+ uses "visionOS DeviceSupport"; earlier versions used
+  // "XROS DeviceSupport".
+  return {"visionOS DeviceSupport", "XROS DeviceSupport"};
 }
 
 llvm::StringRef PlatformRemoteAppleXR::GetPlatformName() {
diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleXR.h b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleXR.h
index 2fbb6caad8110f2..31064888560e80c 100644
--- a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleXR.h
+++ b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteAppleXR.h
@@ -35,7 +35,7 @@ class PlatformRemoteAppleXR : public PlatformRemoteDarwinDevice {
       const lldb_private::ArchSpec &process_host_arch) override;
 
 protected:
-  llvm::StringRef GetDeviceSupportDirectoryName() override;
+  llvm::SmallVector<llvm::StringRef> GetDeviceSupportDirectoryNames() override;
   llvm::StringRef GetPlatformName() override;
 };
 } // namespace lldb_private
diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteMacOSX.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteMacOSX.cpp
index 21bb0c51ef31e52..de4b04965602bb9 100644
--- a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteMacOSX.cpp
+++ b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteMacOSX.cpp
@@ -141,8 +141,9 @@ llvm::StringRef PlatformRemoteMacOSX::GetDescriptionStatic() {
   return "Remote Mac OS X user platform plug-in.";
 }
 
-llvm::StringRef PlatformRemoteMacOSX::GetDeviceSupportDirectoryName() {
-  return "macOS DeviceSupport";
+llvm::SmallVector<llvm::StringRef>
+PlatformRemoteMacOSX::GetDeviceSupportDirectoryNames() {
+  return {"macOS DeviceSupport"};
 }
 
 llvm::StringRef PlatformRemoteMacOSX::GetPlatformName() {
diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteMacOSX.h b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteMacOSX.h
index 17ae372e3616b2b..81e6394f566adfb 100644
--- a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteMacOSX.h
+++ b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteMacOSX.h
@@ -45,7 +45,7 @@ class PlatformRemoteMacOSX : public virtual PlatformRemoteDarwinDevice {
   GetSupportedArchitectures(const ArchSpec &process_host_arch) override;
 
 protected:
-  llvm::StringRef GetDeviceSupportDirectoryName() override;
+  llvm::SmallVector<llvm::StringRef> GetDeviceSupportDirectoryNames() override;
   llvm::StringRef GetPlatformName() override;
 };
 
diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp
index d6f573bbe2754c2..5342d791018d8dd 100644
--- a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp
+++ b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp
@@ -148,8 +148,9 @@ bool PlatformRemoteiOS::CheckLocalSharedCache() const {
   return true;
 }
 
-llvm::StringRef PlatformRemoteiOS::GetDeviceSupportDirectoryName() {
-  return "iOS DeviceSupport";
+llvm::SmallVector<llvm::StringRef>
+PlatformRemoteiOS::GetDeviceSupportDirectoryNames() {
+  return {"iOS DeviceSupport"};
 }
 
 llvm::StringRef PlatformRemoteiOS::GetPlatformName() {
diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.h b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.h
index 991bf1d4dd1a371..23ac184bbd42d8c 100644
--- a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.h
+++ b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.h
@@ -42,7 +42,7 @@ class PlatformRemoteiOS : public PlatformRemoteDarwinDevice {
 protected:
   bool CheckLocalSharedCache() const override;
 
-  llvm::StringRef GetDeviceSupportDirectoryName() override;
+  llvm::SmallVector<llvm::StringRef> GetDeviceSupportDirectoryNames() override;
   llvm::StringRef GetPlatformName() override;
 };
 



More information about the lldb-commits mailing list