199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtTest the iteration protocol for frame registers. 399451b44SJordan Rupprecht""" 499451b44SJordan Rupprecht 599451b44SJordan Rupprechtimport lldb 699451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 799451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 899451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 999451b44SJordan Rupprecht 1099451b44SJordan Rupprecht 1199451b44SJordan Rupprechtclass RegistersIteratorTestCase(TestBase): 1299451b44SJordan Rupprecht def setUp(self): 1399451b44SJordan Rupprecht # Call super's setUp(). 1499451b44SJordan Rupprecht TestBase.setUp(self) 1599451b44SJordan Rupprecht # Find the line number to break inside main(). 16*2238dcc3SJonas Devlieghere self.line1 = line_number("main.cpp", "// Set break point at this line.") 1799451b44SJordan Rupprecht 1899451b44SJordan Rupprecht def test_iter_registers(self): 1999451b44SJordan Rupprecht """Test iterator works correctly for lldbutil.iter_registers().""" 2099451b44SJordan Rupprecht self.build() 2199451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 2299451b44SJordan Rupprecht 2399451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 2499451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 2599451b44SJordan Rupprecht 2699451b44SJordan Rupprecht breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line1) 2799451b44SJordan Rupprecht self.assertTrue(breakpoint, VALID_BREAKPOINT) 2899451b44SJordan Rupprecht 2999451b44SJordan Rupprecht # Now launch the process, and do not stop at entry point. 30*2238dcc3SJonas Devlieghere process = target.LaunchSimple(None, None, self.get_process_working_directory()) 3199451b44SJordan Rupprecht 3299451b44SJordan Rupprecht if not process: 3399451b44SJordan Rupprecht self.fail("SBTarget.LaunchProcess() failed") 3499451b44SJordan Rupprecht 3599451b44SJordan Rupprecht import lldbsuite.test.lldbutil as lldbutil 36*2238dcc3SJonas Devlieghere 3799451b44SJordan Rupprecht for thread in process: 3899451b44SJordan Rupprecht if thread.GetStopReason() == lldb.eStopReasonBreakpoint: 3999451b44SJordan Rupprecht for frame in thread: 4099451b44SJordan Rupprecht # Dump the registers of this frame using 4199451b44SJordan Rupprecht # lldbutil.get_GPRs() and friends. 4299451b44SJordan Rupprecht if self.TraceOn(): 4399451b44SJordan Rupprecht print(frame) 4499451b44SJordan Rupprecht 4599451b44SJordan Rupprecht REGs = lldbutil.get_GPRs(frame) 4699451b44SJordan Rupprecht num = len(REGs) 4799451b44SJordan Rupprecht if self.TraceOn(): 48*2238dcc3SJonas Devlieghere print("\nNumber of general purpose registers: %d" % num) 4999451b44SJordan Rupprecht for reg in REGs: 5099451b44SJordan Rupprecht self.assertTrue(reg) 5199451b44SJordan Rupprecht if self.TraceOn(): 5299451b44SJordan Rupprecht print("%s => %s" % (reg.GetName(), reg.GetValue())) 5399451b44SJordan Rupprecht 5499451b44SJordan Rupprecht REGs = lldbutil.get_FPRs(frame) 5599451b44SJordan Rupprecht num = len(REGs) 5699451b44SJordan Rupprecht if self.TraceOn(): 5799451b44SJordan Rupprecht print("\nNumber of floating point registers: %d" % num) 5899451b44SJordan Rupprecht for reg in REGs: 5999451b44SJordan Rupprecht self.assertTrue(reg) 6099451b44SJordan Rupprecht if self.TraceOn(): 6199451b44SJordan Rupprecht print("%s => %s" % (reg.GetName(), reg.GetValue())) 6299451b44SJordan Rupprecht 6399451b44SJordan Rupprecht REGs = lldbutil.get_ESRs(frame) 6499451b44SJordan Rupprecht if self.platformIsDarwin(): 65*2238dcc3SJonas Devlieghere if ( 66*2238dcc3SJonas Devlieghere self.getArchitecture() != "armv7" 67*2238dcc3SJonas Devlieghere and self.getArchitecture() != "armv7k" 68*2238dcc3SJonas Devlieghere ): 6999451b44SJordan Rupprecht num = len(REGs) 7099451b44SJordan Rupprecht if self.TraceOn(): 71*2238dcc3SJonas Devlieghere print("\nNumber of exception state registers: %d" % num) 7299451b44SJordan Rupprecht for reg in REGs: 7399451b44SJordan Rupprecht self.assertTrue(reg) 7499451b44SJordan Rupprecht if self.TraceOn(): 75*2238dcc3SJonas Devlieghere print("%s => %s" % (reg.GetName(), reg.GetValue())) 7699451b44SJordan Rupprecht else: 7799451b44SJordan Rupprecht self.assertIsNone(REGs) 7899451b44SJordan Rupprecht 7999451b44SJordan Rupprecht # And these should also work. 80*2238dcc3SJonas Devlieghere for kind in [ 81*2238dcc3SJonas Devlieghere "General Purpose Registers", 82*2238dcc3SJonas Devlieghere "Floating Point Registers", 83*2238dcc3SJonas Devlieghere ]: 8499451b44SJordan Rupprecht REGs = lldbutil.get_registers(frame, kind) 8599451b44SJordan Rupprecht self.assertTrue(REGs) 8699451b44SJordan Rupprecht 87*2238dcc3SJonas Devlieghere REGs = lldbutil.get_registers(frame, "Exception State Registers") 8899451b44SJordan Rupprecht if self.platformIsDarwin(): 89*2238dcc3SJonas Devlieghere if ( 90*2238dcc3SJonas Devlieghere self.getArchitecture() != "armv7" 91*2238dcc3SJonas Devlieghere and self.getArchitecture() != "armv7k" 92*2238dcc3SJonas Devlieghere ): 9399451b44SJordan Rupprecht self.assertIsNotNone(REGs) 9499451b44SJordan Rupprecht else: 9599451b44SJordan Rupprecht self.assertIsNone(REGs) 9699451b44SJordan Rupprecht 9799451b44SJordan Rupprecht # We've finished dumping the registers for frame #0. 9899451b44SJordan Rupprecht break 99