xref: /llvm-project/lldb/test/API/functionalities/watchpoint/large-watchpoint/TestLargeWatchpoint.py (revision 5953532615595918d006ace2ad83fe33d1cd3915)
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