1728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen"""
2728255bc323e93a36644a4cdf225192c34c8472cJohnny ChenTest the iteration protocol for frame registers.
3728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen"""
4728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen
5728255bc323e93a36644a4cdf225192c34c8472cJohnny Chenimport os, time
6728255bc323e93a36644a4cdf225192c34c8472cJohnny Chenimport re
7728255bc323e93a36644a4cdf225192c34c8472cJohnny Chenimport unittest2
8728255bc323e93a36644a4cdf225192c34c8472cJohnny Chenimport lldb
9728255bc323e93a36644a4cdf225192c34c8472cJohnny Chenfrom lldbtest import *
10728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen
11728255bc323e93a36644a4cdf225192c34c8472cJohnny Chenclass RegistersIteratorTestCase(TestBase):
12728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen
13a9f92b15f939ae4c4d17c2a61e03477a73955b42Johnny Chen    mydir = os.path.join("python_api", "lldbutil", "iter")
14728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen
15728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen    def setUp(self):
16728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen        # Call super's setUp().
17728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen        TestBase.setUp(self)
18728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen        # Find the line number to break inside main().
19728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen        self.line1 = line_number('main.cpp', '// Set break point at this line.')
20728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen
218be36596a02e57eb3b187f03a760c532d6d95571Ed Maste    @expectedFailureFreeBSD # llvm.org/pr14600 - Exception state registers not supported on FreeBSD
226bc4dcdfbcdfa455299d2123011b82a77351ee72Daniel Malea    @expectedFailureLinux # llvm.org/pr14600 - Exception state registers not supported on Linux
2382ccf4033d09dc7002637ddc70a3ffcc518a58c9Johnny Chen    @python_api_test
24728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen    def test_iter_registers(self):
25728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen        """Test iterator works correctly for lldbutil.iter_registers()."""
26728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen        self.buildDefault()
27728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen        self.iter_registers()
28728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen
29728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen    def iter_registers(self):
30728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen        exe = os.path.join(os.getcwd(), "a.out")
31728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen
32728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen        target = self.dbg.CreateTarget(exe)
332077f0d1ea42e1941387b101e61db01a73d5ee08Johnny Chen        self.assertTrue(target, VALID_TARGET)
34728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen
35728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen        breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line1)
362077f0d1ea42e1941387b101e61db01a73d5ee08Johnny Chen        self.assertTrue(breakpoint, VALID_BREAKPOINT)
37728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen
38728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen        # Now launch the process, and do not stop at entry point.
39425b0cf93f509ba63346e56654322b9d9bc91d60Johnny Chen        process = target.LaunchSimple(None, None, os.getcwd())
40728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen
41425b0cf93f509ba63346e56654322b9d9bc91d60Johnny Chen        if not process:
42728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen            self.fail("SBTarget.LaunchProcess() failed")
43728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen
44728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen        import lldbutil
453d8ae4681b81b42a404ad77a231c6f743040e644Johnny Chen        for thread in process:
46728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen            if thread.GetStopReason() == lldb.eStopReasonBreakpoint:
47728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen                for frame in thread:
48a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen                    # Dump the registers of this frame using lldbutil.get_GPRs() and friends.
49728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen                    if self.TraceOn():
50728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen                        print frame
51728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen
52a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen                    REGs = lldbutil.get_GPRs(frame)
53a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen                    num = len(REGs)
54a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen                    if self.TraceOn():
55a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen                        print "\nNumber of general purpose registers: %d" % num
56a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen                    for reg in REGs:
572077f0d1ea42e1941387b101e61db01a73d5ee08Johnny Chen                        self.assertTrue(reg)
58a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen                        if self.TraceOn():
590fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton                            print "%s => %s" % (reg.GetName(), reg.GetValue())
60a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen
61a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen                    REGs = lldbutil.get_FPRs(frame)
62a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen                    num = len(REGs)
63a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen                    if self.TraceOn():
64a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen                        print "\nNumber of floating point registers: %d" % num
65a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen                    for reg in REGs:
662077f0d1ea42e1941387b101e61db01a73d5ee08Johnny Chen                        self.assertTrue(reg)
67a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen                        if self.TraceOn():
680fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton                            print "%s => %s" % (reg.GetName(), reg.GetValue())
69a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen
70a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen                    REGs = lldbutil.get_ESRs(frame)
71a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen                    num = len(REGs)
72a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen                    if self.TraceOn():
73a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen                        print "\nNumber of exception state registers: %d" % num
74a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen                    for reg in REGs:
752077f0d1ea42e1941387b101e61db01a73d5ee08Johnny Chen                        self.assertTrue(reg)
76a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen                        if self.TraceOn():
770fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton                            print "%s => %s" % (reg.GetName(), reg.GetValue())
78a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen
79a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen                    # And these should also work.
80728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen                    for kind in ["General Purpose Registers",
81728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen                                 "Floating Point Registers",
82728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen                                 "Exception State Registers"]:
83728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen                        REGs = lldbutil.get_registers(frame, kind)
842077f0d1ea42e1941387b101e61db01a73d5ee08Johnny Chen                        self.assertTrue(REGs)
85728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen
86a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen                    # We've finished dumping the registers for frame #0.
87728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen                    break
88728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen
89728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen
90728255bc323e93a36644a4cdf225192c34c8472cJohnny Chenif __name__ == '__main__':
91728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen    import atexit
92728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen    lldb.SBDebugger.Initialize()
93728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen    atexit.register(lambda: lldb.SBDebugger.Terminate())
94728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen    unittest2.main()
95