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