[Lldb-commits] [lldb] 7e9bab6 - Fix debugserver's qProcessInfo reporting of maccatalyst binaries

Adrian Prantl via lldb-commits lldb-commits at lists.llvm.org
Tue Aug 4 16:42:36 PDT 2020


Author: Adrian Prantl
Date: 2020-08-04T16:42:14-07:00
New Revision: 7e9bab6ad51af1cab0c7457e4323166af3ac797c

URL: https://github.com/llvm/llvm-project/commit/7e9bab6ad51af1cab0c7457e4323166af3ac797c
DIFF: https://github.com/llvm/llvm-project/commit/7e9bab6ad51af1cab0c7457e4323166af3ac797c.diff

LOG: Fix debugserver's qProcessInfo reporting of maccatalyst binaries

This patch is similar in spirit to https://reviews.llvm.org/D84480,
but does the maccatalyst/macosx disambiguation. I also took the
opportunity to factor out the gdb-remote packet log scanning used by
several testcases into lldbutil functions.

rdar://problem/66059257

Differential Revision: https://reviews.llvm.org/D84576

Added: 
    lldb/test/API/macosx/macCatalyst/Makefile
    lldb/test/API/macosx/macCatalyst/TestMacCatalyst.py
    lldb/test/API/macosx/macCatalyst/main.c
    lldb/test/API/macosx/macCatalystAppMacOSFramework/Makefile
    lldb/test/API/macosx/macCatalystAppMacOSFramework/TestMacCatalystAppWithMacOSFramework.py
    lldb/test/API/macosx/macCatalystAppMacOSFramework/foo.c
    lldb/test/API/macosx/macCatalystAppMacOSFramework/foo.h
    lldb/test/API/macosx/macCatalystAppMacOSFramework/main.c

Modified: 
    lldb/packages/Python/lldbsuite/test/lldbutil.py
    lldb/test/API/macosx/simulator/TestSimulatorPlatform.py
    lldb/tools/debugserver/source/DNB.cpp
    lldb/tools/debugserver/source/DNB.h
    lldb/tools/debugserver/source/MacOSX/MachProcess.h
    lldb/tools/debugserver/source/MacOSX/MachProcess.mm
    lldb/tools/debugserver/source/RNBRemote.cpp

Removed: 
    lldb/test/API/macosx/macabi/Makefile
    lldb/test/API/macosx/macabi/TestMacABImacOSFramework.py
    lldb/test/API/macosx/macabi/foo.c
    lldb/test/API/macosx/macabi/foo.h
    lldb/test/API/macosx/macabi/main.c


################################################################################
diff  --git a/lldb/packages/Python/lldbsuite/test/lldbutil.py b/lldb/packages/Python/lldbsuite/test/lldbutil.py
index 1ce6844d973c..1b366f295540 100644
--- a/lldb/packages/Python/lldbsuite/test/lldbutil.py
+++ b/lldb/packages/Python/lldbsuite/test/lldbutil.py
@@ -1458,3 +1458,40 @@ def wait_for_file_on_target(testcase, file_path, max_attempts=6):
             (file_path, max_attempts))
 
     return read_file_on_target(testcase, file_path)
+
+def packetlog_get_process_info(log):
+    """parse a gdb-remote packet log file and extract the response to qProcessInfo"""
+    process_info = dict()
+    with open(log, "r") as logfile:
+        process_info_ostype = None
+        expect_process_info_response = False
+        for line in logfile:
+            if expect_process_info_response:
+                for pair in line.split(';'):
+                    keyval = pair.split(':')
+                    if len(keyval) == 2:
+                        process_info[keyval[0]] = keyval[1]
+                break
+            if 'send packet: $qProcessInfo#' in line:
+                expect_process_info_response = True
+    return process_info
+
+def packetlog_get_dylib_info(log):
+    """parse a gdb-remote packet log file and extract the *last* response to jGetLoadedDynamicLibrariesInfos"""
+    import json
+    dylib_info = None
+    with open(log, "r") as logfile:
+        dylib_info = None
+        expect_dylib_info_response = False
+        for line in logfile:
+            if expect_dylib_info_response:
+                while line[0] != '$':
+                    line = line[1:]
+                line = line[1:]
+                # Unescape '}'.
+                dylib_info = json.loads(line.replace('}]','}')[:-4])
+                expect_dylib_info_response = False
+            if 'send packet: $jGetLoadedDynamicLibrariesInfos:{' in line:
+                expect_dylib_info_response = True
+
+    return dylib_info

