Fix debugserver reporting of deployment target
authorAdrian Prantl <aprantl@apple.com>
Thu, 9 Jul 2020 00:06:27 +0000 (17:06 -0700)
committerAdrian Prantl <aprantl@apple.com>
Thu, 9 Jul 2020 00:21:43 +0000 (17:21 -0700)
This patch fixes debugserver incorrectly returning the SDK version
instead of the minimum deployment target version.

rdar://problem/65001691

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

lldb/test/API/macosx/simulator/TestSimulatorPlatform.py
lldb/tools/debugserver/source/MacOSX/MachProcess.mm

index c12e920..6e67fdc 100644 (file)
@@ -23,14 +23,43 @@ class TestSimulatorPlatformLaunching(TestBase):
               found += 1
         self.assertEquals(found, 1, "wrong load command")
 
-
-    def run_with(self, arch, os, env, expected_load_command):
-        self.build(dictionary={'TRIPLE': arch+'-apple-'+os+'-'+env})
+    def check_debugserver(self, log, expected_platform, expected_version):
+        """scan the debugserver packet log"""
+        logfile = open(log, "r")
+        dylib_info = None
+        response = False
+        for line in logfile:
+            if response:
+                while line[0] != '$':
+                    line = line[1:]
+                line = line[1:]
+                # Unescape '}'.
+                dylib_info = json.loads(line.replace('}]','}')[:-4])
+                response = False
+            if 'send packet: $jGetLoadedDynamicLibrariesInfos:{' in line:
+                response = True
+
+        self.assertTrue(dylib_info)
+        aout_info = None
+        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'], expected_platform)
+        if expected_version:
+            self.assertEquals(aout_info['min_version_os_sdk'], expected_version)
+
+
+    def run_with(self, arch, os, vers, env, expected_load_command):
+        self.build(dictionary={'TRIPLE': arch+'-apple-'+os+vers+'-'+env})
+        self.check_load_commands(expected_load_command)
+        log = self.getBuildArtifact('packets.log')
+        self.expect("log enable gdb-remote packets -f "+log)
         lldbutil.run_to_source_breakpoint(self, "break here",
                                           lldb.SBFileSpec("hello.c"))
-        self.check_load_commands(expected_load_command)
         self.expect('image list -b -t',
-                    patterns=['a\.out '+arch+'-apple-'+os+'.*-'+env])
+                    patterns=['a\.out '+arch+'-apple-'+os+vers+'.*-'+env])
+        self.check_debugserver(log, os+env, vers)
 
     @skipUnlessDarwin
     @skipIfDarwinEmbedded
@@ -38,7 +67,7 @@ class TestSimulatorPlatformLaunching(TestBase):
     def test_ios(self):
         """Test running an iOS simulator binary"""
         self.run_with(arch=self.getArchitecture(),
-                      os='ios', env='simulator',
+                      os='ios', vers='', env='simulator',
                       expected_load_command='LC_BUILD_VERSION')
 
     @skipUnlessDarwin
@@ -47,7 +76,7 @@ class TestSimulatorPlatformLaunching(TestBase):
     def test_tvos(self):
         """Test running an tvOS simulator binary"""
         self.run_with(arch=self.getArchitecture(),
-                      os='tvos', env='simulator',
+                      os='tvos', vers='', env='simulator',
                       expected_load_command='LC_BUILD_VERSION')
 
     @skipUnlessDarwin
@@ -58,7 +87,7 @@ class TestSimulatorPlatformLaunching(TestBase):
     def test_watchos_i386(self):
         """Test running a 32-bit watchOS simulator binary"""
         self.run_with(arch='i386',
-                      os='watchos', env='simulator',
+                      os='watchos', vers='', env='simulator',
                       expected_load_command='LC_BUILD_VERSION')
 
     @skipUnlessDarwin
@@ -69,7 +98,7 @@ class TestSimulatorPlatformLaunching(TestBase):
     def test_watchos_armv7k(self):
         """Test running a 32-bit watchOS simulator binary"""
         self.run_with(arch='armv7k',
-                      os='watchos', env='simulator',
+                      os='watchos', vers='', env='simulator',
                       expected_load_command='LC_BUILD_VERSION')
 
 
