diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/watchpoint/multiple_hits/Makefile b/lldb/packages/Python/lldbsuite/test/functionalities/watchpoint/multiple_hits/Makefile new file mode 100644 index 000000000000..314f1cb2f077 --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/functionalities/watchpoint/multiple_hits/Makefile @@ -0,0 +1,5 @@ +LEVEL = ../../../make + +CXX_SOURCES := main.cpp + +include $(LEVEL)/Makefile.rules diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/watchpoint/multiple_hits/TestMultipleHits.py b/lldb/packages/Python/lldbsuite/test/functionalities/watchpoint/multiple_hits/TestMultipleHits.py new file mode 100644 index 000000000000..c21355a2e8f9 --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/functionalities/watchpoint/multiple_hits/TestMultipleHits.py @@ -0,0 +1,58 @@ +""" +Test handling of cases when a single instruction triggers multiple watchpoints +""" + +from __future__ import print_function + + +import os +import time +import lldb +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * +from lldbsuite.test import lldbutil + + +class MultipleHitsTestCase(TestBase): + + mydir = TestBase.compute_mydir(__file__) + NO_DEBUG_INFO_TESTCASE = True + + @expectedFailureAll( + oslist=["windows"], + bugnumber="llvm.org/pr24446: WINDOWS XFAIL TRIAGE - Watchpoints not supported on Windows") + @skipIf(bugnumber="llvm.org/pr30758", oslist=["linux"], archs=["arm", "aarch64"]) + def test(self): + self.build() + exe = os.path.join(os.getcwd(), "a.out") + target = self.dbg.CreateTarget(exe) + self.assertTrue(target and target.IsValid(), VALID_TARGET) + + bp = target.BreakpointCreateByName("main") + self.assertTrue(bp and bp.IsValid(), "Breakpoint is valid") + + process = target.LaunchSimple(None, None, + self.get_process_working_directory()) + self.assertEqual(process.GetState(), lldb.eStateStopped) + + thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonBreakpoint) + self.assertIsNotNone(thread) + + frame = thread.GetFrameAtIndex(0) + self.assertTrue(frame and frame.IsValid(), "Frame is valid") + + buf = frame.FindValue("buf", lldb.eValueTypeVariableGlobal) + self.assertTrue(buf and buf.IsValid(), "buf is valid") + + for i in [0, target.GetAddressByteSize()]: + member = buf.GetChildAtIndex(i) + self.assertTrue(member and member.IsValid(), "member is valid") + + error = lldb.SBError() + watch = member.Watch(True, True, True, error) + self.assertTrue(error.Success()) + + process.Continue(); + self.assertEqual(process.GetState(), lldb.eStateStopped) + self.assertEqual(thread.GetStopReason(), lldb.eStopReasonWatchpoint) + diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/watchpoint/multiple_hits/main.cpp b/lldb/packages/Python/lldbsuite/test/functionalities/watchpoint/multiple_hits/main.cpp new file mode 100644 index 000000000000..5fc516cc9606 --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/functionalities/watchpoint/multiple_hits/main.cpp @@ -0,0 +1,29 @@ +//===-- main.cpp ------------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +#include +#include + +alignas(16) uint8_t buf[32]; + +// This uses inline assembly to generate an instruction that writes to a large +// block of memory. If it fails on your compiler/architecture, please add +// appropriate code to generate a large write to "buf". If you cannot write at +// least 2*sizeof(void*) bytes with a single instruction, you will have to skip +// this test. + +int main() { +#if defined(__i386__) || defined(__x86_64__) + asm volatile ("movdqa %%xmm0, %0" : : "m"(buf)); +#elif defined(__arm__) + asm volatile ("stm %0, { r0, r1, r2, r3 }" : : "r"(buf)); +#elif defined(__aarch64__) + asm volatile ("stp x0, x1, %0" : : "m"(buf)); +#endif + return 0; +}