xref: /llvm-project/lldb/test/API/python_api/frame/inlines/TestInlinedFrame.py (revision 2238dcc39358353cac21df75c3c3286ab20b8f53)
199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtTestlldb Python SBFrame APIs IsInlined() and GetFunctionName().
399451b44SJordan Rupprecht"""
499451b44SJordan Rupprecht
599451b44SJordan Rupprechtimport lldb
699451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
799451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
899451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
999451b44SJordan Rupprecht
1099451b44SJordan Rupprecht
1199451b44SJordan Rupprechtclass InlinedFrameAPITestCase(TestBase):
1299451b44SJordan Rupprecht    def setUp(self):
1399451b44SJordan Rupprecht        # Call super's setUp().
1499451b44SJordan Rupprecht        TestBase.setUp(self)
1599451b44SJordan Rupprecht        # Find the line number to of function 'c'.
16*2238dcc3SJonas Devlieghere        self.source = "inlines.c"
1799451b44SJordan Rupprecht        self.first_stop = line_number(
18*2238dcc3SJonas Devlieghere            self.source, "// This should correspond to the first break stop."
19*2238dcc3SJonas Devlieghere        )
2099451b44SJordan Rupprecht        self.second_stop = line_number(
21*2238dcc3SJonas Devlieghere            self.source, "// This should correspond to the second break stop."
22*2238dcc3SJonas Devlieghere        )
2399451b44SJordan Rupprecht
2499451b44SJordan Rupprecht    def test_stop_at_outer_inline(self):
2599451b44SJordan Rupprecht        """Exercise SBFrame.IsInlined() and SBFrame.GetFunctionName()."""
2699451b44SJordan Rupprecht        self.build()
2799451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
2899451b44SJordan Rupprecht
2999451b44SJordan Rupprecht        # Create a target by the debugger.
3099451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
3199451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
3299451b44SJordan Rupprecht
3399451b44SJordan Rupprecht        # Now create a breakpoint on main.c by the name of 'inner_inline'.
34*2238dcc3SJonas Devlieghere        breakpoint = target.BreakpointCreateByName("inner_inline", "a.out")
35b321b429SJonas Devlieghere        self.trace("breakpoint:", breakpoint)
36*2238dcc3SJonas Devlieghere        self.assertTrue(
37*2238dcc3SJonas Devlieghere            breakpoint and breakpoint.GetNumLocations() > 1, VALID_BREAKPOINT
38*2238dcc3SJonas Devlieghere        )
3999451b44SJordan Rupprecht
4099451b44SJordan Rupprecht        # Now launch the process, and do not stop at the entry point.
41*2238dcc3SJonas Devlieghere        process = target.LaunchSimple(None, None, self.get_process_working_directory())
4299451b44SJordan Rupprecht
4399451b44SJordan Rupprecht        process = target.GetProcess()
44*2238dcc3SJonas Devlieghere        self.assertState(process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
4599451b44SJordan Rupprecht
4699451b44SJordan Rupprecht        import lldbsuite.test.lldbutil as lldbutil
47*2238dcc3SJonas Devlieghere
4899451b44SJordan Rupprecht        stack_traces1 = lldbutil.print_stacktraces(process, string_buffer=True)
4999451b44SJordan Rupprecht        if self.TraceOn():
5099451b44SJordan Rupprecht            print(
51*2238dcc3SJonas Devlieghere                "Full stack traces when first stopped on the breakpoint 'inner_inline':"
52*2238dcc3SJonas Devlieghere            )
5399451b44SJordan Rupprecht            print(stack_traces1)
5499451b44SJordan Rupprecht
5599451b44SJordan Rupprecht        # The first breakpoint should correspond to an inlined call frame.
5699451b44SJordan Rupprecht        # If it's an inlined call frame, expect to find, in the stack trace,
5799451b44SJordan Rupprecht        # that there is a frame which corresponds to the following call site:
5899451b44SJordan Rupprecht        #
5999451b44SJordan Rupprecht        #     outer_inline (argc);
6099451b44SJordan Rupprecht        #
61*2238dcc3SJonas Devlieghere        thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonBreakpoint)
6299451b44SJordan Rupprecht        self.assertIsNotNone(thread)
6399451b44SJordan Rupprecht
6499451b44SJordan Rupprecht        frame0 = thread.GetFrameAtIndex(0)
6599451b44SJordan Rupprecht        if frame0.IsInlined():
6699451b44SJordan Rupprecht            filename = frame0.GetLineEntry().GetFileSpec().GetFilename()
67619e2e09SDave Lee            self.assertEqual(filename, self.source)
6899451b44SJordan Rupprecht            self.expect(
69*2238dcc3SJonas Devlieghere                stack_traces1,
70*2238dcc3SJonas Devlieghere                "First stop at %s:%d" % (self.source, self.first_stop),
71*2238dcc3SJonas Devlieghere                exe=False,
72*2238dcc3SJonas Devlieghere                substrs=["%s:%d" % (self.source, self.first_stop)],
73*2238dcc3SJonas Devlieghere            )
7499451b44SJordan Rupprecht
7599451b44SJordan Rupprecht            # Expect to break again for the second time.
7699451b44SJordan Rupprecht            process.Continue()
77*2238dcc3SJonas Devlieghere            self.assertState(process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
78*2238dcc3SJonas Devlieghere            stack_traces2 = lldbutil.print_stacktraces(process, string_buffer=True)
7999451b44SJordan Rupprecht            if self.TraceOn():
8099451b44SJordan Rupprecht                print(
81*2238dcc3SJonas Devlieghere                    "Full stack traces when stopped on the breakpoint 'inner_inline' for the second time:"
82*2238dcc3SJonas Devlieghere                )
8399451b44SJordan Rupprecht                print(stack_traces2)
8499451b44SJordan Rupprecht                self.expect(
85*2238dcc3SJonas Devlieghere                    stack_traces2,
86*2238dcc3SJonas Devlieghere                    "Second stop at %s:%d" % (self.source, self.second_stop),
87*2238dcc3SJonas Devlieghere                    exe=False,
88*2238dcc3SJonas Devlieghere                    substrs=["%s:%d" % (self.source, self.second_stop)],
89*2238dcc3SJonas Devlieghere                )
90