summaryrefslogtreecommitdiffstats
path: root/gnu/llvm/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted
diff options
context:
space:
mode:
authorpatrick <patrick@openbsd.org>2020-08-03 14:33:06 +0000
committerpatrick <patrick@openbsd.org>2020-08-03 14:33:06 +0000
commit061da546b983eb767bad15e67af1174fb0bcf31c (patch)
tree83c78b820819d70aa40c36d90447978b300078c5 /gnu/llvm/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted
parentImport LLVM 10.0.0 release including clang, lld and lldb. (diff)
downloadwireguard-openbsd-061da546b983eb767bad15e67af1174fb0bcf31c.tar.xz
wireguard-openbsd-061da546b983eb767bad15e67af1174fb0bcf31c.zip
Import LLVM 10.0.0 release including clang, lld and lldb.
ok hackroom tested by plenty
Diffstat (limited to 'gnu/llvm/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted')
-rw-r--r--gnu/llvm/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/Makefile3
-rw-r--r--gnu/llvm/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/Steps.py83
-rw-r--r--gnu/llvm/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/TestStepScripted.py108
-rw-r--r--gnu/llvm/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/main.c13
4 files changed, 207 insertions, 0 deletions
diff --git a/gnu/llvm/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/Makefile b/gnu/llvm/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/Makefile
new file mode 100644
index 00000000000..10495940055
--- /dev/null
+++ b/gnu/llvm/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/Makefile
@@ -0,0 +1,3 @@
+C_SOURCES := main.c
+
+include Makefile.rules
diff --git a/gnu/llvm/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/Steps.py b/gnu/llvm/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/Steps.py
new file mode 100644
index 00000000000..4133cbbe608
--- /dev/null
+++ b/gnu/llvm/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/Steps.py
@@ -0,0 +1,83 @@
+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")
+
+# This plan does a step-over until a variable changes value.
+class StepUntil(StepWithChild):
+ def __init__(self, thread_plan, args_data, dict):
+ self.frame = thread_plan.GetThread().frames[0]
+ self.target = thread_plan.GetThread().GetProcess().GetTarget()
+ func_entry = args_data.GetValueForKey("variable_name")
+
+ if not func_entry.IsValid():
+ print("Did not get a valid entry for variable_name")
+ func_name = func_entry.GetStringValue(100)
+
+ self.value = self.frame.FindVariable(func_name)
+ if self.value.GetError().Fail():
+ print("Failed to get foo value: %s"%(self.value.GetError().GetCString()))
+ else:
+ print("'foo' value: %d"%(self.value.GetValueAsUnsigned()))
+
+ StepWithChild.__init__(self, thread_plan)
+
+
+ def queue_child_thread_plan(self):
+ le = self.frame.GetLineEntry()
+ start_addr = le.GetStartAddress()
+ start = start_addr.GetLoadAddress(self.target)
+ end = le.GetEndAddress().GetLoadAddress(self.target)
+ return self.thread_plan.QueueThreadPlanForStepOverRange(start_addr,
+ end - start)
+
+ def should_stop(self, event):
+ if not self.child_thread_plan.IsPlanComplete():
+ return False
+
+ # If we've stepped out of this frame, stop.
+ if not self.frame.IsValid():
+ return True
+
+ if not self.value.IsValid():
+ return True
+
+ print("Got next value: %d"%(self.value.GetValueAsUnsigned()))
+ if not self.value.GetValueDidChange():
+ self.child_thread_plan = self.queue_child_thread_plan()
+ return False
+ else:
+ return True
diff --git a/gnu/llvm/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/TestStepScripted.py b/gnu/llvm/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/TestStepScripted.py
new file mode 100644
index 00000000000..eb1b5822580
--- /dev/null
+++ b/gnu/llvm/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/TestStepScripted.py
@@ -0,0 +1,108 @@
+"""
+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 setUp(self):
+ TestBase.setUp(self)
+ self.main_source_file = lldb.SBFileSpec("main.c")
+ self.runCmd("command script import Steps.py")
+
+ 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.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.step_out_with_scripted_plan("Steps.StepScripted")
+
+ 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(), err.GetCString())
+
+ frame = thread.GetFrameAtIndex(0)
+ self.assertEqual("main", frame.GetFunctionName())
+
+
+ def test_misspelled_plan_name(self):
+ """Test that we get a useful error if we misspell the plan class name"""
+ self.build()
+ (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(self,
+ "Set a breakpoint here",
+ self.main_source_file)
+ stop_id = process.GetStopID()
+ # Pass a non-existent class for the plan class:
+ err = thread.StepUsingScriptedThreadPlan("NoSuchModule.NoSuchPlan")
+
+ # Make sure we got a good error:
+ self.assertTrue(err.Fail(), "We got a failure state")
+ msg = err.GetCString()
+ self.assertTrue("NoSuchModule.NoSuchPlan" in msg, "Mentioned missing class")
+
+ # Make sure we didn't let the process run:
+ self.assertEqual(stop_id, process.GetStopID(), "Process didn't run")
+
+ def test_checking_variable(self):
+ """Test that we can call SBValue API's from a scripted thread plan - using SBAPI's to step"""
+ self.do_test_checking_variable(False)
+
+ def test_checking_variable_cli(self):
+ """Test that we can call SBValue API's from a scripted thread plan - using cli to step"""
+ self.do_test_checking_variable(True)
+
+ def do_test_checking_variable(self, use_cli):
+ self.build()
+ (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())
+ foo_val = frame.FindVariable("foo")
+ self.assertTrue(foo_val.GetError().Success(), "Got the foo variable")
+ self.assertEqual(foo_val.GetValueAsUnsigned(), 10, "foo starts at 10")
+
+ if use_cli:
+ result = lldb.SBCommandReturnObject()
+ self.dbg.GetCommandInterpreter().HandleCommand(
+ "thread step-scripted -C Steps.StepUntil -k variable_name -v foo",
+ result)
+ self.assertTrue(result.Succeeded())
+ else:
+ args_data = lldb.SBStructuredData()
+ data = lldb.SBStream()
+ data.Print('{"variable_name" : "foo"}')
+ error = args_data.SetFromJSON(data)
+ self.assertTrue(error.Success(), "Made the args_data correctly")
+
+ err = thread.StepUsingScriptedThreadPlan("Steps.StepUntil", args_data, True)
+ self.assertTrue(err.Success(), err.GetCString())
+
+ # We should not have exited:
+ self.assertEqual(process.GetState(), lldb.eStateStopped, "We are stopped")
+
+ # We should still be in foo:
+ self.assertEqual("foo", frame.GetFunctionName())
+
+ # And foo should have changed:
+ self.assertTrue(foo_val.GetValueDidChange(), "Foo changed")
diff --git a/gnu/llvm/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/main.c b/gnu/llvm/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/main.c
new file mode 100644
index 00000000000..bfd8a35d556
--- /dev/null
+++ b/gnu/llvm/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/main.c
@@ -0,0 +1,13 @@
+#include <stdio.h>
+
+void foo() {
+ int foo = 10;
+ printf("%d\n", foo); // Set a breakpoint here.
+ foo = 20;
+ printf("%d\n", foo);
+}
+
+int main() {
+ foo();
+ return 0;
+}