diff  --git a/lldb/test/API/macosx/macCatalyst/Makefile b/lldb/test/API/macosx/macCatalyst/Makefile
new file mode 100644
index 000000000000..9b9224571fdd
--- /dev/null
+++ b/lldb/test/API/macosx/macCatalyst/Makefile
@@ -0,0 +1,10 @@
+C_SOURCES := main.c
+
+TRIPLE := $(ARCH)-apple-ios13.0-macabi
+CFLAGS_EXTRAS := -target $(TRIPLE)
+
+# FIXME: rdar://problem/54986190
+# There is a Clang driver change missing on llvm.org.
+override CC=xcrun clang
+
+include Makefile.rules

diff  --git a/lldb/test/API/macosx/macCatalyst/TestMacCatalyst.py b/lldb/test/API/macosx/macCatalyst/TestMacCatalyst.py
new file mode 100644
index 000000000000..555d5a13b555
--- /dev/null
+++ b/lldb/test/API/macosx/macCatalyst/TestMacCatalyst.py
@@ -0,0 +1,43 @@
+import lldb
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test.decorators import *
+import lldbsuite.test.lldbutil as lldbutil
+import os
+import unittest2
+
+
+class TestMacCatalyst(TestBase):
+
+    mydir = TestBase.compute_mydir(__file__)
+
+    @skipIf(macos_version=["<", "10.15"])
+    @skipUnlessDarwin
+    @skipIfDarwinEmbedded
+    @skipIfReproducer # This is hitting https://bugs.python.org/issue22393
+    def test_macabi(self):
+        """Test the x86_64-apple-ios-macabi target linked against a macos dylib"""
+        self.build()
+        log = self.getBuildArtifact('packets.log')
+        self.expect("log enable gdb-remote packets -f "+log)
+        lldbutil.run_to_source_breakpoint(self, "break here",
+                                          lldb.SBFileSpec('main.c'))
+        self.expect("image list -t -b",
+                    patterns=[self.getArchitecture() +
+                              r'.*-apple-ios.*-macabi a\.out'])
+        self.expect("fr v s", "Hello macCatalyst")
+        self.expect("p s", "Hello macCatalyst")
+        self.check_debugserver(log)
+
+    def check_debugserver(self, log):
+        """scan the debugserver packet log"""
+        process_info = lldbutil.packetlog_get_process_info(log)
+        self.assertTrue('ostype' in process_info)
+        self.assertEquals(process_info['ostype'], 'maccatalyst')
+
+        aout_info = None
+        dylib_info = lldbutil.packetlog_get_dylib_info(log)
+        for image in dylib_info['images']:
+            if image['pathname'].endswith('a.out'):
+                aout_info = image
+        self.assertTrue(aout_info)
+        self.assertEquals(aout_info['min_version_os_name'], 'maccatalyst')

diff  --git a/lldb/test/API/macosx/macCatalyst/main.c b/lldb/test/API/macosx/macCatalyst/main.c
new file mode 100644
index 000000000000..ef224fb0987e
--- /dev/null
+++ b/lldb/test/API/macosx/macCatalyst/main.c
@@ -0,0 +1,4 @@
+int main() {
+  const char *s = "Hello macCatalyst!";
+  return 0; // break here
+}

diff  --git a/lldb/test/API/macosx/macabi/Makefile b/lldb/test/API/macosx/macCatalystAppMacOSFramework/Makefile
similarity index 70%
rename from lldb/test/API/macosx/macabi/Makefile
rename to lldb/test/API/macosx/macCatalystAppMacOSFramework/Makefile
index 2123af1dd701..96fbf4a9cf17 100644
--- a/lldb/test/API/macosx/macabi/Makefile
+++ b/lldb/test/API/macosx/macCatalystAppMacOSFramework/Makefile
@@ -1,9 +1,12 @@
 C_SOURCES := main.c
 LD_EXTRAS := -L. -lfoo
 
