From a5b1489dbe0ce8a1b92c1eb2b6a7bfd5862ff23c Mon Sep 17 00:00:00 2001 From: Daniel Berlin Date: Tue, 28 Feb 2017 02:19:11 +0000 Subject: [PATCH] This script was meant to be committed with the DebugCounter changes. llvm-svn: 296425 --- utils/bisect-skip-count | 75 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100755 utils/bisect-skip-count diff --git a/utils/bisect-skip-count b/utils/bisect-skip-count new file mode 100755 index 00000000000..ee7f0dc2609 --- /dev/null +++ b/utils/bisect-skip-count @@ -0,0 +1,75 @@ +#!/usr/bin/env python +# This script is used to bisect skip and count arguments for --debug-counter. +# It is similar to bisect, except it understands how to increase skip and decrease count +import os +import sys +import argparse +# This is for timeout support. Use the recommended way of import. +# We do timeouts because when doing, execution testing, we have a habit +# of finding variants that infinite loop +if os.name == 'posix' and sys.version_info[0] < 3: + import subprocess32 as subprocess +else: + import subprocess +parser = argparse.ArgumentParser() + +parser.add_argument('--skipstart', type=int, default=0) +parser.add_argument('--skipend', type=int, default=(1 << 32)) +parser.add_argument('--countstart', type=int, default=0) +parser.add_argument('--countend', type=int, default=(1 << 32)) +parser.add_argument('--timeout', type=int, default=None) +# Use shell support if you need to use complex shell expressions in your command +parser.add_argument('--shell', type=bool, default=False) +parser.add_argument('command', nargs='+') + +args = parser.parse_args() + +start = args.skipstart +end = args.skipend + +print("Bisect of Skip starting!") +print("Start: %d" % start) +print("End: %d" % end) + +last = None +while start != end and start != end-1: + count = start + (end - start)/2 + print("Visiting Skip: %d with (Start, End) = (%d,%d)" % (count, start, end)) + cmd = [x % {'skip':count, 'count':-1} for x in args.command] + print cmd + try: + result = subprocess.call(cmd, shell=args.shell, timeout=args.timeout) + if result == 0: + print(" PASSES! Setting end to count") + end = count + else: + print(" FAILS! Setting start to count") + start = count + except: + print(" TIMEOUT, setting end to count") + end = count +firstcount = start +print("Last good skip: %d" % start) +start = args.countstart +end = args.countend +print("Bisect of Count starting!") +print("Start: %d" % start) +print("End: %d" % end) +while start != end and start != end-1: + count = start + (end - start)/2 + print("Visiting Count: %d with (Start, End) = (%d,%d)" % (count, start, end)) + cmd = [x % {'count':count, 'skip':firstcount } for x in args.command] + print cmd + try: + result = subprocess.call(cmd, shell=True, timeout=20) + if result == 0: + print(" PASSES! Setting start to count") + start = count + else: + print(" FAILS! Setting end to count") + end = count + except: + print(" TIMEOUT, setting start to count") + start = count + +print("Last good count: %d" % start)