1ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen"""Test evaluating expressions repeatedly comparing lldb against gdb."""
2ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen
3ac56c171e65480eef97c89f92e74e42159526de4Johnny Chenimport os, sys
4ac56c171e65480eef97c89f92e74e42159526de4Johnny Chenimport unittest2
5ac56c171e65480eef97c89f92e74e42159526de4Johnny Chenimport lldb
6ac56c171e65480eef97c89f92e74e42159526de4Johnny Chenimport pexpect
7ac56c171e65480eef97c89f92e74e42159526de4Johnny Chenfrom lldbbench import *
8ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen
9ac56c171e65480eef97c89f92e74e42159526de4Johnny Chenclass RepeatedExprsCase(BenchBase):
10ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen
11ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen    mydir = os.path.join("benchmarks", "expression")
12ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen
13ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen    def setUp(self):
14ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        BenchBase.setUp(self)
15ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        self.source = 'main.cpp'
16ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        self.line_to_break = line_number(self.source, '// Set breakpoint here.')
17ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        self.lldb_avg = None
18ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        self.gdb_avg = None
19ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        self.count = lldb.bmIterationCount
20ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        if self.count <= 0:
21ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen            self.count = 100
22ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen
23ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen    @benchmarks_test
24ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen    def test_compare_lldb_to_gdb(self):
25ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        """Test repeated expressions with lldb vs. gdb."""
26ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        self.buildDefault()
27ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        self.exe_name = 'a.out'
28ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen
29ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        print
30ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        self.run_lldb_repeated_exprs(self.exe_name, self.count)
31ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        print "lldb benchmark:", self.stopwatch
32ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        self.run_gdb_repeated_exprs(self.exe_name, self.count)
33ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        print "gdb benchmark:", self.stopwatch
34ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        print "lldb_avg/gdb_avg: %f" % (self.lldb_avg/self.gdb_avg)
35ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen
36ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen    def run_lldb_repeated_exprs(self, exe_name, count):
37ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        exe = os.path.join(os.getcwd(), exe_name)
38ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen
39ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        # Set self.child_prompt, which is "(lldb) ".
40ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        self.child_prompt = '(lldb) '
41ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        prompt = self.child_prompt
42ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen
43ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        # So that the child gets torn down after the test.
44ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        self.child = pexpect.spawn('%s %s %s' % (self.lldbExec, self.lldbOption, exe))
45ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        child = self.child
46ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen
47ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        # Turn on logging for what the child sends back.
48ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        if self.TraceOn():
49ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen            child.logfile_read = sys.stdout
50ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen
51ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        child.expect_exact(prompt)
52ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        child.sendline('breakpoint set -f %s -l %d' % (self.source, self.line_to_break))
53ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        child.expect_exact(prompt)
54ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        child.sendline('run')
55ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        child.expect_exact(prompt)
56ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        expr_cmd1 = 'expr ptr[j]->point.x'
57ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        expr_cmd2 = 'expr ptr[j]->point.y'
58ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen
59ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        # Reset the stopwatch now.
60ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        self.stopwatch.reset()
61ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        for i in range(count):
62ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen            with self.stopwatch:
63ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen                child.sendline(expr_cmd1)
64ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen                child.expect_exact(prompt)
65ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen                child.sendline(expr_cmd2)
66ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen                child.expect_exact(prompt)
67ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen            child.sendline('process continue')
68ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen            child.expect_exact(prompt)
69ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen
70ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        child.sendline('quit')
71ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        try:
72ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen            self.child.expect(pexpect.EOF)
73ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        except:
74ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen            pass
75ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen
76ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        self.lldb_avg = self.stopwatch.avg()
77ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        if self.TraceOn():
78ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen            print "lldb expression benchmark:", str(self.stopwatch)
79ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        self.child = None
80ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen
81ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen    def run_gdb_repeated_exprs(self, exe_name, count):
82ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        exe = os.path.join(os.getcwd(), exe_name)
83ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen
84ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        # Set self.child_prompt, which is "(gdb) ".
85ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        self.child_prompt = '(gdb) '
86ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        prompt = self.child_prompt
87ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen
88ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        # So that the child gets torn down after the test.
89ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        self.child = pexpect.spawn('gdb --nx %s' % exe)
90ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        child = self.child
91ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen
92ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        # Turn on logging for what the child sends back.
93ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        if self.TraceOn():
94ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen            child.logfile_read = sys.stdout
95ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen
96ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        child.expect_exact(prompt)
97ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        child.sendline('break %s:%d' % (self.source, self.line_to_break))
98ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        child.expect_exact(prompt)
99ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        child.sendline('run')
100ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        child.expect_exact(prompt)
101ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        expr_cmd1 = 'print ptr[j]->point.x'
102ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        expr_cmd2 = 'print ptr[j]->point.y'
103ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen
104ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        # Reset the stopwatch now.
105ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        self.stopwatch.reset()
106ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        for i in range(count):
107ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen            with self.stopwatch:
108ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen                child.sendline(expr_cmd1)
109ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen                child.expect_exact(prompt)
110ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen                child.sendline(expr_cmd2)
111ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen                child.expect_exact(prompt)
112ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen            child.sendline('continue')
113ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen            child.expect_exact(prompt)
114ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen
115ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        child.sendline('quit')
116ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        child.expect_exact('The program is running.  Exit anyway?')
117ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        child.sendline('y')
118ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        try:
119ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen            self.child.expect(pexpect.EOF)
120ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        except:
121ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen            pass
122ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen
123ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        self.gdb_avg = self.stopwatch.avg()
124ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        if self.TraceOn():
125ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen            print "gdb expression benchmark:", str(self.stopwatch)
126ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen        self.child = None
127ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen
128ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen
129ac56c171e65480eef97c89f92e74e42159526de4Johnny Chenif __name__ == '__main__':
130ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen    import atexit
131ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen    lldb.SBDebugger.Initialize()
132ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen    atexit.register(lambda: lldb.SBDebugger.Terminate())
133ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen    unittest2.main()
134