annotate graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/CompileTheWorld.java @ 12456:f87c68d79f07

improved support for co-existing, multiple backends (GRAAL-363)
author Doug Simon <doug.simon@oracle.com>
date Thu, 17 Oct 2013 01:08:17 +0200
parents 7080a96be216
children e2933e3d4fb0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9108
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
1 /*
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
2 * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
4 *
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
7 * published by the Free Software Foundation.
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
8 *
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
13 * accompanied this code).
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
14 *
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
18 *
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
21 * questions.
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
22 */
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
23 package com.oracle.graal.hotspot;
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
24
9289
261a43921c5e rename: HotSpotGraalRuntime.getInstance() -> graalRuntime()
Doug Simon <doug.simon@oracle.com>
parents: 9108
diff changeset
25 import static com.oracle.graal.hotspot.HotSpotGraalRuntime.*;
9864
063a712fe8d8 converted remaining options in GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents: 9289
diff changeset
26 import static com.oracle.graal.phases.GraalOptions.*;
9289
261a43921c5e rename: HotSpotGraalRuntime.getInstance() -> graalRuntime()
Doug Simon <doug.simon@oracle.com>
parents: 9108
diff changeset
27
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents: 10672
diff changeset
28 import java.io.*;
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents: 10672
diff changeset
29 import java.lang.reflect.*;
9108
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
30 import java.net.*;
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents: 10672
diff changeset
31 import java.util.*;
9108
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
32 import java.util.jar.*;
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
33
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
34 import com.oracle.graal.api.meta.*;
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents: 10672
diff changeset
35 import com.oracle.graal.bytecode.*;
9108
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
36 import com.oracle.graal.debug.*;
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
37 import com.oracle.graal.hotspot.bridge.*;
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
38 import com.oracle.graal.hotspot.meta.*;
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
39 import com.oracle.graal.nodes.*;
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
40 import com.oracle.graal.phases.*;
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
41 import com.oracle.graal.replacements.*;
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
42
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
43 /**
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
44 * This class implements compile-the-world functionality in Graal.
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
45 */
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
46 public final class CompileTheWorld {
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
47
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
48 /**
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
49 * This is our magic token to trigger reading files from the boot class path.
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
50 */
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
51 public static final String SUN_BOOT_CLASS_PATH = "sun.boot.class.path";
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
52
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
53 // Some runtime instances we need.
12431
7080a96be216 rename: graalRuntime -> runtime, getGraalRuntime -> getRuntime
Doug Simon <doug.simon@oracle.com>
parents: 12429
diff changeset
54 private final HotSpotGraalRuntime runtime = runtime();
7080a96be216 rename: graalRuntime -> runtime, getGraalRuntime -> getRuntime
Doug Simon <doug.simon@oracle.com>
parents: 12429
diff changeset
55 private final VMToCompilerImpl vmToCompiler = (VMToCompilerImpl) runtime.getVMToCompiler();
9108
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
56
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
57 /** List of Zip/Jar files to compile (see {@link GraalOptions#CompileTheWorld}. */
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
58 private final String files;
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
59
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
60 /** Class index to start compilation at (see {@link GraalOptions#CompileTheWorldStartAt}. */
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
61 private final int startAt;
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
62
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
63 /** Class index to stop compilation at (see {@link GraalOptions#CompileTheWorldStopAt}. */
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
64 private final int stopAt;
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
65
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
66 // Counters
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
67 private int classFileCounter = 0;
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
68 private int compiledMethodsCounter = 0;
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
69 private long compileTime = 0;
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
70
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
71 /**
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
72 * Create a compile-the-world instance with default values from
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
73 * {@link GraalOptions#CompileTheWorld}, {@link GraalOptions#CompileTheWorldStartAt} and
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
74 * {@link GraalOptions#CompileTheWorldStopAt}.
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
75 */
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
76 public CompileTheWorld() {
9864
063a712fe8d8 converted remaining options in GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents: 9289
diff changeset
77 this(CompileTheWorld.getValue(), CompileTheWorldStartAt.getValue(), CompileTheWorldStopAt.getValue());
9108
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
78 }
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
79
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
80 /**
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
81 * Create a compile-the-world instance.
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
82 *
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
83 * @param files {@link File#pathSeparator} separated list of Zip/Jar files to compile
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
84 * @param startAt index of the class file to start compilation at
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
85 * @param stopAt index of the class file to stop compilation at
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
86 */
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
87 public CompileTheWorld(String files, int startAt, int stopAt) {
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
88 this.files = files;
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
89 this.startAt = startAt;
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
90 this.stopAt = stopAt;
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
91
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
92 // We don't want the VM to exit when a method fails to compile.
9864
063a712fe8d8 converted remaining options in GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents: 9289
diff changeset
93 ExitVMOnException.setValue(false);
9108
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
94 }
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
95
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
96 /**
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
97 * Compile all methods in all classes in the Zip/Jar files in
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
98 * {@link GraalOptions#CompileTheWorld}. If the GraalOptions.CompileTheWorld contains the magic
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
99 * token {@link CompileTheWorld#SUN_BOOT_CLASS_PATH} passed up from HotSpot we take the files
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
100 * from the boot class path.
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
101 *
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
102 * @throws Throwable
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
103 */
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
104 public void compile() throws Throwable {
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
105 if (SUN_BOOT_CLASS_PATH.equals(files)) {
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
106 final String[] entries = System.getProperty(SUN_BOOT_CLASS_PATH).split(File.pathSeparator);
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
107 String bcpFiles = "";
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
108 for (int i = 0; i < entries.length; i++) {
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
109 final String entry = entries[i];
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
110
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
111 // We stop at rt.jar, unless it is the first boot class path entry.
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
112 if (entry.endsWith("rt.jar") && (i > 0)) {
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
113 break;
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
114 }
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
115 if (i > 0) {
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
116 bcpFiles += File.pathSeparator;
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
117 }
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
118 bcpFiles += entry;
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
119 }
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
120 compile(bcpFiles);
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
121 } else {
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
122 compile(files);
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
123 }
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
124 }
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
125
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
126 /**
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
127 * Compile all methods in all classes in the Zip/Jar files passed.
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
128 *
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
129 * @param fileList {@link File#pathSeparator} separated list of Zip/Jar files to compile
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
130 * @throws Throwable
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
131 */
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
132 private void compile(String fileList) throws Throwable {
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
133 final String[] entries = fileList.split(File.pathSeparator);
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
134
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
135 for (int i = 0; i < entries.length; i++) {
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
136 final String entry = entries[i];
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
137
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
138 // For now we only compile all methods in all classes in zip/jar files.
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
139 if (!entry.endsWith(".zip") && !entry.endsWith(".jar")) {
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
140 TTY.println("CompileTheWorld : Skipped classes in " + entry);
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
141 TTY.println();
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
142 continue;
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
143 }
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
144
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
145 TTY.println("CompileTheWorld : Compiling all classes in " + entry);
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
146 TTY.println();
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
147
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
148 URL url = new URL("jar", "", "file:" + entry + "!/");
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
149 ClassLoader loader = new URLClassLoader(new URL[]{url});
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
150
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
151 JarFile jarFile = new JarFile(entry);
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
152 Enumeration<JarEntry> e = jarFile.entries();
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
153
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
154 while (e.hasMoreElements()) {
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
155 JarEntry je = e.nextElement();
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
156 if (je.isDirectory() || !je.getName().endsWith(".class")) {
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
157 continue;
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
158 }
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
159
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
160 // Are we done?
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
161 if (classFileCounter >= stopAt) {
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
162 break;
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
163 }
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
164
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
165 String className = je.getName().substring(0, je.getName().length() - ".class".length());
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
166 classFileCounter++;
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
167
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
168 try {
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
169 // Load and initialize class
10543
97caf20971ed CTW: adapt output messages, so that they match with the output of hotspot
Bernhard Urban <bernhard.urban@jku.at>
parents: 10461
diff changeset
170 Class<?> javaClass = Class.forName(className.replace('/', '.'), true, loader);
9108
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
171
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
172 // Pre-load all classes in the constant pool.
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
173 try {
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
174 HotSpotResolvedObjectType objectType = (HotSpotResolvedObjectType) HotSpotResolvedObjectType.fromClass(javaClass);
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
175 ConstantPool constantPool = objectType.constantPool();
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
176 for (int cpi = 1; cpi < constantPool.length(); cpi++) {
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
177 constantPool.loadReferencedType(cpi, Bytecodes.LDC);
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
178 }
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
179 } catch (Throwable t) {
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
180 // If something went wrong during pre-loading we just ignore it.
10543
97caf20971ed CTW: adapt output messages, so that they match with the output of hotspot
Bernhard Urban <bernhard.urban@jku.at>
parents: 10461
diff changeset
181 TTY.println("Preloading failed for (%d) %s", classFileCounter, className);
9108
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
182 }
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
183
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
184 // Are we compiling this class?
12456
f87c68d79f07 improved support for co-existing, multiple backends (GRAAL-363)
Doug Simon <doug.simon@oracle.com>
parents: 12431
diff changeset
185 HotSpotMetaAccessProvider metaAccess = runtime.getHostProviders().getMetaAccess();
9108
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
186 if (classFileCounter >= startAt) {
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
187 TTY.println("CompileTheWorld (%d) : %s", classFileCounter, className);
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
188
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
189 // Enqueue each constructor/method in the class for compilation.
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
190 for (Constructor<?> constructor : javaClass.getDeclaredConstructors()) {
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents: 10672
diff changeset
191 HotSpotResolvedJavaMethod javaMethod = (HotSpotResolvedJavaMethod) metaAccess.lookupJavaConstructor(constructor);
9108
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
192 if (canBeCompiled(javaMethod, constructor.getModifiers())) {
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
193 compileMethod(javaMethod);
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
194 }
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
195 }
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
196 for (Method method : javaClass.getDeclaredMethods()) {
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents: 10672
diff changeset
197 HotSpotResolvedJavaMethod javaMethod = (HotSpotResolvedJavaMethod) metaAccess.lookupJavaMethod(method);
9108
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
198 if (canBeCompiled(javaMethod, method.getModifiers())) {
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
199 compileMethod(javaMethod);
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
200 }
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
201 }
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
202 }
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
203 } catch (Throwable t) {
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
204 TTY.println("CompileTheWorld (%d) : Skipping %s", classFileCounter, className);
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
205 }
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
206 }
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
207 jarFile.close();
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
208 }
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
209
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
210 TTY.println();
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
211 TTY.println("CompileTheWorld : Done (%d classes, %d methods, %d ms)", classFileCounter, compiledMethodsCounter, compileTime);
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
212 }
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
213
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
214 /**
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
215 * Helper method to schedule a method for compilation and gather some statistics.
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
216 */
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
217 private void compileMethod(HotSpotResolvedJavaMethod method) {
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
218 try {
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
219 long start = System.currentTimeMillis();
10672
e7d07c9bb779 Removed priority compilation queue.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 10543
diff changeset
220 vmToCompiler.compileMethod(method, StructuredGraph.INVOCATION_ENTRY_BCI, true);
9108
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
221 compileTime += (System.currentTimeMillis() - start);
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
222 compiledMethodsCounter++;
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
223 method.reprofile(); // makes the method also not-entrant
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
224 } catch (Throwable t) {
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
225 // Catch everything and print a message
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
226 TTY.println("CompileTheWorld (%d) : Error compiling method: %s", classFileCounter, MetaUtil.format("%H.%n(%p):%r", method));
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
227 t.printStackTrace(TTY.cachedOut);
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
228 }
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
229 }
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
230
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
231 /**
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
232 * Helper method for CompileTheWorld to determine if a method should be compiled (Cf.
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
233 * CompilationPolicy::can_be_compiled).
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
234 *
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
235 * @return true if it can be compiled, false otherwise
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
236 */
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
237 private static boolean canBeCompiled(HotSpotResolvedJavaMethod javaMethod, int modifiers) {
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
238 if (Modifier.isAbstract(modifiers) || Modifier.isNative(modifiers)) {
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
239 return false;
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
240 }
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
241 // This number is from HotSpot:
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
242 final int hugeMethodLimit = 8000;
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
243 if (javaMethod.getCodeSize() > hugeMethodLimit) {
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
244 return false;
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
245 }
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
246 // Skip @Snippets for now
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
247 if (javaMethod.getAnnotation(Snippet.class) != null) {
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
248 return false;
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
249 }
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
250 return true;
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
251 }
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
252
b78686983a75 GRAAL-218: add CompileTheWorld functionality
twisti
parents:
diff changeset
253 }