From c1c0fac76595da4a46db30da68e8444b9d1e3521 Mon Sep 17 00:00:00 2001 From: Aleksandr Urakov Date: Thu, 25 Oct 2018 08:27:42 +0000 Subject: [PATCH] [API] Extend the `SBThreadPlan` interface Summary: This patch extends the `SBThreadPlan` to allow retrieving of thread plans for scripted steps. Reviewers: labath, zturner, jingham Reviewed By: jingham Subscribers: lldb-commits Tags: #lldb Differential Revision: https://reviews.llvm.org/D53361 llvm-svn: 345247 --- lldb/include/lldb/API/SBThreadPlan.h | 2 + .../functionalities/step_scripted/Makefile | 5 +++ .../functionalities/step_scripted/Steps.py | 37 +++++++++++++++++ .../step_scripted/TestStepScripted.py | 41 +++++++++++++++++++ .../test/functionalities/step_scripted/main.c | 10 +++++ lldb/scripts/interface/SBThreadPlan.i | 3 ++ lldb/source/API/SBThreadPlan.cpp | 10 +++++ 7 files changed, 108 insertions(+) create mode 100644 lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/Makefile create mode 100644 lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/Steps.py create mode 100644 lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/TestStepScripted.py create mode 100644 lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/main.c diff --git a/lldb/include/lldb/API/SBThreadPlan.h b/lldb/include/lldb/API/SBThreadPlan.h index abc14bf8fe4a..c1357c9a9672 100644 --- a/lldb/include/lldb/API/SBThreadPlan.h +++ b/lldb/include/lldb/API/SBThreadPlan.h @@ -88,6 +88,8 @@ public: SBThreadPlan QueueThreadPlanForRunToAddress(SBAddress address); + SBThreadPlan QueueThreadPlanForStepScripted(const char *script_class_name); + #ifndef SWIG lldb_private::ThreadPlan *get(); #endif diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/Makefile b/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/Makefile new file mode 100644 index 000000000000..0d70f2595019 --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/Makefile @@ -0,0 +1,5 @@ +LEVEL = ../../make + +C_SOURCES := main.c + +include $(LEVEL)/Makefile.rules diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/Steps.py b/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/Steps.py new file mode 100644 index 000000000000..1383a03f4647 --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/Steps.py @@ -0,0 +1,37 @@ +import lldb + +class StepWithChild: + def __init__(self, thread_plan): + self.thread_plan = thread_plan + self.child_thread_plan = self.queue_child_thread_plan() + + def explains_stop(self, event): + return False + + def should_stop(self, event): + if not self.child_thread_plan.IsPlanComplete(): + return False + + self.thread_plan.SetPlanComplete(True) + + return True + + def should_step(self): + return False + + def queue_child_thread_plan(self): + return None + +class StepOut(StepWithChild): + def __init__(self, thread_plan, dict): + StepWithChild.__init__(self, thread_plan) + + def queue_child_thread_plan(self): + return self.thread_plan.QueueThreadPlanForStepOut(0) + +class StepScripted(StepWithChild): + def __init__(self, thread_plan, dict): + StepWithChild.__init__(self, thread_plan) + + def queue_child_thread_plan(self): + return self.thread_plan.QueueThreadPlanForStepScripted("Steps.StepOut") diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/TestStepScripted.py b/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/TestStepScripted.py new file mode 100644 index 000000000000..1c254c564765 --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/TestStepScripted.py @@ -0,0 +1,41 @@ +""" +Tests stepping with scripted thread plans. +""" + +import lldb +import lldbsuite.test.lldbutil as lldbutil +from lldbsuite.test.lldbtest import * + +class StepScriptedTestCase(TestBase): + + mydir = TestBase.compute_mydir(__file__) + + NO_DEBUG_INFO_TESTCASE = True + + def test_standard_step_out(self): + """Tests stepping with the scripted thread plan laying over a standard thread plan for stepping out.""" + self.build() + self.main_source_file = lldb.SBFileSpec("main.c") + self.step_out_with_scripted_plan("Steps.StepOut") + + def test_scripted_step_out(self): + """Tests stepping with the scripted thread plan laying over an another scripted thread plan for stepping out.""" + self.build() + self.main_source_file = lldb.SBFileSpec("main.c") + self.step_out_with_scripted_plan("Steps.StepScripted") + + def setUp(self): + TestBase.setUp(self) + self.runCmd("command script import Steps.py") + + def step_out_with_scripted_plan(self, name): + (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(self, "Set a breakpoint here", self.main_source_file) + + frame = thread.GetFrameAtIndex(0) + self.assertEqual("foo", frame.GetFunctionName()) + + err = thread.StepUsingScriptedThreadPlan(name) + self.assertTrue(err.Success(), "Failed to step out") + + frame = thread.GetFrameAtIndex(0) + self.assertEqual("main", frame.GetFunctionName()) diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/main.c b/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/main.c new file mode 100644 index 000000000000..88b3c17125db --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/main.c @@ -0,0 +1,10 @@ +#include + +void foo() { + printf("Set a breakpoint here.\n"); +} + +int main() { + foo(); + return 0; +} diff --git a/lldb/scripts/interface/SBThreadPlan.i b/lldb/scripts/interface/SBThreadPlan.i index 9910314e873b..89291b39b2a9 100644 --- a/lldb/scripts/interface/SBThreadPlan.i +++ b/lldb/scripts/interface/SBThreadPlan.i @@ -106,6 +106,9 @@ public: SBThreadPlan QueueThreadPlanForRunToAddress (SBAddress address); + SBThreadPlan + QueueThreadPlanForStepScripted(const char *script_class_name); + protected: friend class SBBreakpoint; diff --git a/lldb/source/API/SBThreadPlan.cpp b/lldb/source/API/SBThreadPlan.cpp index 393abcb8424e..c15c39aab514 100644 --- a/lldb/source/API/SBThreadPlan.cpp +++ b/lldb/source/API/SBThreadPlan.cpp @@ -207,3 +207,13 @@ SBThreadPlan::QueueThreadPlanForRunToAddress(SBAddress sb_address) { return SBThreadPlan(); } } + +SBThreadPlan +SBThreadPlan::QueueThreadPlanForStepScripted(const char *script_class_name) { + if (m_opaque_sp) { + return SBThreadPlan(m_opaque_sp->GetThread().QueueThreadPlanForStepScripted( + false, script_class_name, false)); + } else { + return SBThreadPlan(); + } +}