1*99451b44SJordan Rupprecht""" 2*99451b44SJordan RupprechtTest the iteration protocol for frame registers. 3*99451b44SJordan Rupprecht""" 4*99451b44SJordan Rupprecht 5*99451b44SJordan Rupprechtfrom __future__ import print_function 6*99451b44SJordan Rupprecht 7*99451b44SJordan Rupprecht 8*99451b44SJordan Rupprechtimport lldb 9*99451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 10*99451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 11*99451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 12*99451b44SJordan Rupprecht 13*99451b44SJordan Rupprecht 14*99451b44SJordan Rupprechtclass RegistersIteratorTestCase(TestBase): 15*99451b44SJordan Rupprecht 16*99451b44SJordan Rupprecht def setUp(self): 17*99451b44SJordan Rupprecht # Call super's setUp(). 18*99451b44SJordan Rupprecht TestBase.setUp(self) 19*99451b44SJordan Rupprecht # Find the line number to break inside main(). 20*99451b44SJordan Rupprecht self.line1 = line_number( 21*99451b44SJordan Rupprecht 'main.cpp', '// Set break point at this line.') 22*99451b44SJordan Rupprecht 23*99451b44SJordan Rupprecht def test_iter_registers(self): 24*99451b44SJordan Rupprecht """Test iterator works correctly for lldbutil.iter_registers().""" 25*99451b44SJordan Rupprecht self.build() 26*99451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 27*99451b44SJordan Rupprecht 28*99451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 29*99451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 30*99451b44SJordan Rupprecht 31*99451b44SJordan Rupprecht breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line1) 32*99451b44SJordan Rupprecht self.assertTrue(breakpoint, VALID_BREAKPOINT) 33*99451b44SJordan Rupprecht 34*99451b44SJordan Rupprecht # Now launch the process, and do not stop at entry point. 35*99451b44SJordan Rupprecht process = target.LaunchSimple( 36*99451b44SJordan Rupprecht None, None, self.get_process_working_directory()) 37*99451b44SJordan Rupprecht 38*99451b44SJordan Rupprecht if not process: 39*99451b44SJordan Rupprecht self.fail("SBTarget.LaunchProcess() failed") 40*99451b44SJordan Rupprecht 41*99451b44SJordan Rupprecht import lldbsuite.test.lldbutil as lldbutil 42*99451b44SJordan Rupprecht for thread in process: 43*99451b44SJordan Rupprecht if thread.GetStopReason() == lldb.eStopReasonBreakpoint: 44*99451b44SJordan Rupprecht for frame in thread: 45*99451b44SJordan Rupprecht # Dump the registers of this frame using 46*99451b44SJordan Rupprecht # lldbutil.get_GPRs() and friends. 47*99451b44SJordan Rupprecht if self.TraceOn(): 48*99451b44SJordan Rupprecht print(frame) 49*99451b44SJordan Rupprecht 50*99451b44SJordan Rupprecht REGs = lldbutil.get_GPRs(frame) 51*99451b44SJordan Rupprecht num = len(REGs) 52*99451b44SJordan Rupprecht if self.TraceOn(): 53*99451b44SJordan Rupprecht print( 54*99451b44SJordan Rupprecht "\nNumber of general purpose registers: %d" % 55*99451b44SJordan Rupprecht num) 56*99451b44SJordan Rupprecht for reg in REGs: 57*99451b44SJordan Rupprecht self.assertTrue(reg) 58*99451b44SJordan Rupprecht if self.TraceOn(): 59*99451b44SJordan Rupprecht print("%s => %s" % (reg.GetName(), reg.GetValue())) 60*99451b44SJordan Rupprecht 61*99451b44SJordan Rupprecht REGs = lldbutil.get_FPRs(frame) 62*99451b44SJordan Rupprecht num = len(REGs) 63*99451b44SJordan Rupprecht if self.TraceOn(): 64*99451b44SJordan Rupprecht print("\nNumber of floating point registers: %d" % num) 65*99451b44SJordan Rupprecht for reg in REGs: 66*99451b44SJordan Rupprecht self.assertTrue(reg) 67*99451b44SJordan Rupprecht if self.TraceOn(): 68*99451b44SJordan Rupprecht print("%s => %s" % (reg.GetName(), reg.GetValue())) 69*99451b44SJordan Rupprecht 70*99451b44SJordan Rupprecht REGs = lldbutil.get_ESRs(frame) 71*99451b44SJordan Rupprecht if self.platformIsDarwin(): 72*99451b44SJordan Rupprecht if self.getArchitecture() != 'armv7' and self.getArchitecture() != 'armv7k': 73*99451b44SJordan Rupprecht num = len(REGs) 74*99451b44SJordan Rupprecht if self.TraceOn(): 75*99451b44SJordan Rupprecht print( 76*99451b44SJordan Rupprecht "\nNumber of exception state registers: %d" % 77*99451b44SJordan Rupprecht num) 78*99451b44SJordan Rupprecht for reg in REGs: 79*99451b44SJordan Rupprecht self.assertTrue(reg) 80*99451b44SJordan Rupprecht if self.TraceOn(): 81*99451b44SJordan Rupprecht print( 82*99451b44SJordan Rupprecht "%s => %s" % 83*99451b44SJordan Rupprecht (reg.GetName(), reg.GetValue())) 84*99451b44SJordan Rupprecht else: 85*99451b44SJordan Rupprecht self.assertIsNone(REGs) 86*99451b44SJordan Rupprecht 87*99451b44SJordan Rupprecht # And these should also work. 88*99451b44SJordan Rupprecht for kind in ["General Purpose Registers", 89*99451b44SJordan Rupprecht "Floating Point Registers"]: 90*99451b44SJordan Rupprecht REGs = lldbutil.get_registers(frame, kind) 91*99451b44SJordan Rupprecht self.assertTrue(REGs) 92*99451b44SJordan Rupprecht 93*99451b44SJordan Rupprecht REGs = lldbutil.get_registers( 94*99451b44SJordan Rupprecht frame, "Exception State Registers") 95*99451b44SJordan Rupprecht if self.platformIsDarwin(): 96*99451b44SJordan Rupprecht if self.getArchitecture() != 'armv7' and self.getArchitecture() != 'armv7k': 97*99451b44SJordan Rupprecht self.assertIsNotNone(REGs) 98*99451b44SJordan Rupprecht else: 99*99451b44SJordan Rupprecht self.assertIsNone(REGs) 100*99451b44SJordan Rupprecht 101*99451b44SJordan Rupprecht # We've finished dumping the registers for frame #0. 102*99451b44SJordan Rupprecht break 103