-TRIPLE := x86_64-apple-ios13.0-macabi
+TRIPLE := $(ARCH)-apple-ios13.0-macabi
 CFLAGS_EXTRAS := -target $(TRIPLE)
 
+# FIXME: rdar://problem/54986190
+override CC=xcrun clang
+
 all: libfoo.dylib a.out
 
 libfoo.dylib: foo.c

diff  --git a/lldb/test/API/macosx/macCatalystAppMacOSFramework/TestMacCatalystAppWithMacOSFramework.py b/lldb/test/API/macosx/macCatalystAppMacOSFramework/TestMacCatalystAppWithMacOSFramework.py
new file mode 100644
index 000000000000..46c0efd9d526
--- /dev/null
+++ b/lldb/test/API/macosx/macCatalystAppMacOSFramework/TestMacCatalystAppWithMacOSFramework.py
@@ -0,0 +1,51 @@
+import lldb
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test.decorators import *
+import lldbsuite.test.lldbutil as lldbutil
+import os
+import unittest2
+
+
+class TestMacCatalystAppWithMacOSFramework(TestBase):
+
+    mydir = TestBase.compute_mydir(__file__)
+
+    @skipIf(macos_version=["<", "10.15"])
+    @skipUnlessDarwin
+    @skipIfDarwinEmbedded
+    # There is a Clang driver change missing on llvm.org.
+    @expectedFailureAll(bugnumber="rdar://problem/54986190>")
+    @skipIfReproducer # This is hitting https://bugs.python.org/issue22393
+    def test(self):
+        """Test the x86_64-apple-ios-macabi target linked against a macos dylib"""
+        self.build()
+        log = self.getBuildArtifact('packets.log')
+        self.expect("log enable gdb-remote packets -f "+log)
+        lldbutil.run_to_source_breakpoint(self, "break here",
+                                          lldb.SBFileSpec('main.c'))
+        arch = self.getArchitecture()
+        self.expect("image list -t -b",
+                    patterns=[arch + r'.*-apple-ios.*-macabi a\.out',
+                              arch + r'.*-apple-macosx.* libfoo.dylib[^(]'])
+        self.expect("fr v s", "Hello macCatalyst")
+        self.expect("p s", "Hello macCatalyst")
+        self.check_debugserver(log)
+
+    def check_debugserver(self, log):
+        """scan the debugserver packet log"""
+        process_info = lldbutil.packetlog_get_process_info(log)
+        self.assertTrue('ostype' in process_info)
+        self.assertEquals(process_info['ostype'], 'maccatalyst')
+
+        aout_info = None
+        libfoo_info = None
+        dylib_info = lldbutil.packetlog_get_dylib_info(log)
+        for image in dylib_info['images']:
+            if image['pathname'].endswith('a.out'):
+                aout_info = image
+            if image['pathname'].endswith('libfoo.dylib'):
+                libfoo_info = image
+        self.assertTrue(aout_info)
+        self.assertTrue(libfoo_info)
+        self.assertEquals(aout_info['min_version_os_name'], 'maccatalyst')
+        self.assertEquals(libfoo_info['min_version_os_name'], 'macosx')

diff  --git a/lldb/test/API/macosx/macabi/foo.c b/lldb/test/API/macosx/macCatalystAppMacOSFramework/foo.c
similarity index 100%
rename from lldb/test/API/macosx/macabi/foo.c
rename to lldb/test/API/macosx/macCatalystAppMacOSFramework/foo.c

diff  --git a/lldb/test/API/macosx/macabi/foo.h b/lldb/test/API/macosx/macCatalystAppMacOSFramework/foo.h
similarity index 100%
rename from lldb/test/API/macosx/macabi/foo.h
rename to lldb/test/API/macosx/macCatalystAppMacOSFramework/foo.h

