12e16e41bSJason Molenda""" 22e16e41bSJason MolendaWatch larger-than-8-bytes regions of memory, confirm that 32e16e41bSJason Molendawrites to those regions are detected. 42e16e41bSJason Molenda""" 52e16e41bSJason Molenda 62e16e41bSJason Molenda 72e16e41bSJason Molendaimport lldb 82e16e41bSJason Molendafrom lldbsuite.test.decorators import * 92e16e41bSJason Molendafrom lldbsuite.test.lldbtest import * 102e16e41bSJason Molendafrom lldbsuite.test import lldbutil 112e16e41bSJason Molenda 122e16e41bSJason Molenda 132238dcc3SJonas Devlieghereclass UnalignedWatchpointTestCase(TestBase): 142e16e41bSJason Molenda def continue_and_report_stop_reason(self, process, iter_str): 152e16e41bSJason Molenda process.Continue() 162238dcc3SJonas Devlieghere self.assertIn( 172238dcc3SJonas Devlieghere process.GetState(), [lldb.eStateStopped, lldb.eStateExited], iter_str 182238dcc3SJonas Devlieghere ) 192e16e41bSJason Molenda thread = process.GetSelectedThread() 202e16e41bSJason Molenda return thread.GetStopReason() 212e16e41bSJason Molenda 222e16e41bSJason Molenda NO_DEBUG_INFO_TESTCASE = True 232238dcc3SJonas Devlieghere 242e16e41bSJason Molenda # debugserver on AArch64 has this feature. 252238dcc3SJonas Devlieghere @skipIf(archs=no_match(["arm64", "arm64e", "aarch64"])) 262e16e41bSJason Molenda @skipUnlessDarwin 272e16e41bSJason Molenda 282e16e41bSJason Molenda # debugserver only gained the ability to watch larger regions 292e16e41bSJason Molenda # with this patch. 302e16e41bSJason Molenda @skipIfOutOfTreeDebugserver 312e16e41bSJason Molenda def test_large_watchpoint(self): 322e16e41bSJason Molenda """Test watchpoint that covers a large region of memory.""" 332e16e41bSJason Molenda self.build() 342e16e41bSJason Molenda self.main_source_file = lldb.SBFileSpec("main.c") 352238dcc3SJonas Devlieghere (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint( 362238dcc3SJonas Devlieghere self, "break here", self.main_source_file 372238dcc3SJonas Devlieghere ) 382e16e41bSJason Molenda 392e16e41bSJason Molenda frame = thread.GetFrameAtIndex(0) 402e16e41bSJason Molenda 412e16e41bSJason Molenda array_addr = frame.GetValueForVariablePath("array").GetValueAsUnsigned() 422e16e41bSJason Molenda 432e16e41bSJason Molenda # watch 256 uint32_t elements in the middle of the array, 442e16e41bSJason Molenda # don't assume that the heap allocated array is aligned 452e16e41bSJason Molenda # to a 1024 byte boundary to begin with, force alignment. 462238dcc3SJonas Devlieghere wa_256_addr = (array_addr + 1024) & ~(1024 - 1) 472e16e41bSJason Molenda err = lldb.SBError() 48*75e86207SDavid Spickett wp_opts = lldb.SBWatchpointOptions() 49*75e86207SDavid Spickett wp_opts.SetWatchpointTypeWrite(lldb.eWatchpointWriteTypeOnModify) 50*75e86207SDavid Spickett wp = target.WatchpointCreateByAddress(wa_256_addr, 1024, wp_opts, err) 512e16e41bSJason Molenda self.assertTrue(wp.IsValid()) 522e16e41bSJason Molenda self.assertSuccess(err) 532e16e41bSJason Molenda 542e16e41bSJason Molenda c_count = 0 552e16e41bSJason Molenda reason = self.continue_and_report_stop_reason(process, "continue #%d" % c_count) 562e16e41bSJason Molenda while reason == lldb.eStopReasonWatchpoint: 572e16e41bSJason Molenda c_count = c_count + 1 582238dcc3SJonas Devlieghere reason = self.continue_and_report_stop_reason( 592238dcc3SJonas Devlieghere process, "continue #%d" % c_count 602238dcc3SJonas Devlieghere ) 612e16e41bSJason Molenda self.assertLessEqual(c_count, 16) 622e16e41bSJason Molenda 632e16e41bSJason Molenda self.assertEqual(c_count, 16) 64