@@ -90,17 +119,28 @@ class TestSimulatorPlatformLaunching(TestBase):
         """Test running a back-deploying iOS simulator binary
            with a legacy iOS load command"""
         self.run_with(arch=self.getArchitecture(),
-                      os='ios11.0', env='simulator',
+                      os='ios', vers='11.0', env='simulator',
                       expected_load_command='LC_VERSION_MIN_IPHONEOS')
 
     @skipUnlessDarwin
     @skipIfDarwinEmbedded
     @apple_simulator_test('iphone')
+    @skipIf(archs=['arm64','arm64e'])
+    def test_ios_backdeploy_x86(self):
+        """Test running a back-deploying iOS simulator binary
+           with a legacy iOS load command"""
+        self.run_with(arch=self.getArchitecture(),
+                      os='ios', vers='13.0', env='simulator',
+                      expected_load_command='LC_BUILD_VERSION')
+
+    @skipUnlessDarwin
+    @skipIfDarwinEmbedded
+    @apple_simulator_test('iphone')
     @skipIf(archs=['i386','x86_64'])
     def test_ios_backdeploy_apple_silicon(self):
         """Test running a back-deploying iOS simulator binary"""
         self.run_with(arch=self.getArchitecture(),
-                      os='ios11.0', env='simulator',
+                      os='ios', vers='11.0', env='simulator',
                       expected_load_command='LC_BUILD_VERSION')
 
     @skipUnlessDarwin
@@ -111,7 +151,7 @@ class TestSimulatorPlatformLaunching(TestBase):
         """Test running a back-deploying tvOS simulator binary
            with a legacy tvOS load command"""
         self.run_with(arch=self.getArchitecture(),
-                      os='tvos11.0', env='simulator',
+                      os='tvos', vers='11.0', env='simulator',
                       expected_load_command='LC_VERSION_MIN_TVOS')
 
     @skipUnlessDarwin
@@ -121,7 +161,7 @@ class TestSimulatorPlatformLaunching(TestBase):
     def test_tvos_backdeploy_apple_silicon(self):
         """Test running a back-deploying tvOS simulator binary"""
         self.run_with(arch=self.getArchitecture(),
-                      os='tvos11.0', env='simulator',
+                      os='tvos', vers='11.0', env='simulator',
                       expected_load_command='LC_BUILD_VERSION')
 
     @skipUnlessDarwin
@@ -133,7 +173,7 @@ class TestSimulatorPlatformLaunching(TestBase):
         """Test running a back-deploying watchOS simulator binary
            with a legacy watchOS load command"""
         self.run_with(arch='i386',
-                      os='watchos4.0', env='simulator',
+                      os='watchos', vers='4.0', env='simulator',
                       expected_load_command='LC_VERSION_MIN_WATCHOS')
 
     @skipUnlessDarwin
@@ -144,5 +184,5 @@ class TestSimulatorPlatformLaunching(TestBase):
     def test_watchos_backdeploy_apple_silicon(self):
         """Test running a back-deploying watchOS simulator binary"""
         self.run_with(arch='armv7k',
-                      os='watchos4.0', env='simulator',
+                      os='watchos', vers='4.0', env='simulator',
                       expected_load_command='LC_BUILD_VERSION')
index d000152..4bf5305 100644 (file)
@@ -614,9 +614,9 @@ MachProcess::GetDeploymentInfo(const struct load_command &lc,
                    &vers_cmd) != sizeof(struct version_min_command))
       return;
     info.platform = platform;
-    info.major_version = vers_cmd.sdk >> 16;
-    info.minor_version = (vers_cmd.sdk >> 8) & 0xffu;
-    info.patch_version = vers_cmd.sdk & 0xffu;
+    info.major_version = vers_cmd.version >> 16;
+    info.minor_version = (vers_cmd.version >> 8) & 0xffu;
+    info.patch_version = vers_cmd.version & 0xffu;
     info.maybe_simulator = true;
   };
   switch (cmd) {
@@ -639,9 +639,9 @@ MachProcess::GetDeploymentInfo(const struct load_command &lc,
                    &build_vers) != sizeof(struct build_version_command))
       break;
     info.platform = build_vers.platform;
-    info.major_version = build_vers.sdk >> 16;
-    info.minor_version = (build_vers.sdk >> 8) & 0xffu;
-    info.patch_version = build_vers.sdk & 0xffu;
+    info.major_version = build_vers.minos >> 16;
+    info.minor_version = (build_vers.minos >> 8) & 0xffu;
+    info.patch_version = build_vers.minos & 0xffu;
     break;
   }
 #endif