diff  --git a/lldb/test/API/macosx/macabi/main.c b/lldb/test/API/macosx/macCatalystAppMacOSFramework/main.c
similarity index 60%
rename from lldb/test/API/macosx/macabi/main.c
rename to lldb/test/API/macosx/macCatalystAppMacOSFramework/main.c
index 92069d902fd0..164fe25f308a 100644
--- a/lldb/test/API/macosx/macabi/main.c
+++ b/lldb/test/API/macosx/macCatalystAppMacOSFramework/main.c
@@ -1,5 +1,5 @@
 #include "foo.h"
 int main() {
-  const char *s = "Hello MacABI!";
+  const char *s = "Hello macCatalyst!";
   return foo(); // break here
 }

diff  --git a/lldb/test/API/macosx/macabi/TestMacABImacOSFramework.py b/lldb/test/API/macosx/macabi/TestMacABImacOSFramework.py
deleted file mode 100644
index aff99e3e2804..000000000000
--- a/lldb/test/API/macosx/macabi/TestMacABImacOSFramework.py
+++ /dev/null
@@ -1,28 +0,0 @@
-import lldb
-from lldbsuite.test.lldbtest import *
-from lldbsuite.test.decorators import *
-import lldbsuite.test.lldbutil as lldbutil
-import os
-import unittest2
-
-
-class TestMacABImacOSFramework(TestBase):
-
-    mydir = TestBase.compute_mydir(__file__)
-
-    @skipIf(macos_version=["<", "10.15"])
-    @skipUnlessDarwin
-    @skipIfDarwinEmbedded
-    # There is a Clang driver change missing on llvm.org.
-    @expectedFailureAll(bugnumber="rdar://problem/54986190>")
-    @skipIfReproducer # This is hitting https://bugs.python.org/issue22393
-    def test_macabi(self):
-        """Test the x86_64-apple-ios-macabi target linked against a macos dylib"""
-        self.build()
-        lldbutil.run_to_source_breakpoint(self, "break here",
-                                          lldb.SBFileSpec('main.c'))
-        self.expect("image list -t -b",
-                    patterns=["x86_64.*-apple-ios.*-macabi a\.out",
-                              "x86_64.*-apple-macosx.* libfoo.dylib[^(]"])
-        self.expect("fr v s", "Hello MacABI")
-        self.expect("p s", "Hello MacABI")

diff  --git a/lldb/test/API/macosx/simulator/TestSimulatorPlatform.py b/lldb/test/API/macosx/simulator/TestSimulatorPlatform.py
index 824cb9eee295..9b5aed1ed619 100644
--- a/lldb/test/API/macosx/simulator/TestSimulatorPlatform.py
+++ b/lldb/test/API/macosx/simulator/TestSimulatorPlatform.py
@@ -25,30 +25,10 @@ def check_load_commands(self, expected_load_command):
 
     def check_debugserver(self, log, expected_platform, expected_version):
         """scan the debugserver packet log"""
-        logfile = open(log, "r")
-        dylib_info = None
-        process_info_ostype = None
-        expect_dylib_info_response = False
-        expect_process_info_response = False
-        for line in logfile:
-            if expect_dylib_info_response:
-                while line[0] != '$':
-                    line = line[1:]
-                line = line[1:]
-                # Unescape '}'.
-                dylib_info = json.loads(line.replace('}]','}')[:-4])
-                expect_dylib_info_response = False
-            if 'send packet: $jGetLoadedDynamicLibrariesInfos:{' in line:
-                expect_dylib_info_response = True
-            if expect_process_info_response:
-                for pair in line.split(';'):
-                    keyval = pair.split(':')
-                    if len(keyval) == 2 and keyval[0] == 'ostype':
-                        process_info_ostype = keyval[1]
-            if 'send packet: $qProcessInfo#' in line:
-                expect_process_info_response = True
-
-        self.assertEquals(process_info_ostype, expected_platform)
+        process_info = lldbutil.packetlog_get_process_info(log)
+        self.assertTrue('ostype' in process_info)
+        self.assertEquals(process_info['ostype'], expected_platform)
+        dylib_info = lldbutil.packetlog_get_dylib_info(log)
         self.assertTrue(dylib_info)
         aout_info = None
         for image in dylib_info['images']:

