1*99451b44SJordan Rupprecht"""Test lldb's expression evaluations and collect statistics.""" 2*99451b44SJordan Rupprecht 3*99451b44SJordan Rupprechtfrom __future__ import print_function 4*99451b44SJordan Rupprecht 5*99451b44SJordan Rupprecht 6*99451b44SJordan Rupprechtimport sys 7*99451b44SJordan Rupprechtimport lldb 8*99451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 9*99451b44SJordan Rupprechtfrom lldbsuite.test.lldbbench import * 10*99451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 11*99451b44SJordan Rupprechtfrom lldbsuite.test import configuration 12*99451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 13*99451b44SJordan Rupprecht 14*99451b44SJordan Rupprecht 15*99451b44SJordan Rupprechtclass ExpressionEvaluationCase(BenchBase): 16*99451b44SJordan Rupprecht 17*99451b44SJordan Rupprecht def setUp(self): 18*99451b44SJordan Rupprecht BenchBase.setUp(self) 19*99451b44SJordan Rupprecht self.source = 'main.cpp' 20*99451b44SJordan Rupprecht self.line_to_break = line_number( 21*99451b44SJordan Rupprecht self.source, '// Set breakpoint here.') 22*99451b44SJordan Rupprecht self.count = 25 23*99451b44SJordan Rupprecht 24*99451b44SJordan Rupprecht @benchmarks_test 25*99451b44SJordan Rupprecht @expectedFailureAll( 26*99451b44SJordan Rupprecht oslist=["windows"], 27*99451b44SJordan Rupprecht bugnumber="llvm.org/pr22274: need a pexpect replacement for windows") 28*99451b44SJordan Rupprecht def test_expr_cmd(self): 29*99451b44SJordan Rupprecht """Test lldb's expression commands and collect statistics.""" 30*99451b44SJordan Rupprecht self.build() 31*99451b44SJordan Rupprecht self.exe_name = 'a.out' 32*99451b44SJordan Rupprecht 33*99451b44SJordan Rupprecht print() 34*99451b44SJordan Rupprecht self.run_lldb_repeated_exprs(self.exe_name, self.count) 35*99451b44SJordan Rupprecht print("lldb expr cmd benchmark:", self.stopwatch) 36*99451b44SJordan Rupprecht 37*99451b44SJordan Rupprecht def run_lldb_repeated_exprs(self, exe_name, count): 38*99451b44SJordan Rupprecht import pexpect 39*99451b44SJordan Rupprecht exe = self.getBuildArtifact(exe_name) 40*99451b44SJordan Rupprecht 41*99451b44SJordan Rupprecht # Set self.child_prompt, which is "(lldb) ". 42*99451b44SJordan Rupprecht self.child_prompt = '(lldb) ' 43*99451b44SJordan Rupprecht prompt = self.child_prompt 44*99451b44SJordan Rupprecht 45*99451b44SJordan Rupprecht # Reset the stopwatch now. 46*99451b44SJordan Rupprecht self.stopwatch.reset() 47*99451b44SJordan Rupprecht for i in range(count): 48*99451b44SJordan Rupprecht # So that the child gets torn down after the test. 49*99451b44SJordan Rupprecht self.child = pexpect.spawn( 50*99451b44SJordan Rupprecht '%s %s %s' % 51*99451b44SJordan Rupprecht (lldbtest_config.lldbExec, self.lldbOption, exe)) 52*99451b44SJordan Rupprecht child = self.child 53*99451b44SJordan Rupprecht 54*99451b44SJordan Rupprecht # Turn on logging for what the child sends back. 55*99451b44SJordan Rupprecht if self.TraceOn(): 56*99451b44SJordan Rupprecht child.logfile_read = sys.stdout 57*99451b44SJordan Rupprecht 58*99451b44SJordan Rupprecht child.expect_exact(prompt) 59*99451b44SJordan Rupprecht child.sendline( 60*99451b44SJordan Rupprecht 'breakpoint set -f %s -l %d' % 61*99451b44SJordan Rupprecht (self.source, self.line_to_break)) 62*99451b44SJordan Rupprecht child.expect_exact(prompt) 63*99451b44SJordan Rupprecht child.sendline('run') 64*99451b44SJordan Rupprecht child.expect_exact(prompt) 65*99451b44SJordan Rupprecht expr_cmd1 = 'expr ptr[j]->point.x' 66*99451b44SJordan Rupprecht expr_cmd2 = 'expr ptr[j]->point.y' 67*99451b44SJordan Rupprecht 68*99451b44SJordan Rupprecht with self.stopwatch: 69*99451b44SJordan Rupprecht child.sendline(expr_cmd1) 70*99451b44SJordan Rupprecht child.expect_exact(prompt) 71*99451b44SJordan Rupprecht child.sendline(expr_cmd2) 72*99451b44SJordan Rupprecht child.expect_exact(prompt) 73*99451b44SJordan Rupprecht 74*99451b44SJordan Rupprecht child.sendline('quit') 75*99451b44SJordan Rupprecht try: 76*99451b44SJordan Rupprecht self.child.expect(pexpect.EOF) 77*99451b44SJordan Rupprecht except: 78*99451b44SJordan Rupprecht pass 79*99451b44SJordan Rupprecht 80*99451b44SJordan Rupprecht self.child = None 81