jingham updated this revision to Diff 215280.
jingham added a comment.

Does this seem clearer?  We use the language of Private and Public StopInfo's 
in a bunch of places, even though at present that's more about "How" you get 
them than actual separate entities.  But still, this seems like it follows the 
language we are using elsewhere.


Repository:
  rLLDB LLDB

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D66241/new/

https://reviews.llvm.org/D66241

Files:
  include/lldb/Target/Thread.h
  packages/Python/lldbsuite/test/functionalities/stop-hooks/Makefile
  packages/Python/lldbsuite/test/functionalities/stop-hooks/TestStopHooks.py
  packages/Python/lldbsuite/test/functionalities/stop-hooks/main.c
  source/Target/StopInfo.cpp
  source/Target/Thread.cpp

Index: source/Target/Thread.cpp
===================================================================
--- source/Target/Thread.cpp
+++ source/Target/Thread.cpp
@@ -390,6 +390,11 @@
   }
 }
 
+void Thread::CalculatePublicStopInfo() {
+  ResetStopInfo();
+  SetStopInfo(GetStopInfo());
+}
+
 lldb::StopInfoSP Thread::GetPrivateStopInfo() {
   if (m_destroy_called)
     return m_stop_info_sp;
Index: source/Target/StopInfo.cpp
===================================================================
--- source/Target/StopInfo.cpp
+++ source/Target/StopInfo.cpp
@@ -543,10 +543,10 @@
         // additionally to the breakpoint
         m_should_stop = true;
         
-        // Here we clean the preset stop info so the next GetStopInfo call will
-        // find the appropriate stop info, which should be the stop info
-        // related to the completed plan
-        thread_sp->ResetStopInfo();
+        // We know we're stopping for a completed plan and we don't want to
+        // show the breakpoint stop, so compute the public stop info immediately
+        // here.
+        thread_sp->CalculatePublicStopInfo();
       }
 
       LLDB_LOGF(log,
Index: packages/Python/lldbsuite/test/functionalities/stop-hooks/main.c
===================================================================
--- packages/Python/lldbsuite/test/functionalities/stop-hooks/main.c
+++ packages/Python/lldbsuite/test/functionalities/stop-hooks/main.c
@@ -0,0 +1,14 @@
+#include <stdio.h>
+
+static int g_var = 0;
+
+int step_out_of_me()
+{
+  return g_var; // Set a breakpoint here and step out.
+}
+
+int
+main()
+{
+  return step_out_of_me();
+}
Index: packages/Python/lldbsuite/test/functionalities/stop-hooks/TestStopHooks.py
===================================================================
--- packages/Python/lldbsuite/test/functionalities/stop-hooks/TestStopHooks.py
+++ packages/Python/lldbsuite/test/functionalities/stop-hooks/TestStopHooks.py
@@ -0,0 +1,45 @@
+"""
+Test that stop hooks trigger on "step-out"
+"""
+
+from __future__ import print_function
+
+
+import lldb
+import lldbsuite.test.lldbutil as lldbutil
+from lldbsuite.test.lldbtest import *
+
+
+class TestStopHooks(TestBase):
+
+    mydir = TestBase.compute_mydir(__file__)
+
+    # If your test case doesn't stress debug info, the
+    # set this to true.  That way it won't be run once for
+    # each debug info format.
+    NO_DEBUG_INFO_TESTCASE = True
+
+    def test_stop_hooks_step_out(self):
+        """Test that stop hooks fire on step-out."""
+        self.build()
+        self.main_source_file = lldb.SBFileSpec("main.c")
+        self.step_out_test()
+
+    def setUp(self):
+        # Call super's setUp().
+        TestBase.setUp(self)
+
+    def step_out_test(self):
+        (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(self,
+                                   "Set a breakpoint here", self.main_source_file)
+
+        interp = self.dbg.GetCommandInterpreter()
+        result = lldb.SBCommandReturnObject()
+        interp.HandleCommand("target stop-hook add -o 'expr g_var++'", result)
+        self.assertTrue(result.Succeeded, "Set the target stop hook")
+        thread.StepOut()
+        var = target.FindFirstGlobalVariable("g_var")
+        self.assertTrue(var.IsValid())
+        self.assertEqual(var.GetValueAsUnsigned(), 1, "Updated g_var")
+
+
Index: packages/Python/lldbsuite/test/functionalities/stop-hooks/Makefile
===================================================================
--- packages/Python/lldbsuite/test/functionalities/stop-hooks/Makefile
+++ packages/Python/lldbsuite/test/functionalities/stop-hooks/Makefile
@@ -0,0 +1,6 @@
+LEVEL = ../../make
+
+C_SOURCES := main.c
+CFLAGS_EXTRAS += -std=c99
+
+include $(LEVEL)/Makefile.rules
Index: include/lldb/Target/Thread.h
===================================================================
--- include/lldb/Target/Thread.h
+++ include/lldb/Target/Thread.h
@@ -1101,6 +1101,16 @@
   // right even if you have not calculated this yourself, or if it disagrees
   // with what you might have calculated.
   virtual lldb::StopInfoSP GetPrivateStopInfo();
+  
+  // Calculate the stop info that will be shown to lldb clients.  For instance,
+  // a "step out" is implemented by running to a breakpoint on the function 
+  // return PC, so the process plugin sets the private stop info to a
+  // StopInfoBreakpoint.  But from a user's perspective this is actually a
+  // StopInfoThreadPlan for the completed "ThreadPlanStepOut" plan.  Usually
+  // this happens lazily when GetStopInfo is called, but you can force the
+  // recomputation immediately with this function.  You can only do this after
+  // ShouldStop is done, since this one looks at the completed plan stack.
+  void CalculatePublicStopInfo();
 
   // Ask the thread subclass to set its stop info.
   //
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to