1*99451b44SJordan Rupprecht"""
2*99451b44SJordan RupprechtTest that we can backtrace correctly from Non ABI functions on the stack
3*99451b44SJordan Rupprecht"""
4*99451b44SJordan Rupprecht
5*99451b44SJordan Rupprecht
6*99451b44SJordan Rupprecht
7*99451b44SJordan Rupprechtimport lldb
8*99451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
9*99451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
10*99451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
11*99451b44SJordan Rupprecht
12*99451b44SJordan Rupprecht
13*99451b44SJordan Rupprechtclass EHFrameBasedUnwind(TestBase):
14*99451b44SJordan Rupprecht
15*99451b44SJordan Rupprecht    @skipUnlessPlatform(['linux'])
16*99451b44SJordan Rupprecht    @skipIf(archs=["aarch64", "arm", "i386", "i686"])
17*99451b44SJordan Rupprecht    def test(self):
18*99451b44SJordan Rupprecht        """Test that we can backtrace correctly from Non ABI  functions on the stack"""
19*99451b44SJordan Rupprecht        self.build()
20*99451b44SJordan Rupprecht        self.setTearDownCleanup()
21*99451b44SJordan Rupprecht
22*99451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
23*99451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
24*99451b44SJordan Rupprecht
25*99451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
26*99451b44SJordan Rupprecht
27*99451b44SJordan Rupprecht        lldbutil.run_break_set_by_symbol(self, "func")
28*99451b44SJordan Rupprecht
29*99451b44SJordan Rupprecht        process = target.LaunchSimple(
30*99451b44SJordan Rupprecht            ["abc", "xyz"], None, self.get_process_working_directory())
31*99451b44SJordan Rupprecht
32*99451b44SJordan Rupprecht        if not process:
33*99451b44SJordan Rupprecht            self.fail("SBTarget.Launch() failed")
34*99451b44SJordan Rupprecht
35*99451b44SJordan Rupprecht        if process.GetState() != lldb.eStateStopped:
36*99451b44SJordan Rupprecht            self.fail("Process should be in the 'stopped' state, "
37*99451b44SJordan Rupprecht                      "instead the actual state is: '%s'" %
38*99451b44SJordan Rupprecht                      lldbutil.state_type_to_str(process.GetState()))
39*99451b44SJordan Rupprecht
40*99451b44SJordan Rupprecht        stacktraces = lldbutil.print_stacktraces(process, string_buffer=True)
41*99451b44SJordan Rupprecht        self.expect(stacktraces, exe=False,
42*99451b44SJordan Rupprecht                    substrs=['(int)argc=3'])
43*99451b44SJordan Rupprecht
44*99451b44SJordan Rupprecht        self.runCmd("thread step-inst")
45*99451b44SJordan Rupprecht
46*99451b44SJordan Rupprecht        stacktraces = lldbutil.print_stacktraces(process, string_buffer=True)
47*99451b44SJordan Rupprecht        self.expect(stacktraces, exe=False,
48*99451b44SJordan Rupprecht                    substrs=['(int)argc=3'])
49