https://github.com/charles-zablit updated 
https://github.com/llvm/llvm-project/pull/221697

>From 347f84e86e0b63da16669cfcf7d9a49df367b55f Mon Sep 17 00:00:00 2001
From: Charles Zablit <[email protected]>
Date: Mon, 7 Sep 2026 12:36:49 +0200
Subject: [PATCH 1/2] [lldb] Isolate g_watchme in memory to fix flaky
 TestConcurrentTwoWatchpointsOneSignal

---
 .../API/functionalities/thread/concurrent_events/main.cpp     | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/lldb/test/API/functionalities/thread/concurrent_events/main.cpp 
b/lldb/test/API/functionalities/thread/concurrent_events/main.cpp
index 84d8c7015a796..ba4ab62d3fca9 100644
--- a/lldb/test/API/functionalities/thread/concurrent_events/main.cpp
+++ b/lldb/test/API/functionalities/thread/concurrent_events/main.cpp
@@ -19,7 +19,9 @@ typedef std::vector<pthread_t> thread_vector;
 pseudo_barrier_t g_barrier;
 int g_breakpoint = 0;
 int g_sigusr1_count = 0;
-uint32_t g_watchme;
+
+alignas(16) uint32_t g_watchme;
+uint32_t g_watchme_padding[4];
 
 struct action_args {
   int delay;

>From 6b462a57434428656f044640030abbc2b2291186 Mon Sep 17 00:00:00 2001
From: Charles Zablit <[email protected]>
Date: Mon, 7 Sep 2026 15:12:52 +0200
Subject: [PATCH 2/2] fixup! [lldb] Isolate g_watchme in memory to fix flaky
 TestConcurrentTwoWatchpointsOneSignal

---
 .../Python/lldbsuite/test/concurrent_base.py     |  2 +-
 .../thread/concurrent_events/main.cpp            | 16 ++++++++++++----
 2 files changed, 13 insertions(+), 5 deletions(-)

diff --git a/lldb/packages/Python/lldbsuite/test/concurrent_base.py 
b/lldb/packages/Python/lldbsuite/test/concurrent_base.py
index a45b4207a834b..adb5c1d0dce88 100644
--- a/lldb/packages/Python/lldbsuite/test/concurrent_base.py
+++ b/lldb/packages/Python/lldbsuite/test/concurrent_base.py
@@ -171,7 +171,7 @@ def do_thread_actions(
             # only report this as 1 hit for all threads, because they all wrote
             # the same value.  The testsuite needs "write" style watchpoints to
             # get the correct number of hits reported.
-            self.runCmd("watchpoint set variable -w write g_watchme")
+            self.runCmd("watchpoint set variable -w write g_watchme.data")
             for w in self.inferior_target.watchpoint_iter():
                 self.thread_watchpoint = w
                 self.assertTrue(
diff --git a/lldb/test/API/functionalities/thread/concurrent_events/main.cpp 
b/lldb/test/API/functionalities/thread/concurrent_events/main.cpp
index ba4ab62d3fca9..9fcc6769bf2f1 100644
--- a/lldb/test/API/functionalities/thread/concurrent_events/main.cpp
+++ b/lldb/test/API/functionalities/thread/concurrent_events/main.cpp
@@ -20,8 +20,16 @@ pseudo_barrier_t g_barrier;
 int g_breakpoint = 0;
 int g_sigusr1_count = 0;
 
-alignas(16) uint32_t g_watchme;
-uint32_t g_watchme_padding[4];
+// Hardware watchpoints round the watched address/size to an alignment
+// boundary, so a watchpoint on a plain global could end up covering a
+// neighboring global too. Group the watched data with trailing padding in a
+// single aligned struct so the compiler is guaranteed to lay them out
+// together and nothing else can share the watchpoint's range.
+#define WATCHPOINT_SIZE 16
+struct alignas(WATCHPOINT_SIZE) WatchMePadding {
+  uint32_t data;
+  char padding_after[WATCHPOINT_SIZE];
+} g_watchme;
 
 struct action_args {
   int delay;
@@ -66,7 +74,7 @@ watchpoint_func (void *input) {
     pseudo_barrier_wait(g_barrier);
     do_action_args(input);
 
-    g_watchme = 1;     // watchpoint triggers here
+    g_watchme.data = 1;     // watchpoint triggers here
     return 0;
 }
 
@@ -114,7 +122,7 @@ void start_threads(thread_vector& threads,
 
 int dotest()
 {
-    g_watchme = 0;
+    g_watchme.data = 0;
 
     // Actions are triggered immediately after the thread is spawned
     unsigned num_breakpoint_threads = 1;

_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to