xref: /llvm-project/lldb/test/API/macosx/builtin-debugtrap/TestBuiltinDebugTrap.py (revision 2238dcc39358353cac21df75c3c3286ab20b8f53)
192b036deSJason Molenda"""
292b036deSJason MolendaTest that lldb can continue past a __builtin_debugtrap, but not a __builtin_trap
392b036deSJason Molenda"""
492b036deSJason Molenda
592b036deSJason Molendaimport lldb
692b036deSJason Molendaimport lldbsuite.test.lldbutil as lldbutil
792b036deSJason Molendafrom lldbsuite.test.decorators import *
892b036deSJason Molendafrom lldbsuite.test.lldbtest import *
992b036deSJason Molenda
1092b036deSJason Molenda
11*2238dcc3SJonas Devlieghereclass BuiltinDebugTrapTestCase(TestBase):
1292b036deSJason Molenda    NO_DEBUG_INFO_TESTCASE = True
1392b036deSJason Molenda
1492b036deSJason Molenda    # Currently this depends on behavior in debugserver to
1592b036deSJason Molenda    # advance the pc past __builtin_trap instructions so that
1692b036deSJason Molenda    # continue works.  Everyone is in agreement that this
1792b036deSJason Molenda    # should be moved up into lldb instead of depending on the
1892b036deSJason Molenda    # remote stub rewriting the pc values.
1992b036deSJason Molenda    @skipUnlessDarwin
2092b036deSJason Molenda    def test(self):
2192b036deSJason Molenda        self.build()
2292b036deSJason Molenda        (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(
23*2238dcc3SJonas Devlieghere            self, "// Set a breakpoint here", lldb.SBFileSpec("main.cpp")
24*2238dcc3SJonas Devlieghere        )
2592b036deSJason Molenda
2692b036deSJason Molenda        # Continue to __builtin_debugtrap()
2792b036deSJason Molenda        process.Continue()
2892b036deSJason Molenda        if self.TraceOn():
2992b036deSJason Molenda            self.runCmd("f")
3092b036deSJason Molenda            self.runCmd("bt")
3192b036deSJason Molenda            self.runCmd("ta v global")
3292b036deSJason Molenda
33*2238dcc3SJonas Devlieghere        self.assertEqual(
34*2238dcc3SJonas Devlieghere            process.GetSelectedThread().GetStopReason(), lldb.eStopReasonException
35*2238dcc3SJonas Devlieghere        )
3692b036deSJason Molenda
3792b036deSJason Molenda        list = target.FindGlobalVariables("global", 1, lldb.eMatchTypeNormal)
3892b036deSJason Molenda        self.assertEqual(list.GetSize(), 1)
3992b036deSJason Molenda        global_value = list.GetValueAtIndex(0)
4092b036deSJason Molenda
4192b036deSJason Molenda        self.assertEqual(global_value.GetValueAsUnsigned(), 5)
4292b036deSJason Molenda
4392b036deSJason Molenda        # Continue to the __builtin_trap() -- we should be able to
4492b036deSJason Molenda        # continue past __builtin_debugtrap.
4592b036deSJason Molenda        process.Continue()
4692b036deSJason Molenda        if self.TraceOn():
4792b036deSJason Molenda            self.runCmd("f")
4892b036deSJason Molenda            self.runCmd("bt")
4992b036deSJason Molenda            self.runCmd("ta v global")
5092b036deSJason Molenda
51*2238dcc3SJonas Devlieghere        self.assertEqual(
52*2238dcc3SJonas Devlieghere            process.GetSelectedThread().GetStopReason(), lldb.eStopReasonException
53*2238dcc3SJonas Devlieghere        )
5492b036deSJason Molenda
5592b036deSJason Molenda        # "global" is now 10.
5692b036deSJason Molenda        self.assertEqual(global_value.GetValueAsUnsigned(), 10)
5792b036deSJason Molenda
5892b036deSJason Molenda        # We should be at the same point as before -- cannot advance
5992b036deSJason Molenda        # past a __builtin_trap().
6092b036deSJason Molenda        process.Continue()
6192b036deSJason Molenda        if self.TraceOn():
6292b036deSJason Molenda            self.runCmd("f")
6392b036deSJason Molenda            self.runCmd("bt")
6492b036deSJason Molenda            self.runCmd("ta v global")
6592b036deSJason Molenda
66*2238dcc3SJonas Devlieghere        self.assertEqual(
67*2238dcc3SJonas Devlieghere            process.GetSelectedThread().GetStopReason(), lldb.eStopReasonException
68*2238dcc3SJonas Devlieghere        )
6992b036deSJason Molenda
7092b036deSJason Molenda        # "global" is still 10.
7192b036deSJason Molenda        self.assertEqual(global_value.GetValueAsUnsigned(), 10)
72