diff  --git a/lldb/tools/debugserver/source/DNB.cpp b/lldb/tools/debugserver/source/DNB.cpp
index 3c1cd85dc310..afafe0d0474a 100644
--- a/lldb/tools/debugserver/source/DNB.cpp
+++ b/lldb/tools/debugserver/source/DNB.cpp
@@ -1418,19 +1418,20 @@ nub_bool_t DNBProcessSharedLibrariesUpdated(nub_process_t pid) {
   return false;
 }
 
-const char *DNBGetDeploymentInfo(nub_process_t pid,
-                                 const struct load_command& lc,
+const char *DNBGetDeploymentInfo(nub_process_t pid, bool is_executable,
+                                 const struct load_command &lc,
                                  uint64_t load_command_address,
-                                 uint32_t& major_version,
-                                 uint32_t& minor_version,
-                                 uint32_t& patch_version) {
+                                 uint32_t &major_version,
+                                 uint32_t &minor_version,
+                                 uint32_t &patch_version) {
   MachProcessSP procSP;
   if (GetProcessSP(pid, procSP)) {
     // FIXME: This doesn't return the correct result when xctest (a
     // macOS binary) is loaded with the macCatalyst dyld platform
     // override. The image info corrects for this, but qProcessInfo
     // will return what is in the binary.
-    auto info = procSP->GetDeploymentInfo(lc, load_command_address);
+    auto info =
+        procSP->GetDeploymentInfo(lc, load_command_address, is_executable);
     major_version = info.major_version;
     minor_version = info.minor_version;
     patch_version = info.patch_version;
@@ -1439,7 +1440,6 @@ const char *DNBGetDeploymentInfo(nub_process_t pid,
   return nullptr;
 }
 
-
 // Get the current shared library information for a process. Only return
 // the shared libraries that have changed since the last shared library
 // state changed event if only_changed is non-zero.

diff  --git a/lldb/tools/debugserver/source/DNB.h b/lldb/tools/debugserver/source/DNB.h
index e0e1cdd6d8b6..8364ec0c1162 100644
--- a/lldb/tools/debugserver/source/DNB.h
+++ b/lldb/tools/debugserver/source/DNB.h
@@ -128,12 +128,12 @@ nub_bool_t DNBProcessSharedLibrariesUpdated(nub_process_t pid) DNB_EXPORT;
 nub_size_t
 DNBProcessGetSharedLibraryInfo(nub_process_t pid, nub_bool_t only_changed,
                                DNBExecutableImageInfo **image_infos) DNB_EXPORT;
-const char *DNBGetDeploymentInfo(nub_process_t pid,
-                                 const struct load_command& lc,
+const char *DNBGetDeploymentInfo(nub_process_t pid, bool is_executable,
+                                 const struct load_command &lc,
                                  uint64_t load_command_address,
-                                 uint32_t& major_version,
-                                 uint32_t& minor_version,
-                                 uint32_t& patch_version);
+                                 uint32_t &major_version,
+                                 uint32_t &minor_version,
+                                 uint32_t &patch_version);
 nub_bool_t DNBProcessSetNameToAddressCallback(nub_process_t pid,
                                               DNBCallbackNameToAddress callback,
                                               void *baton) DNB_EXPORT;

diff  --git a/lldb/tools/debugserver/source/MacOSX/MachProcess.h b/lldb/tools/debugserver/source/MacOSX/MachProcess.h
index 9d712390ac2a..7eb663cc2d51 100644
--- a/lldb/tools/debugserver/source/MacOSX/MachProcess.h
+++ b/lldb/tools/debugserver/source/MacOSX/MachProcess.h
@@ -241,7 +241,8 @@ class MachProcess {
     uint32_t patch_version = 0;
   };
   DeploymentInfo GetDeploymentInfo(const struct load_command &,
-                                   uint64_t load_command_address);
+                                   uint64_t load_command_address,
+                                   bool is_executable);
   static const char *GetPlatformString(unsigned char platform);
   bool GetMachOInformationFromMemory(uint32_t platform,
                                      nub_addr_t mach_o_header_addr,
@@ -249,7 +250,15 @@ class MachProcess {
                                      struct mach_o_information &inf);
   JSONGenerator::ObjectSP FormatDynamicLibrariesIntoJSON(
       const std::vector<struct binary_image_information> &image_infos);
-  uint32_t GetAllLoadedBinariesViaDYLDSPI(
+  /// Get the runtime platform from DYLD via SPI.
+  uint32_t GetProcessPlatformViaDYLDSPI();
+  /// Use the dyld SPI present in macOS 10.12, iOS 10, tvOS 10,
+  /// watchOS 3 and newer to get the load address, uuid, and filenames
+  /// of all the libraries.  This only fills in those three fields in
+  /// the 'struct binary_image_information' - call
+  /// GetMachOInformationFromMemory to fill in the mach-o header/load
+  /// command details.
+  void GetAllLoadedBinariesViaDYLDSPI(
       std::vector<struct binary_image_information> &image_infos);
   JSONGenerator::ObjectSP GetLoadedDynamicLibrariesInfos(
       nub_process_t pid, nub_addr_t image_list_address, nub_addr_t image_count);

diff  --git a/lldb/tools/debugserver/source/MacOSX/MachProcess.mm b/lldb/tools/debugserver/source/MacOSX/MachProcess.mm
index 10eaf38ea435..d3c2f52a972a 100644
--- a/lldb/tools/debugserver/source/MacOSX/MachProcess.mm
+++ b/lldb/tools/debugserver/source/MacOSX/MachProcess.mm
@@ -93,6 +93,7 @@ static CFStringRef CopyBundleIDForPath(const char *app_bundle_path,
 typedef bool (*CallOpenApplicationFunction)(NSString *bundleIDNSStr,
                                             NSDictionary *options,
                                             DNBError &error, pid_t *return_pid);
+
 // This function runs the BKSSystemService (or FBSSystemService) method
 // openApplication:options:clientPort:withResult,
 // messaging the app passed in bundleIDNSStr.
@@ -483,6 +484,7 @@ static bool FBSAddEventDataToOptions(NSMutableDictionary *options,
 #define _POSIX_SPAWN_DISABLE_ASLR 0x0100
 #endif
 
+
 MachProcess::MachProcess()
     : m_pid(0), m_cpu_type(0), m_child_stdin(-1), m_child_stdout(-1),
       m_child_stderr(-1), m_path(), m_args(), m_task(this),
@@ -603,9 +605,11 @@ static bool FBSAddEventDataToOptions(NSMutableDictionary *options,
 
 MachProcess::DeploymentInfo
 MachProcess::GetDeploymentInfo(const struct load_command &lc,
-                               uint64_t load_command_address) {
+                               uint64_t load_command_address,
+                               bool is_executable) {
   DeploymentInfo info;
   uint32_t cmd = lc.cmd & ~LC_REQ_DYLD;
+
   // Handle the older LC_VERSION load commands, which don't
   // distinguish between simulator and real hardware.
   auto handle_version_min = [&](char platform) {
@@ -640,6 +644,7 @@ static bool FBSAddEventDataToOptions(NSMutableDictionary *options,
     // unambiguous LC_BUILD_VERSION load commands.
 #endif
   };
+
   switch (cmd) {
   case LC_VERSION_MIN_IPHONEOS:
     handle_version_min(PLATFORM_IOS);
@@ -667,6 +672,27 @@ static bool FBSAddEventDataToOptions(NSMutableDictionary *options,
   }
 #endif
   }
+
+  // The xctest binary is a pure macOS binary but is launched with
+  // DYLD_FORCE_PLATFORM=6. In that case, force the platform to
+  // macCatalyst and use the macCatalyst version of the host OS
+  // instead of the macOS deployment target.
+  if (is_executable && GetProcessPlatformViaDYLDSPI() == PLATFORM_MACCATALYST) {
+    info.platform = PLATFORM_MACCATALYST;
+    std::string catalyst_version = GetMacCatalystVersionString();
+    const char *major = catalyst_version.c_str();
+    char *minor = nullptr;
+    char *patch = nullptr;
+    info.major_version = std::strtoul(major, &minor, 10);
+    info.minor_version = 0;
+    info.patch_version = 0;
+    if (minor && *minor == '.') {
+      info.minor_version = std::strtoul(++minor, &patch, 10);
+      if (patch && *patch == '.')
+        info.patch_version = std::strtoul(++patch, nullptr, 10);
+    }
+  }
+
   return info;
 }
 
@@ -798,37 +824,21 @@ static bool FBSAddEventDataToOptions(NSMutableDictionary *options,
           sizeof(struct uuid_command))
         uuid_copy(inf.uuid, uuidcmd.uuid);
     }
-    if (DeploymentInfo deployment_info = GetDeploymentInfo(lc, load_cmds_p)) {
+    if (DeploymentInfo deployment_info = GetDeploymentInfo(
+            lc, load_cmds_p, inf.mach_header.filetype == MH_EXECUTE)) {
       const char *lc_platform = GetPlatformString(deployment_info.platform);
-      // macCatalyst support.
-      //
-      // This handles two special cases:
-      //
-      // 1. Frameworks that have both a PLATFORM_MACOS and a
-      //    PLATFORM_MACCATALYST load command.  Make sure to select
-      //    the requested one.
-      //
-      // 2. The xctest binary is a pure macOS binary but is launched
-      //    with DYLD_FORCE_PLATFORM=6.
-      if (dyld_platform == PLATFORM_MACCATALYST &&
-          inf.mach_header.filetype == MH_EXECUTE &&
-          inf.min_version_os_name.empty() &&
-          (strcmp("macosx", lc_platform) == 0)) {
-        // DYLD says this *is* a macCatalyst process. If we haven't
-        // parsed any load commands, transform a macOS load command
-        // into a generic macCatalyst load command. It will be
-        // overwritten by a more specific one if there is one.  This
-        // is only done for the main executable. It is perfectly fine
-        // for a macCatalyst binary to link against a macOS-only framework.
-        inf.min_version_os_name = "maccatalyst";
-        inf.min_version_os_version = GetMacCatalystVersionString();
-      } else if (dyld_platform != PLATFORM_MACCATALYST &&
-                 inf.min_version_os_name == "macosx") {
-        // This is a binary with both PLATFORM_MACOS and
-        // PLATFORM_MACCATALYST load commands and the process is not
-        // running as PLATFORM_MACCATALYST. Stick with the
-        // "macosx" load command that we've already processed,
-        // ignore this one, which is presumed to be a
+      if (dyld_platform != PLATFORM_MACCATALYST &&
+          inf.min_version_os_name == "macosx") {
+        // macCatalyst support.
+        //
+        // This the special case of "zippered" frameworks that have both
+        // a PLATFORM_MACOS and a PLATFORM_MACCATALYST load command.
+        //
+        // When we are in this block, this is a binary with both
+        // PLATFORM_MACOS and PLATFORM_MACCATALYST load commands and
+        // the process is not running as PLATFORM_MACCATALYST. Stick
+        // with the "macosx" load command that we've already
+        // processed, ignore this one, which is presumed to be a
         // PLATFORM_MACCATALYST one.
       } else {
         inf.min_version_os_name = lc_platform;
@@ -1056,25 +1066,36 @@ static bool FBSAddEventDataToOptions(NSMutableDictionary *options,
   return reply_sp;
 }
 
-// From dyld SPI header dyld_process_info.h
+/// From dyld SPI header dyld_process_info.h
 typedef void *dyld_process_info;
 struct dyld_process_cache_info {
-  uuid_t cacheUUID;          // UUID of cache used by process
-  uint64_t cacheBaseAddress; // load address of dyld shared cache
-  bool noCache;              // process is running without a dyld cache
-  bool privateCache; // process is using a private copy of its dyld cache
+  /// UUID of cache used by process.
+  uuid_t cacheUUID;
+  /// Load address of dyld shared cache.
+  uint64_t cacheBaseAddress;
+  /// Process is running without a dyld cache.
+  bool noCache;
+  /// Process is using a private copy of its dyld cache.
+  bool privateCache;
 };
 
-// Use the dyld SPI present in macOS 10.12, iOS 10, tvOS 10, watchOS 3 and newer
-// to get
-// the load address, uuid, and filenames of all the libraries.
-// This only fills in those three fields in the 'struct
-// binary_image_information' - call
-// GetMachOInformationFromMemory to fill in the mach-o header/load command
-// details.
-uint32_t MachProcess::GetAllLoadedBinariesViaDYLDSPI(
-    std::vector<struct binary_image_information> &image_infos) {
+uint32_t MachProcess::GetProcessPlatformViaDYLDSPI() {
+  kern_return_t kern_ret;
   uint32_t platform = 0;
+  if (m_dyld_process_info_create) {
+    dyld_process_info info =
+        m_dyld_process_info_create(m_task.TaskPort(), 0, &kern_ret);
+    if (info) {
+      if (m_dyld_process_info_get_platform)
+        platform = m_dyld_process_info_get_platform(info);
+      m_dyld_process_info_release(info);
+    }
+  }
+  return platform;
+}
+
+void MachProcess::GetAllLoadedBinariesViaDYLDSPI(
+    std::vector<struct binary_image_information> &image_infos) {
   kern_return_t kern_ret;
   if (m_dyld_process_info_create) {
     dyld_process_info info =
@@ -1089,12 +1110,9 @@ static bool FBSAddEventDataToOptions(NSMutableDictionary *options,
             image.load_address = mach_header_addr;
             image_infos.push_back(image);
           });
-      if (m_dyld_process_info_get_platform)
-        platform = m_dyld_process_info_get_platform(info);
       m_dyld_process_info_release(info);
     }
   }
-  return platform;
 }
 
 // Fetch information about all shared libraries using the dyld SPIs that exist
@@ -1115,7 +1133,8 @@ static bool FBSAddEventDataToOptions(NSMutableDictionary *options,
       pointer_size = 8;
 
     std::vector<struct binary_image_information> image_infos;
-    uint32_t platform = GetAllLoadedBinariesViaDYLDSPI(image_infos);
+    GetAllLoadedBinariesViaDYLDSPI(image_infos);
+    uint32_t platform = GetProcessPlatformViaDYLDSPI();
     const size_t image_count = image_infos.size();
     for (size_t i = 0; i < image_count; i++) {
       GetMachOInformationFromMemory(platform,
@@ -1145,7 +1164,8 @@ static bool FBSAddEventDataToOptions(NSMutableDictionary *options,
       pointer_size = 8;
 
     std::vector<struct binary_image_information> all_image_infos;
-    uint32_t platform = GetAllLoadedBinariesViaDYLDSPI(all_image_infos);
+    GetAllLoadedBinariesViaDYLDSPI(all_image_infos);
+    uint32_t platform = GetProcessPlatformViaDYLDSPI();
 
     std::vector<struct binary_image_information> image_infos;
     const size_t macho_addresses_count = macho_addresses.size();
@@ -1173,7 +1193,7 @@ static bool FBSAddEventDataToOptions(NSMutableDictionary *options,
 
 JSONGenerator::ObjectSP MachProcess::GetSharedCacheInfo(nub_process_t pid) {
   JSONGenerator::DictionarySP reply_sp(new JSONGenerator::Dictionary());
-  ;
+
   kern_return_t kern_ret;
   if (m_dyld_process_info_create && m_dyld_process_info_get_cache) {
     dyld_process_info info =

diff  --git a/lldb/tools/debugserver/source/RNBRemote.cpp b/lldb/tools/debugserver/source/RNBRemote.cpp
index 8a3045564aaf..5e2512731f39 100644
--- a/lldb/tools/debugserver/source/RNBRemote.cpp
+++ b/lldb/tools/debugserver/source/RNBRemote.cpp
@@ -6356,10 +6356,11 @@ rnb_err_t RNBRemote::HandlePacket_qProcessInfo(const char *p) {
             DNBProcessMemoryRead(pid, load_command_addr, sizeof(lc), &lc);
         (void)bytes_read;
 
+        bool is_executable = true;
         uint32_t major_version, minor_version, patch_version;
-        auto *platform = DNBGetDeploymentInfo(pid, lc, load_command_addr,
-                                              major_version, minor_version,
-                                              patch_version);
+        auto *platform =
+            DNBGetDeploymentInfo(pid, is_executable, lc, load_command_addr,
+                                 major_version, minor_version, patch_version);
         if (platform) {
           os_handled = true;
           rep << "ostype:" << platform << ";";


        


More information about the lldb-commits mailing list