This revision was automatically updated to reflect the committed changes.
Closed by commit rG59d816d88464: Correctly identify iOS simulator processes in 
debugserver. (authored by aprantl).
Herald added a project: LLDB.

Changed prior to commit:
  https://reviews.llvm.org/D75696?vs=248634&id=248776#toc

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D75696/new/

https://reviews.llvm.org/D75696

Files:
  lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp
  lldb/test/API/functionalities/gdb_remote_client/TestIOSSimulator.py
  lldb/test/API/functionalities/gdb_remote_client/TestWasm.py
  lldb/test/API/functionalities/gdb_remote_client/gdbclientutils.py
  lldb/tools/debugserver/source/MacOSX/MachProcess.mm

Index: lldb/tools/debugserver/source/MacOSX/MachProcess.mm
===================================================================
--- lldb/tools/debugserver/source/MacOSX/MachProcess.mm
+++ lldb/tools/debugserver/source/MacOSX/MachProcess.mm
@@ -598,6 +598,16 @@
       plo_pthread_tsd_entry_size);
 }
 
+/// Determine whether this is running on macOS.
+/// Since debugserver runs on the same machine as the process, we can
+/// just look at the compilation target.
+static bool IsMacOSHost() {
+#if TARGET_OS_OSX == 1
+  return true;
+#else
+  return false;
+#endif
+}
 
 const char *MachProcess::GetDeploymentInfo(const struct load_command& lc,
                                            uint64_t load_command_address,
@@ -619,15 +629,17 @@
     minor_version = (vers_cmd.sdk >> 8) & 0xffu;
     patch_version = vers_cmd.sdk & 0xffu;
 
+    // Handle the older LC_VERSION load commands, which don't
+    // distinguish between simulator and real hardware.
     switch (cmd) {
     case LC_VERSION_MIN_IPHONEOS:
-      return "ios";
+      return IsMacOSHost() ? "iossimulator": "ios";
     case LC_VERSION_MIN_MACOSX:
       return "macosx";
     case LC_VERSION_MIN_TVOS:
-      return "tvos";
+      return IsMacOSHost() ? "tvossimulator": "tvos";
     case LC_VERSION_MIN_WATCHOS:
-      return "watchos";
+      return IsMacOSHost() ? "watchossimulator" : "watchos";
     default:
       return nullptr;
     }
@@ -649,14 +661,17 @@
     case PLATFORM_MACCATALYST:
       return "maccatalyst";
     case PLATFORM_IOS:
-    case PLATFORM_IOSSIMULATOR:
       return "ios";
+    case PLATFORM_IOSSIMULATOR:
+      return "iossimulator";
     case PLATFORM_TVOS:
-    case PLATFORM_TVOSSIMULATOR:
       return "tvos";
+    case PLATFORM_TVOSSIMULATOR:
+      return "tvossimulator";
     case PLATFORM_WATCHOS:
-    case PLATFORM_WATCHOSSIMULATOR:
       return "watchos";
+    case PLATFORM_WATCHOSSIMULATOR:
+      return "watchossimulator";
     case PLATFORM_BRIDGEOS:
       return "bridgeos";
     case PLATFORM_DRIVERKIT:
Index: lldb/test/API/functionalities/gdb_remote_client/gdbclientutils.py
===================================================================
--- lldb/test/API/functionalities/gdb_remote_client/gdbclientutils.py
+++ lldb/test/API/functionalities/gdb_remote_client/gdbclientutils.py
@@ -170,6 +170,8 @@
             return self.qQueryGDBServer()
         if packet == "qHostInfo":
             return self.qHostInfo()
+        if packet == "qProcessInfo":
+            return self.qProcessInfo()
         if packet == "qGetWorkingDir":
             return self.qGetWorkingDir()
         if packet == "qOffsets":
@@ -196,6 +198,9 @@
     def qHostInfo(self):
         return "ptrsize:8;endian:little;"
 
+    def qProcessInfo(self):
+        return "pid:1;ptrsize:8;endian:little;"
+    
     def qQueryGDBServer(self):
         return "E04"
 
Index: lldb/test/API/functionalities/gdb_remote_client/TestWasm.py
===================================================================
--- lldb/test/API/functionalities/gdb_remote_client/TestWasm.py
+++ lldb/test/API/functionalities/gdb_remote_client/TestWasm.py
@@ -31,8 +31,6 @@
         MockGDBServerResponder.__init__(self)
 
     def respond(self, packet):
-        if packet == "qProcessInfo":
-            return self.qProcessInfo()
         if packet[0:13] == "qRegisterInfo":
             return self.qRegisterInfo(packet[13:])
         return MockGDBServerResponder.respond(self, packet)
Index: lldb/test/API/functionalities/gdb_remote_client/TestIOSSimulator.py
===================================================================
--- /dev/null
+++ lldb/test/API/functionalities/gdb_remote_client/TestIOSSimulator.py
@@ -0,0 +1,58 @@
+import lldb
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test.decorators import *
+from gdbclientutils import *
+
+class TestIOSSimulator(GDBRemoteTestBase):
+    """
+    Test that an ios simulator process is recognized as such.
+    """
+
+    class MyResponder(MockGDBServerResponder):
+        def __init__(self, host, process):
+            self.host_ostype = host
+            self.process_ostype = process
+            MockGDBServerResponder.__init__(self)
+
+        def qHostInfo(self):
+            return "cputype:16777223;cpusubtype:8;ostype:%s;vendor:apple;os_version:10.15.4;maccatalyst_version:13.4;endian:little;ptrsize:8;"%self.host_ostype
+        def qProcessInfo(self):
+            return "pid:a860;parent-pid:d2a0;real-uid:1f5;real-gid:14;effective-uid:1f5;effective-gid:14;cputype:1000007;cpusubtype:8;ptrsize:8;ostype:%s;vendor:apple;endian:little;"%self.process_ostype
+        def vCont(self):
+            return "vCont;"
+    
+    def platform_test(self, host, process, expected_triple):
+        self.server.responder = self.MyResponder(host, process)
+        if self.TraceOn():
+            self.runCmd("log enable gdb-remote packets")
+            self.addTearDownHook(lambda: self.runCmd("log disable gdb-remote packets"))
+
+        target = self.dbg.CreateTargetWithFileAndArch(None, None)
+        process = self.connect(target)
+        triple = target.GetTriple()
+        self.assertEqual(triple, expected_triple)
+
+    @skipIfRemote
+    def test_macos(self):
+        self.platform_test(host="macosx", process="macosx",
+                           expected_triple="x86_64h-apple-macosx-")
+
+    @skipIfRemote
+    def test_ios_sim(self):
+        self.platform_test(host="macosx", process="iossimulator",
+                           expected_triple="x86_64h-apple-ios-simulator")
+
+    @skipIfRemote
+    def test_catalyst(self):
+        self.platform_test(host="macosx", process="maccatalyst",
+                           expected_triple="x86_64h-apple-ios-macabi")
+
+    @skipIfRemote
+    def test_tvos_sim(self):
+        self.platform_test(host="macosx", process="tvossimulator",
+                           expected_triple="x86_64h-apple-tvos-simulator")
+
+    @skipIfRemote
+    def test_tvos_sim(self):
+        self.platform_test(host="macosx", process="watchossimulator",
+                           expected_triple="x86_64h-apple-watchos-simulator")
Index: lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp
===================================================================
--- lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp
+++ lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp
@@ -1131,6 +1131,20 @@
   return true;
 }
 
