diff options
-rw-r--r-- | lldb/test/benchmarks/turnaround/TestCompileRunToBreakpointTurnaround.py | 122 | ||||
-rwxr-xr-x | lldb/test/dotest.py | 10 |
2 files changed, 126 insertions, 6 deletions
diff --git a/lldb/test/benchmarks/turnaround/TestCompileRunToBreakpointTurnaround.py b/lldb/test/benchmarks/turnaround/TestCompileRunToBreakpointTurnaround.py new file mode 100644 index 00000000000..d923f132e9a --- /dev/null +++ b/lldb/test/benchmarks/turnaround/TestCompileRunToBreakpointTurnaround.py @@ -0,0 +1,122 @@ +"""Benchmark the turnaround time starting a debugger and run to the breakpont with lldb vs. gdb.""" + +import os, sys +import unittest2 +import lldb +import pexpect +from lldbbench import * + +class CompileRunToBreakpointBench(BenchBase): + + mydir = os.path.join("benchmarks", "turnaround") + + def setUp(self): + BenchBase.setUp(self) + self.exe = self.lldbHere + self.function = 'Driver::MainLoop()' + + self.count = lldb.bmIterationCount + if self.count <= 0: + self.count = 3 + + self.lldb_avg = None + self.gdb_avg = None + + @benchmarks_test + def test_run_lldb_then_gdb(self): + """Benchmark turnaround time with lldb vs. gdb.""" + print + self.run_lldb_turnaround(self.exe, self.function, self.count) + print "lldb turnaround benchmark:", self.stopwatch + self.run_gdb_turnaround(self.exe, self.function, self.count) + print "gdb turnaround benchmark:", self.stopwatch + print "lldb_avg/gdb_avg: %f" % (self.lldb_avg/self.gdb_avg) + + def run_lldb_turnaround(self, exe, function, count): + def run_one_round(): + prompt = self.child_prompt + + # So that the child gets torn down after the test. + self.child = pexpect.spawn('%s %s %s' % (self.lldbExec, self.lldbOption, exe)) + child = self.child + + # Turn on logging for what the child sends back. + if self.TraceOn(): + child.logfile_read = sys.stdout + + child.expect_exact(prompt) + child.sendline('breakpoint set -F %s' % function) + child.expect_exact(prompt) + child.sendline('run') + child.expect_exact(prompt) + + # Set self.child_prompt, which is "(lldb) ". + self.child_prompt = '(lldb) ' + # Reset the stopwatch now. + self.stopwatch.reset() + + for i in range(count + 1): + # Ignore the first invoke lldb and run to the breakpoint turnaround time. + if i == 0: + run_one_round() + else: + with self.stopwatch: + run_one_round() + + self.child.sendline('quit') + try: + self.child.expect(pexpect.EOF) + except: + pass + + self.lldb_avg = self.stopwatch.avg() + self.child = None + + def run_gdb_turnaround(self, exe, function, count): + def run_one_round(): + prompt = self.child_prompt + + # So that the child gets torn down after the test. + self.child = pexpect.spawn('gdb --nx %s' % exe) + child = self.child + + # Turn on logging for what the child sends back. + if self.TraceOn(): + child.logfile_read = sys.stdout + + child.expect_exact(prompt) + child.sendline('break %s' % function) + child.expect_exact(prompt) + child.sendline('run') + child.expect_exact(prompt) + + # Set self.child_prompt, which is "(gdb) ". + self.child_prompt = '(gdb) ' + # Reset the stopwatch now. + self.stopwatch.reset() + + for i in range(count+1): + # Ignore the first invoke lldb and run to the breakpoint turnaround time. + if i == 0: + run_one_round() + else: + with self.stopwatch: + run_one_round() + + self.child.sendline('quit') + self.child.expect_exact('The program is running. Exit anyway?') + self.child.sendline('y') + try: + self.child.expect(pexpect.EOF) + except: + pass + + self.gdb_avg = self.stopwatch.avg() + self.child = None + + +if __name__ == '__main__': + import atexit + lldb.SBDebugger.Initialize() + atexit.register(lambda: lldb.SBDebugger.Terminate()) + unittest2.main() diff --git a/lldb/test/dotest.py b/lldb/test/dotest.py index f33aa6f00b9..8c6856da450 100755 --- a/lldb/test/dotest.py +++ b/lldb/test/dotest.py @@ -666,18 +666,16 @@ def setupSysPath(): if lldbHere: os.environ["LLDB_HERE"] = lldbHere - if not lldbExec: - lldbExec = lldbHere - os.environ["LLDB_BUILD_DIR"] = os.path.split(lldbExec)[0] + os.environ["LLDB_BUILD_DIR"] = os.path.split(lldbHere)[0] if not noHeaders: print "LLDB build dir:", os.environ["LLDB_BUILD_DIR"] # One last chance to locate the 'lldb' executable. if not lldbExec: - if lldbHere: + lldbExec = which('lldb') + if lldbHere and not lldbExec: lldbExec = lldbHere - else: - lldbExec = which('lldb') + if not lldbExec: print "The 'lldb' executable cannot be located. Some of the tests may not be run as a result." |