Author: Jason Molenda Date: 2022-05-25T16:05:51-07:00 New Revision: bef4da4a6aef8196f007f44e3e9c8e3419ffb623
URL: https://github.com/llvm/llvm-project/commit/bef4da4a6aef8196f007f44e3e9c8e3419ffb623 DIFF: https://github.com/llvm/llvm-project/commit/bef4da4a6aef8196f007f44e3e9c8e3419ffb623.diff LOG: Skip testing of watchpoint hit-count/ignore-count on multithreaded Skip all watchpoint hit-count/ignore-count tests for multithreaded API tests for now on arm64 Darwin. On AArch64, insns that trigger a WP are rolled back and we are notified. lldb needs to disable the WP, insn step, re-enable it, then report it to the user. lldb only does this full step action for the "selected thread", and so when a program stops with multiple threads hitting a stop reason, some of them watchpoints, any non-selected-thread will not be completed in this way. But all threads with the initial watchpoint exception will have their hit-count/ignore-counts updated. When we resume execution, the other threads sitting at the instruction will again execute & trigger the WP exceptoin again, repeating until we've gone through all of the threads. This bug is being tracked in llvm.org/pr49433 and inside apple in rdar://93863107 Added: Modified: lldb/test/API/commands/watchpoints/hello_watchlocation/TestWatchLocation.py lldb/test/API/commands/watchpoints/watchpoint_set_command/TestWatchLocationWithWatchSet.py lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentManyWatchpoints.py lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentNWatchNBreak.py lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentSignalNWatchNBreak.py lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentSignalWatch.py lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentSignalWatchBreak.py lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentTwoWatchpointThreads.py lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentTwoWatchpointsOneBreakpoint.py lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentTwoWatchpointsOneDelayBreakpoint.py lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentTwoWatchpointsOneSignal.py lldb/test/API/python_api/watchpoint/TestWatchpointIgnoreCount.py Removed: ################################################################################ diff --git a/lldb/test/API/commands/watchpoints/hello_watchlocation/TestWatchLocation.py b/lldb/test/API/commands/watchpoints/hello_watchlocation/TestWatchLocation.py index 16fb71fd11302..2859df3c47bd0 100644 --- a/lldb/test/API/commands/watchpoints/hello_watchlocation/TestWatchLocation.py +++ b/lldb/test/API/commands/watchpoints/hello_watchlocation/TestWatchLocation.py @@ -31,12 +31,18 @@ def setUp(self): self.exe_name = self.testMethodName self.d = {'CXX_SOURCES': self.source, 'EXE': self.exe_name} + # on arm64 targets, lldb has incorrect hit-count / ignore-counts + # for watchpoints when they are hit with multiple threads at + # the same time. Tracked as llvm.org/pr49433 + # or rdar://93863107 inside Apple. + def affected_by_radar_93863107(self): + return (self.getArchitecture() in ['arm64', 'arm64e']) and self.platformIsDarwin() + # Most of the MIPS boards provide only one H/W watchpoints, and S/W # watchpoints are not supported yet @expectedFailureAll(triple=re.compile('^mips')) # SystemZ and PowerPC also currently supports only one H/W watchpoint @expectedFailureAll(archs=['powerpc64le', 's390x']) - @skipIfDarwin @skipIfWindows # This test is flaky on Windows def test_hello_watchlocation(self): """Test watching a location with '-s size' option.""" @@ -103,8 +109,13 @@ def test_hello_watchlocation(self): substrs=[self.violating_func]) # Use the '-v' option to do verbose listing of the watchpoint. - # The hit count should now be 1. - self.expect("watchpoint list -v", - substrs=['hit_count = 1']) + # The hit count should now be the same as the number of threads that + # stopped on a watchpoint. + threads = lldbutil.get_stopped_threads( + self.process(), lldb.eStopReasonWatchpoint) + + if not self.affected_by_radar_93863107(): + self.expect("watchpoint list -v", + substrs=['hit_count = %d' % len(threads)]) self.runCmd("thread backtrace all") diff --git a/lldb/test/API/commands/watchpoints/watchpoint_set_command/TestWatchLocationWithWatchSet.py b/lldb/test/API/commands/watchpoints/watchpoint_set_command/TestWatchLocationWithWatchSet.py index 92ea56021cc1b..23c4b3062662c 100644 --- a/lldb/test/API/commands/watchpoints/watchpoint_set_command/TestWatchLocationWithWatchSet.py +++ b/lldb/test/API/commands/watchpoints/watchpoint_set_command/TestWatchLocationWithWatchSet.py @@ -15,6 +15,13 @@ class WatchLocationUsingWatchpointSetTestCase(TestBase): mydir = TestBase.compute_mydir(__file__) NO_DEBUG_INFO_TESTCASE = True + # on arm64 targets, lldb has incorrect hit-count / ignore-counts + # for watchpoints when they are hit with multiple threads at + # the same time. Tracked as llvm.org/pr49433 + # or rdar://93863107 inside Apple. + def affected_by_radar_93863107(self): + return (self.getArchitecture() in ['arm64', 'arm64e']) and self.platformIsDarwin() + def setUp(self): # Call super's setUp(). TestBase.setUp(self) @@ -102,7 +109,9 @@ def test_watchlocation_using_watchpoint_set(self): # stopped on a watchpoint. threads = lldbutil.get_stopped_threads( self.process(), lldb.eStopReasonWatchpoint) - self.expect("watchpoint list -v", - substrs=['hit_count = %d' % len(threads)]) + + if not self.affected_by_radar_93863107(): + self.expect("watchpoint list -v", + substrs=['hit_count = %d' % len(threads)]) self.runCmd("thread backtrace all") diff --git a/lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentManyWatchpoints.py b/lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentManyWatchpoints.py index 18a683864c33b..e466b17633da3 100644 --- a/lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentManyWatchpoints.py +++ b/lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentManyWatchpoints.py @@ -15,7 +15,7 @@ class ConcurrentManyWatchpoints(ConcurrentEventsBase): @skipIf( oslist=["ios", "watchos", "tvos", "bridgeos", "macosx"], archs=['arm64', 'arm64e', 'arm64_32', 'arm'], - bugnumber="rdar://81811539") + bugnumber="rdar://93863107") @add_test_categories(["watchpoint"]) @skipIfOutOfTreeDebugserver def test(self): diff --git a/lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentNWatchNBreak.py b/lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentNWatchNBreak.py index 2d53cfa4802a1..d6848de5fd319 100644 --- a/lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentNWatchNBreak.py +++ b/lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentNWatchNBreak.py @@ -18,7 +18,7 @@ class ConcurrentNWatchNBreak(ConcurrentEventsBase): @skipIf( oslist=["ios", "watchos", "tvos", "bridgeos", "macosx"], archs=['arm64', 'arm64e', 'arm64_32', 'arm'], - bugnumber="rdar://81811539") + bugnumber="rdar://93863107") @add_test_categories(["watchpoint"]) def test(self): """Test with 5 watchpoint and breakpoint threads.""" diff --git a/lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentSignalNWatchNBreak.py b/lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentSignalNWatchNBreak.py index 0645274ae7e55..8409984c67ffa 100644 --- a/lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentSignalNWatchNBreak.py +++ b/lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentSignalNWatchNBreak.py @@ -19,7 +19,7 @@ class ConcurrentSignalNWatchNBreak(ConcurrentEventsBase): @skipIf( oslist=["ios", "watchos", "tvos", "bridgeos", "macosx"], archs=['arm64', 'arm64e', 'arm64_32', 'arm'], - bugnumber="rdar://81811539") + bugnumber="rdar://93863107") @add_test_categories(["watchpoint"]) def test(self): """Test one signal thread with 5 watchpoint and breakpoint threads.""" diff --git a/lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentSignalWatch.py b/lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentSignalWatch.py index be59daace974f..ac9442cd25c07 100644 --- a/lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentSignalWatch.py +++ b/lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentSignalWatch.py @@ -16,7 +16,7 @@ class ConcurrentSignalWatch(ConcurrentEventsBase): @skipIf( oslist=["ios", "watchos", "tvos", "bridgeos", "macosx"], archs=['arm64', 'arm64e', 'arm64_32', 'arm'], - bugnumber="rdar://81811539") + bugnumber="rdar://93863107") @add_test_categories(["watchpoint"]) def test(self): """Test a watchpoint and a signal in multiple threads.""" diff --git a/lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentSignalWatchBreak.py b/lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentSignalWatchBreak.py index 120b48514539f..2e18c15f5ab02 100644 --- a/lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentSignalWatchBreak.py +++ b/lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentSignalWatchBreak.py @@ -17,7 +17,7 @@ class ConcurrentSignalWatchBreak(ConcurrentEventsBase): @skipIf( oslist=["ios", "watchos", "tvos", "bridgeos", "macosx"], archs=['arm64', 'arm64e', 'arm64_32', 'arm'], - bugnumber="rdar://81811539") + bugnumber="rdar://93863107") @add_test_categories(["watchpoint"]) def test(self): """Test a signal/watchpoint/breakpoint in multiple threads.""" diff --git a/lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentTwoWatchpointThreads.py b/lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentTwoWatchpointThreads.py index 7deeacfc67d51..9a7088bbc3a9f 100644 --- a/lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentTwoWatchpointThreads.py +++ b/lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentTwoWatchpointThreads.py @@ -16,7 +16,7 @@ class ConcurrentTwoWatchpointThreads(ConcurrentEventsBase): @skipIf( oslist=["ios", "watchos", "tvos", "bridgeos", "macosx"], archs=['arm64', 'arm64e', 'arm64_32', 'arm'], - bugnumber="rdar://81811539") + bugnumber="rdar://93863107") @add_test_categories(["watchpoint"]) def test(self): """Test two threads that trigger a watchpoint. """ diff --git a/lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentTwoWatchpointsOneBreakpoint.py b/lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentTwoWatchpointsOneBreakpoint.py index 0e8cbf37a1976..3eb9f30d8cf91 100644 --- a/lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentTwoWatchpointsOneBreakpoint.py +++ b/lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentTwoWatchpointsOneBreakpoint.py @@ -16,7 +16,7 @@ class ConcurrentTwoWatchpointsOneBreakpoint(ConcurrentEventsBase): @skipIf( oslist=["ios", "watchos", "tvos", "bridgeos", "macosx"], archs=['arm64', 'arm64e', 'arm64_32', 'arm'], - bugnumber="rdar://81811539") + bugnumber="rdar://93863107") @add_test_categories(["watchpoint"]) def test(self): """Test two threads that trigger a watchpoint and one breakpoint thread. """ diff --git a/lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentTwoWatchpointsOneDelayBreakpoint.py b/lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentTwoWatchpointsOneDelayBreakpoint.py index a4baa5e9f4dd8..c48e39554324c 100644 --- a/lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentTwoWatchpointsOneDelayBreakpoint.py +++ b/lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentTwoWatchpointsOneDelayBreakpoint.py @@ -16,7 +16,7 @@ class ConcurrentTwoWatchpointsOneDelayBreakpoint(ConcurrentEventsBase): @skipIf( oslist=["ios", "watchos", "tvos", "bridgeos", "macosx"], archs=['arm64', 'arm64e', 'arm64_32', 'arm'], - bugnumber="rdar://81811539") + bugnumber="rdar://93863107") @add_test_categories(["watchpoint"]) def test(self): """Test two threads that trigger a watchpoint and one (1 second delay) breakpoint thread. """ diff --git a/lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentTwoWatchpointsOneSignal.py b/lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentTwoWatchpointsOneSignal.py index 62e7cfb6f3b40..8aea699a46346 100644 --- a/lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentTwoWatchpointsOneSignal.py +++ b/lldb/test/API/functionalities/thread/concurrent_events/TestConcurrentTwoWatchpointsOneSignal.py @@ -17,7 +17,7 @@ class ConcurrentTwoWatchpointsOneSignal(ConcurrentEventsBase): @skipIf( oslist=["ios", "watchos", "tvos", "bridgeos", "macosx"], archs=['arm64', 'arm64e', 'arm64_32', 'arm'], - bugnumber="rdar://81811539") + bugnumber="rdar://93863107") @add_test_categories(["watchpoint"]) def test(self): """Test two threads that trigger a watchpoint and one signal thread. """ diff --git a/lldb/test/API/python_api/watchpoint/TestWatchpointIgnoreCount.py b/lldb/test/API/python_api/watchpoint/TestWatchpointIgnoreCount.py index d0fd39834134d..dd0defd784503 100644 --- a/lldb/test/API/python_api/watchpoint/TestWatchpointIgnoreCount.py +++ b/lldb/test/API/python_api/watchpoint/TestWatchpointIgnoreCount.py @@ -25,6 +25,13 @@ def setUp(self): self.line = line_number( self.source, '// Set break point at this line.') + # on arm64 targets, lldb has incorrect hit-count / ignore-counts + # for watchpoints when they are hit with multiple threads at + # the same time. Tracked as llvm.org/pr49433 + # or rdar://93863107 inside Apple. + def affected_by_radar_93863107(self): + return (self.getArchitecture() in ['arm64', 'arm64e']) and self.platformIsDarwin() + # Read-write watchpoints not supported on SystemZ @expectedFailureAll(archs=['s390x']) def test_set_watch_ignore_count(self): @@ -87,5 +94,6 @@ def test_set_watch_ignore_count(self): # Verify some vital statistics. self.assertTrue(watchpoint) self.assertEqual(watchpoint.GetWatchSize(), 4) - self.assertEqual(watchpoint.GetHitCount(), 2) + if not self.affected_by_radar_93863107(): + self.assertEqual(watchpoint.GetHitCount(), 2) print(watchpoint) _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits