Add test coverage of "%@" in event messages in a multithreaded
execution path.

Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu.
Pushed to trunk as r15-3199-g6a1c359e28442c.

gcc/testsuite/ChangeLog:
        * gcc.dg/plugin/diagnostic-test-paths-multithreaded-inline-events.c:
        Update expected output.
        * gcc.dg/plugin/diagnostic-test-paths-multithreaded-sarif.py:
        Likewise.
        * gcc.dg/plugin/diagnostic-test-paths-multithreaded-separate-events.c:
        Likewise.
        * gcc.dg/plugin/diagnostic_plugin_test_paths.c
        (test_diagnostic_path::add_event_2): Return the id of the added
        event.
        (test_diagnostic_path::add_event_2_with_event_id): New.
        (example_4): Add event IDs to the deadlock messages indicating
        where the locks where acquired.

Signed-off-by: David Malcolm <dmalc...@redhat.com>
---
 ...c-test-paths-multithreaded-inline-events.c |  4 +-
 ...agnostic-test-paths-multithreaded-sarif.py |  4 +-
 ...test-paths-multithreaded-separate-events.c |  4 +-
 .../plugin/diagnostic_plugin_test_paths.c     | 46 +++++++++++++------
 4 files changed, 38 insertions(+), 20 deletions(-)

diff --git 
a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-multithreaded-inline-events.c
 
b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-multithreaded-inline-events.c
index 333ef7359440..b306bcc1a0f3 100644
--- 
a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-multithreaded-inline-events.c
+++ 
b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-multithreaded-inline-events.c
@@ -58,7 +58,7 @@ Thread: 'Thread 1'
            |   NN |   acquire_lock_b ();
            |      |   ^~~~~~~~~~~~~~~~~
            |      |   |
-           |      |   (5) deadlocked due to waiting for lock b in thread 1...
+           |      |   (5) deadlocked due to waiting for lock b in thread 1 
(acquired by thread 2 at (4))...
            |
 
 Thread: 'Thread 2'
@@ -67,6 +67,6 @@ Thread: 'Thread 2'
            |   NN |   acquire_lock_a ();
            |      |   ^~~~~~~~~~~~~~~~~
            |      |   |
-           |      |   (6) ...whilst waiting for lock a in thread 2
+           |      |   (6) ...whilst waiting for lock a in thread 2 (acquired 
by thread 1 at (2))
            |
      { dg-end-multiline-output "" } */
diff --git 
a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-multithreaded-sarif.py 
b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-multithreaded-sarif.py
index cff78aa8ac8e..cb00faf1532a 100644
--- a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-multithreaded-sarif.py
+++ b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-multithreaded-sarif.py
@@ -95,7 +95,7 @@ def test_result(sarif):
         == "lock a is now held by thread 1"
     assert tf0['locations'][2]['executionOrder'] == 5
     assert tf0['locations'][2]['location']['message']['text'] \
-        == "deadlocked due to waiting for lock b in thread 1..."
+        == "deadlocked due to waiting for lock b in thread 1 (acquired by 
thread 2 at (4))..."
 
     assert len(tf1['locations']) == 3
     assert tf1['locations'][0]['executionOrder'] == 3
@@ -106,4 +106,4 @@ def test_result(sarif):
         == "lock b is now held by thread 2"
     assert tf1['locations'][2]['executionOrder'] == 6
     assert tf1['locations'][2]['location']['message']['text'] \
-        == "...whilst waiting for lock a in thread 2"
+        == "...whilst waiting for lock a in thread 2 (acquired by thread 1 at 
(2))"
diff --git 
a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-multithreaded-separate-events.c
 
b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-multithreaded-separate-events.c
index 914918bb9e16..90464320b8e7 100644
--- 
a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-multithreaded-separate-events.c
+++ 
b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-multithreaded-separate-events.c
@@ -7,12 +7,12 @@ extern void acquire_lock_b(void);
 void foo ()
 { /* { dg-message "\\(1\\) entering 'foo'" } */
   acquire_lock_a (); /* { dg-message "\\(2\\) lock a is now held by thread 1" 
} */
-  acquire_lock_b (); /* { dg-message "\\(5\\) deadlocked due to waiting for 
lock b in thread 1\.\.\." } */
+  acquire_lock_b (); /* { dg-message "\\(5\\) deadlocked due to waiting for 
lock b in thread 1 \\(acquired by thread 2 at \\(4\\)\\)\.\.\." } */
 }
 
 void bar ()
 { /* { dg-message "\\(3\\) entering 'bar'" } */
   acquire_lock_b (); /* { dg-message "\\(4\\) lock b is now held by thread 2" 
} */
   acquire_lock_a (); /* { dg-warning "deadlock due to inconsistent lock 
acquisition order" } */
-  /* { dg-message "\\(6\\) \.\.\.whilst waiting for lock a in thread 2" "" { 
target *-*-* } .-1 } */
+  /* { dg-message "\\(6\\) \.\.\.whilst waiting for lock a in thread 2 
\\(acquired by thread 1 at \\(2\\)\\)" "" { target *-*-* } .-1 } */
 }
diff --git a/gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_test_paths.c 
b/gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_test_paths.c
index efa4ec475ab3..43e16a6fce11 100644
--- a/gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_test_paths.c
+++ b/gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_test_paths.c
@@ -217,14 +217,26 @@ class test_diagnostic_path : public simple_diagnostic_path
   : simple_diagnostic_path (event_pp)
   {
   }
-  void add_event_2 (event_location_t evloc, int stack_depth,
-                   const char *desc,
-                   diagnostic_thread_id_t thread_id = 0)
+  diagnostic_event_id_t
+  add_event_2 (event_location_t evloc, int stack_depth,
+              const char *desc,
+              diagnostic_thread_id_t thread_id = 0)
   {
     gcc_assert (evloc.m_fun);
-    add_thread_event (thread_id, evloc.m_loc, evloc.m_fun->decl,
+    return add_thread_event (thread_id, evloc.m_loc, evloc.m_fun->decl,
                      stack_depth, desc);
   }
+  diagnostic_event_id_t
+  add_event_2_with_event_id (event_location_t evloc, int stack_depth,
+                            const char *fmt,
+                            diagnostic_thread_id_t thread_id,
+                            diagnostic_event_id_t event_id)
+  {
+    gcc_assert (evloc.m_fun);
+    // FMT is assumed to have a single %@ argument
+    return add_thread_event (thread_id, evloc.m_loc, evloc.m_fun->decl,
+                            stack_depth, fmt, &event_id);
+  }
   void add_entry (event_location_t evloc, int stack_depth,
                  const char *funcname,
                  diagnostic_thread_id_t thread_id = 0)
@@ -487,17 +499,23 @@ example_4 ()
       diagnostic_thread_id_t thread_1 = path.add_thread ("Thread 1");
       diagnostic_thread_id_t thread_2 = path.add_thread ("Thread 2");
       path.add_entry (entry_to_foo, 0, "foo", thread_1);
-      path.add_event_2 (call_to_acquire_lock_a_in_foo, 1,
-                       "lock a is now held by thread 1", thread_1);
+      diagnostic_event_id_t event_a_acquired
+       = path.add_event_2 (call_to_acquire_lock_a_in_foo, 1,
+                           "lock a is now held by thread 1", thread_1);
       path.add_entry (entry_to_bar, 0, "bar", thread_2);
-      path.add_event_2 (call_to_acquire_lock_b_in_bar, 1,
-                       "lock b is now held by thread 2", thread_2);
-      path.add_event_2 (call_to_acquire_lock_b_in_foo, 1,
-                       "deadlocked due to waiting for lock b in thread 1...",
-                       thread_1);
-      path.add_event_2 (call_to_acquire_lock_a_in_bar, 1,
-                       "...whilst waiting for lock a in thread 2",
-                       thread_2);
+      diagnostic_event_id_t event_b_acquired
+       = path.add_event_2 (call_to_acquire_lock_b_in_bar, 1,
+                           "lock b is now held by thread 2", thread_2);
+      path.add_event_2_with_event_id
+       (call_to_acquire_lock_b_in_foo, 1,
+        "deadlocked due to waiting for lock b in thread 1"
+        " (acquired by thread 2 at %@)...",
+        thread_1, event_b_acquired);
+      path.add_event_2_with_event_id
+       (call_to_acquire_lock_a_in_bar, 1,
+        "...whilst waiting for lock a in thread 2"
+        " (acquired by thread 1 at %@)",
+        thread_2, event_a_acquired);
       richloc.set_path (&path);
 
       diagnostic_metadata m;
-- 
2.26.3

Reply via email to