199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtTestlldb Python SBFrame APIs IsInlined() and GetFunctionName().
399451b44SJordan Rupprecht"""
499451b44SJordan Rupprecht
599451b44SJordan Rupprechtfrom __future__ import print_function
699451b44SJordan Rupprecht
799451b44SJordan Rupprecht
899451b44SJordan Rupprechtimport lldb
999451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
1099451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
1199451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
1299451b44SJordan Rupprecht
1399451b44SJordan Rupprecht
1499451b44SJordan Rupprechtclass InlinedFrameAPITestCase(TestBase):
1599451b44SJordan Rupprecht
1699451b44SJordan Rupprecht    mydir = TestBase.compute_mydir(__file__)
1799451b44SJordan Rupprecht
1899451b44SJordan Rupprecht    def setUp(self):
1999451b44SJordan Rupprecht        # Call super's setUp().
2099451b44SJordan Rupprecht        TestBase.setUp(self)
2199451b44SJordan Rupprecht        # Find the line number to of function 'c'.
2299451b44SJordan Rupprecht        self.source = 'inlines.c'
2399451b44SJordan Rupprecht        self.first_stop = line_number(
2499451b44SJordan Rupprecht            self.source, '// This should correspond to the first break stop.')
2599451b44SJordan Rupprecht        self.second_stop = line_number(
2699451b44SJordan Rupprecht            self.source, '// This should correspond to the second break stop.')
2799451b44SJordan Rupprecht
2899451b44SJordan Rupprecht    @add_test_categories(['pyapi'])
2999451b44SJordan Rupprecht    def test_stop_at_outer_inline(self):
3099451b44SJordan Rupprecht        """Exercise SBFrame.IsInlined() and SBFrame.GetFunctionName()."""
3199451b44SJordan Rupprecht        self.build()
3299451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
3399451b44SJordan Rupprecht
3499451b44SJordan Rupprecht        # Create a target by the debugger.
3599451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
3699451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
3799451b44SJordan Rupprecht
3899451b44SJordan Rupprecht        # Now create a breakpoint on main.c by the name of 'inner_inline'.
3999451b44SJordan Rupprecht        breakpoint = target.BreakpointCreateByName('inner_inline', 'a.out')
40*b321b429SJonas Devlieghere        self.trace("breakpoint:", breakpoint)
4199451b44SJordan Rupprecht        self.assertTrue(breakpoint and
4299451b44SJordan Rupprecht                        breakpoint.GetNumLocations() > 1,
4399451b44SJordan Rupprecht                        VALID_BREAKPOINT)
4499451b44SJordan Rupprecht
4599451b44SJordan Rupprecht        # Now launch the process, and do not stop at the entry point.
4699451b44SJordan Rupprecht        process = target.LaunchSimple(
4799451b44SJordan Rupprecht            None, None, self.get_process_working_directory())
4899451b44SJordan Rupprecht
4999451b44SJordan Rupprecht        process = target.GetProcess()
5099451b44SJordan Rupprecht        self.assertTrue(process.GetState() == lldb.eStateStopped,
5199451b44SJordan Rupprecht                        PROCESS_STOPPED)
5299451b44SJordan Rupprecht
5399451b44SJordan Rupprecht        import lldbsuite.test.lldbutil as lldbutil
5499451b44SJordan Rupprecht        stack_traces1 = lldbutil.print_stacktraces(process, string_buffer=True)
5599451b44SJordan Rupprecht        if self.TraceOn():
5699451b44SJordan Rupprecht            print(
5799451b44SJordan Rupprecht                "Full stack traces when first stopped on the breakpoint 'inner_inline':")
5899451b44SJordan Rupprecht            print(stack_traces1)
5999451b44SJordan Rupprecht
6099451b44SJordan Rupprecht        # The first breakpoint should correspond to an inlined call frame.
6199451b44SJordan Rupprecht        # If it's an inlined call frame, expect to find, in the stack trace,
6299451b44SJordan Rupprecht        # that there is a frame which corresponds to the following call site:
6399451b44SJordan Rupprecht        #
6499451b44SJordan Rupprecht        #     outer_inline (argc);
6599451b44SJordan Rupprecht        #
6699451b44SJordan Rupprecht        thread = lldbutil.get_stopped_thread(
6799451b44SJordan Rupprecht            process, lldb.eStopReasonBreakpoint)
6899451b44SJordan Rupprecht        self.assertIsNotNone(thread)
6999451b44SJordan Rupprecht
7099451b44SJordan Rupprecht        frame0 = thread.GetFrameAtIndex(0)
7199451b44SJordan Rupprecht        if frame0.IsInlined():
7299451b44SJordan Rupprecht            filename = frame0.GetLineEntry().GetFileSpec().GetFilename()
7399451b44SJordan Rupprecht            self.assertTrue(filename == self.source)
7499451b44SJordan Rupprecht            self.expect(
7599451b44SJordan Rupprecht                stack_traces1, "First stop at %s:%d" %
7699451b44SJordan Rupprecht                (self.source, self.first_stop), exe=False, substrs=[
7799451b44SJordan Rupprecht                    '%s:%d' %
7899451b44SJordan Rupprecht                    (self.source, self.first_stop)])
7999451b44SJordan Rupprecht
8099451b44SJordan Rupprecht            # Expect to break again for the second time.
8199451b44SJordan Rupprecht            process.Continue()
8299451b44SJordan Rupprecht            self.assertTrue(process.GetState() == lldb.eStateStopped,
8399451b44SJordan Rupprecht                            PROCESS_STOPPED)
8499451b44SJordan Rupprecht            stack_traces2 = lldbutil.print_stacktraces(
8599451b44SJordan Rupprecht                process, string_buffer=True)
8699451b44SJordan Rupprecht            if self.TraceOn():
8799451b44SJordan Rupprecht                print(
8899451b44SJordan Rupprecht                    "Full stack traces when stopped on the breakpoint 'inner_inline' for the second time:")
8999451b44SJordan Rupprecht                print(stack_traces2)
9099451b44SJordan Rupprecht                self.expect(
9199451b44SJordan Rupprecht                    stack_traces2, "Second stop at %s:%d" %
9299451b44SJordan Rupprecht                    (self.source, self.second_stop), exe=False, substrs=[
9399451b44SJordan Rupprecht                        '%s:%d' %
9499451b44SJordan Rupprecht                        (self.source, self.second_stop)])
95