blob: 2188614b4fcdabac537d44d7c8539d73efdbc3e5 [file]
"""
Test thread until with inlined functions.
"""
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil
class TestInlineFrameUntil(TestBase):
NO_DEBUG_INFO_TESTCASE = True
def run_to_sink(self):
self.build()
_, _, thread, _ = lldbutil.run_to_name_breakpoint(self, "sink")
return thread
def until_from_frame(self, frame_idx, marker):
thread = self.run_to_sink()
self.runCmd(f"thread until -f {frame_idx} {line_number('main.c', marker)}")
return thread.GetFrameAtIndex(0)
def check_stops_at(self, frame_idx, marker):
frame = self.until_from_frame(frame_idx, marker)
self.assertEqual(frame.GetLineEntry().GetLine(), line_number("main.c", marker))
def check_rejected(self, frame_idx, marker):
self.run_to_sink()
self.expect(
f"thread until -f {frame_idx} {line_number('main.c', marker)}",
error=True,
substrs=["Until target outside of the current function"],
)
def test_until_in_same_inline_frame(self):
self.check_stops_at(1, "// until in level3")
def test_until_in_parent_inline_frame(self):
self.check_stops_at(2, "// until in level2")
def test_until_in_inlining_caller(self):
self.check_rejected(1, "// until in level2")
def test_until_in_inlined_callee(self):
self.check_rejected(2, "// until in level3")
def test_step_over_until_in_inlining_caller(self):
thread = self.run_to_sink()
error = thread.StepOverUntil(
thread.GetFrameAtIndex(1),
lldb.SBFileSpec("main.c"),
line_number("main.c", "// until in level2"),
)
self.assertIn(
"Until target outside of the current function", error.GetCString()
)