Author: jingham Date: Thu Aug 15 14:37:52 2019 New Revision: 369052 URL: http://llvm.org/viewvc/llvm-project?rev=369052&view=rev Log: Stop-hooks weren't getting called on step-out. Fix that.
There was a little bit of logic in the StopInfoBreakpoint::PerformAction that would null out the StopInfo once we had a completed plan so that the next call to GetStopInfo would replace it with the StopInfoThreadPlan. But the stop-hooks check for whether a thread stopped for a reason didn't trigger this conversion. So I added an API to do that directly, and then called it where before we just reset the StopInfo. <rdar://problem/54270767> Differential Revision: https://reviews.llvm.org/D66241 Added: lldb/trunk/packages/Python/lldbsuite/test/functionalities/stop-hooks/ lldb/trunk/packages/Python/lldbsuite/test/functionalities/stop-hooks/Makefile lldb/trunk/packages/Python/lldbsuite/test/functionalities/stop-hooks/TestStopHooks.py lldb/trunk/packages/Python/lldbsuite/test/functionalities/stop-hooks/main.c Modified: lldb/trunk/include/lldb/Target/Thread.h lldb/trunk/source/Target/StopInfo.cpp lldb/trunk/source/Target/Thread.cpp Modified: lldb/trunk/include/lldb/Target/Thread.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/Thread.h?rev=369052&r1=369051&r2=369052&view=diff ============================================================================== --- lldb/trunk/include/lldb/Target/Thread.h (original) +++ lldb/trunk/include/lldb/Target/Thread.h Thu Aug 15 14:37:52 2019 @@ -1101,6 +1101,17 @@ public: // 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 initially sets the stop info to a + // StopInfoBreakpoint. But once we've run the ShouldStop machinery, we + // discover that there's a completed ThreadPlanStepOut, and that's really + // the StopInfo we want to show. That will happen naturally the next + // time GetStopInfo is called, but if you want to force the replacement, + // you can call this. + + void CalculatePublicStopInfo(); // Ask the thread subclass to set its stop info. // Added: lldb/trunk/packages/Python/lldbsuite/test/functionalities/stop-hooks/Makefile URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/stop-hooks/Makefile?rev=369052&view=auto ============================================================================== --- lldb/trunk/packages/Python/lldbsuite/test/functionalities/stop-hooks/Makefile (added) +++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/stop-hooks/Makefile Thu Aug 15 14:37:52 2019 @@ -0,0 +1,6 @@ +LEVEL = ../../make + +C_SOURCES := main.c +CFLAGS_EXTRAS += -std=c99 + +include $(LEVEL)/Makefile.rules Added: lldb/trunk/packages/Python/lldbsuite/test/functionalities/stop-hooks/TestStopHooks.py URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/stop-hooks/TestStopHooks.py?rev=369052&view=auto ============================================================================== --- lldb/trunk/packages/Python/lldbsuite/test/functionalities/stop-hooks/TestStopHooks.py (added) +++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/stop-hooks/TestStopHooks.py Thu Aug 15 14:37:52 2019 @@ -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") + + Added: lldb/trunk/packages/Python/lldbsuite/test/functionalities/stop-hooks/main.c URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/stop-hooks/main.c?rev=369052&view=auto ============================================================================== --- lldb/trunk/packages/Python/lldbsuite/test/functionalities/stop-hooks/main.c (added) +++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/stop-hooks/main.c Thu Aug 15 14:37:52 2019 @@ -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(); +} Modified: lldb/trunk/source/Target/StopInfo.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/StopInfo.cpp?rev=369052&r1=369051&r2=369052&view=diff ============================================================================== --- lldb/trunk/source/Target/StopInfo.cpp (original) +++ lldb/trunk/source/Target/StopInfo.cpp Thu Aug 15 14:37:52 2019 @@ -543,10 +543,10 @@ protected: // 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, Modified: lldb/trunk/source/Target/Thread.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Thread.cpp?rev=369052&r1=369051&r2=369052&view=diff ============================================================================== --- lldb/trunk/source/Target/Thread.cpp (original) +++ lldb/trunk/source/Target/Thread.cpp Thu Aug 15 14:37:52 2019 @@ -390,6 +390,11 @@ lldb::StopInfoSP Thread::GetStopInfo() { } } +void Thread::CalculatePublicStopInfo() { + ResetStopInfo(); + SetStopInfo(GetStopInfo()); +} + lldb::StopInfoSP Thread::GetPrivateStopInfo() { if (m_destroy_called) return m_stop_info_sp; _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits