1*99451b44SJordan Rupprecht"""
2*99451b44SJordan RupprechtTestlldb Python SBFrame APIs IsInlined() and GetFunctionName().
3*99451b44SJordan Rupprecht"""
4*99451b44SJordan Rupprecht
5*99451b44SJordan Rupprechtfrom __future__ import print_function
6*99451b44SJordan Rupprecht
7*99451b44SJordan Rupprecht
8*99451b44SJordan Rupprechtimport lldb
9*99451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
10*99451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
11*99451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
12*99451b44SJordan Rupprecht
13*99451b44SJordan Rupprecht
14*99451b44SJordan Rupprechtclass InlinedFrameAPITestCase(TestBase):
15*99451b44SJordan Rupprecht
16*99451b44SJordan Rupprecht    mydir = TestBase.compute_mydir(__file__)
17*99451b44SJordan Rupprecht
18*99451b44SJordan Rupprecht    def setUp(self):
19*99451b44SJordan Rupprecht        # Call super's setUp().
20*99451b44SJordan Rupprecht        TestBase.setUp(self)
21*99451b44SJordan Rupprecht        # Find the line number to of function 'c'.
22*99451b44SJordan Rupprecht        self.source = 'inlines.c'
23*99451b44SJordan Rupprecht        self.first_stop = line_number(
24*99451b44SJordan Rupprecht            self.source, '// This should correspond to the first break stop.')
25*99451b44SJordan Rupprecht        self.second_stop = line_number(
26*99451b44SJordan Rupprecht            self.source, '// This should correspond to the second break stop.')
27*99451b44SJordan Rupprecht
28*99451b44SJordan Rupprecht    @add_test_categories(['pyapi'])
29*99451b44SJordan Rupprecht    def test_stop_at_outer_inline(self):
30*99451b44SJordan Rupprecht        """Exercise SBFrame.IsInlined() and SBFrame.GetFunctionName()."""
31*99451b44SJordan Rupprecht        self.build()
32*99451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
33*99451b44SJordan Rupprecht
34*99451b44SJordan Rupprecht        # Create a target by the debugger.
35*99451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
36*99451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
37*99451b44SJordan Rupprecht
38*99451b44SJordan Rupprecht        # Now create a breakpoint on main.c by the name of 'inner_inline'.
39*99451b44SJordan Rupprecht        breakpoint = target.BreakpointCreateByName('inner_inline', 'a.out')
40*99451b44SJordan Rupprecht        #print("breakpoint:", breakpoint)
41*99451b44SJordan Rupprecht        self.assertTrue(breakpoint and
42*99451b44SJordan Rupprecht                        breakpoint.GetNumLocations() > 1,
43*99451b44SJordan Rupprecht                        VALID_BREAKPOINT)
44*99451b44SJordan Rupprecht
45*99451b44SJordan Rupprecht        # Now launch the process, and do not stop at the entry point.
46*99451b44SJordan Rupprecht        process = target.LaunchSimple(
47*99451b44SJordan Rupprecht            None, None, self.get_process_working_directory())
48*99451b44SJordan Rupprecht
49*99451b44SJordan Rupprecht        process = target.GetProcess()
50*99451b44SJordan Rupprecht        self.assertTrue(process.GetState() == lldb.eStateStopped,
51*99451b44SJordan Rupprecht                        PROCESS_STOPPED)
52*99451b44SJordan Rupprecht
53*99451b44SJordan Rupprecht        import lldbsuite.test.lldbutil as lldbutil
54*99451b44SJordan Rupprecht        stack_traces1 = lldbutil.print_stacktraces(process, string_buffer=True)
55*99451b44SJordan Rupprecht        if self.TraceOn():
56*99451b44SJordan Rupprecht            print(
57*99451b44SJordan Rupprecht                "Full stack traces when first stopped on the breakpoint 'inner_inline':")
58*99451b44SJordan Rupprecht            print(stack_traces1)
59*99451b44SJordan Rupprecht
60*99451b44SJordan Rupprecht        # The first breakpoint should correspond to an inlined call frame.
61*99451b44SJordan Rupprecht        # If it's an inlined call frame, expect to find, in the stack trace,
62*99451b44SJordan Rupprecht        # that there is a frame which corresponds to the following call site:
63*99451b44SJordan Rupprecht        #
64*99451b44SJordan Rupprecht        #     outer_inline (argc);
65*99451b44SJordan Rupprecht        #
66*99451b44SJordan Rupprecht        thread = lldbutil.get_stopped_thread(
67*99451b44SJordan Rupprecht            process, lldb.eStopReasonBreakpoint)
68*99451b44SJordan Rupprecht        self.assertIsNotNone(thread)
69*99451b44SJordan Rupprecht
70*99451b44SJordan Rupprecht        frame0 = thread.GetFrameAtIndex(0)
71*99451b44SJordan Rupprecht        if frame0.IsInlined():
72*99451b44SJordan Rupprecht            filename = frame0.GetLineEntry().GetFileSpec().GetFilename()
73*99451b44SJordan Rupprecht            self.assertTrue(filename == self.source)
74*99451b44SJordan Rupprecht            self.expect(
75*99451b44SJordan Rupprecht                stack_traces1, "First stop at %s:%d" %
76*99451b44SJordan Rupprecht                (self.source, self.first_stop), exe=False, substrs=[
77*99451b44SJordan Rupprecht                    '%s:%d' %
78*99451b44SJordan Rupprecht                    (self.source, self.first_stop)])
79*99451b44SJordan Rupprecht
80*99451b44SJordan Rupprecht            # Expect to break again for the second time.
81*99451b44SJordan Rupprecht            process.Continue()
82*99451b44SJordan Rupprecht            self.assertTrue(process.GetState() == lldb.eStateStopped,
83*99451b44SJordan Rupprecht                            PROCESS_STOPPED)
84*99451b44SJordan Rupprecht            stack_traces2 = lldbutil.print_stacktraces(
85*99451b44SJordan Rupprecht                process, string_buffer=True)
86*99451b44SJordan Rupprecht            if self.TraceOn():
87*99451b44SJordan Rupprecht                print(
88*99451b44SJordan Rupprecht                    "Full stack traces when stopped on the breakpoint 'inner_inline' for the second time:")
89*99451b44SJordan Rupprecht                print(stack_traces2)
90*99451b44SJordan Rupprecht                self.expect(
91*99451b44SJordan Rupprecht                    stack_traces2, "Second stop at %s:%d" %
92*99451b44SJordan Rupprecht                    (self.source, self.second_stop), exe=False, substrs=[
93*99451b44SJordan Rupprecht                        '%s:%d' %
94*99451b44SJordan Rupprecht                        (self.source, self.second_stop)])
95