comparison mx/mx_graal.py @ 15399:40d0022115ee

Merge.
author Roland Schatz <roland.schatz@oracle.com>
date Mon, 28 Apr 2014 11:18:15 +0200
parents 3b56c9bbf60c
children 27fa615f5a1c
comparison
equal deleted inserted replaced
15398:3dde8d8c95b8 15399:40d0022115ee
26 # 26 #
27 # ---------------------------------------------------------------------------------------------------- 27 # ----------------------------------------------------------------------------------------------------
28 28
29 import os, sys, shutil, zipfile, tempfile, re, time, datetime, platform, subprocess, multiprocessing, StringIO 29 import os, sys, shutil, zipfile, tempfile, re, time, datetime, platform, subprocess, multiprocessing, StringIO
30 from os.path import join, exists, dirname, basename, getmtime 30 from os.path import join, exists, dirname, basename, getmtime
31 from argparse import ArgumentParser, REMAINDER 31 from argparse import ArgumentParser, RawDescriptionHelpFormatter, REMAINDER
32 from outputparser import OutputParser, ValuesMatcher 32 from outputparser import OutputParser, ValuesMatcher
33 import mx 33 import mx
34 import xml.dom.minidom 34 import xml.dom.minidom
35 import sanitycheck 35 import sanitycheck
36 import itertools 36 import itertools
37 import json, textwrap 37 import json, textwrap
38 import fnmatch
38 39
39 # This works because when mx loads this file, it makes sure __file__ gets an absolute path 40 # This works because when mx loads this file, it makes sure __file__ gets an absolute path
40 _graal_home = dirname(dirname(__file__)) 41 _graal_home = dirname(dirname(__file__))
41 42
42 """ Used to distinguish an exported GraalVM (see 'mx export'). """ 43 """ Used to distinguish an exported GraalVM (see 'mx export'). """
826 if defaultAllVMArgs: 827 if defaultAllVMArgs:
827 return args, [] 828 return args, []
828 else: 829 else:
829 return [], args 830 return [], args
830 831
831 def _run_tests(args, harness, annotations, testfile): 832 def _run_tests(args, harness, annotations, testfile, whitelist):
832 833
833 834
834 vmArgs, tests = _extract_VM_args(args) 835 vmArgs, tests = _extract_VM_args(args)
835 for t in tests: 836 for t in tests:
836 if t.startswith('-'): 837 if t.startswith('-'):
858 projs.add(p.name) 859 projs.add(p.name)
859 if not found: 860 if not found:
860 mx.log('warning: no tests matched by substring "' + t) 861 mx.log('warning: no tests matched by substring "' + t)
861 projectscp = mx.classpath(projs) 862 projectscp = mx.classpath(projs)
862 863
864 if whitelist:
865 classes = [c for c in classes if any((glob.match(c) for glob in whitelist))]
866
863 if len(classes) != 0: 867 if len(classes) != 0:
864 f_testfile = open(testfile, 'w') 868 f_testfile = open(testfile, 'w')
865 for c in classes: 869 for c in classes:
866 f_testfile.write(c + '\n') 870 f_testfile.write(c + '\n')
867 f_testfile.close() 871 f_testfile.close()
868 harness(projectscp, vmArgs) 872 harness(projectscp, vmArgs)
869 873
870 def _unittest(args, annotations, prefixcp=""): 874 def _unittest(args, annotations, prefixcp="", whitelist=None):
871 mxdir = dirname(__file__) 875 mxdir = dirname(__file__)
872 name = 'JUnitWrapper' 876 name = 'JUnitWrapper'
873 javaSource = join(mxdir, name + '.java') 877 javaSource = join(mxdir, name + '.java')
874 javaClass = join(mxdir, name + '.class') 878 javaClass = join(mxdir, name + '.class')
875 testfile = os.environ.get('MX_TESTFILE', None) 879 testfile = os.environ.get('MX_TESTFILE', None)
892 vm(prefixArgs + vmArgs + ['-cp', prefixcp + projectscp, 'org.junit.runner.JUnitCore'] + testclasses) 896 vm(prefixArgs + vmArgs + ['-cp', prefixcp + projectscp, 'org.junit.runner.JUnitCore'] + testclasses)
893 else: 897 else:
894 vm(prefixArgs + vmArgs + ['-cp', prefixcp + projectscp + os.pathsep + mxdir, name] + [testfile]) 898 vm(prefixArgs + vmArgs + ['-cp', prefixcp + projectscp + os.pathsep + mxdir, name] + [testfile])
895 899
896 try: 900 try:
897 _run_tests(args, harness, annotations, testfile) 901 _run_tests(args, harness, annotations, testfile, whitelist)
898 finally: 902 finally:
899 if os.environ.get('MX_TESTFILE') is None: 903 if os.environ.get('MX_TESTFILE') is None:
900 os.remove(testfile) 904 os.remove(testfile)
901 905
902 _unittestHelpSuffix = """ 906 _unittestHelpSuffix = """
907 Unittest options:
908
909 --whitelist run only testcases which are included
910 in the given whitelist
911
912 To avoid conflicts with VM options '--' can be used as delimiter.
903 913
904 If filters are supplied, only tests whose fully qualified name 914 If filters are supplied, only tests whose fully qualified name
905 includes a filter as a substring are run. 915 includes a filter as a substring are run.
906 916
907 For example, this command line: 917 For example, this command line:
926 """ 936 """
927 937
928 def unittest(args): 938 def unittest(args):
929 """run the JUnit tests (all testcases){0}""" 939 """run the JUnit tests (all testcases){0}"""
930 940
931 _unittest(args, ['@Test', '@LongTest', '@Parameters']) 941 parser = ArgumentParser(prog='mx unittest',
942 description='run the JUnit tests',
943 add_help=False,
944 formatter_class=RawDescriptionHelpFormatter,
945 epilog=_unittestHelpSuffix,
946 )
947 parser.add_argument('--whitelist', help='run testcases specified in whitelist only', metavar='<path>')
948
949 ut_args = []
950 delimiter = False
951 # check for delimiter
952 while len(args) > 0:
953 arg = args.pop(0)
954 if arg == '--':
955 delimiter = True
956 break
957 ut_args.append(arg)
958
959 if delimiter:
960 # all arguments before '--' must be recognized
961 parsed_args = parser.parse_args(ut_args)
962 else:
963 # parse all know arguments
964 parsed_args, args = parser.parse_known_args(ut_args)
965
966 whitelist = None
967 if parsed_args.whitelist:
968 try:
969 with open(join(_graal_home, parsed_args.whitelist)) as fp:
970 whitelist = [re.compile(fnmatch.translate(l.rstrip())) for l in fp.readlines() if not l.startswith('#')]
971 except IOError:
972 mx.log('warning: could not read whitelist: ' + parsed_args.whitelist)
973
974 _unittest(args, ['@Test', '@Parameters'], whitelist=whitelist)
932 975
933 def shortunittest(args): 976 def shortunittest(args):
934 """run the JUnit tests (short testcases only){0}""" 977 """alias for 'unittest --whitelist test/whitelist_shortunittest.txt'{0}"""
935 978
936 _unittest(args, ['@Test']) 979 args = ['--whitelist', 'test/whitelist_shortunittest.txt'] + args
937 980 unittest(args)
938 def longunittest(args):
939 """run the JUnit tests (long testcases only){0}"""
940
941 _unittest(args, ['@LongTest', '@Parameters'])
942 981
943 def buildvms(args): 982 def buildvms(args):
944 """build one or more VMs in various configurations""" 983 """build one or more VMs in various configurations"""
945 984
946 vmsDefault = ','.join(_vmChoices.keys()) 985 vmsDefault = ','.join(_vmChoices.keys())
1045 with VM('server', 'product'): # hosted mode 1084 with VM('server', 'product'): # hosted mode
1046 t = Task('UnitTests:hosted-product') 1085 t = Task('UnitTests:hosted-product')
1047 unittest([]) 1086 unittest([])
1048 tasks.append(t.stop()) 1087 tasks.append(t.stop())
1049 1088
1089 with VM('server', 'product'): # hosted mode
1090 t = Task('UnitTests-BaselineCompiler:hosted-product')
1091 unittest(['--whitelist', 'test/whitelist_baseline.txt', '-G:+UseBaselineCompiler'])
1092 tasks.append(t.stop())
1093
1050 for vmbuild in ['fastdebug', 'product']: 1094 for vmbuild in ['fastdebug', 'product']:
1051 for test in sanitycheck.getDacapos(level=sanitycheck.SanityCheckLevel.Gate, gateBuildLevel=vmbuild) + sanitycheck.getScalaDacapos(level=sanitycheck.SanityCheckLevel.Gate, gateBuildLevel=vmbuild): 1095 for test in sanitycheck.getDacapos(level=sanitycheck.SanityCheckLevel.Gate, gateBuildLevel=vmbuild) + sanitycheck.getScalaDacapos(level=sanitycheck.SanityCheckLevel.Gate, gateBuildLevel=vmbuild):
1052 t = Task(str(test) + ':' + vmbuild) 1096 t = Task(str(test) + ':' + vmbuild)
1053 if not test.test('graal'): 1097 if not test.test('graal'):
1054 t.abort(test.name + ' Failed') 1098 t.abort(test.name + ' Failed')
1246 if mx.get_os() == 'windows': 1290 if mx.get_os() == 'windows':
1247 executable = join(libpath, 'c1visualizer', 'bin', 'c1visualizer.exe') 1291 executable = join(libpath, 'c1visualizer', 'bin', 'c1visualizer.exe')
1248 else: 1292 else:
1249 executable = join(libpath, 'c1visualizer', 'bin', 'c1visualizer') 1293 executable = join(libpath, 'c1visualizer', 'bin', 'c1visualizer')
1250 1294
1251 archive = join(libpath, 'c1visualizer.zip') 1295 archive = join(libpath, 'c1visualizer_2014-04-22.zip')
1252 if not exists(executable): 1296 if not exists(executable) or not exists(archive):
1253 if not exists(archive): 1297 if not exists(archive):
1254 mx.download(archive, ['https://java.net/downloads/c1visualizer/c1visualizer.zip']) 1298 mx.download(archive, ['https://java.net/downloads/c1visualizer/c1visualizer_2014-04-22.zip'])
1255 zf = zipfile.ZipFile(archive, 'r') 1299 zf = zipfile.ZipFile(archive, 'r')
1256 zf.extractall(libpath) 1300 zf.extractall(libpath)
1257 1301
1258 if not exists(executable): 1302 if not exists(executable):
1259 mx.abort('C1Visualizer binary does not exist: ' + executable) 1303 mx.abort('C1Visualizer binary does not exist: ' + executable)
1343 mx.log(json.dumps(results)) 1387 mx.log(json.dumps(results))
1344 if resultFile: 1388 if resultFile:
1345 with open(resultFile, 'w') as f: 1389 with open(resultFile, 'w') as f:
1346 f.write(json.dumps(results)) 1390 f.write(json.dumps(results))
1347 1391
1392 def _get_jmh_path():
1393 path = mx.get_env('JMH_BENCHMARKS', None)
1394 if not path:
1395 probe = join(dirname(_graal_home), 'java-benchmarks')
1396 if exists(probe):
1397 path = probe
1398
1399 if not path:
1400 mx.abort("Please set the JMH_BENCHMARKS environment variable to point to the java-benchmarks workspace")
1401 if not exists(path):
1402 mx.abort("The directory denoted by the JMH_BENCHMARKS environment variable does not exist: " + path)
1403 return path
1404
1405 def makejmhdeps(args):
1406 """creates and installs Maven dependencies required by the JMH benchmarks
1407
1408 The dependencies are specified by files named pom.mxdeps in the
1409 JMH directory tree. Each such file contains a list of dependencies
1410 defined in JSON format. For example:
1411
1412 '[{"artifactId" : "compiler.test", "groupId" : "com.oracle.graal", "deps" : ["com.oracle.graal.compiler.test"]}]'
1413
1414 will result in a dependency being installed in the local Maven repository
1415 that can be referenced in a pom.xml file as follows:
1416
1417 <dependency>
1418 <groupId>com.oracle.graal</groupId>
1419 <artifactId>compiler.test</artifactId>
1420 <version>1.0-SNAPSHOT</version>
1421 </dependency>"""
1422
1423 parser = ArgumentParser(prog='mx makejmhdeps')
1424 parser.add_argument('-s', '--settings', help='alternative path for Maven user settings file', metavar='<path>')
1425 parser.add_argument('-p', '--permissive', action='store_true', help='issue note instead of error if a Maven dependency cannot be built due to missing projects/libraries')
1426 args = parser.parse_args(args)
1427
1428 def makejmhdep(artifactId, groupId, deps):
1429 graalSuite = mx.suite("graal")
1430 path = artifactId + '.jar'
1431 if args.permissive:
1432 for name in deps:
1433 if not mx.project(name, fatalIfMissing=False):
1434 if not mx.library(name, fatalIfMissing=False):
1435 mx.log('Skipping ' + groupId + '.' + artifactId + '.jar as ' + name + ' cannot be resolved')
1436 return
1437 d = mx.Distribution(graalSuite, name=artifactId, path=path, sourcesPath=path, deps=deps, excludedLibs=[])
1438 d.make_archive()
1439 cmd = ['mvn', 'install:install-file', '-DgroupId=' + groupId, '-DartifactId=' + artifactId,
1440 '-Dversion=1.0-SNAPSHOT', '-Dpackaging=jar', '-Dfile=' + d.path]
1441 if not mx._opts.verbose:
1442 cmd.append('-q')
1443 if args.settings:
1444 cmd = cmd + ['-s', args.settings]
1445 mx.run(cmd)
1446 os.unlink(d.path)
1447
1448 jmhPath = _get_jmh_path()
1449 for root, _, filenames in os.walk(jmhPath):
1450 for f in [join(root, n) for n in filenames if n == 'pom.mxdeps']:
1451 mx.logv('[processing ' + f + ']')
1452 try:
1453 with open(f) as fp:
1454 for d in json.load(fp):
1455 artifactId = d['artifactId']
1456 groupId = d['groupId']
1457 deps = d['deps']
1458 makejmhdep(artifactId, groupId, deps)
1459 except ValueError as e:
1460 mx.abort('Error parsing {}:\n{}'.format(f, e))
1461
1462 def buildjmh(args):
1463 """build the JMH benchmarks"""
1464
1465 parser = ArgumentParser(prog='mx buildjmh')
1466 parser.add_argument('-s', '--settings', help='alternative path for Maven user settings file', metavar='<path>')
1467 parser.add_argument('-c', action='store_true', dest='clean', help='clean before building')
1468 args = parser.parse_args(args)
1469
1470 jmhPath = _get_jmh_path()
1471 mx.log('JMH benchmarks: ' + jmhPath)
1472
1473 # Ensure the mx injected dependencies are up to date
1474 makejmhdeps(['-p'] + (['-s', args.settings] if args.settings else []))
1475
1476 timestamp = mx.TimeStampFile(join(_graal_home, 'mx', 'jmh', jmhPath.replace(os.sep, '_') + '.timestamp'))
1477 mustBuild = args.clean
1478 if not mustBuild:
1479 try:
1480 hgfiles = [join(jmhPath, f) for f in subprocess.check_output(['hg', '-R', jmhPath, 'locate']).split('\n')]
1481 mustBuild = timestamp.isOlderThan(hgfiles)
1482 except:
1483 # not a Mercurial repository or hg commands are not available.
1484 mustBuild = True
1485
1486 if mustBuild:
1487 buildOutput = []
1488 def _redirect(x):
1489 if mx._opts.verbose:
1490 mx.log(x[:-1])
1491 else:
1492 buildOutput.append(x)
1493 env = os.environ.copy()
1494 env['JAVA_HOME'] = _jdk(vmToCheck='server')
1495 env['MAVEN_OPTS'] = '-server'
1496 mx.log("Building benchmarks...")
1497 cmd = ['mvn']
1498 if args.settings:
1499 cmd = cmd + ['-s', args.settings]
1500 if args.clean:
1501 cmd.append('clean')
1502 cmd.append('package')
1503 retcode = mx.run(cmd, cwd=jmhPath, out=_redirect, env=env, nonZeroIsFatal=False)
1504 if retcode != 0:
1505 mx.log(''.join(buildOutput))
1506 mx.abort(retcode)
1507 timestamp.touch()
1508 else:
1509 mx.logv('[all Mercurial controlled files in ' + jmhPath + ' are older than ' + timestamp.path + ' - skipping build]')
1510
1348 def jmh(args): 1511 def jmh(args):
1349 """run the JMH_BENCHMARKS""" 1512 """run the JMH benchmarks
1350 1513
1351 # TODO: add option for `mvn clean package' 1514 This command respects the standard --vm and --vmbuild options
1515 for choosing which VM to run the benchmarks with."""
1516 if '-h' in args:
1517 mx.help_(['jmh'])
1518 mx.abort(1)
1352 1519
1353 vmArgs, benchmarksAndJsons = _extract_VM_args(args) 1520 vmArgs, benchmarksAndJsons = _extract_VM_args(args)
1354 1521
1355 benchmarks = [b for b in benchmarksAndJsons if not b.startswith('{')] 1522 benchmarks = [b for b in benchmarksAndJsons if not b.startswith('{')]
1356 jmhArgJsons = [b for b in benchmarksAndJsons if b.startswith('{')] 1523 jmhArgJsons = [b for b in benchmarksAndJsons if b.startswith('{')]
1357 1524
1358 jmhArgs = {'-v' : 'EXTRA' if mx._opts.verbose else 'NORMAL'} 1525 jmhArgs = {'-rff' : join(_graal_home, 'mx', 'jmh', 'jmh.out'), '-v' : 'EXTRA' if mx._opts.verbose else 'NORMAL'}
1359 1526
1360 # e.g. '{"-wi" : 20}' 1527 # e.g. '{"-wi" : 20}'
1361 for j in jmhArgJsons: 1528 for j in jmhArgJsons:
1362 try: 1529 try:
1363 for n, v in json.loads(j).iteritems(): 1530 for n, v in json.loads(j).iteritems():
1364 if v is None: 1531 if v is None:
1365 del jmhArgs[n] 1532 del jmhArgs[n]
1366 else: 1533 else:
1367 jmhArgs[n] = v 1534 jmhArgs[n] = v
1368 except ValueError as e: 1535 except ValueError as e:
1369 mx.abort('error parsing JSON input: {}"\n{}'.format(j, e)) 1536 mx.abort('error parsing JSON input: {}\n{}'.format(j, e))
1370 1537
1371 jmhPath = mx.get_env('JMH_BENCHMARKS', None) 1538 jmhPath = _get_jmh_path()
1372 if not jmhPath or not exists(jmhPath): 1539 mx.log('Using benchmarks in ' + jmhPath)
1373 mx.abort("$JMH_BENCHMARKS not properly defined: " + str(jmhPath))
1374
1375 def _blackhole(x):
1376 mx.logv(x[:-1])
1377
1378
1379 env = os.environ.copy()
1380 env['JAVA_HOME'] = _jdk(vmToCheck='graal')
1381 env['MAVEN_OPTS'] = '-graal'
1382 mx.log("Building benchmarks...")
1383 mx.run(['mvn', 'package'], cwd=jmhPath, out=_blackhole, env=env)
1384 1540
1385 matchedSuites = set() 1541 matchedSuites = set()
1386 numBench = [0] 1542 numBench = [0]
1387 for micros in os.listdir(jmhPath): 1543 for micros in os.listdir(jmhPath):
1388 absoluteMicro = os.path.join(jmhPath, micros) 1544 absoluteMicro = os.path.join(jmhPath, micros)
1392 mx.logv('JMH: ignored ' + absoluteMicro + " because it doesn't start with 'micros-'") 1548 mx.logv('JMH: ignored ' + absoluteMicro + " because it doesn't start with 'micros-'")
1393 continue 1549 continue
1394 1550
1395 microJar = os.path.join(absoluteMicro, "target", "microbenchmarks.jar") 1551 microJar = os.path.join(absoluteMicro, "target", "microbenchmarks.jar")
1396 if not exists(microJar): 1552 if not exists(microJar):
1397 mx.logv('JMH: ignored ' + absoluteMicro + " because it doesn't contain the expected jar file ('" + microJar + "')") 1553 mx.abort('Missing ' + microJar + ' - please run "mx buildjmh"')
1398 continue
1399 if benchmarks: 1554 if benchmarks:
1400 def _addBenchmark(x): 1555 def _addBenchmark(x):
1401 if x.startswith("Benchmark:"): 1556 if x.startswith("Benchmark:"):
1402 return 1557 return
1403 match = False 1558 match = False
1432 for k, v in jmhArgs.iteritems(): 1587 for k, v in jmhArgs.iteritems():
1433 javaArgs.append(k) 1588 javaArgs.append(k)
1434 if len(str(v)): 1589 if len(str(v)):
1435 javaArgs.append(str(v)) 1590 javaArgs.append(str(v))
1436 mx.run_java(javaArgs + regex, addDefaultArgs=False, cwd=jmhPath) 1591 mx.run_java(javaArgs + regex, addDefaultArgs=False, cwd=jmhPath)
1437
1438 1592
1439 def specjvm2008(args): 1593 def specjvm2008(args):
1440 """run one or more SPECjvm2008 benchmarks""" 1594 """run one or more SPECjvm2008 benchmarks"""
1441 1595
1442 def launcher(bm, harnessArgs, extraVmOpts): 1596 def launcher(bm, harnessArgs, extraVmOpts):
1554 1708
1555 def trufflejar(args=None): 1709 def trufflejar(args=None):
1556 """make truffle.jar""" 1710 """make truffle.jar"""
1557 1711
1558 # Test with the built classes 1712 # Test with the built classes
1559 _unittest(["com.oracle.truffle.api.test", "com.oracle.truffle.api.dsl.test"], ['@Test', '@LongTest', '@Parameters']) 1713 _unittest(["com.oracle.truffle.api.test", "com.oracle.truffle.api.dsl.test"], ['@Test', '@Parameters'])
1560 1714
1561 # We use the DSL processor as the starting point for the classpath - this 1715 # We use the DSL processor as the starting point for the classpath - this
1562 # therefore includes the DSL processor, the DSL and the API. 1716 # therefore includes the DSL processor, the DSL and the API.
1563 packagejar(mx.classpath("com.oracle.truffle.dsl.processor").split(os.pathsep), "truffle.jar", None, "com.oracle.truffle.dsl.processor.TruffleProcessor") 1717 packagejar(mx.classpath("com.oracle.truffle.dsl.processor").split(os.pathsep), "truffle.jar", None, "com.oracle.truffle.dsl.processor.TruffleProcessor")
1564 1718
1565 # Test with the JAR 1719 # Test with the JAR
1566 _unittest(["com.oracle.truffle.api.test", "com.oracle.truffle.api.dsl.test"], ['@Test', '@LongTest', '@Parameters'], "truffle.jar:") 1720 _unittest(["com.oracle.truffle.api.test", "com.oracle.truffle.api.dsl.test"], ['@Test', '@Parameters'], "truffle.jar:")
1567 1721
1568 1722
1569 def isGraalEnabled(vm): 1723 def isGraalEnabled(vm):
1570 return vm != 'original' and not vm.endswith('nograal') 1724 return vm != 'original' and not vm.endswith('nograal')
1571 1725
1763 return len(failures) 1917 return len(failures)
1764 1918
1765 def mx_init(suite): 1919 def mx_init(suite):
1766 commands = { 1920 commands = {
1767 'build': [build, ''], 1921 'build': [build, ''],
1922 'buildjmh': [buildjmh, '[-options]'],
1768 'buildvars': [buildvars, ''], 1923 'buildvars': [buildvars, ''],
1769 'buildvms': [buildvms, '[-options]'], 1924 'buildvms': [buildvms, '[-options]'],
1770 'c1visualizer' : [c1visualizer, ''], 1925 'c1visualizer' : [c1visualizer, ''],
1771 'checkheaders': [checkheaders, ''], 1926 'checkheaders': [checkheaders, ''],
1772 'clean': [clean, ''], 1927 'clean': [clean, ''],
1782 'specjvm2008': [specjvm2008, '[VM options] benchmarks...|"all" [SPECjvm2008 options]'], 1937 'specjvm2008': [specjvm2008, '[VM options] benchmarks...|"all" [SPECjvm2008 options]'],
1783 'specjbb2013': [specjbb2013, '[VM options] [-- [SPECjbb2013 options]]'], 1938 'specjbb2013': [specjbb2013, '[VM options] [-- [SPECjbb2013 options]]'],
1784 'specjbb2005': [specjbb2005, '[VM options] [-- [SPECjbb2005 options]]'], 1939 'specjbb2005': [specjbb2005, '[VM options] [-- [SPECjbb2005 options]]'],
1785 'gate' : [gate, '[-options]'], 1940 'gate' : [gate, '[-options]'],
1786 'bench' : [bench, '[-resultfile file] [all(default)|dacapo|specjvm2008|bootstrap]'], 1941 'bench' : [bench, '[-resultfile file] [all(default)|dacapo|specjvm2008|bootstrap]'],
1787 'unittest' : [unittest, '[VM options] [filters...]', _unittestHelpSuffix], 1942 'unittest' : [unittest, '[unittest options] [--] [VM options] [filters...]', _unittestHelpSuffix],
1788 'longunittest' : [longunittest, '[VM options] [filters...]', _unittestHelpSuffix], 1943 'makejmhdeps' : [makejmhdeps, ''],
1789 'shortunittest' : [shortunittest, '[VM options] [filters...]', _unittestHelpSuffix], 1944 'shortunittest' : [shortunittest, '[unittest options] [--] [VM options] [filters...]', _unittestHelpSuffix],
1790 'jacocoreport' : [jacocoreport, '[output directory]'], 1945 'jacocoreport' : [jacocoreport, '[output directory]'],
1791 'site' : [site, '[-options]'], 1946 'site' : [site, '[-options]'],
1792 'vm': [vm, '[-options] class [args...]'], 1947 'vm': [vm, '[-options] class [args...]'],
1793 'vmg': [vmg, '[-options] class [args...]'], 1948 'vmg': [vmg, '[-options] class [args...]'],
1794 'vmfg': [vmfg, '[-options] class [args...]'], 1949 'vmfg': [vmfg, '[-options] class [args...]'],