xref: /llvm-project/lldb/test/API/python_api/lldbutil/iter/TestRegistersIterator.py (revision 2238dcc39358353cac21df75c3c3286ab20b8f53)
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