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