# HG changeset patch # User Doug Simon # Date 1340885430 -7200 # Node ID 42f3dac334f9c2f30db483cebb88db3f7108014c # Parent 4e5828456c287040bc101ea46c797d3d6119d785# Parent 1d2eeb28537f076197d3e0b39bc757be7368a40a Merge. diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/CodeUtil.java --- a/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/CodeUtil.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/CodeUtil.java Thu Jun 28 14:10:30 2012 +0200 @@ -22,42 +22,17 @@ */ package com.oracle.graal.api.code; -import static java.lang.reflect.Modifier.*; - -import java.lang.annotation.*; import java.util.*; import com.oracle.graal.api.meta.*; -import com.oracle.graal.api.meta.JavaTypeProfile.*; /** - * Miscellaneous collection of utility methods used in the {@code CRI} project. + * Miscellaneous collection of utility methods used by {@code com.oracle.graal.api.code} and its clients. */ public class CodeUtil { public static final String NEW_LINE = String.format("%n"); - /** - * Gets the annotation of a particular type for a formal parameter of a given method. - * - * @param annotationClass the Class object corresponding to the annotation type - * @param parameterIndex the index of a formal parameter of {@code method} - * @param method the method for which a parameter annotation is being requested - * @return the annotation of type {@code annotationClass} for the formal parameter present, else null - * @throws IndexOutOfBoundsException if {@code parameterIndex} does not denote a formal parameter - */ - public static T getParameterAnnotation(Class annotationClass, int parameterIndex, ResolvedJavaMethod method) { - if (parameterIndex >= 0) { - Annotation[][] parameterAnnotations = method.getParameterAnnotations(); - for (Annotation a : parameterAnnotations[parameterIndex]) { - if (a.annotationType() == annotationClass) { - return annotationClass.cast(a); - } - } - } - return null; - } - public static final int K = 1024; public static final int M = 1024 * 1024; @@ -113,197 +88,6 @@ } /** - * Gets a string for a given method formatted according to a given format specification. A format specification is - * composed of characters that are to be copied verbatim to the result and specifiers that denote an attribute of - * the method that is to be copied to the result. A specifier is a single character preceded by a '%' character. The - * accepted specifiers and the method attributes they denote are described below: - * - *
-     *     Specifier | Description                                          | Example(s)
-     *     ----------+------------------------------------------------------------------------------------------
-     *     'R'       | Qualified return type                                | "int" "java.lang.String"
-     *     'r'       | Unqualified return type                              | "int" "String"
-     *     'H'       | Qualified holder                                     | "java.util.Map.Entry"
-     *     'h'       | Unqualified holder                                   | "Entry"
-     *     'n'       | Method name                                          | "add"
-     *     'P'       | Qualified parameter types, separated by ', '         | "int, java.lang.String"
-     *     'p'       | Unqualified parameter types, separated by ', '       | "int, String"
-     *     'f'       | Indicator if method is unresolved, static or virtual | "unresolved" "static" "virtual"
-     *     '%'       | A '%' character                                      | "%"
-     * 
- * - * @param format a format specification - * @param method the method to be formatted - * @return the result of formatting this method according to {@code format} - * @throws IllegalFormatException if an illegal specifier is encountered in {@code format} - */ - public static String format(String format, JavaMethod method) throws IllegalFormatException { - final StringBuilder sb = new StringBuilder(); - int index = 0; - Signature sig = null; - while (index < format.length()) { - final char ch = format.charAt(index++); - if (ch == '%') { - if (index >= format.length()) { - throw new UnknownFormatConversionException("An unquoted '%' character cannot terminate a method format specification"); - } - final char specifier = format.charAt(index++); - boolean qualified = false; - switch (specifier) { - case 'R': - qualified = true; - // fall through - case 'r': { - if (sig == null) { - sig = method.signature(); - } - sb.append(MetaUtil.toJavaName(sig.returnType(null), qualified)); - break; - } - case 'H': - qualified = true; - // fall through - case 'h': { - sb.append(MetaUtil.toJavaName(method.holder(), qualified)); - break; - } - case 'n': { - sb.append(method.name()); - break; - } - case 'P': - qualified = true; - // fall through - case 'p': { - if (sig == null) { - sig = method.signature(); - } - for (int i = 0; i < sig.argumentCount(false); i++) { - if (i != 0) { - sb.append(", "); - } - sb.append(MetaUtil.toJavaName(sig.argumentTypeAt(i, null), qualified)); - } - break; - } - case 'f': { - sb.append(!(method instanceof ResolvedJavaMethod) ? "unresolved" : isStatic(((ResolvedJavaMethod) method).accessFlags()) ? "static" : "virtual"); - break; - } - case '%': { - sb.append('%'); - break; - } - default: { - throw new UnknownFormatConversionException(String.valueOf(specifier)); - } - } - } else { - sb.append(ch); - } - } - return sb.toString(); - } - - /** - * Gets a string for a given field formatted according to a given format specification. A format specification is - * composed of characters that are to be copied verbatim to the result and specifiers that denote an attribute of - * the field that is to be copied to the result. A specifier is a single character preceded by a '%' character. The - * accepted specifiers and the field attributes they denote are described below: - * - *
-     *     Specifier | Description                                          | Example(s)
-     *     ----------+------------------------------------------------------------------------------------------
-     *     'T'       | Qualified type                                       | "int" "java.lang.String"
-     *     't'       | Unqualified type                                     | "int" "String"
-     *     'H'       | Qualified holder                                     | "java.util.Map.Entry"
-     *     'h'       | Unqualified holder                                   | "Entry"
-     *     'n'       | Field name                                           | "age"
-     *     'f'       | Indicator if field is unresolved, static or instance | "unresolved" "static" "instance"
-     *     '%'       | A '%' character                                      | "%"
-     * 
- * - * @param format a format specification - * @param field the field to be formatted - * @return the result of formatting this field according to {@code format} - * @throws IllegalFormatException if an illegal specifier is encountered in {@code format} - */ - public static String format(String format, JavaField field) throws IllegalFormatException { - final StringBuilder sb = new StringBuilder(); - int index = 0; - JavaType type = field.type(); - while (index < format.length()) { - final char ch = format.charAt(index++); - if (ch == '%') { - if (index >= format.length()) { - throw new UnknownFormatConversionException("An unquoted '%' character cannot terminate a field format specification"); - } - final char specifier = format.charAt(index++); - boolean qualified = false; - switch (specifier) { - case 'T': - qualified = true; - // fall through - case 't': { - sb.append(MetaUtil.toJavaName(type, qualified)); - break; - } - case 'H': - qualified = true; - // fall through - case 'h': { - sb.append(MetaUtil.toJavaName(field.holder(), qualified)); - break; - } - case 'n': { - sb.append(field.name()); - break; - } - case 'f': { - sb.append(!(field instanceof ResolvedJavaField) ? "unresolved" : isStatic(((ResolvedJavaField) field).accessFlags()) ? "static" : "instance"); - break; - } - case '%': { - sb.append('%'); - break; - } - default: { - throw new UnknownFormatConversionException(String.valueOf(specifier)); - } - } - } else { - sb.append(ch); - } - } - return sb.toString(); - } - - /** - * Converts a Java source-language class name into the internal form. - * - * @param className the class name - * @return the internal name form of the class name - */ - public static String toInternalName(String className) { - return "L" + className.replace('.', '/') + ";"; - } - - /** - * Prepends the String {@code indentation} to every line in String {@code lines}, including a possibly non-empty - * line following the final newline. - */ - public static String indent(String lines, String indentation) { - if (lines.length() == 0) { - return lines; - } - final String newLine = "\n"; - if (lines.endsWith(newLine)) { - return indentation + (lines.substring(0, lines.length() - 1)).replace(newLine, newLine + indentation) + newLine; - } - return indentation + lines.replace(newLine, newLine + indentation); - } - - /** * Formats the values in a frame as a tabulated string. * * @param frame @@ -391,49 +175,6 @@ } /** - * Convenient shortcut for calling {@link #appendLocation(StringBuilder, ResolvedJavaMethod, int)} without having to supply a - * a {@link StringBuilder} instance and convert the result to a string. - */ - public static String toLocation(ResolvedJavaMethod method, int bci) { - return appendLocation(new StringBuilder(), method, bci).toString(); - } - - /** - * Appends a string representation of a location specified by a given method and bci to a given - * {@link StringBuilder}. If a stack trace element with a non-null file name and non-negative line number is - * {@linkplain ResolvedJavaMethod#toStackTraceElement(int) available} for the given method, then the string returned is the - * {@link StackTraceElement#toString()} value of the stack trace element, suffixed by the bci location. For example: - * - *
-     *     java.lang.String.valueOf(String.java:2930) [bci: 12]
-     * 
- * - * Otherwise, the string returned is the value of {@code CiUtil.format("%H.%n(%p)"}, suffixed by the bci location. - * For example: - * - *
-     *     java.lang.String.valueOf(int) [bci: 12]
-     * 
- * - * @param sb - * @param method - * @param bci - */ - public static StringBuilder appendLocation(StringBuilder sb, ResolvedJavaMethod method, int bci) { - if (method != null) { - StackTraceElement ste = method.toStackTraceElement(bci); - if (ste.getFileName() != null && ste.getLineNumber() > 0) { - sb.append(ste); - } else { - sb.append(CodeUtil.format("%H.%n(%p)", method)); - } - } else { - sb.append("Null method"); - } - return sb.append(" [bci: ").append(bci).append(']'); - } - - /** * Appends a formatted code position to a {@link StringBuilder}. * * @param sb the {@link StringBuilder} to append to @@ -441,7 +182,7 @@ * @return the value of {@code sb} */ public static StringBuilder append(StringBuilder sb, BytecodePosition pos) { - appendLocation(sb.append("at "), pos.getMethod(), pos.getBCI()); + MetaUtil.appendLocation(sb.append("at "), pos.getMethod(), pos.getBCI()); if (pos.getCaller() != null) { sb.append(NEW_LINE); append(sb, pos.getCaller()); @@ -457,7 +198,7 @@ * @return the value of {@code sb} */ public static StringBuilder append(StringBuilder sb, BytecodeFrame frame) { - appendLocation(sb.append("at "), frame.getMethod(), frame.getBCI()); + MetaUtil.appendLocation(sb.append("at "), frame.getMethod(), frame.getBCI()); if (frame.values != null && frame.values.length > 0) { sb.append(NEW_LINE); String table = tabulateValues(frame); @@ -563,103 +304,4 @@ } return sb; } - - public static Kind[] signatureToKinds(ResolvedJavaMethod method) { - Kind receiver = isStatic(method.accessFlags()) ? null : method.holder().kind(); - return signatureToKinds(method.signature(), receiver); - } - - public static Kind[] signatureToKinds(Signature signature, Kind receiverKind) { - int args = signature.argumentCount(false); - Kind[] result; - int i = 0; - if (receiverKind != null) { - result = new Kind[args + 1]; - result[0] = receiverKind; - i = 1; - } else { - result = new Kind[args]; - } - for (int j = 0; j < args; j++) { - result[i + j] = signature.argumentKindAt(j); - } - return result; - } - - public static Class< ? >[] signatureToTypes(Signature signature, ResolvedJavaType accessingClass) { - int count = signature.argumentCount(false); - Class< ? >[] result = new Class< ? >[count]; - for (int i = 0; i < result.length; ++i) { - result[i] = signature.argumentTypeAt(i, accessingClass).resolve(accessingClass).toJava(); - } - return result; - } - - /** - * Formats some profiling information associated as a string. - * - * @param info the profiling info to format - * @param method an optional method that augments the profile string returned - * @param sep the separator to use for each separate profile record - */ - public static String profileToString(ProfilingInfo info, ResolvedJavaMethod method, String sep) { - StringBuilder buf = new StringBuilder(100); - if (method != null) { - buf.append(String.format("canBeStaticallyBound: %b%s", method.canBeStaticallyBound(), sep)). - append(String.format("invocationCount: %d%s", method.invocationCount(), sep)); - } - for (int i = 0; i < info.codeSize(); i++) { - if (info.getExecutionCount(i) != -1) { - buf.append(String.format("executionCount@%d: %d%s", i, info.getExecutionCount(i), sep)); - } - - if (info.getBranchTakenProbability(i) != -1) { - buf.append(String.format("branchProbability@%d: %.3f%s", i, info.getBranchTakenProbability(i), sep)); - } - - double[] switchProbabilities = info.getSwitchProbabilities(i); - if (switchProbabilities != null) { - buf.append(String.format("switchProbabilities@%d:", i)); - for (int j = 0; j < switchProbabilities.length; j++) { - buf.append(String.format(" %.3f", switchProbabilities[j])); - } - buf.append(sep); - } - - if (info.getExceptionSeen(i) != ExceptionSeen.FALSE) { - buf.append(String.format("exceptionSeen@%d: %s%s", i, info.getExceptionSeen(i).name(), sep)); - } - - JavaTypeProfile typeProfile = info.getTypeProfile(i); - if (typeProfile != null) { - ProfiledType[] ptypes = typeProfile.getTypes(); - if (ptypes != null) { - buf.append(String.format("types@%d:", i)); - for (int j = 0; j < ptypes.length; j++) { - ProfiledType ptype = ptypes[j]; - buf.append(String.format(" %.3f (%s)%s", ptype.probability, ptype.type, sep)); - } - buf.append(String.format(" %.3f %s", typeProfile.getNotRecordedProbability(), sep)); - } - } - } - - boolean firstDeoptReason = true; - for (DeoptimizationReason reason: DeoptimizationReason.values()) { - int count = info.getDeoptimizationCount(reason); - if (count > 0) { - if (firstDeoptReason) { - buf.append("deoptimization history").append(sep); - firstDeoptReason = false; - } - buf.append(String.format(" %s: %d%s", reason.name(), count, sep)); - } - } - if (buf.length() == 0) { - return ""; - } - String s = buf.toString(); - assert s.endsWith(sep); - return s.substring(0, s.length() - sep.length()); - } } diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/CompilationResult.java --- a/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/CompilationResult.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/CompilationResult.java Thu Jun 28 14:10:30 2012 +0200 @@ -519,7 +519,7 @@ appendRefMap(sb, "registerMap", info.getRegisterRefMap()); BytecodePosition codePos = info.getBytecodePosition(); if (codePos != null) { - CodeUtil.appendLocation(sb.append(" "), codePos.getMethod(), codePos.getBCI()); + MetaUtil.appendLocation(sb.append(" "), codePos.getMethod(), codePos.getBCI()); if (info.hasFrame()) { sb.append(" #locals=").append(info.frame().numLocals).append(" #expr=").append(info.frame().numStack); if (info.frame().numLocks > 0) { diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/TypeCheckHints.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/TypeCheckHints.java Thu Jun 28 14:10:30 2012 +0200 @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.graal.api.code; + +import java.lang.reflect.*; +import java.util.*; + +import com.oracle.graal.api.meta.*; +import com.oracle.graal.api.meta.JavaTypeProfile.*; + +/** + * Utility for deriving hint types for a type check instruction (e.g. checkcast or instanceof) + * based on the target type of the check and any profiling information available for the instruction. + */ +public class TypeCheckHints { + + private static final ResolvedJavaType[] NO_TYPES = {}; + + /** + * If true, then {@link #types} contains the only possible type that could pass the type check + * because the target of the type check is a final class or has been speculated to be a final class. + */ + public final boolean exact; + + /** + * The most likely types that the type check instruction will see. + */ + public final ResolvedJavaType[] types; + + /** + * Derives hint information for use when generating the code for a type check instruction. + * + * @param type the target type of the type check + * @param profile the profiling information available for the instruction (if any) + * @param assumptions the object in which speculations are recorded. This is null if speculations are not supported. + * @param minHintHitProbability if the probability that the type check will hit one the profiled types (up to + * {@code maxHints}) is below this value, then {@link #types} will be null + * @param maxHints the maximum length of {@link #types} + */ + public TypeCheckHints(ResolvedJavaType type, JavaTypeProfile profile, Assumptions assumptions, double minHintHitProbability, int maxHints) { + if (type != null && isFinalClass(type)) { + types = new ResolvedJavaType[] {type}; + exact = true; + } else { + ResolvedJavaType uniqueSubtype = type == null ? null : type.uniqueConcreteSubtype(); + if (uniqueSubtype != null) { + types = new ResolvedJavaType[] {uniqueSubtype}; + if (assumptions != null) { + assumptions.recordConcreteSubtype(type, uniqueSubtype); + exact = true; + } else { + exact = false; + } + } else { + exact = false; + ResolvedJavaType[] hintTypes = NO_TYPES; + JavaTypeProfile typeProfile = profile; + if (typeProfile != null) { + double notRecordedTypes = typeProfile.getNotRecordedProbability(); + ProfiledType[] ptypes = typeProfile.getTypes(); + if (notRecordedTypes < (1D - minHintHitProbability) && ptypes != null && ptypes.length > 0) { + hintTypes = new ResolvedJavaType[ptypes.length]; + int hintCount = 0; + double totalHintProbability = 0.0d; + for (ProfiledType ptype : ptypes) { + ResolvedJavaType hint = ptype.type; + if (type != null && hint.isSubtypeOf(type)) { + hintTypes[hintCount++] = hint; + totalHintProbability += ptype.probability; + } + } + if (totalHintProbability >= minHintHitProbability) { + if (hintTypes.length != hintCount || hintCount > maxHints) { + hintTypes = Arrays.copyOf(hintTypes, Math.min(maxHints, hintCount)); + } + } else { + hintTypes = NO_TYPES; + } + + } + } + this.types = hintTypes; + } + } + } + + public static boolean isFinalClass(ResolvedJavaType type) { + return Modifier.isFinal(type.accessFlags()) || (type.isArrayClass() && Modifier.isFinal(type.componentType().accessFlags())); + } +} diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/DefaultProfilingInfo.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/DefaultProfilingInfo.java Thu Jun 28 14:10:30 2012 +0200 @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.graal.api.meta; + + +/** + * An implementation of {@link ProfilingInfo} that can used in the absence of real profile information. + */ +public final class DefaultProfilingInfo implements ProfilingInfo { + private static final ProfilingInfo[] NO_PROFILING_INFO = new ProfilingInfo[] { + new DefaultProfilingInfo(ExceptionSeen.TRUE), + new DefaultProfilingInfo(ExceptionSeen.FALSE), + new DefaultProfilingInfo(ExceptionSeen.NOT_SUPPORTED) + }; + + private final ExceptionSeen exceptionSeen; + + DefaultProfilingInfo(ExceptionSeen exceptionSeen) { + this.exceptionSeen = exceptionSeen; + } + + @Override + public int codeSize() { + return 0; + } + + @Override + public JavaTypeProfile getTypeProfile(int bci) { + return null; + } + + @Override + public double getBranchTakenProbability(int bci) { + return -1; + } + + @Override + public double[] getSwitchProbabilities(int bci) { + return null; + } + + @Override + public ExceptionSeen getExceptionSeen(int bci) { + return exceptionSeen; + } + + @Override + public int getExecutionCount(int bci) { + return -1; + } + + public static ProfilingInfo get(ExceptionSeen exceptionSeen) { + return NO_PROFILING_INFO[exceptionSeen.ordinal()]; + } + + @Override + public int getDeoptimizationCount(DeoptimizationReason reason) { + return 0; + } + + @Override + public String toString() { + return "BaseProfilingInfo<" + MetaUtil.profileToString(this, null, "; ") + ">"; + } +} diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/MetaUtil.java --- a/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/MetaUtil.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/MetaUtil.java Thu Jun 28 14:10:30 2012 +0200 @@ -22,8 +22,18 @@ */ package com.oracle.graal.api.meta; +import static java.lang.reflect.Modifier.*; +import java.lang.annotation.*; +import java.util.*; + +import com.oracle.graal.api.meta.JavaTypeProfile.ProfiledType; + +/** + * Miscellaneous collection of utility methods used by {@code com.oracle.graal.api.meta} and its clients. + */ public class MetaUtil { + /** * Extends the functionality of {@link Class#getSimpleName()} to include a non-empty string for anonymous and local * classes. @@ -76,16 +86,16 @@ * boolean[][] * * - * @param riType the type to be converted to a Java name + * @param type the type to be converted to a Java name * @param qualified specifies if the package prefix of the type should be included in the returned name - * @return the Java name corresponding to {@code riType} + * @return the Java name corresponding to {@code type} */ - public static String toJavaName(JavaType riType, boolean qualified) { - Kind kind = riType.kind(); + public static String toJavaName(JavaType type, boolean qualified) { + Kind kind = type.kind(); if (kind.isObject()) { - return internalNameToJava(riType.name(), qualified); + return internalNameToJava(type.name(), qualified); } - return riType.kind().javaName; + return type.kind().javaName; } /** @@ -98,11 +108,11 @@ * boolean[][] * * - * @param riType the type to be converted to a Java name - * @return the Java name corresponding to {@code riType} + * @param type the type to be converted to a Java name + * @return the Java name corresponding to {@code type} */ - public static String toJavaName(JavaType riType) { - return (riType == null) ? null : internalNameToJava(riType.name(), true); + public static String toJavaName(JavaType type) { + return (type == null) ? null : internalNameToJava(type.name(), true); } public static String internalNameToJava(String name, boolean qualified) { @@ -127,4 +137,369 @@ return Kind.fromPrimitiveOrVoidTypeChar(name.charAt(0)).javaName; } } + + + /** + * Gets a string for a given method formatted according to a given format specification. A format specification is + * composed of characters that are to be copied verbatim to the result and specifiers that denote an attribute of + * the method that is to be copied to the result. A specifier is a single character preceded by a '%' character. The + * accepted specifiers and the method attributes they denote are described below: + * + *
+     *     Specifier | Description                                          | Example(s)
+     *     ----------+------------------------------------------------------------------------------------------
+     *     'R'       | Qualified return type                                | "int" "java.lang.String"
+     *     'r'       | Unqualified return type                              | "int" "String"
+     *     'H'       | Qualified holder                                     | "java.util.Map.Entry"
+     *     'h'       | Unqualified holder                                   | "Entry"
+     *     'n'       | Method name                                          | "add"
+     *     'P'       | Qualified parameter types, separated by ', '         | "int, java.lang.String"
+     *     'p'       | Unqualified parameter types, separated by ', '       | "int, String"
+     *     'f'       | Indicator if method is unresolved, static or virtual | "unresolved" "static" "virtual"
+     *     '%'       | A '%' character                                      | "%"
+     * 
+ * + * @param format a format specification + * @param method the method to be formatted + * @return the result of formatting this method according to {@code format} + * @throws IllegalFormatException if an illegal specifier is encountered in {@code format} + */ + public static String format(String format, JavaMethod method) throws IllegalFormatException { + final StringBuilder sb = new StringBuilder(); + int index = 0; + Signature sig = null; + while (index < format.length()) { + final char ch = format.charAt(index++); + if (ch == '%') { + if (index >= format.length()) { + throw new UnknownFormatConversionException("An unquoted '%' character cannot terminate a method format specification"); + } + final char specifier = format.charAt(index++); + boolean qualified = false; + switch (specifier) { + case 'R': + qualified = true; + // fall through + case 'r': { + if (sig == null) { + sig = method.signature(); + } + sb.append(toJavaName(sig.returnType(null), qualified)); + break; + } + case 'H': + qualified = true; + // fall through + case 'h': { + sb.append(toJavaName(method.holder(), qualified)); + break; + } + case 'n': { + sb.append(method.name()); + break; + } + case 'P': + qualified = true; + // fall through + case 'p': { + if (sig == null) { + sig = method.signature(); + } + for (int i = 0; i < sig.argumentCount(false); i++) { + if (i != 0) { + sb.append(", "); + } + sb.append(toJavaName(sig.argumentTypeAt(i, null), qualified)); + } + break; + } + case 'f': { + sb.append(!(method instanceof ResolvedJavaMethod) ? "unresolved" : isStatic(((ResolvedJavaMethod) method).accessFlags()) ? "static" : "virtual"); + break; + } + case '%': { + sb.append('%'); + break; + } + default: { + throw new UnknownFormatConversionException(String.valueOf(specifier)); + } + } + } else { + sb.append(ch); + } + } + return sb.toString(); + } + + + /** + * Gets a string for a given field formatted according to a given format specification. A format specification is + * composed of characters that are to be copied verbatim to the result and specifiers that denote an attribute of + * the field that is to be copied to the result. A specifier is a single character preceded by a '%' character. The + * accepted specifiers and the field attributes they denote are described below: + * + *
+     *     Specifier | Description                                          | Example(s)
+     *     ----------+------------------------------------------------------------------------------------------
+     *     'T'       | Qualified type                                       | "int" "java.lang.String"
+     *     't'       | Unqualified type                                     | "int" "String"
+     *     'H'       | Qualified holder                                     | "java.util.Map.Entry"
+     *     'h'       | Unqualified holder                                   | "Entry"
+     *     'n'       | Field name                                           | "age"
+     *     'f'       | Indicator if field is unresolved, static or instance | "unresolved" "static" "instance"
+     *     '%'       | A '%' character                                      | "%"
+     * 
+ * + * @param format a format specification + * @param field the field to be formatted + * @return the result of formatting this field according to {@code format} + * @throws IllegalFormatException if an illegal specifier is encountered in {@code format} + */ + public static String format(String format, JavaField field) throws IllegalFormatException { + final StringBuilder sb = new StringBuilder(); + int index = 0; + JavaType type = field.type(); + while (index < format.length()) { + final char ch = format.charAt(index++); + if (ch == '%') { + if (index >= format.length()) { + throw new UnknownFormatConversionException("An unquoted '%' character cannot terminate a field format specification"); + } + final char specifier = format.charAt(index++); + boolean qualified = false; + switch (specifier) { + case 'T': + qualified = true; + // fall through + case 't': { + sb.append(toJavaName(type, qualified)); + break; + } + case 'H': + qualified = true; + // fall through + case 'h': { + sb.append(toJavaName(field.holder(), qualified)); + break; + } + case 'n': { + sb.append(field.name()); + break; + } + case 'f': { + sb.append(!(field instanceof ResolvedJavaField) ? "unresolved" : isStatic(((ResolvedJavaField) field).accessFlags()) ? "static" : "instance"); + break; + } + case '%': { + sb.append('%'); + break; + } + default: { + throw new UnknownFormatConversionException(String.valueOf(specifier)); + } + } + } else { + sb.append(ch); + } + } + return sb.toString(); + } + + + /** + * Gets the annotation of a particular type for a formal parameter of a given method. + * + * @param annotationClass the Class object corresponding to the annotation type + * @param parameterIndex the index of a formal parameter of {@code method} + * @param method the method for which a parameter annotation is being requested + * @return the annotation of type {@code annotationClass} for the formal parameter present, else null + * @throws IndexOutOfBoundsException if {@code parameterIndex} does not denote a formal parameter + */ + public static T getParameterAnnotation(Class annotationClass, int parameterIndex, ResolvedJavaMethod method) { + if (parameterIndex >= 0) { + Annotation[][] parameterAnnotations = method.getParameterAnnotations(); + for (Annotation a : parameterAnnotations[parameterIndex]) { + if (a.annotationType() == annotationClass) { + return annotationClass.cast(a); + } + } + } + return null; + } + + + /** + * Convenient shortcut for calling {@link #appendLocation(StringBuilder, ResolvedJavaMethod, int)} without having to supply a + * a {@link StringBuilder} instance and convert the result to a string. + */ + public static String toLocation(ResolvedJavaMethod method, int bci) { + return appendLocation(new StringBuilder(), method, bci).toString(); + } + + + /** + * Appends a string representation of a location specified by a given method and bci to a given + * {@link StringBuilder}. If a stack trace element with a non-null file name and non-negative line number is + * {@linkplain ResolvedJavaMethod#toStackTraceElement(int) available} for the given method, then the string returned is the + * {@link StackTraceElement#toString()} value of the stack trace element, suffixed by the bci location. For example: + * + *
+     *     java.lang.String.valueOf(String.java:2930) [bci: 12]
+     * 
+ * + * Otherwise, the string returned is the value of {@code CiUtil.format("%H.%n(%p)"}, suffixed by the bci location. + * For example: + * + *
+     *     java.lang.String.valueOf(int) [bci: 12]
+     * 
+ * + * @param sb + * @param method + * @param bci + */ + public static StringBuilder appendLocation(StringBuilder sb, ResolvedJavaMethod method, int bci) { + if (method != null) { + StackTraceElement ste = method.toStackTraceElement(bci); + if (ste.getFileName() != null && ste.getLineNumber() > 0) { + sb.append(ste); + } else { + sb.append(format("%H.%n(%p)", method)); + } + } else { + sb.append("Null method"); + } + return sb.append(" [bci: ").append(bci).append(']'); + } + + + public static Kind[] signatureToKinds(ResolvedJavaMethod method) { + Kind receiver = isStatic(method.accessFlags()) ? null : method.holder().kind(); + return signatureToKinds(method.signature(), receiver); + } + + + public static Kind[] signatureToKinds(Signature signature, Kind receiverKind) { + int args = signature.argumentCount(false); + Kind[] result; + int i = 0; + if (receiverKind != null) { + result = new Kind[args + 1]; + result[0] = receiverKind; + i = 1; + } else { + result = new Kind[args]; + } + for (int j = 0; j < args; j++) { + result[i + j] = signature.argumentKindAt(j); + } + return result; + } + + + public static Class< ? >[] signatureToTypes(Signature signature, ResolvedJavaType accessingClass) { + int count = signature.argumentCount(false); + Class< ? >[] result = new Class< ? >[count]; + for (int i = 0; i < result.length; ++i) { + result[i] = signature.argumentTypeAt(i, accessingClass).resolve(accessingClass).toJava(); + } + return result; + } + + + /** + * Formats some profiling information associated as a string. + * + * @param info the profiling info to format + * @param method an optional method that augments the profile string returned + * @param sep the separator to use for each separate profile record + */ + public static String profileToString(ProfilingInfo info, ResolvedJavaMethod method, String sep) { + StringBuilder buf = new StringBuilder(100); + if (method != null) { + buf.append(String.format("canBeStaticallyBound: %b%s", method.canBeStaticallyBound(), sep)). + append(String.format("invocationCount: %d%s", method.invocationCount(), sep)); + } + for (int i = 0; i < info.codeSize(); i++) { + if (info.getExecutionCount(i) != -1) { + buf.append(String.format("executionCount@%d: %d%s", i, info.getExecutionCount(i), sep)); + } + + if (info.getBranchTakenProbability(i) != -1) { + buf.append(String.format("branchProbability@%d: %.3f%s", i, info.getBranchTakenProbability(i), sep)); + } + + double[] switchProbabilities = info.getSwitchProbabilities(i); + if (switchProbabilities != null) { + buf.append(String.format("switchProbabilities@%d:", i)); + for (int j = 0; j < switchProbabilities.length; j++) { + buf.append(String.format(" %.3f", switchProbabilities[j])); + } + buf.append(sep); + } + + if (info.getExceptionSeen(i) != ExceptionSeen.FALSE) { + buf.append(String.format("exceptionSeen@%d: %s%s", i, info.getExceptionSeen(i).name(), sep)); + } + + JavaTypeProfile typeProfile = info.getTypeProfile(i); + if (typeProfile != null) { + ProfiledType[] ptypes = typeProfile.getTypes(); + if (ptypes != null) { + buf.append(String.format("types@%d:", i)); + for (int j = 0; j < ptypes.length; j++) { + ProfiledType ptype = ptypes[j]; + buf.append(String.format(" %.3f (%s)%s", ptype.probability, ptype.type, sep)); + } + buf.append(String.format(" %.3f %s", typeProfile.getNotRecordedProbability(), sep)); + } + } + } + + boolean firstDeoptReason = true; + for (DeoptimizationReason reason: DeoptimizationReason.values()) { + int count = info.getDeoptimizationCount(reason); + if (count > 0) { + if (firstDeoptReason) { + buf.append("deoptimization history").append(sep); + firstDeoptReason = false; + } + buf.append(String.format(" %s: %d%s", reason.name(), count, sep)); + } + } + if (buf.length() == 0) { + return ""; + } + String s = buf.toString(); + assert s.endsWith(sep); + return s.substring(0, s.length() - sep.length()); + } + + + /** + * Converts a Java source-language class name into the internal form. + * + * @param className the class name + * @return the internal name form of the class name + */ + public static String toInternalName(String className) { + return "L" + className.replace('.', '/') + ";"; + } + + + /** + * Prepends the String {@code indentation} to every line in String {@code lines}, including a possibly non-empty + * line following the final newline. + */ + public static String indent(String lines, String indentation) { + if (lines.length() == 0) { + return lines; + } + final String newLine = "\n"; + if (lines.endsWith(newLine)) { + return indentation + (lines.substring(0, lines.length() - 1)).replace(newLine, newLine + indentation) + newLine; + } + return indentation + lines.replace(newLine, newLine + indentation); + } } diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/UnresolvedField.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/UnresolvedField.java Thu Jun 28 14:10:30 2012 +0200 @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.graal.api.meta; + + +/** + * A implementation of {@link JavaField} for an unresolved field. + */ +public class UnresolvedField implements JavaField { + + public final String name; + public final JavaType holder; + public final JavaType type; + + public UnresolvedField(JavaType holder, String name, JavaType type) { + this.name = name; + this.type = type; + this.holder = holder; + } + + public String name() { + return name; + } + + public JavaType type() { + return type; + } + + public Kind kind() { + return type.kind(); + } + + public JavaType holder() { + return holder; + } + + @Override + public int hashCode() { + return System.identityHashCode(this); + } + + @Override + public boolean equals(Object o) { + return o == this; + } + + /** + * Converts this compiler interface field to a string. + */ + @Override + public String toString() { + return MetaUtil.format("%H.%n [unresolved]", this); + } +} diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/UnresolvedMethod.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/UnresolvedMethod.java Thu Jun 28 14:10:30 2012 +0200 @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.graal.api.meta; + + +/** + * A implementation of {@link JavaMethod} for an unresolved method. + */ +public class UnresolvedMethod implements JavaMethod { + + public final String name; + public final JavaType holder; + public final Signature signature; + + public UnresolvedMethod(JavaType holder, String name, Signature signature) { + this.name = name; + this.holder = holder; + this.signature = signature; + } + + public String name() { + return name; + } + + public JavaType holder() { + return holder; + } + + public Signature signature() { + return signature; + } + + @Override + public int hashCode() { + return System.identityHashCode(this); + } + + @Override + public boolean equals(Object o) { + return o == this; + } + + @Override + public String toString() { + return MetaUtil.format("%H.%n(%p) [unresolved]", this); + } +} diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Thu Jun 28 14:10:30 2012 +0200 @@ -36,12 +36,12 @@ import com.oracle.graal.compiler.schedule.*; import com.oracle.graal.compiler.target.*; import com.oracle.graal.compiler.types.*; -import com.oracle.graal.cri.*; import com.oracle.graal.debug.*; import com.oracle.graal.lir.*; import com.oracle.graal.lir.asm.*; import com.oracle.graal.lir.cfg.*; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.spi.*; import com.oracle.max.cri.xir.*; public class GraalCompiler { @@ -54,7 +54,7 @@ /** * The runtime that this compiler has been configured for. */ - public final ExtendedRiRuntime runtime; + public final GraalCodeCacheProvider runtime; /** * The XIR generator that lowers Java operations to machine operations. @@ -66,7 +66,7 @@ */ public final Backend backend; - public GraalCompiler(ExtendedRiRuntime runtime, TargetDescription target, Backend backend, RiXirGenerator xirGen) { + public GraalCompiler(GraalCodeCacheProvider runtime, TargetDescription target, Backend backend, RiXirGenerator xirGen) { this.runtime = runtime; this.target = target; this.xir = xirGen; @@ -74,7 +74,7 @@ } - public CompilationResult compileMethod(final ResolvedJavaMethod method, final StructuredGraph graph, int osrBCI, final RiGraphCache cache, final PhasePlan plan, final OptimisticOptimizations optimisticOpts) { + public CompilationResult compileMethod(final ResolvedJavaMethod method, final StructuredGraph graph, int osrBCI, final GraphCache cache, final PhasePlan plan, final OptimisticOptimizations optimisticOpts) { assert (method.accessFlags() & Modifier.NATIVE) == 0 : "compiling native methods is not supported"; if (osrBCI != -1) { throw new BailoutException("No OSR supported"); @@ -105,7 +105,7 @@ /** * Builds the graph, optimizes it. */ - public LIR emitHIR(StructuredGraph graph, Assumptions assumptions, RiGraphCache cache, PhasePlan plan, OptimisticOptimizations optimisticOpts) { + public LIR emitHIR(StructuredGraph graph, Assumptions assumptions, GraphCache cache, PhasePlan plan, OptimisticOptimizations optimisticOpts) { if (graph.start().next() == null) { plan.runPhases(PhasePosition.AFTER_PARSING, graph); diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalOptions.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalOptions.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalOptions.java Thu Jun 28 14:10:30 2012 +0200 @@ -262,16 +262,6 @@ public static String HIRLowerCheckcast = ""; public static String HIRLowerNewInstance = ""; - /** - * The profiling info cache directory. - */ - public static String PICache = null; - - /** - * Filters the methods for which profiling info is loaded from/saved to the {@link #PICache}. - */ - public static String PIFilter = null; - static { // turn detailed assertions on when the general assertions are on (misusing the assert keyword for this) assert (DetailedAsserts = true) == true; diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/OptimisticOptimizations.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/OptimisticOptimizations.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/OptimisticOptimizations.java Thu Jun 28 14:10:30 2012 +0200 @@ -24,7 +24,6 @@ import java.util.*; -import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.debug.*; import com.oracle.max.criutils.*; @@ -71,7 +70,7 @@ for (Optimization opt: Optimization.values()) { if (!enabledOpts.contains(opt)) { if (GraalOptions.PrintDisabledOptimisticOptimizations) { - TTY.println("WARN: deactivated optimistic optimization %s for %s", opt.name(), CodeUtil.format("%H.%n(%p)", method)); + TTY.println("WARN: deactivated optimistic optimization %s for %s", opt.name(), MetaUtil.format("%H.%n(%p)", method)); } disabledOptimisticOptsMetric.increment(); } diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java Thu Jun 28 14:10:30 2012 +0200 @@ -509,7 +509,7 @@ } protected void emitPrologue() { - CallingConvention incomingArguments = frameMap.registerConfig.getCallingConvention(JavaCallee, CodeUtil.signatureToKinds(method), target, false); + CallingConvention incomingArguments = frameMap.registerConfig.getCallingConvention(JavaCallee, MetaUtil.signatureToKinds(method), target, false); Value[] params = new Value[incomingArguments.locations.length]; for (int i = 0; i < params.length; i++) { @@ -888,7 +888,7 @@ Value resultOperand = resultOperandFor(x.node().kind()); - Kind[] signature = CodeUtil.signatureToKinds(callTarget.targetMethod().signature(), callTarget.isStatic() ? null : callTarget.targetMethod().holder().kind()); + Kind[] signature = MetaUtil.signatureToKinds(callTarget.targetMethod().signature(), callTarget.isStatic() ? null : callTarget.targetMethod().holder().kind()); CallingConvention cc = frameMap.registerConfig.getCallingConvention(JavaCall, signature, target(), false); frameMap.callsMethod(cc, JavaCall); List argList = visitInvokeArguments(cc, callTarget.arguments()); diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/loop/LoopEx.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/loop/LoopEx.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/loop/LoopEx.java Thu Jun 28 14:10:30 2012 +0200 @@ -22,7 +22,6 @@ */ package com.oracle.graal.compiler.loop; -import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.debug.*; import com.oracle.graal.graph.*; @@ -129,7 +128,7 @@ } BinaryNode result = BinaryNode.reassociate(binary, invariant); if (result != binary) { - Debug.log(CodeUtil.format("%H::%n", Debug.contextLookup(ResolvedJavaMethod.class)) + " : Reassociated %s into %s", binary, result); + Debug.log(MetaUtil.format("%H::%n", Debug.contextLookup(ResolvedJavaMethod.class)) + " : Reassociated %s into %s", binary, result); graph.replaceFloating(binary, result); } } diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/EscapeAnalysisPhase.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/EscapeAnalysisPhase.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/EscapeAnalysisPhase.java Thu Jun 28 14:10:30 2012 +0200 @@ -28,7 +28,6 @@ import com.oracle.graal.compiler.*; import com.oracle.graal.compiler.graph.*; import com.oracle.graal.compiler.util.*; -import com.oracle.graal.cri.*; import com.oracle.graal.debug.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; @@ -191,13 +190,13 @@ } private final TargetDescription target; - private final ExtendedRiRuntime runtime; + private final GraalCodeCacheProvider runtime; private final Assumptions assumptions; - private final RiGraphCache cache; + private final GraphCache cache; private final PhasePlan plan; private final OptimisticOptimizations optimisticOpts; - public EscapeAnalysisPhase(TargetDescription target, ExtendedRiRuntime runtime, Assumptions assumptions, RiGraphCache cache, PhasePlan plan, OptimisticOptimizations optimisticOpts) { + public EscapeAnalysisPhase(TargetDescription target, GraalCodeCacheProvider runtime, Assumptions assumptions, GraphCache cache, PhasePlan plan, OptimisticOptimizations optimisticOpts) { this.runtime = runtime; this.target = target; this.assumptions = assumptions; diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/InliningPhase.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/InliningPhase.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/InliningPhase.java Thu Jun 28 14:10:30 2012 +0200 @@ -33,11 +33,11 @@ import com.oracle.graal.compiler.util.*; import com.oracle.graal.compiler.util.InliningUtil.InlineInfo; import com.oracle.graal.compiler.util.InliningUtil.InliningCallback; -import com.oracle.graal.cri.*; import com.oracle.graal.debug.*; import com.oracle.graal.debug.internal.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.spi.*; public class InliningPhase extends Phase implements InliningCallback { @@ -48,7 +48,7 @@ */ private final TargetDescription target; - private final ExtendedRiRuntime runtime; + private final GraalCodeCacheProvider runtime; private final Collection hints; @@ -56,7 +56,7 @@ private Assumptions assumptions; private final PhasePlan plan; - private final RiGraphCache cache; + private final GraphCache cache; private final WeightComputationPolicy weightComputationPolicy; private final InliningPolicy inliningPolicy; private final OptimisticOptimizations optimisticOpts; @@ -66,7 +66,7 @@ private static final DebugMetric metricInliningConsidered = Debug.metric("InliningConsidered"); private static final DebugMetric metricInliningStoppedByMaxDesiredSize = Debug.metric("InliningStoppedByMaxDesiredSize"); - public InliningPhase(TargetDescription target, ExtendedRiRuntime runtime, Collection hints, Assumptions assumptions, RiGraphCache cache, PhasePlan plan, OptimisticOptimizations optimisticOpts) { + public InliningPhase(TargetDescription target, GraalCodeCacheProvider runtime, Collection hints, Assumptions assumptions, GraphCache cache, PhasePlan plan, OptimisticOptimizations optimisticOpts) { this.target = target; this.runtime = runtime; this.hints = hints; diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/IntrinsificationPhase.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/IntrinsificationPhase.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/IntrinsificationPhase.java Thu Jun 28 14:10:30 2012 +0200 @@ -24,16 +24,16 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.util.*; -import com.oracle.graal.cri.*; import com.oracle.graal.debug.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.spi.*; public class IntrinsificationPhase extends Phase { - private final ExtendedRiRuntime runtime; + private final GraalCodeCacheProvider runtime; - public IntrinsificationPhase(ExtendedRiRuntime runtime) { + public IntrinsificationPhase(GraalCodeCacheProvider runtime) { this.runtime = runtime; } @@ -47,18 +47,18 @@ } } - public static boolean canIntrinsify(Invoke invoke, ResolvedJavaMethod target, ExtendedRiRuntime runtime) { + public static boolean canIntrinsify(Invoke invoke, ResolvedJavaMethod target, GraalCodeCacheProvider runtime) { return getIntrinsicGraph(invoke, target, runtime) != null; } - private static void tryIntrinsify(Invoke invoke, ExtendedRiRuntime runtime) { + private static void tryIntrinsify(Invoke invoke, GraalCodeCacheProvider runtime) { ResolvedJavaMethod target = invoke.callTarget().targetMethod(); if (target != null) { tryIntrinsify(invoke, target, runtime); } } - private static void tryIntrinsify(Invoke invoke, ResolvedJavaMethod target, ExtendedRiRuntime runtime) { + private static void tryIntrinsify(Invoke invoke, ResolvedJavaMethod target, GraalCodeCacheProvider runtime) { StructuredGraph intrinsicGraph = getIntrinsicGraph(invoke, target, runtime); if (intrinsicGraph != null) { Debug.log(" > Intrinsify %s", target); @@ -66,7 +66,7 @@ } } - private static StructuredGraph getIntrinsicGraph(Invoke invoke, ResolvedJavaMethod target, ExtendedRiRuntime runtime) { + private static StructuredGraph getIntrinsicGraph(Invoke invoke, ResolvedJavaMethod target, GraalCodeCacheProvider runtime) { StructuredGraph intrinsicGraph = (StructuredGraph) target.compilerStorage().get(Graph.class); if (intrinsicGraph == null) { // TODO remove once all intrinsics are available via compilerStorage diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/LoopFullUnrollPhase.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/LoopFullUnrollPhase.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/LoopFullUnrollPhase.java Thu Jun 28 14:10:30 2012 +0200 @@ -23,16 +23,16 @@ package com.oracle.graal.compiler.phases; import com.oracle.graal.compiler.loop.*; -import com.oracle.graal.cri.*; import com.oracle.graal.debug.*; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.spi.*; public class LoopFullUnrollPhase extends Phase { private static final DebugMetric FULLY_UNROLLED_LOOPS = Debug.metric("FullUnrolls"); - private final ExtendedRiRuntime runtime; + private final GraalCodeCacheProvider runtime; - public LoopFullUnrollPhase(ExtendedRiRuntime runtime) { + public LoopFullUnrollPhase(GraalCodeCacheProvider runtime) { this.runtime = runtime; } diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/LoweringPhase.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/LoweringPhase.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/LoweringPhase.java Thu Jun 28 14:10:30 2012 +0200 @@ -25,7 +25,6 @@ import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.*; -import com.oracle.graal.cri.*; import com.oracle.graal.debug.*; import com.oracle.graal.graph.*; import com.oracle.graal.lir.cfg.*; @@ -38,10 +37,10 @@ */ public class LoweringPhase extends Phase { - private class LoweringToolBase implements CiLoweringTool { + private class LoweringToolBase implements LoweringTool { @Override - public ExtendedRiRuntime getRuntime() { + public GraalCodeCacheProvider getRuntime() { return runtime; } @@ -72,10 +71,10 @@ } } - private final ExtendedRiRuntime runtime; + private final GraalCodeCacheProvider runtime; private final Assumptions assumptions; - public LoweringPhase(ExtendedRiRuntime runtime, Assumptions assumptions) { + public LoweringPhase(GraalCodeCacheProvider runtime, Assumptions assumptions) { this.runtime = runtime; this.assumptions = assumptions; } @@ -101,7 +100,7 @@ // Step 2: lower the floating nodes processed.negate(); - final CiLoweringTool loweringTool = new LoweringToolBase(); + final LoweringTool loweringTool = new LoweringToolBase(); for (Node node : processed) { if (node instanceof Lowerable) { assert !(node instanceof FixedNode) || node.predecessor() == null : node; @@ -142,7 +141,7 @@ private void process(final Block b, final NodeBitMap activeGuards, NodeBitMap processed, final ValueNode anchor) { - final CiLoweringTool loweringTool = new LoweringToolBase() { + final LoweringTool loweringTool = new LoweringToolBase() { @Override public ValueNode getGuardAnchor() { diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/util/InliningUtil.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/util/InliningUtil.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/util/InliningUtil.java Thu Jun 28 14:10:30 2012 +0200 @@ -31,7 +31,6 @@ import com.oracle.graal.api.meta.JavaTypeProfile.*; import com.oracle.graal.compiler.*; import com.oracle.graal.compiler.phases.*; -import com.oracle.graal.cri.*; import com.oracle.graal.debug.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; @@ -40,6 +39,7 @@ import com.oracle.graal.nodes.extended.*; import com.oracle.graal.nodes.java.*; import com.oracle.graal.nodes.java.MethodCallTargetNode.InvokeKind; +import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; import com.oracle.graal.nodes.util.*; @@ -56,9 +56,9 @@ if (!Debug.isLogEnabled()) { return null; } else if (invoke != null && invoke.stateAfter() != null) { - return methodName(invoke.stateAfter(), invoke.bci()) + ": " + CodeUtil.format("%H.%n(%p):%r", method) + " (" + method.codeSize() + " bytes)"; + return methodName(invoke.stateAfter(), invoke.bci()) + ": " + MetaUtil.format("%H.%n(%p):%r", method) + " (" + method.codeSize() + " bytes)"; } else { - return CodeUtil.format("%H.%n(%p):%r", method) + " (" + method.codeSize() + " bytes)"; + return MetaUtil.format("%H.%n(%p):%r", method) + " (" + method.codeSize() + " bytes)"; } } @@ -78,7 +78,7 @@ sb.append(methodName(frameState.outerFrameState(), frameState.outerFrameState().bci)); sb.append("->"); } - sb.append(CodeUtil.format("%h.%n", frameState.method())); + sb.append(MetaUtil.format("%h.%n", frameState.method())); sb.append("@").append(bci); return sb.toString(); } @@ -125,7 +125,7 @@ * @param runtime * @param callback */ - public abstract void inline(StructuredGraph graph, ExtendedRiRuntime runtime, InliningCallback callback); + public abstract void inline(StructuredGraph graph, GraalCodeCacheProvider runtime, InliningCallback callback); } /** @@ -141,7 +141,7 @@ } @Override - public void inline(StructuredGraph compilerGraph, ExtendedRiRuntime runtime, final InliningCallback callback) { + public void inline(StructuredGraph compilerGraph, GraalCodeCacheProvider runtime, final InliningCallback callback) { StructuredGraph graph = getGraph(concrete, callback); assert !IntrinsificationPhase.canIntrinsify(invoke, concrete, runtime); callback.recordMethodContentsAssumption(concrete); @@ -155,7 +155,7 @@ @Override public String toString() { - return "exact " + CodeUtil.format("%H.%n(%p):%r", concrete); + return "exact " + MetaUtil.format("%H.%n(%p):%r", concrete); } @Override @@ -184,7 +184,7 @@ } @Override - public void inline(StructuredGraph graph, ExtendedRiRuntime runtime, InliningCallback callback) { + public void inline(StructuredGraph graph, GraalCodeCacheProvider runtime, InliningCallback callback) { // receiver null check must be before the type check InliningUtil.receiverNullCheck(invoke); ValueNode receiver = invoke.callTarget().receiver(); @@ -209,7 +209,7 @@ @Override public String toString() { - return "type-checked " + CodeUtil.format("%H.%n(%p):%r", concrete); + return "type-checked " + MetaUtil.format("%H.%n(%p):%r", concrete); } @Override @@ -250,7 +250,7 @@ } @Override - public void inline(StructuredGraph graph, ExtendedRiRuntime runtime, InliningCallback callback) { + public void inline(StructuredGraph graph, GraalCodeCacheProvider runtime, InliningCallback callback) { int numberOfMethods = concretes.size(); boolean hasReturnValue = invoke.node().kind() != Kind.Void; @@ -267,7 +267,7 @@ return notRecordedTypeProbability > 0; } - private void inlineMultipleMethods(StructuredGraph graph, ExtendedRiRuntime runtime, InliningCallback callback, int numberOfMethods, boolean hasReturnValue) { + private void inlineMultipleMethods(StructuredGraph graph, GraalCodeCacheProvider runtime, InliningCallback callback, int numberOfMethods, boolean hasReturnValue) { FixedNode continuation = invoke.next(); // setup merge and phi nodes for results and exceptions @@ -373,7 +373,7 @@ return commonType; } - private void inlineSingleMethod(StructuredGraph graph, ExtendedRiRuntime runtime, InliningCallback callback) { + private void inlineSingleMethod(StructuredGraph graph, GraalCodeCacheProvider runtime, InliningCallback callback) { assert concretes.size() == 1 && ptypes.length > 1 && !shouldFallbackToInvoke() && notRecordedTypeProbability == 0; MergeNode calleeEntryNode = graph.add(new MergeNode()); @@ -487,7 +487,7 @@ StringBuilder builder = new StringBuilder(shouldFallbackToInvoke() ? "megamorphic" : "polymorphic"); builder.append(String.format(", %d methods with %d type checks:", concretes.size(), ptypes.length)); for (int i = 0; i < concretes.size(); i++) { - builder.append(CodeUtil.format(" %H.%n(%p):%r", concretes.get(i))); + builder.append(MetaUtil.format(" %H.%n(%p):%r", concretes.get(i))); } return builder.toString(); } @@ -512,10 +512,10 @@ } @Override - public void inline(StructuredGraph graph, ExtendedRiRuntime runtime, InliningCallback callback) { + public void inline(StructuredGraph graph, GraalCodeCacheProvider runtime, InliningCallback callback) { if (Debug.isLogEnabled()) { - String targetName = CodeUtil.format("%H.%n(%p):%r", invoke.callTarget().targetMethod()); - String concreteName = CodeUtil.format("%H.%n(%p):%r", concrete); + String targetName = MetaUtil.format("%H.%n(%p):%r", invoke.callTarget().targetMethod()); + String concreteName = MetaUtil.format("%H.%n(%p):%r", concrete); Debug.log("recording concrete method assumption: %s on receiver type %s -> %s", targetName, context, concreteName); } callback.recordConcreteMethodAssumption(invoke.callTarget().targetMethod(), context, concrete); @@ -525,7 +525,7 @@ @Override public String toString() { - return "assumption " + CodeUtil.format("%H.%n(%p):%r", concrete); + return "assumption " + MetaUtil.format("%H.%n(%p):%r", concrete); } @Override @@ -542,7 +542,7 @@ * @param callback a callback that is used to determine the weight of a specific inlining * @return an instance of InlineInfo, or null if no inlining is possible at the given invoke */ - public static InlineInfo getInlineInfo(Invoke invoke, int level, ExtendedRiRuntime runtime, Assumptions assumptions, InliningCallback callback, OptimisticOptimizations optimisticOpts) { + public static InlineInfo getInlineInfo(Invoke invoke, int level, GraalCodeCacheProvider runtime, Assumptions assumptions, InliningCallback callback, OptimisticOptimizations optimisticOpts) { ResolvedJavaMethod parent = invoke.stateAfter().method(); MethodCallTargetNode callTarget = invoke.callTarget(); ResolvedJavaMethod targetMethod = callTarget.targetMethod(); diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/CompilationStatistics.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/CompilationStatistics.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/CompilationStatistics.java Thu Jun 28 14:10:30 2012 +0200 @@ -78,9 +78,9 @@ private CompilationStatistics(ResolvedJavaMethod method) { if (method != null) { - holder = CodeUtil.format("%H", method); + holder = MetaUtil.format("%H", method); name = method.name(); - signature = CodeUtil.format("%p", method); + signature = MetaUtil.format("%p", method); startTime = System.nanoTime(); startInvCount = method.invocationCount(); bytecodeCount = method.codeSize(); diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/CompilationTask.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/CompilationTask.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/CompilationTask.java Thu Jun 28 14:10:30 2012 +0200 @@ -131,11 +131,11 @@ } catch (BailoutException bailout) { Debug.metric("Bailouts").increment(); if (GraalOptions.ExitVMOnBailout) { - TTY.cachedOut.println(CodeUtil.format("Bailout in %H.%n(%p)", method)); + TTY.cachedOut.println(MetaUtil.format("Bailout in %H.%n(%p)", method)); bailout.printStackTrace(TTY.cachedOut); System.exit(-1); } else if (GraalOptions.PrintBailout) { - TTY.cachedOut.println(CodeUtil.format("Bailout in %H.%n(%p)", method)); + TTY.cachedOut.println(MetaUtil.format("Bailout in %H.%n(%p)", method)); bailout.printStackTrace(TTY.cachedOut); } } catch (Throwable t) { diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotGraalRuntime.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotGraalRuntime.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotGraalRuntime.java Thu Jun 28 14:10:30 2012 +0200 @@ -28,10 +28,10 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.*; import com.oracle.graal.compiler.target.*; -import com.oracle.graal.cri.*; import com.oracle.graal.hotspot.bridge.*; import com.oracle.graal.hotspot.logging.*; import com.oracle.graal.hotspot.meta.*; +import com.oracle.graal.nodes.spi.*; import com.oracle.max.asm.target.amd64.*; import com.oracle.max.cri.xir.*; @@ -204,7 +204,7 @@ @SuppressWarnings("unchecked") @Override public T getCapability(Class clazz) { - if (clazz == ExtendedRiRuntime.class || clazz == MetaAccessProvider.class) { + if (clazz == GraalCodeCacheProvider.class || clazz == MetaAccessProvider.class) { return (T) getRuntime(); } if (clazz == GraalCompiler.class) { diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/VMToCompilerImpl.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/VMToCompilerImpl.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/VMToCompilerImpl.java Thu Jun 28 14:10:30 2012 +0200 @@ -223,9 +223,9 @@ } private void enqueue(Method m) throws Throwable { - JavaMethod riMethod = compiler.getRuntime().getResolvedJavaMethod(m); - assert !Modifier.isAbstract(((HotSpotResolvedJavaMethod) riMethod).accessFlags()) && !Modifier.isNative(((HotSpotResolvedJavaMethod) riMethod).accessFlags()) : riMethod; - compileMethod((HotSpotResolvedJavaMethod) riMethod, 0, false, 10); + JavaMethod javaMethod = compiler.getRuntime().getResolvedJavaMethod(m); + assert !Modifier.isAbstract(((HotSpotResolvedJavaMethod) javaMethod).accessFlags()) && !Modifier.isNative(((HotSpotResolvedJavaMethod) javaMethod).accessFlags()) : javaMethod; + compileMethod((HotSpotResolvedJavaMethod) javaMethod, 0, false, 10); } private static void shutdownCompileQueue(ThreadPoolExecutor queue) throws InterruptedException { @@ -412,7 +412,7 @@ HotSpotResolvedJavaType resolved = (HotSpotResolvedJavaType) holder; return resolved.createRiField(name, type, offset, flags); } - return new BaseUnresolvedField(holder, name, type); + return new UnresolvedField(holder, name, type); } @Override diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/counters/MethodEntryCounters.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/counters/MethodEntryCounters.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/counters/MethodEntryCounters.java Thu Jun 28 14:10:30 2012 +0200 @@ -53,7 +53,7 @@ protected long sortCount; protected Counter(ResolvedJavaMethod method) { - this.method = CodeUtil.format("%H.%n", method); + this.method = MetaUtil.format("%H.%n", method); counters.add(this); } diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotCompiledMethod.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotCompiledMethod.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotCompiledMethod.java Thu Jun 28 14:10:30 2012 +0200 @@ -24,7 +24,6 @@ import java.lang.reflect.*; -import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.hotspot.*; @@ -70,14 +69,14 @@ } private boolean checkArgs(Object... args) { - Kind[] sig = CodeUtil.signatureToKinds(method); - assert args.length == sig.length : CodeUtil.format("%H.%n(%p): expected ", method) + sig.length + " args, got " + args.length; + Kind[] sig = MetaUtil.signatureToKinds(method); + assert args.length == sig.length : MetaUtil.format("%H.%n(%p): expected ", method) + sig.length + " args, got " + args.length; for (int i = 0; i < sig.length; i++) { Object arg = args[i]; if (arg == null) { - assert sig[i].isObject() : CodeUtil.format("%H.%n(%p): expected arg ", method) + i + " to be Object, not " + sig[i]; + assert sig[i].isObject() : MetaUtil.format("%H.%n(%p): expected arg ", method) + i + " to be Object, not " + sig[i]; } else if (!sig[i].isObject()) { - assert sig[i].toBoxedJavaClass() == arg.getClass() : CodeUtil.format("%H.%n(%p): expected arg ", method) + i + " to be " + sig[i] + ", not " + arg.getClass(); + assert sig[i].toBoxedJavaClass() == arg.getClass() : MetaUtil.format("%H.%n(%p): expected arg ", method) + i + " to be " + sig[i] + ", not " + arg.getClass(); } } return true; diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotGraphCache.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotGraphCache.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotGraphCache.java Thu Jun 28 14:10:30 2012 +0200 @@ -29,8 +29,8 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.*; -import com.oracle.graal.cri.*; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.spi.*; /** * This class implements the graph caching system for the HotSpot platform. @@ -51,7 +51,7 @@ * The {@link #cachedGraphIds} map is used to find the graphs that should be removed because of deoptimization, and to * enforce the graph cache size restriction. */ -public class HotSpotGraphCache implements RiGraphCache { +public class HotSpotGraphCache implements GraphCache { private static final PrintStream out = System.out; diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotProfilingInfo.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotProfilingInfo.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotProfilingInfo.java Thu Jun 28 14:10:30 2012 +0200 @@ -22,7 +22,6 @@ */ package com.oracle.graal.hotspot.meta; -import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.debug.*; import com.oracle.graal.hotspot.*; @@ -149,6 +148,6 @@ @Override public String toString() { - return "HotSpotProfilingInfo<" + CodeUtil.profileToString(this, null, "; ") + ">"; + return "HotSpotProfilingInfo<" + MetaUtil.profileToString(this, null, "; ") + ">"; } } diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaField.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaField.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaField.java Thu Jun 28 14:10:30 2012 +0200 @@ -26,7 +26,6 @@ import java.lang.annotation.*; import java.lang.reflect.*; -import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.api.meta.JavaType.*; import com.oracle.graal.compiler.*; @@ -126,7 +125,7 @@ @Override public String toString() { - return "HotSpotField<" + CodeUtil.format("%h.%n", this) + ":" + offset + ">"; + return "HotSpotField<" + MetaUtil.format("%h.%n", this) + ":" + offset + ">"; } @Override diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaMethod.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaMethod.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaMethod.java Thu Jun 28 14:10:30 2012 +0200 @@ -22,19 +22,16 @@ */ package com.oracle.graal.hotspot.meta; -import java.io.*; import java.lang.annotation.*; import java.lang.reflect.*; import java.util.*; import java.util.concurrent.*; -import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.bytecode.*; import com.oracle.graal.compiler.*; import com.oracle.graal.hotspot.*; import com.oracle.graal.hotspot.counters.*; -import com.oracle.max.criutils.*; /** * Implementation of RiMethod for resolved HotSpot methods. @@ -164,7 +161,7 @@ @Override public String toString() { - return "HotSpotMethod<" + CodeUtil.format("%h.%n", this) + ">"; + return "HotSpotMethod<" + MetaUtil.format("%h.%n", this) + ">"; } public boolean hasCompiledCode() { @@ -201,59 +198,9 @@ return compilationComplexity; } - private static final MethodFilter profilingInfoFilter = GraalOptions.PIFilter == null ? null : new MethodFilter(GraalOptions.PIFilter); - - /** - * Determines if the profiling info cache should be used for this method. - */ - private boolean useProfilingInfoCache() { - return GraalOptions.PICache != null && (profilingInfoFilter == null || profilingInfoFilter.matches(this)); - } - - private ProfilingInfo loadProfilingInfo() { - if (!useProfilingInfoCache()) { - return null; - } - synchronized (this) { - File file = new File(GraalOptions.PICache, JniMangle.mangleMethod(holder, name, signature(), false)); - if (file.exists()) { - try { - SnapshotProfilingInfo snapshot = SnapshotProfilingInfo.load(file, HotSpotGraalRuntime.getInstance().getRuntime()); - if (snapshot.codeSize() != codeSize) { - // The class file was probably changed - ignore the saved profile - return null; - } - return snapshot; - } catch (Exception e) { - // ignore - } - } - return null; - } - } - - private void saveProfilingInfo(ProfilingInfo info) { - if (useProfilingInfoCache()) { - synchronized (this) { - String base = JniMangle.mangleMethod(holder, name, signature(), false); - File file = new File(GraalOptions.PICache, base); - File txtFile = new File(GraalOptions.PICache, base + ".txt"); - SnapshotProfilingInfo snapshot = info instanceof SnapshotProfilingInfo ? (SnapshotProfilingInfo) info : new SnapshotProfilingInfo(info); - try { - snapshot.save(file, txtFile); - } catch (IOException e) { - // ignore - } - } - } - } - @Override public ProfilingInfo profilingInfo() { - ProfilingInfo info = loadProfilingInfo(); - if (info != null) { - return info; - } + ProfilingInfo info; if (GraalOptions.UseProfilingInformation && methodData == null) { methodData = HotSpotGraalRuntime.getInstance().getCompilerToVM().JavaMethod_methodData(this); @@ -261,10 +208,9 @@ if (methodData == null || (!methodData.hasNormalData() && !methodData.hasExtraData())) { // Be optimistic and return false for exceptionSeen. A methodDataOop is allocated in case of a deoptimization. - info = BaseProfilingInfo.get(ExceptionSeen.FALSE); + info = DefaultProfilingInfo.get(ExceptionSeen.FALSE); } else { info = new HotSpotProfilingInfo(methodData, codeSize); - saveProfilingInfo(info); } return info; } @@ -314,7 +260,7 @@ private Method toJava() { try { - return holder.toJava().getDeclaredMethod(name, CodeUtil.signatureToTypes(signature(), holder)); + return holder.toJava().getDeclaredMethod(name, MetaUtil.signatureToTypes(signature(), holder)); } catch (NoSuchMethodException e) { return null; } @@ -322,7 +268,7 @@ private Constructor toJavaConstructor() { try { - return holder.toJava().getDeclaredConstructor(CodeUtil.signatureToTypes(signature(), holder)); + return holder.toJava().getDeclaredConstructor(MetaUtil.signatureToTypes(signature(), holder)); } catch (NoSuchMethodException e) { return null; } diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Thu Jun 28 14:10:30 2012 +0200 @@ -34,7 +34,6 @@ import com.oracle.graal.api.meta.JavaType.*; import com.oracle.graal.compiler.*; import com.oracle.graal.compiler.target.*; -import com.oracle.graal.cri.*; import com.oracle.graal.graph.*; import com.oracle.graal.hotspot.*; import com.oracle.graal.hotspot.nodes.*; @@ -44,6 +43,7 @@ import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.extended.*; import com.oracle.graal.nodes.java.*; +import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; import com.oracle.graal.snippets.*; import com.oracle.max.criutils.*; @@ -51,7 +51,7 @@ /** * CRI runtime implementation for the HotSpot VM. */ -public class HotSpotRuntime implements ExtendedRiRuntime { +public class HotSpotRuntime implements GraalCodeCacheProvider { public final HotSpotVMConfig config; final HotSpotRegisterConfig regConfig; private final HotSpotRegisterConfig globalStubRegConfig; @@ -227,7 +227,7 @@ } @Override - public void lower(Node n, CiLoweringTool tool) { + public void lower(Node n, LoweringTool tool) { StructuredGraph graph = (StructuredGraph) n.graph(); if (n instanceof ArrayLengthNode) { ArrayLengthNode arrayLengthNode = (ArrayLengthNode) n; @@ -390,7 +390,7 @@ return true; } ResolvedJavaMethod method = graph.method(); - return method != null && CodeUtil.format("%H.%n", method).contains(option); + return method != null && MetaUtil.format("%H.%n", method).contains(option); } return false; } @@ -403,7 +403,7 @@ return safeRead(array.graph(), Kind.Int, array, config.arrayLengthOffset, StampFactory.positiveInt(), leafGraphId); } - private static ValueNode createBoundsCheck(AccessIndexedNode n, CiLoweringTool tool) { + private static ValueNode createBoundsCheck(AccessIndexedNode n, LoweringTool tool) { StructuredGraph graph = (StructuredGraph) n.graph(); ArrayLengthNode arrayLength = graph.add(new ArrayLengthNode(n.array())); ValueNode guard = tool.createGuard(graph.unique(new IntegerBelowThanNode(n.index(), arrayLength)), DeoptimizationReason.BoundsCheckException, DeoptimizationAction.InvalidateReprofile, n.leafGraphId()); diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotXirGenerator.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotXirGenerator.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotXirGenerator.java Thu Jun 28 14:10:30 2012 +0200 @@ -44,7 +44,6 @@ import com.oracle.max.cri.xir.CiXirAssembler.XirMark; import com.oracle.max.cri.xir.CiXirAssembler.XirOperand; import com.oracle.max.cri.xir.CiXirAssembler.XirParameter; -import com.oracle.max.criutils.*; public class HotSpotXirGenerator implements RiXirGenerator { diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/InitializeNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/InitializeNode.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/InitializeNode.java Thu Jun 28 14:10:30 2012 +0200 @@ -23,7 +23,6 @@ package com.oracle.graal.hotspot.nodes; import com.oracle.graal.api.meta.*; -import com.oracle.graal.cri.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; @@ -54,7 +53,7 @@ } @Override - public void lower(CiLoweringTool tool) { + public void lower(LoweringTool tool) { tool.getRuntime().lower(this, tool); } diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/TLABAllocateNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/TLABAllocateNode.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/TLABAllocateNode.java Thu Jun 28 14:10:30 2012 +0200 @@ -23,7 +23,6 @@ package com.oracle.graal.hotspot.nodes; import com.oracle.graal.api.meta.*; -import com.oracle.graal.cri.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; @@ -47,7 +46,7 @@ } @Override - public void lower(CiLoweringTool tool) { + public void lower(LoweringTool tool) { tool.getRuntime().lower(this, tool); } diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/TailcallNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/TailcallNode.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/TailcallNode.java Thu Jun 28 14:10:30 2012 +0200 @@ -61,7 +61,7 @@ ResolvedJavaMethod method = frameState.method(); boolean isStatic = Modifier.isStatic(method.accessFlags()); - Kind[] signature = CodeUtil.signatureToKinds(method.signature(), isStatic ? null : method.holder().kind()); + Kind[] signature = MetaUtil.signatureToKinds(method.signature(), isStatic ? null : method.holder().kind()); CallingConvention cc = gen.frameMap().registerConfig.getCallingConvention(CallingConvention.Type.JavaCall, signature, gen.target(), false); gen.frameMap().callsMethod(cc, CallingConvention.Type.JavaCall); // TODO (aw): I think this is unnecessary for a tail call. List parameters = new ArrayList<>(); diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/CheckCastSnippets.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/CheckCastSnippets.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/CheckCastSnippets.java Thu Jun 28 14:10:30 2012 +0200 @@ -34,7 +34,6 @@ import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.*; -import com.oracle.graal.cri.*; import com.oracle.graal.debug.*; import com.oracle.graal.graph.*; import com.oracle.graal.hotspot.*; @@ -42,6 +41,7 @@ import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.extended.*; import com.oracle.graal.nodes.java.*; +import com.oracle.graal.nodes.spi.*; import com.oracle.graal.snippets.*; import com.oracle.graal.snippets.Snippet.ConstantParameter; import com.oracle.graal.snippets.Snippet.Fold; @@ -50,7 +50,6 @@ import com.oracle.graal.snippets.SnippetTemplate.Cache; import com.oracle.graal.snippets.SnippetTemplate.Key; import com.oracle.graal.snippets.nodes.*; -import com.oracle.max.criutils.*; /** * Snippets used for implementing the type test of a checkcast instruction. @@ -353,7 +352,7 @@ /** * Lowers a checkcast node. */ - public void lower(CheckCastNode checkcast, CiLoweringTool tool) { + public void lower(CheckCastNode checkcast, LoweringTool tool) { StructuredGraph graph = (StructuredGraph) checkcast.graph(); ValueNode hub = checkcast.targetClassInstruction(); ValueNode object = checkcast.object(); diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/DirectObjectStoreNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/DirectObjectStoreNode.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/DirectObjectStoreNode.java Thu Jun 28 14:10:30 2012 +0200 @@ -22,7 +22,6 @@ */ package com.oracle.graal.hotspot.snippets; -import com.oracle.graal.cri.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.extended.*; import com.oracle.graal.nodes.spi.*; @@ -59,7 +58,7 @@ } @Override - public void lower(CiLoweringTool tool) { + public void lower(LoweringTool tool) { StructuredGraph graph = (StructuredGraph) this.graph(); IndexedLocationNode location = IndexedLocationNode.create(LocationNode.ANY_LOCATION, value.kind(), displacement, offset, graph, false); WriteNode write = graph.add(new WriteNode(object, value, location)); diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/IntrinsifyArrayCopyPhase.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/IntrinsifyArrayCopyPhase.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/IntrinsifyArrayCopyPhase.java Thu Jun 28 14:10:30 2012 +0200 @@ -29,14 +29,14 @@ import com.oracle.graal.compiler.*; import com.oracle.graal.compiler.phases.*; import com.oracle.graal.compiler.util.*; -import com.oracle.graal.cri.*; import com.oracle.graal.debug.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.java.*; +import com.oracle.graal.nodes.spi.*; public class IntrinsifyArrayCopyPhase extends Phase { - private final ExtendedRiRuntime runtime; + private final GraalCodeCacheProvider runtime; private ResolvedJavaMethod arrayCopy; private ResolvedJavaMethod byteArrayCopy; private ResolvedJavaMethod shortArrayCopy; @@ -47,7 +47,7 @@ private ResolvedJavaMethod doubleArrayCopy; private ResolvedJavaMethod objectArrayCopy; - public IntrinsifyArrayCopyPhase(ExtendedRiRuntime runtime) { + public IntrinsifyArrayCopyPhase(GraalCodeCacheProvider runtime) { this.runtime = runtime; try { byteArrayCopy = getArrayCopySnippet(runtime, byte.class); diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/NewInstanceSnippets.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/NewInstanceSnippets.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/NewInstanceSnippets.java Thu Jun 28 14:10:30 2012 +0200 @@ -32,7 +32,6 @@ import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; -import com.oracle.graal.cri.*; import com.oracle.graal.debug.*; import com.oracle.graal.graph.*; import com.oracle.graal.hotspot.*; @@ -40,6 +39,7 @@ import com.oracle.graal.hotspot.nodes.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.java.*; +import com.oracle.graal.nodes.spi.*; import com.oracle.graal.snippets.*; import com.oracle.graal.snippets.Snippet.ConstantParameter; import com.oracle.graal.snippets.Snippet.Fold; @@ -176,7 +176,7 @@ * Lowers a {@link NewInstanceNode}. */ @SuppressWarnings("unused") - public void lower(NewInstanceNode newInstanceNode, CiLoweringTool tool) { + public void lower(NewInstanceNode newInstanceNode, LoweringTool tool) { StructuredGraph graph = (StructuredGraph) newInstanceNode.graph(); HotSpotResolvedJavaType type = (HotSpotResolvedJavaType) newInstanceNode.instanceClass(); HotSpotKlassOop hub = type.klassOop(); @@ -197,7 +197,7 @@ } @SuppressWarnings("unused") - public void lower(TLABAllocateNode tlabAllocateNode, CiLoweringTool tool) { + public void lower(TLABAllocateNode tlabAllocateNode, LoweringTool tool) { StructuredGraph graph = (StructuredGraph) tlabAllocateNode.graph(); int size = tlabAllocateNode.size(); assert (size % wordSize()) == 0; @@ -210,7 +210,7 @@ } @SuppressWarnings("unused") - public void lower(InitializeNode initializeNode, CiLoweringTool tool) { + public void lower(InitializeNode initializeNode, LoweringTool tool) { StructuredGraph graph = (StructuredGraph) initializeNode.graph(); HotSpotResolvedJavaType type = (HotSpotResolvedJavaType) initializeNode.type(); HotSpotKlassOop hub = type.klassOop(); diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Thu Jun 28 14:10:30 2012 +0200 @@ -130,13 +130,13 @@ @Override protected String getDetailedName() { - return getName() + " " + CodeUtil.format("%H.%n(%p):%r", method); + return getName() + " " + MetaUtil.format("%H.%n(%p):%r", method); } private BciBlockMapping createBlockMap() { BciBlockMapping map = new BciBlockMapping(method); map.build(); - Debug.dump(map, CodeUtil.format("After block building %f %R %H.%n(%P)", method)); + Debug.dump(map, MetaUtil.format("After block building %f %R %H.%n(%P)", method)); return map; } @@ -149,7 +149,7 @@ if (GraalOptions.PrintProfilingInformation) { TTY.println("Profiling info for " + method); - TTY.println(CodeUtil.indent(CodeUtil.profileToString(profilingInfo, method, CodeUtil.NEW_LINE), " ")); + TTY.println(MetaUtil.indent(MetaUtil.profileToString(profilingInfo, method, CodeUtil.NEW_LINE), " ")); } // compute the block map, setup exception handlers and get the entrypoint(s) @@ -283,9 +283,9 @@ if (con instanceof JavaType) { // this is a load of class constant which might be unresolved - JavaType riType = (JavaType) con; - if (riType instanceof ResolvedJavaType) { - frameState.push(Kind.Object, append(ConstantNode.forConstant(((ResolvedJavaType) riType).getEncoding(Representation.JavaClass), runtime, currentGraph))); + JavaType type = (JavaType) con; + if (type instanceof ResolvedJavaType) { + frameState.push(Kind.Object, append(ConstantNode.forConstant(((ResolvedJavaType) type).getEncoding(Representation.JavaClass), runtime, currentGraph))); } else { append(currentGraph.add(new DeoptimizeNode(DeoptimizationAction.InvalidateRecompile, DeoptimizationReason.Unresolved, graphId))); frameState.push(Kind.Object, append(ConstantNode.forObject(null, runtime, currentGraph))); diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/cri/CiLoweringTool.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/cri/CiLoweringTool.java Thu Jun 28 13:10:28 2012 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2011, 2011, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.oracle.graal.cri; - -import com.oracle.graal.api.code.*; -import com.oracle.graal.api.meta.*; -import com.oracle.graal.nodes.*; - -public interface CiLoweringTool { - ExtendedRiRuntime getRuntime(); - ValueNode getGuardAnchor(); - ValueNode createNullCheckGuard(ValueNode object, long leafGraphId); - ValueNode createGuard(BooleanNode condition, DeoptimizationReason deoptReason, DeoptimizationAction action, long leafGraphId); - ValueNode createGuard(BooleanNode condition, DeoptimizationReason deoptReason, DeoptimizationAction action, boolean negated, long leafGraphId); - Assumptions assumptions(); -} - diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/cri/ExtendedRiRuntime.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/cri/ExtendedRiRuntime.java Thu Jun 28 13:10:28 2012 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2011, 2011, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.oracle.graal.cri; - -import java.util.*; - -import com.oracle.graal.api.code.*; -import com.oracle.graal.api.meta.*; -import com.oracle.graal.graph.*; -import com.oracle.graal.nodes.*; - -/** - * Graal-specific extensions for the runtime interface that must be implemented by the VM. - */ -public interface ExtendedRiRuntime extends CodeCacheProvider { - - void lower(Node n, CiLoweringTool tool); - - StructuredGraph intrinsicGraph(ResolvedJavaMethod caller, int bci, ResolvedJavaMethod method, List parameters); - - CompilationResult compile(ResolvedJavaMethod method, StructuredGraph graph); - -} diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/cri/RiGraphCache.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/cri/RiGraphCache.java Thu Jun 28 13:10:28 2012 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.oracle.graal.cri; - -import com.oracle.graal.api.meta.*; -import com.oracle.graal.nodes.*; - - -public interface RiGraphCache { - - void put(StructuredGraph graph); - - StructuredGraph get(ResolvedJavaMethod method); - -} diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FixedGuardNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FixedGuardNode.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FixedGuardNode.java Thu Jun 28 14:10:30 2012 +0200 @@ -24,7 +24,6 @@ import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; -import com.oracle.graal.cri.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.extended.*; import com.oracle.graal.nodes.spi.*; @@ -92,7 +91,7 @@ } @Override - public void lower(CiLoweringTool tool) { + public void lower(LoweringTool tool) { ValueAnchorNode newAnchor = graph().add(new ValueAnchorNode(tool.createGuard(condition, deoptReason, action, negated, leafGraphId))); ((StructuredGraph) graph()).replaceFixedWithFixed(this, newAnchor); } diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FrameState.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FrameState.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FrameState.java Thu Jun 28 14:10:30 2012 +0200 @@ -325,7 +325,7 @@ String nl = CodeUtil.NEW_LINE; FrameState fs = frameState; while (fs != null) { - CodeUtil.appendLocation(sb, fs.method, fs.bci).append(nl); + MetaUtil.appendLocation(sb, fs.method, fs.bci).append(nl); sb.append("locals: ["); for (int i = 0; i < fs.localsSize(); i++) { sb.append(i == 0 ? "" : ", ").append(fs.localAt(i) == null ? "_" : fs.localAt(i).toString(Verbosity.Id)); @@ -356,7 +356,7 @@ Map properties = super.getDebugProperties(); properties.put("bci", bci); if (method != null) { - properties.put("method", CodeUtil.format("%H.%n(%p):%r", method)); + properties.put("method", MetaUtil.format("%H.%n(%p):%r", method)); StackTraceElement ste = method.toStackTraceElement(bci); if (ste.getFileName() != null && ste.getLineNumber() >= 0) { properties.put("source", ste.getFileName() + ":" + ste.getLineNumber()); diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java Thu Jun 28 14:10:30 2012 +0200 @@ -24,7 +24,6 @@ import java.util.*; -import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.extended.*; @@ -90,7 +89,7 @@ public Map getDebugProperties() { Map debugProperties = super.getDebugProperties(); if (callTarget != null && callTarget.targetMethod() != null) { - debugProperties.put("targetMethod", CodeUtil.format("%h.%n(%p)", callTarget.targetMethod())); + debugProperties.put("targetMethod", MetaUtil.format("%h.%n(%p)", callTarget.targetMethod())); } return debugProperties; } diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeWithExceptionNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeWithExceptionNode.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeWithExceptionNode.java Thu Jun 28 14:10:30 2012 +0200 @@ -24,7 +24,6 @@ import java.util.*; -import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.extended.*; @@ -157,7 +156,7 @@ Map debugProperties = super.getDebugProperties(); debugProperties.put("memoryCheckpoint", "true"); if (callTarget != null && callTarget.targetMethod() != null) { - debugProperties.put("targetMethod", CodeUtil.format("%h.%n(%p)", callTarget.targetMethod())); + debugProperties.put("targetMethod", MetaUtil.format("%h.%n(%p)", callTarget.targetMethod())); } return debugProperties; } diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/NormalizeCompareNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/NormalizeCompareNode.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/NormalizeCompareNode.java Thu Jun 28 14:10:30 2012 +0200 @@ -23,7 +23,6 @@ package com.oracle.graal.nodes.calc; import com.oracle.graal.api.meta.*; -import com.oracle.graal.cri.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; @@ -46,7 +45,7 @@ } @Override - public void lower(CiLoweringTool tool) { + public void lower(LoweringTool tool) { StructuredGraph graph = (StructuredGraph) graph(); BooleanNode equalComp; diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadHubNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadHubNode.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadHubNode.java Thu Jun 28 14:10:30 2012 +0200 @@ -25,7 +25,6 @@ import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.api.meta.JavaType.*; -import com.oracle.graal.cri.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; @@ -44,7 +43,7 @@ } @Override - public void lower(CiLoweringTool tool) { + public void lower(LoweringTool tool) { tool.getRuntime().lower(this, tool); } diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SafeReadNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SafeReadNode.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SafeReadNode.java Thu Jun 28 14:10:30 2012 +0200 @@ -22,7 +22,6 @@ */ package com.oracle.graal.nodes.extended; -import com.oracle.graal.cri.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; @@ -35,7 +34,7 @@ } @Override - public void lower(CiLoweringTool tool) { + public void lower(LoweringTool tool) { StructuredGraph graph = (StructuredGraph) graph(); ValueNode guard = tool.createNullCheckGuard(object(), leafGraphId()); ReadNode read = graph.add(new ReadNode(object(), location(), stamp())); diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SafeWriteNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SafeWriteNode.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SafeWriteNode.java Thu Jun 28 14:10:30 2012 +0200 @@ -22,7 +22,6 @@ */ package com.oracle.graal.nodes.extended; -import com.oracle.graal.cri.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; @@ -56,7 +55,7 @@ } @Override - public void lower(CiLoweringTool tool) { + public void lower(LoweringTool tool) { StructuredGraph graph = (StructuredGraph) graph(); ValueNode guard = tool.createNullCheckGuard(object(), leafGraphId()); WriteNode write = graph.add(new WriteNode(object(), value(), location())); diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeLoadNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeLoadNode.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeLoadNode.java Thu Jun 28 14:10:30 2012 +0200 @@ -23,7 +23,6 @@ package com.oracle.graal.nodes.extended; import com.oracle.graal.api.meta.*; -import com.oracle.graal.cri.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; @@ -71,7 +70,7 @@ } @Override - public void lower(CiLoweringTool tool) { + public void lower(LoweringTool tool) { tool.getRuntime().lower(this, tool); } diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeStoreNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeStoreNode.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeStoreNode.java Thu Jun 28 14:10:30 2012 +0200 @@ -23,7 +23,6 @@ package com.oracle.graal.nodes.extended; import com.oracle.graal.api.meta.*; -import com.oracle.graal.cri.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; @@ -92,7 +91,7 @@ } @Override - public void lower(CiLoweringTool tool) { + public void lower(LoweringTool tool) { tool.getRuntime().lower(this, tool); } diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AccessFieldNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AccessFieldNode.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AccessFieldNode.java Thu Jun 28 14:10:30 2012 +0200 @@ -25,9 +25,7 @@ import java.lang.reflect.*; import java.util.*; -import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; -import com.oracle.graal.cri.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; @@ -88,14 +86,14 @@ } @Override - public void lower(CiLoweringTool tool) { + public void lower(LoweringTool tool) { tool.getRuntime().lower(this, tool); } @Override public Map getDebugProperties() { Map debugProperties = super.getDebugProperties(); - debugProperties.put("field", CodeUtil.format("%h.%n", field)); + debugProperties.put("field", MetaUtil.format("%h.%n", field)); return debugProperties; } diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/ArrayLengthNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/ArrayLengthNode.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/ArrayLengthNode.java Thu Jun 28 14:10:30 2012 +0200 @@ -24,7 +24,6 @@ import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; -import com.oracle.graal.cri.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; @@ -63,7 +62,7 @@ } @Override - public void lower(CiLoweringTool tool) { + public void lower(LoweringTool tool) { tool.getRuntime().lower(this, tool); } } diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java Thu Jun 28 14:10:30 2012 +0200 @@ -23,7 +23,6 @@ package com.oracle.graal.nodes.java; import com.oracle.graal.api.meta.*; -import com.oracle.graal.cri.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.calc.*; @@ -60,7 +59,7 @@ } @Override - public void lower(CiLoweringTool tool) { + public void lower(LoweringTool tool) { tool.getRuntime().lower(this, tool); } diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CompareAndSwapNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CompareAndSwapNode.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CompareAndSwapNode.java Thu Jun 28 14:10:30 2012 +0200 @@ -23,7 +23,6 @@ package com.oracle.graal.nodes.java; import com.oracle.graal.api.meta.*; -import com.oracle.graal.cri.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.extended.*; import com.oracle.graal.nodes.spi.*; @@ -77,7 +76,7 @@ } @Override - public void lower(CiLoweringTool tool) { + public void lower(LoweringTool tool) { tool.getRuntime().lower(this, tool); } diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoadIndexedNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoadIndexedNode.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoadIndexedNode.java Thu Jun 28 14:10:30 2012 +0200 @@ -26,7 +26,6 @@ import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; -import com.oracle.graal.cri.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; @@ -56,7 +55,7 @@ } @Override - public void lower(CiLoweringTool tool) { + public void lower(LoweringTool tool) { tool.getRuntime().lower(this, tool); } diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewInstanceNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewInstanceNode.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewInstanceNode.java Thu Jun 28 14:10:30 2012 +0200 @@ -25,7 +25,6 @@ import java.util.*; import com.oracle.graal.api.meta.*; -import com.oracle.graal.cri.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; @@ -57,7 +56,7 @@ } @Override - public void lower(CiLoweringTool tool) { + public void lower(LoweringTool tool) { tool.getRuntime().lower(this, tool); } diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/StoreIndexedNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/StoreIndexedNode.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/StoreIndexedNode.java Thu Jun 28 14:10:30 2012 +0200 @@ -23,7 +23,6 @@ package com.oracle.graal.nodes.java; import com.oracle.graal.api.meta.*; -import com.oracle.graal.cri.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; @@ -67,7 +66,7 @@ } @Override - public void lower(CiLoweringTool tool) { + public void lower(LoweringTool tool) { tool.getRuntime().lower(this, tool); } } diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/GraalCodeCacheProvider.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/GraalCodeCacheProvider.java Thu Jun 28 14:10:30 2012 +0200 @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2011, 2011, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.graal.nodes.spi; + +import java.util.*; + +import com.oracle.graal.api.code.*; +import com.oracle.graal.api.meta.*; +import com.oracle.graal.graph.*; +import com.oracle.graal.nodes.*; + +/** + * Graal-specific extensions for the code cache provider interface. + */ +public interface GraalCodeCacheProvider extends CodeCacheProvider { + + void lower(Node n, LoweringTool tool); + + StructuredGraph intrinsicGraph(ResolvedJavaMethod caller, int bci, ResolvedJavaMethod method, List parameters); + + CompilationResult compile(ResolvedJavaMethod method, StructuredGraph graph); + +} diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/GraphCache.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/GraphCache.java Thu Jun 28 14:10:30 2012 +0200 @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.graal.nodes.spi; + +import com.oracle.graal.api.meta.*; +import com.oracle.graal.nodes.*; + + +public interface GraphCache { + + void put(StructuredGraph graph); + + StructuredGraph get(ResolvedJavaMethod method); + +} diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/Lowerable.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/Lowerable.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/Lowerable.java Thu Jun 28 14:10:30 2012 +0200 @@ -22,9 +22,7 @@ */ package com.oracle.graal.nodes.spi; -import com.oracle.graal.cri.*; - public interface Lowerable { - void lower(CiLoweringTool tool); + void lower(LoweringTool tool); } diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LoweringTool.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LoweringTool.java Thu Jun 28 14:10:30 2012 +0200 @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2011, 2011, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.graal.nodes.spi; + +import com.oracle.graal.api.code.*; +import com.oracle.graal.api.meta.*; +import com.oracle.graal.nodes.*; + +public interface LoweringTool { + GraalCodeCacheProvider getRuntime(); + ValueNode getGuardAnchor(); + ValueNode createNullCheckGuard(ValueNode object, long leafGraphId); + ValueNode createGuard(BooleanNode condition, DeoptimizationReason deoptReason, DeoptimizationAction action, long leafGraphId); + ValueNode createGuard(BooleanNode condition, DeoptimizationReason deoptReason, DeoptimizationAction action, boolean negated, long leafGraphId); + Assumptions assumptions(); +} + diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.printer/src/com/oracle/graal/printer/CFGPrinter.java --- a/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/CFGPrinter.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/CFGPrinter.java Thu Jun 28 14:10:30 2012 +0200 @@ -27,7 +27,6 @@ import java.io.*; import java.util.*; -import com.oracle.max.criutils.*; import com.oracle.graal.alloc.util.*; import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; @@ -382,7 +381,7 @@ StringBuilder buf = new StringBuilder(); FrameState curState = state; do { - buf.append(CodeUtil.toLocation(curState.method(), curState.bci)).append('\n'); + buf.append(MetaUtil.toLocation(curState.method(), curState.bci)).append('\n'); if (curState.stackSize() > 0) { buf.append("stack: "); diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.printer/src/com/oracle/graal/printer/CompilationPrinter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/CompilationPrinter.java Thu Jun 28 14:10:30 2012 +0200 @@ -0,0 +1,208 @@ +/* + * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.graal.printer; + +import static com.oracle.graal.api.code.ValueUtil.*; + +import java.io.*; +import java.util.*; + +import com.oracle.graal.api.code.*; +import com.oracle.graal.api.meta.*; +import com.oracle.max.criutils.*; + +/** + * Utility for printing compilation related data structures at various compilation phases. + * The output format is such that it can then be fed to the + * C1 Visualizer. + */ +public class CompilationPrinter { + public static final String COLUMN_END = " <|@"; + public static final String HOVER_START = "<@"; + public static final String HOVER_SEP = "|@"; + public static final String HOVER_END = ">@"; + + private static OutputStream globalOut; + + /** + * Gets a global output stream on a file in the current working directory. + * This stream is first opened if necessary. The name of the file + * is {@code "compilations-" + System.currentTimeMillis() + ".cfg"}. + * + * @return the global output stream or {@code null} if there was an error opening the file for writing + */ + public static synchronized OutputStream globalOut() { + if (globalOut == null) { + File file = new File("compilations-" + System.currentTimeMillis() + ".cfg"); + try { + globalOut = new FileOutputStream(file); + } catch (FileNotFoundException e) { + TTY.println("WARNING: Could not open " + file.getAbsolutePath()); + } + } + return globalOut; + } + + protected final LogStream out; + + /** + * Creates a control flow graph printer. + * + * @param os where the output generated via this printer will be sent + */ + public CompilationPrinter(OutputStream os) { + out = new LogStream(os); + } + + /** + * Flushes all buffered output to the underlying output stream. + */ + public void flush() { + out.flush(); + } + + protected void begin(String string) { + out.println("begin_" + string); + out.adjustIndentation(2); + } + + protected void end(String string) { + out.adjustIndentation(-2); + out.println("end_" + string); + } + + /** + * Prints a compilation timestamp for a given method. + * + * @param method the method for which a timestamp will be printed + */ + public void printCompilation(JavaMethod method) { + begin("compilation"); + out.print("name \" ").print(MetaUtil.format("%H::%n", method)).println('"'); + out.print("method \"").print(MetaUtil.format("%f %r %H.%n(%p)", method)).println('"'); + out.print("date ").println(System.currentTimeMillis()); + end("compilation"); + } + + /** + * Formats given debug info as a multi line string. + */ + protected String debugInfoToString(BytecodePosition codePos, BitSet registerRefMap, BitSet frameRefMap, Architecture arch) { + StringBuilder sb = new StringBuilder(); + + if (registerRefMap != null) { + sb.append("reg-ref-map:"); + for (int reg = registerRefMap.nextSetBit(0); reg >= 0; reg = registerRefMap.nextSetBit(reg + 1)) { + sb.append(' ').append(arch == null ? "r" + reg : arch.registers[reg]); + } + sb.append("\n"); + } + + if (frameRefMap != null) { + sb.append("frame-ref-map:"); + for (int reg = frameRefMap.nextSetBit(0); reg >= 0; reg = frameRefMap.nextSetBit(reg + 1)) { + sb.append(' ').append("s").append(reg); + } + sb.append("\n"); + } + + if (codePos != null) { + BytecodePosition curCodePos = codePos; + List virtualObjects = new ArrayList<>(); + do { + sb.append(MetaUtil.toLocation(curCodePos.getMethod(), curCodePos.getBCI())); + sb.append('\n'); + if (curCodePos instanceof BytecodeFrame) { + BytecodeFrame frame = (BytecodeFrame) curCodePos; + if (frame.numStack > 0) { + sb.append("stack: "); + for (int i = 0; i < frame.numStack; i++) { + sb.append(valueToString(frame.getStackValue(i), virtualObjects)).append(' '); + } + sb.append("\n"); + } + sb.append("locals: "); + for (int i = 0; i < frame.numLocals; i++) { + sb.append(valueToString(frame.getLocalValue(i), virtualObjects)).append(' '); + } + sb.append("\n"); + if (frame.numLocks > 0) { + sb.append("locks: "); + for (int i = 0; i < frame.numLocks; ++i) { + sb.append(valueToString(frame.getLockValue(i), virtualObjects)).append(' '); + } + sb.append("\n"); + } + + } + curCodePos = curCodePos.getCaller(); + } while (curCodePos != null); + + for (int i = 0; i < virtualObjects.size(); i++) { + VirtualObject obj = virtualObjects.get(i); + sb.append(obj).append(" ").append(obj.type().name()).append(" "); + for (int j = 0; j < obj.values().length; j++) { + sb.append(valueToString(obj.values()[j], virtualObjects)).append(' '); + } + sb.append("\n"); + + } + } + return sb.toString(); + } + + protected String valueToString(Value value, List virtualObjects) { + if (value == null) { + return "-"; + } + if (isVirtualObject(value) && !virtualObjects.contains(asVirtualObject(value))) { + virtualObjects.add(asVirtualObject(value)); + } + return value.toString(); + } + + public void printMachineCode(String code, String label) { + if (code.length() == 0) { + return; + } + if (label != null) { + begin("cfg"); + out.print("name \"").print(label).println('"'); + end("cfg"); + } + begin("nmethod"); + out.print(code); + out.println(" <|@"); + end("nmethod"); + } + + public void printBytecodes(String code) { + if (code.length() == 0) { + return; + } + begin("bytecodes"); + out.print(code); + out.println(" <|@"); + end("bytecodes"); + } +} diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.printer/src/com/oracle/graal/printer/IdealGraphPrinterDumpHandler.java --- a/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/IdealGraphPrinterDumpHandler.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/IdealGraphPrinterDumpHandler.java Thu Jun 28 14:10:30 2012 +0200 @@ -27,7 +27,6 @@ import java.util.*; import com.oracle.max.criutils.*; -import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.debug.*; import com.oracle.graal.graph.*; @@ -150,7 +149,7 @@ for (Object o : Debug.context()) { if (o instanceof ResolvedJavaMethod) { ResolvedJavaMethod method = (ResolvedJavaMethod) o; - result.add(CodeUtil.format("%H::%n(%p)", method)); + result.add(MetaUtil.format("%H::%n(%p)", method)); } else if (o instanceof DebugDumpScope) { DebugDumpScope debugDumpScope = (DebugDumpScope) o; if (debugDumpScope.decorator && !result.isEmpty()) { diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/SnippetInstaller.java --- a/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/SnippetInstaller.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/SnippetInstaller.java Thu Jun 28 14:10:30 2012 +0200 @@ -31,13 +31,13 @@ import com.oracle.graal.compiler.*; import com.oracle.graal.compiler.phases.*; import com.oracle.graal.compiler.util.*; -import com.oracle.graal.cri.*; import com.oracle.graal.debug.*; import com.oracle.graal.graph.*; import com.oracle.graal.java.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.extended.*; import com.oracle.graal.nodes.java.*; +import com.oracle.graal.nodes.spi.*; import com.oracle.graal.snippets.Snippet.InliningPolicy; /** @@ -45,7 +45,7 @@ */ public class SnippetInstaller { - private final ExtendedRiRuntime runtime; + private final GraalCodeCacheProvider runtime; private final TargetDescription target; private final BoxingMethodPool pool; @@ -57,7 +57,7 @@ */ private final Map graphCache; - public SnippetInstaller(ExtendedRiRuntime runtime, TargetDescription target) { + public SnippetInstaller(GraalCodeCacheProvider runtime, TargetDescription target) { this.runtime = runtime; this.target = target; this.pool = new BoxingMethodPool(runtime); diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/SnippetIntrinsificationPhase.java --- a/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/SnippetIntrinsificationPhase.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/SnippetIntrinsificationPhase.java Thu Jun 28 14:10:30 2012 +0200 @@ -60,7 +60,7 @@ if (intrinsic != null) { assert target.getAnnotation(Fold.class) == null; - Class< ? >[] parameterTypes = CodeUtil.signatureToTypes(target.signature(), target.holder()); + Class< ? >[] parameterTypes = MetaUtil.signatureToTypes(target.signature(), target.holder()); // Prepare the arguments for the reflective constructor call on the node class. Object[] nodeConstructorArguments = prepareArguments(invoke, parameterTypes, target, false); @@ -76,7 +76,7 @@ // Clean up checkcast instructions inserted by javac if the return type is generic. cleanUpReturnCheckCast(newInstance); } else if (target.getAnnotation(Fold.class) != null) { - Class< ? >[] parameterTypes = CodeUtil.signatureToTypes(target.signature(), target.holder()); + Class< ? >[] parameterTypes = MetaUtil.signatureToTypes(target.signature(), target.holder()); // Prepare the arguments for the reflective method call Object[] arguments = prepareArguments(invoke, parameterTypes, target, true); @@ -118,7 +118,7 @@ parameterIndex--; } ValueNode argument = tryBoxingElimination(parameterIndex, target, arguments.get(i)); - if (folding || CodeUtil.getParameterAnnotation(ConstantNodeParameter.class, parameterIndex, target) != null) { + if (folding || MetaUtil.getParameterAnnotation(ConstantNodeParameter.class, parameterIndex, target) != null) { assert argument instanceof ConstantNode : "parameter " + parameterIndex + " must be a compile time constant for calling " + invoke.callTarget().targetMethod() + " at " + sourceLocation(invoke.node()) + ": " + argument; ConstantNode constantNode = (ConstantNode) argument; Constant constant = constantNode.asConstant(); diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/SnippetTemplate.java --- a/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/SnippetTemplate.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/SnippetTemplate.java Thu Jun 28 14:10:30 2012 +0200 @@ -106,7 +106,7 @@ @Override public String toString() { - return CodeUtil.format("%h.%n", method) + map.toString(); + return MetaUtil.format("%h.%n", method) + map.toString(); } } @@ -192,7 +192,7 @@ Parameter[] parameterAnnotations = new Parameter[parameterCount]; ConstantNode[] placeholders = new ConstantNode[parameterCount]; for (int i = 0; i < parameterCount; i++) { - ConstantParameter c = CodeUtil.getParameterAnnotation(ConstantParameter.class, i, method); + ConstantParameter c = MetaUtil.getParameterAnnotation(ConstantParameter.class, i, method); if (c != null) { String name = c.value(); Object arg = key.get(name); @@ -200,7 +200,7 @@ assert checkConstantArgument(method, signature, i, name, arg, kind); replacements.put(snippetGraph.getLocal(i), ConstantNode.forConstant(Constant.forBoxed(kind, arg), runtime, snippetCopy)); } else { - Parameter p = CodeUtil.getParameterAnnotation(Parameter.class, i, method); + Parameter p = MetaUtil.getParameterAnnotation(Parameter.class, i, method); assert p != null : method + ": parameter " + i + " must be annotated with either @Constant or @Parameter"; String name = p.value(); if (p.multiple()) { diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.tests/src/com/oracle/graal/compiler/tests/CompiledMethodTest.java --- a/graal/com.oracle.graal.tests/src/com/oracle/graal/compiler/tests/CompiledMethodTest.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.tests/src/com/oracle/graal/compiler/tests/CompiledMethodTest.java Thu Jun 28 14:10:30 2012 +0200 @@ -66,8 +66,8 @@ } } - final ResolvedJavaMethod riMethod = runtime.getResolvedJavaMethod(method); - InstalledCode compiledMethod = getCode(riMethod, graph); + final ResolvedJavaMethod javaMethod = runtime.getResolvedJavaMethod(method); + InstalledCode compiledMethod = getCode(javaMethod, graph); try { Object result = compiledMethod.execute("1", "2", "3"); Assert.assertEquals("1-2-3", result); @@ -80,8 +80,8 @@ public void test3() { Method method = getMethod("testMethod"); final StructuredGraph graph = parse(method); - final ResolvedJavaMethod riMethod = runtime.getResolvedJavaMethod(method); - InstalledCode compiledMethod = getCode(riMethod, graph); + final ResolvedJavaMethod javaMethod = runtime.getResolvedJavaMethod(method); + InstalledCode compiledMethod = getCode(javaMethod, graph); try { Object result = compiledMethod.executeVarargs("1", "2", "3"); Assert.assertEquals("1 2 3", result); @@ -94,8 +94,8 @@ public void test4() { Method method = getMethod("testMethodVirtual"); final StructuredGraph graph = parse(method); - final ResolvedJavaMethod riMethod = runtime.getResolvedJavaMethod(method); - InstalledCode compiledMethod = getCode(riMethod, graph); + final ResolvedJavaMethod javaMethod = runtime.getResolvedJavaMethod(method); + InstalledCode compiledMethod = getCode(javaMethod, graph); try { f1 = "0"; Object result = compiledMethod.executeVarargs(this, "1", "2", "3"); @@ -108,8 +108,8 @@ @Test public void test2() throws NoSuchMethodException, SecurityException { Method method = CompilableObjectImpl.class.getDeclaredMethod("executeHelper", ObjectCompiler.class, String.class); - ResolvedJavaMethod riMethod = runtime.getResolvedJavaMethod(method); - StructuredGraph graph = new StructuredGraph(riMethod); + ResolvedJavaMethod javaMethod = runtime.getResolvedJavaMethod(method); + StructuredGraph graph = new StructuredGraph(javaMethod); new GraphBuilderPhase(runtime, GraphBuilderConfiguration.getSnippetDefault(), OptimisticOptimizations.NONE).apply(graph); new CanonicalizerPhase(null, runtime, null).apply(graph); new DeadCodeEliminationPhase().apply(graph); @@ -123,7 +123,7 @@ } } - InstalledCode compiledMethod = getCode(riMethod, graph); + InstalledCode compiledMethod = getCode(javaMethod, graph); final CompilableObject compilableObject = new CompilableObjectImpl(0); Object result; diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.graal.tests/src/com/oracle/graal/compiler/tests/GraalCompilerTest.java --- a/graal/com.oracle.graal.tests/src/com/oracle/graal/compiler/tests/GraalCompilerTest.java Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/com.oracle.graal.tests/src/com/oracle/graal/compiler/tests/GraalCompilerTest.java Thu Jun 28 14:10:30 2012 +0200 @@ -35,13 +35,13 @@ import com.oracle.graal.compiler.phases.*; import com.oracle.graal.compiler.phases.PhasePlan.PhasePosition; import com.oracle.graal.compiler.schedule.*; -import com.oracle.graal.cri.*; import com.oracle.graal.debug.*; import com.oracle.graal.graph.*; import com.oracle.graal.graph.Node.Verbosity; import com.oracle.graal.java.*; import com.oracle.graal.lir.cfg.*; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.spi.*; /** * Base class for Graal compiler unit tests. These are white box tests @@ -61,11 +61,11 @@ */ public abstract class GraalCompilerTest { - protected final ExtendedRiRuntime runtime; + protected final GraalCodeCacheProvider runtime; public GraalCompilerTest() { Debug.enable(); - this.runtime = Graal.getRuntime().getCapability(ExtendedRiRuntime.class); + this.runtime = Graal.getRuntime().getCapability(GraalCodeCacheProvider.class); } protected void assertEquals(StructuredGraph expected, StructuredGraph graph) { @@ -127,7 +127,7 @@ return result.toString(); } - protected ExtendedRiRuntime runtime() { + protected GraalCodeCacheProvider runtime() { return runtime; } @@ -248,8 +248,8 @@ * Parses a Java method to produce a graph. */ protected StructuredGraph parse(Method m) { - ResolvedJavaMethod riMethod = runtime.getResolvedJavaMethod(m); - StructuredGraph graph = new StructuredGraph(riMethod); + ResolvedJavaMethod javaMethod = runtime.getResolvedJavaMethod(m); + StructuredGraph graph = new StructuredGraph(javaMethod); new GraphBuilderPhase(runtime, GraphBuilderConfiguration.getSnippetDefault(), OptimisticOptimizations.ALL).apply(graph); return graph; } @@ -258,8 +258,8 @@ * Parses a Java method to produce a graph. */ protected StructuredGraph parseProfiled(Method m) { - ResolvedJavaMethod riMethod = runtime.getResolvedJavaMethod(m); - StructuredGraph graph = new StructuredGraph(riMethod); + ResolvedJavaMethod javaMethod = runtime.getResolvedJavaMethod(m); + StructuredGraph graph = new StructuredGraph(javaMethod); new GraphBuilderPhase(runtime, GraphBuilderConfiguration.getDefault(), OptimisticOptimizations.ALL).apply(graph); return graph; } diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.max.criutils/src/com/oracle/max/criutils/BaseProfilingInfo.java --- a/graal/com.oracle.max.criutils/src/com/oracle/max/criutils/BaseProfilingInfo.java Thu Jun 28 13:10:28 2012 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,89 +0,0 @@ -/* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.oracle.max.criutils; - -import com.oracle.graal.api.code.*; -import com.oracle.graal.api.meta.*; - - -/** - * Dummy profiling information in case that a method was not executed frequently enough so that - * no profiling information does exist yet, or in case that the profiling information should not be used. - */ -public final class BaseProfilingInfo implements ProfilingInfo { - private static final ProfilingInfo[] NO_PROFILING_INFO = new ProfilingInfo[] { - new BaseProfilingInfo(ExceptionSeen.TRUE), - new BaseProfilingInfo(ExceptionSeen.FALSE), - new BaseProfilingInfo(ExceptionSeen.NOT_SUPPORTED) - }; - - private final ExceptionSeen exceptionSeen; - - BaseProfilingInfo(ExceptionSeen exceptionSeen) { - this.exceptionSeen = exceptionSeen; - } - - @Override - public int codeSize() { - return 0; - } - - @Override - public JavaTypeProfile getTypeProfile(int bci) { - return null; - } - - @Override - public double getBranchTakenProbability(int bci) { - return -1; - } - - @Override - public double[] getSwitchProbabilities(int bci) { - return null; - } - - @Override - public ExceptionSeen getExceptionSeen(int bci) { - return exceptionSeen; - } - - @Override - public int getExecutionCount(int bci) { - return -1; - } - - public static ProfilingInfo get(ExceptionSeen exceptionSeen) { - return NO_PROFILING_INFO[exceptionSeen.ordinal()]; - } - - @Override - public int getDeoptimizationCount(DeoptimizationReason reason) { - return 0; - } - - @Override - public String toString() { - return "BaseProfilingInfo<" + CodeUtil.profileToString(this, null, "; ") + ">"; - } -} diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.max.criutils/src/com/oracle/max/criutils/BaseUnresolvedField.java --- a/graal/com.oracle.max.criutils/src/com/oracle/max/criutils/BaseUnresolvedField.java Thu Jun 28 13:10:28 2012 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,76 +0,0 @@ -/* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.oracle.max.criutils; - -import com.oracle.graal.api.code.*; -import com.oracle.graal.api.meta.*; - -/** - * A implementation of {@link JavaField} for an unresolved field. - */ -public class BaseUnresolvedField implements JavaField { - - public final String name; - public final JavaType holder; - public final JavaType type; - - public BaseUnresolvedField(JavaType holder, String name, JavaType type) { - this.name = name; - this.type = type; - this.holder = holder; - } - - public String name() { - return name; - } - - public JavaType type() { - return type; - } - - public Kind kind() { - return type.kind(); - } - - public JavaType holder() { - return holder; - } - - @Override - public int hashCode() { - return System.identityHashCode(this); - } - - @Override - public boolean equals(Object o) { - return o == this; - } - - /** - * Converts this compiler interface field to a string. - */ - @Override - public String toString() { - return CodeUtil.format("%H.%n [unresolved]", this); - } -} diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.max.criutils/src/com/oracle/max/criutils/BaseUnresolvedMethod.java --- a/graal/com.oracle.max.criutils/src/com/oracle/max/criutils/BaseUnresolvedMethod.java Thu Jun 28 13:10:28 2012 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.oracle.max.criutils; - -import com.oracle.graal.api.code.*; -import com.oracle.graal.api.meta.*; - -/** - * A implementation of {@link JavaMethod} for an unresolved method. - */ -public class BaseUnresolvedMethod implements JavaMethod { - - public final String name; - public final JavaType holder; - public final Signature signature; - - public BaseUnresolvedMethod(JavaType holder, String name, Signature signature) { - this.name = name; - this.holder = holder; - this.signature = signature; - } - - public String name() { - return name; - } - - public JavaType holder() { - return holder; - } - - public Signature signature() { - return signature; - } - - @Override - public int hashCode() { - return System.identityHashCode(this); - } - - @Override - public boolean equals(Object o) { - return o == this; - } - - @Override - public String toString() { - return CodeUtil.format("%H.%n(%p) [unresolved]", this); - } -} diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.max.criutils/src/com/oracle/max/criutils/CompilationPrinter.java --- a/graal/com.oracle.max.criutils/src/com/oracle/max/criutils/CompilationPrinter.java Thu Jun 28 13:10:28 2012 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,207 +0,0 @@ -/* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.oracle.max.criutils; - -import static com.oracle.graal.api.code.ValueUtil.*; - -import java.io.*; -import java.util.*; - -import com.oracle.graal.api.code.*; -import com.oracle.graal.api.meta.*; - -/** - * Utility for printing compilation related data structures at various compilation phases. - * The output format is such that it can then be fed to the - * C1 Visualizer. - */ -public class CompilationPrinter { - public static final String COLUMN_END = " <|@"; - public static final String HOVER_START = "<@"; - public static final String HOVER_SEP = "|@"; - public static final String HOVER_END = ">@"; - - private static OutputStream globalOut; - - /** - * Gets a global output stream on a file in the current working directory. - * This stream is first opened if necessary. The name of the file - * is {@code "compilations-" + System.currentTimeMillis() + ".cfg"}. - * - * @return the global output stream or {@code null} if there was an error opening the file for writing - */ - public static synchronized OutputStream globalOut() { - if (globalOut == null) { - File file = new File("compilations-" + System.currentTimeMillis() + ".cfg"); - try { - globalOut = new FileOutputStream(file); - } catch (FileNotFoundException e) { - TTY.println("WARNING: Could not open " + file.getAbsolutePath()); - } - } - return globalOut; - } - - protected final LogStream out; - - /** - * Creates a control flow graph printer. - * - * @param os where the output generated via this printer will be sent - */ - public CompilationPrinter(OutputStream os) { - out = new LogStream(os); - } - - /** - * Flushes all buffered output to the underlying output stream. - */ - public void flush() { - out.flush(); - } - - protected void begin(String string) { - out.println("begin_" + string); - out.adjustIndentation(2); - } - - protected void end(String string) { - out.adjustIndentation(-2); - out.println("end_" + string); - } - - /** - * Prints a compilation timestamp for a given method. - * - * @param method the method for which a timestamp will be printed - */ - public void printCompilation(JavaMethod method) { - begin("compilation"); - out.print("name \" ").print(CodeUtil.format("%H::%n", method)).println('"'); - out.print("method \"").print(CodeUtil.format("%f %r %H.%n(%p)", method)).println('"'); - out.print("date ").println(System.currentTimeMillis()); - end("compilation"); - } - - /** - * Formats given debug info as a multi line string. - */ - protected String debugInfoToString(BytecodePosition codePos, BitSet registerRefMap, BitSet frameRefMap, Architecture arch) { - StringBuilder sb = new StringBuilder(); - - if (registerRefMap != null) { - sb.append("reg-ref-map:"); - for (int reg = registerRefMap.nextSetBit(0); reg >= 0; reg = registerRefMap.nextSetBit(reg + 1)) { - sb.append(' ').append(arch == null ? "r" + reg : arch.registers[reg]); - } - sb.append("\n"); - } - - if (frameRefMap != null) { - sb.append("frame-ref-map:"); - for (int reg = frameRefMap.nextSetBit(0); reg >= 0; reg = frameRefMap.nextSetBit(reg + 1)) { - sb.append(' ').append("s").append(reg); - } - sb.append("\n"); - } - - if (codePos != null) { - BytecodePosition curCodePos = codePos; - List virtualObjects = new ArrayList<>(); - do { - sb.append(CodeUtil.toLocation(curCodePos.getMethod(), curCodePos.getBCI())); - sb.append('\n'); - if (curCodePos instanceof BytecodeFrame) { - BytecodeFrame frame = (BytecodeFrame) curCodePos; - if (frame.numStack > 0) { - sb.append("stack: "); - for (int i = 0; i < frame.numStack; i++) { - sb.append(valueToString(frame.getStackValue(i), virtualObjects)).append(' '); - } - sb.append("\n"); - } - sb.append("locals: "); - for (int i = 0; i < frame.numLocals; i++) { - sb.append(valueToString(frame.getLocalValue(i), virtualObjects)).append(' '); - } - sb.append("\n"); - if (frame.numLocks > 0) { - sb.append("locks: "); - for (int i = 0; i < frame.numLocks; ++i) { - sb.append(valueToString(frame.getLockValue(i), virtualObjects)).append(' '); - } - sb.append("\n"); - } - - } - curCodePos = curCodePos.getCaller(); - } while (curCodePos != null); - - for (int i = 0; i < virtualObjects.size(); i++) { - VirtualObject obj = virtualObjects.get(i); - sb.append(obj).append(" ").append(obj.type().name()).append(" "); - for (int j = 0; j < obj.values().length; j++) { - sb.append(valueToString(obj.values()[j], virtualObjects)).append(' '); - } - sb.append("\n"); - - } - } - return sb.toString(); - } - - protected String valueToString(Value value, List virtualObjects) { - if (value == null) { - return "-"; - } - if (isVirtualObject(value) && !virtualObjects.contains(asVirtualObject(value))) { - virtualObjects.add(asVirtualObject(value)); - } - return value.toString(); - } - - public void printMachineCode(String code, String label) { - if (code.length() == 0) { - return; - } - if (label != null) { - begin("cfg"); - out.print("name \"").print(label).println('"'); - end("cfg"); - } - begin("nmethod"); - out.print(code); - out.println(" <|@"); - end("nmethod"); - } - - public void printBytecodes(String code) { - if (code.length() == 0) { - return; - } - begin("bytecodes"); - out.print(code); - out.println(" <|@"); - end("bytecodes"); - } -} diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.max.criutils/src/com/oracle/max/criutils/JniMangle.java --- a/graal/com.oracle.max.criutils/src/com/oracle/max/criutils/JniMangle.java Thu Jun 28 13:10:28 2012 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,100 +0,0 @@ -/* - * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.oracle.max.criutils; - -import com.oracle.graal.api.meta.*; - -/** - * A utility for mangling Java method name and signatures into C function names. - * - * @see "http://java.sun.com/j2se/1.5.0/docs/guide/jni/spec/design.html#wp615" - */ -public final class JniMangle { - - private JniMangle() { - } - - /** - * Mangles a given string such that it can be represented as (part of) a valid C function name. - */ - private static String mangle(String name) { - final StringBuilder mangledName = new StringBuilder(100); - final int length = name.length(); - for (int i = 0; i < length; i++) { - final char ch = name.charAt(i); - if (isAlphaNumeric(ch)) { - mangledName.append(ch); - } else if (ch == '_') { - mangledName.append("_1"); - } else if (ch == '.') { - mangledName.append("_"); - } else if (ch == ';') { - mangledName.append("_2"); - } else if (ch == '[') { - mangledName.append("_3"); - } else { - mangledName.append(String.format("%04x", (int) ch)); - } - } - return mangledName.toString(); - } - - /** - * The delimiter in the string returned by {@link #mangleMethod(ResolvedJavaType, String, Signature, boolean)} separating - * the short mangled form from the suffix to be added to obtain the long mangled form. - */ - public static final char LONG_NAME_DELIMITER = ' '; - - /** - * Mangles a Java method to the symbol(s) to be used when binding it to a native function. - * If {@code signature} is {@code null}, then a non-qualified symbol is returned. - * Otherwise, a qualified symbol is returned. A qualified symbol has its non-qualified - * prefix separated from its qualifying suffix by {@link #LONG_NAME_DELIMITER} if - * {@code splitSuffix} is {@code true}. - * - * @param declaringClass a fully qualified class descriptor - * @param name a Java method name (not checked here for validity) - * @param signature if non-null, a method signature to include in the mangled name - * @param splitSuffix determines if {@link #LONG_NAME_DELIMITER} should be used as described above - * @return the symbol for the C function as described above - */ - public static String mangleMethod(ResolvedJavaType declaringClass, String name, Signature signature, boolean splitSuffix) { - final StringBuilder result = new StringBuilder(100); - final String declaringClassName = MetaUtil.toJavaName(declaringClass); - result.append("Java_").append(mangle(declaringClassName)).append('_').append(mangle(name)); - if (signature != null) { - if (splitSuffix) { - result.append(LONG_NAME_DELIMITER); - } - result.append("__"); - final String sig = signature.asString(); - final String parametersSignature = sig.substring(1, sig.lastIndexOf(')')).replace('/', '.').replace('$', '.'); - result.append(mangle(parametersSignature)); - } - return result.toString(); - } - - private static boolean isAlphaNumeric(char ch) { - return (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9'); - } -} diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.max.criutils/src/com/oracle/max/criutils/SnapshotProfilingInfo.java --- a/graal/com.oracle.max.criutils/src/com/oracle/max/criutils/SnapshotProfilingInfo.java Thu Jun 28 13:10:28 2012 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,175 +0,0 @@ -/* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.oracle.max.criutils; - -import java.io.*; - -import com.oracle.graal.api.code.*; -import com.oracle.graal.api.meta.*; - -/** - * A profiling info snapshot that can be {@linkplain #save(File, File) saved} to - * and {@linkplain #load(File, CodeCacheProvider) loaded} from a file. - */ -public class SnapshotProfilingInfo implements ProfilingInfo, Serializable { - - private static final long serialVersionUID = -5837615128782960391L; - private final double[] branchTaken; - private final double[][] switches; - private final JavaTypeProfile[] typeProfiles; - private final ExceptionSeen[] exceptions; - private final int[] executions; - private final int[] deopts; - - public SnapshotProfilingInfo(ProfilingInfo other) { - int codeSize = other.codeSize(); - branchTaken = new double[codeSize]; - switches = new double[codeSize][]; - typeProfiles = new JavaTypeProfile[codeSize]; - exceptions = new ExceptionSeen[codeSize]; - executions = new int[codeSize]; - deopts = new int[DeoptimizationReason.values().length]; - - for (int bci = 0; bci < codeSize; bci++) { - executions[bci] = other.getExecutionCount(bci); - exceptions[bci] = other.getExceptionSeen(bci); - branchTaken[bci] = other.getBranchTakenProbability(bci); - switches[bci] = other.getSwitchProbabilities(bci); - typeProfiles[bci] = other.getTypeProfile(bci); - } - for (DeoptimizationReason reason: DeoptimizationReason.values()) { - deopts[reason.ordinal()] = other.getDeoptimizationCount(reason); - } - } - - @Override - public int codeSize() { - return branchTaken.length; - } - - public double getBranchTakenProbability(int bci) { - return bci < branchTaken.length ? branchTaken[bci] : -1D; - } - public double[] getSwitchProbabilities(int bci) { - return bci < switches.length ? switches[bci] : null; - } - public JavaTypeProfile getTypeProfile(int bci) { - return bci < typeProfiles.length ? typeProfiles[bci] : null; - } - public ExceptionSeen getExceptionSeen(int bci) { - return bci < exceptions.length ? exceptions[bci] : ExceptionSeen.NOT_SUPPORTED; - } - public int getExecutionCount(int bci) { - return bci < executions.length ? executions[bci] : -1; - } - public int getDeoptimizationCount(DeoptimizationReason reason) { - return deopts[reason.ordinal()]; - } - - @Override - public String toString() { - return CodeUtil.profileToString(this, null, "; "); - } - - /** - * Deserializes a profile snapshot from a file. - * - * @param file a file created by {@link #save(File, File)} - * @param runtime the runtime used to resolve {@link ResolvedJavaType}s during deserialization - * @throws ClassNotFoundException - * @throws IOException - */ - public static SnapshotProfilingInfo load(File file, CodeCacheProvider runtime) throws ClassNotFoundException, IOException { - SnapshotProfilingInfo.SnapshotObjectInputStream ois = new SnapshotObjectInputStream(new BufferedInputStream(new FileInputStream(file), (int) file.length()), runtime); - try { - return (SnapshotProfilingInfo) ois.readObject(); - } finally { - ois.close(); - } - } - - /** - * Serializes this snapshot to a file. - * - * @param file the file to which this snapshot is serialized - * @param txtFile - * @throws IOException - */ - public void save(File file, File txtFile) throws IOException { - SnapshotProfilingInfo.SnapshotObjectOutputStream oos = new SnapshotObjectOutputStream(new FileOutputStream(file)); - try { - oos.writeObject(this); - } finally { - oos.close(); - } - if (txtFile != null) { - PrintStream out = new PrintStream(txtFile); - try { - out.println(CodeUtil.profileToString(this, null, CodeUtil.NEW_LINE)); - } finally { - out.close(); - } - } - } - - static class RiResolvedTypePlaceholder implements Serializable { - private static final long serialVersionUID = -5149982457010023916L; - final Class javaMirror; - public RiResolvedTypePlaceholder(Class javaMirror) { - this.javaMirror = javaMirror; - } - } - - static class SnapshotObjectOutputStream extends ObjectOutputStream { - public SnapshotObjectOutputStream(OutputStream out) throws IOException { - super(out); - enableReplaceObject(true); - } - - @Override - protected Object replaceObject(Object obj) throws IOException { - if (obj instanceof ResolvedJavaType) { - return new RiResolvedTypePlaceholder(((ResolvedJavaType) obj).toJava()); - } - return obj; - } - } - - static class SnapshotObjectInputStream extends ObjectInputStream { - private final CodeCacheProvider runtime; - public SnapshotObjectInputStream(InputStream in, CodeCacheProvider runtime) throws IOException { - super(in); - enableResolveObject(true); - this.runtime = runtime; - } - - @Override - protected Object resolveObject(Object obj) throws IOException { - if (obj instanceof SnapshotProfilingInfo.RiResolvedTypePlaceholder) { - ResolvedJavaType type = runtime.getResolvedJavaType(((SnapshotProfilingInfo.RiResolvedTypePlaceholder) obj).javaMirror); - return type; - } - return obj; - } - } -} diff -r 1d2eeb28537f -r 42f3dac334f9 graal/com.oracle.max.criutils/src/com/oracle/max/criutils/TypeCheckHints.java --- a/graal/com.oracle.max.criutils/src/com/oracle/max/criutils/TypeCheckHints.java Thu Jun 28 13:10:28 2012 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,111 +0,0 @@ -/* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.oracle.max.criutils; - -import java.lang.reflect.*; -import java.util.*; - -import com.oracle.graal.api.code.*; -import com.oracle.graal.api.meta.*; -import com.oracle.graal.api.meta.JavaTypeProfile.*; - -/** - * Utility for deriving hint types for a type check instruction (e.g. checkcast or instanceof) - * based on the target type of the check and any profiling information available for the instruction. - */ -public class TypeCheckHints { - - private static final ResolvedJavaType[] NO_TYPES = {}; - - /** - * If true, then {@link #types} contains the only possible type that could pass the type check - * because the target of the type check is a final class or has been speculated to be a final class. - */ - public final boolean exact; - - /** - * The most likely types that the type check instruction will see. - */ - public final ResolvedJavaType[] types; - - /** - * Derives hint information for use when generating the code for a type check instruction. - * - * @param type the target type of the type check - * @param profile the profiling information available for the instruction (if any) - * @param assumptions the object in which speculations are recorded. This is null if speculations are not supported. - * @param minHintHitProbability if the probability that the type check will hit one the profiled types (up to - * {@code maxHints}) is below this value, then {@link #types} will be null - * @param maxHints the maximum length of {@link #types} - */ - public TypeCheckHints(ResolvedJavaType type, JavaTypeProfile profile, Assumptions assumptions, double minHintHitProbability, int maxHints) { - if (type != null && isFinalClass(type)) { - types = new ResolvedJavaType[] {type}; - exact = true; - } else { - ResolvedJavaType uniqueSubtype = type == null ? null : type.uniqueConcreteSubtype(); - if (uniqueSubtype != null) { - types = new ResolvedJavaType[] {uniqueSubtype}; - if (assumptions != null) { - assumptions.recordConcreteSubtype(type, uniqueSubtype); - exact = true; - } else { - exact = false; - } - } else { - exact = false; - ResolvedJavaType[] hintTypes = NO_TYPES; - JavaTypeProfile typeProfile = profile; - if (typeProfile != null) { - double notRecordedTypes = typeProfile.getNotRecordedProbability(); - ProfiledType[] ptypes = typeProfile.getTypes(); - if (notRecordedTypes < (1D - minHintHitProbability) && ptypes != null && ptypes.length > 0) { - hintTypes = new ResolvedJavaType[ptypes.length]; - int hintCount = 0; - double totalHintProbability = 0.0d; - for (ProfiledType ptype : ptypes) { - ResolvedJavaType hint = ptype.type; - if (type != null && hint.isSubtypeOf(type)) { - hintTypes[hintCount++] = hint; - totalHintProbability += ptype.probability; - } - } - if (totalHintProbability >= minHintHitProbability) { - if (hintTypes.length != hintCount || hintCount > maxHints) { - hintTypes = Arrays.copyOf(hintTypes, Math.min(maxHints, hintCount)); - } - } else { - hintTypes = NO_TYPES; - } - - } - } - this.types = hintTypes; - } - } - } - - public static boolean isFinalClass(ResolvedJavaType type) { - return Modifier.isFinal(type.accessFlags()) || (type.isArrayClass() && Modifier.isFinal(type.componentType().accessFlags())); - } -} diff -r 1d2eeb28537f -r 42f3dac334f9 graal/overview.html --- a/graal/overview.html Thu Jun 28 13:10:28 2012 +0200 +++ b/graal/overview.html Thu Jun 28 14:10:30 2012 +0200 @@ -35,6 +35,8 @@ This document is the unified Javadoc for the Graal code base. The module dependency graph is shown above. Each node in the diagram is a link to the standalone Javadoc for the denoted module. +

+[go to the OpenJDK Graal project site]