199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtTest the use of setjmp/longjmp for non-local goto operations in a single-threaded inferior. 399451b44SJordan Rupprecht""" 499451b44SJordan Rupprecht 599451b44SJordan Rupprecht 699451b44SJordan Rupprechtimport lldb 799451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 899451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 999451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 1099451b44SJordan Rupprecht 1199451b44SJordan Rupprecht 1299451b44SJordan Rupprechtclass LongjmpTestCase(TestBase): 1399451b44SJordan Rupprecht @skipIfDarwin # llvm.org/pr16769: LLDB on Mac OS X dies in function ReadRegisterBytes in GDBRemoteRegisterContext.cpp 142c2eb5e6SMichał Górny @expectedFailureAll(oslist=["freebsd", "linux"], bugnumber="llvm.org/pr20231") 1599451b44SJordan Rupprecht @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24778") 1699451b44SJordan Rupprecht @expectedFlakeyNetBSD 1799451b44SJordan Rupprecht def test_step_out(self): 1899451b44SJordan Rupprecht """Test stepping when the inferior calls setjmp/longjmp, in particular, thread step-out.""" 1999451b44SJordan Rupprecht self.build() 2099451b44SJordan Rupprecht self.step_out() 2199451b44SJordan Rupprecht 2299451b44SJordan Rupprecht @skipIfDarwin # llvm.org/pr16769: LLDB on Mac OS X dies in function ReadRegisterBytes in GDBRemoteRegisterContext.cpp 232c2eb5e6SMichał Górny @expectedFailureAll(oslist=["freebsd", "linux"], bugnumber="llvm.org/pr20231") 2499451b44SJordan Rupprecht @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24778") 2599451b44SJordan Rupprecht @skipIfNetBSD 2699451b44SJordan Rupprecht def test_step_over(self): 2799451b44SJordan Rupprecht """Test stepping when the inferior calls setjmp/longjmp, in particular, thread step-over a longjmp.""" 2899451b44SJordan Rupprecht self.build() 2999451b44SJordan Rupprecht self.step_over() 3099451b44SJordan Rupprecht 3199451b44SJordan Rupprecht @skipIfDarwin # llvm.org/pr16769: LLDB on Mac OS X dies in function ReadRegisterBytes in GDBRemoteRegisterContext.cpp 322c2eb5e6SMichał Górny @expectedFailureAll(oslist=["freebsd", "linux"], bugnumber="llvm.org/pr20231") 3399451b44SJordan Rupprecht @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24778") 3499451b44SJordan Rupprecht @expectedFlakeyNetBSD 3599451b44SJordan Rupprecht def test_step_back_out(self): 3699451b44SJordan Rupprecht """Test stepping when the inferior calls setjmp/longjmp, in particular, thread step-out after thread step-in.""" 3799451b44SJordan Rupprecht self.build() 3899451b44SJordan Rupprecht self.step_back_out() 3999451b44SJordan Rupprecht 4099451b44SJordan Rupprecht def start_test(self, symbol): 4199451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 4299451b44SJordan Rupprecht 4399451b44SJordan Rupprecht self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) 4499451b44SJordan Rupprecht 4599451b44SJordan Rupprecht # Break in main(). 46*2238dcc3SJonas Devlieghere lldbutil.run_break_set_by_symbol(self, symbol, num_expected_locations=-1) 4799451b44SJordan Rupprecht 4899451b44SJordan Rupprecht self.runCmd("run", RUN_SUCCEEDED) 4999451b44SJordan Rupprecht 5099451b44SJordan Rupprecht # The stop reason of the thread should be breakpoint. 51*2238dcc3SJonas Devlieghere self.expect( 52*2238dcc3SJonas Devlieghere "thread list", 53*2238dcc3SJonas Devlieghere STOPPED_DUE_TO_BREAKPOINT, 54*2238dcc3SJonas Devlieghere substrs=["stopped", "stop reason = breakpoint"], 55*2238dcc3SJonas Devlieghere ) 5699451b44SJordan Rupprecht 5799451b44SJordan Rupprecht def check_status(self): 5899451b44SJordan Rupprecht # Note: Depending on the generated mapping of DWARF to assembly, 5999451b44SJordan Rupprecht # the process may have stopped or exited. 60*2238dcc3SJonas Devlieghere self.expect( 61*2238dcc3SJonas Devlieghere "process status", 62*2238dcc3SJonas Devlieghere PROCESS_STOPPED, 63*2238dcc3SJonas Devlieghere patterns=["Process .* exited with status = 0"], 64*2238dcc3SJonas Devlieghere ) 6599451b44SJordan Rupprecht 6699451b44SJordan Rupprecht def step_out(self): 6799451b44SJordan Rupprecht self.start_test("do_jump") 6899451b44SJordan Rupprecht self.runCmd("thread step-out", RUN_SUCCEEDED) 6999451b44SJordan Rupprecht self.check_status() 7099451b44SJordan Rupprecht 7199451b44SJordan Rupprecht def step_over(self): 7299451b44SJordan Rupprecht self.start_test("do_jump") 7399451b44SJordan Rupprecht self.runCmd("thread step-over", RUN_SUCCEEDED) 7499451b44SJordan Rupprecht self.runCmd("thread step-over", RUN_SUCCEEDED) 7599451b44SJordan Rupprecht self.check_status() 7699451b44SJordan Rupprecht 7799451b44SJordan Rupprecht def step_back_out(self): 7899451b44SJordan Rupprecht self.start_test("main") 7999451b44SJordan Rupprecht 8099451b44SJordan Rupprecht self.runCmd("thread step-over", RUN_SUCCEEDED) 8199451b44SJordan Rupprecht self.runCmd("thread step-in", RUN_SUCCEEDED) 8299451b44SJordan Rupprecht self.runCmd("thread step-out", RUN_SUCCEEDED) 8399451b44SJordan Rupprecht self.check_status() 84