src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/Main.java
Index Unified diffs Context diffs Sdiffs Frames Patch New Old Previous File Next File hotspot Cdiff src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/Main.java

src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/Main.java

Print this page

        

*** 25,65 **** import static org.graalvm.compiler.core.common.GraalOptions.GeneratePIC; import static org.graalvm.compiler.core.common.GraalOptions.ImmutableCode; import static org.graalvm.compiler.hotspot.meta.HotSpotAOTProfilingPlugin.Options.TieredAOT; - import java.io.BufferedReader; - import java.io.File; - import java.io.FileNotFoundException; - import java.io.FileReader; - import java.io.FileWriter; - import java.io.IOException; - import java.io.InputStream; - import java.io.InputStreamReader; import java.io.PrintWriter; - import java.lang.management.ManagementFactory; - import java.lang.management.MemoryUsage; - import java.nio.file.Path; - import java.nio.file.Paths; import java.text.MessageFormat; - import java.util.ArrayList; - import java.util.Date; - import java.util.HashSet; - import java.util.LinkedList; import java.util.List; import java.util.ListIterator; import java.util.Set; - import java.util.stream.Stream; import jdk.tools.jaotc.binformat.BinaryContainer; ! import jdk.tools.jaotc.binformat.ByteContainer; ! import jdk.tools.jaotc.collect.*; ! import jdk.tools.jaotc.collect.classname.ClassNameSourceProvider; ! import jdk.tools.jaotc.collect.directory.DirectorySourceProvider; ! import jdk.tools.jaotc.collect.jar.JarSourceProvider; ! import jdk.tools.jaotc.collect.module.ModuleSourceProvider; ! import jdk.tools.jaotc.utils.Timer; import org.graalvm.compiler.api.replacements.SnippetReflectionProvider; import org.graalvm.compiler.api.runtime.GraalJVMCICompiler; import org.graalvm.compiler.debug.DebugContext; import org.graalvm.compiler.debug.DebugContext.Activation; --- 25,42 ---- import static org.graalvm.compiler.core.common.GraalOptions.GeneratePIC; import static org.graalvm.compiler.core.common.GraalOptions.ImmutableCode; import static org.graalvm.compiler.hotspot.meta.HotSpotAOTProfilingPlugin.Options.TieredAOT; import java.io.PrintWriter; import java.text.MessageFormat; import java.util.List; import java.util.ListIterator; import java.util.Set; import jdk.tools.jaotc.binformat.BinaryContainer; ! import jdk.tools.jaotc.Options.Option; import org.graalvm.compiler.api.replacements.SnippetReflectionProvider; import org.graalvm.compiler.api.runtime.GraalJVMCICompiler; import org.graalvm.compiler.debug.DebugContext; import org.graalvm.compiler.debug.DebugContext.Activation;
*** 78,308 **** import org.graalvm.compiler.printer.GraalDebugHandlersFactory; import org.graalvm.compiler.runtime.RuntimeProvider; import jdk.vm.ci.meta.MetaAccessProvider; import jdk.vm.ci.meta.ResolvedJavaMethod; - import jdk.vm.ci.meta.ResolvedJavaType; import jdk.vm.ci.runtime.JVMCI; ! public class Main implements LogPrinter { ! static class BadArgs extends Exception { ! private static final long serialVersionUID = 1L; ! final String key; ! final Object[] args; ! boolean showUsage; ! BadArgs(String key, Object... args) { ! super(MessageFormat.format(key, args)); ! this.key = key; ! this.args = args; ! } ! ! BadArgs showUsage(boolean b) { ! showUsage = b; ! return this; ! } ! } ! ! abstract static class Option { ! final String help; ! final boolean hasArg; ! final String[] aliases; ! ! Option(String help, boolean hasArg, String... aliases) { ! this.help = help; ! this.hasArg = hasArg; ! this.aliases = aliases; ! } ! ! boolean isHidden() { ! return false; ! } ! ! boolean matches(String opt) { ! for (String a : aliases) { ! if (a.equals(opt)) { ! return true; ! } else if (opt.startsWith("--") && hasArg && opt.startsWith(a + "=")) { ! return true; ! } ! } ! return false; ! } ! ! boolean ignoreRest() { ! return false; ! } ! ! abstract void process(Main task, String opt, String arg) throws BadArgs; ! } ! ! static Option[] recognizedOptions = {new Option(" --output <file> Output file name", true, "--output") { ! @Override ! void process(Main task, String opt, String arg) { ! String name = arg; ! task.options.outputName = name; ! } ! }, new Option(" --class-name <class names> List of classes to compile", true, "--class-name", "--classname") { ! @Override ! void process(Main task, String opt, String arg) { ! task.options.files.addAll(ClassSearch.makeList(ClassNameSourceProvider.TYPE, arg)); ! } ! }, new Option(" --jar <jarfiles> List of jar files to compile", true, "--jar") { ! @Override ! void process(Main task, String opt, String arg) { ! task.options.files.addAll(ClassSearch.makeList(JarSourceProvider.TYPE, arg)); ! } ! }, new Option(" --module <modules> List of modules to compile", true, "--module") { ! @Override ! void process(Main task, String opt, String arg) { ! task.options.files.addAll(ClassSearch.makeList(ModuleSourceProvider.TYPE, arg)); ! } ! }, new Option(" --directory <dirs> List of directories where to search for files to compile", true, "--directory") { ! @Override ! void process(Main task, String opt, String arg) { ! task.options.files.addAll(ClassSearch.makeList(DirectorySourceProvider.TYPE, arg)); ! } ! }, new Option(" --search-path <dirs> List of directories where to search for specified files", true, "--search-path") { ! @Override ! void process(Main task, String opt, String arg) { ! String[] elements = arg.split(":"); ! task.options.searchPath.add(elements); ! } ! }, new Option(" --compile-commands <file> Name of file with compile commands", true, "--compile-commands") { ! @Override ! void process(Main task, String opt, String arg) { ! task.options.methodList = arg; ! } ! }, new Option(" --compile-for-tiered Generate profiling code for tiered compilation", false, "--compile-for-tiered") { ! @Override ! void process(Main task, String opt, String arg) { ! task.options.tiered = true; ! } ! }, new Option(" --compile-with-assertions Compile with java assertions", false, "--compile-with-assertions") { ! @Override ! void process(Main task, String opt, String arg) { ! task.options.compileWithAssertions = true; ! } ! }, new Option(" --compile-threads <number> Number of compilation threads to be used", true, "--compile-threads", "--threads") { ! @Override ! void process(Main task, String opt, String arg) { ! int threads = Integer.parseInt(arg); ! final int available = Runtime.getRuntime().availableProcessors(); ! if (threads <= 0) { ! task.warning("invalid number of threads specified: {0}, using: {1}", threads, available); ! threads = available; ! } ! if (threads > available) { ! task.warning("too many threads specified: {0}, limiting to: {1}", threads, available); ! } ! task.options.threads = Integer.min(threads, available); ! } ! }, new Option(" --ignore-errors Ignores all exceptions thrown during class loading", false, "--ignore-errors") { ! @Override ! void process(Main task, String opt, String arg) { ! task.options.ignoreClassLoadingErrors = true; ! } ! }, new Option(" --exit-on-error Exit on compilation errors", false, "--exit-on-error") { ! @Override ! void process(Main task, String opt, String arg) { ! task.options.exitOnError = true; ! } ! }, new Option(" --info Print information during compilation", false, "--info") { ! @Override ! void process(Main task, String opt, String arg) throws BadArgs { ! task.options.info = true; ! } ! }, new Option(" --verbose Print verbose information", false, "--verbose") { ! @Override ! void process(Main task, String opt, String arg) throws BadArgs { ! task.options.info = true; ! task.options.verbose = true; ! } ! }, new Option(" --debug Print debug information", false, "--debug") { ! @Override ! void process(Main task, String opt, String arg) throws BadArgs { ! task.options.info = true; ! task.options.verbose = true; ! task.options.debug = true; ! } ! }, new Option(" --help Print this usage message", false, "--help") { ! @Override ! void process(Main task, String opt, String arg) { ! task.options.help = true; ! } ! }, new Option(" --version Version information", false, "--version") { ! @Override ! void process(Main task, String opt, String arg) { ! task.options.version = true; ! } ! }, new Option(" --linker-path Full path to linker executable", true, "--linker-path") { ! @Override ! void process(Main task, String opt, String arg) { ! task.options.linkerpath = arg; ! } ! }, new Option(" -J<flag> Pass <flag> directly to the runtime system", false, "-J") { ! @Override ! void process(Main task, String opt, String arg) { ! } ! }}; ! ! public static class Options { ! public List<SearchFor> files = new LinkedList<>(); ! public String outputName = defaultOutputName(); ! public String methodList; ! public List<ClassSource> sources = new ArrayList<>(); ! public String linkerpath = null; ! public SearchPath searchPath = new SearchPath(); ! ! /** ! * We don't see scaling beyond 16 threads. ! */ ! private static final int COMPILER_THREADS = 16; ! ! public int threads = Integer.min(COMPILER_THREADS, Runtime.getRuntime().availableProcessors()); ! ! public boolean ignoreClassLoadingErrors; ! public boolean exitOnError; ! public boolean info; ! public boolean verbose; ! public boolean debug; ! public boolean help; ! public boolean version; ! public boolean compileWithAssertions; ! public boolean tiered; ! ! private static String defaultOutputName() { ! String osName = System.getProperty("os.name"); ! String name = "unnamed."; ! String ext; ! ! switch (osName) { ! case "Linux": ! case "SunOS": ! ext = "so"; ! break; ! case "Mac OS X": ! ext = "dylib"; ! break; ! default: ! if (osName.startsWith("Windows")) { ! ext = "dll"; ! } else { ! ext = "so"; ! } ! } ! ! return name + ext; ! } ! } ! ! /* package */final Options options = new Options(); ! ! /** ! * Logfile. ! */ ! private static FileWriter logFile = null; private static final int EXIT_OK = 0; // No errors. private static final int EXIT_CMDERR = 2; // Bad command-line arguments and/or switches. private static final int EXIT_ABNORMAL = 4; // Terminated abnormally. --- 55,72 ---- import org.graalvm.compiler.printer.GraalDebugHandlersFactory; import org.graalvm.compiler.runtime.RuntimeProvider; import jdk.vm.ci.meta.MetaAccessProvider; import jdk.vm.ci.meta.ResolvedJavaMethod; import jdk.vm.ci.runtime.JVMCI; ! public final class Main { ! final Options options = new Options(); ! private PrintWriter log; ! LogPrinter printer; ! GraalFilters filters; private static final int EXIT_OK = 0; // No errors. private static final int EXIT_CMDERR = 2; // Bad command-line arguments and/or switches. private static final int EXIT_ABNORMAL = 4; // Terminated abnormally.
*** 315,350 **** final int exitCode = t.run(args); System.exit(exitCode); } private int run(String[] args) { - if (log == null) { log = new PrintWriter(System.out); ! } try { ! handleOptions(args); if (options.help) { showHelp(); return EXIT_OK; } if (options.version) { showVersion(); return EXIT_OK; } ! printlnInfo("Compiling " + options.outputName + "..."); final long start = System.currentTimeMillis(); if (!run()) { return EXIT_ABNORMAL; } final long end = System.currentTimeMillis(); ! printlnInfo("Total time: " + (end - start) + " ms"); return EXIT_OK; ! } catch (BadArgs e) { ! reportError(e.key, e.args); if (e.showUsage) { showUsage(); } return EXIT_CMDERR; } catch (Exception e) { --- 79,113 ---- final int exitCode = t.run(args); System.exit(exitCode); } private int run(String[] args) { log = new PrintWriter(System.out); ! printer = new LogPrinter(this, log); try { ! Options.handleOptions(this, args); if (options.help) { showHelp(); return EXIT_OK; } if (options.version) { showVersion(); return EXIT_OK; } ! printer.printlnInfo("Compiling " + options.outputName + "..."); final long start = System.currentTimeMillis(); if (!run()) { return EXIT_ABNORMAL; } final long end = System.currentTimeMillis(); ! printer.printlnInfo("Total time: " + (end - start) + " ms"); return EXIT_OK; ! } catch (Options.BadArgs e) { ! printer.reportError(e.key, e.args); if (e.showUsage) { showUsage(); } return EXIT_CMDERR; } catch (Exception e) {
*** 353,473 **** } finally { log.flush(); } } - private static String humanReadableByteCount(long bytes) { - int unit = 1024; - - if (bytes < unit) { - return bytes + " B"; - } - - int exp = (int) (Math.log(bytes) / Math.log(unit)); - char pre = "KMGTPE".charAt(exp - 1); - return String.format("%.1f %cB", bytes / Math.pow(unit, exp), pre); - } - - void printMemoryUsage() { - if (options.verbose) { - MemoryUsage memusage = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage(); - float freeratio = 1f - (float) memusage.getUsed() / memusage.getCommitted(); - log.format(" [used: %-7s, comm: %-7s, freeRatio ~= %.1f%%]", - humanReadableByteCount(memusage.getUsed()), - humanReadableByteCount(memusage.getCommitted()), - freeratio * 100); - } - } - - /** - * Visual Studio supported versions Search Order is: VS2013, VS2015, VS2012 - */ - public enum VSVERSIONS { - VS2013("VS120COMNTOOLS", "C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\VC\\bin\\amd64\\link.exe"), - VS2015("VS140COMNTOOLS", "C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\bin\\amd64\\link.exe"), - VS2012("VS110COMNTOOLS", "C:\\Program Files (x86)\\Microsoft Visual Studio 11.0\\VC\\bin\\amd64\\link.exe"); - - private final String envvariable; - private final String wkp; - - VSVERSIONS(String envvariable, String wellknownpath) { - this.envvariable = envvariable; - this.wkp = wellknownpath; - } - - String EnvVariable() { - return envvariable; - } - - String WellKnownPath() { - return wkp; - } - } - - /** - * Search for Visual Studio link.exe Search Order is: VS2013, VS2015, VS2012 - */ - private static String getWindowsLinkPath() { - String link = "\\VC\\bin\\amd64\\link.exe"; - - /** - * First try searching the paths pointed to by the VS environment variables. - */ - for (VSVERSIONS vs : VSVERSIONS.values()) { - String vspath = System.getenv(vs.EnvVariable()); - if (vspath != null) { - File commonTools = new File(vspath); - File vsRoot = commonTools.getParentFile().getParentFile(); - File linkPath = new File(vsRoot, link); - if (linkPath.exists()) - return linkPath.getPath(); - } - } - - /** - * If we didn't find via the VS environment variables, try the well known paths - */ - for (VSVERSIONS vs : VSVERSIONS.values()) { - String wkp = vs.WellKnownPath(); - if (new File(wkp).exists()) { - return wkp; - } - } - - return null; - } - @SuppressWarnings("try") private boolean run() throws Exception { ! openLog(); try { - CompilationSpec compilationRestrictions = collectSpecifiedMethods(); ! Set<Class<?>> classesToCompile = new HashSet<>(); try (Timer t = new Timer(this, "")) { ! FileSupport fileSupport = new FileSupport(); ! ClassSearch lookup = new ClassSearch(); ! lookup.addProvider(new ModuleSourceProvider()); ! lookup.addProvider(new ClassNameSourceProvider(fileSupport)); ! lookup.addProvider(new JarSourceProvider()); ! lookup.addProvider(new DirectorySourceProvider(fileSupport)); ! ! List<LoadedClass> found = null; ! try { ! found = lookup.search(options.files, options.searchPath); ! } catch (InternalError e) { ! reportError(e); ! return false; ! } ! ! for (LoadedClass loadedClass : found) { ! classesToCompile.add(loadedClass.getLoadedClass()); ! } ! ! printInfo(classesToCompile.size() + " classes found"); } OptionValues graalOptions = HotSpotGraalOptionValues.HOTSPOT_OPTIONS; // Setting -Dgraal.TieredAOT overrides --compile-for-tiered if (!TieredAOT.hasBeenSet(graalOptions)) { --- 116,139 ---- } finally { log.flush(); } } @SuppressWarnings("try") private boolean run() throws Exception { ! LogPrinter.openLog(); try { ! final Linker linker = new Linker(this); ! final String objectFileName = linker.objFile(); ! final Collector collector = new Collector(this); ! Set<Class<?>> classesToCompile; try (Timer t = new Timer(this, "")) { ! classesToCompile = collector.collectClassesToCompile(); ! printer.printInfo(classesToCompile.size() + " classes found"); } OptionValues graalOptions = HotSpotGraalOptionValues.HOTSPOT_OPTIONS; // Setting -Dgraal.TieredAOT overrides --compile-for-tiered if (!TieredAOT.hasBeenSet(graalOptions)) {
*** 476,502 **** graalOptions = new OptionValues(graalOptions, GeneratePIC, true, ImmutableCode, true); GraalJVMCICompiler graalCompiler = HotSpotGraalCompilerFactory.createCompiler(JVMCI.getRuntime(), graalOptions, CompilerConfigurationFactory.selectFactory(null, graalOptions)); HotSpotGraalRuntimeProvider runtime = (HotSpotGraalRuntimeProvider) graalCompiler.getGraalRuntime(); HotSpotHostBackend backend = (HotSpotHostBackend) runtime.getCapability(RuntimeProvider.class).getHostBackend(); MetaAccessProvider metaAccess = backend.getProviders().getMetaAccess(); ! GraalFilters filters = new GraalFilters(metaAccess); List<AOTCompiledClass> classes; try (Timer t = new Timer(this, "")) { ! classes = collectMethodsToCompile(classesToCompile, compilationRestrictions, filters, metaAccess); } // Free memory! try (Timer t = options.verbose ? new Timer(this, "Freeing memory") : null) { ! printMemoryUsage(); ! compilationRestrictions = null; classesToCompile = null; System.gc(); } ! AOTBackend aotBackend = new AOTBackend(this, graalOptions, backend, filters); SnippetReflectionProvider snippetReflection = aotBackend.getProviders().getSnippetReflection(); AOTCompiler compiler = new AOTCompiler(this, graalOptions, aotBackend, options.threads); classes = compiler.compileClasses(classes); GraalHotSpotVMConfig graalHotSpotVMConfig = runtime.getVMConfig(); --- 142,167 ---- graalOptions = new OptionValues(graalOptions, GeneratePIC, true, ImmutableCode, true); GraalJVMCICompiler graalCompiler = HotSpotGraalCompilerFactory.createCompiler(JVMCI.getRuntime(), graalOptions, CompilerConfigurationFactory.selectFactory(null, graalOptions)); HotSpotGraalRuntimeProvider runtime = (HotSpotGraalRuntimeProvider) graalCompiler.getGraalRuntime(); HotSpotHostBackend backend = (HotSpotHostBackend) runtime.getCapability(RuntimeProvider.class).getHostBackend(); MetaAccessProvider metaAccess = backend.getProviders().getMetaAccess(); ! filters = new GraalFilters(metaAccess); List<AOTCompiledClass> classes; try (Timer t = new Timer(this, "")) { ! classes = collector.collectMethodsToCompile(classesToCompile, metaAccess); } // Free memory! try (Timer t = options.verbose ? new Timer(this, "Freeing memory") : null) { ! printer.printMemoryUsage(); classesToCompile = null; System.gc(); } ! AOTBackend aotBackend = new AOTBackend(this, graalOptions, backend); SnippetReflectionProvider snippetReflection = aotBackend.getProviders().getSnippetReflection(); AOTCompiler compiler = new AOTCompiler(this, graalOptions, aotBackend, options.threads); classes = compiler.compileClasses(classes); GraalHotSpotVMConfig graalHotSpotVMConfig = runtime.getVMConfig();
*** 504,514 **** ListIterator<BasePhase<? super HighTierContext>> iterator = graphBuilderSuite.findPhase(GraphBuilderPhase.class); GraphBuilderConfiguration graphBuilderConfig = ((GraphBuilderPhase) iterator.previous()).getGraphBuilderConfig(); // Free memory! try (Timer t = options.verbose ? new Timer(this, "Freeing memory") : null) { ! printMemoryUsage(); aotBackend = null; compiler = null; System.gc(); } --- 169,179 ---- ListIterator<BasePhase<? super HighTierContext>> iterator = graphBuilderSuite.findPhase(GraphBuilderPhase.class); GraphBuilderConfiguration graphBuilderConfig = ((GraphBuilderPhase) iterator.previous()).getGraphBuilderConfig(); // Free memory! try (Timer t = options.verbose ? new Timer(this, "Freeing memory") : null) { ! printer.printMemoryUsage(); aotBackend = null; compiler = null; System.gc(); }
*** 518,546 **** try (DebugContext debug = DebugContext.create(graalOptions, new GraalDebugHandlersFactory(snippetReflection)); Activation a = debug.activate()) { dataBuilder.prepareData(debug); } // Print information about section sizes ! printContainerInfo(binaryContainer.getHeaderContainer().getContainer()); ! printContainerInfo(binaryContainer.getConfigContainer()); ! printContainerInfo(binaryContainer.getKlassesOffsetsContainer()); ! printContainerInfo(binaryContainer.getMethodsOffsetsContainer()); ! printContainerInfo(binaryContainer.getKlassesDependenciesContainer()); ! printContainerInfo(binaryContainer.getStubsOffsetsContainer()); ! printContainerInfo(binaryContainer.getMethodMetadataContainer()); ! printContainerInfo(binaryContainer.getCodeContainer()); ! printContainerInfo(binaryContainer.getCodeSegmentsContainer()); ! printContainerInfo(binaryContainer.getConstantDataContainer()); ! printContainerInfo(binaryContainer.getMetaspaceGotContainer()); ! printContainerInfo(binaryContainer.getMetadataGotContainer()); ! printContainerInfo(binaryContainer.getMethodStateContainer()); ! printContainerInfo(binaryContainer.getOopGotContainer()); ! printContainerInfo(binaryContainer.getMetaspaceNamesContainer()); // Free memory! try (Timer t = options.verbose ? new Timer(this, "Freeing memory") : null) { ! printMemoryUsage(); backend = null; for (AOTCompiledClass aotCompClass : classes) { aotCompClass.clear(); } classes.clear(); --- 183,197 ---- try (DebugContext debug = DebugContext.create(graalOptions, new GraalDebugHandlersFactory(snippetReflection)); Activation a = debug.activate()) { dataBuilder.prepareData(debug); } // Print information about section sizes ! printer.containersInfo(binaryContainer); // Free memory! try (Timer t = options.verbose ? new Timer(this, "Freeing memory") : null) { ! printer.printMemoryUsage(); backend = null; for (AOTCompiledClass aotCompClass : classes) { aotCompClass.clear(); } classes.clear();
*** 548,974 **** dataBuilder = null; binaryContainer.freeMemory(); System.gc(); } - String name = options.outputName; - String objectFileName = name; - - String libraryFileName = name; - - String linkerCmd; - String linkerPath; - String osName = System.getProperty("os.name"); - - switch (osName) { - case "Linux": - if (name.endsWith(".so")) { - objectFileName = name.substring(0, name.length() - ".so".length()); - } - linkerPath = (options.linkerpath != null) ? options.linkerpath : "ld"; - linkerCmd = linkerPath + " -shared -z noexecstack -o " + libraryFileName + " " + objectFileName; - break; - case "SunOS": - if (name.endsWith(".so")) { - objectFileName = name.substring(0, name.length() - ".so".length()); - } - objectFileName = objectFileName + ".o"; - linkerPath = (options.linkerpath != null) ? options.linkerpath : "ld"; - linkerCmd = linkerPath + " -shared -o " + libraryFileName + " " + objectFileName; - break; - case "Mac OS X": - if (name.endsWith(".dylib")) { - objectFileName = name.substring(0, name.length() - ".dylib".length()); - } - objectFileName = objectFileName + ".o"; - linkerPath = (options.linkerpath != null) ? options.linkerpath : "ld"; - linkerCmd = linkerPath + " -dylib -o " + libraryFileName + " " + objectFileName; - break; - default: - if (osName.startsWith("Windows")) { - if (name.endsWith(".dll")) { - objectFileName = name.substring(0, name.length() - ".dll".length()); - } - objectFileName = objectFileName + ".obj"; - linkerPath = (options.linkerpath != null) ? options.linkerpath : getWindowsLinkPath(); - if (linkerPath == null) { - throw new InternalError("Can't locate Microsoft Visual Studio amd64 link.exe"); - } - linkerCmd = linkerPath + " /DLL /OPT:NOREF /NOLOGO /NOENTRY" + " /OUT:" + libraryFileName + " " + objectFileName; - break; - } else { - throw new InternalError("Unsupported platform: " + osName); - } - } - try (Timer t = new Timer(this, "Creating binary: " + objectFileName)) { ! binaryContainer.createBinary(objectFileName, JVM_VERSION); } // Free memory! try (Timer t = options.verbose ? new Timer(this, "Freeing memory") : null) { ! printMemoryUsage(); binaryContainer = null; System.gc(); } ! try (Timer t = new Timer(this, "Creating shared library: " + libraryFileName)) { ! Process p = Runtime.getRuntime().exec(linkerCmd); ! final int exitCode = p.waitFor(); ! if (exitCode != 0) { ! InputStream stderr = p.getErrorStream(); ! BufferedReader br = new BufferedReader(new InputStreamReader(stderr)); ! Stream<String> lines = br.lines(); ! StringBuilder sb = new StringBuilder(); ! lines.iterator().forEachRemaining(e -> sb.append(e)); ! throw new InternalError(sb.toString()); ! } ! File objFile = new File(objectFileName); ! if (objFile.exists()) { ! if (!objFile.delete()) { ! throw new InternalError("Failed to delete " + objectFileName + " file"); ! } ! } ! // Make non-executable for all. ! File libFile = new File(libraryFileName); ! if (libFile.exists() && !osName.startsWith("Windows")) { ! if (!libFile.setExecutable(false, false)) { ! throw new InternalError("Failed to change attribute for " + libraryFileName + " file"); ! } ! } } ! printVerbose("Final memory "); ! printMemoryUsage(); ! printlnVerbose(""); } finally { ! closeLog(); } return true; } ! private void addMethods(AOTCompiledClass aotClass, ResolvedJavaMethod[] methods, CompilationSpec compilationRestrictions, GraalFilters filters) { ! for (ResolvedJavaMethod m : methods) { ! addMethod(aotClass, m, compilationRestrictions, filters); ! } ! } ! ! private void addMethod(AOTCompiledClass aotClass, ResolvedJavaMethod method, CompilationSpec compilationRestrictions, GraalFilters filters) { ! // Don't compile native or abstract methods. ! if (!method.hasBytecodes()) { ! return; ! } ! if (!compilationRestrictions.shouldCompileMethod(method)) { ! return; ! } ! if (!filters.shouldCompileMethod(method)) { ! return; ! } ! ! aotClass.addMethod(method); ! printlnVerbose(" added " + method.getName() + method.getSignature().toMethodDescriptor()); ! } ! private void printContainerInfo(ByteContainer container) { ! printlnVerbose(container.getContainerName() + ": " + container.getByteStreamSize() + " bytes"); } ! PrintWriter log; ! ! private void handleOptions(String[] args) throws BadArgs { ! if (args.length == 0) { ! options.help = true; return; } ! // Make checkstyle happy. ! int i = 0; ! for (; i < args.length; i++) { ! String arg = args[i]; ! if (arg.charAt(0) == '-') { ! Option option = getOption(arg); ! String param = null; ! ! if (option.hasArg) { ! if (arg.startsWith("--") && arg.indexOf('=') > 0) { ! param = arg.substring(arg.indexOf('=') + 1, arg.length()); ! } else if (i + 1 < args.length) { ! param = args[++i]; ! } ! ! if (param == null || param.isEmpty() || param.charAt(0) == '-') { ! throw new BadArgs("missing argument for option: {0}", arg).showUsage(true); ! } ! } ! ! option.process(this, arg, param); ! ! if (option.ignoreRest()) { ! break; ! } ! } else { ! options.files.add(new SearchFor(arg)); ! } ! } } - private static Option getOption(String name) throws BadArgs { - for (Option o : recognizedOptions) { - if (o.matches(name)) { - return o; - } - } - throw new BadArgs("unknown option: {0}", name).showUsage(true); - } - - public void printInfo(String message) { - if (options.info) { - log.print(message); - log.flush(); - } - } - - public void printlnInfo(String message) { - if (options.info) { - log.println(message); - log.flush(); - } - } - - public void printVerbose(String message) { - if (options.verbose) { - log.print(message); - log.flush(); - } - } - - public void printlnVerbose(String message) { if (options.verbose) { - log.println(message); - log.flush(); - } - } - - public void printDebug(String message) { - if (options.debug) { - log.print(message); - log.flush(); - } - } - - public void printlnDebug(String message) { - if (options.debug) { - log.println(message); - log.flush(); - } - } - - public void printError(String message) { - log.println("Error: " + message); - log.flush(); - } - - private void reportError(Throwable e) { - log.println("Error: " + e.getMessage()); - if (options.info) { e.printStackTrace(log); } - log.flush(); - } ! private void reportError(String key, Object... args) { ! printError(MessageFormat.format(key, args)); } ! private void warning(String key, Object... args) { log.println("Warning: " + MessageFormat.format(key, args)); log.flush(); } private void showUsage() { log.println("Usage: " + PROGNAME + " <options> list"); log.println("use --help for a list of possible options"); } private void showHelp() { log.println("Usage: " + PROGNAME + " <options> list"); log.println(); log.println(" list A : separated list of class names, modules, jar files"); log.println(" or directories which contain class files."); log.println(); log.println("where options include:"); ! for (Option o : recognizedOptions) { String name = o.aliases[0].substring(1); // there must always be at least one name name = name.charAt(0) == '-' ? name.substring(1) : name; if (o.isHidden() || name.equals("h")) { continue; } log.println(o.help); } } private void showVersion() { log.println(PROGNAME + " " + JVM_VERSION); } - - /** - * Collect all method we should compile. - * - * @return array list of AOT classes which have compiled methods. - */ - private List<AOTCompiledClass> collectMethodsToCompile(Set<Class<?>> classesToCompile, CompilationSpec compilationRestrictions, GraalFilters filters, MetaAccessProvider metaAccess) { - int total = 0; - int count = 0; - List<AOTCompiledClass> classes = new ArrayList<>(); - - for (Class<?> c : classesToCompile) { - ResolvedJavaType resolvedJavaType = metaAccess.lookupJavaType(c); - if (filters.shouldCompileAnyMethodInClass(resolvedJavaType)) { - AOTCompiledClass aotClass = new AOTCompiledClass(resolvedJavaType); - printlnVerbose(" Scanning " + c.getName()); - - // Constructors - try { - ResolvedJavaMethod[] ctors = resolvedJavaType.getDeclaredConstructors(); - addMethods(aotClass, ctors, compilationRestrictions, filters); - total += ctors.length; - } catch (Throwable e) { - // If we are running in JCK mode we ignore all exceptions. - if (options.ignoreClassLoadingErrors) { - printError(c.getName() + ": " + e); - } else { - throw new InternalError(e); - } - } - - // Methods - try { - ResolvedJavaMethod[] methods = resolvedJavaType.getDeclaredMethods(); - addMethods(aotClass, methods, compilationRestrictions, filters); - total += methods.length; - } catch (Throwable e) { - // If we are running in JCK mode we ignore all exceptions. - if (options.ignoreClassLoadingErrors) { - printError(c.getName() + ": " + e); - } else { - throw new InternalError(e); - } - } - - // Class initializer - try { - ResolvedJavaMethod clinit = resolvedJavaType.getClassInitializer(); - if (clinit != null) { - addMethod(aotClass, clinit, compilationRestrictions, filters); - total++; - } - } catch (Throwable e) { - // If we are running in JCK mode we ignore all exceptions. - if (options.ignoreClassLoadingErrors) { - printError(c.getName() + ": " + e); - } else { - throw new InternalError(e); - } - } - - // Found any methods to compile? Add the class. - if (aotClass.hasMethods()) { - classes.add(aotClass); - count += aotClass.getMethodCount(); - } - } - } - printInfo(total + " methods total, " + count + " methods to compile"); - return classes; - } - - /** - * If a file with compilation limitations is specified using the java property - * jdk.tools.jaotc.compile.method.list, read the file's contents and collect the restrictions. - */ - private CompilationSpec collectSpecifiedMethods() { - CompilationSpec compilationRestrictions = new CompilationSpec(); - String methodListFileName = options.methodList; - - if (methodListFileName != null && !methodListFileName.equals("")) { - try { - FileReader methListFile = new FileReader(methodListFileName); - BufferedReader readBuf = new BufferedReader(methListFile); - String line = null; - while ((line = readBuf.readLine()) != null) { - String trimmedLine = line.trim(); - if (!trimmedLine.startsWith("#")) { - String[] components = trimmedLine.split(" "); - if (components.length == 2) { - String directive = components[0]; - String pattern = components[1]; - switch (directive) { - case "compileOnly": - compilationRestrictions.addCompileOnlyPattern(pattern); - break; - case "exclude": - compilationRestrictions.addExcludePattern(pattern); - break; - default: - System.out.println("Unrecognized command " + directive + ". Ignoring\n\t" + line + "\n encountered in " + methodListFileName); - } - } else { - if (!trimmedLine.equals("")) { - System.out.println("Ignoring malformed line:\n\t " + line + "\n"); - } - } - } - } - readBuf.close(); - } catch (FileNotFoundException e) { - throw new InternalError("Unable to open method list file: " + methodListFileName, e); - } catch (IOException e) { - throw new InternalError("Unable to read method list file: " + methodListFileName, e); - } - } - - return compilationRestrictions; - } - - private static void openLog() { - int v = Integer.getInteger("jdk.tools.jaotc.logCompilation", 0); - if (v == 0) { - logFile = null; - return; - } - // Create log file in current directory - String fileName = "aot_compilation" + new Date().getTime() + ".log"; - Path logFilePath = Paths.get("./", fileName); - String logFileName = logFilePath.toString(); - try { - // Create file to which we do not append - logFile = new FileWriter(logFileName, false); - } catch (IOException e) { - System.out.println("Unable to open logfile :" + logFileName + "\nNo logs will be created"); - logFile = null; - } - } - - public static void writeLog(String str) { - if (logFile != null) { - try { - logFile.write(str + "\n"); - logFile.flush(); - } catch (IOException e) { - // Print to console - System.out.println(str + "\n"); - } - } - } - - public static void closeLog() { - if (logFile != null) { - try { - logFile.close(); - } catch (IOException e) { - // Do nothing - } - } - } } --- 199,288 ---- dataBuilder = null; binaryContainer.freeMemory(); System.gc(); } try (Timer t = new Timer(this, "Creating binary: " + objectFileName)) { ! binaryContainer.createBinary(objectFileName); } // Free memory! try (Timer t = options.verbose ? new Timer(this, "Freeing memory") : null) { ! printer.printMemoryUsage(); binaryContainer = null; System.gc(); } ! try (Timer t = new Timer(this, "Creating shared library: " + linker.libFile())) { ! linker.link(); } ! printer.printVerbose("Final memory "); ! printer.printMemoryUsage(); ! printer.printlnVerbose(""); } finally { ! LogPrinter.closeLog(); } return true; } ! void handleError(ResolvedJavaMethod resolvedMethod, Throwable e, String message) { ! String methodName = JavaMethodInfo.uniqueMethodName(resolvedMethod); ! if (options.debug) { ! printer.printError("Failed compilation: " + methodName + ": " + e); } ! // Ignore some exceptions when meta-compiling Graal. ! if (GraalFilters.shouldIgnoreException(e)) { return; } ! LogPrinter.writeLog("Failed compilation of method " + methodName + message); ! if (!options.debug) { ! printer.printError("Failed compilation: " + methodName + ": " + e); } if (options.verbose) { e.printStackTrace(log); } ! if (options.exitOnError) { ! System.exit(1); ! } } ! void warning(String key, Object... args) { log.println("Warning: " + MessageFormat.format(key, args)); log.flush(); } private void showUsage() { log.println("Usage: " + PROGNAME + " <options> list"); log.println("use --help for a list of possible options"); + log.flush(); } private void showHelp() { log.println("Usage: " + PROGNAME + " <options> list"); log.println(); log.println(" list A : separated list of class names, modules, jar files"); log.println(" or directories which contain class files."); log.println(); log.println("where options include:"); ! for (Option o : Options.recognizedOptions) { String name = o.aliases[0].substring(1); // there must always be at least one name name = name.charAt(0) == '-' ? name.substring(1) : name; if (o.isHidden() || name.equals("h")) { continue; } log.println(o.help); } + log.flush(); } private void showVersion() { log.println(PROGNAME + " " + JVM_VERSION); } }
src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/Main.java
Index Unified diffs Context diffs Sdiffs Frames Patch New Old Previous File Next File