1901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty"""Test evaluating expressions repeatedly comparing lldb against gdb."""
2901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty
3901305d0a11d86eec516bd085a39d7eafde46047Dirk Doughertyimport os, sys
4901305d0a11d86eec516bd085a39d7eafde46047Dirk Doughertyimport unittest2
5901305d0a11d86eec516bd085a39d7eafde46047Dirk Doughertyimport lldb
6901305d0a11d86eec516bd085a39d7eafde46047Dirk Doughertyimport pexpect
7901305d0a11d86eec516bd085a39d7eafde46047Dirk Doughertyfrom lldbbench import *
8901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty
9901305d0a11d86eec516bd085a39d7eafde46047Dirk Doughertyclass RepeatedExprsCase(BenchBase):
10901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty
11901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty    mydir = os.path.join("benchmarks", "expression")
12901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty
13901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty    def setUp(self):
14901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        BenchBase.setUp(self)
15901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        self.source = 'main.cpp'
16901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        self.line_to_break = line_number(self.source, '// Set breakpoint here.')
17901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        self.lldb_avg = None
18901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        self.gdb_avg = None
19901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        self.count = lldb.bmIterationCount
20901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        if self.count <= 0:
21901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty            self.count = 100
22901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty
23901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty    @benchmarks_test
24901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty    def test_compare_lldb_to_gdb(self):
25901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        """Test repeated expressions with lldb vs. gdb."""
26901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        self.buildDefault()
27901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        self.exe_name = 'a.out'
28901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty
29901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        print
30901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        self.run_lldb_repeated_exprs(self.exe_name, self.count)
31901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        print "lldb benchmark:", self.stopwatch
32901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        self.run_gdb_repeated_exprs(self.exe_name, self.count)
33901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        print "gdb benchmark:", self.stopwatch
34901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        print "lldb_avg/gdb_avg: %f" % (self.lldb_avg/self.gdb_avg)
35901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty
36901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty    def run_lldb_repeated_exprs(self, exe_name, count):
37901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        exe = os.path.join(os.getcwd(), exe_name)
38901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty
39901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        # Set self.child_prompt, which is "(lldb) ".
40901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        self.child_prompt = '(lldb) '
41901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        prompt = self.child_prompt
42901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty
43901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        # So that the child gets torn down after the test.
44901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        self.child = pexpect.spawn('%s %s %s' % (self.lldbExec, self.lldbOption, exe))
45901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        child = self.child
46901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty
47901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        # Turn on logging for what the child sends back.
48901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        if self.TraceOn():
49901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty            child.logfile_read = sys.stdout
50901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty
51901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        child.expect_exact(prompt)
52901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        child.sendline('breakpoint set -f %s -l %d' % (self.source, self.line_to_break))
53901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        child.expect_exact(prompt)
54901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        child.sendline('run')
55901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        child.expect_exact(prompt)
56901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        expr_cmd1 = 'expr ptr[j]->point.x'
570a056afb714f471a21aa7e06b17744de71c22378Dirk Dougherty        expr_cmd2 = 'expr ptr[j]->point.y'
58901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty
59901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        # Reset the stopwatch now.
60901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        self.stopwatch.reset()
61901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        for i in range(count):
62901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty            with self.stopwatch:
63901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty                child.sendline(expr_cmd1)
64901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty                child.expect_exact(prompt)
65901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty                child.sendline(expr_cmd2)
66901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty                child.expect_exact(prompt)
67901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty            child.sendline('process continue')
68901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty            child.expect_exact(prompt)
69901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty
700a056afb714f471a21aa7e06b17744de71c22378Dirk Dougherty        child.sendline('quit')
71901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        try:
72901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty            self.child.expect(pexpect.EOF)
73901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        except:
740a056afb714f471a21aa7e06b17744de71c22378Dirk Dougherty            pass
75901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty
76901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        self.lldb_avg = self.stopwatch.avg()
77901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        if self.TraceOn():
78901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty            print "lldb expression benchmark:", str(self.stopwatch)
79901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        self.child = None
80901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty
81901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty    def run_gdb_repeated_exprs(self, exe_name, count):
82901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        exe = os.path.join(os.getcwd(), exe_name)
83901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty
84901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        # Set self.child_prompt, which is "(gdb) ".
85901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        self.child_prompt = '(gdb) '
86901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        prompt = self.child_prompt
870a056afb714f471a21aa7e06b17744de71c22378Dirk Dougherty
88901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        # So that the child gets torn down after the test.
89901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        self.child = pexpect.spawn('gdb --nx %s' % exe)
90901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        child = self.child
91901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty
92901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        # Turn on logging for what the child sends back.
93901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        if self.TraceOn():
94901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty            child.logfile_read = sys.stdout
95901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty
96901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        child.expect_exact(prompt)
97901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        child.sendline('break %s:%d' % (self.source, self.line_to_break))
98901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        child.expect_exact(prompt)
99901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        child.sendline('run')
100901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        child.expect_exact(prompt)
101901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        expr_cmd1 = 'print ptr[j]->point.x'
1020a056afb714f471a21aa7e06b17744de71c22378Dirk Dougherty        expr_cmd2 = 'print ptr[j]->point.y'
103901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty
104901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        # Reset the stopwatch now.
105901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        self.stopwatch.reset()
106901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        for i in range(count):
107901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty            with self.stopwatch:
108901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty                child.sendline(expr_cmd1)
109901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty                child.expect_exact(prompt)
110901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty                child.sendline(expr_cmd2)
111901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty                child.expect_exact(prompt)
112901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty            child.sendline('continue')
113901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty            child.expect_exact(prompt)
114901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty
115901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        child.sendline('quit')
116901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        child.expect_exact('The program is running.  Exit anyway?')
117901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        child.sendline('y')
118901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        try:
119901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty            self.child.expect(pexpect.EOF)
120901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        except:
121901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty            pass
122901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty
123901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        self.gdb_avg = self.stopwatch.avg()
124901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        if self.TraceOn():
125901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty            print "gdb expression benchmark:", str(self.stopwatch)
126901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty        self.child = None
127901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty
128901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty
129b4c6c1b218dc0c044b40c5132ae890a3a6910f69Dirk Doughertyif __name__ == '__main__':
130901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty    import atexit
131901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty    lldb.SBDebugger.Initialize()
132901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty    atexit.register(lambda: lldb.SBDebugger.Terminate())
133901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty    unittest2.main()
134901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty