def get_graal_jdk(): """ Gets a Graal JDK which adds support for handling the -G format of Graal options. """ jvmci_jdk = get_jvmci_jdk() if JVMCI_VERSION < 9: from mx_jvmci import check_VM_exists, JVMCI8JDKConfig # pylint: disable=no-name-in-module vmbuild = jvmci_jdk.vmbuild check_VM_exists(get_vm(), jvmci_jdk.home, vmbuild) jdk = _graal_jdks.get(vmbuild) if jdk is None: class GraalJDK8Config(JVMCI8JDKConfig): def __init__(self, vmbuild): # pylint: disable=super-init-not-called JVMCI8JDKConfig.__init__(self, vmbuild) def parseVmArgs(self, args, addDefaultArgs=True): return JVMCI8JDKConfig.parseVmArgs(self, _buildGOptionsArgs(args), addDefaultArgs=addDefaultArgs) jdk = GraalJDK8Config(vmbuild) _graal_jdks[vmbuild] = jdk else: jdk = _graal_jdks.get('default') if jdk is None: from mx_jvmci import JVMCI9JDKConfig # pylint: disable=no-name-in-module class GraalJDK9Config(JVMCI9JDKConfig): def __init__(self, debugLevel): JVMCI9JDKConfig.__init__(self, debugLevel) def parseVmArgs(self, args, addDefaultArgs=True): return JVMCI9JDKConfig.parseVmArgs(self, _buildGOptionsArgs(args), addDefaultArgs=addDefaultArgs) jdk = GraalJDK9Config(jvmci_jdk.debugLevel) _graal_jdks['default'] = jdk return jdk
def microbench(args): """run JMH microbenchmark projects""" parser = ArgumentParser( prog='mx microbench', description=microbench.__doc__, usage="%(prog)s [command options|VM options] [-- [JMH options]]") parser.add_argument('--jar', help='Explicitly specify micro-benchmark location') known_args, args = parser.parse_known_args(args) vmArgs, jmhArgs = mx.extract_VM_args(args, useDoubleDash=True) if JVMCI_VERSION < 9: if isJVMCIEnabled( get_vm()) and '-XX:-UseJVMCIClassLoader' not in vmArgs: vmArgs = ['-XX:-UseJVMCIClassLoader'] + vmArgs # look for -f in JMH arguments forking = True for i in range(len(jmhArgs)): arg = jmhArgs[i] if arg.startswith('-f'): if arg == '-f' and (i + 1) < len(jmhArgs): arg += jmhArgs[i + 1] try: if int(arg[2:]) == 0: forking = False except ValueError: pass if known_args.jar: # use the specified jar args = ['-jar', known_args.jar] if not forking: args += vmArgs else: # find all projects with a direct JMH dependency jmhProjects = [] for p in mx.projects_opt_limit_to_suites(): if 'JMH' in [x.name for x in p.deps]: jmhProjects.append(p.name) cp = mx.classpath(jmhProjects) # execute JMH runner args = ['-cp', cp] if not forking: args += vmArgs args += ['org.openjdk.jmh.Main'] if forking: jdk = get_jvmci_jdk() jvm = get_vm() def quoteSpace(s): if " " in s: return '"' + s + '"' return s forkedVmArgs = map(quoteSpace, jdk.parseVmArgs(vmArgs)) args += ['--jvmArgsPrepend', ' '.join(['-' + jvm] + forkedVmArgs)] run_vm(args + jmhArgs)
def microbench(args): """run JMH microbenchmark projects""" parser = ArgumentParser( prog="mx microbench", description=microbench.__doc__, usage="%(prog)s [command options|VM options] [-- [JMH options]]", ) parser.add_argument("--jar", help="Explicitly specify micro-benchmark location") known_args, args = parser.parse_known_args(args) vmArgs, jmhArgs = mx.extract_VM_args(args, useDoubleDash=True) if JVMCI_VERSION < 9: if isJVMCIEnabled(get_vm()) and "-XX:-UseJVMCIClassLoader" not in vmArgs: vmArgs = ["-XX:-UseJVMCIClassLoader"] + vmArgs # look for -f in JMH arguments forking = True for i in range(len(jmhArgs)): arg = jmhArgs[i] if arg.startswith("-f"): if arg == "-f" and (i + 1) < len(jmhArgs): arg += jmhArgs[i + 1] try: if int(arg[2:]) == 0: forking = False except ValueError: pass if known_args.jar: # use the specified jar args = ["-jar", known_args.jar] if not forking: args += vmArgs else: # find all projects with a direct JMH dependency jmhProjects = [] for p in mx.projects_opt_limit_to_suites(): if "JMH" in [x.name for x in p.deps]: jmhProjects.append(p.name) cp = mx.classpath(jmhProjects) # execute JMH runner args = ["-cp", cp] if not forking: args += vmArgs args += ["org.openjdk.jmh.Main"] if forking: jdk = get_jvmci_jdk() jvm = get_vm() def quoteSpace(s): if " " in s: return '"' + s + '"' return s forkedVmArgs = map(quoteSpace, jdk.parseVmArgs(vmArgs)) args += ["--jvmArgsPrepend", " ".join(["-" + jvm] + forkedVmArgs)] run_vm(args + jmhArgs)
def ctw(args, extraVMarguments=None): """run CompileTheWorld""" defaultCtwopts = '-Inline' parser = ArgumentParser(prog='mx ctw') parser.add_argument('--ctwopts', action='store', help='space separated JVMCI options used for CTW compilations (default: --ctwopts="' + defaultCtwopts + '")', default=defaultCtwopts, metavar='<options>') parser.add_argument('--cp', '--jar', action='store', help='jar or class path denoting classes to compile', metavar='<path>') args, vmargs = parser.parse_known_args(args) if args.ctwopts: # Replace spaces with '#' since -G: options cannot contain spaces vmargs.append('-G:CompileTheWorldConfig=' + re.sub(r'\s+', '#', args.ctwopts)) if args.cp: cp = os.path.abspath(args.cp) else: if JVMCI_VERSION < 9: cp = join(get_jvmci_jdk().home, 'jre', 'lib', 'rt.jar') else: cp = join(get_jvmci_jdk().home, 'modules', 'java.base') + os.pathsep + \ join(get_jvmci_jdk().home, 'lib', 'modules', 'bootmodules.jimage') vmargs.append('-G:CompileTheWorldExcludeMethodFilter=sun.awt.X11.*.*') # suppress menubar and dock when running on Mac; exclude x11 classes as they may cause vm crashes (on Solaris) vmargs = ['-Djava.awt.headless=true'] + vmargs vm = get_vm() if JVMCI_VERSION >= 9: jvmciMode = _jvmci_get_vm().jvmciMode if jvmciMode == 'disabled': vmargs += ['-XX:+CompileTheWorld', '-Xbootclasspath/p:' + cp] else: if jvmciMode == 'jit': vmargs += ['-XX:+BootstrapJVMCI'] vmargs += ['-G:CompileTheWorldClasspath=' + cp, 'com.oracle.graal.hotspot.CompileTheWorld'] else: if isJVMCIEnabled(vm): if vm == 'jvmci': vmargs += ['-XX:+BootstrapJVMCI'] vmargs += ['-G:CompileTheWorldClasspath=' + cp, '-XX:-UseJVMCIClassLoader', 'com.oracle.graal.hotspot.CompileTheWorld'] else: vmargs += ['-XX:+CompileTheWorld', '-Xbootclasspath/p:' + cp] run_vm(vmargs + _noneAsEmptyList(extraVMarguments))
def jdkartifactstats(args): """show stats about JDK deployed Graal artifacts""" artifacts = {} jdkDir = get_jvmci_jdk().home def _getDeployedJars(): if JVMCI_VERSION < 9: for root, _, filenames in os.walk(join(jdkDir, 'jre', 'lib')): for f in filenames: if f.endswith('.jar') and not f.endswith('.stripped.jar'): yield join(root, f) else: for jdkDist in jdkDeployedDists: dist = jdkDist.dist() if isinstance(jdkDist, JvmciJDKDeployedDist): yield dist.path for jar in _getDeployedJars(): f = basename(jar) if 'truffle' in f: if 'enterprise' in f: artifacts.setdefault('GraalEnterpriseTruffle', []).append(jar) else: artifacts.setdefault('GraalTruffle', []).append(jar) elif 'enterprise' in f: artifacts.setdefault('GraalEnterprise', []).append(jar) elif 'jvmci' in f: artifacts.setdefault('JVMCI', []).append(jar) elif 'graal' in f: artifacts.setdefault('Graal', []).append(jar) else: mx.logv('ignored: ' + jar) print '{:>10} {:>10} {:>10} {}'.format('All', 'NoVars', 'None', 'Jar') for category in sorted(artifacts.viewkeys()): jars = artifacts[category] if jars: totals = (0, 0, 0) print for j in jars: gSize = os.path.getsize(j) stripped = j[:-len('.jar')] + '.stripped.jar' mx.run([mx.get_jdk().pack200, '--repack', '--quiet', '-J-Djava.util.logging.config.file=', '-DLocalVariableTypeTable=strip', '-DLocalVariableTable=strip', stripped, j]) gLinesSourceSize = os.path.getsize(stripped) mx.run([mx.get_jdk().pack200, '--repack', '--quiet', '-J-Djava.util.logging.config.file=', '-G', stripped, j]) gNoneSize = os.path.getsize(stripped) os.remove(stripped) print '{:10,} {:10,} {:10,} {}:{}'.format(gSize, gLinesSourceSize, gNoneSize, category, basename(j)) t1, t2, t3 = totals totals = (t1 + gSize, t2 + gLinesSourceSize, t3 + gNoneSize) t1, t2, t3 = totals print '{:10,} {:10,} {:10,} {}'.format(t1, t2, t3, category) jvmLib = join(jdkDir, relativeVmLibDirInJdk(), get_vm(), mx.add_lib_suffix(mx.add_lib_prefix('jvm'))) print if exists(jvmLib): print '{:10,} {}'.format(os.path.getsize(jvmLib), jvmLib) else: print '{:>10} {}'.format('<missing>', jvmLib)
def parseForkedVmArgs(self, vmArgs): jdk = get_jvmci_jdk() jvm = get_vm() return ['-' + jvm] + jdk.parseVmArgs(vmArgs)
def jdkartifactstats(args): """show stats about JDK deployed Graal artifacts""" artifacts = {} jdkDir = get_jvmci_jdk().home def _getDeployedJars(): if JVMCI_VERSION < 9: for root, _, filenames in os.walk(join(jdkDir, "jre", "lib")): for f in filenames: if f.endswith(".jar") and not f.endswith(".stripped.jar"): yield join(root, f) else: for jdkDist in jdkDeployedDists: dist = jdkDist.dist() if isinstance(jdkDist, JvmciJDKDeployedDist): yield dist.path for jar in _getDeployedJars(): f = basename(jar) if "truffle" in f: if "enterprise" in f: artifacts.setdefault("GraalEnterpriseTruffle", []).append(jar) else: artifacts.setdefault("GraalTruffle", []).append(jar) elif "enterprise" in f: artifacts.setdefault("GraalEnterprise", []).append(jar) elif "jvmci" in f: artifacts.setdefault("JVMCI", []).append(jar) elif "graal" in f: artifacts.setdefault("Graal", []).append(jar) else: mx.logv("ignored: " + jar) print "{:>10} {:>10} {:>10} {}".format("All", "NoVars", "None", "Jar") for category in sorted(artifacts.viewkeys()): jars = artifacts[category] if jars: totals = (0, 0, 0) print for j in jars: gSize = os.path.getsize(j) stripped = j[: -len(".jar")] + ".stripped.jar" mx.run( [ mx.get_jdk().pack200, "--repack", "--quiet", "-J-Djava.util.logging.config.file=", "-DLocalVariableTypeTable=strip", "-DLocalVariableTable=strip", stripped, j, ] ) gLinesSourceSize = os.path.getsize(stripped) mx.run( [ mx.get_jdk().pack200, "--repack", "--quiet", "-J-Djava.util.logging.config.file=", "-G", stripped, j, ] ) gNoneSize = os.path.getsize(stripped) os.remove(stripped) print "{:10,} {:10,} {:10,} {}:{}".format(gSize, gLinesSourceSize, gNoneSize, category, basename(j)) t1, t2, t3 = totals totals = (t1 + gSize, t2 + gLinesSourceSize, t3 + gNoneSize) t1, t2, t3 = totals print "{:10,} {:10,} {:10,} {}".format(t1, t2, t3, category) jvmLib = join(jdkDir, relativeVmLibDirInJdk(), get_vm(), mx.add_lib_suffix(mx.add_lib_prefix("jvm"))) print if exists(jvmLib): print "{:10,} {}".format(os.path.getsize(jvmLib), jvmLib) else: print "{:>10} {}".format("<missing>", jvmLib)
def ctw(args, extraVMarguments=None): """run CompileTheWorld""" defaultCtwopts = "-Inline" parser = ArgumentParser(prog="mx ctw") parser.add_argument( "--ctwopts", action="store", help='space separated JVMCI options used for CTW compilations (default: --ctwopts="' + defaultCtwopts + '")', default=defaultCtwopts, metavar="<options>", ) parser.add_argument( "--cp", "--jar", action="store", help="jar or class path denoting classes to compile", metavar="<path>" ) args, vmargs = parser.parse_known_args(args) if args.ctwopts: # Replace spaces with '#' since -G: options cannot contain spaces vmargs.append("-G:CompileTheWorldConfig=" + re.sub(r"\s+", "#", args.ctwopts)) if args.cp: cp = os.path.abspath(args.cp) else: if JVMCI_VERSION < 9: cp = join(get_jvmci_jdk().home, "jre", "lib", "rt.jar") else: cp = ( join(get_jvmci_jdk().home, "modules", "java.base") + os.pathsep + join(get_jvmci_jdk().home, "lib", "modules", "bootmodules.jimage") ) vmargs.append("-G:CompileTheWorldExcludeMethodFilter=sun.awt.X11.*.*") # suppress menubar and dock when running on Mac; exclude x11 classes as they may cause vm crashes (on Solaris) vmargs = ["-Djava.awt.headless=true"] + vmargs vm = get_vm() if JVMCI_VERSION >= 9: jvmciMode = _jvmci_get_vm().jvmciMode if jvmciMode == "disabled": vmargs += ["-XX:+CompileTheWorld", "-Xbootclasspath/p:" + cp] else: if jvmciMode == "jit": vmargs += ["-XX:+BootstrapJVMCI"] vmargs += ["-G:CompileTheWorldClasspath=" + cp, "com.oracle.graal.hotspot.CompileTheWorld"] else: if isJVMCIEnabled(vm): if vm == "jvmci": vmargs += ["-XX:+BootstrapJVMCI"] vmargs += [ "-G:CompileTheWorldClasspath=" + cp, "-XX:-UseJVMCIClassLoader", "com.oracle.graal.hotspot.CompileTheWorld", ] else: vmargs += ["-XX:+CompileTheWorld", "-Xbootclasspath/p:" + cp] run_vm(vmargs + _noneAsEmptyList(extraVMarguments))