+static void ParseOSType(llvm::StringRef value, std::string &os_name,
+                        std::string &environment) {
+  if (value.equals("iossimulator") || value.equals("tvossimulator") ||
+      value.equals("watchossimulator")) {
+    environment = "simulator";
+    os_name = value.drop_back(environment.size()).str();
+  } else if (value.equals("maccatalyst")) {
+    os_name = "ios";
+    environment = "macabi";
+  } else {
+    os_name = value.str();
+  }
+}
+
 bool GDBRemoteCommunicationClient::GetHostInfo(bool force) {
   Log *log(ProcessGDBRemoteLog::GetLogIfAnyCategoryIsSet(GDBR_LOG_PROCESS));
 
@@ -1189,11 +1203,7 @@
             extractor.GetHexByteString(m_os_kernel);
             ++num_keys_decoded;
           } else if (name.equals("ostype")) {
-            if (value.equals("maccatalyst")) {
-              os_name = "ios";
-              environment = "macabi";
-            } else
-              os_name = std::string(value);
+            ParseOSType(value, os_name, environment);
             ++num_keys_decoded;
           } else if (name.equals("vendor")) {
             vendor_name = std::string(value);
@@ -2053,11 +2063,7 @@
           extractor.GetHexByteString(triple);
           ++num_keys_decoded;
         } else if (name.equals("ostype")) {
-          if (value.equals("maccatalyst")) {
-            os_name = "ios";
-            environment = "macabi";
-          } else
-            os_name = std::string(value);
+          ParseOSType(value, os_name, environment);
           ++num_keys_decoded;
         } else if (name.equals("vendor")) {
           vendor_name = std::string(value);
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to